Bladeren bron

产品树 导入导出

wanggaokun 9 maanden geleden
bovenliggende
commit
6eff2d6543

+ 1 - 1
als-common/common-orm/src/main/java/org/eco/common/orm/core/domain/TreeEntity.java

@@ -24,7 +24,7 @@ public class TreeEntity extends BaseEntity {
     /**
      * 父级名称
      */
-//    @Column(ignore = true)
+    @ExcelProperty(value = "上级名称")
     private String parentName;
 
     /**

+ 27 - 27
als-modules/agile-assurance/src/main/java/org/eco/als/controller/ProductController.java

@@ -34,12 +34,12 @@ import java.util.List;
  * 产品树Controller
  *
  * @author wgk
- * @date 2024-07-18
+ * @date 2024-07-19
  */
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/als/product" )
+@RequestMapping("/als/product")
 public class ProductController extends BaseController {
     @Resource
     private IProductService productService;
@@ -47,8 +47,8 @@ public class ProductController extends BaseController {
     /**
      * 查询产品树列表
      */
-    @SaCheckPermission("als:product:list" )
-    @GetMapping("/list" )
+    @SaCheckPermission("als:product:list")
+    @GetMapping("/list")
     public CommonResult<List<ProductVo>> list(ProductBo productBo) {
         List<ProductVo> list = productService.selectList(productBo);
         return CommonResult.success(list);
@@ -57,28 +57,28 @@ public class ProductController extends BaseController {
     /**
      * 导出产品树列表
      */
-    @SaCheckPermission("als:product:export" )
-    @Log(title = "产品树" , businessType = BusinessType.EXPORT)
-    @PostMapping("/export" )
-    public CommonResult<Void> export(HttpServletResponse response, ProductBo productBo) {
+    @SaCheckPermission("als:product:export")
+    @Log(title = "产品树", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public CommonResult<Void> export(ProductBo productBo) {
         LoginUser loginUser = LoginHelper.getLoginUser();
         List<ProductVo> list = productService.selectList(productBo);
-        productService.asyncExport(list, "产品树" , loginUser);
+        productService.asyncExport(list, "产品树", loginUser);
         return CommonResult.success();
     }
 
-    @SaCheckPermission("als:product:import" )
-    @PostMapping("/importTemplate" )
+    @SaCheckPermission("als:product:import")
+    @PostMapping("/importTemplate")
     public void importTemplate(HttpServletResponse response) {
-        ExcelUtil.exportExcel(new ArrayList<>(), "产品树" , ProductImportVo.class, response);
+        ExcelUtil.exportExcel(new ArrayList<>(), "产品树", ProductImportVo.class, response);
     }
 
     /**
      * 导入产品树列表
      */
-    @Log(title = "产品树" , businessType = BusinessType.IMPORT)
-    @SaCheckPermission("als:product:import" )
-    @PostMapping("/importData" )
+    @Log(title = "产品树", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("als:product:import")
+    @PostMapping("/importData")
     public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) {
         LoginUser loginUser = LoginHelper.getLoginUser();
         productService.asyncImportData(file, updateSupport, loginUser);
@@ -88,8 +88,8 @@ public class ProductController extends BaseController {
     /**
      * 获取产品树详细信息
      */
-    @SaCheckPermission("als:product:query" )
-    @GetMapping(value = "/{id}" )
+    @SaCheckPermission("als:product:query")
+    @GetMapping(value = "/{id}")
     public CommonResult<ProductVo> getInfo(@PathVariable Long id) {
         return CommonResult.success(productService.selectById(id));
     }
@@ -97,14 +97,14 @@ public class ProductController extends BaseController {
     /**
      * 新增产品树
      */
-    @SaCheckPermission("als:product:add" )
-    @Log(title = "产品树" , businessType = BusinessType.INSERT)
+    @SaCheckPermission("als:product:add")
+    @Log(title = "产品树", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping
     public CommonResult<Void> add(@Validated @RequestBody ProductBo productBo) {
         boolean inserted = productService.insert(productBo);
         if (!inserted) {
-            return CommonResult.fail("新增产品树记录失败!" );
+            return CommonResult.fail("新增产品树记录失败!");
         }
         return CommonResult.success();
     }
@@ -112,14 +112,14 @@ public class ProductController extends BaseController {
     /**
      * 修改产品树
      */
-    @SaCheckPermission("als:product:edit" )
-    @Log(title = "产品树" , businessType = BusinessType.UPDATE)
+    @SaCheckPermission("als:product:edit")
+    @Log(title = "产品树", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping
     public CommonResult<Void> edit(@Validated @RequestBody ProductBo productBo) {
         boolean updated = productService.update(productBo);
         if (!updated) {
-            return CommonResult.fail("修改产品树记录失败!" );
+            return CommonResult.fail("修改产品树记录失败!");
         }
         return CommonResult.success();
     }
@@ -127,13 +127,13 @@ public class ProductController extends BaseController {
     /**
      * 删除产品树
      */
-    @SaCheckPermission("als:product:remove" )
-    @Log(title = "产品树" , businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}" )
+    @SaCheckPermission("als:product:remove")
+    @Log(title = "产品树", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
     public CommonResult<Void> remove(@PathVariable Long[] ids) {
         boolean deleted = productService.deleteByIds(ids);
         if (!deleted) {
-            return CommonResult.fail("删除产品树记录失败!" );
+            return CommonResult.fail("删除产品树记录失败!");
         }
         return CommonResult.success();
     }

+ 2 - 0
als-modules/agile-assurance/src/main/java/org/eco/als/domain/bo/ProductBo.java

@@ -1,5 +1,6 @@
 package org.eco.als.domain.bo;
 
+import com.mybatisflex.annotation.Id;
 import io.github.linpeilie.annotations.AutoMapper;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
@@ -20,6 +21,7 @@ public class ProductBo extends TreeEntity {
     /**
      * 编号
      */
+    @Id
     private Long id;
 
     /**

+ 2 - 2
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/AircraftImportVo.java

@@ -31,9 +31,9 @@ public class AircraftImportVo implements Serializable {
     private String parentId;
 
     /**
-     * 机型Id
+     * 机型
      */
-    @ExcelProperty(value = "级名称" )
+    @ExcelProperty(value = "级名称" )
     private String parentName;
 
     /**

+ 14 - 6
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductImportVo.java

@@ -1,5 +1,6 @@
 package org.eco.als.domain.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -11,29 +12,33 @@ import java.io.Serializable;
  * 产品树导入视图对象 als_product_t
  *
  * @author wgk
- * @date 2024-07-18
+ * @date 2024-07-19
  */
 
 @Data
 @NoArgsConstructor
+@ExcelIgnoreUnannotated
 public class ProductImportVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
-
     /**
      * 编号
      */
-    @ExcelProperty(value = "编号")
     private Long id;
 
     /**
      * 父id
      */
-    @ExcelProperty(value = "父id")
     private Long parentId;
 
+    /**
+     * 机型
+     */
+    @ExcelProperty(value = "上级名称" )
+    private String parentName;
+
     /**
      * SNS编号
      */
@@ -49,8 +54,11 @@ public class ProductImportVo implements Serializable {
     /**
      * 删除标识(1删除 0未删除)
      */
-    @ExcelProperty(value = "删除标识(1删除 0未删除)")
     private Integer delFlag;
 
-
+    /**
+     * 显示顺序
+     */
+    @ExcelProperty(value = "显示顺序")
+    private Integer orderNum;
 }

+ 0 - 1
als-modules/agile-assurance/src/main/java/org/eco/als/domain/vo/ProductVo.java

@@ -49,7 +49,6 @@ public class ProductVo extends TreeEntity implements Serializable {
     /**
      * 删除标识(1删除 0未删除)
      */
-    @ExcelProperty(value = "删除标识(1删除 0未删除)")
     private Integer delFlag;
 
     /**

+ 20 - 15
als-modules/agile-assurance/src/main/java/org/eco/als/listener/ProductImportListener.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.mybatisflex.core.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.eco.als.domain.bo.ProductBo;
 import org.eco.als.domain.vo.ProductImportVo;
@@ -29,10 +30,10 @@ public class ProductImportListener extends AnalysisEventListener<ProductImportVo
 
     private final Boolean isUpdateSupport;
     private final LoginUser loginUser;
-    private final StringBuilder successMsg = new StringBuilder();
-    private final StringBuilder failureMsg = new StringBuilder();
     private int successNum = 0;
     private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
 
     public ProductImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
         this.productService = SpringUtils.getBean(IProductService.class);
@@ -43,27 +44,26 @@ public class ProductImportListener extends AnalysisEventListener<ProductImportVo
     @Override
     public void invoke(ProductImportVo productVo, AnalysisContext context) {
         try {
-
             ProductBo productBo = BeanUtil.toBean(productVo, ProductBo.class);
-
-            //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新
-            ProductVo productVo1 = null;
-
-            productVo1 = productService.selectById(productVo.getId());
+            QueryWrapper queryWrapper = QueryWrapper.create();
+            queryWrapper.where("name = ?", productBo.getName());
+            queryWrapper.and("parent_name = ?", productBo.getParentName());
+            queryWrapper.or("(name = ?", productBo.getName()).and("parent_id = ?)", 0);
+            ProductVo productVo1 = productService.getOneAs(queryWrapper, ProductVo.class);
+            ProductVo productVo2 = productService.selectByName(productBo.getParentName());
             if (ObjectUtil.isNull(productVo1)) {
                 //不存在就新增
-                productBo.setVersion(0);
+                setBo(productBo);
+                productBo.setParentId(ObjectUtil.isNull(productVo2) ? 0 : productVo2.getId());
+                productBo.setParentName(ObjectUtil.isNull(productVo2) ? "" : productVo2.getName());
                 ValidatorUtils.validate(productBo);
-                boolean inserted = productService.insertWithPk(productBo);//树表需要前台传来主键值
-
+                boolean inserted = productService.insert(productBo);//树表需要前台传来主键值
                 if (inserted) {
                     successNum++;
                     successMsg.append("<br/>").append(successNum).append("、产品树 记录导入成功");
-                    return;
                 } else {
                     failureNum++;
                     failureMsg.append("<br/>").append(failureNum).append("、产品树 记录导入失败");
-                    return;
                 }
             } else if (isUpdateSupport) {
                 //存在就更新
@@ -73,11 +73,9 @@ public class ProductImportListener extends AnalysisEventListener<ProductImportVo
                 if (updated) {
                     successNum++;
                     successMsg.append("<br/>").append(successNum).append("、产品树 记录更新成功");
-                    return;
                 } else {
                     failureNum++;
                     failureMsg.append("<br/>").append(failureNum).append("、产品树 记录更新失败");
-                    return;
                 }
             }
         } catch (Exception e) {
@@ -88,6 +86,13 @@ public class ProductImportListener extends AnalysisEventListener<ProductImportVo
         }
     }
 
+    private void setBo(ProductBo productBo) {
+        productBo.setVersion(0);
+        productBo.setCreateBy(loginUser.getUserId());
+        productBo.setUpdateBy(loginUser.getUserId());
+        productBo.setTenantId(loginUser.getTenantId());
+    }
+
     @Override
     public void doAfterAllAnalysed(AnalysisContext context) {
         log.info("解析完成");

+ 17 - 1
als-modules/agile-assurance/src/main/java/org/eco/als/service/IProductService.java

@@ -14,7 +14,7 @@ import java.util.List;
  * 产品树Service接口
  *
  * @author wgk
- * @date 2024-07-18
+ * @date 2024-07-19
  */
 public interface IProductService extends IBaseService<Product> {
     /**
@@ -25,6 +25,14 @@ public interface IProductService extends IBaseService<Product> {
      */
     ProductVo selectById(Long id);
 
+    /**
+     * 查询产品树
+     *
+     * @param name 产品树
+     * @return 产品树
+     */
+    ProductVo selectByName(String name);
+
     /**
      * 查询产品树列表
      *
@@ -50,6 +58,14 @@ public interface IProductService extends IBaseService<Product> {
      */
     boolean insertWithPk(ProductBo productBo);
 
+    /**
+     * 新增产品树,前台提供唯一名称,一般用于导入的场合
+     *
+     * @param productBo 产品树Bo
+     * @return 结果:true 操作成功,false 操作失败
+     */
+    boolean insertWithName(ProductBo productBo);
+
     /**
      * 修改产品树
      *

+ 45 - 13
als-modules/agile-assurance/src/main/java/org/eco/als/service/impl/ProductServiceImpl.java

@@ -33,7 +33,7 @@ import static org.eco.als.domain.table.ProductTableDef.PRODUCT;
  * 产品树Service业务层处理
  *
  * @author wgk
- * @date 2024-07-18
+ * @date 2024-07-19
  */
 @Service
 @Slf4j
@@ -75,6 +75,17 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
 
     }
 
+    /**
+     * 查询产品树
+     *
+     * @param name 产品树主键
+     * @return 产品树
+     */
+    @Override
+    public ProductVo selectByName(String name) {
+        return this.getOneAs(query().where(PRODUCT.NAME.eq(name)), ProductVo.class);
+    }
+
     /**
      * 查询产品树列表
      *
@@ -97,6 +108,7 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
     @Override
     public boolean insert(ProductBo productBo) {
         Product product = MapstructUtils.convert(productBo, Product.class);
+
         return this.save(product);//使用全局配置的雪花算法主键生成器生成ID值
     }
 
@@ -111,6 +123,7 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
         Product product = MapstructUtils.convert(productBo, Product.class);
 
         //获取祖级列表字段
+        assert product != null;
         Long parentId = product.getParentId();
         if (parentId == 0) {
             product.setAncestors("0");
@@ -126,6 +139,25 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
         return productMapper.insertWithPk(product) > 0;//前台传来主键值
     }
 
+    @Override
+    public boolean insertWithName(ProductBo productBo) {
+        Product product = MapstructUtils.convert(productBo, Product.class);
+        assert product != null;
+        //获取祖级列表
+        ProductVo productVo = this.selectByName(product.getParentName());
+        if (productVo.getParentId() == 0) {
+            product.setAncestors("0");
+        } else {
+            ProductVo parentProduct = selectById(productBo.getParentId());
+            if (ObjectUtil.isNotNull(parentProduct)) {
+                product.setAncestors(parentProduct.getAncestors() + "," + productVo.getParentId());
+            } else {
+                product.setAncestors("0");
+            }
+        }
+        return productMapper.insert(product) > 0;//前台传来主键值
+    }
+
     /**
      * 修改产品树
      *
@@ -136,8 +168,7 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
     public boolean update(ProductBo productBo) {
         Product product = MapstructUtils.convert(productBo, Product.class);
         if (ObjectUtil.isNotNull(product) && ObjectUtil.isNotNull(product.getId())) {
-            boolean updated = this.updateById(product);
-            return updated;
+            return this.updateById(product);
         }
         return false;
     }
@@ -151,11 +182,7 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
-        ImportExportBo bo = new ImportExportBo();
-        BeanUtils.copyProperties(result, bo);
-        bo.setUpdateBy(loginUser.getUserId());
-        bo.setCreateBy(loginUser.getUserId());
-        bo.setType("0");
+        ImportExportBo bo = getImportExportBo(result, loginUser, "0");
         boolean flag = importExportService.insert(bo);
         if (flag) {
             log.info("异步导入日志写入成功");
@@ -165,17 +192,22 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, Product>
     @Override
     public void asyncExport(List<ProductVo> listVo, String sheetName, LoginUser loginUser) {
         ExcelResultRes result = excelService.exportExcel(listVo, sheetName, ProductVo.class);
-        ImportExportBo bo = new ImportExportBo();
-        BeanUtils.copyProperties(result, bo);
-        bo.setUpdateBy(loginUser.getUserId());
-        bo.setCreateBy(loginUser.getUserId());
-        bo.setType("1");
+        ImportExportBo bo = getImportExportBo(result, loginUser, "1");
         boolean flag = importExportService.insert(bo);
         if (flag) {
             log.info("异步导出日志写入成功");
         }
     }
 
+    private static ImportExportBo getImportExportBo(ExcelResultRes result, LoginUser loginUser, String type) {
+        ImportExportBo bo = new ImportExportBo();
+        BeanUtils.copyProperties(result, bo);
+        bo.setUpdateBy(loginUser.getUserId());
+        bo.setCreateBy(loginUser.getUserId());
+        bo.setType(type);
+        return bo;
+    }
+
     /**
      * 批量删除产品树
      *