From 59e827830f2866a82cf1714fe2941cb0bd380c0a Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Wed, 17 Sep 2025 18:33:28 +0800
Subject: [PATCH] 1

---
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceFeatureDto.java            |   23 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java |  272 ++++++++++++++++++++++++++++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/im/util/ConverterUtil.java                             |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java                   |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java      |   63 +++++++++
 5 files changed, 359 insertions(+), 2 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/ConverterUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/ConverterUtil.java
index b540fca..22f2d5f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/util/ConverterUtil.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/ConverterUtil.java
@@ -5,7 +5,6 @@
 import java.util.List;
 
 /**
- * @program: dabaogp
  * @description:
  * @create: 2024-08-19 18:29
  **/
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
new file mode 100644
index 0000000..dc8f09d
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
@@ -0,0 +1,272 @@
+package com.ruoyi.web.controller.product;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.im.util.ConverterUtil;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.InsuranceFeature;
+import com.ruoyi.system.domain.InsuranceProduct;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.domain.dto.InsuranceProductUpdateDTO;
+import com.ruoyi.system.service.InsuranceFeatureService;
+import com.ruoyi.system.service.InsuranceProductService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.utils.PageUtils.startPage;
+
+/**
+ * @program: ruoyiim
+ * @description:保险产品
+ * @create: 2025-09-17 17:17
+ **/
+@RestController
+@RequestMapping("/product")
+public class InsuranceProductController extends BaseController {
+
+    @Autowired
+    InsuranceProductService insuranceProductService;
+
+    @Autowired
+    InsuranceFeatureService insuranceFeatureService;
+
+    /**
+     * 修改产品信息(包含产品特色)
+     */
+    @PostMapping("/update")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult update(@Valid @RequestBody InsuranceProductUpdateDTO dto) {
+        // 1. 查询产品是否存在
+        InsuranceProduct insuranceProduct = insuranceProductService.getById(dto.getId());
+        if (insuranceProduct == null) {
+            return AjaxResult.error("产品不存在");
+        }
+
+        // 2. 更新产品基本信息
+        insuranceProduct.setProductName(dto.getProductName());
+        insuranceProduct.setProductCode(dto.getProductCode());
+        insuranceProduct.setDescription(dto.getDescription());
+        insuranceProduct.setCoverageAmount(dto.getCoverageAmount());
+        insuranceProduct.setPremium(dto.getPremium());
+        insuranceProduct.setTerm(dto.getTerm());
+
+        // 处理枚举状态
+        if (dto.getStatus() != null) {
+            try {
+                InsuranceProduct.ProductStatus status =
+                        InsuranceProduct.ProductStatus.valueOf(dto.getStatus().toUpperCase());
+                insuranceProduct.setStatus(status);
+            } catch (IllegalArgumentException e) {
+                return AjaxResult.error("产品状态参数错误");
+            }
+        }
+
+        insuranceProduct.setHospitalNumber(dto.getHospitalNumber());
+        insuranceProduct.setGuaranteeExplanation(dto.getGuaranteeExplanation());
+        insuranceProduct.setInsureAge(dto.getInsureAge());
+        insuranceProduct.setObligationDisclose(dto.getObligationDisclose());
+        insuranceProduct.setProductFeature(dto.getProductFeature());
+        insuranceProduct.setLiabilityExemption(dto.getLiabilityExemption());
+        insuranceProduct.setImg1(dto.getImg1());
+        insuranceProduct.setImg2(dto.getImg2());
+
+        // 3. 更新产品信息
+        boolean productSuccess = insuranceProductService.updateById(insuranceProduct);
+
+        if (!productSuccess) {
+            return AjaxResult.error("产品信息更新失败");
+        }
+
+        // 4. 处理产品特色
+        if (dto.getFeatureDtoList() != null && !dto.getFeatureDtoList().isEmpty()) {
+            try {
+                // 先删除该产品原有的所有特色
+                deleteByProductId(insuranceProduct.getId());
+
+                // 转换DTO为实体并设置产品ID
+                List<InsuranceFeature> features = dto.getFeatureDtoList().stream()
+                        .map(f -> {
+                            InsuranceFeature insuranceFeature = new InsuranceFeature();
+                            insuranceFeature.setProductId(insuranceProduct.getId());
+                            insuranceFeature.setTitle(f.getTitle());
+                            insuranceFeature.setDetail(f.getDetail());
+                            insuranceFeature.setCreatedAt(LocalDateTime.now());
+                            insuranceFeature.setUpdatedAt(LocalDateTime.now());
+                            return insuranceFeature;
+                        })
+                        .collect(Collectors.toList());
+
+                // 批量保存新的产品特色
+                boolean featureSuccess = insuranceFeatureService.saveBatch(features);
+
+                if (!featureSuccess) {
+                    throw new RuntimeException("产品特色保存失败");
+                }
+            } catch (Exception e) {
+                // 事务会回滚
+                return AjaxResult.error("产品特色处理失败: " + e.getMessage());
+            }
+        } else {
+            // 如果传入的特色列表为空,则删除所有特色
+            deleteByProductId(insuranceProduct.getId());
+        }
+
+        return AjaxResult.success("保存成功!");
+    }
+
+    public void deleteByProductId(Integer productId) {
+        LambdaQueryWrapper<InsuranceFeature> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InsuranceFeature::getProductId, productId);
+        insuranceFeatureService.remove(wrapper);
+    }
+
+    /**
+     * 查询产品信息
+     */
+    @GetMapping("/get")
+    public AjaxResult get(@RequestParam(value = "id") Integer id) {
+        InsuranceProduct insuranceProduct = insuranceProductService.getById(id);
+        return AjaxResult.success(insuranceProduct);
+    }
+
+    /**
+     * 产品信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(InsuranceProductUpdateDTO dto) {
+        startPage();
+
+        LambdaQueryWrapper<InsuranceProduct> wrapper = new LambdaQueryWrapper<>();
+
+        // 产品名称模糊查询
+        if (StringUtils.isNotBlank(dto.getProductName())) {
+            wrapper.like(InsuranceProduct::getProductName, dto.getProductName());
+        }
+
+        // 产品代码模糊查询
+        if (StringUtils.isNotBlank(dto.getProductCode())) {
+            wrapper.like(InsuranceProduct::getProductCode, dto.getProductCode());
+        }
+
+        // 产品状态精确查询
+        if (dto.getStatus() != null) {
+            wrapper.eq(InsuranceProduct::getStatus, dto.getStatus());
+        }
+
+        // 按创建时间倒序排列
+        wrapper.orderByDesc(InsuranceProduct::getCreatedAt);
+
+        List<InsuranceProduct> list = insuranceProductService.list(wrapper);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增产品(包含产品特色)
+     */
+    @PostMapping("/create")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult create(@Valid @RequestBody InsuranceProductUpdateDTO dto) {
+        // 1. 检查产品代码是否已存在
+        long count = insuranceProductService.count(new LambdaQueryWrapper<InsuranceProduct>().eq(InsuranceProduct::getProductCode, dto.getProductCode()));
+        if (count > 0) {
+            return AjaxResult.error("产品代码已存在");
+        }
+
+        // 2. 创建产品基本信息
+        InsuranceProduct product = new InsuranceProduct();
+        product.setProductName(dto.getProductName());
+        product.setProductCode(dto.getProductCode());
+        product.setDescription(dto.getDescription());
+        product.setCoverageAmount(dto.getCoverageAmount());
+        product.setPremium(dto.getPremium());
+        product.setTerm(dto.getTerm());
+
+        // 处理状态
+        if (dto.getStatus() != null) {
+            try {
+                InsuranceProduct.ProductStatus status =
+                        InsuranceProduct.ProductStatus.valueOf(dto.getStatus().toUpperCase());
+                product.setStatus(status);
+            } catch (IllegalArgumentException e) {
+                return AjaxResult.error("产品状态参数错误");
+            }
+        } else {
+            product.setStatus(InsuranceProduct.ProductStatus.INACTIVE); // 默认下架
+        }
+
+        product.setHospitalNumber(dto.getHospitalNumber());
+        product.setGuaranteeExplanation(dto.getGuaranteeExplanation());
+        product.setInsureAge(dto.getInsureAge());
+        product.setObligationDisclose(dto.getObligationDisclose());
+        product.setProductFeature(dto.getProductFeature());
+        product.setLiabilityExemption(dto.getLiabilityExemption());
+        product.setImg1(dto.getImg1());
+        product.setImg2(dto.getImg2());
+
+        // 设置创建时间和更新时间
+        product.setCreatedAt(LocalDateTime.now());
+        product.setUpdatedAt(LocalDateTime.now());
+
+        // 3. 保存产品信息
+        boolean productSuccess = insuranceProductService.save(product);
+
+        if (!productSuccess) {
+            return AjaxResult.error("产品创建失败");
+        }
+
+        // 4. 处理产品特色
+        if (dto.getFeatureDtoList() != null && !dto.getFeatureDtoList().isEmpty()) {
+            try {
+                // 转换DTO为实体并设置产品ID
+                List<InsuranceFeature> features = dto.getFeatureDtoList().stream()
+                        .map(f -> {
+                            InsuranceFeature insuranceFeature = new InsuranceFeature();
+                            insuranceFeature.setProductId(product.getId());
+                            insuranceFeature.setTitle(f.getTitle());
+                            insuranceFeature.setDetail(f.getDetail());
+                            insuranceFeature.setCreatedAt(LocalDateTime.now());
+                            insuranceFeature.setUpdatedAt(LocalDateTime.now());
+                            return insuranceFeature;
+                        })
+                        .collect(Collectors.toList());
+
+                // 批量保存产品特色
+                boolean featureSuccess = insuranceFeatureService.saveBatch(features);
+
+                if (!featureSuccess) {
+                    throw new RuntimeException("产品特色保存失败");
+                }
+            } catch (Exception e) {
+                // 事务会回滚
+                return AjaxResult.error("产品特色处理失败: " + e.getMessage());
+            }
+        }
+
+        return AjaxResult.success("创建成功");
+    }
+
+    /**
+     * 删除产品
+     */
+    @DeleteMapping("/{id}")
+    public AjaxResult delete(@PathVariable Integer id) {
+        InsuranceProduct product = insuranceProductService.getById(id);
+        if (product == null) {
+            return AjaxResult.error("产品不存在");
+        }
+
+        boolean success = insuranceProductService.removeById(id);
+        return success ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
index d449a4c..922d668 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
@@ -15,7 +15,7 @@
 
     // 产品ID
     @TableId(type = IdType.AUTO)
-    private Integer productId;
+    private Integer id;
 
     // 产品名称
     private String productName;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceFeatureDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceFeatureDto.java
new file mode 100644
index 0000000..964e68a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceFeatureDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.domain.dto;
+
+import lombok.Data;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-09-17 17:54
+ **/
+@Data
+public class InsuranceFeatureDto {
+
+    // 保险产品ID
+    private Integer productId;
+
+    // 特色标题
+    private String title;
+
+    // 特色详情
+    private String detail;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
new file mode 100644
index 0000000..65a7fbd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
@@ -0,0 +1,63 @@
+package com.ruoyi.system.domain.dto;
+
+import lombok.Data;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 保险产品更新DTO
+ */
+@Data
+public class InsuranceProductUpdateDTO {
+
+    // 产品ID
+    private Integer id;
+
+    // 产品名称
+    private String productName;
+
+    // 产品代码
+    private String productCode;
+
+    // 保障详情
+    private String description;
+
+    // 保额
+    private BigDecimal coverageAmount;
+
+    // 保费
+    private BigDecimal premium;
+
+    // 保险期限
+    private String term;
+
+    // 产品状态
+    private String status;
+
+    // 医院数量
+    private Integer hospitalNumber;
+
+    // 保障说明
+    private String guaranteeExplanation;
+
+    // 投保年龄
+    private String insureAge;
+
+    // 告知义务
+    private String obligationDisclose;
+
+    // 产品特色
+    private String productFeature;
+
+    // 投保须知
+    private String liabilityExemption;
+
+    //产品特色
+    List<InsuranceFeatureDto> featureDtoList;
+
+    // 图片1
+    private String img1;
+
+    // 图片2
+    private String img2;
+}
\ No newline at end of file

--
Gitblit v1.9.3