From 6db0aaa5eda179b622c2d783104d8e2e46c2dbe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Tue, 4 Nov 2025 21:35:10 +0800 Subject: [PATCH] =?UTF-8?q?fix=20(farm):=20=E5=85=BB=E6=AE=96=E7=BD=91?= =?UTF-8?q?=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 生产计划 - 地块管理 --- .../vo/ProductionPlanResp2VO.java | 14 ++- .../vo/ProductionPlanSaveReqVO.java | 4 + .../vo/grid/ProductionPlanGridRespVO.java | 38 ++++++ .../baseinfo/GridInfoController.java | 8 -- .../baseinfo/vo/BaseInfoRespVO.java | 21 +--- .../baseinfo/vo/BaseNameRespVO.java | 6 + .../productionplan/ProductionPlanDO.java | 8 ++ .../module/farm/enums/CommonConstants.java | 13 ++ .../service/baseinfo/BaseInfoServiceImpl.java | 75 +++++++---- .../CropFarmingCenterServiceImpl.java | 43 ++++++- .../service/plotinfo/PlotInfoServiceImpl.java | 117 ++++-------------- .../productionplan/ProductionPlanService.java | 1 + .../ProductionPlanServiceImpl.java | 12 +- 13 files changed, 207 insertions(+), 153 deletions(-) create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/grid/ProductionPlanGridRespVO.java diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanResp2VO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanResp2VO.java index f5fbd846..d8e7d348 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanResp2VO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanResp2VO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo; +import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.grid.ProductionPlanGridRespVO; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -94,18 +95,23 @@ public class ProductionPlanResp2VO { private Integer predictedArea; @Schema(description = "预计产量") private Integer predictedYields; - @Schema(description = "任务进度",example = "1/10") + @Schema(description = "任务进度", example = "1/10") private String progressBar; - @Schema(description = "任务百分比",example = "10") + @Schema(description = "任务百分比", example = "10") private String progressRatio; - @Schema(description = "任务进度分子",example = "1") + @Schema(description = "任务进度分子", example = "1") private Integer progressNumerator; - @Schema(description = "任务进度分母",example = "10") + @Schema(description = "任务进度分母", example = "10") private Integer progressDenominator; @Schema(description = "基地名称") private String baseName; @Schema(description = "基地负责人") private String baseManager; + + @Schema(description = "地块使用剩余网箱数") + private Integer predictedGridNumber; + @Schema(description = "养殖网箱信息") + private ProductionPlanGridRespVO planGridInfo; } @Data diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanSaveReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanSaveReqVO.java index 66dbc9fe..6ce32d27 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanSaveReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/ProductionPlanSaveReqVO.java @@ -72,6 +72,10 @@ public class ProductionPlanSaveReqVO { private Double remainingArea; @Schema(description = "占地面积") private Double usagePercentage; + @Schema(description = "地块总网箱数") + private Integer plotGridNumber; + @Schema(description = "地块使用剩余网箱数") + private Integer predictedGridNumber; @Schema(description = "备注") private String remark; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/grid/ProductionPlanGridRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/grid/ProductionPlanGridRespVO.java new file mode 100644 index 00000000..cac756bb --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropfarmingcenter/vo/grid/ProductionPlanGridRespVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.grid; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @description: 计划网格响应实体 + * @author: binda + * @date: 2025/11/4 19:54 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProductionPlanGridRespVO { + + @Schema(description = "计划编号") + private String planNumber; + @Schema(description = "网格表格背景色") + private String color; + @Schema(description = "网格集合") + private List rows; + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class Row { + @Schema(description = "网格序号") + private int sort; + + @Schema(description = "网格编码") + private String gridCode; + } + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/GridInfoController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/GridInfoController.java index 455a22c8..1b7c4ab6 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/GridInfoController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/GridInfoController.java @@ -41,14 +41,12 @@ public class GridInfoController { @PostMapping("/create") @Operation(summary = "创建网格") - @PreAuthorize("@ss.hasPermission('farm:grid-info:create')") public CommonResult createGridInfo(@Valid @RequestBody GridInfoSaveReqVO createReqVO) { return success(gridInfoService.createGridInfo(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新网格") - @PreAuthorize("@ss.hasPermission('farm:grid-info:update')") public CommonResult updateGridInfo(@Valid @RequestBody GridInfoSaveReqVO updateReqVO) { gridInfoService.updateGridInfo(updateReqVO); return success(true); @@ -57,7 +55,6 @@ public class GridInfoController { @DeleteMapping("/delete") @Operation(summary = "删除网格") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('farm:grid-info:delete')") public CommonResult deleteGridInfo(@RequestParam("id") String id) { gridInfoService.deleteGridInfo(id); return success(true); @@ -66,7 +63,6 @@ public class GridInfoController { @DeleteMapping("/delete-list") @Parameter(name = "ids", description = "编号", required = true) @Operation(summary = "批量删除网格") - @PreAuthorize("@ss.hasPermission('farm:grid-info:delete')") public CommonResult deleteGridInfoList(@RequestParam("ids") List ids) { gridInfoService.deleteGridInfoListByIds(ids); return success(true); @@ -75,7 +71,6 @@ public class GridInfoController { @GetMapping("/get") @Operation(summary = "获得网格") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('farm:grid-info:query')") public CommonResult getGridInfo(@RequestParam("id") String id) { GridInfoDO gridInfo = gridInfoService.getGridInfo(id); return success(BeanUtils.toBean(gridInfo, GridInfoRespVO.class)); @@ -83,7 +78,6 @@ public class GridInfoController { @GetMapping("/page") @Operation(summary = "获得网格分页") - @PreAuthorize("@ss.hasPermission('farm:grid-info:query')") public CommonResult> getGridInfoPage(@Valid GridInfoPageReqVO pageReqVO) { PageResult pageResult = gridInfoService.getGridInfoPage(pageReqVO); return success(BeanUtils.toBean(pageResult, GridInfoRespVO.class)); @@ -91,7 +85,6 @@ public class GridInfoController { @GetMapping("/getList") @Operation(summary = "获得网格分页") - @PreAuthorize("@ss.hasPermission('farm:grid-info:query')") public CommonResult> getList(@Valid GridInfoPageReqVO pageReqVO) { List pageResult = gridInfoService.getList(pageReqVO); return success(BeanUtils.toBean(pageResult, GridInfoRespVO.class)); @@ -99,7 +92,6 @@ public class GridInfoController { @GetMapping("/export-excel") @Operation(summary = "导出网格 Excel") - @PreAuthorize("@ss.hasPermission('farm:grid-info:export')") @ApiAccessLog(operateType = EXPORT) public void exportGridInfoExcel(@Valid GridInfoPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseInfoRespVO.java index 15e8b541..3d21b864 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseInfoRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseInfoRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo; +import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.grid.ProductionPlanGridRespVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -97,27 +98,11 @@ public class BaseInfoRespVO { @Schema(description = "网格数量") private Integer gridNumber; @Schema(description = "网格信息") - private List gridOverviewList; + private List gridOverviewList; @Schema(description = "户主流转信息") private List lesseeList; } - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class GridInfo{ - @Schema(description = "网格ID") - private String id; - @Schema(description = "网格类型") - private String type; - @Schema(description = "网格类型-名称") - private String typeName; - @Schema(description = "网格-行") - private Integer gridRow; - @Schema(description = "网格-列") - private Integer gridColumn; - @Schema(description = "网格-颜色") - private String color; - } + } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseNameRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseNameRespVO.java index 3371960a..a83a3e39 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseNameRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/vo/BaseNameRespVO.java @@ -41,6 +41,12 @@ public class BaseNameRespVO { @Schema(description = "剩余面积") private Double remainingArea; + + @Schema(description = "地块总网箱数") + private Integer plotGridNumber; + + @Schema(description = "剩余网箱数") + private Integer remainingGridNumber; } public BaseNameRespVO(String id, String name) { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/productionplan/ProductionPlanDO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/productionplan/ProductionPlanDO.java index fad2bd97..aff87731 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/productionplan/ProductionPlanDO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/productionplan/ProductionPlanDO.java @@ -99,6 +99,14 @@ public class ProductionPlanDO extends BaseDO { * 占地面积 */ private Double usagePercentage; + /** + * 地块总网箱数 + */ + private Integer plotGridNumber; + /** + * 地块使用剩余网箱数 + */ + private Integer predictedGridNumber; /** * 备注 */ 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 18c9e478..9d51b4eb 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 @@ -110,8 +110,21 @@ public class CommonConstants { public static Map FARMING_RECORD_TASK_STATUS_MAP = new HashMap<>(); public static Map PLOT_TYPE_NAME_MAP = new HashMap<>(); + public static Map COLOR_MAP = new HashMap<>(); + static { + COLOR_MAP.put(1, "#00FFFF"); // 最浅 - 纯青色 + COLOR_MAP.put(2, "#2AF0B9"); // 很浅 - 海沫绿 + COLOR_MAP.put(3, "#1DE6B3"); // 浅 - 亮青绿色 + COLOR_MAP.put(4, "#40E0D0"); // 浅中 - 绿松石色 + COLOR_MAP.put(5, "#14CCCC"); // 中浅 - 您提供的颜色 + COLOR_MAP.put(6, "#48D1CC"); // 中 - 中绿松石色 + COLOR_MAP.put(7, "#00CED1"); // 中深 - 暗青色 + COLOR_MAP.put(8, "#20B2AA"); // 深 - 浅海绿色 + COLOR_MAP.put(9, "#0D98BA"); // 很深 - 蓝绿色 + COLOR_MAP.put(10, "#008B8B"); // 最深 - 深青 + PLOT_TYPE_NAME_MAP.put(1, "种植地块"); PLOT_TYPE_NAME_MAP.put(2, "养殖地块"); 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 1e79a8b3..984a8784 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 @@ -10,17 +10,17 @@ 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.cropfarmingcenter.vo.grid.ProductionPlanGridRespVO; import cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.BaseStatisticsInfoRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.wx.BaseInfoForWxRespVO; import cn.iocoder.yudao.module.farm.controller.admin.wx.vo.BaseCountInfoRespVO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.companyinfo.CompanyInfoDO; -import cn.iocoder.yudao.module.farm.dal.dataobject.gridinfo.GridInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.PersonnelManagementDO; import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO; +import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO; import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper; -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; @@ -31,12 +31,10 @@ 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 cn.iocoder.yudao.module.farm.utils.BigDecimalUtil; -import cn.iocoder.yudao.module.farm.utils.StrHelperUtil; 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 io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Resource; import lombok.SneakyThrows; import org.apache.commons.lang3.ObjectUtils; @@ -45,15 +43,13 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; 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.LEASE_STATUS_MAP; -import static cn.iocoder.yudao.module.farm.enums.CommonConstants.PLOT_TYPE_NAME_MAP; +import static cn.iocoder.yudao.module.farm.enums.CommonConstants.*; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.*; /** @@ -76,8 +72,6 @@ public class BaseInfoServiceImpl implements BaseInfoService { @Resource private PersonnelManagementService personnelManagementService; @Resource - private GridInfoMapper gridInfoMapper; - @Resource private ProductionPlanService productionPlanService; @Resource private PlotInfoService plotInfoService; @@ -124,7 +118,7 @@ public class BaseInfoServiceImpl implements BaseInfoService { validateBaseInfoExists(id); // 存在地块,不可删除 boolean flag2 = plotInfoService.validatePlotExistByBaseId(id); - if (!flag2) { + if (flag2) { throw exception(PLOT_AREA_EXISTS_ERRORS); } // 校验: 存在在种地块时 不允许删除 @@ -217,11 +211,22 @@ public class BaseInfoServiceImpl implements BaseInfoService { BaseNameRespVO obj = new BaseNameRespVO(key, entry.getValue()); List childList = new ArrayList<>(); - for (PlotInfoDO aDo : plotInfoDOS) { - if (aDo.getBaseId().equals(key)) { - BigDecimal plotArea = aDo.getPlotArea(); - double remainingArea = productionPlanService.getPredictedArea(aDo.getPlotId(),plotArea); - childList.add(new BaseNameRespVO.PlotInfoVO(aDo.getPlotId(), aDo.getPlotName(), plotArea, remainingArea)); + for (PlotInfoDO p : plotInfoDOS) { + if (p.getBaseId().equals(key)) { + BigDecimal plotArea = p.getPlotArea(); + double remainingArea = productionPlanService.getPredictedArea(p.getId(),plotArea); + + int plotGridNumber = p.getGridNumber(); + int remainingGridNumber = productionPlanService.getPredictedGridNumber(p.getId(), plotGridNumber); + + childList.add(new BaseNameRespVO.PlotInfoVO( + p.getPlotId(), + p.getPlotName(), + plotArea, + remainingArea, + plotGridNumber, + remainingGridNumber + )); } } obj.setChildren(childList); @@ -311,8 +316,8 @@ public class BaseInfoServiceImpl implements BaseInfoService { private List packagePlotInfo(Map employeeMap, List plotList) { List targetList = new ArrayList<>(); for (PlotInfoDO aDo : plotList) { - // 网格 - List gridInfos = this.packageGridInfo(aDo.getId()); + // 网箱 + List gridInfos = this.packageGridInfo(aDo.getPlotId()); // 户主 List lesseeList = plotInfoService.getPlotLesseeList2(aDo.getId()); String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统"); @@ -336,16 +341,34 @@ public class BaseInfoServiceImpl implements BaseInfoService { return targetList; } - private List packageGridInfo(String plotId) { - List gridList = gridInfoMapper.selectList("plot_id", plotId); - if (ObjectUtils.isEmpty(gridList)) { - return Collections.EMPTY_LIST; + private List packageGridInfo(String plotId) { + List res = new ArrayList<>(); + + List productionPlans = productionPlanService.getProductionPlans(plotId); + for (int j = 0; j < productionPlans.size(); j++) { + ProductionPlanDO p = productionPlans.get(j); + + int predictedGridNumber = p.getPredictedGridNumber(); + if (predictedGridNumber == 0) { + continue; + } + + List rows = new ArrayList<>(); + for (int i = 1; i < predictedGridNumber + 1; i++) { + ProductionPlanGridRespVO.Row row = new ProductionPlanGridRespVO.Row(); + row.setSort(i); + row.setGridCode(plotId + "-" + String.format("%04d", i)); + rows.add(row); + } + + ProductionPlanGridRespVO g = new ProductionPlanGridRespVO(); + g.setPlanNumber(p.getPlanNumber()+" ("+CommonConstants.PLAN_MAP.get(p.getPlanStatus())+")"); + g.setColor(COLOR_MAP.getOrDefault(j+1,"#00FFFF")); + g.setRows(rows); + res.add(g); } - List gridInfos = BeanUtils.toBean(gridList, BaseInfoRespVO.GridInfo.class); - for (BaseInfoRespVO.GridInfo info : gridInfos) { - info.setTypeName(CommonConstants.GRID_TYPE.get(info.getType())); - } - return gridInfos; + + return res; } @Override diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java index 72a4a340..8acedf8e 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart. import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.FarmTypeChartRespVO; import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.InputUsageChartRespVO; import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.PlantingAreaChartRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.grid.ProductionPlanGridRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanagement.modelcycle.vo.ModelCycleRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanagement.modelfarmingoperation.vo.ModelFarmingOperationRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanagement.models.vo.ModelManagementRespVO; @@ -31,6 +32,7 @@ import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord.FarmingRecordMapper; import cn.iocoder.yudao.module.farm.dal.mysql.inputlibrary.InputUsageRecordsMapper; import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.PersonnelManagementMapper; +import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.productionplan.ProductionPlanMapper; import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper; import cn.iocoder.yudao.module.farm.enums.CommonConstants; @@ -53,10 +55,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.Period; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -78,6 +77,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { private final SpeciesLibraryMapper speciesLibraryMapper; private final PersonnelManagementMapper personnelManagementMapper; private final BaseInfoMapper baseInfoMapper; + private final PlotInfoMapper plotInfoMapper; private final ProductionPlanMapper productionPlanMapper; private final FarmingRecordMapper farmingRecordMapper; private final InputUsageRecordsMapper inputUsageRecordsMapper; @@ -91,13 +91,14 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { private final FarmingTypeMaintenanceService farmingTypeMaintenanceService; private final DictDataService dictDataService; - public CropFarmingCenterServiceImpl(SpeciesLibraryMapper speciesLibraryMapper, PersonnelManagementMapper personnelManagementMapper, BaseInfoMapper baseInfoMapper, ProductionPlanMapper productionPlanMapper, + public CropFarmingCenterServiceImpl(SpeciesLibraryMapper speciesLibraryMapper, PersonnelManagementMapper personnelManagementMapper, BaseInfoMapper baseInfoMapper, PlotInfoMapper plotInfoMapper, ProductionPlanMapper productionPlanMapper, FarmingRecordMapper farmingRecordMapper, InputUsageRecordsMapper inputUsageRecordsMapper, ModelManagementService modelManagementService, FarmingRecordService farmingRecordService, FarmingRecordInputService farmingRecordInputService, PlotInfoService plotInfoService, SpeciesLibraryService speciesLibraryService, FarmingTypeMaintenanceService farmingTypeMaintenanceService, DictDataService dictDataService) { this.speciesLibraryMapper = speciesLibraryMapper; this.personnelManagementMapper = personnelManagementMapper; this.baseInfoMapper = baseInfoMapper; + this.plotInfoMapper = plotInfoMapper; this.productionPlanMapper = productionPlanMapper; this.farmingRecordMapper = farmingRecordMapper; this.inputUsageRecordsMapper = inputUsageRecordsMapper; @@ -108,6 +109,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { this.speciesLibraryService = speciesLibraryService; this.farmingTypeMaintenanceService = farmingTypeMaintenanceService; this.dictDataService = dictDataService; + } @Override @@ -143,6 +145,8 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { obj.setTotalArea(e.getTotalArea()); obj.setPredictedArea(e.getPredictedArea()); obj.setUsagePercentage(e.getUsagePercentage()); + obj.setPlotGridNumber(e.getPlotGridNumber()); + obj.setPredictedGridNumber(e.getPredictedGridNumber()); obj.setRemark(e.getRemark()); obj.setBaseId(e.getBaseId()); obj.setBaseName(baseNameMap.getOrDefault(e.getBaseId(), "")); @@ -430,11 +434,38 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { modelInfo.setProgressNumerator(progressNumerator); modelInfo.setProgressDenominator(progressDenominator); modelInfo.setBaseName(planObj.getBaseName()); - modelInfo.setBaseManager(employeeNameMap.get(employeeId)); // 分割, + modelInfo.setBaseManager(employeeNameMap.get(employeeId)); + // 构建网箱 + this.buildPlanGrid(planObj,modelInfo); return modelInfo; } + private void buildPlanGrid(ProductionPlanDO p, ProductionPlanResp2VO.ModelInfo m) { + Integer predictedGridNumber = p.getPredictedGridNumber(); + String plotCode = p.getPlotId(); + + if (predictedGridNumber == 0) { + return; + } + + List rows = new ArrayList<>(); + for (int i = 1; i < predictedGridNumber + 1; i++) { + ProductionPlanGridRespVO.Row row = new ProductionPlanGridRespVO.Row(); + row.setSort(i); + row.setGridCode(plotCode + "-" + String.format("%04d", i)); + rows.add(row); + } + + ProductionPlanGridRespVO planGridInfo = new ProductionPlanGridRespVO(); + planGridInfo.setPlanNumber(p.getPlanNumber()); + planGridInfo.setColor(COLOR_MAP.get(1)); + planGridInfo.setRows(rows); + + m.setPredictedGridNumber(predictedGridNumber); + m.setPlanGridInfo(planGridInfo); + } + /** * 农事记录总数 = 模型中的农事记录 + 自定义农事记录 * @return diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java index 94f7cdf3..ddcfb639 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java @@ -16,9 +16,7 @@ import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotLesseeMapper; import cn.iocoder.yudao.module.farm.enums.CommonConstants; import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagementService; import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; -import cn.iocoder.yudao.module.farm.utils.StrHelperUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.google.common.primitives.ImmutableIntArray; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -265,41 +263,34 @@ public class PlotInfoServiceImpl implements PlotInfoService { PlotLesseeDO::getLeaseStatus, YES_CODE); if (ObjectUtils.isEmpty(sourcePObj)) { - // 租户表不存在, 说明从未添加过户主信息, 直接录入即可 - // 1. 更新地块 - p.setPlotLeaseStatus(YES_CODE); - plotInfoMapper.updateById(p); - // 2. 录入户主表 + // 首次添加租户信息, 说明从未添加过户主信息, 直接录入即可 this.pInsert(p,pl,baseNameMap); - successCount++; continue; } - if (compareObj(sourcePObj,pl)) { - unmodifiedCount++; - continue; - } - if (this.isEmpty(pl)) { p.setPlotLeaseStatus(NO_CODE); plotInfoMapper.updateById(p); sourcePObj.setLeaseStatus(NO_CODE); plotLesseeMapper.updateById(sourcePObj); + continue; } - // 1. 更新原地块户主信息 - sourcePObj.setLeaseStatus(NO_CODE); - plotLesseeMapper.updateById(sourcePObj); + if (this.compareObj(sourcePObj,pl)) { + // 1. 更新原地块户主信息 + sourcePObj.setLeaseStatus(NO_CODE); + plotLesseeMapper.updateById(sourcePObj); - // 2. 录入新地块户主信息 - this.pInsert(p,pl,baseNameMap); - successCount++; + this.pInsert(p,pl,baseNameMap); + successCount++; + }else{ + unmodifiedCount++; + } } - res.setSuccessCount(successCount); res.setFailuresCount(failuresCount); res.setUnmodifiedCount(unmodifiedCount); @@ -307,66 +298,6 @@ public class PlotInfoServiceImpl implements PlotInfoService { return res; } -// @Override -// public PlotLesseeImportRespVO setPlotLesseeInfo(List req) { -// -// Map baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1)); -// Map plotNameMap = plotInfoMapper.selectList().stream().collect(Collectors.toMap(PlotInfoDO::getPlotName, PlotInfoDO::getId, (v1, v2) -> v1)); -// -// PlotLesseeImportRespVO res = new PlotLesseeImportRespVO(); -// res.setTotal(req.size()); -// -// int successCount = 0; -// int failuresCount = 0; -// int unmodifiedCount = 0; -// List row = new ArrayList<>(); -// for (PlotLesseeForImportExcelRespVO pl : req) { -// -// PlotInfoDO p = plotInfoMapper.selectOne(PlotInfoDO::getPlotName, pl.getPlotName()); -// if (ObjectUtils.isEmpty(p)) { -// failuresCount++; -// row.add(new PlotLesseeImportRespVO.Row(pl.getPlotCode(), pl.getPlotName())); -// continue; -// } -// -// PlotLesseeDO sourcePObj = plotLesseeMapper.selectOne( -// PlotLesseeDO::getPlotName, pl.getPlotName(), -// PlotLesseeDO::getLeaseStatus, YES_CODE); -// -// if (ObjectUtils.isEmpty(sourcePObj)) { -// // 租户表不存在, 说明从未添加过户主信息, 直接录入即可 -// // 1. 更新地块 -// p.setPlotLeaseStatus(YES_CODE); -// plotInfoMapper.updateById(p); -// // 2. 录入户主表 -// this.pInsert(p,pl,baseNameMap); -// -// successCount++; -// continue; -// } -// -// if (compareObj(sourcePObj,pl)) { -// unmodifiedCount++; -// continue; -// } -// -// // 1. 更新原地块户主信息 -// sourcePObj.setLeaseStatus(NO_CODE); -// plotLesseeMapper.updateById(sourcePObj); -// -// // 2. 录入新地块户主信息 -// this.pInsert(p,pl,baseNameMap); -// successCount++; -// -// } -// -// res.setSuccessCount(successCount); -// res.setFailuresCount(failuresCount); -// res.setUnmodifiedCount(unmodifiedCount); -// res.setFailuresList(row); -// return res; -// } - private void pInsert(PlotInfoDO p,PlotLesseeForImportExcelRespVO pl,Map baseNameMap) { PlotLesseeDO target = new PlotLesseeDO(); target.setLeaseName(pl.getLeaseName()); @@ -384,21 +315,24 @@ public class PlotInfoServiceImpl implements PlotInfoService { target.setPlotId(p.getId()); target.setPlotName(p.getPlotName()); plotLesseeMapper.insert(target); + + p.setPlotLeaseStatus(YES_CODE); + plotInfoMapper.updateById(p); } /** - * 对比结果一致返回: true - * 对比结果不一致返回: false + * 对比结果不一致返回: true (至少有一个字段不同) + * 对比结果一致返回: false (所有字段都相同) * @param s * @param t * @return */ - private boolean compareObj(PlotLesseeDO s , PlotLesseeForImportExcelRespVO t) { - return Objects.equals(s.getLeaseName(), t.getLeaseName()) && - Objects.equals(s.getLeaseIdCard(), t.getLeaseIdCard()) && - Objects.equals(s.getLeasePhone(), t.getLeasePhone()) && - Objects.equals(s.getLeaseStartDate(), t.getLeaseStartDate()) && - Objects.equals(s.getLeaseEndDate(), t.getLeaseEndDate()); + private boolean compareObj(PlotLesseeDO s, PlotLesseeForImportExcelRespVO t) { + return ObjectUtils.notEqual(s.getLeaseName(), t.getLeaseName()) || + ObjectUtils.notEqual(s.getLeaseIdCard(), t.getLeaseIdCard()) || + ObjectUtils.notEqual(s.getLeasePhone(), t.getLeasePhone()) || + !s.getLeaseStartDate().isEqual(t.getLeaseStartDate()) || + !s.getLeaseEndDate().isEqual(t.getLeaseEndDate()); } private boolean isEmpty(PlotLesseeForImportExcelRespVO t) { @@ -455,8 +389,11 @@ public class PlotInfoServiceImpl implements PlotInfoService { @Override public boolean validatePlotExistByBaseId(String id) { - Long count = plotInfoMapper.selectCount("base_id", id); - return count <= 0; + LambdaQueryWrapperX x = new LambdaQueryWrapperX<>(); + x.eq(PlotInfoDO::getBaseId, id); + x.eq(PlotInfoDO::getDeleted, NO_CODE); + Long count = plotInfoMapper.selectCount(x); + return count > 0; } private boolean validateCurrentPlotArea(String baseId, String plotId, BigDecimal currentPlotArea) { 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 e232ff6c..22b04410 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 @@ -145,6 +145,7 @@ public interface ProductionPlanService { * @return */ double getPredictedArea(String plotId,BigDecimal plotArea); + Integer getPredictedGridNumber(String plotId,Integer plotGridNumber); /** * 获取在种地块面积 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 a3672264..13200131 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 @@ -309,7 +309,6 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { @Override public double getPredictedArea(String plotId,BigDecimal plotArea) { - List planList = productionPlanMapper.selectList("plot_id", plotId); double sum = planList.stream() .filter(e -> Objects.equals(e.getPlanStatus(), PLAN_STATUS_2)) @@ -318,6 +317,17 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { return plotArea.subtract(BigDecimal.valueOf(sum)).doubleValue(); } + @Override + public Integer getPredictedGridNumber(String plotId, Integer plotGridNumber) { + List planList = productionPlanMapper.selectList("plot_id", plotId); + Integer sum = planList.stream() + .filter(e -> Objects.equals(e.getPlanStatus(), PLAN_STATUS_2)) + .mapToInt(ProductionPlanDO::getPredictedGridNumber) + .sum(); + + return plotGridNumber - sum; + } + @Override public String getBeingPlotArea(String plotId, BigDecimal plotArea) {