Parcourir la source

报表功能基本完成

Huanyi il y a 1 mois
Parent
commit
a9fba69f80

+ 1 - 1
ruoyi-admin/pom.xml

@@ -23,7 +23,7 @@
             <artifactId>mysql-connector-j</artifactId>
         </dependency>
 
-<!--        &lt;!&ndash; mp支持的数据库均支持 只需要增加对应的jdbc依赖即可 &ndash;&gt;-->
+        <!--        &lt;!&ndash; mp支持的数据库均支持 只需要增加对应的jdbc依赖即可 &ndash;&gt;-->
 <!--        &lt;!&ndash; Oracle &ndash;&gt;-->
 <!--        <dependency>-->
 <!--            <groupId>com.oracle.database.jdbc</groupId>-->

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -17,7 +17,7 @@ public class DromaraApplication {
         SpringApplication application = new SpringApplication(DromaraApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  RuoYi-Vue-Plus启动成功   ლ(´ڡ`ლ)゙");
+        System.out.println("(♥◠‿◠)ノ゙  智能营养系统启动成功   ლ(´ڡ`ლ)゙");
     }
 
 }

+ 110 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/ExcelController.java

@@ -0,0 +1,110 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.SysFoodIngredient;
+import org.dromara.system.mapper.SysDictDataMapper;
+import org.dromara.system.mapper.SysFoodIngredientMapper;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@SaIgnore
+@RestController
+@RequestMapping("/excel")
+@RequiredArgsConstructor
+public class ExcelController {
+
+    private final SysFoodIngredientMapper sysFoodIngredientMapper;
+
+    @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @Transactional(rollbackFor = Exception.class)
+    public R insertBatch(@RequestPart("file") MultipartFile file) {
+
+        try {
+            XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
+
+            Sheet sheet = workbook.getSheetAt(0);
+
+            List<SysFoodIngredient> list = new ArrayList<>();
+
+            for (Row row : sheet) {
+                if (row.getRowNum() == 0) continue;
+                SysFoodIngredient food = new SysFoodIngredient();
+
+                StringBuilder categoryIds = new StringBuilder();
+
+                for (Cell cell : row) {
+                    switch (cell.getColumnIndex()) {
+                        case 0 -> food.setName(cell.getStringCellValue());
+                        case 1 -> food.setCode(cell.getStringCellValue());
+                        case 2 -> food.setUnit(Objects.equals(cell.getStringCellValue(), "g") ? "1" : "2");
+                        case 3 -> categoryIds.append((int) cell.getNumericCellValue()).append(",");
+                        case 4 -> categoryIds.append((int) cell.getNumericCellValue());
+                        case 5 -> food.setEdibleRatio(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 6 -> food.setCalories(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 7 -> food.setProtein(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 8 -> food.setFat(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 9 -> food.setCarbohydrate(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 10 -> food.setWater(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 11 -> food.setVitaminA(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 12 -> food.setVitaminB2(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 13 -> food.setVitaminC(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 14 -> food.setSodium(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 15 -> food.setIron(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 16 -> food.setPhosphorus(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 17 -> food.setDietaryFiber(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 18 -> food.setVitaminB1(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 19 -> food.setNiacin(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 20 -> food.setVitaminE(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 21 -> food.setCalcium(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 22 -> food.setPotassium(BigDecimal.valueOf(cell.getNumericCellValue()));
+                        case 23 -> food.setCholesterol(BigDecimal.valueOf(cell.getNumericCellValue()));
+                    }
+                }
+                food.setFoodCategoryId(categoryIds.toString());
+                list.add(food);
+            }
+
+            workbook.close();
+
+            System.err.println("成功扫描到 list : " + list.size());
+
+            boolean flag = sysFoodIngredientMapper.insertBatch(list);
+            Long count = sysFoodIngredientMapper.selectCount(Wrappers.lambdaQuery(SysFoodIngredient.class));
+            System.err.println("数据库最新有 " + count + " 条数据");
+            if (!flag) throw new RuntimeException("批量插入失败");
+
+            System.err.println("成功");
+
+            return R.ok();
+
+        } catch (Exception e) {
+            System.err.println("处理文件异常 : " + e.getMessage());
+            throw new RuntimeException("文件处理异常");
+        }
+    }
+
+}

+ 6 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/ReportController.java

@@ -58,6 +58,12 @@ public class ReportController {
         return reportService.listPageDietaryPrescription(bo, pageQuery);
     }
 
+    @GetMapping("/screeningOrAssessment")
+    @SaCheckPermission("report:screeningOrAssessment:list")
+    public TableDataInfo listPageScreeningOrAssessment(ScreeningOrAssessmentBo bo, PageQuery pageQuery) {
+        return reportService.listPageScreeningOrAssessment(bo, pageQuery);
+    }
+
     @GetMapping("/dietaryInventory")
     @SaCheckPermission("report:dietaryInventory:list")
     public TableDataInfo listPageDietaryInventory(DietaryInventoryBo bo, PageQuery pageQuery) {

+ 56 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ScreeningOrAssessmentBo.java

@@ -0,0 +1,56 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ScreeningOrAssessmentBo {
+
+    /**
+     * 最早时间
+     */
+    private Date createTimeEarliest;
+
+    /**
+     * 最晚时间
+     */
+    private Date createTimeLatest;
+
+    /**
+     * 看诊类型
+     */
+    private Integer consultationType;
+
+    /**
+     * 医生科室ID
+     */
+    private Long doctorDepartmentId;
+
+    /**
+     * 患者科室ID
+     */
+    private Long patientDepartmentId;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 报表类型(顶部菜单形式呈现,属于必传字段)
+     * 1、营养筛查
+     * 2、营养评估
+     * 3、营养诊断
+     * 4、营养宣教
+     */
+    private Integer type;
+
+}

+ 83 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionalDiagnosisVo.java

@@ -0,0 +1,83 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class NutritionalDiagnosisVo {
+
+    /**
+     * 诊断时间
+     */
+    private Date createTime;
+
+    /**
+     * 医生
+     */
+    private String doctor;
+
+    /**
+     * 医生科室
+     */
+    private String doctorDepartment;
+
+    /**
+     * 看诊类型
+     */
+    private String consultationType;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+    /**
+     * 诊疗卡号
+     */
+    private String medicalId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String admissionId;
+
+    /**
+     * 身高(cm)
+     */
+    private String height;
+
+    /**
+     * 体重(kg)
+     */
+    private String weight;
+
+    /**
+     * BMI
+     */
+    private BigDecimal bmi;
+
+    /**
+     * 诊断依据
+     */
+    private String diagnosisBasis;
+
+    /**
+     * 营养诊断
+     */
+    private String nutritionDiagnosis;
+
+}

+ 63 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionalEducationVo.java

@@ -0,0 +1,63 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class NutritionalEducationVo {
+
+    /**
+     * 宣教时间
+     */
+    private Date createTime;
+
+    /**
+     * 宣教标题
+     */
+    private String educationTitle;
+
+    /**
+     * 医生/护士
+     */
+    private String doctor;
+
+    /**
+     * 医生/护士科室
+     */
+    private String doctorDepartment;
+
+    /**
+     * 病区
+     */
+    private String sicknessArea;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+    /**
+     * 看诊类型
+     */
+    private String consultationType;
+
+    /**
+     * 门诊/住院号
+     */
+    private String admissionId;
+
+}

+ 93 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionalEvaluationVo.java

@@ -0,0 +1,93 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class NutritionalEvaluationVo {
+
+    /**
+     * 评估时间
+     */
+    private Date createTime;
+
+    /**
+     * 医生/护士
+     */
+    private String doctor;
+
+    /**
+     * 医生/护士科室
+     */
+    private String doctorDepartment;
+
+    /**
+     * 病区
+     */
+    private String sicknessArea;
+
+    /**
+     * 看诊类型
+     */
+    private String consultationType;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+    /**
+     * 诊疗卡号
+     */
+    private String medicalId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String admissionId;
+
+    /**
+     * 身高(cm)
+     */
+    private String height;
+
+    /**
+     * 体重(kg)
+     */
+    private String weight;
+
+    /**
+     * BMI
+     */
+    private BigDecimal bmi;
+
+    /**
+     * 评估类型
+     */
+    private String evaluationType;
+
+    /**
+     * 评估评分
+     */
+    private BigDecimal evaluationScore;
+
+    /**
+     * 评估结论
+     */
+    private String evaluationConclusion;
+
+}

+ 88 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionalScreeningVo.java

@@ -0,0 +1,88 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-21
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class NutritionalScreeningVo {
+
+    /**
+     * 筛查时间
+     */
+    private Date createTime;
+
+    /**
+     * 医生/护士
+     */
+    private String doctorName;
+
+    /**
+     * 医生/护士科室
+     */
+    private String doctorDepartment;
+
+    /**
+     * 病区
+     */
+    private String sicknessArea;
+
+    /**
+     * 看诊类型
+     */
+    private String visitType;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+    /**
+     * 诊疗卡号
+     */
+    private String medicalId;
+
+    /**
+     * 身高(cm)
+     */
+    private String height;
+
+    /**
+     * 体重(kg)
+     */
+    private String weight;
+
+    /**
+     * BMI
+     */
+    private BigDecimal bmi;
+
+    /**
+     * 筛查类型
+     */
+    private String screeningType;
+
+    /**
+     * 筛查评分
+     */
+    private BigDecimal screeningScore;
+
+    /**
+     * 筛查结论
+     */
+    private String screeningConclusion;
+
+}

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/ReportService.java

@@ -38,4 +38,6 @@ public interface ReportService {
     TableDataInfo<PrescriptionVo> getEnteralNutrition(EnteralNutritionPrescriptionBo bo, PageQuery pageQuery);
 
     TableDataInfo<ListProductVo> listProduct(ListProductBo bo, PageQuery pageQuery);
+
+    TableDataInfo listPageScreeningOrAssessment(ScreeningOrAssessmentBo bo, PageQuery pageQuery);
 }

+ 258 - 35
ruoyi-admin/src/main/java/org/dromara/web/service/impl/ReportServiceImpl.java

@@ -58,6 +58,12 @@ public class ReportServiceImpl implements ReportService {
     private final EnteralNutritionConsumableMapper enteralNutritionConsumableMapper;
     private final SuppliesManageMapper suppliesManageMapper;
     private final SuppliesCategoryMapper suppliesCategoryMapper;
+    private final NutritionScreeningMapper nutritionScreeningMapper;
+    private final NutritionEvaluationMapper nutritionEvaluationMapper;
+    private final NutritionDiagnosisMapper nutritionDiagnosisMapper;
+    private final NutritionEducationMapper nutritionEducationMapper;
+    private final SysScreeningAssessmentConfigMapper sysScreeningAssessmentConfigMapper;
+    private final SysDiseaseLabelMapper sysDiseaseLabelMapper;
 
     @Override
     public R getNutritionalQualityControl(Timestamp start, Timestamp end) {
@@ -102,6 +108,7 @@ public class ReportServiceImpl implements ReportService {
                     .ge(bo.getCalculationDateEarliest() != null, HospitalMealPlan::getCreateTime, bo.getCalculationDateEarliest())
                     .le(bo.getCalculationDateLatest() != null, HospitalMealPlan::getCreateTime, bo.getCalculationDateLatest())
                     .in(!ids.isEmpty(), HospitalMealPlan::getPatientId, ids)
+                    .eq(bo.getConsultationType() != null, HospitalMealPlan::getType, bo.getConsultationType())
                     .eq(bo.getPatientDepartmentId() != null, HospitalMealPlan::getDeptId, bo.getPatientDepartmentId())
                     .eq(bo.getDoctorDepartmentId() != null, HospitalMealPlan::getCreateDept, bo.getDoctorDepartmentId())
                     .isNotNull(HospitalMealPlan::getSettlementId)
@@ -356,7 +363,7 @@ public class ReportServiceImpl implements ReportService {
                     for (Long ingredientId : recipeToIngredientMap.get(recipe.getRecipeId()))
                         for (SysFoodIngredient e : ingredients) {
                             if (Objects.equals(ingredientId, e.getFoodIngredientId())) ingredientNames.add(e.getName());
-                            cost = cost.add(e.getPurchasePrice());
+                            if (e.getPurchasePrice() != null) cost = cost.add(e.getPurchasePrice());
                         }
 
                     foodVo.setIngredients(ingredientNames);
@@ -632,9 +639,11 @@ public class ReportServiceImpl implements ReportService {
         Map<Long, String> typeMap = new HashMap<>();
         Map<Long, String> manufacturerMap = new HashMap<>();
         Map<Long, String> providerMap = new HashMap<>();
+        Map<String, String> unitMap = new HashMap<>();
 
         productManufacturerMapper.selectList().forEach(e -> manufacturerMap.put(e.getId(), e.getName()));
         productSupplierMapper.selectList().forEach(e -> providerMap.put(e.getId(), e.getName()));
+        sysDictDataMapper.selectDictDataByType("product_package_unit").forEach(e -> unitMap.put(e.getDictValue(), e.getDictLabel()));
 
         if (bo.getProductType() == 0) {
 
@@ -665,14 +674,16 @@ public class ReportServiceImpl implements ReportService {
                     vo.setProductClassification(productType);
                 }
 
+                String minUnit = unitMap.get(e.getMinUnit());
+
                 vo.setProductType("营养产品");
                 vo.setProductName(e.getProductName());
-                vo.setProductSpecification(e.getProductSpec());
-                vo.setProviderName(Objects.nonNull(e.getSupplier()) ? providerMap.get(Long.valueOf(e.getSupplier())) : null);
-                vo.setManufacturerName(Objects.nonNull(e.getManufacturer()) ? manufacturerMap.get(Long.valueOf(e.getManufacturer())) : null);
+                vo.setProductSpecification(e.getProductSpec() + minUnit);
+                vo.setProviderName(Objects.nonNull(e.getSupplier()) && !e.getSupplier().isEmpty() ? providerMap.get(Long.valueOf(e.getSupplier())) : null);
+                vo.setManufacturerName(Objects.nonNull(e.getManufacturer()) && !e.getManufacturer().isEmpty() ? manufacturerMap.get(Long.valueOf(e.getManufacturer())) : null);
 
-                String prePackageUnit = e.getPackageUnit();
-                String configureUnit = e.getMinUnit();
+                String prePackageUnit = unitMap.get(e.getPackageUnit());
+                String configureUnit = unitMap.get(e.getMinUnit());
 
                 int prePackageCount = 0, configureCount = 0, longTermCount = 0;
                 for (EnteralNutrition enteralNutrition : enteralNutritionList) {
@@ -688,20 +699,20 @@ public class ReportServiceImpl implements ReportService {
                 }
 
 
-                vo.setPrePackageSalesVolume(prePackageCount + prePackageUnit);
+                vo.setPrePackageSalesVolume(prePackageCount + ".00" + prePackageUnit);
                 vo.setPrePackageSalesAmount(e.getPackagePrice().multiply(new BigDecimal(prePackageCount)));
-                vo.setPrePackagePurchaseUnitPrice(new BigDecimal("0"));
-                vo.setPrePackagePurchaseAmount(new BigDecimal("0"));
-                vo.setConfigureSalesVolume(configureCount + configureUnit);
+                vo.setPrePackagePurchaseUnitPrice(new BigDecimal("0.00"));
+                vo.setPrePackagePurchaseAmount(new BigDecimal("0.00"));
+                vo.setConfigureSalesVolume(configureCount + ".00" + configureUnit);
                 vo.setConfigureSalesAmount(e.getConfigSalePrice().multiply(new BigDecimal(configureCount)));
-                vo.setLongTermPrescriptionSalesVolume(longTermCount + configureUnit);
+                vo.setLongTermPrescriptionSalesVolume(longTermCount + ".00" + configureUnit);
                 vo.setLongTermPrescriptionSalesAmount(e.getConfigSalePrice().multiply(new BigDecimal(longTermCount)));
-                vo.setPrePackageRefundVolume("0" + prePackageUnit);
-                vo.setPrePackageRefundAmount(new BigDecimal("0"));
-                vo.setConfigureRefundVolume("0" + configureUnit);
-                vo.setConfigureRefundAmount(new BigDecimal("0"));
-                vo.setLongTermPrescriptionRefundVolume("0" + configureUnit);
-                vo.setLongTermPrescriptionRefundAmount(new BigDecimal("0"));
+                vo.setPrePackageRefundVolume("0.00" + prePackageUnit);
+                vo.setPrePackageRefundAmount(new BigDecimal("0.00"));
+                vo.setConfigureRefundVolume("0.00" + configureUnit);
+                vo.setConfigureRefundAmount(new BigDecimal("0.00"));
+                vo.setLongTermPrescriptionRefundVolume("0.00" + configureUnit);
+                vo.setLongTermPrescriptionRefundAmount(new BigDecimal("0.00"));
                 return vo;
             }));
         } else {
@@ -729,13 +740,15 @@ public class ReportServiceImpl implements ReportService {
                     vo.setProductClassification(productClassification);
                 }
 
+                String specificationUnit = unitMap.get(e.getSuppliesSpecUnit());
+
                 vo.setProductName(e.getSuppliesName());
-                vo.setProductSpecification(e.getSuppliesSpec());
-                vo.setProviderName(Objects.nonNull(e.getSupplier()) ? providerMap.get(e.getSupplier()) : null);
-                vo.setManufacturerName(Objects.nonNull(e.getManufacturer()) ? manufacturerMap.get(e.getManufacturer()) : null);
+                vo.setProductSpecification(e.getSuppliesSpec() + specificationUnit);
+                vo.setProviderName(Objects.nonNull(e.getSupplier()) && !e.getSupplier().isEmpty() ? providerMap.get(Long.valueOf(e.getSupplier())) : null);
+                vo.setManufacturerName(Objects.nonNull(e.getManufacturer()) && !e.getManufacturer().isEmpty() ? manufacturerMap.get(Long.valueOf(e.getManufacturer())) : null);
 
-                String prePackageUnit = e.getSuppliesUnit();
-                String configureUnit = e.getSuppliesSpecUnit();
+                String prePackageUnit = unitMap.get(e.getSuppliesUnit());
+                String configureUnit = unitMap.get(e.getSuppliesSpecUnit());
 
                 int configureCount = 0, longTermCount = 0;
                 for (EnteralNutritionConsumable enteralNutritionConsumable : enteralNutritionConsumableList) {
@@ -744,23 +757,233 @@ public class ReportServiceImpl implements ReportService {
                     else longTermCount++;
                 }
 
-                vo.setPrePackageSalesVolume("0" + prePackageUnit);
-                vo.setPrePackageSalesAmount(new BigDecimal("0"));
-                vo.setPrePackagePurchaseUnitPrice(new BigDecimal("0"));
-                vo.setPrePackagePurchaseAmount(new BigDecimal("0"));
-                vo.setConfigureSalesVolume(configureCount + configureUnit);
-                vo.setConfigureSalesAmount(e.getSellPrice().multiply(new BigDecimal(configureUnit)));
-                vo.setLongTermPrescriptionSalesVolume(longTermCount + configureUnit);
+                vo.setPrePackageSalesVolume("0.00" + prePackageUnit);
+                vo.setPrePackageSalesAmount(new BigDecimal("0.00"));
+                vo.setPrePackagePurchaseUnitPrice(new BigDecimal("0.00"));
+                vo.setPrePackagePurchaseAmount(new BigDecimal("0.00"));
+                vo.setConfigureSalesVolume(configureCount + ".00" + configureUnit);
+                vo.setConfigureSalesAmount(e.getSellPrice().multiply(new BigDecimal(configureCount)));
+                vo.setLongTermPrescriptionSalesVolume(longTermCount + ".00" + configureUnit);
                 vo.setLongTermPrescriptionSalesAmount(e.getSellPrice().multiply(new BigDecimal(longTermCount)));
-                vo.setPrePackageRefundVolume("0" + prePackageUnit);
-                vo.setPrePackageRefundAmount(new BigDecimal("0"));
-                vo.setConfigureRefundVolume("0" + configureUnit);
-                vo.setConfigureRefundAmount(new BigDecimal("0"));
-                vo.setLongTermPrescriptionRefundVolume("0" + configureUnit);
-                vo.setLongTermPrescriptionRefundAmount(new BigDecimal("0"));
+                vo.setPrePackageRefundVolume("0.00" + prePackageUnit);
+                vo.setPrePackageRefundAmount(new BigDecimal("0.00"));
+                vo.setConfigureRefundVolume("0.00" + configureUnit);
+                vo.setConfigureRefundAmount(new BigDecimal("0.00"));
+                vo.setLongTermPrescriptionRefundVolume("0.00" + configureUnit);
+                vo.setLongTermPrescriptionRefundAmount(new BigDecimal("0.00"));
                 return vo;
             }));
         }
     }
 
+    @Override
+    public TableDataInfo listPageScreeningOrAssessment(ScreeningOrAssessmentBo bo, PageQuery pageQuery) {
+
+        List<Long> ids = new ArrayList<>();
+
+        treatmentUserMapper.selectList(
+            Wrappers.lambdaQuery(TreatmentUser.class)
+                .like(bo.getPatientName() != null, TreatmentUser::getTreatName, bo.getPatientName())
+        ).forEach(e -> ids.add(e.getId()));
+
+
+        Map<Long, String> deptMap = new HashMap<>();
+        Map<Long, String> doctorMap = new HashMap<>();
+
+        List<TreatmentUser> patientList = treatmentUserMapper.selectList();
+        sysDeptMapper.selectList().forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
+        sysUserMapper.selectList().forEach(e -> doctorMap.put(e.getUserId(), e.getName()));
+
+        switch (bo.getType()) {
+            case 1 -> {
+
+                Map<Long, String> screeningTypeMap = new HashMap<>();
+                sysScreeningAssessmentConfigMapper.selectList().forEach(e -> screeningTypeMap.put(e.getConfigId(), e.getName()));
+
+                IPage<NutritionScreening> page = nutritionScreeningMapper.selectPage(
+                    pageQuery.build(),
+                    Wrappers.lambdaQuery(NutritionScreening.class)
+                        .ge(bo.getCreateTimeEarliest() != null, NutritionScreening::getCreateTime, bo.getCreateTimeEarliest())
+                        .le(bo.getCreateTimeLatest() != null, NutritionScreening::getCreateTime, bo.getCreateTimeLatest())
+                        .eq(bo.getDoctorDepartmentId() != null, NutritionScreening::getCreateDept, bo.getDoctorDepartmentId())
+                        .eq(bo.getConsultationType() != null, NutritionScreening::getVisitType, bo.getConsultationType())
+                        .in(!ids.isEmpty(), NutritionScreening::getPatientId, ids)
+                );
+
+                return TableDataInfo.build(page.convert(e -> {
+                    NutritionalScreeningVo vo = new NutritionalScreeningVo();
+                    vo.setCreateTime(e.getScreeningTime());
+                    vo.setDoctorName(doctorMap.get(e.getCreateBy()));
+                    vo.setDoctorDepartment(deptMap.get(e.getCreateDept()));
+                    patientList.forEach(patient -> {
+                        if (patient.getId().equals(e.getPatientId())) {
+                            vo.setSicknessArea(patient.getWardName());
+                            vo.setPatientName(patient.getTreatName());
+                            vo.setBmi(patient.getBmi());
+                            vo.setVisitType(Objects.equals(e.getVisitType(), "0") ? "门诊" : "住院");
+                            vo.setPatientDepartment(deptMap.get(patient.getDoorId()));
+                            vo.setMedicalId(patient.getTreatNum());
+                            vo.setHeight(patient.getHeight());
+                            vo.setWeight(patient.getWeight());
+                        }
+                    });
+                    vo.setScreeningType(screeningTypeMap.get(e.getConfigId()));
+                    vo.setScreeningScore(e.getScreeningScore());
+                    vo.setScreeningConclusion(e.getScreeningConclusion());
+                    return vo;
+                }));
+            }
+            case 2 -> {
+
+                Map<Long, String> configMap = new HashMap<>();
+                sysScreeningAssessmentConfigMapper.selectList().forEach(e -> configMap.put(e.getConfigId(), e.getName()));
+
+                IPage<NutritionEvaluation> page = nutritionEvaluationMapper.selectPage(
+                    pageQuery.build(),
+                    Wrappers.lambdaQuery(NutritionEvaluation.class)
+                        .ge(bo.getCreateTimeEarliest() != null, NutritionEvaluation::getCreateTime, bo.getCreateTimeEarliest())
+                        .le(bo.getCreateTimeLatest() != null, NutritionEvaluation::getCreateTime, bo.getCreateTimeLatest())
+                        .eq(bo.getDoctorDepartmentId() != null, NutritionEvaluation::getCreateDept, bo.getDoctorDepartmentId())
+                        .eq(bo.getConsultationType() != null, NutritionEvaluation::getVisitType, bo.getConsultationType())
+                        .in(!ids.isEmpty(), NutritionEvaluation::getPatientId, ids)
+                );
+
+                return TableDataInfo.build(page.convert(e -> {
+                    NutritionalEvaluationVo vo = new NutritionalEvaluationVo();
+                    vo.setCreateTime(e.getCreateTime());
+                    vo.setDoctor(doctorMap.get(e.getCreateBy()));
+                    vo.setDoctorDepartment(deptMap.get(e.getCreateDept()));
+
+                    patientList.forEach(patient -> {
+                        if (e.getPatientId().equals(patient.getId())) {
+                            vo.setConsultationType(Objects.equals(e.getVisitType(), "0") ? "门诊" : "住院");
+                            vo.setSicknessArea(patient.getWardName());
+                            vo.setPatientName(patient.getTreatName());
+                            vo.setBmi(patient.getBmi());
+                            vo.setPatientDepartment(deptMap.get(patient.getDoorId()));
+                            vo.setMedicalId(patient.getTreatNum());
+                            vo.setHeight(patient.getHeight());
+                            vo.setWeight(patient.getWeight());
+                            vo.setAdmissionId(patient.getOutpatientNo());
+                        }
+                    });
+
+                    vo.setEvaluationType(configMap.get(e.getConfigId()));
+                    vo.setEvaluationScore(new BigDecimal("0"));
+                    vo.setEvaluationConclusion(e.getContent());
+                    return vo;
+                }));
+            }
+            case 3 -> {
+
+                Map<Long, String> configMap = new HashMap<>();
+                Map<Long, String> screeningTypeMap = new HashMap<>();
+                Map<Long, String> diseaseLabelMap = new HashMap<>();
+
+                sysScreeningAssessmentConfigMapper.selectList().forEach(e -> configMap.put(e.getConfigId(), e.getName()));
+                sysScreeningAssessmentConfigMapper.selectList().forEach(e -> screeningTypeMap.put(e.getConfigId(), e.getName()));
+                sysDiseaseLabelMapper.selectList().forEach(e -> diseaseLabelMap.put(e.getLabelId(), e.getLabelName()));
+
+                IPage<NutritionDiagnosis> page = nutritionDiagnosisMapper.selectPage(
+                    pageQuery.build(),
+                    Wrappers.lambdaQuery(NutritionDiagnosis.class)
+                        .ge(bo.getCreateTimeEarliest() != null, NutritionDiagnosis::getCreateTime, bo.getCreateTimeEarliest())
+                        .le(bo.getCreateTimeLatest() != null, NutritionDiagnosis::getCreateTime, bo.getCreateTimeLatest())
+                        .eq(bo.getDoctorDepartmentId() != null, NutritionDiagnosis::getCreateDept, bo.getDoctorDepartmentId())
+                        .eq(bo.getConsultationType() != null, NutritionDiagnosis::getType, bo.getConsultationType())
+                        .in(!ids.isEmpty(), NutritionDiagnosis::getTreatmentUserId, ids)
+                );
+
+                return TableDataInfo.build(page.convert(e -> {
+                    NutritionalDiagnosisVo vo = new NutritionalDiagnosisVo();
+                    vo.setCreateTime(e.getCreateTime());
+                    vo.setDoctor(doctorMap.get(e.getCreateBy()));
+                    vo.setDoctorDepartment(deptMap.get(e.getCreateDept()));
+
+                    patientList.forEach(patient -> {
+                        if (e.getTreatmentUserId().equals(patient.getId())) {
+                            vo.setConsultationType(Objects.equals(e.getType(), "0") ? "门诊" : "住院");
+                            vo.setPatientName(patient.getTreatName());
+                            vo.setBmi(patient.getBmi());
+                            vo.setPatientDepartment(deptMap.get(patient.getDoorId()));
+                            vo.setMedicalId(patient.getTreatNum());
+                            vo.setHeight(patient.getHeight());
+                            vo.setWeight(patient.getWeight());
+                            vo.setAdmissionId(patient.getOutpatientNo());
+                        }
+                    });
+
+                    List<Long> diagnosisBasisIds = new ArrayList<>();
+                    if (e.getDiagnosisBasisId() != null && !e.getDiagnosisBasisId().isEmpty()) {
+                        String[] diagnosisBasisIdsInString = e.getDiagnosisBasisId().split(",");
+                        for (String diagnosisBasisId : diagnosisBasisIdsInString) diagnosisBasisIds.add(Long.valueOf(diagnosisBasisId));
+                        String diagnosisBasis = "";
+
+                        List<NutritionScreening> nutritionScreeningList = nutritionScreeningMapper.selectList(
+                            Wrappers.lambdaQuery(NutritionScreening.class)
+                                .in(!diagnosisBasisIds.isEmpty(), NutritionScreening::getId, diagnosisBasisIds)
+                        );
+                        List<NutritionEvaluation> nutritionEvaluationList = nutritionEvaluationMapper.selectList(
+                            Wrappers.lambdaQuery(NutritionEvaluation.class)
+                                .in(!diagnosisBasisIds.isEmpty(), NutritionEvaluation::getId, diagnosisBasisIds)
+                        );
+
+                        for (NutritionScreening nutritionScreening : nutritionScreeningList)
+                            diagnosisBasis += screeningTypeMap.get(nutritionScreening.getConfigId()) + ",";
+                        for (NutritionEvaluation nutritionEvaluation : nutritionEvaluationList)
+                            diagnosisBasis += configMap.get(nutritionEvaluation.getConfigId()) + ",";
+
+                        vo.setDiagnosisBasis(diagnosisBasis);
+                    }
+
+                    if (e.getDiagnosisLableId() != null && !e.getDiagnosisLableId().isEmpty()) {
+                        String[] diagnosisLabelIds = e.getDiagnosisLableId().split(",");
+                        String nutritionDiagnosis = "";
+
+                        for (String diagnosisLabelIdStr : diagnosisLabelIds)
+                            nutritionDiagnosis += diseaseLabelMap.get(Long.valueOf(diagnosisLabelIdStr)) + ",";
+
+                        vo.setNutritionDiagnosis(nutritionDiagnosis);
+                    }
+
+                    return vo;
+                }));
+            }
+            case 4 -> {
+
+                IPage<NutritionEducation> page = nutritionEducationMapper.selectPage(
+                    pageQuery.build(),
+                    Wrappers.lambdaQuery(NutritionEducation.class)
+                        .ge(bo.getCreateTimeEarliest() != null, NutritionEducation::getCreateTime, bo.getCreateTimeEarliest())
+                        .le(bo.getCreateTimeLatest() != null, NutritionEducation::getCreateTime, bo.getCreateTimeLatest())
+                        .eq(bo.getDoctorDepartmentId() != null, NutritionEducation::getCreateDept, bo.getDoctorDepartmentId())
+                        .eq(bo.getConsultationType() != null, NutritionEducation::getType, bo.getConsultationType())
+                        .in(!ids.isEmpty(), NutritionEducation::getPatientId, ids)
+                );
+
+                return TableDataInfo.build(page.convert(e -> {
+                    NutritionalEducationVo vo = new NutritionalEducationVo();
+                    vo.setCreateTime(e.getCreateTime());
+                    vo.setEducationTitle(e.getEducationTitle());
+                    vo.setDoctor(doctorMap.get(e.getCreateBy()));
+                    vo.setDoctorDepartment(deptMap.get(e.getCreateDept()));
+
+                    for (TreatmentUser patient : patientList) {
+                        if (e.getPatientId().equals(patient.getId())) {
+                            vo.setConsultationType(Objects.equals(e.getType(), "0") ? "门诊" : "住院");
+                            vo.setPatientName(patient.getTreatName());
+                            vo.setPatientDepartment(deptMap.get(patient.getDoorId()));
+                            vo.setAdmissionId(patient.getOutpatientNo());
+                            vo.setSicknessArea(patient.getWardName());
+                        }
+                    }
+
+                    return vo;
+                }));
+            }
+            default -> throw new RuntimeException("位置报表类型!");
+        }
+
+    }
+
 }

+ 212 - 212
ruoyi-admin/src/main/resources/application.yml

@@ -1,266 +1,266 @@
 # 开发环境配置
 server:
-  # 服务器的HTTP端口,默认为8080
-  port: 8080
-  servlet:
-    # 应用的访问路径
-    context-path: /
-  # undertow 配置
-  undertow:
-    # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
-    max-http-post-size: -1
-    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
-    # 每块buffer的空间大小,越小的空间被利用越充分
-    buffer-size: 512
-    # 是否分配的直接内存
-    direct-buffers: true
-    threads:
-      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
-      io: 8
-      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
-      worker: 256
+    # 服务器的HTTP端口,默认为8080
+    port: 8080
+    servlet:
+        # 应用的访问路径
+        context-path: /
+    # undertow 配置
+    undertow:
+        # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
+        max-http-post-size: -1
+        # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
+        # 每块buffer的空间大小,越小的空间被利用越充分
+        buffer-size: 512
+        # 是否分配的直接内存
+        direct-buffers: true
+        threads:
+            # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
+            io: 8
+            # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
+            worker: 256
 
 # 日志配置
 logging:
-  level:
-    org.dromara: @logging.level@
-    org.springframework: warn
-    org.mybatis.spring.mapper: error
-    org.apache.fury: warn
-  config: classpath:logback-plus.xml
+    level:
+        org.dromara: @logging.level@
+        org.springframework: warn
+        org.mybatis.spring.mapper: error
+        org.apache.fury: warn
+    config: classpath:logback-plus.xml
 
 # 用户配置
 user:
-  password:
-    # 密码最大错误次数
-    maxRetryCount: 5
-    # 密码锁定时间(默认10分钟)
-    lockTime: 10
+    password:
+        # 密码最大错误次数
+        maxRetryCount: 5
+        # 密码锁定时间(默认10分钟)
+        lockTime: 10
 
 # Spring配置
 spring:
-  application:
-    name: wkx-his
-  threads:
-    # 开启虚拟线程 仅jdk21可用
-    virtual:
-      enabled: false
-  # 资源信息
-  messages:
-    # 国际化资源文件路径
-    basename: i18n/messages
-  profiles:
-    active: @profiles.active@
-  # 文件上传
-  servlet:
-    multipart:
-      # 单个文件大小
-      max-file-size: 10MB
-      # 设置总上传的文件大小
-      max-request-size: 20MB
-  mvc:
-    # 设置静态资源路径 防止所有请求都去查静态资源
-    static-path-pattern: /static/**
-    format:
-      date-time: yyyy-MM-dd HH:mm:ss
-  jackson:
-    # 日期格式化
-    date-format: yyyy-MM-dd HH:mm:ss
-    serialization:
-      # 格式化输出
-      indent_output: false
-      # 忽略无法转换的对象
-      fail_on_empty_beans: false
-    deserialization:
-      # 允许对象忽略json中不存在的属性
-      fail_on_unknown_properties: false
+    application:
+        name: wkx-his
+    threads:
+        # 开启虚拟线程 仅jdk21可用
+        virtual:
+            enabled: false
+    # 资源信息
+    messages:
+        # 国际化资源文件路径
+        basename: i18n/messages
+    profiles:
+        active: @profiles.active@
+    # 文件上传
+    servlet:
+        multipart:
+            # 单个文件大小
+            max-file-size: 10MB
+            # 设置总上传的文件大小
+            max-request-size: 20MB
+    mvc:
+        # 设置静态资源路径 防止所有请求都去查静态资源
+        static-path-pattern: /static/**
+        format:
+            date-time: yyyy-MM-dd HH:mm:ss
+    jackson:
+        # 日期格式化
+        date-format: yyyy-MM-dd HH:mm:ss
+        serialization:
+            # 格式化输出
+            indent_output: false
+            # 忽略无法转换的对象
+            fail_on_empty_beans: false
+        deserialization:
+            # 允许对象忽略json中不存在的属性
+            fail_on_unknown_properties: false
 
 # Sa-Token配置
 sa-token:
-  # token名称 (同时也是cookie名称)
-  token-name: Authorization
-  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
-  is-concurrent: true
-  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
-  is-share: false
-  # jwt秘钥
-  jwt-secret-key: abcdefghijklmnopqrstuvwxyz
+    # token名称 (同时也是cookie名称)
+    token-name: Authorization
+    # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+    is-concurrent: true
+    # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+    is-share: false
+    # jwt秘钥
+    jwt-secret-key: abcdefghijklmnopqrstuvwxyz
 
 # security配置
 security:
-  # 排除路径
-  excludes:
-    - /*.html
-    - /**/*.html
-    - /**/*.css
-    - /**/*.js
-    - /favicon.ico
-    - /error
-    - /*/api-docs
-    - /*/api-docs/**
-    - /warm-flow-ui/config
+    # 排除路径
+    excludes:
+        - /*.html
+        - /**/*.html
+        - /**/*.css
+        - /**/*.js
+        - /favicon.ico
+        - /error
+        - /*/api-docs
+        - /*/api-docs/**
+        - /warm-flow-ui/config
 
 # 多租户配置
 tenant:
-  # 是否开启
-  enable: true
-  # 排除表
-  excludes:
-    - sys_menu
-    - sys_tenant
-    - sys_tenant_package
-    - sys_role_dept
-    - sys_role_menu
-    - sys_user_post
-    - sys_user_role
-    - sys_client
-    - sys_oss_config
+    # 是否开启
+    enable: true
+    # 排除表
+    excludes:
+        - sys_menu
+        - sys_tenant
+        - sys_tenant_package
+        - sys_role_dept
+        - sys_role_menu
+        - sys_user_post
+        - sys_user_role
+        - sys_client
+        - sys_oss_config
 
 # MyBatisPlus配置
 # https://baomidou.com/config/
 mybatis-plus:
-  # 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效
-  enableLogicDelete: true
-  # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper
-  mapperPackage: org.dromara.**.mapper
-  # 对应的 XML 文件位置
-  mapperLocations: classpath*:mapper/**/*Mapper.xml
-  # 实体扫描,多个package用逗号或者分号分隔
-  typeAliasesPackage: org.dromara.**.domain
-  global-config:
-    dbConfig:
-      # 主键类型
-      # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
-      # 如需改为自增 需要将数据库表全部设置为自增
-      idType: ASSIGN_ID
+    # 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效
+    enableLogicDelete: true
+    # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper
+    mapperPackage: org.dromara.**.mapper
+    # 对应的 XML 文件位置
+    mapperLocations: classpath*:mapper/**/*Mapper.xml
+    # 实体扫描,多个package用逗号或者分号分隔
+    typeAliasesPackage: org.dromara.**.domain
+    global-config:
+        dbConfig:
+            # 主键类型
+            # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
+            # 如需改为自增 需要将数据库表全部设置为自增
+            idType: ASSIGN_ID
 
 # 数据加密
 mybatis-encryptor:
-  # 是否开启加密
-  enable: false
-  # 默认加密算法
-  algorithm: BASE64
-  # 编码方式 BASE64/HEX。默认BASE64
-  encode: BASE64
-  # 安全秘钥 对称算法的秘钥 如:AES,SM4
-  password:
-  # 公私钥 非对称算法的公私钥 如:SM2,RSA
-  publicKey:
-  privateKey:
+    # 是否开启加密
+    enable: false
+    # 默认加密算法
+    algorithm: BASE64
+    # 编码方式 BASE64/HEX。默认BASE64
+    encode: BASE64
+    # 安全秘钥 对称算法的秘钥 如:AES,SM4
+    password:
+    # 公私钥 非对称算法的公私钥 如:SM2,RSA
+    publicKey:
+    privateKey:
 
 # api接口加密
 api-decrypt:
-  # 是否开启全局接口加密
-  enabled: true
-  # AES 加密头标识
-  headerFlag: encrypt-key
-  # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
-  # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
-  publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ==
-  # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
-  # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
-  privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
+    # 是否开启全局接口加密
+    enabled: true
+    # AES 加密头标识
+    headerFlag: encrypt-key
+    # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
+    # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
+    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ==
+    # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
+    # 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
+    privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
 
 springdoc:
-  api-docs:
-    # 是否开启接口文档
-    enabled: true
-  info:
-    # 标题
-    title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档'
-    # 描述
-    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
-    # 版本
-    version: '版本号: ${ruoyi.version}'
-    # 作者信息
-    contact:
-      name: Lion Li
-      email: crazylionli@163.com
-      url: https://gitee.com/dromara/RuoYi-Vue-Plus
-  components:
-    # 鉴权方式配置
-    security-schemes:
-      apiKey:
-        type: APIKEY
-        in: HEADER
-        name: ${sa-token.token-name}
-  #这里定义了两个分组,可定义多个,也可以不定义
-  group-configs:
-    - group: 1.演示模块
-      packages-to-scan: org.dromara.demo
-    - group: 2.通用模块
-      packages-to-scan: org.dromara.web
-    - group: 3.系统模块
-      packages-to-scan: org.dromara.system
-    - group: 4.代码生成模块
-      packages-to-scan: org.dromara.generator
-    - group: 5.工作流模块
-      packages-to-scan: org.dromara.workflow
+    api-docs:
+        # 是否开启接口文档
+        enabled: true
+    info:
+        # 标题
+        title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档'
+        # 描述
+        description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
+        # 版本
+        version: '版本号: ${ruoyi.version}'
+        # 作者信息
+        contact:
+            name: Lion Li
+            email: crazylionli@163.com
+            url: https://gitee.com/dromara/RuoYi-Vue-Plus
+    components:
+        # 鉴权方式配置
+        security-schemes:
+            apiKey:
+                type: APIKEY
+                in: HEADER
+                name: ${sa-token.token-name}
+    #这里定义了两个分组,可定义多个,也可以不定义
+    group-configs:
+        -   group: 1.演示模块
+            packages-to-scan: org.dromara.demo
+        -   group: 2.通用模块
+            packages-to-scan: org.dromara.web
+        -   group: 3.系统模块
+            packages-to-scan: org.dromara.system
+        -   group: 4.代码生成模块
+            packages-to-scan: org.dromara.generator
+        -   group: 5.工作流模块
+            packages-to-scan: org.dromara.workflow
 
 # 防止XSS攻击
 xss:
-  # 过滤开关
-  enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludeUrls:
-    - /system/notice
+    # 过滤开关
+    enabled: true
+    # 排除链接(多个用逗号分隔)
+    excludeUrls:
+        - /system/notice
 
 # 全局线程池相关配置
 # 如使用JDK21请直接使用虚拟线程 不要开启此配置
 thread-pool:
-  # 是否开启线程池
-  enabled: false
-  # 队列最大长度
-  queueCapacity: 128
-  # 线程池维护线程所允许的空闲时间
-  keepAliveSeconds: 300
+    # 是否开启线程池
+    enabled: false
+    # 队列最大长度
+    queueCapacity: 128
+    # 线程池维护线程所允许的空闲时间
+    keepAliveSeconds: 300
 
 --- # 分布式锁 lock4j 全局配置
 lock4j:
-  # 获取分布式锁超时时间,默认为 3000 毫秒
-  acquire-timeout: 3000
-  # 分布式锁的超时时间,默认为 30 秒
-  expire: 30000
+    # 获取分布式锁超时时间,默认为 3000 毫秒
+    acquire-timeout: 3000
+    # 分布式锁的超时时间,默认为 30 秒
+    expire: 30000
 
 --- # Actuator 监控端点的配置项
 management:
-  endpoints:
-    web:
-      exposure:
-        include: '*'
-  endpoint:
-    health:
-      show-details: ALWAYS
-    logfile:
-      external-file: ./logs/sys-console.log
+    endpoints:
+        web:
+            exposure:
+                include: '*'
+    endpoint:
+        health:
+            show-details: ALWAYS
+        logfile:
+            external-file: ./logs/sys-console.log
 
 --- # 默认/推荐使用sse推送
 sse:
-  enabled: true
-  path: /resource/sse
+    enabled: false
+    path: /resource/sse
 
 --- # websocket
 websocket:
-  # 如果关闭 需要和前端开关一起关闭
-  enabled: false
-  # 路径
-  path: /resource/websocket
-  # 设置访问源地址
-  allowedOrigins: '*'
+    # 如果关闭 需要和前端开关一起关闭
+    enabled: false
+    # 路径
+    path: /resource/websocket
+    # 设置访问源地址
+    allowedOrigins: '*'
 
 --- # warm-flow工作流配置
 warm-flow:
-  # 是否开启工作流,默认true
-  enabled: false
-  # 是否开启设计器ui
-  ui: true
-  # 默认Authorization,如果有多个token,用逗号分隔
-  token-name: ${sa-token.token-name},clientid
-  # 流程状态对应的三元色
-  chart-status-color:
-    ## 未办理
-    - 62,62,62
-    ## 待办理
-    - 255,205,23
-    ## 已办理
-    - 157,255,0
+    # 是否开启工作流,默认true
+    enabled: false
+    # 是否开启设计器ui
+    ui: true
+    # 默认Authorization,如果有多个token,用逗号分隔
+    token-name: ${sa-token.token-name},clientid
+    # 流程状态对应的三元色
+    chart-status-color:
+        ## 未办理
+        - 62,62,62
+        ## 待办理
+        - 255,205,23
+        ## 已办理
+        - 157,255,0

Fichier diff supprimé car celui-ci est trop grand
+ 66 - 0
script/sql/biz/dump_2025_08_21.sql


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff