diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java new file mode 100644 index 00000000..2a2c23d8 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java @@ -0,0 +1,90 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; +import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService; +import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @description: api 接口 + * @author: binda + * @date: 2025/9/2 19:33 + */ +@Tag(name = "API接口") +@RestController +@RequestMapping("/farm/remote") +@Validated +public class ApiController { + + private final ProductionPlanService productionPlanService; + private final BaseInfoService baseInfoService; + + public ApiController(ProductionPlanService productionPlanService, BaseInfoService baseInfoService) { + this.productionPlanService = productionPlanService; + this.baseInfoService = baseInfoService; + } + + /** + * 生产计划-分页查询 + * + * 根据租户id、开始时间、结束时间,查询已完成的种植计划列表,返参:种植计划id、种植计划名称 + * + * @param req 根据租户id、开始时间、结束时间 ,已完成状态 + * @return 种植计划id、种植计划名称 + */ + @GetMapping("/production-plan/page") + @Operation(summary = "生产计划-分页") + public CommonResult> getPageForFarmProductionPlan(@Valid @RequestBody FarmProductionPlanReqVO req) { + return productionPlanService.getPageForFarmProductionPlan(req); + } + + /** + * 生产计划-详情查询 + * + * 根据租户id、种植计划id,查询种植计划详情,返参:种植计划id、种植计划名称、种植开始时间、种植结束时间、计划所属的基地图片、基地简介、基地中心坐标点 + * + * @param req 根据租户id、种植计划id + * @return 种植计划id、种植计划名称、种植开始时间、种植结束时间、计划所属的基地图片、基地简介、基地中心坐标点 + */ + @GetMapping("/production-plan/get") + @Operation(summary = "生产计划-详情") + public CommonResult getDetailForFarmProductionPlan(@Valid @RequestBody FarmProductionPlanDetailReqVO req) { + return productionPlanService.getDetailForFarmProductionPlan(req); + } + + @GetMapping("/digital-cockpit/get") + @Operation(summary = "数字驾驶舱-基地概要信息") + public CommonResult getBaseOverview(@Valid @RequestBody FarmBaseOverviewReqVO req) { + return baseInfoService.getBaseOverview(req); + } + + @GetMapping("/digital-cockpit/list") + @Operation(summary = "数字驾驶舱-基地信息列表") + public CommonResult> getBaseInfoList(@Valid @RequestBody FarmBaseInfoReqVO req) { + return baseInfoService.getBaseInfoList(req); + } + + @GetMapping("/digital-cockpit/chart/yield-comparison") + @Operation(summary = "数字驾驶舱-生产数据-产量对比") + public CommonResult> getYieldComparisonChart(@Valid @RequestBody YieldComparisonChartReqVO req) { + return productionPlanService.getYieldComparisonChart(req); + } + + @GetMapping("/digital-cockpit/chart/planting-plan-completion") + @Operation(summary = "数字驾驶舱-生产数据-种植计划完成情况") + public CommonResult> getPlantingPlanCompletionChart(@Valid @RequestBody PlantingPlanCompletionReqVO req) { + return productionPlanService.getPlantingPlanCompletionChart(req); + } + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoReqVO.java new file mode 100644 index 00000000..ea9f3b1a --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoReqVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-基地信息列表-请求实体 + * @author: binda + * @date: 2025/9/4 19:14 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseInfoReqVO { + + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoRespVO.java new file mode 100644 index 00000000..92b64bf1 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseInfoRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-基地信息列表-响应实体 + * @author: binda + * @date: 2025/9/4 19:14 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseInfoRespVO { + @Schema(description = "基地ID") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "基地范围坐标") + private String basePoint; + @Schema(description = "基地中心坐标") + private String baseCentrePoint; +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewReqVO.java new file mode 100644 index 00000000..ae9add88 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-基地概要信息-请求实体 + * @author: binda + * @date: 2025/9/4 14:26 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseOverviewReqVO { + + @Schema(description = "基地D") + @NotNull(message = "基地D: 不能为空") + private String baseId; + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewRespVO.java new file mode 100644 index 00000000..25c57fe5 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseOverviewRespVO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-基地概要信息-响应实体 + * @author: binda + * @date: 2025/9/4 14:25 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseOverviewRespVO { + + private TenantInfo tenantInfo; + private BaseInfo baseInfo; + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class TenantInfo{ + @Schema(description = "租户ID") + private String tenantId; + @Schema(description = "基地总面积") + private Double baseTotalArea; + @Schema(description = "基地总数量") + private Integer baseTotalCount; + @Schema(description = "品种总数量") + private Integer cropTotalCount; + @Schema(description = "物联网设备总数") + private Integer iotDeviceTotalCount; + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class BaseInfo{ + @Schema(description = "基地ID") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "基地名称") + private Double baseArea; + @Schema(description = "基地范围坐标") + private String basePoint; + @Schema(description = "基地中心坐标") + private String baseCentrePoint; + @Schema(description = "在种作物数量") + private Integer plantingCropCount; + @Schema(description = "在种地块数量") + private Integer plantingPlotCount; + @Schema(description = "物联网设备数量") + private Integer iotDeviceCount; + @Schema(description = "在种任务数量") + private Integer plantingTaskCount; + @Schema(description = "管理员姓名") + private String administratorName; + + } +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailReqVO.java new file mode 100644 index 00000000..6b911a6a --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 种植计划 详情 请求实体 + * @author: binda + * @date: 2025/9/4 11:41 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmProductionPlanDetailReqVO { + + @Schema(description = "生产计划ID") + @NotNull(message = "种植计划ID: 不能为空") + private String productionPlanId; + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailRespVO.java new file mode 100644 index 00000000..d3559271 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanDetailRespVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +/** + * @description: 种植计划 详情 响应实体 + * @author: binda + * @date: 2025/9/4 11:39 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmProductionPlanDetailRespVO { + + @Schema(description = "生产计划ID") + private String productionPlanId; + @Schema(description = "生产计划名称") + private String productionPlanName; + @JsonFormat(pattern = "yyyy-MM-dd") + @Schema(description = "种植开始日期") + private LocalDate productionStartDate; + @JsonFormat(pattern = "yyyy-MM-dd") + @Schema(description = "种植结束日期") + private LocalDate productionEndDate; + @Schema(description = "基地中心点坐标") + private String centrePoint; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanReqVO.java new file mode 100644 index 00000000..abafc406 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.annotation.PostConstruct; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; + +/** + * @description: 种植计划 请求实体 + * @author: binda + * @date: 2025/9/4 09:35 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmProductionPlanReqVO extends PageParam { + + @Schema(description = "租户ID") + @NotNull(message = "租户ID不能为空") + private String tenantId; + @Schema(description = "种植开始日期") + private LocalDate productionStartDate; + @Schema(description = "种植结束日期") + private LocalDate productionEndDate; + + // 初始化方法,可以在构造函数或 @PostConstruct 中调用 + @PostConstruct + public void init() { + if (this.productionStartDate == null) { + this.productionStartDate = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); + } + if (this.productionEndDate == null) { + this.productionEndDate = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); + } + } +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanRespVO.java new file mode 100644 index 00000000..71c45614 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmProductionPlanRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 种植计划 响应实体 + * @author: binda + * @date: 2025/9/4 09:34 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmProductionPlanRespVO { + + @Schema(description = "生产计划ID") + private String productionPlanId; + @Schema(description = "生产计划名称") + private String productionPlanName; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionReqVO.java new file mode 100644 index 00000000..1875b55e --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-统计图-种植计划完成情况 请求实体 + * @author: binda + * @date: 2025/9/4 20:41 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PlantingPlanCompletionReqVO { + @Schema(description = "基地D") + @NotNull(message = "基地D: 不能为空") + private String baseId; + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionRespVO.java new file mode 100644 index 00000000..e1d6aa75 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/PlantingPlanCompletionRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-统计图-种植计划完成情况 响应实体 + * @author: binda + * @date: 2025/9/4 20:41 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PlantingPlanCompletionRespVO { + + @Schema(description = "未开始数量") + private Double notStartedRatio; + @Schema(description = "进行中数量") + private Double inProgressRatio; + @Schema(description = "已完成数量") + private Double completedRatio; + @Schema(description = "逾期数量") + private Double overdueRatio; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartReqVO.java new file mode 100644 index 00000000..e4128958 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: 数字驾驶舱-统计图-对比产量 请求实体 + * @author: binda + * @date: 2025/9/4 19:41 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class YieldComparisonChartReqVO { + + @Schema(description = "基地D") + @NotNull(message = "基地D: 不能为空") + private String baseId; + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartRespVO.java new file mode 100644 index 00000000..2cc4b644 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/YieldComparisonChartRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +/** + * @description: 数字驾驶舱-统计图-对比产量 响应实体 + * @author: binda + * @date: 2025/9/4 19:40 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class YieldComparisonChartRespVO { + + @Schema(description = "日期") + private Long date; + @Schema(description = "预计产量") + private Integer predictedYields; + @Schema(description = "实际产量") + private Integer practicalYields; + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoPageReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoPageReqVO.java index 47fa4558..a8bcb433 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoPageReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoPageReqVO.java @@ -23,7 +23,7 @@ public class BaseInfoPageReqVO extends PageParam { @Schema(description = "面积") private BigDecimal area; - @Schema(description = "json字符串保存") + @Schema(description = "基地坐标") private String point; @Schema(description = "创建时间") diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoRespVO.java index fb54055c..ec3d44f1 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoRespVO.java @@ -30,8 +30,8 @@ public class BaseInfoRespVO { @ExcelProperty("面积") private BigDecimal area; - @Schema(description = "json字符串保存") - @ExcelProperty("json字符串保存") + @Schema(description = "基地坐标") + @ExcelProperty("基地坐标") private String point; @Schema(description = "创建时间") diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoSaveReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoSaveReqVO.java index 4fa2bc12..e6d34042 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoSaveReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/baseinfo/vo/BaseInfoSaveReqVO.java @@ -21,7 +21,7 @@ public class BaseInfoSaveReqVO { @Schema(description = "面积") private BigDecimal area; - @Schema(description = "json字符串保存") + @Schema(description = "基地坐标") private String point; @Schema(description = "租户编号", example = "27629") diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordCreateReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordCreateReqVO.java index 05d18ce1..218a2251 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordCreateReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordCreateReqVO.java @@ -30,13 +30,12 @@ public class FarmingRecordCreateReqVO { @Schema(description = "执行人ID列表") private List executor; + @Schema(description = "临时工姓名列表") + private List dayLaborer; @Schema(description = "实际用工") private Integer actualLaborCost; - @Schema(description = "日工", example = "111,111,111") - private String dayLaborer; - @Schema(description = "实际投入品ID", example = "5691") private String actualInputId; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordSaveReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordSaveReqVO.java index 3273fa8f..faaabb23 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordSaveReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/farmingrecord/vo/FarmingRecordSaveReqVO.java @@ -35,8 +35,13 @@ public class FarmingRecordSaveReqVO { @Schema(description = "生产计划ID", example = "24782") private String productionPlanId; + @Schema(description = "模型管理(引用类型)-农事记录iD", example = "24782") + private String modelFarmingOperationId; + @Schema(description = "执行人") private String executor; + @Schema(description = "临时工姓名列表") + private String dayLaborer; @Schema(description = "实际用工") private Integer actualLaborCost; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelfarmingoperation/vo/ModelFarmingOperationRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelfarmingoperation/vo/ModelFarmingOperationRespVO.java index e2805f6a..44957930 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelfarmingoperation/vo/ModelFarmingOperationRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelfarmingoperation/vo/ModelFarmingOperationRespVO.java @@ -72,5 +72,12 @@ public class ModelFarmingOperationRespVO { @Schema(description = "租户id", example = "31485") @ExcelProperty("租户id") private String tenantId; + + /** + * 如果当前模型-农事记录已经被创建至 种植中心-农事记录下, 则不可修改 + */ + @Schema(description = "可修改状态 (1:是; 0:否;)", example = "31485") + private Integer usableType; + private List farmingOperationInputDOS; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/baseinfo/BaseInfoDO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/baseinfo/BaseInfoDO.java index 587264cd..046b3b48 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/baseinfo/BaseInfoDO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/baseinfo/BaseInfoDO.java @@ -41,9 +41,13 @@ public class BaseInfoDO extends BaseDO { */ private BigDecimal area; /** - * json字符串保存 + * 基地坐标 */ private String point; + /** + * 基地中心坐标 + */ + private String centrePoint; private String tenantId; } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/farmingrecord/FarmingRecordDO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/farmingrecord/FarmingRecordDO.java index 61f1647e..ff565c34 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/farmingrecord/FarmingRecordDO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/farmingrecord/FarmingRecordDO.java @@ -58,10 +58,18 @@ public class FarmingRecordDO extends BaseDO { * 生产计划ID */ private String productionPlanId; + /** + * 模型管理(引用类型)-农事记录iD + */ + private String modelFarmingOperationId; /** * 执行人 */ private String executor; + /** + * 临时工姓名 + */ + private String dayLaborer; /** * 实际用工 */ diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/baseinfo/BaseInfoMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/baseinfo/BaseInfoMapper.java index 5e96c61e..889c96ef 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/baseinfo/BaseInfoMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/baseinfo/BaseInfoMapper.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; @@ -30,5 +31,6 @@ public interface BaseInfoMapper extends BaseMapperX { int getBaseCount(Long tenantId); - BigDecimal getTotalBaseArea(String id, Long tenantId); + BigDecimal getTotalBaseArea(@Param("id") String id, @Param("tenantId") Long tenantId); + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java index 7fd168a0..7c023b95 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java @@ -3,13 +3,17 @@ package cn.iocoder.yudao.module.farm.dal.mysql.productionplan; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPage2ReqVO; import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanRespVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO; +import cn.iocoder.yudao.module.farm.enums.CommonConstants; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 种植中心-生产计划-生产计划 Mapper * @@ -48,5 +52,19 @@ public interface ProductionPlanMapper extends BaseMapperX { ); } + default PageResult selectPage3(FarmProductionPlanReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .ge(ProductionPlanDO::getProductionStartDate, reqVO.getProductionStartDate()) + .le(ProductionPlanDO::getProductionEndDate, reqVO.getProductionEndDate()) + .eq(ProductionPlanDO::getTenantId, reqVO.getTenantId()) + .eq(ProductionPlanDO::getPlanStatus, CommonConstants.PLAN_STATUS_3) + .orderByDesc(ProductionPlanDO::getCreateTime) + ); + } + ProductionPlanRespVO.PlanOverview getPlanOverview(@Param("baseId") String baseId); + + List getYieldComparisonChart(YieldComparisonChartReqVO req); + + List getPlantingPlanCompletionChart(PlantingPlanCompletionReqVO req); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java index 7d04cca4..1c749591 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java @@ -80,7 +80,10 @@ public class CommonConstants { public final static Integer FARMING_RECORD_STATUS_1 = 1;//开始 - public final static Integer FARMING_RECORD_STATUS_2 = 2; // "开始"; + public final static Integer FARMING_RECORD_STATUS_2 = 2; // "结束"; + + public final static Integer FARM_MODEL_FARMING_OPERATION_USABLE_TYPE_1 = 1; // 可用 + public final static Integer FARM_MODEL_FARMING_OPERATION_USABLE_TYPE_2 = 2; // 不可用 diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/scheduled/FarmingRecordJob.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/scheduled/FarmingRecordJob.java index 238818b5..e223be07 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/scheduled/FarmingRecordJob.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/scheduled/FarmingRecordJob.java @@ -66,7 +66,7 @@ public class FarmingRecordJob implements JobHandler { if (endDate.isEqual(LocalDate.now())) { // 结束日期在今天 e.setTaskStatus(FARMING_RECORD_STATUS_2); - farmingRecordService.createFarmingRecord(e); + farmingRecordService.updateFarmingRecord(e); } } return "success"; @@ -112,6 +112,7 @@ public class FarmingRecordJob implements JobHandler { saveObj.setTaskScope(p.getPlanNumber()); saveObj.setTaskTime(taskTime); saveObj.setProductionPlanId(p.getId()); + saveObj.setModelFarmingOperationId(e.getId()); saveObj.setExecutor("系统"); saveObj.setActualLaborCost(e.getUsed()); saveObj.setActualInputId(""); // TODO: 2025/9/2 @@ -123,6 +124,7 @@ public class FarmingRecordJob implements JobHandler { saveObj.setPlotId(p.getPlotId()); saveObj.setPlotName(p.getPlotName()); saveObj.setTenantId(p.getTenantId()); + saveObj.setModelFarmingOperationId(e.getId()); List inputDOList = new ArrayList<>(); for (ModelFarmingOperationInputDO m : e.getInvestGoodsList()) { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java index dfc8f8f3..7f83b228 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java @@ -1,6 +1,11 @@ package cn.iocoder.yudao.module.farm.service.baseinfo; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseInfoReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseInfoRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseOverviewReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseOverviewRespVO; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.*; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import jakarta.validation.Valid; @@ -75,4 +80,23 @@ public interface BaseInfoService { * @return */ TenantInfoRespVO getBaseOverviewInfo(); + + /** + * 数字驾驶舱-获取基地概要信息 + * + * @param req + * @return + */ + CommonResult getBaseOverview(FarmBaseOverviewReqVO req); + + /** + * 获取基地总面积 + * @param tenantId + * @return + */ + Double getBaseTotalArea(String tenantId); + + Integer getBaseTotalCount(String tenantId); + + CommonResult> getBaseInfoList(FarmBaseInfoReqVO req); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java index 3ea08807..c2eb317a 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java @@ -1,9 +1,15 @@ package cn.iocoder.yudao.module.farm.service.baseinfo; import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseInfoReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseInfoRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseOverviewReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmBaseOverviewRespVO; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.*; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.gridinfo.GridInfoDO; @@ -14,11 +20,16 @@ import cn.iocoder.yudao.module.farm.dal.mysql.gridinfo.GridInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.PersonnelManagementMapper; import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper; import cn.iocoder.yudao.module.farm.enums.CommonConstants; +import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagementService; import cn.iocoder.yudao.module.farm.service.plotinfo.PlotInfoService; import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; +import cn.iocoder.yudao.module.farm.service.specieslibrary.SpeciesLibraryService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; +import lombok.SneakyThrows; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -48,14 +59,19 @@ public class BaseInfoServiceImpl implements BaseInfoService { @Resource private SpeciesLibraryMapper speciesLibraryMapper; @Resource + private SpeciesLibraryService speciesLibraryService; + @Resource private PersonnelManagementMapper personnelManagementMapper; @Resource + private PersonnelManagementService personnelManagementService; + @Resource private GridInfoMapper gridInfoMapper; @Resource private ProductionPlanService productionPlanService; @Resource private PlotInfoService plotInfoService; + @SneakyThrows @Override public String createBaseInfo(BaseInfoSaveReqVO createReqVO) { LoginUser user = getLoginUser(); @@ -63,8 +79,12 @@ public class BaseInfoServiceImpl implements BaseInfoService { BaseInfoDO baseInfo = BeanUtils.toBean(createReqVO, BaseInfoDO.class); baseInfo.setId(IdUtil.fastUUID()); baseInfo.setTenantId(String.valueOf(user.getTenantId())); - baseInfoMapper.insert(baseInfo); + // 解析坐标中心坐标 + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode marker = objectMapper.readTree(baseInfo.getPoint()).get("marker"); + baseInfo.setCentrePoint(marker.toString()); + baseInfoMapper.insert(baseInfo); // 返回 return baseInfo.getId(); } @@ -250,4 +270,67 @@ public class BaseInfoServiceImpl implements BaseInfoService { } return gridInfos; } + + @Override + public CommonResult getBaseOverview(FarmBaseOverviewReqVO req) { + String tenantId = req.getTenantId(); + String baseId = req.getBaseId(); + BaseInfoDO bDO = baseInfoMapper.selectOne("id", baseId, "tenant_id", tenantId); + + FarmBaseOverviewRespVO.TenantInfo tenantInfo = new FarmBaseOverviewRespVO.TenantInfo(); + tenantInfo.setTenantId(bDO.getTenantId()); + tenantInfo.setBaseTotalArea(this.getBaseTotalArea(tenantId)); + tenantInfo.setBaseTotalCount(this.getBaseTotalCount(tenantId)); + tenantInfo.setCropTotalCount(speciesLibraryService.getCropTotalCount(tenantId)); + tenantInfo.setIotDeviceTotalCount(0); // TODO: 2025/9/4 + + FarmBaseOverviewRespVO.BaseInfo baseInfo = new FarmBaseOverviewRespVO.BaseInfo(); + baseInfo.setBaseId(bDO.getId()); + baseInfo.setBaseName(bDO.getName()); + baseInfo.setBaseArea(bDO.getArea().doubleValue()); + baseInfo.setBasePoint(bDO.getPoint()); + baseInfo.setBaseCentrePoint(bDO.getCentrePoint()); + baseInfo.setPlantingCropCount(productionPlanService.getGrowingCropCount(baseId)); + baseInfo.setPlantingPlotCount(productionPlanService.getGrowingPlotCount(baseId)); + baseInfo.setIotDeviceCount(0); // TODO: 2025/9/4 + baseInfo.setPlantingTaskCount(productionPlanService.getGrowingPlanCount(baseId)); + baseInfo.setAdministratorName(getAdministratorName(tenantId, bDO.getManager())); + return CommonResult.success(new FarmBaseOverviewRespVO(tenantInfo, baseInfo)); + } + + private String getAdministratorName(String tenantId, String manager) { + List personnelList = personnelManagementMapper.selectList("tenant_id", tenantId); + Map employeeMap = personnelList.stream().collect(Collectors.toMap(PersonnelManagementDO::getId, PersonnelManagementDO::getName, (v1, v2) -> v1)); + return personnelManagementService.getEmployeeNameMap(employeeMap, manager); + } + + @Override + public Double getBaseTotalArea(String tenantId) { + BigDecimal d = baseInfoMapper.getTotalBaseArea(null, Long.valueOf(tenantId)); + return d.doubleValue(); + } + + @Override + public Integer getBaseTotalCount(String tenantId) { + return baseInfoMapper.getBaseCount(Long.valueOf(tenantId)); + } + + @Override + public CommonResult> getBaseInfoList(FarmBaseInfoReqVO req) { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + wrapperX.eq(BaseInfoDO::getTenantId, req.getTenantId()); + wrapperX.eq(BaseInfoDO::getDeleted, CommonConstants.NO_CODE); + List list = baseInfoMapper.selectList(wrapperX); + + List vos = list.stream().map(e -> { + FarmBaseInfoRespVO vo = new FarmBaseInfoRespVO(); + vo.setBaseId(e.getId()); + vo.setBaseName(e.getName()); + vo.setBasePoint(e.getPoint()); + vo.setBaseCentrePoint(e.getCentrePoint()); + return vo; + }).collect(Collectors.toList()); + + return CommonResult.success(vos); + } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java index 27423adc..efc42e78 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java @@ -176,6 +176,7 @@ public class FarmingRecordServiceImpl implements FarmingRecordService { saveReqVO.setPlotId(createReqVO.getPlotId()); saveReqVO.setProductionPlanId(createReqVO.getProductionPlanId()); saveReqVO.setExecutor(executor); + saveReqVO.setDayLaborer(String.join(",", createReqVO.getDayLaborer())); saveReqVO.setActualLaborCost(createReqVO.getActualLaborCost()); saveReqVO.setFeedbackNotes(createReqVO.getFeedbackNotes()); saveReqVO.setFeedbackImageUrlList(createReqVO.getFeedbackImageUrlList()); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java index 17c3276b..b7d60656 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java @@ -158,6 +158,7 @@ public class HomeServiceImpl implements HomeService { PlotOrCropInfo t = new PlotOrCropInfo(); t.setLabel(label); t.setBaseId(e.getBaseId()); + t.setBaseName(e.getBaseName()); t.setPlotId(e.getPlotId()); t.setPlotName(e.getPlotName()); t.setGrowFlag(growFlag); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java index 280b0519..cf537fb5 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.farm.controller.admin.modelfarmingoperation.vo.Mo import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementRespVO; import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementSaveReqVO; +import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecord.FarmingRecordDO; import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputLibraryDO; import cn.iocoder.yudao.module.farm.dal.dataobject.modelcycle.ModelCycleDO; import cn.iocoder.yudao.module.farm.dal.dataobject.modelenvironmentindex.ModelEnvironmentIndexDO; @@ -20,6 +21,7 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.modelpestdiseaseweed.ModelPes import cn.iocoder.yudao.module.farm.dal.dataobject.modelweatherdisaster.ModelWeatherDisasterDO; import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.SystemUserDO; import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; +import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord.FarmingRecordMapper; import cn.iocoder.yudao.module.farm.dal.mysql.modelcycle.ModelCycleMapper; import cn.iocoder.yudao.module.farm.dal.mysql.modelenvironmentindex.ModelEnvironmentIndexMapper; import cn.iocoder.yudao.module.farm.dal.mysql.modelfarmingoperation.ModelFarmingOperationMapper; @@ -30,10 +32,12 @@ import cn.iocoder.yudao.module.farm.dal.mysql.modelweatherdisaster.ModelWeatherD import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserMapper; import cn.iocoder.yudao.module.farm.enums.CommonConstants; import cn.iocoder.yudao.module.farm.framework.util.ModelManagementConvertUtil; +import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService; import cn.iocoder.yudao.module.farm.service.inputlibrary.InputLibraryService; import cn.iocoder.yudao.module.farm.service.specieslibrary.SpeciesLibraryService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import jakarta.annotation.Resource; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -42,7 +46,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; -import static cn.iocoder.yudao.module.farm.enums.CommonConstants.MODEL_TYPE_2; +import static cn.iocoder.yudao.module.farm.enums.CommonConstants.*; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.MODEL_MANAGEMENT_NOT_EXISTS; /** @@ -74,6 +78,8 @@ public class ModelManagementServiceImpl implements ModelManagementService { private InputLibraryService inputLibraryService; @Resource private SystemUserMapper systemUserMapper; + @Resource + private FarmingRecordMapper farmingRecordMapper; @Override public String createModelManagement(ModelManagementSaveReqVO createReqVO) { @@ -298,6 +304,9 @@ public class ModelManagementServiceImpl implements ModelManagementService { aDo.setPackageUnitName(DictFrameworkUtils.parseDictDataLabel("asset_price", aDo.getPackageUnit())); } respVO.setFarmingOperationInputDOS(farmingOperationInputDOS); + + int usableType = this.getModelFarmingOperationForUsableType(e.getId()); + respVO.setUsableType(usableType); respVOS.add(respVO); }); vo.setFarmingOperationDOS(respVOS); @@ -307,6 +316,17 @@ public class ModelManagementServiceImpl implements ModelManagementService { return bean; } + /** + * 模型管理-农事记录 如果已经被录入到了 种植中心-农事记录下 ,则不可编辑 + * + * @param modelFarmingOperationId + * @return + */ + private int getModelFarmingOperationForUsableType(String modelFarmingOperationId) { + FarmingRecordDO recordDO = farmingRecordMapper.selectOne("model_farming_operation_id", modelFarmingOperationId); + return ObjectUtils.isEmpty(recordDO) ? FARM_MODEL_FARMING_OPERATION_USABLE_TYPE_1 : FARM_MODEL_FARMING_OPERATION_USABLE_TYPE_2; + } + @Override public PageResult getModelManagementPage(ModelManagementPageReqVO pageReqVO) { pageReqVO.setType(1); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java index 81bcf205..4111af6a 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.farm.service.productionplan; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanSaveReqVO; @@ -123,6 +125,8 @@ public interface ProductionPlanService { int getGrowingCropCount(String baseId); int getGrowingCropCount(String baseId,String plotId); + int getGrowingPlanCount(String baseId); + /** * 计算在种地块面积 * @param baseId @@ -149,4 +153,39 @@ public interface ProductionPlanService { Integer getTodayTaskCount(String baseId); + /** + * api 接口 + * 生产计划-分页查询 + * + * @param req + * @return + */ + CommonResult> getPageForFarmProductionPlan(FarmProductionPlanReqVO req); + + /** + * api 接口 + * 生产计划-详情查询 + * + * @param req + * @return + */ + CommonResult getDetailForFarmProductionPlan(FarmProductionPlanDetailReqVO req); + + /** + * api 接口 + * 生产数据-产量对比 + * + * @param req + * @return + */ + CommonResult> getYieldComparisonChart(YieldComparisonChartReqVO req); + + /** + * api 接口 + * 生产数据-种植计划完成情况 + * + * @param req + * @return + */ + CommonResult> getPlantingPlanCompletionChart(PlantingPlanCompletionReqVO req); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java index 1609d1a4..83dd4b85 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java @@ -2,11 +2,15 @@ package cn.iocoder.yudao.module.farm.service.productionplan; import cn.hutool.core.util.IdUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanSaveReqVO; +import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; +import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper; import cn.iocoder.yudao.module.farm.utils.DateUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -25,6 +29,8 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.farm.dal.mysql.productionplan.ProductionPlanMapper; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.stream.Collectors; @@ -46,6 +52,8 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { private ProductionPlanMapper productionPlanMapper; @Resource private SpeciesLibraryMapper speciesLibraryMapper; + @Resource + private BaseInfoMapper baseInfoMapper; @Override public String createProductionPlan(ProductionPlanSaveReqVO createReqVO) { @@ -121,8 +129,7 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { @Override public PageResult getProductionPlanPage(ProductionPlanPageReqVO pageReqVO) { - productionPlanMapper.selectPage(pageReqVO); - return null; + return productionPlanMapper.selectPage(pageReqVO); } @Override @@ -252,6 +259,15 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { .count(); } + @Override + public int getGrowingPlanCount(String baseId) { + List planList = productionPlanMapper.selectList("base_id", baseId); + return (int) planList.stream() + .filter(Objects::nonNull) + .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2)) + .count(); + } + @Override public double getPredictedArea(String plotId,BigDecimal plotArea) { @@ -327,4 +343,47 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { } return count; } + + @Override + public CommonResult> getPageForFarmProductionPlan(FarmProductionPlanReqVO req) { + + if (req.getProductionStartDate() == null || req.getProductionEndDate() == null) { + req.setProductionStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth())); + req.setProductionEndDate( LocalDate.now().with(TemporalAdjusters.lastDayOfMonth())); + } + + PageResult page = productionPlanMapper.selectPage3(req); + Long total = page.getTotal(); + List respList = page.getList().stream().map(e -> new FarmProductionPlanRespVO(e.getId(), e.getPlanNumber())).toList(); + + return CommonResult.success(new PageResult<>(respList, total)); + } + + @Override + public CommonResult getDetailForFarmProductionPlan(FarmProductionPlanDetailReqVO req) { + ProductionPlanDO planDO = productionPlanMapper.selectOne("id", req.getProductionPlanId(), "tenant_id", req.getTenantId()); + BaseInfoDO baseDO = baseInfoMapper.selectOne("id", planDO.getBaseId()); + + FarmProductionPlanDetailRespVO res = new FarmProductionPlanDetailRespVO(); + res.setProductionPlanId(planDO.getId()); + res.setProductionPlanName(planDO.getPlanNumber()); + res.setProductionStartDate(planDO.getProductionStartDate()); + res.setProductionEndDate(planDO.getProductionEndDate()); + res.setCentrePoint(baseDO.getCentrePoint()); + + return CommonResult.success(res); + } + + @Override + public CommonResult> getYieldComparisonChart(YieldComparisonChartReqVO req) { + List res = productionPlanMapper.getYieldComparisonChart(req); + return CommonResult.success(res); + } + + @Override + public CommonResult> getPlantingPlanCompletionChart(PlantingPlanCompletionReqVO req) { + List res = productionPlanMapper.getPlantingPlanCompletionChart(req); + return CommonResult.success(res); + } + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryService.java index 4a55f58c..6f547bc7 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryService.java @@ -79,4 +79,11 @@ public interface SpeciesLibraryService { * @return */ List getSpeciesAndModelTree(); + + /** + * 获取品种总数 + * @param tenantId + * @return + */ + Integer getCropTotalCount(String tenantId); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryServiceImpl.java index 6ff66a94..44580c50 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/specieslibrary/SpeciesLibraryServiceImpl.java @@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.farm.enums.CommonConstants; import cn.iocoder.yudao.module.farm.service.sysDict.SysDictService; import cn.iocoder.yudao.module.farm.service.twodict.TwoDictService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; @@ -37,6 +38,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti import static cn.iocoder.yudao.module.farm.enums.CommonConstants.DICT_TYPE_CODE_3; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.SPECIES_LIBRARY_NOT_EXISTS; import static cn.iocoder.yudao.module.farm.utils.StrHelperUtil.generate; +import static com.baomidou.mybatisplus.core.toolkit.Wrappers.lambdaQuery; /** * 物种库维护 Service 实现类 @@ -395,4 +397,20 @@ public class SpeciesLibraryServiceImpl implements SpeciesLibraryService { .collect(Collectors.toList()); } + + @Override + public Integer getCropTotalCount(String tenantId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("COUNT(DISTINCT cultivar_name) as count") + .eq("tenant_id", tenantId) + .eq("deleted", CommonConstants.NO_CODE) + .isNotNull("cultivar_name") + .ne("cultivar_name", ""); + + List> result = speciesLibraryMapper.selectMaps(wrapper); + if (!result.isEmpty()) { + return ((Long) result.get(0).get("count")).intValue(); + } + return 0; + } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/resources/mapper/baseinfo/BaseInfoMapper.xml b/yudao-module-farm/src/main/resources/mapper/baseinfo/BaseInfoMapper.xml index b8a614db..8a182833 100644 --- a/yudao-module-farm/src/main/resources/mapper/baseinfo/BaseInfoMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/baseinfo/BaseInfoMapper.xml @@ -26,6 +26,9 @@ AND id = #{id} + + AND tenant_id = #{tenantId} + \ No newline at end of file diff --git a/yudao-module-farm/src/main/resources/mapper/productionplan/ProductionPlanMapper.xml b/yudao-module-farm/src/main/resources/mapper/productionplan/ProductionPlanMapper.xml index 118ce9d8..017528d4 100644 --- a/yudao-module-farm/src/main/resources/mapper/productionplan/ProductionPlanMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/productionplan/ProductionPlanMapper.xml @@ -41,4 +41,45 @@ GROUP BY base_id + + + + + \ No newline at end of file