diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java index 03b0f64b..dfb4023b 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo; -import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.wx.BaseInfoForWxRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.*; import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import jakarta.servlet.http.HttpServletResponse; + import java.util.List; + import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import jakarta.annotation.Resource; @@ -21,6 +22,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -120,7 +122,7 @@ public class BaseInfoController { @Operation(summary = "基地列表") public CommonResult> getBaseList() { List baseInfos = baseInfoService.getBaseInfos(); - List res = baseInfos.stream().map(e -> new BaseNamesRespVO(e.getId(),e.getName())).toList(); + List res = baseInfos.stream().map(e -> new BaseNamesRespVO(e.getId(), e.getName())).toList(); return success(res); } 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 7b3881fd..4db47571 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 @@ -99,6 +99,9 @@ public class CommonConstants { public final static Integer MESSAGE_TYPE_2 = 2; public final static Integer MESSAGE_TYPE_3 = 3; + public final static String PLOT_COLOR_BLUE = "#14a3ff"; // 已租,蓝色 + public final static String PLOT_COLOR_GREEN = "#5ede84"; // 未租,绿色 + public static Map PLAN_MAP = new HashMap<>(); public static Map LIFE_CYCLE_MAP = new HashMap<>(); public static Map GRID_TYPE = new HashMap<>(); 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 dc386ba0..8b02d403 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 @@ -19,7 +19,6 @@ 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.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.personnelmanagement.PersonnelManagementMapper; import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper; @@ -44,6 +43,7 @@ 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; @@ -140,29 +140,6 @@ public class BaseInfoServiceImpl implements BaseInfoService { baseInfoMapper.deleteByIds(ids); } - private void validateBaseInfoExists(String id) { - if (baseInfoMapper.selectById(id) == null) { - throw exception(BASE_INFO_NOT_EXISTS); - } - } - - private void validateBaseArea(String baseName) { - BaseInfoDO one = baseInfoMapper.selectOne("name", baseName); - if (ObjectUtils.isNotEmpty(one)) { - throw exception(BASE_NAME_ERROR); - } - } - - /** - * 修改后的基地面积 不可小于 其地块面积总和 - * @param id - * @param updateBaseArea - */ - private void validateBaseArea(String id,BigDecimal updateBaseArea) { - if (plotInfoService.validateTotalPlotArea(id,updateBaseArea)) { - throw exception(BASE_PLOT_AREA_ERRORS); - } - } @Override public BaseInfoDO getBaseInfo(String id) { @@ -254,102 +231,27 @@ public class BaseInfoServiceImpl implements BaseInfoService { List personnels = personnelManagementMapper.selectList("tenant_id", tenantId); int employeeCount = personnels.size(); Map employeeMap = personnels.stream().collect(Collectors.toMap(PersonnelManagementDO::getId, PersonnelManagementDO::getName, (v1, v2) -> v1)); + // 租户 TenantInfoRespVO.TenantInfo tenantInfo = this.getTenantInfo(tenantId, employeeCount); + // 基地 List pageResult = this.getList(new BaseInfoPageReqVO()); List baseList = BeanUtils.toBean(pageResult, BaseInfoRespVO.class); this.packageBaseInfo(tenantId, baseList, employeeMap); + // 基地面积 取整 baseList.forEach(e -> e.setArea(BigDecimalUtil.roundedViaMath(e.getArea()))); + return new TenantInfoRespVO(tenantInfo, baseList); } - private TenantInfoRespVO.TenantInfo getTenantInfo(long tenantId, Integer employeeCount) { - // 基地总数 - Integer baseCount = baseInfoMapper.getBaseCount(tenantId); - // 在种作物总数 - Integer cropCount = productionPlanService.getGrowingCropCountByTenantId(String.valueOf(tenantId)); - // 基地总面积 - BigDecimal areaCount = new BigDecimal("0.00"); - if (baseCount > 0) { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("tenant_id", tenantId); - wrapper.select("SUM(area) as total_area"); - Object result = baseInfoMapper.selectObjs(wrapper).stream().findFirst().orElse(BigDecimal.ZERO); - areaCount = (BigDecimal) result; - } - // 租户公司名称 - CompanyInfoDO companyInfo = companyInfoService.getCompanyInfo(); - String compName = ObjectUtils.isEmpty(companyInfo) ? "" : companyInfo.getName(); - return new TenantInfoRespVO.TenantInfo(compName,baseCount, cropCount, areaCount, employeeCount); - } - - private void packageBaseInfo(long tenantId, List respVOS, Map employeeMap) { - for (BaseInfoRespVO obj : respVOS) { - String baseId = obj.getId(); - String baseName = obj.getName(); - BigDecimal baseArea = BigDecimalUtil.roundedViaMath(obj.getArea()); - List plotList = plotInfoService.getPlotInfos(baseId); - - // 基地概述 - BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList); - obj.setBaseOverview(baseOverview); - // 地块集合 - List targetList = this.packagePlotInfo(employeeMap, plotList); - obj.setPlotOverviewList(targetList); - } - } - - private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, List plotList) { - // 在种作物数量 - Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, baseId); - // 在种地块占比 - double plotRatio = 0.00; - // 在种地块数量 - int plotCount = productionPlanService.getGrowingPlotCount(baseId); - // 地块总数 - int plotTotalCount = plotList.size(); - if (plotTotalCount > 0) { - plotRatio = Math.round((plotCount * 10000.0) / plotTotalCount) / 100.0; - } - return new BaseInfoRespVO.BaseInfo(baseId, baseName, baseArea, cropCount, plotCount, plotTotalCount, plotRatio); - } - - private List packagePlotInfo(Map employeeMap, List plotList) { - List targetList = new ArrayList<>(); - for (PlotInfoDO aDo : plotList) { - // 网箱 - List gridInfos = this.packageGridInfo(aDo.getPlotId()); - // 户主 - List lesseeList = plotLesseeService.getPlotLesseeList(aDo.getId()); - String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统"); - BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo( - aDo.getId(), - aDo.getPlotName(), - aDo.getPlotColor(), - BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), - plotManager, - aDo.getPoint(), - aDo.getPlotLeaseStatus(), - LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), - aDo.getGridNumber(), - gridInfos, - lesseeList); - targetList.add(target); - } - return targetList; - } @Override public List getGridInfo(String plotId) { String plotCode = plotId; return this.packageGridInfo(plotCode); } - private List packageGridInfo(String plotId) { - return productionPlanService.getGridForPlanList(plotId); - } - @Override public CommonResult getBaseOverview(FarmBaseOverviewReqVO req) { String tenantId = req.getTenantId(); @@ -380,11 +282,6 @@ public class BaseInfoServiceImpl implements BaseInfoService { 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) { @@ -492,4 +389,121 @@ public class BaseInfoServiceImpl implements BaseInfoService { return new BaseCountInfoRespVO(bCount,pCount); } + + /* + * =================私有方法================= + */ + + private void validateBaseInfoExists(String id) { + if (baseInfoMapper.selectById(id) == null) { + throw exception(BASE_INFO_NOT_EXISTS); + } + } + + private void validateBaseArea(String baseName) { + BaseInfoDO one = baseInfoMapper.selectOne("name", baseName); + if (ObjectUtils.isNotEmpty(one)) { + throw exception(BASE_NAME_ERROR); + } + } + + /** + * 修改后的基地面积 不可小于 其地块面积总和 + * @param id + * @param updateBaseArea + */ + private void validateBaseArea(String id,BigDecimal updateBaseArea) { + if (plotInfoService.validateTotalPlotArea(id,updateBaseArea)) { + throw exception(BASE_PLOT_AREA_ERRORS); + } + } + + 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); + } + + + private TenantInfoRespVO.TenantInfo getTenantInfo(long tenantId, Integer employeeCount) { + // 基地总数 + Integer baseCount = baseInfoMapper.getBaseCount(tenantId); + // 在种作物总数 + Integer cropCount = productionPlanService.getGrowingCropCountByTenantId(String.valueOf(tenantId)); + // 基地总面积 + BigDecimal areaCount = new BigDecimal("0.00"); + if (baseCount > 0) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("tenant_id", tenantId); + wrapper.select("SUM(area) as total_area"); + Object result = baseInfoMapper.selectObjs(wrapper).stream().findFirst().orElse(BigDecimal.ZERO); + areaCount = (BigDecimal) result; + } + // 租户公司名称 + CompanyInfoDO companyInfo = companyInfoService.getCompanyInfo(); + String compName = ObjectUtils.isEmpty(companyInfo) ? "" : companyInfo.getName(); + return new TenantInfoRespVO.TenantInfo(compName,baseCount, cropCount, areaCount, employeeCount); + } + + private void packageBaseInfo(long tenantId, List respVOS, Map employeeMap) { + for (BaseInfoRespVO obj : respVOS) { + String baseId = obj.getId(); + String baseName = obj.getName(); + BigDecimal baseArea = BigDecimalUtil.roundedViaMath(obj.getArea()); + List plotList = plotInfoService.getPlotInfos(baseId); + + // 基地概述 + BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList); + obj.setBaseOverview(baseOverview); + // 地块集合 + List targetList = this.packagePlotInfo(employeeMap, plotList); + obj.setPlotOverviewList(targetList); + } + } + + private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, List plotList) { + // 在种作物数量 + Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, baseId); + // 在种地块占比 + double plotRatio = 0.00; + // 在种地块数量 + int plotCount = productionPlanService.getGrowingPlotCount(baseId); + // 地块总数 + int plotTotalCount = plotList.size(); + if (plotTotalCount > 0) { + plotRatio = Math.round((plotCount * 10000.0) / plotTotalCount) / 100.0; + } + return new BaseInfoRespVO.BaseInfo(baseId, baseName, baseArea, cropCount, plotCount, plotTotalCount, plotRatio); + } + + private List packagePlotInfo(Map employeeMap, List plotList) { + List targetList = new ArrayList<>(); + for (PlotInfoDO aDo : plotList) { + // 网箱 +// List gridInfos = this.packageGridInfo(aDo.getPlotId()); + List gridInfos = Collections.EMPTY_LIST; + // 户主 + List lesseeList = plotLesseeService.getPlotLesseeList(aDo.getId()); + String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统"); + BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo( + aDo.getId(), + aDo.getPlotName(), + aDo.getPlotColor(), + BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), + plotManager, + aDo.getPoint(), + aDo.getPlotLeaseStatus(), + LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), + aDo.getGridNumber(), + gridInfos, + lesseeList); + targetList.add(target); + } + return targetList; + } + + private List packageGridInfo(String plotId) { + return productionPlanService.getGridForPlanList(plotId); + } + } \ No newline at end of file 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 6af457da..94b59976 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 @@ -314,7 +314,7 @@ public class HomeServiceImpl implements HomeService { // 物种数量 // int speciesNum = modelManagementService.getSpeciesNum(getLoginUser().getTenantId().toString()); // 网箱使用占比 - String gridRatio = "100/500"; // TODO: 2025/11/6 + String gridRatio = productionPlanService.getGridRatio(e.getPlotId()); PlotOrCropInfo t = new PlotOrCropInfo(); t.setLabel(label); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotLesseeServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotLesseeServiceImpl.java index 8e3206cb..5558846f 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotLesseeServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotLesseeServiceImpl.java @@ -122,6 +122,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService { if (this.isEmpty(pl)) { p.setPlotLeaseStatus(NO_CODE); + p.setPlotColor(PLOT_COLOR_GREEN); plotInfoMapper.updateById(p); sourcePObj.setLeaseStatus(NO_CODE); @@ -252,6 +253,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService { return ChronoUnit.DAYS.between(today, leaseEndDate); } + private void pInsert(PlotInfoDO p, PlotLesseeForImportExcelRespVO pl, Map baseNameMap) { PlotLesseeDO target = new PlotLesseeDO(); target.setLeaseName(pl.getLeaseName()); @@ -259,6 +261,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService { target.setLeasePhone(pl.getLeasePhone()); target.setLeaseStartDate(pl.getLeaseStartDate()); target.setLeaseEndDate(pl.getLeaseEndDate()); + target.setLeaseRental(pl.getLeaseRental()); target.setId(IdUtil.fastUUID()); target.setTenantId(String.valueOf(getLoginUser().getTenantId())); @@ -271,6 +274,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService { plotLesseeMapper.insert(target); p.setPlotLeaseStatus(YES_CODE); + p.setPlotColor(PLOT_COLOR_BLUE); plotInfoMapper.updateById(p); } 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 a427c706..3810771d 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 @@ -224,6 +224,13 @@ public interface ProductionPlanService { List getCultivatingYieldInfo(String baseId, String year); + /** + * 获取计划网箱比例 + * @param plotId + * @return + */ + String getGridRatio(String plotId); + @Data @AllArgsConstructor @NoArgsConstructor 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 7fabb4ee..bf1906b6 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 @@ -477,6 +477,25 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { return null; } + @Override + public String getGridRatio(String plotId) { + QueryWrapper x = new QueryWrapper<>(); + x.eq("plot_id", plotId); + List planDOList = productionPlanMapper.selectList(x); + int sum = planDOList.stream() + .filter(plan -> plan.getPlanStatus() == 2) + .mapToInt(ProductionPlanDO::getPredictedGridNumber) + .sum(); + + Integer total = planDOList.stream() + .filter(plan -> plan.getPlanStatus() == 2) + .map(ProductionPlanDO::getPlotGridNumber) + .findAny() + .orElse(0); + + return sum + "/" + total; + } + @Override public ProductionPlanGridRespVO getGridForPlan(String planNumber) { List pugList = productionPlanUsedGridMapperMapper.selectList(ProductionPlanUsedGridDO::getPlanNumber, planNumber);