feat (farm):
- 基地,地块新增 编码字段 - 户主导入/出 重构 - 修复部分bug
This commit is contained in:
@@ -158,6 +158,17 @@
|
||||
<!-- <artifactId>spring-boot-starter-validation</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.apache.poi</groupId>-->
|
||||
<!-- <artifactId>poi</artifactId>-->
|
||||
<!-- <version>5.2.3</version>-->
|
||||
<!-- </dependency>-->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.apache.poi</groupId>-->
|
||||
<!-- <artifactId>poi-scratchpad</artifactId>-->
|
||||
<!-- <version>5.2.3</version>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -32,8 +32,7 @@ public class FarmingRecordSaveReqVO {
|
||||
@Schema(description = "任务计划 (1: 开始; 2: 结束;)")
|
||||
private Integer taskStatus;
|
||||
|
||||
@Schema(description = "所属地块", example = "10480")
|
||||
private String plotId;
|
||||
|
||||
|
||||
@Schema(description = "生产计划ID", example = "24782")
|
||||
private String productionPlanId;
|
||||
@@ -70,11 +69,17 @@ public class FarmingRecordSaveReqVO {
|
||||
@Schema(description = "基地", example = "李四")
|
||||
private String baseName;
|
||||
|
||||
@Schema(description = "所属地块", example = "10480")
|
||||
private String plotId;
|
||||
|
||||
@Schema(description = "地块", example = "赵六")
|
||||
private String plotName;
|
||||
|
||||
@Schema(description = "租户id", example = "23744")
|
||||
private String tenantId;
|
||||
|
||||
@Schema(description = "引用类型投入品id集合 (逗号分隔)")
|
||||
private String inputsIds;
|
||||
|
||||
private List<FarmingRecordInputDO> investGoodsList;
|
||||
}
|
||||
@@ -18,7 +18,10 @@ import java.time.LocalDate;
|
||||
@NoArgsConstructor
|
||||
public class FarmingReport1RespVO {
|
||||
|
||||
private String baseId;
|
||||
@Schema(description = "农事记录ID")
|
||||
private String farmRecordId;
|
||||
|
||||
@Schema(description = "基地名称")
|
||||
private String baseName;
|
||||
|
||||
@Schema(description = "计划编号")
|
||||
@@ -35,18 +38,7 @@ public class FarmingReport1RespVO {
|
||||
@Schema(description = "持续天数")
|
||||
private Integer intervalDays;
|
||||
|
||||
@Schema(description = "投入品ID")
|
||||
private String inputId;
|
||||
private String inputName;
|
||||
|
||||
@Schema(description = "投入品总价")
|
||||
private Double inputTotalPrice;
|
||||
|
||||
@Schema(description = "详情-用量")
|
||||
private Integer usageAmount;
|
||||
|
||||
private Integer currentSpecType;
|
||||
@Schema(description = "详情-单位")
|
||||
private Integer unit;
|
||||
private String unitName;
|
||||
}
|
||||
|
||||
@@ -22,8 +22,14 @@ public class InputUsageChartRespVO {
|
||||
@Schema(description = "用量")
|
||||
private Integer usageAmount;
|
||||
|
||||
private Integer currentSpecType;
|
||||
|
||||
@Schema(description = "单位")
|
||||
private Integer unit;
|
||||
private String unitName;
|
||||
|
||||
@Schema(description = "单价金额")
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
@Schema(description = "总金额")
|
||||
private BigDecimal totalPrice;
|
||||
|
||||
@@ -16,8 +16,10 @@ import lombok.NoArgsConstructor;
|
||||
public class PlantingAreaChartRespVO {
|
||||
@Schema(description = "物种名称")
|
||||
private String speciesName;
|
||||
@Schema(description = "种植数量")
|
||||
private Integer plantingQuantity;
|
||||
@Schema(description = "种植面积")
|
||||
private Double plantingArea;
|
||||
@Schema(description = "种植面积占比")
|
||||
private String areaPercentage;
|
||||
private Integer plantingArea;
|
||||
@Schema(description = "总面积")
|
||||
private Integer totalArea;
|
||||
}
|
||||
|
||||
@@ -73,7 +73,9 @@ public class BaseInfoController {
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
public CommonResult<BaseInfoRespVO> getBaseInfo(@RequestParam("id") String id) {
|
||||
BaseInfoDO baseInfo = baseInfoService.getBaseInfo(id);
|
||||
return success(BeanUtils.toBean(baseInfo, BaseInfoRespVO.class));
|
||||
BaseInfoRespVO res = BeanUtils.toBean(baseInfo, BaseInfoRespVO.class);
|
||||
res.setUpdateStateForCode(1);
|
||||
return success(res);
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
|
||||
@@ -120,10 +120,10 @@ public class PlotInfoController {
|
||||
@Parameters({
|
||||
@Parameter(name = "file", description = "Excel 文件", required = true),
|
||||
})
|
||||
public CommonResult<Boolean> importPlotLesseeInfoExcel(@RequestParam("file") MultipartFile file) throws IOException {
|
||||
public CommonResult<PlotLesseeImportRespVO> importPlotLesseeInfoExcel(@RequestParam("file") MultipartFile file) throws IOException {
|
||||
List<PlotLesseeForImportExcelRespVO> list = ExcelUtils.read(file, PlotLesseeForImportExcelRespVO.class);
|
||||
plotInfoService.setPlotLesseeInfo(list);
|
||||
return success(true);
|
||||
PlotLesseeImportRespVO res = plotInfoService.setPlotLesseeInfo(list);
|
||||
return success(res);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -18,6 +18,11 @@ public class BaseInfoRespVO {
|
||||
@ExcelProperty("基地id")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "基地编号")
|
||||
private String code;
|
||||
@Schema(description = "基地编号-可修改状态 (1: 可以; 2: 不可以)")
|
||||
private Integer updateStateForCode;
|
||||
|
||||
@Schema(description = "基地名称", example = "张三")
|
||||
@ExcelProperty("基地名称")
|
||||
private String name;
|
||||
@@ -89,6 +94,8 @@ public class BaseInfoRespVO {
|
||||
private String plotPoint;
|
||||
private Integer plotLeaseStatus;
|
||||
private String plotLeaseStatusName;
|
||||
@Schema(description = "网格数量")
|
||||
private Integer gridNumber;
|
||||
@Schema(description = "网格信息")
|
||||
private List<GridInfo> gridOverviewList;
|
||||
@Schema(description = "户主流转信息")
|
||||
|
||||
@@ -12,6 +12,11 @@ public class BaseInfoSaveReqVO {
|
||||
@Schema(description = "基地id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13189")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "基地编号")
|
||||
private String code;
|
||||
@Schema(description = "基地编号-可修改状态 (1: 可以; 2: 不可以)")
|
||||
private Integer updateStateForCode;
|
||||
|
||||
@Schema(description = "基地名称", example = "张三")
|
||||
private String name;
|
||||
|
||||
|
||||
@@ -17,6 +17,11 @@ public class PlotInfoRespVO {
|
||||
@ExcelProperty("id")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "地块编号")
|
||||
private String code;
|
||||
@Schema(description = "地块编号-可修改状态 (1: 可以; 2: 不可以)")
|
||||
private Integer updateStateForCode;
|
||||
|
||||
@Schema(description = "所属基地ID")
|
||||
@ExcelProperty("所属基地ID")
|
||||
private String baseId;
|
||||
|
||||
@@ -12,6 +12,11 @@ public class PlotInfoSaveReqVO {
|
||||
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11262")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "地块编号")
|
||||
private String code;
|
||||
@Schema(description = "地块编号-可修改状态 (1: 可以; 2: 不可以)")
|
||||
private Integer updateStateForCode;
|
||||
|
||||
@Schema(description = "基地ID", example = "1431")
|
||||
private String baseId;
|
||||
|
||||
@@ -42,6 +47,9 @@ public class PlotInfoSaveReqVO {
|
||||
@Schema(description = " 租赁状态 (1: 已租; 0: 未租;)")
|
||||
private Integer plotLeaseStatus;
|
||||
|
||||
@Schema(description = "网格数量")
|
||||
private Integer gridNumber;
|
||||
|
||||
@Schema(description = "租赁人信息")
|
||||
private PlotLesseeSaveReqVO plotLessee;
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Schema(description = "管理后台 - 地块户主 - 导出")
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@@ -15,10 +17,18 @@ import lombok.NoArgsConstructor;
|
||||
@ExcelIgnoreUnannotated
|
||||
public class PlotLesseeForExportExcelRespVO {
|
||||
|
||||
@Schema(description = "基地编号")
|
||||
@ExcelProperty("基地编号")
|
||||
private String baseCode;
|
||||
|
||||
@Schema(description = "基地名称")
|
||||
@ExcelProperty("基地名称")
|
||||
private String baseName;
|
||||
|
||||
@Schema(description = "地块编码")
|
||||
@ExcelProperty("地块编码")
|
||||
private String plotCode;
|
||||
|
||||
@Schema(description = "地块名称")
|
||||
@ExcelProperty("地块名称")
|
||||
private String plotName;
|
||||
@@ -38,15 +48,26 @@ public class PlotLesseeForExportExcelRespVO {
|
||||
@Schema(description = "租赁开始日期")
|
||||
@ExcelProperty("租赁开始日期 (yyyy-MM-dd)")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private String leaseStartDate;
|
||||
private LocalDate leaseStartDate;
|
||||
|
||||
@Schema(description = "租赁接口日期")
|
||||
@ExcelProperty("租赁接口日期 (yyyy-MM-dd)")
|
||||
@Schema(description = "租赁结束日期")
|
||||
@ExcelProperty("租赁结束日期 (yyyy-MM-dd)")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private String leaseEndDate;
|
||||
private LocalDate leaseEndDate;
|
||||
|
||||
public PlotLesseeForExportExcelRespVO(String baseName, String plotName) {
|
||||
@Schema(description = "租赁剩余天数")
|
||||
@ExcelProperty("租赁剩余天数")
|
||||
private Long expirationDays;
|
||||
|
||||
@Schema(description = "是否修改 (是/否)")
|
||||
@ExcelProperty("是否修改 (是/否))")
|
||||
private String isModified;
|
||||
|
||||
public PlotLesseeForExportExcelRespVO(String baseCode, String baseName, String plotCode, String plotName,String isModified) {
|
||||
this.baseCode = baseCode;
|
||||
this.baseName = baseName;
|
||||
this.plotCode = plotCode;
|
||||
this.plotName = plotName;
|
||||
this.isModified = isModified;
|
||||
}
|
||||
}
|
||||
@@ -18,10 +18,18 @@ import java.time.LocalDate;
|
||||
@Accessors(chain = false)
|
||||
public class PlotLesseeForImportExcelRespVO {
|
||||
|
||||
@Schema(description = "基地编号")
|
||||
@ExcelProperty("基地编号")
|
||||
private String baseCode;
|
||||
|
||||
@Schema(description = "基地名称")
|
||||
@ExcelProperty("基地名称")
|
||||
private String baseName;
|
||||
|
||||
@Schema(description = "地块编码")
|
||||
@ExcelProperty("地块编码")
|
||||
private String plotCode;
|
||||
|
||||
@Schema(description = "地块名称")
|
||||
@ExcelProperty("地块名称")
|
||||
private String plotName;
|
||||
@@ -43,13 +51,16 @@ public class PlotLesseeForImportExcelRespVO {
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate leaseStartDate;
|
||||
|
||||
@Schema(description = "租赁接口日期")
|
||||
@ExcelProperty("租赁接口日期 (yyyy-MM-dd)")
|
||||
@Schema(description = "租赁结束日期")
|
||||
@ExcelProperty("租赁结束日期 (yyyy-MM-dd)")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate leaseEndDate;
|
||||
|
||||
public PlotLesseeForImportExcelRespVO(String baseName, String plotName) {
|
||||
this.baseName = baseName;
|
||||
this.plotName = plotName;
|
||||
}
|
||||
@Schema(description = "租赁剩余天数")
|
||||
@ExcelProperty("租赁剩余天数)")
|
||||
private Long expirationDays;
|
||||
|
||||
@Schema(description = "是否修改 (是/否)")
|
||||
@ExcelProperty("是否修改 (是/否))")
|
||||
private String isModified;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description: 导入结果反馈
|
||||
* @author: binda
|
||||
* @date: 2025/10/27 23:21
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class PlotLesseeImportRespVO {
|
||||
|
||||
private Integer total;
|
||||
private Integer successCount;
|
||||
private Integer failuresCount;
|
||||
private Integer unmodifiedCount;
|
||||
private List<Row> failuresList;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public static class Row {
|
||||
private String plotCode;
|
||||
private String plotName;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -26,6 +26,12 @@ public class PlotLesseeInfoRespVO {
|
||||
@ExcelProperty("地块ID")
|
||||
private String plotId;
|
||||
|
||||
@Schema(description = "地块编号")
|
||||
private String code;
|
||||
@Schema(description = "地块编号-可修改状态 (1: 可以; 2: 不可以)")
|
||||
private Integer updateStateForCode;
|
||||
|
||||
|
||||
@Schema(description = "地块名称")
|
||||
@ExcelProperty("地块名称")
|
||||
private String plotName;
|
||||
@@ -61,6 +67,9 @@ public class PlotLesseeInfoRespVO {
|
||||
private Integer plotLeaseStatus;
|
||||
private String plotLeaseStatusName;
|
||||
|
||||
@Schema(description = "网格数量")
|
||||
private Integer gridNumber;
|
||||
|
||||
@Schema(description = "租赁人信息")
|
||||
private PlotLesseeDetailsRespVO plotLessee;
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanag
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
@@ -39,17 +41,14 @@ public class ModelCycleController {
|
||||
|
||||
@Resource
|
||||
private ModelCycleService modelCycleService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建模型管理-管理周期")
|
||||
|
||||
public CommonResult<String> createModelCycle(@Valid @RequestBody ModelCycleSaveReqVO createReqVO) {
|
||||
return success(modelCycleService.createModelCycle(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新模型管理-管理周期")
|
||||
|
||||
public CommonResult<Boolean> updateModelCycle(@Valid @RequestBody ModelCycleSaveReqVO updateReqVO) {
|
||||
modelCycleService.updateModelCycle(updateReqVO);
|
||||
return success(true);
|
||||
@@ -58,7 +57,6 @@ public class ModelCycleController {
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除模型管理-管理周期")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
|
||||
public CommonResult<Boolean> deleteModelCycle(@RequestParam("id") String id) {
|
||||
modelCycleService.deleteModelCycle(id);
|
||||
return success(true);
|
||||
@@ -67,7 +65,6 @@ public class ModelCycleController {
|
||||
@DeleteMapping("/delete-list")
|
||||
@Parameter(name = "ids", description = "编号", required = true)
|
||||
@Operation(summary = "批量删除模型管理-管理周期")
|
||||
|
||||
public CommonResult<Boolean> deleteModelCycleList(@RequestParam("ids") List<String> ids) {
|
||||
modelCycleService.deleteModelCycleListByIds(ids);
|
||||
return success(true);
|
||||
@@ -76,15 +73,15 @@ public class ModelCycleController {
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得模型管理-管理周期")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
|
||||
public CommonResult<ModelCycleRespVO> getModelCycle(@RequestParam("id") String id) {
|
||||
ModelCycleDO modelCycle = modelCycleService.getModelCycle(id);
|
||||
return success(BeanUtils.toBean(modelCycle, ModelCycleRespVO.class));
|
||||
ModelCycleRespVO res = BeanUtils.toBean(modelCycle, ModelCycleRespVO.class);
|
||||
res.setStageImageList(Arrays.asList(res.getStageImage()));
|
||||
return success(res);
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得模型管理-管理周期分页")
|
||||
|
||||
public CommonResult<PageResult<ModelCycleRespVO>> getModelCyclePage(@Valid ModelCyclePageReqVO pageReqVO) {
|
||||
PageResult<ModelCycleDO> pageResult = modelCycleService.getModelCyclePage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, ModelCycleRespVO.class));
|
||||
@@ -92,7 +89,6 @@ public class ModelCycleController {
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出模型管理-管理周期 Excel")
|
||||
|
||||
@ApiAccessLog(operateType = EXPORT)
|
||||
public void exportModelCycleExcel(@Valid ModelCyclePageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
|
||||
@@ -28,6 +28,11 @@ public class BaseInfoDO extends BaseDO {
|
||||
*/
|
||||
@TableId(type = IdType.INPUT)
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 基地编码
|
||||
*/
|
||||
private String code;
|
||||
/**
|
||||
* 基地名称
|
||||
*/
|
||||
|
||||
@@ -71,4 +71,9 @@ public class PlotInfoDO extends BaseDO {
|
||||
* 租赁状态 (1: 已租; 0: 未租;)
|
||||
*/
|
||||
private Integer plotLeaseStatus;
|
||||
|
||||
/**
|
||||
* 网格数量
|
||||
*/
|
||||
private Integer gridNumber;
|
||||
}
|
||||
@@ -3,17 +3,16 @@ package cn.iocoder.yudao.module.farm.job;
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.FarmingRecordSaveReqVO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecordinput.FarmingRecordInputDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.modelfarmingoperation.ModelFarmingOperationDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.modelfarmingoperationinput.ModelFarmingOperationInputDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO;
|
||||
import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService;
|
||||
import cn.iocoder.yudao.module.farm.service.inputlibrary.InputUsageRecordsService;
|
||||
import cn.iocoder.yudao.module.farm.service.inputlibrary.InputsService;
|
||||
import cn.iocoder.yudao.module.farm.service.modelmanagement.ModelManagementService;
|
||||
import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -56,14 +55,19 @@ public class FarmingRecordJob implements JobHandler {
|
||||
if (taskTime.length != 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate startDate = LocalDate.parse(taskTime[0]);
|
||||
LocalDate endDate = LocalDate.parse(taskTime[1]);
|
||||
if (startDate.isEqual(LocalDate.now())) {
|
||||
boolean isStartToday = startDate.isEqual(today);
|
||||
boolean isEndToday = endDate.isEqual(today);
|
||||
|
||||
if (isStartToday) {
|
||||
// 开始日期在今天
|
||||
e.setTaskStatus(FARMING_RECORD_STATUS_1);
|
||||
farmingRecordService.createFarmingRecord(e);
|
||||
farmingRecordService.createFarmingRecordForJob(e);
|
||||
}
|
||||
if (endDate.isEqual(LocalDate.now())) {
|
||||
if (isEndToday) {
|
||||
// 结束日期在今天
|
||||
e.setTaskStatus(FARMING_RECORD_STATUS_2);
|
||||
farmingRecordService.updateFarmingRecord(e);
|
||||
@@ -104,18 +108,19 @@ public class FarmingRecordJob implements JobHandler {
|
||||
LocalDate startDate = productionStartDate.plusDays(startingPeriod-1);
|
||||
// 农事记录结束日期
|
||||
LocalDate endDate = startDate.plusDays(used);
|
||||
String taskTime = startDate.toString() + "," + endDate.toString();
|
||||
String taskTime = startDate + "," + endDate;
|
||||
|
||||
FarmingRecordSaveReqVO saveObj = new FarmingRecordSaveReqVO();
|
||||
saveObj.setTaskType(e.getFarmingId());
|
||||
saveObj.setTaskName(e.getFarmingName());
|
||||
saveObj.setTaskScope(p.getPlanNumber());
|
||||
saveObj.setTaskTime(taskTime);
|
||||
saveObj.setTaskStartDate(startDate);
|
||||
saveObj.setTaskEndDate(endDate);
|
||||
saveObj.setProductionPlanId(p.getId());
|
||||
saveObj.setModelFarmingOperationId(e.getId());
|
||||
saveObj.setExecutor("系统");
|
||||
saveObj.setActualLaborCost(e.getUsed());
|
||||
saveObj.setActualInputId(""); // TODO: 2025/9/2
|
||||
saveObj.setFeedbackNotes(e.getDescription());
|
||||
saveObj.setFeedbackImageUrl("");
|
||||
saveObj.setFeedbackImageUrlList(e.getSketchList());
|
||||
@@ -125,28 +130,8 @@ public class FarmingRecordJob implements JobHandler {
|
||||
saveObj.setPlotName(p.getPlotName());
|
||||
saveObj.setTenantId(p.getTenantId());
|
||||
saveObj.setModelFarmingOperationId(e.getId());
|
||||
saveObj.setInputsIds(e.getInputsIds());
|
||||
|
||||
List<FarmingRecordInputDO> inputDOList = new ArrayList<>();
|
||||
for (ModelFarmingOperationInputDO m : e.getInvestGoodsList()) {
|
||||
FarmingRecordInputDO target = new FarmingRecordInputDO();
|
||||
target.setInputParentCategory(m.getInputsId());
|
||||
target.setInputChildCategory(m.getInputsId());
|
||||
target.setDilutionRatio(m.getDiluted());
|
||||
target.setSingleUseOption(m.getUnitName());
|
||||
target.setSingleUseValue(BigDecimal.ZERO);
|
||||
target.setSingleUseUnit(""); // TODO: 2025/9/2
|
||||
target.setApplicationScope(""); // TODO: 2025/9/2
|
||||
target.setDosage(m.getDose());
|
||||
target.setUsage(m.getUsage());
|
||||
|
||||
target.setBaseId(p.getBaseId());
|
||||
target.setBaseName(p.getBaseName());
|
||||
target.setPlotId(p.getPlotId());
|
||||
target.setPlotName(p.getPlotName());
|
||||
target.setTenantId(p.getTenantId());
|
||||
inputDOList.add(target);
|
||||
}
|
||||
saveObj.setInvestGoodsList(inputDOList);
|
||||
return saveObj;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ 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;
|
||||
@@ -93,6 +94,7 @@ public class BaseInfoServiceImpl implements BaseInfoService {
|
||||
// 插入
|
||||
BaseInfoDO baseInfo = BeanUtils.toBean(createReqVO, BaseInfoDO.class);
|
||||
baseInfo.setId(IdUtil.fastUUID());
|
||||
baseInfo.setCode(createReqVO.getCode());
|
||||
baseInfo.setTenantId(String.valueOf(user.getTenantId()));
|
||||
// 解析坐标中心坐标
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
@@ -315,9 +317,20 @@ public class BaseInfoServiceImpl implements BaseInfoService {
|
||||
List<PlotLesseeDetailsRespVO> lesseeList = plotInfoService.getPlotLesseeList2(aDo.getId());
|
||||
String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统");
|
||||
String typeName = PLOT_TYPE_NAME_MAP.get(Integer.valueOf(aDo.getType()));
|
||||
BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo(Integer.valueOf(aDo.getType()),typeName,aDo.getId(), aDo.getPlotName(), aDo.getPlotColor(),
|
||||
BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), plotManager, aDo.getPoint(),
|
||||
aDo.getPlotLeaseStatus(), LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()),gridInfos,lesseeList);
|
||||
BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo(
|
||||
Integer.valueOf(aDo.getType()),
|
||||
typeName,
|
||||
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;
|
||||
|
||||
@@ -576,9 +576,9 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
|
||||
ProductionPlanRespVO.PlanOverview source = productionPlanMapper.getPlanOverview(baseId, tenantId.toString());
|
||||
return new BasePlanOverviewRespVO().setTotalArea(BigDecimalUtil.roundedViaMath(totalArea))
|
||||
.setPlanCount(source.getPlanCount())
|
||||
.setPlanCompletedCount(source.getPlanCompletedCount())
|
||||
.setPlanInProgressCount(source.getPlanInProgressCount())
|
||||
.setPlanOverdueCount(source.getPlanOverdueCount());
|
||||
.setPlanCompletedCount(ObjectUtils.defaultIfNull(source.getPlanCompletedCount(),0))
|
||||
.setPlanInProgressCount(ObjectUtils.defaultIfNull(source.getPlanInProgressCount(),0))
|
||||
.setPlanOverdueCount(ObjectUtils.defaultIfNull(source.getPlanOverdueCount(),0));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -718,33 +718,39 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
|
||||
|
||||
@Override
|
||||
public List<FarmingReport1RespVO> getFarmReport(ChartCommonReqVO req) {
|
||||
Map<String, String> itemsNameMap = this.getDictTypeMap(ITEMS_UNIT);
|
||||
Map<String, String> specificationNameMap = this.getDictTypeMap(SPECIFICATION_PRICE);
|
||||
|
||||
req.setTenantId(getLoginUser().getTenantId().toString());
|
||||
List<FarmingReport1RespVO> list = inputUsageRecordsMapper.getFarmReport(req);
|
||||
for (FarmingReport1RespVO f : list) {
|
||||
if (f.getCurrentSpecType() == 1) {
|
||||
f.setUnitName(itemsNameMap.get(f.getUnit().toString()));
|
||||
} else {
|
||||
f.setUnitName(specificationNameMap.get(f.getUnit().toString()));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FarmTypeChartRespVO> getFarmTypeChart(ChartCommonReqVO req) {
|
||||
req.setTenantId(getLoginUser().getTenantId().toString());
|
||||
return farmingRecordMapper.getFarmTypeChart(req);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PlantingAreaChartRespVO> getPlantingAreaChart(ChartCommonReqVO req) {
|
||||
req.setTenantId(getLoginUser().getTenantId().toString());
|
||||
return productionPlanMapper.getPlantingAreaChart(req);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<InputUsageChartRespVO> getInputUsageChart(ChartCommonReqVO req) {
|
||||
return inputUsageRecordsMapper.getInputUsageChart(req);
|
||||
req.setTenantId(getLoginUser().getTenantId().toString());
|
||||
|
||||
Map<String, String> itemsNameMap = this.getDictTypeMap(ITEMS_UNIT);
|
||||
Map<String, String> specificationNameMap = this.getDictTypeMap(SPECIFICATION_PRICE);
|
||||
|
||||
List<InputUsageChartRespVO> list = inputUsageRecordsMapper.getInputUsageChart(req);
|
||||
for (InputUsageChartRespVO i : list) {
|
||||
if (i.getCurrentSpecType() == 1) {
|
||||
i.setUnitName(itemsNameMap.get(i.getUnit().toString()));
|
||||
} else {
|
||||
i.setUnitName(specificationNameMap.get(i.getUnit().toString()));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private ProductionPlanReportRespVO.Models convertToModel(ProductionPlanDO plan,Map<String, String> speciesName) {
|
||||
|
||||
@@ -26,6 +26,7 @@ public interface FarmingRecordService {
|
||||
* @return 编号
|
||||
*/
|
||||
String createFarmingRecord(@Valid FarmingRecordSaveReqVO createReqVO);
|
||||
void createFarmingRecordForJob(@Valid FarmingRecordSaveReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 创建种植中心-农事基地-农事记录(新格式)
|
||||
|
||||
@@ -14,17 +14,23 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.farmingnamemaintenance.Farmin
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecord.FarmingRecordDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecordinput.FarmingRecordInputDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingtypemaintenance.FarmingTypeMaintenanceDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputsDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.farmingnamemaintenance.FarmingNameMaintenanceMapper;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord.FarmingRecordMapper;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecordinput.FarmingRecordInputMapper;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.farmingtypemaintenance.FarmingTypeMaintenanceMapper;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.productionplan.ProductionPlanMapper;
|
||||
import cn.iocoder.yudao.module.farm.enums.CommonConstants;
|
||||
import cn.iocoder.yudao.module.farm.service.inputlibrary.InputUsageRecordsService;
|
||||
import cn.iocoder.yudao.module.farm.service.inputlibrary.InputsService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -51,6 +57,12 @@ public class FarmingRecordServiceImpl implements FarmingRecordService {
|
||||
private FarmingTypeMaintenanceMapper farmingTypeMaintenanceMapper;
|
||||
@Resource
|
||||
private FarmingNameMaintenanceMapper farmingNameMaintenanceMapper;
|
||||
@Resource
|
||||
private ProductionPlanMapper productionPlanMapper;
|
||||
@Resource
|
||||
private InputUsageRecordsService inputUsageRecordsService;
|
||||
@Resource
|
||||
private InputsService inputsService;
|
||||
|
||||
@Override
|
||||
public String createFarmingRecord(FarmingRecordSaveReqVO createReqVO) {
|
||||
@@ -76,6 +88,18 @@ public class FarmingRecordServiceImpl implements FarmingRecordService {
|
||||
return farmingRecord.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createFarmingRecordForJob(FarmingRecordSaveReqVO createReqVO) {
|
||||
// 1. 新增农事记录
|
||||
String frId = this.createFarmingRecord(createReqVO);
|
||||
// 2. 新增投入品使用记录
|
||||
String inputsIds = createReqVO.getInputsIds();
|
||||
String[] inputIds = inputsIds.split(",");
|
||||
|
||||
List<InputsDO> iList = inputsService.getInputsByIds(Arrays.stream(inputIds).toList());
|
||||
inputUsageRecordsService.createInputUsageRecords(frId,iList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateFarmingRecord(FarmingRecordSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
@@ -165,6 +189,8 @@ public class FarmingRecordServiceImpl implements FarmingRecordService {
|
||||
LoginUser user = getLoginUser();
|
||||
String taskScope = createReqVO.getTaskScope();
|
||||
|
||||
ProductionPlanDO pp = productionPlanMapper.selectOne(ProductionPlanDO::getPlanNumber, taskScope);
|
||||
|
||||
// 转换时间格式:取第一个时间作为任务时间
|
||||
String taskTime = null;
|
||||
if (createReqVO.getTaskTime() != null && !createReqVO.getTaskTime().isEmpty()) {
|
||||
@@ -203,35 +229,12 @@ public class FarmingRecordServiceImpl implements FarmingRecordService {
|
||||
saveReqVO.setActualLaborCost(createReqVO.getActualLaborCost());
|
||||
saveReqVO.setFeedbackNotes(createReqVO.getFeedbackNotes());
|
||||
saveReqVO.setFeedbackImageUrlList(createReqVO.getFeedbackImageUrlList());
|
||||
saveReqVO.setBaseId(createReqVO.getBaseId());
|
||||
saveReqVO.setBaseName(createReqVO.getBaseName());
|
||||
saveReqVO.setPlotName(createReqVO.getPlotName());
|
||||
saveReqVO.setBaseId(pp.getBaseId());
|
||||
saveReqVO.setBaseName(pp.getBaseName());
|
||||
saveReqVO.setPlotId(pp.getPlotId());
|
||||
saveReqVO.setPlotName(pp.getPlotName());
|
||||
saveReqVO.setTenantId(createReqVO.getTenantId());
|
||||
|
||||
// 转换投入品列表
|
||||
// if (createReqVO.getInvestGoodsList() != null && !createReqVO.getInvestGoodsList().isEmpty()) {
|
||||
// List<FarmingRecordInputDO> inputList = createReqVO.getInvestGoodsList().stream()
|
||||
// .map(item -> {
|
||||
// FarmingRecordInputDO input = new FarmingRecordInputDO();
|
||||
// input.setId(IdUtil.fastUUID());
|
||||
// input.setDosage(item.getDose());
|
||||
// input.setUsage(item.getUsage());
|
||||
// input.setInputParentCategory(item.getAssetType()); // 投入品-父类
|
||||
// input.setInputChildCategory(item.getInputsId()); // 投入品-子类
|
||||
// input.setSingleUseOption(item.getUnit()); // 单位用量
|
||||
// input.setSingleUseUnit(item.getPackageUnit()); // 单件单位
|
||||
// input.setDilutionRatio(item.getDiluted()); // 稀释倍液
|
||||
//
|
||||
// input.setBaseId(createReqVO.getBaseId());
|
||||
// input.setBaseName(createReqVO.getBaseName());
|
||||
// input.setPlotId(createReqVO.getPlotId());
|
||||
// input.setPlotName(createReqVO.getPlotName());
|
||||
// input.setTenantId(createReqVO.getTenantId());
|
||||
// return input;
|
||||
// }).collect(Collectors.toList());
|
||||
// saveReqVO.setInvestGoodsList(inputList);
|
||||
// }
|
||||
|
||||
// 调用原有的创建方法
|
||||
return createFarmingRecord(saveReqVO);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.util.*;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.basicdatamanagement.inputlibrary.vo.usagerecords.InputUsageRecordsPageReqVO;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.basicdatamanagement.inputlibrary.vo.usagerecords.InputUsageRecordsSaveReqVO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputUsageRecordsDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputsDO;
|
||||
import jakarta.validation.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
@@ -23,6 +24,7 @@ public interface InputUsageRecordsService {
|
||||
* @return 编号
|
||||
*/
|
||||
String createInputUsageRecords(@Valid InputUsageRecordsSaveReqVO createReqVO);
|
||||
void createInputUsageRecords(String frId,@Valid List<InputsDO> createReqVO);
|
||||
|
||||
/**
|
||||
* 更新投入品使用记录
|
||||
|
||||
@@ -4,10 +4,13 @@ import cn.hutool.core.util.IdUtil;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.basicdatamanagement.inputlibrary.vo.usagerecords.InputUsageRecordsPageReqVO;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.basicdatamanagement.inputlibrary.vo.usagerecords.InputUsageRecordsSaveReqVO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputUsageRecordsDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputsDO;
|
||||
import cn.iocoder.yudao.module.farm.dal.mysql.inputlibrary.InputUsageRecordsMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
@@ -38,6 +41,33 @@ public class InputUsageRecordsServiceImpl implements InputUsageRecordsService {
|
||||
return inputUsageRecords.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createInputUsageRecords(String frId, List<InputsDO> createReqVO) {
|
||||
|
||||
for (InputsDO i : createReqVO) {
|
||||
|
||||
String unit = i.getCurrentSpecType() == 1 ? i.getInputUnit() : i.getSpecUnit();
|
||||
Integer inputUsage = i.getInputUsage();
|
||||
BigDecimal inputPrice = i.getInputPrice();
|
||||
BigDecimal totalPrice = inputPrice.multiply(BigDecimal.valueOf(inputUsage));
|
||||
|
||||
InputUsageRecordsSaveReqVO req = new InputUsageRecordsSaveReqVO();
|
||||
String id = IdUtil.fastUUID();
|
||||
req.setId(id);
|
||||
req.setInputId(i.getId());
|
||||
req.setFarmRecordId(frId);
|
||||
req.setCurrentSpecType(i.getCurrentSpecType());
|
||||
req.setUsageAmount(inputUsage);
|
||||
req.setUnitPrice(inputPrice);
|
||||
req.setSpec(Integer.valueOf(i.getInputSpec()));
|
||||
req.setUnit(Integer.valueOf(unit));
|
||||
req.setTotalPrice(totalPrice);
|
||||
this.createInputUsageRecords(req);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updateInputUsageRecords(InputUsageRecordsSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
|
||||
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.farm.service.modelcycle;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanagement.modelcycle.vo.ModelCyclePageReqVO;
|
||||
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.modelmanagement.modelcycle.vo.ModelCycleSaveReqVO;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@@ -53,9 +54,12 @@ public class ModelCycleServiceImpl implements ModelCycleService {
|
||||
// 校验存在
|
||||
validateModelCycleExists(updateReqVO.getId());
|
||||
// 更新
|
||||
for (String image : updateReqVO.getStageImageList()) {
|
||||
updateReqVO.setStageImage(image);
|
||||
if (!ObjectUtils.isEmpty(updateReqVO.getStageImageList())) {
|
||||
for (String image : updateReqVO.getStageImageList()) {
|
||||
updateReqVO.setStageImage(image);
|
||||
}
|
||||
}
|
||||
|
||||
ModelCycleDO updateObj = BeanUtils.toBean(updateReqVO, ModelCycleDO.class);
|
||||
modelCycleMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ public class ModelManagementServiceImpl implements ModelManagementService {
|
||||
List<ModelCycleDO> list = modelCycleMapper.selectListByModelId(id);
|
||||
list.forEach(cycle -> {
|
||||
ModelCycleRespVO vo = BeanUtils.toBean(cycle, ModelCycleRespVO.class);
|
||||
vo.setStageImageList(cycle.getImageList());
|
||||
vo.setStageImageList(Arrays.asList(vo.getStageImage()));
|
||||
//环境指标
|
||||
List<ModelEnvironmentIndexDO> environmentIndexDO = modelEnvironmentIndexMapper.selectByCycleId(cycle.getId());
|
||||
vo.setEnvironmentIndexDOS(environmentIndexDO);
|
||||
@@ -340,14 +340,6 @@ public class ModelManagementServiceImpl implements ModelManagementService {
|
||||
List<ModelFarmingOperationRespVO> respVOS = new ArrayList<>();
|
||||
farmingOperationDO.forEach(e -> {
|
||||
ModelFarmingOperationRespVO respVO = BeanUtils.toBean(e, ModelFarmingOperationRespVO.class);
|
||||
// List<ModelFarmingOperationInputDO> farmingOperationInputDOS = modelFarmingOperationInputMapper.selectByFarmingId(e.getId());
|
||||
// for (ModelFarmingOperationInputDO aDo : farmingOperationInputDOS) {
|
||||
// InputLibraryDO inputLibrary = inputLibraryService.getInputLibrary(aDo.getInputsId());
|
||||
// aDo.setInputsName(inputLibrary.getAssetName());
|
||||
// aDo.setUnitName(DictFrameworkUtils.parseDictDataLabel("asset_unit", aDo.getUnit()));
|
||||
// aDo.setPackageUnitName(DictFrameworkUtils.parseDictDataLabel("asset_price", aDo.getPackageUnit()));
|
||||
// }
|
||||
// respVO.setFarmingOperationInputDOS(farmingOperationInputDOS);
|
||||
List<InputsRespVO> inputs = inputsManager.getInputsPageForReferenceType(respVO.getId());
|
||||
respVO.setFarmingOperationInputVOS(inputs);
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public interface PlotInfoService {
|
||||
*/
|
||||
List<PlotLesseeForExportExcelRespVO> getPlotLesseeInfo();
|
||||
|
||||
void setPlotLesseeInfo(List<PlotLesseeForImportExcelRespVO> req);
|
||||
PlotLesseeImportRespVO setPlotLesseeInfo(List<PlotLesseeForImportExcelRespVO> req);
|
||||
|
||||
/**
|
||||
* 通过基地ID获取地块集合
|
||||
|
||||
@@ -18,15 +18,16 @@ import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagem
|
||||
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;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.time.LocalDate;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
@@ -67,7 +68,7 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
||||
// 插入
|
||||
PlotInfoDO plotInfo = BeanUtils.toBean(createReqVO, PlotInfoDO.class);
|
||||
plotInfo.setId(IdUtil.fastUUID());
|
||||
plotInfo.setPlotId(StrHelperUtil.generate());
|
||||
plotInfo.setPlotId(createReqVO.getCode());
|
||||
plotInfo.setTenantId(String.valueOf(user.getTenantId()));
|
||||
plotInfoMapper.insert(plotInfo);
|
||||
|
||||
@@ -189,59 +190,223 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
||||
plotLesseeDetailsRespVO.setTypeName(PLOT_TYPE_NAME_MAP.get(plotLesseeDetailsRespVO.getType()));
|
||||
plotLesseeDetailsRespVO.setPlotLessee(subLesseeInfo);
|
||||
plotLesseeDetailsRespVO.setPlotLeaseStatusName(LEASE_STATUS_MAP.get(plotLesseeDetailsRespVO.getPlotLeaseStatus()));
|
||||
plotLesseeDetailsRespVO.setCode(plotInfoDO.getPlotId());
|
||||
plotLesseeDetailsRespVO.setUpdateStateForCode(NO_CODE);
|
||||
return plotLesseeDetailsRespVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PlotLesseeForExportExcelRespVO> getPlotLesseeInfo() {
|
||||
|
||||
Map<String, String> baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1));
|
||||
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList(PlotInfoDO::getPlotLeaseStatus, CommonConstants.NO_CODE);
|
||||
return plotInfoDOS.stream().map(p -> new PlotLesseeForExportExcelRespVO(baseNameMap.get(p.getBaseId()), p.getPlotName())).toList();
|
||||
List<BaseInfoDO> bList = baseInfoMapper.selectList();
|
||||
Map<String, String> baseNameMap = bList.stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1));
|
||||
Map<String, String> baseCodeMap = bList.stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getCode, (v1, v2) -> v1));
|
||||
|
||||
List<PlotInfoDO> pList = plotInfoMapper.selectList();
|
||||
Map<String, String> plotCodeMap = pList.stream().collect(Collectors.toMap(PlotInfoDO::getId, PlotInfoDO::getPlotId, (v1, v2) -> v1));
|
||||
|
||||
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
|
||||
x.eq(PlotLesseeDO::getLeaseStatus, YES_CODE);
|
||||
List<PlotLesseeDO> lList = plotLesseeMapper.selectList(x);
|
||||
Map<String, PlotLesseeDO> lesObjMap = lList.stream().collect(Collectors.toMap(PlotLesseeDO::getPlotId, e -> e, (v1, v2) -> v1));
|
||||
|
||||
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList();
|
||||
return plotInfoDOS.stream().map(p -> {
|
||||
PlotLesseeForExportExcelRespVO target = new PlotLesseeForExportExcelRespVO(
|
||||
baseCodeMap.get(p.getBaseId()), baseNameMap.get(p.getBaseId()),
|
||||
plotCodeMap.get(p.getId()), p.getPlotName(), NO_NAME);
|
||||
|
||||
if (p.getPlotLeaseStatus() == 1 && lesObjMap.containsKey(p.getId())) {
|
||||
// 已租状态,计算租赁剩余天数
|
||||
PlotLesseeDO l = lesObjMap.get(p.getId());
|
||||
target.setLeaseName(l.getLeaseName());
|
||||
target.setLeaseIdCard(l.getLeaseIdCard());
|
||||
target.setLeasePhone(l.getLeasePhone());
|
||||
target.setLeaseStartDate(l.getLeaseStartDate());
|
||||
target.setLeaseEndDate(l.getLeaseEndDate());
|
||||
target.setExpirationDays(getDaysUntilLeaseEnd(l.getLeaseEndDate()));
|
||||
}
|
||||
return target;
|
||||
}).toList();
|
||||
|
||||
}
|
||||
|
||||
public long getDaysUntilLeaseEnd(LocalDate leaseEndDate) {
|
||||
LocalDate today = LocalDate.now();
|
||||
return ChronoUnit.DAYS.between(today, leaseEndDate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlotLesseeInfo(List<PlotLesseeForImportExcelRespVO> req) {
|
||||
public PlotLesseeImportRespVO setPlotLesseeInfo(List<PlotLesseeForImportExcelRespVO> req) {
|
||||
|
||||
Map<String, String> baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1));
|
||||
Map<String, String> plotNameMap = plotInfoMapper.selectList().stream().collect(Collectors.toMap(PlotInfoDO::getPlotName, PlotInfoDO::getId, (v1, v2) -> v1));
|
||||
for (PlotLesseeForImportExcelRespVO e : req) {
|
||||
|
||||
if (ObjectUtils.isEmpty(e.getLeaseName()) || ObjectUtils.isEmpty(e.getLeaseIdCard())
|
||||
|| ObjectUtils.isEmpty(e.getLeasePhone() ) || ObjectUtils.isEmpty(e.getLeaseStartDate()) || ObjectUtils.isEmpty(e.getLeaseEndDate())) {
|
||||
PlotLesseeImportRespVO res = new PlotLesseeImportRespVO();
|
||||
res.setTotal(req.size());
|
||||
|
||||
List<PlotLesseeForImportExcelRespVO> targetList = req.stream().filter(vo -> YES_NAME.equals(vo.getIsModified())).collect(Collectors.toList());
|
||||
|
||||
int successCount = 0;
|
||||
int failuresCount = 0;
|
||||
int unmodifiedCount = req.size() - targetList.size();
|
||||
List<PlotLesseeImportRespVO.Row> row = new ArrayList<>();
|
||||
for (PlotLesseeForImportExcelRespVO pl : targetList) {
|
||||
|
||||
PlotInfoDO p = plotInfoMapper.selectOne(PlotInfoDO::getPlotName, pl.getPlotName());
|
||||
if (ObjectUtils.isEmpty(p)) {
|
||||
failuresCount++;
|
||||
row.add(new PlotLesseeImportRespVO.Row(pl.getPlotCode(), pl.getPlotName()));
|
||||
continue;
|
||||
}
|
||||
|
||||
PlotInfoDO plotInfoDO = plotInfoMapper.selectOne(PlotInfoDO::getPlotName, e.getPlotName());
|
||||
PlotLesseeDO sourcePObj = plotLesseeMapper.selectOne(
|
||||
PlotLesseeDO::getPlotName, pl.getPlotName(),
|
||||
PlotLesseeDO::getLeaseStatus, YES_CODE);
|
||||
|
||||
if (ObjectUtils.isEmpty(plotInfoDO)) {
|
||||
if (ObjectUtils.isEmpty(sourcePObj)) {
|
||||
// 租户表不存在, 说明从未添加过户主信息, 直接录入即可
|
||||
// 1. 更新地块
|
||||
p.setPlotLeaseStatus(YES_CODE);
|
||||
plotInfoMapper.updateById(p);
|
||||
// 2. 录入户主表
|
||||
this.pInsert(p,pl,baseNameMap);
|
||||
|
||||
successCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 更新地块信息
|
||||
plotInfoDO.setPlotLeaseStatus(YES_CODE);
|
||||
plotInfoMapper.updateById(plotInfoDO);
|
||||
if (compareObj(sourcePObj,pl)) {
|
||||
unmodifiedCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 插入户主信息
|
||||
PlotLesseeDO target = new PlotLesseeDO();
|
||||
target.setLeaseName(e.getLeaseName());
|
||||
target.setLeaseIdCard(e.getLeaseIdCard());
|
||||
target.setLeasePhone(e.getLeasePhone());
|
||||
target.setLeaseStartDate(e.getLeaseStartDate());
|
||||
target.setLeaseEndDate(e.getLeaseEndDate());
|
||||
if (this.isEmpty(pl)) {
|
||||
p.setPlotLeaseStatus(NO_CODE);
|
||||
plotInfoMapper.updateById(p);
|
||||
|
||||
target.setId(IdUtil.fastUUID());
|
||||
target.setTenantId(String.valueOf(getLoginUser().getTenantId()));
|
||||
target.setLeaseStatus(CommonConstants.YES_CODE);
|
||||
sourcePObj.setLeaseStatus(NO_CODE);
|
||||
plotLesseeMapper.updateById(sourcePObj);
|
||||
}
|
||||
|
||||
// 1. 更新原地块户主信息
|
||||
sourcePObj.setLeaseStatus(NO_CODE);
|
||||
plotLesseeMapper.updateById(sourcePObj);
|
||||
|
||||
// 2. 录入新地块户主信息
|
||||
this.pInsert(p,pl,baseNameMap);
|
||||
successCount++;
|
||||
|
||||
target.setBaseId(plotInfoDO.getBaseId());
|
||||
target.setBaseName(baseNameMap.get(plotInfoDO.getBaseId()));
|
||||
target.setPlotId(plotInfoDO.getId());
|
||||
target.setPlotName(plotInfoDO.getPlotName());
|
||||
plotLesseeMapper.insert(target);
|
||||
}
|
||||
|
||||
|
||||
res.setSuccessCount(successCount);
|
||||
res.setFailuresCount(failuresCount);
|
||||
res.setUnmodifiedCount(unmodifiedCount);
|
||||
res.setFailuresList(row);
|
||||
return res;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public PlotLesseeImportRespVO setPlotLesseeInfo(List<PlotLesseeForImportExcelRespVO> req) {
|
||||
//
|
||||
// Map<String, String> baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1));
|
||||
// Map<String, String> 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<PlotLesseeImportRespVO.Row> 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<String, String> baseNameMap) {
|
||||
PlotLesseeDO target = new PlotLesseeDO();
|
||||
target.setLeaseName(pl.getLeaseName());
|
||||
target.setLeaseIdCard(pl.getLeaseIdCard());
|
||||
target.setLeasePhone(pl.getLeasePhone());
|
||||
target.setLeaseStartDate(pl.getLeaseStartDate());
|
||||
target.setLeaseEndDate(pl.getLeaseEndDate());
|
||||
|
||||
target.setId(IdUtil.fastUUID());
|
||||
target.setTenantId(String.valueOf(getLoginUser().getTenantId()));
|
||||
target.setLeaseStatus(CommonConstants.YES_CODE);
|
||||
|
||||
target.setBaseId(p.getBaseId());
|
||||
target.setBaseName(baseNameMap.get(p.getBaseId()));
|
||||
target.setPlotId(p.getId());
|
||||
target.setPlotName(p.getPlotName());
|
||||
plotLesseeMapper.insert(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对比结果一致返回: 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 isEmpty(PlotLesseeForImportExcelRespVO t) {
|
||||
return Objects.equals(t.getLeaseName(), null) ||
|
||||
Objects.equals(t.getLeaseIdCard(), null) ||
|
||||
Objects.equals(t.getLeasePhone(), null) ||
|
||||
Objects.equals(t.getLeaseStartDate(), null) ||
|
||||
Objects.equals(t.getLeaseEndDate(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
WHEN fiur.current_spec_type = 2 THEN fiur.spec
|
||||
ELSE fiur.unit
|
||||
END AS unit,
|
||||
fiur.current_spec_type AS currentSpecType,
|
||||
AVG(fiur.unit_price) AS unitPrice,
|
||||
SUM(fiur.total_price) AS totalPrice
|
||||
FROM farm_input_usage_records fiur
|
||||
<where>
|
||||
@@ -40,7 +42,8 @@
|
||||
WHEN fiur.current_spec_type = 1 THEN fiur.unit
|
||||
WHEN fiur.current_spec_type = 2 THEN fiur.spec
|
||||
ELSE fiur.unit
|
||||
END
|
||||
END,
|
||||
fiur.current_spec_type
|
||||
ORDER BY usageAmount DESC
|
||||
|
||||
</select>
|
||||
@@ -49,43 +52,39 @@
|
||||
parameterType="cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.ChartCommonReqVO"
|
||||
resultType="cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.FarmingReport1RespVO">
|
||||
SELECT
|
||||
fpp.base_id AS baseId,
|
||||
fpp.base_name AS baseName,
|
||||
fpp.plan_number AS planNumber,
|
||||
ffr.id AS farmRecordId,
|
||||
ffr.base_name AS baseName,
|
||||
ffr.task_scope AS planNumber,
|
||||
ffr.task_start_date AS taskStartDate,
|
||||
ffr.task_end_date AS taskEndDate,
|
||||
DATEDIFF(ffr.task_end_date, ffr.task_start_date) AS intervalDays,
|
||||
fiur.input_id AS inputId,
|
||||
fiur.input_name AS inputName,
|
||||
fiur.total_price AS inputTotalPrice,
|
||||
fiur.usage_amount AS usageAmount,
|
||||
fiur.current_spec_type AS currentSpecType,
|
||||
CASE
|
||||
WHEN fiur.current_spec_type = 1 THEN fiur.unit
|
||||
WHEN fiur.current_spec_type = 2 THEN fiur.spec
|
||||
ELSE fiur.unit
|
||||
END AS unit
|
||||
FROM farm_input_usage_records fiur
|
||||
INNER JOIN farm_farming_record ffr ON fiur.farm_record_id = ffr.id
|
||||
INNER JOIN farm_production_plan fpp ON ffr.production_plan_id = fpp.id
|
||||
COALESCE(SUM(fiur.total_price), 0) AS inputTotalPrice
|
||||
FROM farm_farming_record ffr
|
||||
LEFT JOIN farm_input_usage_records fiur ON ffr.id = fiur.farm_record_id AND fiur.deleted = 0
|
||||
<where>
|
||||
fiur.deleted = 0
|
||||
ffr.deleted = 0
|
||||
<if test="tenantId != null">
|
||||
AND fiur.tenant_id = #{tenantId}
|
||||
AND ffr.tenant_id = #{tenantId}
|
||||
</if>
|
||||
<if test="yearDate != null">
|
||||
AND YEAR(ffr.task_start_date) = #{yearDate}
|
||||
</if>
|
||||
<if test="baseId != null and baseId != ''">
|
||||
AND fiur.base_id = #{baseId}
|
||||
AND ffr.base_id = #{baseId}
|
||||
</if>
|
||||
<if test="plotId != null and plotId != ''">
|
||||
AND fiur.plot_id = #{plotId}
|
||||
AND ffr.plot_id = #{plotId}
|
||||
</if>
|
||||
<if test="state != null and state != ''">
|
||||
AND fpp.plan_status = #{state}
|
||||
AND ffr.task_status = #{state}
|
||||
</if>
|
||||
</where>
|
||||
GROUP BY
|
||||
ffr.id,
|
||||
ffr.base_name,
|
||||
ffr.task_scope,
|
||||
ffr.task_start_date,
|
||||
ffr.task_end_date
|
||||
ORDER BY ffr.task_start_date DESC
|
||||
</select>
|
||||
|
||||
|
||||
@@ -110,52 +110,52 @@
|
||||
GROUP BY plant_species_code
|
||||
|
||||
</select>
|
||||
|
||||
<select id="getPlantingAreaChart"
|
||||
parameterType="cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.ChartCommonReqVO"
|
||||
resultType="cn.iocoder.yudao.module.farm.controller.admin.cropfarmingcenter.vo.chart.PlantingAreaChartRespVO">
|
||||
|
||||
SELECT
|
||||
fsl.cultivar_name AS speciesName,
|
||||
SUM(fpp.predicted_area) AS plantingArea,
|
||||
CASE
|
||||
fsl.cultivar_name AS speciesName,
|
||||
SUM(fpp.planting_quantity) AS plantingQuantity,
|
||||
SUM(fpp.predicted_area) AS plantingArea,
|
||||
CASE
|
||||
WHEN #{plotId} IS NOT NULL AND #{plotId} != '' THEN
|
||||
CONCAT(ROUND(SUM(fpp.predicted_area) / MAX(fpp.total_area) * 100, 2), '%')
|
||||
MAX(fpp.total_area)
|
||||
WHEN #{baseId} IS NOT NULL AND #{baseId} != '' AND (#{plotId} IS NULL OR #{plotId} = '') THEN
|
||||
CONCAT(ROUND(SUM(fpp.predicted_area) / (
|
||||
SELECT SUM(total_area)
|
||||
FROM farm_production_plan
|
||||
WHERE base_id = #{baseId}
|
||||
AND tenant_id = #{tenantId}
|
||||
AND deleted = 0
|
||||
GROUP BY base_id
|
||||
) * 100, 2), '%')
|
||||
(
|
||||
SELECT SUM(total_area)
|
||||
FROM farm_production_plan
|
||||
WHERE base_id = #{baseId}
|
||||
AND tenant_id = #{tenantId}
|
||||
AND deleted = 0
|
||||
)
|
||||
ELSE
|
||||
CONCAT(ROUND(SUM(fpp.predicted_area) / (
|
||||
SELECT SUM(total_area)
|
||||
FROM farm_production_plan
|
||||
WHERE tenant_id = #{tenantId}
|
||||
AND deleted = 0
|
||||
) * 100, 2), '%')
|
||||
END AS areaPercentage
|
||||
(SELECT SUM(total_area)
|
||||
FROM farm_production_plan
|
||||
WHERE tenant_id = #{tenantId}
|
||||
AND deleted = 0)
|
||||
END AS totalArea
|
||||
FROM farm_production_plan fpp
|
||||
LEFT JOIN farm_species_library fsl ON fpp.plant_species_code = fsl.id
|
||||
LEFT JOIN farm_species_library fsl ON fpp.plant_species_code = fsl.id
|
||||
WHERE
|
||||
fpp.deleted = 0 AND fsl.deleted = 0
|
||||
<if test="tenantId != null">
|
||||
AND fpp.tenant_id = #{tenantId}
|
||||
</if>
|
||||
<if test="yearDate != null">
|
||||
AND YEAR(fpp.production_start_date) = #{yearDate}
|
||||
</if>
|
||||
<if test="baseId != null and baseId != ''">
|
||||
AND fpp.base_id = #{baseId}
|
||||
</if>
|
||||
<if test="plotId != null and plotId != ''">
|
||||
AND fpp.plot_id = #{plotId}
|
||||
</if>
|
||||
<if test="state != null and state != ''">
|
||||
AND fpp.plan_status = #{state}
|
||||
</if>
|
||||
fpp.deleted = 0
|
||||
AND fsl.deleted = 0
|
||||
<if test="tenantId != null">
|
||||
AND fpp.tenant_id = #{tenantId}
|
||||
</if>
|
||||
<if test="yearDate != null">
|
||||
AND YEAR(fpp.production_start_date) = #{yearDate}
|
||||
</if>
|
||||
<if test="baseId != null and baseId != ''">
|
||||
AND fpp.base_id = #{baseId}
|
||||
</if>
|
||||
<if test="plotId != null and plotId != ''">
|
||||
AND fpp.plot_id = #{plotId}
|
||||
</if>
|
||||
<if test="state != null and state != ''">
|
||||
AND fpp.plan_status = #{state}
|
||||
</if>
|
||||
GROUP BY fsl.cultivar_name
|
||||
ORDER BY plantingArea DESC
|
||||
|
||||
|
||||
Reference in New Issue
Block a user