From 3e04c23c5acdbf1d2790e193ad87121e06544e48 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Sep 2024 14:39:56 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=86=85=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=88=E5=85=A8=E5=88=A0=E5=85=A8=E5=A2=9E?= =?UTF-8?q?=EF=BC=89=E3=80=81=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=BA=90=E5=88=97=E8=A1=A8=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E8=A1=A8=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0buildinType=E5=AD=97=E6=AE=B5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReportDatasourceController.java | 18 +++-- .../datasource/vo/ReportDatasourceRespVO.java | 2 +- .../vo/ReportDatasourceSaveReqVO.java | 6 +- .../datasource/ReportDatasourceDO.java | 8 +- .../datasource/ReportDatasourceMapper.java | 4 + .../datasource/ReportDatasourceService.java | 14 ++++ .../ReportDatasourceServiceImpl.java | 73 ++++++++++++++++--- .../template/ReportTemplateServiceImpl.java | 4 +- .../ReportDatasourceTypeInEnum.java | 2 +- .../template/ReportTemplateTypeInEnum.java | 2 +- .../ReportTemplateTypeInEnumValidator.java | 3 + 11 files changed, 111 insertions(+), 25 deletions(-) diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index a2124531d..29fd669cb 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -1,6 +1,5 @@ package com.cf.imes.module.report.controller.admin.datasource; -import com.bstek.common.config.DataSourceConfig; import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.datasource.bean.DataSourceInfo; import com.bstek.datasource.bean.PreviewParams; @@ -47,9 +46,6 @@ public class ReportDatasourceController { @Resource private ReportDatasourceService datasourceService; - @Resource - private DataSourceConfig dataSourceConfig; - @Resource private DataSourceService ureportDataSourceService; @@ -117,12 +113,20 @@ public class ReportDatasourceController { } @GetMapping("/buildin/datasources") - @Operation(summary = "获取内置数据源") + @Operation(summary = "获取内置数据源列表") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") - public CommonResult> getBuildinDatasources() { - return CommonResult.success(dataSourceConfig.getDatasource()); + public CommonResult> getBuildinDatasources() { + return CommonResult.success(datasourceService.getBuildinDatasourceList()); } + @PostMapping("/buildin/datasources") + @Operation(summary = "保存内置数据源") + public CommonResult saveBuildinDatasources(@Valid @RequestBody @NotEmpty(message = "内置数据源列表不能为空") List reportDatasourceDOS) { + datasourceService.saveBuildinDatasources(reportDatasourceDOS); + return CommonResult.success(true); + } + + @PostMapping("/datasource/connect") @Operation(summary = "测试数据源连接") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java index 28cb451e4..de05540f5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java @@ -28,7 +28,7 @@ public class ReportDatasourceRespVO { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、spring、buildin、api", example = "0") + @Schema(description = "数据源类型,jdbc、spring、api", example = "0") private Integer type; @Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java index acf0d0700..246a8badf 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java @@ -2,6 +2,7 @@ package com.cf.imes.module.report.controller.admin.datasource.vo; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -36,10 +37,13 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、spring、buildin、api", example = "1") + @Schema(description = "数据源类型,jdbc、spring、api", example = "1") @ReportDatasourceTypeInEnum private String type; + @JsonIgnore + private Integer buildinType; + @Schema(description = "spring型数据源id") private String beanId; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java index 0f761a61b..8fb10e773 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java @@ -8,6 +8,7 @@ import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.type.CompressObjectListTypeHandler; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -48,10 +49,15 @@ public class ReportDatasourceDO extends BaseDO { private String name; /** - * 模板类型,0内置、1自定义 + * 数据源类型:jdbc、spring、api */ private ReportDatasourceTypeEnum type; + /** + * 内置类型:0是、1否 + */ + private ReportTemplateTypeEnum buildinType; + /** * spring型数据源id */ diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java index d0bb8dbf4..e1e7f855d 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java @@ -2,6 +2,7 @@ package com.cf.imes.module.report.dal.mysql.datasource; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; /** @@ -12,4 +13,7 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface ReportDatasourceMapper extends BaseMapperX { + + @Delete("DELETE FROM report_datasource WHERE buildin_type = 0") + int physicsDeleteBuildinDatasource(); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java index e459a74a3..7a71403fd 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java @@ -85,4 +85,18 @@ public interface ReportDatasourceService { * @return */ List getSpringBeanResultFieldList(String clazz); + + /** + * 获取内置数据源列表 + * + * @return + */ + List getBuildinDatasourceList(); + + /** + * 保存内置数据源列表 + * + * @param buildinDatasources + */ + void saveBuildinDatasources(List buildinDatasources); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index 4f3dbeb49..855f361f2 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -17,7 +17,10 @@ import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.security.core.LoginUser; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; +import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; @@ -25,6 +28,7 @@ import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import com.cf.imes.module.report.framework.ureport.annotation.CfReportSpringbeanDatasource; import com.cf.imes.module.report.service.dataset.ReportDatasetService; import com.cf.imes.module.report.util.SqlInjectionUtil; @@ -55,6 +59,7 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_GET_FIE import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_ILLEGAL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_INJECTION_RISK; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_REQUIRED; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; @@ -113,17 +118,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { datasetMapper.delete(new LambdaQueryWrapperX().eq(ReportDatasetDO::getDatasourceId, id)); } - /** - * 校验数据源是否存在 - * - * @param id - */ - private void validateDatasourceExists(Long id) { - if (datasourceMapper.selectById(id) == null) { - throw exception(DATASOURCE_NOT_EXISTS); - } - } - @Override public ReportDatasourceDO getDatasource(Long id) { ReportDatasourceDO reportDatasourceDO = datasourceMapper.selectById(id); @@ -278,6 +272,52 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } } + @Override + public List getBuildinDatasourceList() { + List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() + .eqIfPresent(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM) + .orderByDesc(ReportDatasourceDO::getCreateTime)); + // 查询数据集 + if (CollUtil.isNotEmpty(reportDatasourceDOS)) { + reportDatasourceDOS.forEach(reportDatasourceDO -> { + queryDatasetInSource(reportDatasourceDO); + }); + } + return reportDatasourceDOS; + } + + @Override + public void saveBuildinDatasources(List buildinDatasources) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + // 非超管不能操作内置模板 + if (!isSuperAdmin) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); + } + // 全删内置数据源 + int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); + log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); + buildinDatasources.forEach(ds -> { + // 新增数据源 + ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); + ds.setId(null); + Long datasourceId = createDatasource(ds); + List datasets = ds.getDatasets(); + List batchInsertDataset = new ArrayList<>(); + datasets.forEach(dataset -> { + // 新增数据集 + dataset.setDatasourceId(datasourceId); + dataset.setId(null); + batchInsertDataset.add(dataset); + }); + + // 批量插入数据集 + if (CollUtil.isNotEmpty(batchInsertDataset)) { + datasetService.batchCreateDataset(batchInsertDataset); + } + }); + } + /** * 查询数据源下的数据集 * @@ -290,4 +330,15 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { reportDatasourceDO.setDatasets(datasetList); } } + + /** + * 校验数据源是否存在 + * + * @param id + */ + private void validateDatasourceExists(Long id) { + if (datasourceMapper.selectById(id) == null) { + throw exception(DATASOURCE_NOT_EXISTS); + } + } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index ecf6e8a69..ee325b507 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -69,7 +69,7 @@ import java.util.Map; import java.util.Objects; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATATEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** @@ -261,7 +261,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); // 非超管不能操作内置模板 if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(DATATEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java index 411c32a9d..c90178ab2 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; validatedBy = {ReportDatasourceTypeInEnumValidator.class} ) public @interface ReportDatasourceTypeInEnum { - String message() default "数据源类型[type]错误,请检查是否jdbc/spring/buildin/api"; + String message() default "数据源类型[type]错误,请检查是否jdbc/spring/api"; Class[] groups() default {}; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java index 1e2ae091d..df4844e52 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; validatedBy = {ReportTemplateTypeInEnumValidator.class} ) public @interface ReportTemplateTypeInEnum { - String message() default "类型[type]错误,请检查是否0(内置)/1(自定义)"; + String message() default "类型错误,请检查是否0(内置)/1(自定义)"; Class[] groups() default {}; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java index 880ab32c1..2fc8b796c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java @@ -21,6 +21,9 @@ public class ReportTemplateTypeInEnumValidator implements ConstraintValidator Date: Wed, 4 Sep 2024 15:31:51 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E4=BD=99=E6=96=99=E5=BA=93=E5=AD=98?= =?UTF-8?q?=EF=BC=9A=E6=8E=A5=E5=8F=A3=E6=9D=83=E9=99=90=E4=B8=B2=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/plate/RemainPlateController.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java index 5e9bdea9a..fea9299c1 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/RemainPlateController.java @@ -42,21 +42,21 @@ public class RemainPlateController { @PostMapping("/create") @Operation(summary = "创建生产单余料板表(单个)") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:create','placeorder:optimize')") public CommonResult createRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO createReqVO) { return success(remainPlateService.createRemainPlate(createReqVO)); } @PostMapping("/createMultiple") @Operation(summary = "创建生产单余料板表(多个)") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:create','placeorder:optimize')") public CommonResult createRemainPlateMultiple(@Valid @RequestBody Set createReqVOS) { return success(remainPlateService.createRemainPlateMultiple(createReqVOS)); } @PutMapping("/update") @Operation(summary = "更新生产单余料板表") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") public CommonResult updateRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO updateReqVO) { remainPlateService.updateRemainPlate(updateReqVO); return success(true); @@ -64,7 +64,7 @@ public class RemainPlateController { @PutMapping("/updateStatus") @Operation(summary = "余料板批量核销") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") public CommonResult updateRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { remainPlateService.updateRemainPlateStatus(updateReqVO.getId(), updateReqVO.getStatus(), @@ -75,7 +75,7 @@ public class RemainPlateController { @PutMapping("/revertUpdate") @Operation(summary = "余料板批量释放") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") public CommonResult revertRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { remainPlateService.revertRemainPlateStatus(updateReqVO.getId(),updateReqVO.getStatus()); return success(true); @@ -84,7 +84,7 @@ public class RemainPlateController { @DeleteMapping("/delete") @Operation(summary = "删除生产单余料板表") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:delete')") public CommonResult deleteRemainPlate(@RequestParam("id") Set ids) { remainPlateService.deleteRemainPlate(ids); return success(true); @@ -93,7 +93,7 @@ public class RemainPlateController { @GetMapping("/get") @Operation(summary = "获得生产单余料板表") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:query')") public CommonResult getRemainPlate(@RequestParam("id") Long id) { RemainPlateDO remainPlate = remainPlateService.getRemainPlate(id); return success(BeanUtils.toBean(remainPlate, RemainPlateRespVO.class)); @@ -101,7 +101,7 @@ public class RemainPlateController { @GetMapping("/page") @Operation(summary = "获得生产单余料板表分页") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:query','placeorder:optimize')") public CommonResult> getRemainPlatePage(@Valid RemainPlatePageReqVO pageReqVO) { PageResult pageResult = remainPlateService.getRemainPlatePage(pageReqVO); return success(BeanUtils.toBean(pageResult, RemainPlateRespVO.class)); @@ -109,7 +109,7 @@ public class RemainPlateController { @GetMapping("/pageAdd") @Operation(summary = "获得生产单余料板可添加分页") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:query')") public CommonResult> getRemainPlatePageToAdd(@Valid RemainPlatePageReqVO pageReqVO) { PageResult pageResult = remainPlateService.getRemainPlatePageToAdd(pageReqVO); return success(BeanUtils.toBean(pageResult, RemainPlateRespVO.class)); @@ -117,7 +117,7 @@ public class RemainPlateController { @GetMapping("/export-excel") @Operation(summary = "导出生产单余料板表Excel") - @PreAuthorize("@ss.hasPermission('placeorder:remain')") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:export')") @OperateLog(type = EXPORT) public void exportRemainPlateExcel(@Valid RemainPlatePageReqVO pageReqVO, HttpServletResponse response) throws IOException { From 5264991a3cc807aa31361b3f2788e09ce4241d92 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Sep 2024 15:55:51 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A=E5=BC=82=E5=B8=B8=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cf/imes/module/report/enums/ErrorCodeConstants.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java index 8e9d6de5f..005c1f6ac 100644 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java +++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java @@ -12,13 +12,14 @@ public final class ErrorCodeConstants { // ========== UREPORT template模块 1-003-001-000 ========== public static final ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_003_001_001, "报表模板信息不存在"); - public static final ErrorCode DATATEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_001_002, "内置模板操作权限不足"); + public static final ErrorCode TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_001_002, "内置模板操作权限不足"); // ========== UREPORT datasource模块 1-003-002-000 ========== public static final ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_002_001, "报表数据源不存在"); public static final ErrorCode DATASOURCE_CONNECT_FAIL = new ErrorCode(1_003_002_002, "报表数据源连接失败"); public static final ErrorCode DATASOURCE_SPRINGBEAN_GET_FAIL = new ErrorCode(1_003_002_003, "无法获取springbean【{}】"); public static final ErrorCode DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL = new ErrorCode(1_003_002_004, "获取springbean方法列表失败,请检查】"); + public static final ErrorCode DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_001_002, "内置数据源操作权限不足"); // ========== UREPORT dataset模块 1-003-003-000 ========== From 7cac04e95e2ea53810cd52c1c132acb29862aa2a Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Sep 2024 16:05:20 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E3=80=81redis=E8=B4=A6=E5=8F=B7=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E8=A7=A3=E5=AF=86=E9=85=8D=E7=BD=AE=E7=B1=BB=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E6=96=B9=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=9B2?= =?UTF-8?q?=E3=80=81elasticsearch=E6=94=AF=E6=8C=81=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E8=A7=A3=E5=AF=86=E3=80=81=E6=94=AF=E6=8C=81?= =?UTF-8?q?https=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...henfengElasticsearchAutoConfiguration.java | 142 ++++++++++++++---- .../framework/es/config/EsProperties.java | 90 ++++++++++- ...henfengDataSourceEncryptConfiguration.java | 2 +- ...ChenfengRedisEncryptAutoConfiguration.java | 2 +- .../src/main/resources/application.yaml | 4 +- .../src/main/resources/application.yaml | 4 +- .../src/main/resources/application.yaml | 4 +- .../src/main/resources/application.yaml | 4 +- 8 files changed, 217 insertions(+), 35 deletions(-) diff --git a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/ChenfengElasticsearchAutoConfiguration.java b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/ChenfengElasticsearchAutoConfiguration.java index 48a4b2a63..6c4b9752f 100644 --- a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/ChenfengElasticsearchAutoConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/ChenfengElasticsearchAutoConfiguration.java @@ -4,16 +4,42 @@ import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.rest_client.RestClientTransport; +import com.cf.imes.framework.common.util.encrypt.AesUtils; import com.cf.imes.framework.es.core.service.ESDocumentService; import com.cf.imes.framework.es.core.service.ESDocumentServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.SSLContexts; import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; + /** * @author there @@ -21,20 +47,19 @@ import org.springframework.util.StringUtils; @AutoConfiguration @ConditionalOnClass(ElasticsearchClient.class) @EnableConfigurationProperties(EsProperties.class) +@Slf4j public class ChenfengElasticsearchAutoConfiguration { - //超时时间设置 - public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 10000; - public static final int DEFAULT_SOCKET_TIMEOUT_MILLIS = 300000; - public static final int DEFAULT_CONNECT_REQUEST_TIMEOUT_MILLIS = 1000; + @Value("${chenfeng.encrypt.publicKey:}") + private String publicKey; /** * 同步方式 * */ @Bean - public ElasticsearchClient elasticsearchClient(EsProperties properties) { - return new ElasticsearchClient(getTransport(properties.getUris())); + public ElasticsearchClient elasticsearchClient(RestClientTransport transport) { + return new ElasticsearchClient(transport); } /** @@ -42,44 +67,110 @@ public class ChenfengElasticsearchAutoConfiguration { * */ @Bean - public ElasticsearchAsyncClient elasticsearchAsyncClient(EsProperties properties) { - return new ElasticsearchAsyncClient(getTransport(properties.getUris())); + public ElasticsearchAsyncClient elasticsearchAsyncClient(RestClientTransport transport) { + return new ElasticsearchAsyncClient(transport); } @Bean - private ESDocumentService esDocumentService(ElasticsearchClient elasticsearchClient, ElasticsearchAsyncClient elasticsearchAsyncClient) { + public ESDocumentService esDocumentService(ElasticsearchClient elasticsearchClient, ElasticsearchAsyncClient elasticsearchAsyncClient) { return new ESDocumentServiceImpl(elasticsearchClient, elasticsearchAsyncClient); } /** * 获取客户端 RestClientTransport */ - private RestClientTransport getTransport(String hosts){ - HttpHost[] httpHosts = toHttpHost(hosts); - RestClient restClient = getRestClient(httpHosts); - return new RestClientTransport(restClient, new JacksonJsonpMapper()); + @Bean + public RestClientTransport getTransport(RestClient client){ + return new RestClientTransport(client, new JacksonJsonpMapper()); } + /** * 获取客户端RestClient - * @param httpHosts http数组 + * chenfeng.encrypt.enable:true + * + * @param properties es配置 */ - private RestClient getRestClient(HttpHost[] httpHosts){ - return RestClient.builder(httpHosts).setRequestConfigCallback(requestConfigBuilder -> { - requestConfigBuilder.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS); - requestConfigBuilder.setSocketTimeout(DEFAULT_SOCKET_TIMEOUT_MILLIS); - requestConfigBuilder.setConnectionRequestTimeout(DEFAULT_CONNECT_REQUEST_TIMEOUT_MILLIS); + @Bean + @ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true") + public RestClient getAuthRestClient(EsProperties properties) { + // 配置账号密码 + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new UsernamePasswordCredentials(AesUtils.decrypt(properties.getUsername(), publicKey), AesUtils.decrypt(properties.getPassword(), publicKey))); + RestClientBuilder.HttpClientConfigCallback httpClientConfigCallback = httpClientBuilder -> { + // 设置账号密码、连接信息 + HttpAsyncClientBuilder httpAsyncClientBuilder = httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider) + .setDefaultRequestConfig(RequestConfig.custom() + .setConnectTimeout(properties.getConnectionTimeout().toSecondsPart()) + .setSocketTimeout(properties.getSocketTimeout().toSecondsPart()) + .setConnectionRequestTimeout(properties.getConnectionRequestTimeout().toSecondsPart()) + .build()); + if (properties.isSecurityHttpSslEnable()) { + // 开启ssl配置连接证书 + httpAsyncClientBuilder.setSSLContext(buildSSLContext()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); + } + return httpAsyncClientBuilder; + }; + return RestClient.builder(toHttpHost(properties.getUris(), properties.isSecurityHttpSslEnable())).setHttpClientConfigCallback(httpClientConfigCallback).build(); + } + + /** + * 获取客户端RestClient(默认) + * chenfeng.encrypt.enable:false或者缺省 + * + * @param properties es配置 + */ + @Bean + @ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "false", matchIfMissing = true) + public RestClient getRestClient(EsProperties properties) { + return RestClient.builder(toHttpHost(properties.getUris(), properties.isSecurityHttpSslEnable())).setRequestConfigCallback(requestConfigBuilder -> { + requestConfigBuilder.setConnectTimeout(properties.getConnectionTimeout().toSecondsPart()); + requestConfigBuilder.setSocketTimeout(properties.getSocketTimeout().toSecondsPart()); + requestConfigBuilder.setConnectionRequestTimeout(properties.getConnectionRequestTimeout().toSecondsPart()); return requestConfigBuilder; }).build(); } /** - * 解析配置的字符串hosts,转为HttpHost对象数组 + * 构建ssl请求信息 + * + * @return */ - private HttpHost[] toHttpHost(String hosts) { + private SSLContext buildSSLContext() { + SSLContext sslContext = null; + try { + ClassPathResource resource = new ClassPathResource("http_ca.crt"); + CertificateFactory factory = CertificateFactory.getInstance("X.509"); + Certificate trustedCa; + try (InputStream is = resource.getInputStream()) { + trustedCa = factory.generateCertificate(is); + } + KeyStore trustStore = KeyStore.getInstance("pkcs12"); + trustStore.load(null, null); + trustStore.setCertificateEntry("ca", trustedCa); + SSLContextBuilder sslContextBuilder = SSLContexts.custom() + .loadTrustMaterial(trustStore, null); + sslContext = sslContextBuilder.build(); + } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException | + KeyManagementException e) { + log.error("ES连接认证失败", e); + } + return sslContext; + } + + + /** + * 解析域名 + * + * @param hosts 域名字符串 + * @param isSslEnable 是否开启ssl + * @return + */ + private HttpHost[] toHttpHost(String hosts, boolean isSslEnable) { if (!StringUtils.hasLength(hosts)) { - throw new RuntimeException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!"); + throw new IllegalArgumentException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!"); } // 多个IP逗号隔开 String[] hostArray = hosts.split(","); @@ -87,14 +178,9 @@ public class ChenfengElasticsearchAutoConfiguration { HttpHost httpHost; for (int i = 0; i < hostArray.length; i++) { String[] strings = hostArray[i].split(":"); - httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "http"); + httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), isSslEnable ? "https" : "http"); httpHosts[i] = httpHost; } - return httpHosts; } - - - - } diff --git a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/EsProperties.java b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/EsProperties.java index 8030fc5d3..5dfd0a99f 100644 --- a/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/EsProperties.java +++ b/cf-framework/cf-spring-boot-starter-elasticsearch/src/main/java/com/cf/imes/framework/es/config/EsProperties.java @@ -2,12 +2,46 @@ package com.cf.imes.framework.es.config; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.time.Duration; + /** * es环境配置 * @author there */ @ConfigurationProperties(prefix = "spring.elasticsearch") public class EsProperties { + private String uris; + + /** + * Username for authentication with Elasticsearch. + */ + private String username; + + /** + * Password for authentication with Elasticsearch. + */ + private String password; + + /** + * Connection timeout used when communicating with Elasticsearch. + */ + private Duration connectionTimeout = Duration.ofSeconds(10); + + /** + * Socket timeout used when communicating with Elasticsearch. + */ + private Duration socketTimeout = Duration.ofSeconds(30); + + + private Duration connectionRequestTimeout = Duration.ofSeconds(1); + + /** + * Prefix added to the path of every request sent to Elasticsearch. + */ + private String pathPrefix; + + private boolean securityHttpSslEnable = false; + public String getUris() { return uris; } @@ -16,5 +50,59 @@ public class EsProperties { this.uris = uris; } - private String uris; + public String getUsername() { + return this.username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Duration getConnectionTimeout() { + return this.connectionTimeout; + } + + public void setConnectionTimeout(Duration connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + public Duration getSocketTimeout() { + return this.socketTimeout; + } + + public void setSocketTimeout(Duration socketTimeout) { + this.socketTimeout = socketTimeout; + } + + public String getPathPrefix() { + return this.pathPrefix; + } + + public void setPathPrefix(String pathPrefix) { + this.pathPrefix = pathPrefix; + } + + public boolean isSecurityHttpSslEnable() { + return securityHttpSslEnable; + } + + public void setSecurityHttpSslEnable(boolean securityHttpSslEnable) { + this.securityHttpSslEnable = securityHttpSslEnable; + } + + public Duration getConnectionRequestTimeout() { + return connectionRequestTimeout; + } + + public void setConnectionRequestTimeout(Duration connectionRequestTimeout) { + this.connectionRequestTimeout = connectionRequestTimeout; + } } diff --git a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/datasource/config/ChenfengDataSourceEncryptConfiguration.java b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/datasource/config/ChenfengDataSourceEncryptConfiguration.java index 5fa1cd56c..fe12fc47f 100644 --- a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/datasource/config/ChenfengDataSourceEncryptConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/datasource/config/ChenfengDataSourceEncryptConfiguration.java @@ -15,9 +15,9 @@ import org.springframework.context.annotation.Bean; */ @AutoConfiguration @AutoConfigureBefore(DynamicDataSourceAutoConfiguration.class) +@ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true") public class ChenfengDataSourceEncryptConfiguration { @Bean - @ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true") public DataSourceInitEvent getDataSourceInitEvent() { return new ChenfengDataSourceEncryptInitEvent(); } diff --git a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengRedisEncryptAutoConfiguration.java b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengRedisEncryptAutoConfiguration.java index f1cd7435b..490d1ad50 100644 --- a/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengRedisEncryptAutoConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-redis/src/main/java/com/cf/imes/framework/redis/config/ChenfengRedisEncryptAutoConfiguration.java @@ -20,13 +20,13 @@ import org.springframework.util.StringUtils; * @since 2024/8/27 9:46 */ @AutoConfiguration +@ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true") public class ChenfengRedisEncryptAutoConfiguration { @Value("${chenfeng.encrypt.publicKey:}") private String publicKey; @Bean - @ConditionalOnProperty(name = "chenfeng.encrypt.enable", havingValue = "true") public RedissonAutoConfigurationCustomizer redissonAutoConfigurationCustomizer() { return configuration -> { Config redissonConfig = new Config(); diff --git a/cf-module-infra/cf-module-infra-biz/src/main/resources/application.yaml b/cf-module-infra/cf-module-infra-biz/src/main/resources/application.yaml index 8041c9902..3f27b6988 100644 --- a/cf-module-infra/cf-module-infra-biz/src/main/resources/application.yaml +++ b/cf-module-infra/cf-module-infra-biz/src/main/resources/application.yaml @@ -157,5 +157,7 @@ chenfeng: - infra_job_log - infra_job_log - infra_data_source_config - + encrypt: + enable: false + publicKey: cfimes debug: false diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/application.yaml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/application.yaml index df903d7ad..453122f78 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/application.yaml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/application.yaml @@ -161,5 +161,7 @@ chenfeng: send-maximum-quantity-per-day: 10 begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 end-code: 9999 # 这里配置 9999 的原因是,测试方便。 - + encrypt: + enable: false + publicKey: cfimes debug: false diff --git a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application.yaml b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application.yaml index 6a587132c..07c6419b9 100644 --- a/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application.yaml +++ b/cf-module-prod-plan/cf-module-prod-plan-biz/src/main/resources/application.yaml @@ -175,5 +175,7 @@ chenfeng: send-maximum-quantity-per-day: 10 begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 end-code: 9999 # 这里配置 9999 的原因是,测试方便。 - + encrypt: + enable: false + publicKey: cfimes debug: false diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/application.yaml b/cf-module-report/cf-module-report-biz/src/main/resources/application.yaml index 2486af452..13b2d085a 100644 --- a/cf-module-report/cf-module-report-biz/src/main/resources/application.yaml +++ b/cf-module-report/cf-module-report-biz/src/main/resources/application.yaml @@ -103,6 +103,8 @@ chenfeng: organ: # 多租户相关配置项 enable: true ignore-tables: - + encrypt: + enable: false + publicKey: cfimes debug: false From 54ce827f9a514bb84b515184e77723b853dec9b4 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Sep 2024 18:32:43 +0800 Subject: [PATCH 05/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A=E7=A7=BB=E9=99=A4BUILDIN=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/enums/datasource/ReportDatasourceTypeEnum.java | 3 +-- .../report/service/template/ReportTemplateServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java index 0f9d30cb5..80a45a0fa 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java @@ -15,8 +15,7 @@ import lombok.Getter; public enum ReportDatasourceTypeEnum { JDBC(0, "jdbc"), SPRING(1, "spring"), - BUILDIN(2, "buildin"), - API(3, "api"); + API(2, "api"); @EnumValue private final Integer code; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index ee325b507..c87b078e3 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -336,7 +336,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 忽略转换的字段名,手动转列表 String ignorePropertieName = "datasets"; switch (ds.getType()) { - case JDBC, BUILDIN -> { + case JDBC -> { // 转换对应的ureport对象 JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtil.copyProperties(ds, JdbcDatasourceDefinition.class, ignorePropertieName); datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); From 84cab511ac394033fa43c4f5951ded3eb08b4bb1 Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Thu, 5 Sep 2024 11:04:07 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=E6=8E=92=E5=8D=95=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90-=E5=8C=85=E8=A3=B9=E8=AF=A6=E6=83=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/plan/PlanController.java | 8 - .../saveOptimize/PrintOrderPackReqVO.java | 6 +- .../executor/dal/mysql/goods/GoodsMapper.java | 5 + .../dal/mysql/orderItem/OrderItemMapper.java | 11 +- .../optimizeplan/OptimizePlanServiceImpl.java | 185 +++++++++--------- .../executor/service/plan/PlanService.java | 1 - .../service/plan/PlanServiceImpl.java | 70 +------ .../resources/mapper/goods/GoodsMapper.xml | 34 ++++ .../mapper/orderItem/OrderItemMapper.xml | 75 ++++--- .../mapper/orderParts/OrderPartsMapper.xml | 9 +- .../resources/mapper/plate/PlateMapper.xml | 11 +- 11 files changed, 195 insertions(+), 220 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java index 34650b42c..fdac20122 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/PlanController.java @@ -64,14 +64,6 @@ public class PlanController { return success(planService.deletePlan(ids)); } -// @DeleteMapping("cancellation") -// @Operation(summary = "作废") -// @Parameter(name = "id", description = "排单id", required = true) -// @PreAuthorize("@ss.hasPermission('executor:plan:delete')") - public CommonResult cancellation(@RequestParam("id") Long id) { - return success(planService.cancellation(id)); - } - @GetMapping("/get") @Operation(summary = "获得排单") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPackReqVO.java index 94a8e74b8..97b601ae3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPackReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/saveOptimize/PrintOrderPackReqVO.java @@ -4,6 +4,8 @@ package com.cf.imes.module.executor.controller.admin.plan.saveOptimize; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.util.List; + @Schema(description = "管理后台 - 生产单包裹信息") @Data public class PrintOrderPackReqVO { @@ -14,7 +16,7 @@ public class PrintOrderPackReqVO { @Schema(description = "板材ID") - private Long plateId; + private List plateId; @Schema(description = "包裹编号") @@ -26,7 +28,7 @@ public class PrintOrderPackReqVO { @Schema(description = "包裹数量") - private Long packNum; + private Integer packNum; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index efc83d2d5..741b8d0e6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -182,4 +182,9 @@ public interface GoodsMapper extends BaseMapperX { IPage selectPlanGoodsListByPlanId(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + List selectGoodsAndRemainPlate(@Param("ids") List ids,@Param("organId") Long organId); + + + IPage selectNoPlanOrderList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index c3aafb300..8c7286e32 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -108,15 +108,6 @@ public interface OrderItemMapper extends BaseMapperX { IPage selectTestNum(@Param("page") IPage page,@Param("organId") Long organId); - - default List selectOrderPlateList(List plateIds, Long organId) { - return selectList(new LambdaQueryWrapperX() - .eq(OrderItemDO::getOrganId,organId) - .inIfPresent(OrderItemDO::getPlateId, plateIds) - .select(OrderItemDO::getBodyId,OrderItemDO::getRoomId,OrderItemDO::getGroupId,OrderItemDO::getPlateId)); - - } - - + List selectOrderPlateList(@Param("orderId") Long orderId,@Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index 97957e57e..0c4754514 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -468,13 +468,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { OrderSource orderSource = new OrderSource(); -// List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX() -// .eq(GoodsDO::getOrderId, orderId) -// ); - List goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId()); -// PlanDO planDO = planMapper.selectByOrderId(orderId); List plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId()); @@ -493,14 +488,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } -// for (PlateDetialRespVO plateDetailsRespVO : plateDOS) { -// for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { -// plateDetailsRespVO.setProcessGroupName(groupNameList.getGroupName()); -// } -// -// } - - // 造型数据的尺寸长度 Integer orderModelSize = plateDOS.size(); @@ -515,13 +502,29 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List optimizeBoardModelDOS = buildBoardByOrderId(orderId, ORDER_REMAIN_PLATE_MODEL, boardSize); + // 查询生产单对应的配件信息 + List printOrderPartsRespVOS = orderPartsMapper.selectPartList(Collections.singletonList(orderId), getUserOrganId()); + + + // 查询生产单对应的包裹信息 + List printOrderPackReqVOS = orderItemMapper.selectOrderPlateList(orderId, getUserOrganId()); + + + // 统计每个订单的包装数量 + printOrderPackReqVOS + .stream() + .filter(f->f + .getOrderId().equals(orderId)) + .forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); + -// orderSource.setPlan(planDO); orderSource.setOrderList(Collections.singletonList(orderDO)); orderSource.setPlateList(plateDOS); orderSource.setGoodsList(goodsDOS); orderSource.setPlateModels(orderModelDOS); orderSource.setOptimizeBoardModelDOS(optimizeBoardModelDOS); + orderSource.setOrderPartsRespVOS(printOrderPartsRespVOS); + orderSource.setOrderPackReqVOS(printOrderPackReqVOS); return orderSource; } @@ -547,27 +550,27 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); - List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); - - - List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds, getUserOrganId()); - - - List detialRespVOS = new ArrayList<>(); - - - for (OrderBodyDO orderBodyDO : orderBodyDOS) { - - detialRespVOS.addAll(plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).peek(m -> { - m.setBodyName(orderBodyDO.getName()); - m.setRoomName(orderBodyDO.getRoomName()); - }).toList()); - - } +// List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); +// +// +// List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId()); +// +// +//// List detialRespVOS = new ArrayList<>(); +// +// +// for (OrderBodyDO orderBodyDO : orderBodyDOS) { +// +// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> { +// m.setBodyName(orderBodyDO.getName()); +// m.setRoomName(orderBodyDO.getRoomName()); +// }); +// +// } - for (PlateDetialRespVO plateDetailsRespVO : detialRespVOS) { + for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { String name = ""; if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { @@ -579,17 +582,17 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } plateDetailsRespVO.setProcessGroupName(name); - plateDetailsRespVO.setGoodsId(goodsDOS - .stream() - .filter(f->f.getId().equals(plateDetailsRespVO.getId())) - .map(GoodsReqVO::getGoodsId) - .findAny().orElse(null)); +// plateDetailsRespVO.setGoodsId(goodsDOS +// .stream() +// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) +// .map(GoodsReqVO::getGoodsId) +// .findAny().orElse(null)); - plateDetailsRespVO.setGoodsName(goodsDOS - .stream() - .filter(f->f.getId().equals(plateDetailsRespVO.getId())) - .map(GoodsReqVO::getGoodsName) - .findAny().orElse(null)); +// plateDetailsRespVO.setGoodsName(goodsDOS +// .stream() +// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) +// .map(GoodsReqVO::getGoodsName) +// .findAny().orElse(null)); } @@ -599,7 +602,10 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // 造型数据的尺寸长度 Integer orderModelSize = plateDetialRespVOS.size(); - List orderModelDOS = buildRespByOrderIds(orderIds, ORDER_PLATE_MODEL, orderModelSize); + // 需要查询小板造型信息的板材ID + List plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList(); + + List orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize); // 大板数据的尺寸长度 @@ -617,7 +623,18 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId()); // 查询生产单对应的包裹信息 - List printOrderPackReqVOS = orderItemMapper.selectPackList(orderIds, getUserOrganId()); + List printOrderPackReqVOS = orderItemMapper.selectPackList(ids, getUserOrganId()); + + for (Long orderId : orderIds) { + + // 统计每个订单的包装数量 + printOrderPackReqVOS + .stream() + .filter(f->f.getOrderId().equals(orderId)) + .forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size())); + + } + return OrderSource.builder() .orderList(orderDOS) @@ -635,24 +652,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { public OrderSource getOrderSourceByGoodId(List ids) { -// PlanDO planDO = planMapper.selectById(planId); -// if (Objects.isNull(planDO)) { -// throw exception(PLAN_NOT_EXISTS); -// } - - -// List goodsDOS = goodsMapper.selectBatchIds(goodIds); - - List goodsReqVOS = goodsMapper.selectJoinList(GoodsReqVO.class, new MPJLambdaWrapperX() - - .leftJoin(RemainPlateDO.class, RemainPlateDO::getGoodsId, GoodsDO::getId) - .selectAll(GoodsDO.class) - .selectAs(RemainPlateDO::getId,"remainId") - .isNotNull(PlanItemDO::getId) - .eq(GoodsDO::getOrganId, getUserOrganId()) - .in(GoodsDO::getId, ids)); - + List goodsReqVOS = goodsMapper.selectGoodsAndRemainPlate(ids, getUserOrganId()); List orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList(); @@ -662,26 +663,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId()); - List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); +// List bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList(); +// +// +// List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId()); +// +// +// for (OrderBodyDO orderBodyDO : orderBodyDOS) { +// +// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> { +// m.setBodyName(orderBodyDO.getName()); +// m.setRoomName(orderBodyDO.getRoomName()); +// }); +// +// } - List orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds, getUserOrganId()); - - - List detialRespVOS = new ArrayList<>(); - - - for (OrderBodyDO orderBodyDO : orderBodyDOS) { - - detialRespVOS.addAll(plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).peek(m -> { - m.setBodyName(orderBodyDO.getName()); - m.setRoomName(orderBodyDO.getRoomName()); - }).toList()); - - } - - - for (PlateDetialRespVO plateDetailsRespVO : detialRespVOS) { + for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) { String name = ""; if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) { for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) { @@ -694,25 +692,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { plateDetailsRespVO.setProcessGroupName(name); - plateDetailsRespVO.setGoodsId(goodsReqVOS - .stream() - .filter(f->f.getId().equals(plateDetailsRespVO.getId())) - .map(GoodsReqVO::getGoodsId) - .findAny().orElse(null)); +// // todo 这样写混单时同样适用,后面加混单后这里不用修改 +// plateDetailsRespVO.setGoodsId(goodsReqVOS +// .stream() +// .filter(f->f.getId().equals(plateDetailsRespVO.getId())) +// .map(GoodsReqVO::getGoodsId) +// .findAny().orElse(null)); } // 造型数据的尺寸长度 Integer orderModelSize = plateDetialRespVOS.size(); - List orderModelDOS = buildRespByOrderIds(orderIds, ORDER_PLATE_MODEL, orderModelSize); + // 需要查询的小板造型信息的板材ID + List plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList(); - -// // 查询生产单对应的配件信息 -// List printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId()); -// -// // 查询生产单对应的包裹信息 -// List printOrderPackReqVOS = orderItemMapper.selectPackList(orderIds, getUserOrganId()); + List orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize); return OrderSource.builder() .orderList(orderDOS) @@ -832,12 +827,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { } - private List buildRespByOrderIds(Collection orderIds, String index, Integer size) { - List fieldValues = orderIds.stream().map(FieldValue::of).toList(); + private List buildRespByPlateIds(Collection plateIds, Integer size) { + List fieldValues = plateIds.stream().map(FieldValue::of).toList(); SearchRequest.Builder builder = new SearchRequest.Builder(); - builder.index(index); + builder.index(OptimizePlanService.ORDER_PLATE_MODEL); builder.size(size); - builder.query(q -> q.terms(b -> b.field("orderId").terms(e -> e.value(fieldValues)))); + builder.query(q -> q.terms(b -> b.field("plateId").terms(e -> e.value(fieldValues)))); try { SearchResponse search = elasticsearchClient.search(builder.build(), OrderModelDO.class); List> hits = search.hits().hits(); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java index 4f13cf6c7..4fa8a8353 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanService.java @@ -65,7 +65,6 @@ public interface PlanService { Boolean addPlate(AddPlateReq req); - Boolean cancellation(Long id); PageResult getPlateByPlanId(GetPlateByPlanIdVO vo); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index c7dcec725..881111b4c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -9,7 +9,6 @@ import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; @@ -127,6 +126,7 @@ public class PlanServiceImpl implements PlanService { List goodsDOS = new ArrayList<>(); + // <大板实际ID,排单ID> Map goodsPlanId = new HashMap<>(); Map> groupedItems = itemList.stream() @@ -149,24 +149,12 @@ public class PlanServiceImpl implements PlanService { goodsPlanId.put(entry.getKey(), plan.getId()); -// Set itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(items,getUserOrganId()); - List goodsIds = items.stream().map(PlanSaveReqVO.Item::getId).toList(); List goodsDOList = goodsMapper.selectPlanGoodsList(goodsIds, getUserOrganId()).stream().map(m -> m.setPlanId(plan.getId())).toList(); goodsDOS.addAll(goodsDOList); -// if (CollectionUtil.isNotEmpty(itemIds)) { -// -// for (Long itemId : itemIds) { -// planItemDOS.add(PlanItemDO.builder() -// .planId(plan.getId()) -// .itemId(itemId) -// .build()); -// } -// -// } } @@ -179,29 +167,6 @@ public class PlanServiceImpl implements PlanService { return goodsPlanId; -// -// // 插入 -// PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class); -// plan.setSort(0L); -// String orderNos = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList().toString(); -// plan.setOrderNos(orderNos); -// plan.setProduceTime(null); -// planMapper.insert(plan); -// -// // 修改对应的生产单的状态为 已排单 -// List orderIds = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).toList(); -// -// List orderDOS = orderMapper.selectBatchIds(orderIds); -// -// List orderDOList = orderDOS.stream().map(o -> o.setStatus(OrderStatusEnum.SORTED.getStatus())).toList(); -// -// orderMapper.updateBatch(orderDOList); -// -// Long planId = plan.getId(); -// -// -// // 返回 -// return plan.getId(); } @Override @@ -224,7 +189,7 @@ public class PlanServiceImpl implements PlanService { // todo 目前只解决非混单的情况 Long goodsIds = BeanUtils.toBean(goodsMapper.selectPlanGoods(plan.getId(), getUserOrganId()).stream().map(GoodsDO::getGoodsId).toList(), Long.class).get(0); - if(goodsId.equals(goodsIds)){ + if(!goodsId.equals(goodsIds)){ throw exception(PLATE_ERROR); } @@ -238,7 +203,7 @@ public class PlanServiceImpl implements PlanService { if (!updateReqVO.getDeleteIds().isEmpty()){ - goodsDOS.addAll(goodsMapper.selectPlanGoodsList(ids, getUserOrganId()).stream().map(m -> m.setPlanId(null)).toList()); + goodsDOS.addAll(goodsMapper.selectPlanGoodsList(updateReqVO.getDeleteIds(), getUserOrganId()).stream().map(m -> m.setPlanId(null)).toList()); } @@ -252,8 +217,8 @@ public class PlanServiceImpl implements PlanService { planMapper.updateById(plan); -// -// // todo 目前只解决非混单的情况,混单的情况待解决,这个逻辑目前应该不用,排单是否开料判断了,可保留,万一以后需求更改 + +// // todo 目前只解决非混单的情况,混单的情况待解决,这个逻辑目前应该不用(这个逻辑用于判断大板下的小板是否开料,后期应该可用于混单时增加的判断),排单是否开料判断了,可保留,万一以后需求更改 // if(!updateReqVO.getItemList().isEmpty()){ // // List optimizeBoardModelDOS = buildBoardByPlanId(plan.getId(), ORDER_REMAIN_PLATE_MODEL, 10); @@ -354,11 +319,6 @@ public class PlanServiceImpl implements PlanService { } - // 目前生产单的状态已经去除待排单,所以无需修改生产单的状态 -// List orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())).collect(Collectors.toList()); -// orderMapper.updateBatch(orderDOS); - - // 删除排单对应的优化生产数据 deleteByPlanId(ids, ORDER_REMAIN_PLATE_MODEL); @@ -402,7 +362,7 @@ public class PlanServiceImpl implements PlanService { throw exception(PLAN_NOT_EXISTS); } - if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) && planDO.getMachineId().equals(machineId)){ + if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){ throw exception(LIST_CHANGES_ARE_PROHIBITED); } } @@ -972,24 +932,6 @@ public class PlanServiceImpl implements PlanService { return Boolean.TRUE; } - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean cancellation(Long id) { - PlanDO planDO = planMapper.selectById(id); - if (planDO == null) { - throw exception(PLAN_NOT_EXISTS); - } -// if (planDO.getStatus().equals(PlanStatusEnum.NEWORDER.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.BOARDHASBEENAPPLIEDFOR.getStatus())) { -// throw exception(PLAN_NOT_ALLOW_CANCEL); -// } - Set itemIds = planItemMapper.selectList(new LambdaQueryWrapperX() - .eq(PlanItemDO::getOrganId,getUserOrganId()) - .eq(PlanItemDO::getPlanId, id)) - .stream().map(PlanItemDO::getItemId) - .collect(Collectors.toSet()); - plateMapper.update(new LambdaUpdateWrapper().in(PlateDO::getId, itemIds).set(PlateDO::getIsCancel, Boolean.TRUE)); - return Boolean.TRUE; - } @Override public PageResult getPlateByPlanId(GetPlateByPlanIdVO vo) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index 8afc79103..8745eb8b5 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -297,4 +297,38 @@ + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml index e1269539b..d9e67013f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml @@ -173,35 +173,42 @@ - + + + + + + + + + + @@ -258,20 +265,6 @@ - - - - - - - - - - - - - - + + + select distinct op.id as plateId, + op.order_id as orderId, + o.id as packId, + o.package_no as packNo + from order_plate op + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id + left join order_package o on oi.organ_id = o.organ_id and oi.order_id = o.order_id and oi.package_id = o.id + + where op.organ_id = #{organId} + and op.deleted = false + and op.order_id = #{orderId} + and oi.parts_id = 0 + and oi.package_id !=0 + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index 10a1fd005..faf6a1d0a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -101,11 +101,12 @@ op.name, op.order_id from order_parts op - join order_item oi on op.id = oi.parts_id and op.organ_id = oi.organ_id - join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id - where op.organ_id = #{organId} - and op.order_id in + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.parts_id + left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id + where op.organ_id = #{organId} + and op.deleted = false + and op.order_id in #{orderIds} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 35437ea15..3f2dc28de 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -231,11 +231,12 @@ op.is_row_hole as hasHole from order_plate op - join order_goods ogs on op.goods_id = ogs.id and op.organ_id = ogs.organ_id - join order_item oi on op.id = oi.plate_id and op.organ_id = oi.organ_id - join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id - left join order_group og on oi.group_id = og.id and oi.organ_id = og.organ_id - where op.order_id =#{orderId} and op.organ_id = #{organId} and op.deleted = false + left join order_goods ogs on op.organ_id = ogs.organ_id and op.order_id = ogs.order_id and op.goods_id = ogs.id + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id + left join order_group og on oi.organ_id = og.organ_id and oi.order_id = og.order_id and oi.group_id = og.id + left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id + + where op.organ_id = #{organId} and op.deleted = false and op.order_id = #{orderId} From 90b0521788e21427bcdaf0bd109a7208cdf34dbb Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Thu, 5 Sep 2024 11:05:41 +0800 Subject: [PATCH 07/18] =?UTF-8?q?=E6=8E=92=E5=8D=95=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90-=E5=8C=85=E8=A3=B9=E8=AF=A6=E6=83=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E6=9B=B4=E6=94=B9-=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E5=8F=82=E6=95=B0=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/plate/PlateMapper.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 3f2dc28de..9d7863ee4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -823,6 +823,10 @@ oi.group_id as groupId, oi.room_id as roomId, og.name as groupName, + ob.name as bodyName, + ob.room_name as roomName, + ogs.goods_id as plateGoodsId, + ogs.goods_name as goodsName, op.id as plateId, op.order_id as orderId, @@ -865,8 +869,10 @@ op.is_row_hole as hasHole from order_plate op - left join order_item oi on op.organ_id = oi.organ_id and op.id = oi.plate_id - left join order_group og on oi.organ_id = og.organ_id and oi.group_id = og.id + left join order_goods ogs on op.organ_id = ogs.organ_id and op.order_id = ogs.order_id and op.goods_id = ogs.id + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id + left join order_group og on oi.organ_id = og.organ_id and oi.order_id = og.order_id and oi.group_id = og.id + left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id where op.organ_id = #{organId} and op.deleted = false and op.goods_id in From b1678ccef4d2d77b17eb4d115c4cba476b9c63db Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Thu, 5 Sep 2024 11:21:50 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E6=8E=92=E5=8D=95=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90-=E5=8C=85=E8=A3=B9=E8=AF=A6=E6=83=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E6=9B=B4=E6=94=B9-=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E6=96=B9=E6=B3=95=E5=8F=82=E6=95=B0=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/executor/dal/mysql/orderItem/OrderItemMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index 8c7286e32..1d096ca26 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -60,7 +60,7 @@ public interface OrderItemMapper extends BaseMapperX { void deleteByPlateId(@Param("deletePlateIds") List deletePlateIds); - List selectPackList(@Param("orderIds") List orderIds, @Param("organId") Long organId); + List selectPackList(@Param("ids") List ids, @Param("organId") Long organId); default int deleteByBodyId(Long bodyId, Long organId) { From 72c418544ccc5953f0e9ac5d40044145fa8964d6 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 5 Sep 2024 12:20:46 +0800 Subject: [PATCH 09/18] =?UTF-8?q?1=E3=80=81=E6=8A=A5=E8=A1=A8=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=A8=A1=E5=9D=97=EF=BC=9A=E5=86=85=E7=BD=AE=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E7=9B=B8=E5=85=B3=E7=9A=84=E6=93=8D=E4=BD=9C=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=99=90=E5=88=B6=E3=80=81=E6=96=B0=E5=A2=9E=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=90=8D=E7=A7=B0=E5=94=AF=E4=B8=80=E6=80=A7=E9=99=90?= =?UTF-8?q?=E5=88=B6=EF=BC=9B2=E3=80=81=E5=88=86=E6=9E=90=E9=A1=B5?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=9A=E6=8E=92=E5=8D=95=E9=9D=A2=E7=A7=AF?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=85=B3=E8=81=94=E8=A1=A8=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/util/SecurityFrameworkUtils.java | 11 ++++ .../main/resources/mapper/plan/PlanMapper.xml | 5 +- .../report/enums/ErrorCodeConstants.java | 2 + .../dataset/ReportDatasetServiceImpl.java | 50 ++++++++++++++++-- .../ReportDatasourceServiceImpl.java | 38 ++++++++++++-- .../template/ReportTemplateServiceImpl.java | 52 +++++++++++++++---- 6 files changed, 139 insertions(+), 19 deletions(-) diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java index 4f26f0557..32a9caa1e 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/util/SecurityFrameworkUtils.java @@ -1,5 +1,6 @@ package com.cf.imes.framework.security.core.util; +import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants; import com.cf.imes.framework.security.core.LoginUser; @@ -132,4 +133,14 @@ public class SecurityFrameworkUtils { return loginUser.getOrganId(); } + + /** + * 当前用户是否超级管理员 + * + * @return + */ + public static boolean isSuperAdmin() { + LoginUser loginUser = getLoginUser(); + return ObjectUtil.isNotNull(loginUser) && loginUser.getIsSupAdmin(); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index 6f9bff1be..18d4a1146 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -161,9 +161,8 @@ ,CONCAT(YEAR(p.create_time), '-', MONTH(p.create_time), '-', DAY(p.create_time)) as date from order_plan p - join order_plan_item opi on p.id = opi.plan_id - join order_item oi on oi.id = opi.item_id - join order_plate op on oi.plate_id = op.id + join order_goods g on g.plan_id = p.id + join order_plate op on op.goods_id = g.id where p.create_time between #{req.createTime[0]} and #{req.createTime[1]} and p.deleted = 0 group by date; diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java index 005c1f6ac..d7c744ad7 100644 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java +++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java @@ -13,6 +13,8 @@ public final class ErrorCodeConstants { // ========== UREPORT template模块 1-003-001-000 ========== public static final ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_003_001_001, "报表模板信息不存在"); public static final ErrorCode TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_001_002, "内置模板操作权限不足"); + public static final ErrorCode TEMPLATE_NAME_UNIQE_ERROR = new ErrorCode(1_003_001_003, "模板名【{}】已存在,请编辑模板名后重试"); + // ========== UREPORT datasource模块 1-003-002-000 ========== public static final ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_002_001, "报表数据源不存在"); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java index f4e37b2b0..e41d1bd8e 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java @@ -1,12 +1,20 @@ package com.cf.imes.module.report.service.dataset; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.security.core.LoginUser; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; +import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; +import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; +import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -15,6 +23,9 @@ import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据集 Service 实现类 @@ -25,6 +36,12 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXI @Service @Validated public class ReportDatasetServiceImpl implements ReportDatasetService { + @Resource + private ReportTemplateMapper reportTemplateMapper; + + @Resource + private ReportDatasourceMapper reportDatasourceMapper; + @Resource private ReportDatasetMapper datasetMapper; @@ -65,14 +82,41 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { @Override public void deleteDataset(Long id) { // 校验存在 - validateDatasetExists(id); + ReportDatasetDO reportDatasetDO = validateDatasetExists(id); + // 校验内置模板操作权限 + validateSystemTemplate(reportDatasetDO.getDatasourceId()); // 删除 datasetMapper.deleteById(id); } - private void validateDatasetExists(Long id) { - if (datasetMapper.selectById(id) == null) { + private ReportDatasetDO validateDatasetExists(Long id) { + ReportDatasetDO reportDatasetDO = datasetMapper.selectById(id); + if (ObjectUtil.isNull(reportDatasetDO)) { throw exception(DATASET_NOT_EXISTS); + } else { + return reportDatasetDO; + } + } + + /** + * 校验只有超管可以操作内置模板 + * + * @param datasourceId 数据源id + */ + private void validateSystemTemplate(Long datasourceId) { + ReportDatasourceDO reportDatasourceDO = reportDatasourceMapper.selectById(datasourceId); + if (ObjectUtil.isNull(reportDatasourceDO)) { + throw exception(DATASOURCE_NOT_EXISTS); + } + ReportTemplateDO templateDO = reportTemplateMapper.selectById(reportDatasourceDO.getTemplateId()); + if (ObjectUtil.isNull(templateDO)) { + throw exception(TEMPLATE_NOT_EXISTS); + } + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + // 非超管不能操作内置模板 + if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { + throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index 855f361f2..520208be1 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -26,8 +26,10 @@ import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasource import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; +import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import com.cf.imes.module.report.framework.ureport.annotation.CfReportSpringbeanDatasource; import com.cf.imes.module.report.service.dataset.ReportDatasetService; @@ -63,6 +65,8 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUIL import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据源 Service 实现类 @@ -74,6 +78,9 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRI @Validated @Slf4j public class ReportDatasourceServiceImpl implements ReportDatasourceService { + @Resource + private ReportTemplateMapper reportTemplateMapper; + @Resource private ReportDatasourceMapper datasourceMapper; @@ -111,7 +118,9 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public void deleteDatasource(Long id) { // 校验存在 - validateDatasourceExists(id); + ReportDatasourceDO reportDatasourceDO = validateDatasourceExists(id); + // 校验内置模板操作权限 + validateSystemTemplate(reportDatasourceDO.getTemplateId()); // 删除 datasourceMapper.deleteById(id); // 删除关联数据集 @@ -334,11 +343,32 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { /** * 校验数据源是否存在 * - * @param id + * @param id 数据源id */ - private void validateDatasourceExists(Long id) { - if (datasourceMapper.selectById(id) == null) { + private ReportDatasourceDO validateDatasourceExists(Long id) { + ReportDatasourceDO reportDatasourceDO = datasourceMapper.selectById(id); + if (reportDatasourceDO == null) { throw exception(DATASOURCE_NOT_EXISTS); + } else { + return reportDatasourceDO; + } + } + + /** + * 校验只有超管可以操作内置模板 + * + * @param templateId 模板id + */ + private void validateSystemTemplate(Long templateId) { + ReportTemplateDO templateDO = reportTemplateMapper.selectById(templateId); + if (ObjectUtil.isNull(templateDO)) { + throw exception(TEMPLATE_NOT_EXISTS); + } + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + // 非超管不能操作内置模板 + if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { + throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); } } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index c87b078e3..c573f0ff5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -70,6 +70,7 @@ import java.util.Objects; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NAME_UNIQE_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** @@ -96,9 +97,14 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Resource private ReportDatasetMapper datasetMapper; + private static final String UTF8_CHARSET = CharsetUtil.UTF_8; + @Override @Transactional(rollbackFor = Exception.class) public Long createReportTemplate(ReportTemplateSaveReqVO createReqVO) { + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + // 校验模板名唯一性 + validateTemplateNameUnique(createReqVO, isSuperAdmin); // url解码xml String content = createReqVO.getContent(); if (StringUtils.isNotEmpty(content)) { @@ -107,8 +113,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 新增模板 ReportTemplateDO template = BeanUtils.toBean(createReqVO, ReportTemplateDO.class); // 超管创建的作为内置模板 - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); if (isSuperAdmin) { template.setType(ReportTemplateTypeEnum.SYSTEM); } else { @@ -125,15 +129,24 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override @Transactional(rollbackFor = Exception.class) public Long copyReportTemplate(ReportTemplateSaveReqVO createReqVO) { + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); Long templateId = createReqVO.getId(); // 校验存在 ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + // 校验模板名唯一性 + validateTemplateNameUnique(createReqVO, isSuperAdmin); // 校验内置模板操作权限 validateSystemTemplate(reportTemplateDO); ReportTemplateDO copyTemplateDO = BeanUtils.toBean(reportTemplateDO, ReportTemplateDO.class); // 重置id copyTemplateDO.setId(null); copyTemplateDO.setName(createReqVO.getName()); + // 超管创建的作为内置模板 + if (isSuperAdmin) { + copyTemplateDO.setType(ReportTemplateTypeEnum.SYSTEM); + } else { + copyTemplateDO.setType(ReportTemplateTypeEnum.CUSTOM); + } // 新增模版 templateMapper.insert(copyTemplateDO); Long newtemplateId = copyTemplateDO.getId(); @@ -217,6 +230,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { Long templateId = updateReqVO.getId(); // 校验存在 ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + // 校验模板名唯一性 + validateTemplateNameUnique(updateReqVO, SecurityFrameworkUtils.isSuperAdmin()); // 校验内置模板操作权限 validateSystemTemplate(reportTemplateDO); // url解码xml @@ -257,8 +272,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { * 校验只有超管可以操作内置模板 */ private void validateSystemTemplate(ReportTemplateDO templateDO) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); // 非超管不能操作内置模板 if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); @@ -279,6 +293,26 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } } + /** + * 校验唯一性约束 + * + * @param reqVO + */ + private void validateTemplateNameUnique(ReportTemplateSaveReqVO reqVO, boolean isSuperAdmin) { + Long templateId = reqVO.getId(); + String name = reqVO.getName(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapperX().eq(ReportTemplateDO::getName, name); + if (ObjectUtil.isNotNull(templateId)) { + wrapper.ne(ReportTemplateDO::getId, templateId); + } + if (isSuperAdmin) { + wrapper.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM); + } + if (templateMapper.exists(wrapper)) { + throw exception(TEMPLATE_NAME_UNIQE_ERROR, name); + } + } + @Override public ReportTemplateDO getReportTemplate(Long id) { // 校验模板 @@ -370,7 +404,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { .orderByDesc(ReportTemplateDO::getCreateTime) // 不返回content xml,点击具体的模板中返回xml .select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark); - if (loginUser != null && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { + if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { // 普通用户查看机构下的和system模板 queryWrapper.or(wrapper -> wrapper .eq(ReportTemplateDO::getOrganId, loginUser.getOrganId()) @@ -401,12 +435,12 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { report.setChartImages(chartImages); try { OutputStream out = response.getOutputStream(); - response.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding(UTF8_CHARSET); response.setContentType("application/pdf; charset=UTF-8"); // 创建下载文件 ProducerEnum p = ProducerEnum.PDF; String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p); - response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, "UTF-8")); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, UTF8_CHARSET)); response.setHeader("code", "20000"); ExportUtils.export(out, report, p); long end = System.currentTimeMillis(); @@ -425,12 +459,12 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { report.setChartImages(chartImages); try { OutputStream out = response.getOutputStream(); - response.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding(UTF8_CHARSET); response.setContentType("application/octet-stream; charset=UTF-8"); // 创建下载文件 ProducerEnum p = ProducerEnum.valueOf(type.toUpperCase()); String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p); - response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, "UTF-8")); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, UTF8_CHARSET)); response.setHeader("code", "20000"); long start = System.currentTimeMillis(); ExportUtils.export(out, report, p); From 3adf2c7b226908ed9c2b0686dab39b4873c2e8f1 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 5 Sep 2024 21:51:47 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=96=B0=E5=A2=9Edatasourceids=E3=80=81datas?= =?UTF-8?q?etids=EF=BC=9B2=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E4=BE=9D=E8=B5=96=E6=A8=A1=E6=9D=BF=EF=BC=8C=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E5=AD=98=E5=9C=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/vo/ReportDatasetSaveReqVO.java | 2 + .../ReportDatasourceController.java | 9 +- .../vo/ReportDatasourceSaveReqVO.java | 10 +- .../template/vo/ReportTemplateSaveReqVO.java | 12 +- .../datasource/ReportDatasourceDO.java | 5 +- .../dataobject/template/ReportTemplateDO.java | 15 ++ .../dataset/ReportDatasetServiceImpl.java | 29 ++-- .../datasource/ReportDatasourceService.java | 2 +- .../ReportDatasourceServiceImpl.java | 107 ++++++------ .../template/ReportTemplateServiceImpl.java | 152 ++++-------------- .../template/ReportCommonServiceImplTest.java | 3 - .../ReportDatasourceServiceImplTest.java | 2 +- 12 files changed, 129 insertions(+), 219 deletions(-) diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java index dfc4eb8eb..4c7b44432 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; @@ -31,6 +32,7 @@ public class ReportDatasetSaveReqVO implements Serializable { private String name; @Schema(description = "数据源id", example = "1") + @NotNull(message = "数据源id不能为空") private Long datasourceId; @Schema(description = "动态查询SQL") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index 29fd669cb..44c5bc9af 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -82,12 +82,11 @@ public class ReportDatasourceController { return success(BeanUtils.toBean(datasource, ReportDatasourceRespVO.class)); } - @GetMapping("/{templateId}/datasources") - @Operation(summary = "获取报表模板下的报表数据源") + @GetMapping("/datasources") + @Operation(summary = "获取报表数据源") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") - @Parameter(name = "templateId", description = "模版id", required = true) - public CommonResult> getDatasourcePage(@PathVariable(value = "templateId") Long templateId) { - return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()), ReportDatasourceRespVO.class)); + public CommonResult> getDatasourcePage() { + return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class)); } @GetMapping("/datasource/beans") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java index 246a8badf..c97a4ee05 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java @@ -2,6 +2,7 @@ package com.cf.imes.module.report.controller.admin.datasource.vo; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum; +import com.cf.imes.module.report.validation.template.ReportTemplateTypeInEnum; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -31,9 +32,6 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "数据源id", example = "1") private Long id; - @Schema(description = "模板id", example = "1") - private Long templateId; - @Schema(description = "数据源名称", example = "测试库") private String name; @@ -41,7 +39,8 @@ public class ReportDatasourceSaveReqVO implements Serializable { @ReportDatasourceTypeInEnum private String type; - @JsonIgnore + @Schema(description = "内置数据源类型,0是、1否", example = "1") + @ReportTemplateTypeInEnum private Integer buildinType; @Schema(description = "spring型数据源id") @@ -62,9 +61,6 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "备注", example = "该模板仅供生产使用") private String remark; - @Schema(description = "数据集") - private List datasets = new ArrayList<>(); - @Schema(description = "请求头参数") private List> headers; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java index 963a4ff30..9ac133146 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java @@ -1,14 +1,13 @@ package com.cf.imes.module.report.controller.admin.template.vo; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * @author Gqr @@ -30,9 +29,12 @@ public class ReportTemplateSaveReqVO { @Schema(description = "报表模板") private String content; - @Schema(description = "数据源") - private List datasource = new ArrayList<>(); - @Schema(description = "备注", example = "该模板仅供生产使用") private String remark; + + @Schema(description = "数据源id列表") + private Set datasourceIds; + + @Schema(description = "数据集id列表") + private Set datasetIds; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java index 8fb10e773..8c38c4dd6 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java @@ -39,10 +39,7 @@ public class ReportDatasourceDO extends BaseDO { */ @TableId private Long id; - /** - * 模板id - */ - private Long templateId; + /** * 数据源名称 */ diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java index f621abe5c..502f4d929 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java @@ -3,11 +3,14 @@ package com.cf.imes.module.report.dal.dataobject.template; import com.baomidou.mybatisplus.annotation.*; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler; +import com.cf.imes.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.cf.imes.framework.mybatis.core.type.LongListTypeHandler; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.*; import java.util.List; +import java.util.Set; /** * 报表模板信息DO @@ -57,4 +60,16 @@ public class ReportTemplateDO extends BaseDO { */ @TableField(exist = false) private List datasource; + + /** + * 数据源id列表 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set datasourceIds; + + /** + * 数据集id列表 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set datasetIds; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java index e41d1bd8e..b7b5f24c4 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java @@ -4,16 +4,13 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; -import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; -import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -23,9 +20,8 @@ import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据集 Service 实现类 @@ -36,9 +32,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX @Service @Validated public class ReportDatasetServiceImpl implements ReportDatasetService { - @Resource - private ReportTemplateMapper reportTemplateMapper; - @Resource private ReportDatasourceMapper reportDatasourceMapper; @@ -49,6 +42,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { public Long createDataset(ReportDatasetSaveReqVO createReqVO) { // 插入 ReportDatasetDO dataset = BeanUtils.toBean(createReqVO, ReportDatasetDO.class); + // 校验内置模板操作权限 + validateSystemDataset(createReqVO.getDatasourceId()); datasetMapper.insert(dataset); // 返回 return dataset.getId(); @@ -66,6 +61,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { public void updateDataset(ReportDatasetSaveReqVO updateReqVO) { // 校验存在 validateDatasetExists(updateReqVO.getId()); + // 校验内置模板操作权限 + validateSystemDataset(updateReqVO.getDatasourceId()); // 更新 ReportDatasetDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasetDO.class); datasetMapper.updateById(updateObj); @@ -84,7 +81,7 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { // 校验存在 ReportDatasetDO reportDatasetDO = validateDatasetExists(id); // 校验内置模板操作权限 - validateSystemTemplate(reportDatasetDO.getDatasourceId()); + validateSystemDataset(reportDatasetDO.getDatasourceId()); // 删除 datasetMapper.deleteById(id); } @@ -99,24 +96,18 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { } /** - * 校验只有超管可以操作内置模板 + * 校验只有超管可以操作内置数据源 * * @param datasourceId 数据源id */ - private void validateSystemTemplate(Long datasourceId) { + private void validateSystemDataset(Long datasourceId) { ReportDatasourceDO reportDatasourceDO = reportDatasourceMapper.selectById(datasourceId); if (ObjectUtil.isNull(reportDatasourceDO)) { throw exception(DATASOURCE_NOT_EXISTS); } - ReportTemplateDO templateDO = reportTemplateMapper.selectById(reportDatasourceDO.getTemplateId()); - if (ObjectUtil.isNull(templateDO)) { - throw exception(TEMPLATE_NOT_EXISTS); - } - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); // 非超管不能操作内置模板 - if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + if (ReportTemplateTypeEnum.SYSTEM.equals(reportDatasourceDO.getBuildinType()) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java index 7a71403fd..df1eede30 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java @@ -53,7 +53,7 @@ public interface ReportDatasourceService { * @param reqVO 查询参数 * @return 报表数据源分页 */ - List getTemplateDatasourceList(ReportDatasourceReqVO reqVO); + List getDatasourceList(); /** * 获取springbean数据源列表 diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index 520208be1..7b000d4c2 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.bstek.common.exception.ReportDesignException; import com.bstek.common.utils.MultipleJdbcTemplate; @@ -17,16 +18,15 @@ import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; -import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; @@ -65,8 +65,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUIL import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据源 Service 实现类 @@ -78,9 +76,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX @Validated @Slf4j public class ReportDatasourceServiceImpl implements ReportDatasourceService { - @Resource - private ReportTemplateMapper reportTemplateMapper; - @Resource private ReportDatasourceMapper datasourceMapper; @@ -99,6 +94,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public Long createDatasource(ReportDatasourceSaveReqVO createReqVO) { ReportDatasourceDO datasource = BeanUtils.toBean(createReqVO, ReportDatasourceDO.class); + // 校验内置数据源操作权限 + validateSystemDatasource(createReqVO.getBuildinType()); // 插入 datasourceMapper.insert(datasource); // 返回 @@ -109,6 +106,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { public void updateDatasource(ReportDatasourceSaveReqVO updateReqVO) { // 校验存在 validateDatasourceExists(updateReqVO.getId()); + // 校验内置数据源操作权限 + validateSystemDatasource(updateReqVO.getBuildinType()); ReportDatasourceDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasourceDO.class); // 更新 datasourceMapper.updateById(updateObj); @@ -119,8 +118,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { public void deleteDatasource(Long id) { // 校验存在 ReportDatasourceDO reportDatasourceDO = validateDatasourceExists(id); - // 校验内置模板操作权限 - validateSystemTemplate(reportDatasourceDO.getTemplateId()); + // 校验内置数据源操作权限 + validateSystemDatasource(reportDatasourceDO.getBuildinType().getType()); // 删除 datasourceMapper.deleteById(id); // 删除关联数据集 @@ -136,17 +135,25 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } @Override - public List getTemplateDatasourceList(ReportDatasourceReqVO reqVO) { - List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() - .eqIfPresent(ReportDatasourceDO::getTemplateId, reqVO.getTemplateId()) - .likeIfPresent(ReportDatasourceDO::getName, reqVO.getName()) - .orderByDesc(ReportDatasourceDO::getCreateTime)); + @OrganIgnore + public List getDatasourceList() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX().orderByDesc(ReportDatasourceDO::getCreateTime); + if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { + // 普通用户查看机构下的和system数据源 + queryWrapper.or(wrapper -> wrapper + .eq(ReportDatasourceDO::getOrganId, loginUser.getOrganId()) + .eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.CUSTOM)) + .or(wrapper -> wrapper.eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.SYSTEM)); + } + List reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); // 查询数据集 if (CollUtil.isNotEmpty(reportDatasourceDOS)) { reportDatasourceDOS.forEach(reportDatasourceDO -> { queryDatasetInSource(reportDatasourceDO); }); } + // 超管查看全部 return reportDatasourceDOS; } @@ -297,34 +304,34 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public void saveBuildinDatasources(List buildinDatasources) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); - // 非超管不能操作内置模板 - if (!isSuperAdmin) { - throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); - } - // 全删内置数据源 - int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); - log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); - buildinDatasources.forEach(ds -> { - // 新增数据源 - ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); - ds.setId(null); - Long datasourceId = createDatasource(ds); - List datasets = ds.getDatasets(); - List batchInsertDataset = new ArrayList<>(); - datasets.forEach(dataset -> { - // 新增数据集 - dataset.setDatasourceId(datasourceId); - dataset.setId(null); - batchInsertDataset.add(dataset); - }); - - // 批量插入数据集 - if (CollUtil.isNotEmpty(batchInsertDataset)) { - datasetService.batchCreateDataset(batchInsertDataset); - } - }); +// LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); +// boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); +// // 非超管不能操作内置模板 +// if (!isSuperAdmin) { +// throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); +// } +// // 全删内置数据源 +// int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); +// log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); +// buildinDatasources.forEach(ds -> { +// // 新增数据源 +// ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); +// ds.setId(null); +// Long datasourceId = createDatasource(ds); +// List datasets = ds.getDatasets(); +// List batchInsertDataset = new ArrayList<>(); +// datasets.forEach(dataset -> { +// // 新增数据集 +// dataset.setDatasourceId(datasourceId); +// dataset.setId(null); +// batchInsertDataset.add(dataset); +// }); +// +// // 批量插入数据集 +// if (CollUtil.isNotEmpty(batchInsertDataset)) { +// datasetService.batchCreateDataset(batchInsertDataset); +// } +// }); } /** @@ -355,20 +362,14 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } /** - * 校验只有超管可以操作内置模板 + * 校验只有超管可以操作内置数据源 * - * @param templateId 模板id + * @param buildinType 内置数据源类型 */ - private void validateSystemTemplate(Long templateId) { - ReportTemplateDO templateDO = reportTemplateMapper.selectById(templateId); - if (ObjectUtil.isNull(templateDO)) { - throw exception(TEMPLATE_NOT_EXISTS); - } - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + private void validateSystemDatasource(Integer buildinType) { // 非超管不能操作内置模板 - if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + if (ReportTemplateTypeEnum.SYSTEM.getType().equals(buildinType) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); } } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index c573f0ff5..7df315fff 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -28,17 +28,12 @@ import com.bstek.ureport.export.html.HtmlReport; import com.bstek.ureport.model.Report; import com.bstek.ureport.parser.ReportParser; import com.bstek.ureport.utils.ToolUtils; -import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.api.template.dto.ReportTemplateGenerateReqDTO; -import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; -import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; @@ -67,6 +62,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; @@ -85,12 +81,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Resource private ReportTemplateMapper templateMapper; - @Resource - private ReportDatasourceService datasourceService; - - @Resource - private ReportDatasetService datasetService; - @Resource private ReportDatasourceMapper datasourceMapper; @@ -120,8 +110,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } templateMapper.insert(template); Long templateId = template.getId(); - // 解析数据源 - analyzeDatasource(createReqVO.getDatasource(), templateId); // 返回主键 return templateId; } @@ -149,83 +137,11 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } // 新增模版 templateMapper.insert(copyTemplateDO); - Long newtemplateId = copyTemplateDO.getId(); - - // 复制datasource、dataset - List templateDatasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()); - List copyDatasourceList = new ArrayList<>(); - // 遍历数据源 - templateDatasourceList.forEach(ds -> { - ReportDatasourceSaveReqVO copyDatasourceSaveReqVO = JsonUtils.parseObject(JsonUtils.toJsonString(ds), ReportDatasourceSaveReqVO.class); - copyDatasourceSaveReqVO.setId(null); - copyDatasourceSaveReqVO.setTemplateId(newtemplateId); - - List templateDatasetList = ds.getDatasets(); - // 遍历数据集 - if (CollUtil.isNotEmpty(templateDatasetList)) { - List copyDatasetList = new ArrayList<>(); - templateDatasetList.forEach(dt -> { - ReportDatasetSaveReqVO copyDatasetSaveReqVO = BeanUtils.toBean(dt, ReportDatasetSaveReqVO.class); - copyDatasetSaveReqVO.setId(null); - copyDatasetSaveReqVO.setDatasourceId(null); - copyDatasetList.add(copyDatasetSaveReqVO); - }); - copyDatasourceSaveReqVO.setDatasets(copyDatasetList); - } - copyDatasourceList.add(copyDatasourceSaveReqVO); - }); - // 更新数据源 - analyzeDatasource(copyDatasourceList, newtemplateId); // 返回主键 - return newtemplateId; - } - - /** - * 解析数据源集合并入库 - * - * @param datasource 数据源列表 - * @param templateId 模板id - */ - private void analyzeDatasource(List datasource, Long templateId) { - if (CollUtil.isEmpty(datasource)) { - return; - } - datasource.forEach(ds -> { - // 更新/新增数据源 - Long datasourceId; - if (ObjectUtil.isNotNull(ds.getId())) { - datasourceId = ds.getId(); - datasourceService.updateDatasource(ds); - } else { - ds.setTemplateId(templateId); - datasourceId = datasourceService.createDatasource(ds); - } - List datasets = ds.getDatasets(); - List batchInsertDataset = new ArrayList<>(); - List batchupdateDataset = new ArrayList<>(); - datasets.forEach(dataset -> { - // 更新/新增数据集 - if (ObjectUtil.isNotNull(dataset.getId())) { - batchupdateDataset.add(dataset); - } else { - dataset.setDatasourceId(datasourceId); - batchInsertDataset.add(dataset); - } - }); - - // 批量插入数据集 - if (CollUtil.isNotEmpty(batchInsertDataset)) { - datasetService.batchCreateDataset(batchInsertDataset); - } - // 批量更新数据集 - if (CollUtil.isNotEmpty(batchupdateDataset)) { - datasetService.batchUpdateDataset(batchupdateDataset); - } - }); + return copyTemplateDO.getId(); } @Override - @Transactional(rollbackFor = Exception.class) public void updateReportTemplate(ReportTemplateSaveReqVO updateReqVO) { Long templateId = updateReqVO.getId(); // 校验存在 @@ -242,13 +158,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 更新模板 ReportTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ReportTemplateDO.class); templateMapper.updateById(updateObj); - - // 更新数据源 - analyzeDatasource(updateReqVO.getDatasource(), templateId); } @Override - @Transactional(rollbackFor = Exception.class) public void deleteReportTemplate(Long id) { // 校验存在 ReportTemplateDO reportTemplateDO = validateTemplateExists(id); @@ -256,15 +168,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { validateSystemTemplate(reportTemplateDO); // 删除 templateMapper.deleteById(id); - // 删除关联数据源 - List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX().eq(ReportDatasourceDO::getTemplateId, id)); - if (CollUtil.isNotEmpty(reportDatasourceDOS)) { - // 模板下的数据源id - List datasourceIds = reportDatasourceDOS.stream().map(ReportDatasourceDO::getId).toList(); - datasourceMapper.deleteBatchIds(datasourceIds); - // 删除关联数据集 - datasetMapper.delete(new LambdaQueryWrapperX().in(ReportDatasetDO::getDatasourceId, datasourceIds)); - } } @@ -319,16 +222,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { validateTemplateExists(id); // 查询模板 ReportTemplateDO template = templateMapper.selectById(id); - if (ObjectUtil.isNotNull(template)) { - // 查询数据源 - List datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(template.getId()).build()); - datasourceList.forEach(ds -> { - // 查询数据集 - List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); - ds.setDatasets(datasetList); - }); - template.setDatasource(datasourceList); - } return template; } @@ -348,7 +241,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml ReportDefinition reportDefinition = new ReportParser().parse(is, template.getName()); if (ObjectUtil.isNotNull(template)) { - queryDatasource(template.getId(), reportDefinition); + queryDatasource(template, reportDefinition); } return new ReportDefinitionWrapper(reportDefinition); } @@ -356,38 +249,55 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { /** * 查询数据源信息(替代ureport xml中的数据源) * - * @param templateId 模板id + * @param templateDO 模板 * @param reportDefinition 报表定义 */ - private void queryDatasource(Long templateId, ReportDefinition reportDefinition) { + private void queryDatasource(ReportTemplateDO templateDO, ReportDefinition reportDefinition) { + Set datasourceIds = templateDO.getDatasourceIds(); + Set datasetIds = templateDO.getDatasetIds(); + List reportDatasourceDOS = new ArrayList<>(); + + if (CollUtil.isNotEmpty(datasourceIds)) { + // 查询模板下的数据源 + reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasourceDO::getId, datasourceIds)); + } + + List reportDatasetDOS = new ArrayList<>(); + if (CollUtil.isNotEmpty(datasetIds)) { + // 查询模板下的数据集 + reportDatasetDOS = datasetMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasetDO::getId, datasetIds)); + } + // 转换ureport对象后的数据源列表 List datasourceDefinitions = new ArrayList<>(); - // 查询数据源 - List datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()); - for (ReportDatasourceDO ds : datasourceList) { - // 查询数据集 - List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); + + + // 遍历列表转换为ureport对象 + for (ReportDatasourceDO ds : reportDatasourceDOS) { + // 转换ureport对象后的数据集列表 List datasetDefinitions = new ArrayList<>(); + // 匹配数据源下的数据集 + List datasetInDatasourceList = reportDatasetDOS.stream().filter(reportDatasetDO -> ds.getId().equals(reportDatasetDO.getDatasourceId())).toList(); // 忽略转换的字段名,手动转列表 String ignorePropertieName = "datasets"; switch (ds.getType()) { case JDBC -> { // 转换对应的ureport对象 JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtil.copyProperties(ds, JdbcDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, SqlDatasetDefinition.class)); jdbcDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(jdbcDatasourceDefinition); } case SPRING -> { // 转换对应的ureport对象 SpringBeanDatasourceDefinition springBeanDatasourceDefinition = BeanUtil.copyProperties(ds, SpringBeanDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, BeanDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, BeanDatasetDefinition.class)); springBeanDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(springBeanDatasourceDefinition); } case API -> { // 转换对应的ureport对象 ApiDatasourceDefinition apiDatasourceDefinition = BeanUtil.copyProperties(ds, ApiDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, ApiDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, ApiDatasetDefinition.class)); apiDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(apiDatasourceDefinition); } @@ -519,7 +429,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml ReportDefinition reportDefinition = reportRender.getReportDefinition(xmlContent, CharsetUtil.UTF_8); // 查询数据源 - queryDatasource(template.getId(), reportDefinition); + queryDatasource(template, reportDefinition); // 设置参数 PreviewParameters previewParameters = new PreviewParameters(); previewParameters.setQuery(reqDTO.getParams()); diff --git a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java index 34e5da3c5..cccf9c219 100644 --- a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java +++ b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java @@ -30,7 +30,6 @@ public abstract class ReportCommonServiceImplTest { .name("单元测试模板") .content(JsonUtil.zipString(TEMPLATE)) .remark(RandomUtils.randomString()) - .datasource(new ArrayList<>()) .build(); } @@ -39,14 +38,12 @@ public abstract class ReportCommonServiceImplTest { return ReportDatasourceSaveReqVO.builder() .id(id) .name("单元测试数据源") - .templateId(reportId) .type(ReportDatasourceTypeEnum.SPRING.getDesc()) .driver("com.mysql.cj.jdbc.Driver") .url("jdbc:mysql://192.168.1.205:3307/imes_base?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true") .username("root") .password("root") .remark(RandomUtils.randomString()) - .datasets(new ArrayList<>()) .build(); } diff --git a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java index 3301cab06..96b107fb1 100644 --- a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java +++ b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java @@ -70,7 +70,7 @@ public class ReportDatasourceServiceImplTest extends ReportCommonServiceImplTest reqVO.setTemplateId(templateId); reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode()); reqVO.setName(updateReqVO.getName()); - List templateDatasourceList = reportDatasourceService.getTemplateDatasourceList(reqVO); + List templateDatasourceList = reportDatasourceService.getDatasourceList(); assertNotNull(templateDatasourceList); assertNotEquals(0, templateDatasourceList.size()); From 70b02df792e07cf36942f57d88739c40cd2533e5 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 6 Sep 2024 13:59:10 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E6=8E=A5=E5=8F=A3swagger=E5=A4=87=E6=B3=A8=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=9B2=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=AD=97=E6=AE=B5type=E3=80=81buildType=E3=80=81beanI?= =?UTF-8?q?d=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/datasource/ReportDatasourceController.java | 5 ++--- .../admin/datasource/vo/ReportDatasourceRespVO.java | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index 44c5bc9af..30ca3fc46 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -8,7 +8,6 @@ import com.bstek.ureport.definition.dataset.Field; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceRespVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; @@ -83,7 +82,7 @@ public class ReportDatasourceController { } @GetMapping("/datasources") - @Operation(summary = "获取报表数据源") + @Operation(summary = "获取报表数据源列表") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") public CommonResult> getDatasourcePage() { return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class)); @@ -135,7 +134,7 @@ public class ReportDatasourceController { } @PostMapping("/datasource/tables") - @Operation(summary = "获取数据源表列表") + @Operation(summary = "获取数据库表列表") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") public CommonResult>> getDatasourceTables(@RequestBody DataSourceInfo info) { return success(ureportDataSourceService.selectTableList(info)); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java index de05540f5..5b848a6b8 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java @@ -1,6 +1,7 @@ package com.cf.imes.module.report.controller.admin.datasource.vo; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetRespVO; +import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; @@ -29,7 +30,13 @@ public class ReportDatasourceRespVO { private String name; @Schema(description = "数据源类型,jdbc、spring、api", example = "0") - private Integer type; + private ReportDatasourceTypeEnum type; + + @Schema(description = "内置类型:0是、1否") + private Integer buildinType; + + @Schema(description = "spring型数据源id") + private String beanId; @Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver") private String driver; From 24e3ddfe0907fed70110a2d9beafe6b0b6a5d457 Mon Sep 17 00:00:00 2001 From: liuzhaotian Date: Fri, 6 Sep 2024 14:31:45 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E6=8E=92=E5=8D=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=8C=89=E6=96=B0=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=95=B0=E6=8D=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/dal/mysql/goods/GoodsMapper.java | 37 +++++-- .../executor/dal/mysql/order/OrderMapper.java | 10 ++ .../dal/mysql/orderBody/OrderBodyMapper.java | 3 +- .../dal/mysql/orderItem/OrderItemMapper.java | 3 - .../executor/dal/mysql/plate/PlateMapper.java | 1 - .../mysql/remainplaten/RemainPlateMapper.java | 9 ++ .../optimizeplan/OptimizePlanServiceImpl.java | 38 +++---- .../service/plan/PlanServiceImpl.java | 92 +++++++++-------- .../resources/mapper/goods/GoodsMapper.xml | 99 ++++++++++++++++++- .../mapper/orderItem/OrderItemMapper.xml | 57 ----------- .../resources/mapper/plate/PlateMapper.xml | 21 ---- 11 files changed, 215 insertions(+), 155 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index 741b8d0e6..5d185759e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -8,6 +8,7 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsPageReqVO; +import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.NotPlanGoodsRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.*; import com.cf.imes.module.executor.dal.dataobject.goods.GoodsDO; @@ -82,16 +83,6 @@ public interface GoodsMapper extends BaseMapperX { IPage selectGoods(@Param("page") IPage page, @Param("goodsIds") List goodsIds, @Param("organId") Long organId); -// default GoodsDO selectId(Long orderId, Long goodsId, Long organId) { -// return selectOne(new LambdaQueryWrapperX() -// } -// default List selectGoodsPlateList(List goodIds, Long organId) { -// return selectList(new LambdaQueryWrapperX() -// .eq(GoodsDO::getOrganId, organId) -// .inIfPresent(GoodsDO::getOrderId, goodIds) -// .select(GoodsDO::getGoodsId,GoodsDO::getGoodsName, GoodsDO::getMaterial, GoodsDO::getColor, GoodsDO::getTexture,GoodsDO::getThickness, GoodsDO::getSpec)); -// } - List selectGoodsPlateList(@Param("goodIds") List goodIds,@Param("organId") Long organId); @@ -187,4 +178,30 @@ public interface GoodsMapper extends BaseMapperX { IPage selectNoPlanOrderList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + default int deletePlanGoods(List ids, Long organId) { + return update(new LambdaUpdateWrapper() + .set(GoodsDO::getPlanId, 0) + .eq(GoodsDO::getOrganId, organId) + .in(GoodsDO::getPlanId, ids)); + } + + + + default List selectPlanGoodsListByPlanIdList(List planIds, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(GoodsDO::getOrganId, organId) + .eq(GoodsDO::getDeleted, false) + .in(GoodsDO::getPlanId,planIds) + .select(GoodsDO::getGoodsId,GoodsDO::getId,GoodsDO::getOrderId)); + + } + + + List selectPlateListByPlanId(@Param("planIds") List planIds, @Param("organId") Long organId); + + + List selectNoPlanRoomBody(@Param("orderIds") List orderIds, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index 4048dfcb8..b4fab3faa 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -251,4 +251,14 @@ public interface OrderMapper extends BaseMapperX { List selectGoodsListByGoodsId(@Param(Constants.WRAPPER) QueryWrapperX queryWrapperX); + + + default List selectNoPlanOrderList(Long organId, List statusList) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(OrderDO::getOrganId, organId) + .eq(OrderDO::getDeleted, false) + .in(OrderDO::getStatus,statusList) + .select(OrderDO::getId)); + + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java index 281e508ec..4223189fe 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderBody/OrderBodyMapper.java @@ -131,10 +131,11 @@ public interface OrderBodyMapper extends BaseMapperX { - default List selectOrderBodyList(List bodyIds, Long organId) { + default List selectOrderBodyList(List bodyIds,List orderIds, Long organId) { return selectList(new LambdaQueryWrapperX() .eq(OrderBodyDO::getOrganId, organId) .eq(OrderBodyDO::getDeleted,false) + .in(OrderBodyDO::getOrderId,orderIds) .in(OrderBodyDO::getId, bodyIds) .select(OrderBodyDO::getId,OrderBodyDO::getName,OrderBodyDO::getRoomName)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index 1d096ca26..d28854a03 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -5,7 +5,6 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; -import com.cf.imes.module.executor.controller.admin.plan.bo.OrderRoomBodyList; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailReqVO; @@ -81,8 +80,6 @@ public interface OrderItemMapper extends BaseMapperX { } - List selectRoomBodyByOrderId( @Param("orderIds") List orderIds, @Param("organId") Long organId); - default List selectPlateIdList(List plateIds, Long organId) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index 91fbe697b..a6e0366eb 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -120,7 +120,6 @@ public interface PlateMapper extends BaseMapperX { List selectPlateIdListByBodyId(@Param("bodyId") Long bodyId, @Param("organId") Long organId); - List selectPlateListByPlanId(@Param("planIds") List planIds, @Param("organId") Long organId); // 根据需要删除的小板id查找具体信息 List selectPlateGoodsListByList(@Param("plates") List goodsIdList, @Param("orderId") Long orderId, @Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java index 51a56abdb..9c16c2d76 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java @@ -62,5 +62,14 @@ public interface RemainPlateMapper extends BaseMapperX { List selectTestSQL(@Param("filed") String filed,@Param("planId") Long planId,@Param("organId") Long organId); + + default int deletePlanRemainPlate(List ids, Long organId) { + return update(new LambdaUpdateWrapper() + .set(RemainPlateDO::getPlanId, 0) + .eq(RemainPlateDO::getOrganId, organId) + .in(RemainPlateDO::getPlanId, ids)); + } + + // List selectTestSQL(@Param("sql") String sql); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index 0c4754514..c1fb9f0ba 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -743,25 +743,25 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { batchSaveBoardModel(req.getOptimizeBoardModelDOS()); - // 保存余料板的数据 - if (CollectionUtil.isNotEmpty(req.getOptimizeRemainPlates())) { - - List remainPlateDoS = BeanUtils.toBean(req.getOptimizeRemainPlates(), RemainPlateDO.class) - .stream() - .map(m -> m.setUseType(1)) - .map(m -> m.setOutLineJson("")).toList(); - - - List insertPlateDoS = remainPlateDoS.stream().filter(f -> f.getId() == null).toList(); - - List updatePlateDoS = remainPlateDoS.stream().filter(f -> f.getId() != null).toList(); - - Boolean aBoolean = insertPlateDoS.isEmpty() ? null : remainPlateMapper.insertBatch(insertPlateDoS); - - Boolean bBoolean = updatePlateDoS.isEmpty() ? null : remainPlateMapper.updateBatch(updatePlateDoS); - - - } +// // 保存余料板的数据 +// if (CollectionUtil.isNotEmpty(req.getOptimizeRemainPlates())) { +// +// List remainPlateDoS = BeanUtils.toBean(req.getOptimizeRemainPlates(), RemainPlateDO.class) +// .stream() +// .map(m -> m.setUseType(1)) +// .map(m -> m.setOutLineJson("")).toList(); +// +// +// List insertPlateDoS = remainPlateDoS.stream().filter(f -> f.getId() == null).toList(); +// +// List updatePlateDoS = remainPlateDoS.stream().filter(f -> f.getId() != null).toList(); +// +// Boolean aBoolean = insertPlateDoS.isEmpty() ? null : remainPlateMapper.insertBatch(insertPlateDoS); +// +// Boolean bBoolean = updatePlateDoS.isEmpty() ? null : remainPlateMapper.updateBatch(updatePlateDoS); +// +// +// } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index 881111b4c..d1f238546 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -42,11 +42,11 @@ import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; import com.cf.imes.module.executor.dal.mysql.planitem.PlanItemMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; +import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService; import com.cf.imes.module.system.api.machine.MachineApi; import com.cf.imes.module.system.api.machine.dto.CuttingRespDTO; -import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,7 +55,6 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.IOException; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -104,6 +103,9 @@ public class PlanServiceImpl implements PlanService { @Resource private OrderBodyMapper orderBodyMapper; + @Resource + private RemainPlateMapper remainPlateMapper; + @Resource private IdentifierGenerator identifierGenerator; @@ -295,18 +297,23 @@ public class PlanServiceImpl implements PlanService { } - // 删除排单信息,排单明细表信息,ES优化数据 + // 删除排单信息,商品表里的 planId , ES优化数据,更新排单对应的余料板的排单ID为0 planMapper.deleteBatchIds(ids); - planItemMapper.delete(new LambdaQueryWrapperX().in(PlanItemDO::getPlanId, ids)); +// planItemMapper.delete(new LambdaQueryWrapperX().in(PlanItemDO::getPlanId, ids)); + goodsMapper.deletePlanGoods(ids,getUserOrganId()); + remainPlateMapper.deletePlanRemainPlate(ids,getUserOrganId()); + // 排单对应的自增板的删除 todo 目前值解决了非混单的情况 List boardModelDOS = buildBoardByPlanIds(ids, ORDER_REMAIN_PLATE_MODEL, ids.size()); if(!boardModelDOS.isEmpty()) { - List goodsIds = boardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); +// List goodsIds = boardModelDOS.stream().map(OptimizeBoardModelDO::getGoodsId).toList(); - List goodsIdList = goodsMapper.selectListByGoodsIdList(goodsIds, orderIds, getUserOrganId()).stream().map(GoodsDO::getId).toList(); +// List goodsIdList = goodsMapper.selectListByGoodsIdList(goodsIds, orderIds, getUserOrganId()).stream().map(GoodsDO::getId).toList(); + + List goodsIdList = goodsMapper.selectPlanGoodsListByPlanIdList(ids, getUserOrganId()).stream().map(GoodsDO::getId).toList(); List plateDOS = plateMapper.selectPlateIdList(goodsIdList, getUserOrganId()); if(!plateDOS.isEmpty()) { @@ -386,34 +393,41 @@ public class PlanServiceImpl implements PlanService { @Override public PlanRespVO getPlan(Long id) { - PlanDO planDO = planMapper.selectById(id); - MPJLambdaWrapper wrapper = new MPJLambdaWrapperX().select(OrderItemDO::getOrderId) - .rightJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId) - .isNotNull(OrderItemDO::getId); - Set orderIds = orderItemMapper.selectJoinList(OrderItemDO.class, wrapper).stream().map(OrderItemDO::getOrderId).collect(Collectors.toSet()); - /*Set orderIds = planOrderMapper.selectList(new LambdaQueryWrapperX().eq(PlanOrderDO::getPlanId, planDO.getPlanNo())) - .stream() - .map(e -> e.getOrderId()) - .collect(Collectors.toSet());*/ - PlanRespVO respVO = BeanUtils.toBean(planDO, PlanRespVO.class); - List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX() - .eq(GoodsDO::getOrganId,getUserOrganId()) - .in(GoodsDO::getOrderId, orderIds)); - List plateDOS = plateMapper.selectList(new LambdaQueryWrapperX() - .eq(PlateDO::getOrganId,getUserOrganId()) - .in(PlateDO::getGoodsId, goodsDOS.stream().map(GoodsDO::getGoodsId).collect(Collectors.toSet()))); - List plateInfoVOS = goodsDOS.stream().map(e -> PlateInfoVO.builder() - .material(e.getMaterial()) - .width(e.getWidth()) - .height(e.getHeight()) - .thickness(e.getThickness()) - .area(e.getHeight().multiply(e.getWidth()).setScale(2, RoundingMode.HALF_UP)) - .count(plateDOS.stream().filter(f -> Objects.equals(f.getGoodsId(), e.getGoodsId())).collect(Collectors.toSet()).size()) - .build()) - .collect(Collectors.toList()); - respVO.setPlateInfoList(plateInfoVOS); - return respVO; + PlanDO planDO = planMapper.selectById(id); + + if ( planDO== null) { + throw exception(PLAN_NOT_EXISTS); + } + + return BeanUtils.toBean(planDO, PlanRespVO.class); + +// MPJLambdaWrapper wrapper = new MPJLambdaWrapperX().select(OrderItemDO::getOrderId) +// .rightJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId) +// .isNotNull(OrderItemDO::getId); +// Set orderIds = orderItemMapper.selectJoinList(OrderItemDO.class, wrapper).stream().map(OrderItemDO::getOrderId).collect(Collectors.toSet()); +// +// /*Set orderIds = planOrderMapper.selectList(new LambdaQueryWrapperX().eq(PlanOrderDO::getPlanId, planDO.getPlanNo())) +// .stream() +// .map(e -> e.getOrderId()) +// .collect(Collectors.toSet());*/ +// List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX() +// .eq(GoodsDO::getOrganId,getUserOrganId()) +// .in(GoodsDO::getOrderId, orderIds)); +// List plateDOS = plateMapper.selectList(new LambdaQueryWrapperX() +// .eq(PlateDO::getOrganId,getUserOrganId()) +// .in(PlateDO::getGoodsId, goodsDOS.stream().map(GoodsDO::getGoodsId).collect(Collectors.toSet()))); +// List plateInfoVOS = goodsDOS.stream().map(e -> PlateInfoVO.builder() +// .material(e.getMaterial()) +// .width(e.getWidth()) +// .height(e.getHeight()) +// .thickness(e.getThickness()) +// .area(e.getHeight().multiply(e.getWidth()).setScale(2, RoundingMode.HALF_UP)) +// .count(plateDOS.stream().filter(f -> Objects.equals(f.getGoodsId(), e.getGoodsId())).collect(Collectors.toSet()).size()) +// .build()) +// .collect(Collectors.toList()); +// respVO.setPlateInfoList(plateInfoVOS); + } @@ -502,8 +516,8 @@ public class PlanServiceImpl implements PlanService { // 根据排单ID查询ES中的优化数据 todo 目前只解决无混单的情况,混单情况待解决 List optimizeBoardModelDOS = buildBoardByPlanIds(planIds, ORDER_REMAIN_PLATE_MODEL, infoVOList.size()); - for (OptimizeBoardModelDO optimizeBoardModelDO : optimizeBoardModelDOS) { - } +// for (OptimizeBoardModelDO optimizeBoardModelDO : optimizeBoardModelDOS) { +// } // 获取排单对应的生产单的信息 List planOrderRespVOS = planItemMapper.selectOrderList(planIds, getUserOrganId()); @@ -988,6 +1002,7 @@ public class PlanServiceImpl implements PlanService { MPJLambdaWrapperX lambdaWrapperX = new MPJLambdaWrapperX<>(); lambdaWrapperX.leftJoin(GoodsDO.class, GoodsDO::getOrderId, OrderDO::getId) .eq(GoodsDO::getOrganId,getUserOrganId()) + .eq(GoodsDO::getDeleted,false) .eq(GoodsDO::getPlanId, pageReqVO.getPlanId()) .distinct(); @@ -1032,7 +1047,7 @@ public class PlanServiceImpl implements PlanService { public List getPlateList(List planIds) { - List plateResLists = plateMapper.selectPlateListByPlanId(planIds, getUserOrganId()); + List plateResLists = goodsMapper.selectPlateListByPlanId(planIds, getUserOrganId()); Set bodyIds = plateResLists.stream().map(PlateResList::getBodyId).collect(Collectors.toSet()); if (CollectionUtil.isNotEmpty(bodyIds)) { @@ -1052,10 +1067,7 @@ public class PlanServiceImpl implements PlanService { public List getOrderRoomBody(List orderIds) { - List orderRoomBodyLists = orderItemMapper.selectRoomBodyByOrderId(orderIds, getUserOrganId()); - - - return orderRoomBodyLists; + return goodsMapper.selectNoPlanRoomBody(orderIds,getUserOrganId()); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index 8745eb8b5..d5d8bbc91 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -231,7 +231,7 @@ from order_goods og - left join order_plate op on og.organ_id = op.organ_id and og.id = op.goods_id and og.deleted = op.deleted + left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and og.deleted = op.deleted where og.organ_id = #{organId} @@ -288,8 +288,8 @@ oi.body_id from order_goods og - left join order_plate op on og.organ_id = op.organ_id and og.id = op.goods_id and og.deleted = op.deleted - left join order_item oi on op.organ_id = oi.organ_id and op.id = oi.plate_id + left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and og.deleted = op.deleted + left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id ${ew.customSqlSegment} @@ -331,4 +331,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml index d9e67013f..37c1f5ad3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml @@ -181,11 +181,6 @@ - - - - - - - select distinct - oi.order_id as orderId, - ob.id as bodyId, - ob.name as bodyName, - ob.room_id as roomId, - ob.room_name as roomName - from order_item oi - left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id - left join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id - - where oi.organ_id = #{organId} and opi.item_id is null and oi.order_id in - - - #{orderIds} - - - - - - - - -