| | |
| | | package com.by4cloud.platformx.business.service.impl; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.lang.tree.Tree; |
| | | import cn.hutool.core.lang.tree.TreeNode; |
| | | import cn.hutool.core.lang.tree.TreeUtil; |
| | | import cn.hutool.core.util.ArrayUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.by4cloud.platformx.admin.api.entity.SysDept; |
| | | import com.by4cloud.platformx.business.dto.ProductAddDTO; |
| | | import com.by4cloud.platformx.business.dto.ProductQueryDTO; |
| | | import com.by4cloud.platformx.business.entity.Product; |
| | | import com.by4cloud.platformx.business.entity.TaxCode; |
| | | import com.by4cloud.platformx.business.mapper.ProductMapper; |
| | | import com.by4cloud.platformx.business.mapper.TaxCodeMapper; |
| | | import com.by4cloud.platformx.business.service.ProductService; |
| | | import com.by4cloud.platformx.business.vo.ProductExcelVO; |
| | | import com.by4cloud.platformx.business.vo.ProductSelectVo; |
| | | import com.by4cloud.platformx.common.core.util.R; |
| | | import com.by4cloud.platformx.common.data.datascope.DataScope; |
| | | import com.by4cloud.platformx.common.excel.vo.ErrorMessage; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.BindingResult; |
| | | |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.IntStream; |
| | | |
| | | /** |
| | | * 产品信息 |
| | |
| | | * @date 2026-05-07 10:17:52 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService { |
| | | |
| | | private final TaxCodeMapper taxCodeMapper; |
| | | |
| | | @Override |
| | | public List<Tree<Long>> treeList() { |
| | | List<TreeNode<Long>> collect = baseMapper |
| | |
| | | |
| | | @Override |
| | | public R getProductListByParentId(ProductQueryDTO queryDTO) { |
| | | String[] erpCodes = new String[]{"房租租赁","dianli","water"}; |
| | | String[] erpCodes = new String[]{"house_rental","electricity_bill","water_bill"}; |
| | | // MPJLambdaWrapper<Product> wrapper = new MPJLambdaWrapper<Product>() |
| | | // .selectAs("( SELECT count(1) FROM product t1 WHERE t1.parent_id = t.id )",Product::getChildNum) |
| | | // .selectAll(Product.class) |
| | |
| | | } |
| | | return R.ok(selectVos); |
| | | } |
| | | |
| | | @Override |
| | | public R saveErpProduct(List<ProductAddDTO> addDTOS) { |
| | | if (ArrayUtil.isNotEmpty(addDTOS.toArray())){ |
| | | for (ProductAddDTO addDTO:addDTOS |
| | | ) { |
| | | List<Product> classPro = baseMapper.selectListByScope(Wrappers.<Product>lambdaQuery() |
| | | .eq(StrUtil.isNotEmpty(addDTO.getErpTypeCode()),Product::getErpCode,addDTO.getErpTypeCode()) |
| | | .eq(StrUtil.isNotEmpty(addDTO.getErpTypeName()),Product::getProductName,addDTO.getErpTypeName()) |
| | | , DataScope.of("comp_id")); |
| | | if (ArrayUtil.isEmpty(classPro.toArray())){ |
| | | Product product = new Product(); |
| | | product.setProductName(addDTO.getErpTypeName()); |
| | | product.setProductType(addDTO.getSpecification()); |
| | | product.setParentId(0L); |
| | | product.setParentName("根级产品"); |
| | | product.setErpCode(addDTO.getErpTypeCode()); |
| | | TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1")); |
| | | if (ObjUtil.isNotNull(taxCode)){ |
| | | product.setTaxClass(taxCode.getMc()); |
| | | product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%",""))); |
| | | } |
| | | baseMapper.insert(product); |
| | | classPro.add(product); |
| | | } |
| | | Product product = new Product(); |
| | | product.setProductName(addDTO.getErpName()); |
| | | product.setProductType(addDTO.getSpecification()); |
| | | product.setParentId(classPro.get(0).getId()); |
| | | product.setParentName(classPro.get(0).getProductName()); |
| | | product.setErpCode(addDTO.getErpCode()); |
| | | TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1")); |
| | | if (ObjUtil.isNotNull(taxCode)){ |
| | | product.setTaxClass(taxCode.getMc()); |
| | | product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%",""))); |
| | | } |
| | | baseMapper.insert(product); |
| | | } |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R importProduct(List<ProductExcelVO> excelVOList, BindingResult bindingResult) { |
| | | List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget(); |
| | | if (ArrayUtil.isNotEmpty(excelVOList.toArray())) { |
| | | List<List<ProductExcelVO>> groups = splitList(excelVOList, 5000); |
| | | groups.stream().forEach(group->{ |
| | | for (ProductExcelVO addDTO:group |
| | | ) { |
| | | Set<String> errorMsg = new HashSet<>(); |
| | | |
| | | if (StrUtil.isEmpty(addDTO.getErpTypeCode())&&StrUtil.isEmpty(addDTO.getErpTypeName())) { |
| | | errorMsg.add("产品分类信息没有"); |
| | | } |
| | | List<Product> one = this.listByScope(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, addDTO.getErpCode())); |
| | | if (ArrayUtil.isNotEmpty(one.toArray())){ |
| | | errorMsg.add("产品erp编码已存在"); |
| | | } |
| | | if (CollUtil.isEmpty(errorMsg)){ |
| | | List<Product> classPro = baseMapper.selectListByScope(Wrappers.<Product>lambdaQuery() |
| | | .eq(StrUtil.isNotEmpty(addDTO.getErpTypeCode()),Product::getErpCode,addDTO.getErpTypeCode()) |
| | | .eq(StrUtil.isNotEmpty(addDTO.getErpTypeName()),Product::getProductName,addDTO.getErpTypeName()) |
| | | , DataScope.of("comp_id")); |
| | | if (ArrayUtil.isEmpty(classPro.toArray())){ |
| | | Product product = new Product(); |
| | | product.setProductName(addDTO.getErpTypeName()); |
| | | product.setProductType(addDTO.getSpecification()); |
| | | product.setParentId(0L); |
| | | product.setParentName("根级产品"); |
| | | product.setErpCode(addDTO.getErpTypeCode()); |
| | | TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1")); |
| | | if (ObjUtil.isNotNull(taxCode)){ |
| | | product.setTaxClass(taxCode.getMc()); |
| | | product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%",""))); |
| | | } |
| | | baseMapper.insert(product); |
| | | classPro.add(product); |
| | | } |
| | | Product product = new Product(); |
| | | product.setProductName(addDTO.getErpName()); |
| | | product.setProductType(addDTO.getSpecification()); |
| | | product.setParentId(classPro.get(0).getId()); |
| | | product.setParentName(classPro.get(0).getProductName()); |
| | | product.setErpCode(addDTO.getErpCode()); |
| | | TaxCode taxCode = taxCodeMapper.selectOne(Wrappers.<TaxCode>lambdaQuery().eq(TaxCode::getBm,addDTO.getTaxCode()).last("limit 1")); |
| | | if (ObjUtil.isNotNull(taxCode)){ |
| | | product.setTaxClass(taxCode.getMc()); |
| | | product.setTaxRate(Double.valueOf(taxCode.getSl().replace("%",""))); |
| | | } |
| | | baseMapper.insert(product); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | if (CollUtil.isNotEmpty(errorMessageList)) { |
| | | return R.failed(errorMessageList); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | public static <T> List<List<T>> splitList(List<T> list, int batchSize) { |
| | | if (list == null || list.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | int totalSize = list.size(); |
| | | // 计算需要分成多少组 |
| | | int batchCount = (totalSize + batchSize - 1) / batchSize; |
| | | |
| | | return IntStream.range(0, batchCount) |
| | | .mapToObj(i -> list.subList(i * batchSize, |
| | | Math.min((i + 1) * batchSize, totalSize))) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | } |