修改 产品 产品分类 多对多关系。

master
Tom Li 2 weeks ago
parent d6544a787f
commit e61acfa075
  1. 7
      pom.xml
  2. 113
      src/main/java/org/springblade/modules/jinchao/controller/ProductController.java
  3. 7
      src/main/java/org/springblade/modules/jinchao/mapper/ProductMapper.java
  4. 18
      src/main/java/org/springblade/modules/jinchao/mapper/ProductMapper.xml
  5. 2
      src/main/java/org/springblade/modules/jinchao/mapper/RelCatalogProductMapper.java
  6. 18
      src/main/java/org/springblade/modules/jinchao/mapper/RelCatalogProductMapper.xml
  7. 5
      src/main/java/org/springblade/modules/jinchao/pojo/entity/ProductEntity.java
  8. 3
      src/main/java/org/springblade/modules/jinchao/pojo/entity/RelCatalogProductEntity.java
  9. 5
      src/main/java/org/springblade/modules/jinchao/pojo/vo/ProductVO.java
  10. 2
      src/main/java/org/springblade/modules/jinchao/service/IBizPriceService.java
  11. 27
      src/main/java/org/springblade/modules/jinchao/service/IProductService.java
  12. 17
      src/main/java/org/springblade/modules/jinchao/service/IRelCatalogProductService.java
  13. 8
      src/main/java/org/springblade/modules/jinchao/service/impl/BizPriceServiceImpl.java
  14. 198
      src/main/java/org/springblade/modules/jinchao/service/impl/ProductServiceImpl.java
  15. 54
      src/main/java/org/springblade/modules/jinchao/service/impl/RelCatalogProductServiceImpl.java
  16. 9
      src/main/java/org/springblade/modules/jinchao/wrapper/ProductWrapper.java

@ -244,6 +244,13 @@
</dependency>
<!-- ↑ BladeX依赖库 ↑ -->
<!-- 适配 Java 8+ -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>

@ -33,14 +33,12 @@ import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.jinchao.constant.BaseCol;
import org.springblade.modules.jinchao.constant.ProductConst;
import org.springblade.modules.jinchao.pojo.entity.BizPriceEntity;
import org.springblade.modules.jinchao.pojo.vo.ProductVO;
import org.springblade.modules.jinchao.service.IBizPriceService;
import org.springframework.web.bind.annotation.*;
@ -56,8 +54,6 @@ import org.springblade.core.excel.util.ExcelUtil;
import java.util.Map;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import jakarta.servlet.http.HttpServletResponse;
@ -68,8 +64,10 @@ import jakarta.servlet.http.HttpServletResponse;
* @since 2025-12-01
*/
@RestController
@AllArgsConstructor
@RequestMapping("jinchao/product")
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Tag(name = "[产品]", description = "[产品]接口")
public class ProductController extends BladeController {
@ -96,9 +94,9 @@ public class ProductController extends BladeController {
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@Operation(summary = "list分页", description = "传入product")
public R<IPage<ProductVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> product,
public R<IPage<ProductVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> map,
Query query) {
return service.list(product, query);
return service.list(map, query);
}
/**
@ -108,36 +106,36 @@ public class ProductController extends BladeController {
@ApiOperationSupport(order = 3)
@Operation(summary = "page分页", description = "传入product")
public R<IPage<ProductVO>> page(ProductVO product, Query query) {
IPage<org.springblade.modules.jinchao.pojo.vo.ProductVO> pages = service.selectProductPage(Condition.getPage(query), product);
IPage<ProductVO> pages = service.selectProductPage(Condition.getPage(query), product);
return R.data(pages);
}
/**
* [产品] 新增
* [产品] 新增 批量 用不到单条
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入product")
public R save(@Valid @RequestBody ProductVO vo) {
vo.setId(null);
if (service.existsCode(vo.getCode())) {
return R.fail("已经存在此code");
}
if (service.existsNameCn(vo.getNameCn())) {
return R.fail("已经存在此nameCn");
}
return R.status(service.save(vo));
}
// @PostMapping("/save")
// @ApiOperationSupport(order = 4)
// @Operation(summary = "新增", description = "传入product")
// public R save(@Valid @RequestBody ProductVO vo) {
// vo.setId(null);
// if (service.existsCode(vo.getCode())) {
// return R.fail("已经存在此code");
// }
// if (service.existsNameCn(vo.getNameCn())) {
// return R.fail("已经存在此nameCn");
// }
// return R.status(service.save(vo));
// }
/**
* [产品] 修改
* [产品] 修改 批量 用不到单条
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入product")
public R update(@Valid @RequestBody ProductEntity product) {
return R.status(service.updateById(product));
}
// @PostMapping("/update")
// @ApiOperationSupport(order = 5)
// @Operation(summary = "修改", description = "传入product")
// public R update(@Valid @RequestBody ProductEntity product) {
// return R.status(service.updateById(product));
// }
/**
* [产品] 单条新增或修改
@ -146,61 +144,14 @@ public class ProductController extends BladeController {
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入product")
public R submit(@Valid @RequestBody ProductVO vo) {
if (vo.getId() == null || vo.getId() == 0L) {
if (service.existsCode(vo.getCode())) {
return R.fail("已经存在此code");
}
if (service.existsNameCn(vo.getNameCn())) {
return R.fail("已经存在此nameCn");
}
}
if (Objects.equals(vo.getBizType(), ProductConst.TYPE_PRICE_CUSTOM)) {
// 跳过
return R.fail("bizType类型错误");
}
return R.status(service.saveOrUpdate(vo));
return service.submit(vo);
}
@PostMapping("/submitBat")
@ApiOperationSupport(order = 6)
@Operation(summary = "批量新增或修改", description = "ProductEntity List")
public R submitBat(@Valid @RequestBody List<ProductVO> vos) {
// todo:删除的情况
//
if (vos != null && !vos.isEmpty()) {
for (ProductVO vo : vos) {
final Integer bizType = vo.getBizType();
if (Objects.equals(bizType, ProductConst.TYPE_PRICE_STANDARD)) { // 标准价
if (Objects.requireNonNull(vo).getId() == null || vo.getId() == 0L) {
// 新增check
if (service.existsCode(vo.getCode())) {
return R.fail("已经存在此code");
}
if (service.existsNameCn(vo.getNameCn())) {
return R.fail("已经存在此nameCn");
}
// 新增
service.save(vo);
} else {
service.updateById(vo);
}
} else if (Objects.equals(bizType, ProductConst.TYPE_PRICE_CUSTOM)) { // 指定价
QueryWrapper<BizPriceEntity> qw = new QueryWrapper<BizPriceEntity>()
.eq(BaseCol.ID, vo.getBizPriceId());
Optional<BizPriceEntity> opt = bizPriceService.getOneOpt(qw);
opt.ifPresent(
bp -> {
bp.setSaleUserId(vo.getSaleUserId());
bp.setCustomerId(vo.getCustomerId());
bp.setBizPrice(vo.getBizPrice());
bizPriceService.save(bp);
}
);
}
}
}
return R.success();
return service.submitBat(vos);
}
/**
@ -210,7 +161,7 @@ public class ProductController extends BladeController {
@ApiOperationSupport(order = 7)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(service.deleteLogic(Func.toLongList(ids)));
return service.remove(ids);
}
/**

@ -31,6 +31,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.modules.jinchao.pojo.vo.ProductVO;
import java.util.List;
/**
@ -44,11 +46,11 @@ public interface ProductMapper extends BaseMapper<ProductEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param page 分页参数
* @param product 查询参数
* @return List<ProductVO>
*/
List<org.springblade.modules.jinchao.pojo.vo.ProductVO> selectProductPage(IPage page, org.springblade.modules.jinchao.pojo.vo.ProductVO product);
List<ProductVO> selectProductPage(IPage page, ProductVO product);
/**
@ -59,4 +61,5 @@ public interface ProductMapper extends BaseMapper<ProductEntity> {
*/
List<ProductExcel> exportProduct(@Param("ew") Wrapper<ProductEntity> queryWrapper);
Long countNameCn(@Param("catalogId") Long catalogId, @Param("nameCn") String nameCn);
}

@ -9,7 +9,6 @@
<result column="id" property="id"/>
<result column="tenant_id" property="tenantId"/>
<result column="code" property="code"/>
<result column="catalog_id" property="catalogId"/>
<result column="name_cn" property="nameCn"/>
<result column="name_en" property="nameEn"/>
<result column="create_user" property="createUser"/>
@ -29,17 +28,24 @@
<result column="remark_en" property="remarkEn"/>
</resultMap>
<select id="selectProductPage" resultMap="productResultMap">
select *
from jc_product
where is_deleted = 0
SELECT *
FROM jc_product
WHERE is_deleted = 0
</select>
<select id="exportProduct" resultType="org.springblade.modules.jinchao.excel.ProductExcel">
SELECT *
FROM jc_product ${ew.customSqlSegment}
</select>
<select id="countNameCn" resultType="java.lang.Long">
SELECT COUNT(DISTINCT p.id)
FROM jc_product p
INNER JOIN jc_rel_catalog_product r ON p.id = r.product_id
WHERE r.catalog_id = #{catalogId}
AND p.name_cn = #{nameCn}
AND p.is_deleted = 0
AND r.is_deleted = 0
</select>
</mapper>

@ -59,4 +59,6 @@ public interface RelCatalogProductMapper extends BaseMapper<RelCatalogProductEnt
* @return List<RelCatalogProductExcel>
*/
List<RelCatalogProductExcel> exportRelCatalogProduct(@Param("ew") Wrapper<RelCatalogProductEntity> queryWrapper);
}

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.modules.jinchao.mapper.RelCatalogProductMapper">
<!-- 通用查询映射结果 -->
<resultMap id="relCatalogProductResultMap" type="org.springblade.modules.jinchao.pojo.entity.RelCatalogProductEntity">
<resultMap id="relCatalogProductResultMap"
type="org.springblade.modules.jinchao.pojo.entity.RelCatalogProductEntity">
<result column="id" property="id"/>
<result column="tenant_id" property="tenantId"/>
<result column="catalog_id" property="catalogId"/>
@ -17,14 +19,16 @@
<result column="is_deleted" property="isDeleted"/>
</resultMap>
<select id="selectRelCatalogProductPage" resultMap="relCatalogProductResultMap">
select * from jc_rel_catalog_product where is_deleted = 0
SELECT *
FROM jc_rel_catalog_product
WHERE is_deleted = 0
</select>
<select id="exportRelCatalogProduct" resultType="org.springblade.modules.jinchao.excel.RelCatalogProductExcel">
SELECT * FROM jc_rel_catalog_product ${ew.customSqlSegment}
<select id="exportRelCatalogProduct"
resultType="org.springblade.modules.jinchao.excel.RelCatalogProductExcel">
SELECT *
FROM jc_rel_catalog_product ${ew.customSqlSegment}
</select>
</mapper>

@ -57,11 +57,6 @@ public class ProductEntity extends TenantEntity {
*/
@Schema(description = "编号")
private String code;
/**
* [产品目录]id
*/
@Schema(description = "[产品目录]id")
private Long catalogId;
/**
* 中文名称
*/

@ -47,6 +47,9 @@ public class RelCatalogProductEntity extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
public static final String COL_CATALOG_ID = "catalog_id";
public static final String COL_PRODUCT_ID = "product_id";
/**
* 小类[产品目录]id
*/

@ -44,6 +44,11 @@ public class ProductVO extends ProductEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* [产品目录]id
*/
@Schema(description = "[产品目录]id")
private Long catalogId;
/**
* [1]标准;[2]客户特定价
*/

@ -60,4 +60,6 @@ public interface IBizPriceService extends BaseService<BizPriceEntity> {
List<BizPriceExcel> exportBizPrice(Wrapper<BizPriceEntity> queryWrapper);
List<BizPriceEntity> listByProductId(Long productId);
Integer deleteByProductId(Long productId);
}

@ -26,6 +26,7 @@
package org.springblade.modules.jinchao.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import jakarta.validation.Valid;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.modules.jinchao.pojo.entity.ProductEntity;
@ -33,6 +34,7 @@ import org.springblade.modules.jinchao.excel.ProductExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.modules.jinchao.pojo.vo.ProductVO;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
@ -51,7 +53,7 @@ public interface IProductService extends BaseService<ProductEntity> {
* @param product 查询参数
* @return IPage<ProductVO>
*/
IPage<org.springblade.modules.jinchao.pojo.vo.ProductVO> selectProductPage(IPage<org.springblade.modules.jinchao.pojo.vo.ProductVO> page, org.springblade.modules.jinchao.pojo.vo.ProductVO product);
IPage<ProductVO> selectProductPage(IPage<ProductVO> page, ProductVO product);
/**
@ -64,11 +66,30 @@ public interface IProductService extends BaseService<ProductEntity> {
R<IPage<ProductVO>> list(Map<String, Object> product, Query query);
public R remove(String ids);
/**
* 全部产品中是否有此code
*
* @param code
* @return
*/
Boolean existsCode(String code);
Boolean existsNameCn(String nameCn);
/**
* 小类产品中是否有此nameCn
*
* @param catalogId
* @param nameCn
* @return
*/
Boolean existsNameCn(Long catalogId, String nameCn);
void setVoValue(ProductVO vo);
void setVoValue(Long catalogId, ProductVO vo);
R<List<ProductVO>> oneKeyMatch(List<ProductVO> list);
R submit(ProductVO vo);
R submitBat(List<ProductVO> vos);
}

@ -31,6 +31,7 @@ import org.springblade.modules.jinchao.pojo.vo.RelCatalogProductVO;
import org.springblade.modules.jinchao.excel.RelCatalogProductExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import java.util.List;
/**
@ -43,11 +44,12 @@ public interface IRelCatalogProductService extends BaseService<RelCatalogProduct
/**
* 自定义分页
*
* @param page 分页参数
* @param page 分页参数
* @param relCatalogProduct 查询参数
* @return IPage<RelCatalogProductVO>
*/
IPage<RelCatalogProductVO> selectRelCatalogProductPage(IPage<RelCatalogProductVO> page, RelCatalogProductVO relCatalogProduct);
IPage<RelCatalogProductVO> selectRelCatalogProductPage(IPage<RelCatalogProductVO> page,
RelCatalogProductVO relCatalogProduct);
/**
@ -58,4 +60,15 @@ public interface IRelCatalogProductService extends BaseService<RelCatalogProduct
*/
List<RelCatalogProductExcel> exportRelCatalogProduct(Wrapper<RelCatalogProductEntity> queryWrapper);
/**
* listByProductId
*
* @param catalogId
* @return
*/
List<RelCatalogProductEntity> listByCatalogId(Long catalogId);
RelCatalogProductEntity merge(Long catalogId, Long productId);
Long deleteByProductId(Long productId);
}

@ -69,4 +69,12 @@ public class BizPriceServiceImpl extends BaseServiceImpl<BizPriceMapper, BizPric
.eq("product_id", productId)
);
}
@Override
public Integer deleteByProductId(Long productId) {
return baseMapper.delete(
new QueryWrapper<BizPriceEntity>()
.eq("product_id", productId)
);
}
}

@ -26,13 +26,17 @@
package org.springblade.modules.jinchao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Sets;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.jinchao.constant.BaseCol;
import org.springblade.modules.jinchao.constant.ProductConst;
import org.springblade.modules.jinchao.pojo.entity.BizPriceEntity;
@ -40,23 +44,25 @@ import org.springblade.modules.jinchao.pojo.entity.CustomerEntity;
import org.springblade.modules.jinchao.pojo.entity.ProductEntity;
import org.springblade.modules.jinchao.excel.ProductExcel;
import org.springblade.modules.jinchao.mapper.ProductMapper;
import org.springblade.modules.jinchao.pojo.entity.RelCatalogProductEntity;
import org.springblade.modules.jinchao.pojo.vo.ProductVO;
import org.springblade.modules.jinchao.service.IBizPriceService;
import org.springblade.modules.jinchao.service.ICustomerService;
import org.springblade.modules.jinchao.service.IProductService;
import org.springblade.modules.jinchao.service.IRelCatalogProductService;
import org.springblade.modules.jinchao.wrapper.ProductWrapper;
import org.springblade.modules.system.pojo.entity.User;
import org.springblade.modules.system.service.IUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
@ -69,14 +75,20 @@ import java.util.stream.Collectors;
@Data
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEntity> implements IProductService {
public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEntity>
implements IProductService {
@Resource
@Lazy
private IProductService self;
@Resource
private IUserService userService;
@Resource
private IBizPriceService bizPriceService;
@Resource
private ICustomerService customerService;
@Resource
private IRelCatalogProductService relCatalogProductService;
@Override
public IPage<ProductVO> selectProductPage(IPage<ProductVO> page, ProductVO product) {
@ -93,13 +105,32 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEn
}
@Override
public R<IPage<ProductVO>> list(Map<String, Object> product, Query query) {
IPage<ProductEntity> pages = page(
public R<IPage<ProductVO>> list(Map<String, Object> map, Query query) {
Long catalogId = Long.parseLong((String) map.get("catalogId")); // 是Id [坏笑]。不是ld
log.warn("catalogId {}", catalogId);
if (catalogId == null || catalogId == 0L) {
return R.fail("catalogId error.");
}
IPage<RelCatalogProductEntity> pageRel = relCatalogProductService.page(
Condition.getPage(query),
Condition.getQueryWrapper(product, ProductEntity.class).orderByAsc(BaseCol.ID)
Condition.getQueryWrapper(map, RelCatalogProductEntity.class)
.eq("catalog_id", catalogId)
.orderByAsc("product_id")
);
IPage<ProductVO> pagesVo = ProductWrapper.build().pageVO(pages);
ListIterator<ProductVO> it = pagesVo.getRecords().listIterator();
List<ProductVO> listVO = new ArrayList<>();
pageRel.getRecords().forEach(rel -> {
ProductEntity p = getById(rel.getProductId());
if (p != null) {
ProductVO vo = ProductWrapper.build().entityVO(p);
vo.setCatalogId(catalogId);
listVO.add(vo);
}
});
// 组装IPage
IPage<ProductVO> pagesVO = Condition.getPage(query);
pagesVO.setRecords(listVO);
// 迭代器去添加元素。
ListIterator<ProductVO> it = pagesVO.getRecords().listIterator();
while (it.hasNext()) {
ProductVO vo1 = it.next();
// 默认
@ -136,7 +167,18 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEn
log.info("not contain.");
}
}
return R.data(pagesVo);
return R.data(pagesVO);
}
@Override
public R remove(String ids) {
List<Long> list = Func.toLongList(ids);
// 同时 逻辑删除对应关联表
list.forEach(id -> {
relCatalogProductService.deleteByProductId(id);
bizPriceService.deleteByProductId(id);
});
return R.status(self.deleteLogic(list));
}
@Override
@ -144,9 +186,11 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEn
return baseMapper.exists(new QueryWrapper<ProductEntity>().eq(ProductEntity.COL_CODE, code));
}
@Override
public Boolean existsNameCn(String nameCn) {
return baseMapper.exists(new QueryWrapper<ProductEntity>().eq(ProductEntity.COL_NAME_CN, nameCn));
public Boolean existsNameCn(Long catalogId, String nameCn) {
Long count = baseMapper.countNameCn(catalogId, nameCn);
return count != 0;
}
/**
@ -155,11 +199,9 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEn
* @param vo 传入的对象已经BizType赋值了.
*/
@Override
public void setVoValue(ProductVO vo) {
public void setVoValue(Long catalogId, ProductVO vo) {
if (vo != null) {
if (Objects.equals(ProductConst.TYPE_PRICE_CUSTOM, vo.getBizType())) {
}
vo.setCatalogId(catalogId);
}
}
@ -167,16 +209,128 @@ public class ProductServiceImpl extends BaseServiceImpl<ProductMapper, ProductEn
public R<List<ProductVO>> oneKeyMatch(List<ProductVO> list) {
List<ProductVO> listNew = list.stream()
.map(vo -> {
ProductEntity pFind = getOne(new QueryWrapper<ProductEntity>().eq(ProductEntity.COL_NAME_CN, vo.getNameCn()));
if (pFind != null) {
// 全部数据,用nameCn去匹配
ProductEntity find = getOne(new QueryWrapper<ProductEntity>().eq(ProductEntity.COL_NAME_CN, vo.getNameCn()));
if (find != null) {
ProductVO voNew = new ProductVO();
BeanUtils.copyProperties(pFind, voNew);
BeanUtils.copyProperties(find, voNew);
voNew.setBizType(ProductConst.TYPE_PRICE_STANDARD);
return voNew;
} else {
// 前端要赋值catalogId,后续保存会用到。
// 数据原样返回。
return vo;
}
vo.setBizType(ProductConst.TYPE_PRICE_STANDARD);
return vo;
}).collect(Collectors.toList());
return R.data(listNew);
}
@Override
public R submit(ProductVO vo) {
if (vo.getId() == null || vo.getId() == 0L) {
if (vo.getCatalogId() == null || vo.getCatalogId() == 0L) {
return R.fail("catalogId无效");
}
if (existsCode(vo.getCode())) {
return R.fail("已经存在此code");
}
if (existsNameCn(vo.getCatalogId(), vo.getNameCn())) {
return R.fail("已经存在此nameCn");
}
}
if (Objects.equals(vo.getBizType(), ProductConst.TYPE_PRICE_CUSTOM)) {
// 跳过
return R.fail("bizType类型错误");
}
boolean b = saveOrUpdate(vo);
// 处理关联表 merge 关系
relCatalogProductService.merge(vo.getCatalogId(), vo.getId());
return R.status(b);
}
@Override
public R submitBat(List<ProductVO> vos) {
Long catalogId = 0L;
log.warn("catalogId = {}", catalogId);
// catalogId 设置值。
if (vos != null && !vos.isEmpty()) {
catalogId = vos.get(0).getCatalogId();
}
// 删除 先做删除,id还没有被赋值。
if (false && vos != null && !vos.isEmpty()) {
// 前端传入数量
AtomicReference<Integer> sizeWeb = new AtomicReference<>(0);
Objects.requireNonNull(vos).forEach(vo -> {
if (vo != null &&
Objects.equals(vo.getBizType(), ProductConst.TYPE_PRICE_STANDARD) &&
vo.getId() != null &&
vo.getId() != 0L) {
sizeWeb.set(sizeWeb.get() + 1);
}
});
// 数据库中数量
Integer sizeDb = Math.toIntExact(count(new QueryWrapper<>()));
// 数量比较
if (Objects.equals(sizeWeb.get(), sizeDb)) {
log.info("没有删除数据");
} else {
// 前端传入id的Set
Set<Long> setWeb = vos.stream()
.filter(vo -> (
Objects.equals(vo.getBizType(), ProductConst.TYPE_PRICE_STANDARD) &&
vo.getId() != null &&
vo.getId() != 0L
))
.map(ProductVO::getId)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(TreeSet::new));
//
Set<Long> setDB = null;
Set<Long> setDel = Sets.difference(setDB, setWeb);
}
}
if (vos != null && !vos.isEmpty()) {
for (ProductVO vo : vos) {
if (vo == null) {
continue;
}
final Integer bizType = vo.getBizType();
if (Objects.equals(bizType, ProductConst.TYPE_PRICE_STANDARD)) { // 标准价
// 添加 or 修改
if (Objects.requireNonNull(vo).getId() == null || vo.getId() == 0L) {
// 新增check
if (vo.getCatalogId() == null || vo.getCatalogId() == 0L) {
return R.fail("catalogId无效");
}
if (existsCode(vo.getCode())) {
return R.fail("已经存在此code");
}
if (existsNameCn(catalogId, vo.getNameCn())) {
return R.fail("已经存在此nameCn");
}
// 新增 产品
save(vo);
} else {
// 修改 产品 根据id
updateById(vo);
}
// 处理关联表 merge 关系
relCatalogProductService.merge(vo.getCatalogId(), vo.getId());
} else if (Objects.equals(bizType, ProductConst.TYPE_PRICE_CUSTOM)) { // 指定价
QueryWrapper<BizPriceEntity> qw = new QueryWrapper<BizPriceEntity>()
.eq(BaseCol.ID, vo.getBizPriceId());
Optional<BizPriceEntity> opt = bizPriceService.getOneOpt(qw);
opt.ifPresent(
bp -> {
bp.setSaleUserId(vo.getSaleUserId());
bp.setCustomerId(vo.getCustomerId());
bp.setBizPrice(vo.getBizPrice());
bizPriceService.updateById(bp);
}
);
}
}
}
return R.success();
}
}

@ -25,6 +25,7 @@
*/
package org.springblade.modules.jinchao.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springblade.modules.jinchao.pojo.entity.RelCatalogProductEntity;
import org.springblade.modules.jinchao.pojo.vo.RelCatalogProductVO;
import org.springblade.modules.jinchao.excel.RelCatalogProductExcel;
@ -34,6 +35,7 @@ import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import java.util.List;
/**
@ -43,10 +45,12 @@ import java.util.List;
* @since 2025-12-03
*/
@Service
public class RelCatalogProductServiceImpl extends BaseServiceImpl<RelCatalogProductMapper, RelCatalogProductEntity> implements IRelCatalogProductService {
public class RelCatalogProductServiceImpl extends BaseServiceImpl<RelCatalogProductMapper, RelCatalogProductEntity>
implements IRelCatalogProductService {
@Override
public IPage<RelCatalogProductVO> selectRelCatalogProductPage(IPage<RelCatalogProductVO> page, RelCatalogProductVO relCatalogProduct) {
public IPage<RelCatalogProductVO> selectRelCatalogProductPage(IPage<RelCatalogProductVO> page,
RelCatalogProductVO relCatalogProduct) {
return page.setRecords(baseMapper.selectRelCatalogProductPage(page, relCatalogProduct));
}
@ -60,4 +64,50 @@ public class RelCatalogProductServiceImpl extends BaseServiceImpl<RelCatalogProd
return relCatalogProductList;
}
@Override
public List<RelCatalogProductEntity> listByCatalogId(Long catalogId) {
return baseMapper.selectList(
new QueryWrapper<RelCatalogProductEntity>()
.eq(RelCatalogProductEntity.COL_CATALOG_ID, catalogId)
);
}
/**
* 存在就返回不存在就新建
*
* @param catalogId
* @param productId
* @return
*/
@Override
public RelCatalogProductEntity merge(Long catalogId, Long productId) {
RelCatalogProductEntity fOne = baseMapper.selectOne(
new QueryWrapper<RelCatalogProductEntity>()
.eq(RelCatalogProductEntity.COL_CATALOG_ID, catalogId)
.eq(RelCatalogProductEntity.COL_PRODUCT_ID, productId)
);
if (fOne == null) {
RelCatalogProductEntity newOne = new RelCatalogProductEntity();
newOne.setCatalogId(catalogId);
newOne.setProductId(productId);
baseMapper.insert(newOne);
return newOne;
} else {
return fOne;
}
}
@Override
public Long deleteByProductId(Long productId) {
List<RelCatalogProductEntity> list = baseMapper.selectList(
new QueryWrapper<RelCatalogProductEntity>()
.eq(RelCatalogProductEntity.COL_PRODUCT_ID, productId)
);
long count = 0L;
for (RelCatalogProductEntity one : list) {
baseMapper.deleteById(one.getId());
count = count + 1L;
}
return count;
}
}

@ -28,6 +28,7 @@ package org.springblade.modules.jinchao.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.modules.jinchao.pojo.entity.ProductEntity;
import org.springblade.modules.jinchao.pojo.vo.ProductVO;
import java.util.Objects;
@ -37,15 +38,15 @@ import java.util.Objects;
* @author BladeX
* @since 2025-12-01
*/
public class ProductWrapper extends BaseEntityWrapper<ProductEntity, org.springblade.modules.jinchao.pojo.vo.ProductVO> {
public class ProductWrapper extends BaseEntityWrapper<ProductEntity, ProductVO> {
public static ProductWrapper build() {
return new ProductWrapper();
}
}
@Override
public org.springblade.modules.jinchao.pojo.vo.ProductVO entityVO(ProductEntity product) {
org.springblade.modules.jinchao.pojo.vo.ProductVO productVO = Objects.requireNonNull(BeanUtil.copyProperties(product, org.springblade.modules.jinchao.pojo.vo.ProductVO.class));
public ProductVO entityVO(ProductEntity product) {
ProductVO productVO = Objects.requireNonNull(BeanUtil.copyProperties(product, ProductVO.class));
//User createUser = UserCache.getUser(product.getCreateUser());
//User updateUser = UserCache.getUser(product.getUpdateUser());

Loading…
Cancel
Save