liding
3 天以前 3841d6424d6cb9cfeb4221435c137628b9f7442d
fix:1.采购/销售导入导出模板调整
2.采购/销售导入导出逻辑更改
已修改8个文件
204 ■■■■■ 文件已修改
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/采购台账导入模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/销售台账导入模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java
@@ -1,7 +1,6 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.dto.SalesLedgerProductImportDto;
import lombok.Data;
import java.math.BigDecimal;
@@ -17,16 +16,6 @@
    private String purchaseContractNumber;
    /**
     * é¢„警数量
     */
    @Excel(name = "库存预警数量")
    private BigDecimal warnNum;
    @Excel(name = "销售单号")
    private String salesContractNo;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
@@ -39,16 +28,22 @@
    private String specificationModel;
    /**
     * UID码
     */
    @Excel(name = "UID码")
    private String uidNo;
    /**
     * æ‰¹æ¬¡å·
     */
    @Excel(name = "批次号")
    private String batchNo;
    /**
     * å•位
     */
    @Excel(name = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    private BigDecimal quantity;
    /**
     * ç¨Žçއ
@@ -63,6 +58,12 @@
    private BigDecimal taxInclusiveUnitPrice;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    private BigDecimal quantity;
    /**
     * å«ç¨Žæ€»ä»·
     */
    @Excel(name = "含税总价")
@@ -75,6 +76,12 @@
    private String invoiceType;
    /**
     * é¢„警数量
     */
    @Excel(name = "库存预警数量")
    private BigDecimal warnNum;
    /**
     * æ˜¯å¦è´¨æ£€
     */
    @Excel(name = "是否质检", readConverterExp = "0=否,1=是")
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -90,68 +90,68 @@
@Slf4j
public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
    @Autowired
    private  AccountExpenseService accountExpenseService;
    private AccountExpenseService accountExpenseService;
    @Autowired
    private  PurchaseLedgerMapper purchaseLedgerMapper;
    private PurchaseLedgerMapper purchaseLedgerMapper;
    @Autowired
    private  SalesLedgerMapper salesLedgerMapper;
    private SalesLedgerMapper salesLedgerMapper;
    @Autowired
    private  SalesLedgerProductMapper salesLedgerProductMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private  SysUserMapper userMapper;
    private SysUserMapper userMapper;
    @Autowired
    private  TempFileMapper tempFileMapper;
    private TempFileMapper tempFileMapper;
    @Autowired
    private  CommonFileMapper commonFileMapper;
    private CommonFileMapper commonFileMapper;
    @Autowired
    private  SupplierManageMapper supplierManageMapper;
    private SupplierManageMapper supplierManageMapper;
    @Autowired
    private  ProductMapper productMapper;
    private ProductMapper productMapper;
    @Autowired
    private  ProductModelMapper productModelMapper;
    private ProductModelMapper productModelMapper;
    @Autowired
    private  SysUserMapper sysUserMapper;
    private SysUserMapper sysUserMapper;
    @Autowired
    private  TicketRegistrationMapper ticketRegistrationMapper;
    private TicketRegistrationMapper ticketRegistrationMapper;
    @Autowired
    private  ProductRecordMapper productRecordMapper;
    private ProductRecordMapper productRecordMapper;
    @Autowired
    private  PaymentRegistrationMapper paymentRegistrationMapper;
    private PaymentRegistrationMapper paymentRegistrationMapper;
    @Autowired
    private  InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private  StringRedisTemplate redisTemplate;
    private StringRedisTemplate redisTemplate;
    @Autowired
    private  QualityInspectMapper qualityInspectMapper;
    private QualityInspectMapper qualityInspectMapper;
    @Autowired
    private  CommonFileServiceImpl commonFileService;
    private CommonFileServiceImpl commonFileService;
    @Autowired
    private  QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
    private QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
    @Autowired
    private  QualityTestStandardParamMapper qualityTestStandardParamMapper;
    private QualityTestStandardParamMapper qualityTestStandardParamMapper;
    @Autowired
    private  QualityTestStandardMapper qualityTestStandardMapper;
    private QualityTestStandardMapper qualityTestStandardMapper;
    @Autowired
    private  QualityInspectParamMapper qualityInspectParamMapper;
    private QualityInspectParamMapper qualityInspectParamMapper;
    @Autowired
    private  ApproveProcessServiceImpl approveProcessService;
    private ApproveProcessServiceImpl approveProcessService;
    @Autowired
    private  ProcurementRecordMapper procurementRecordStorageMapper;
    private ProcurementRecordMapper procurementRecordStorageMapper;
    @Autowired
    private  PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
    private PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
    @Autowired
    private  SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
    private SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
    @Autowired
    private StockUtils stockUtils;
    @Value("${file.upload-dir}")
@@ -209,7 +209,7 @@
        // 4. å¤„理子表数据
        List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
        if (productList != null && !productList.isEmpty()) {
            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType(),supplierManage);
            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType(), supplierManage);
        }
        //不审批
        if (productList != null) {
@@ -217,10 +217,10 @@
                //是否推送质检,如果true就添加
                if (saleProduct.getIsChecked()) {
                    addQualityInspect(purchaseLedger, saleProduct);
                }else{
                } else {
                    //直接入库
                    stockUtils.addStock(saleProduct.getProductModelId(), saleProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
                            purchaseLedger.getId(),saleProduct.getBatchNo(),saleProduct.getCustomer(),null);
                            purchaseLedger.getId(), saleProduct.getBatchNo(), saleProduct.getCustomer(), null);
                }
            }
        }
@@ -245,12 +245,12 @@
        qualityInspect.setUnit(saleProduct.getUnit());
        qualityInspect.setQuantity(saleProduct.getQuantity());
        qualityInspectMapper.insert(qualityInspect);
        List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null);
        if (qualityTestStandard.size()>0){
        List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null);
        if (!qualityTestStandard.isEmpty()) {
            qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
            qualityInspectMapper.updateById(qualityInspect);
            qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
                    .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandard.get(0).getId()))
                            .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))
                    .forEach(qualityTestStandardParam -> {
                        QualityInspectParam param = new QualityInspectParam();
                        com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param);
@@ -261,7 +261,7 @@
        }
    }
    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type,SupplierManage supplierManage) {
    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type, SupplierManage supplierManage) {
        if (products == null || products.isEmpty()) {
            throw new BaseException("产品信息不存在");
        }
@@ -428,12 +428,12 @@
    @Transactional(rollbackFor = Exception.class)
    public int deletePurchaseLedgerByIds(Long[] ids) {
        if (ids == null || ids.length == 0) {
           throw new BaseException("请选中至少一条数据");
            throw new BaseException("请选中至少一条数据");
        }
        for (Long id : ids) {
            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
            if (purchaseLedger.getApprovalStatus().equals(3)) {
                throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"已经审批通过,不允许删除");
                throw new BaseException(purchaseLedger.getPurchaseContractNumber() + "已经审批通过,不允许删除");
            }
        }
        // æ‰¹é‡åˆ é™¤å…³è”的采购入库记录
@@ -456,11 +456,11 @@
        salesLedgerProductMapper.delete(queryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记
        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId,ids);
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId, ids);
        ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记记录
        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId, ids);
        productRecordMapper.delete(productRecordLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤ä»˜æ¬¾ç™»è®°
        LambdaQueryWrapper<PaymentRegistration> paymentRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -472,7 +472,7 @@
        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
        qualityInspects.stream().forEach(qualityInspect -> {
            if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState())&&qualityInspect.getInspectState().equals(1)) {
            if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState()) && qualityInspect.getInspectState().equals(1)) {
                throw new BaseException("已提交的检验单不能删除");
            }
        });
@@ -488,7 +488,7 @@
        // åˆ é™¤é‡‡è´­å®¡æ‰¹è®°å½•
        for (Long id : ids) {
            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
            if(purchaseLedger != null){
            if (purchaseLedger != null) {
                ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                        .eq(ApproveProcess::getApproveType, 5)
                        .eq(ApproveProcess::getApproveDelete, 0)
@@ -533,7 +533,7 @@
        // 3.查询上传文件
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId())
                .eq(CommonFile::getType,FileNameType.PURCHASE.getValue());
                .eq(CommonFile::getType, FileNameType.PURCHASE.getValue());
        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
        // 4. è½¬æ¢ DTO
@@ -684,7 +684,7 @@
            // ä¾›åº”商数据
            List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
                    salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getSupplierName).collect(Collectors.toList())));
            List<Map<String,Object>> list = productModelMapper.getProductAndModelList();
            List<Map<String, Object>> list = productModelMapper.getProductAndModelList();
            // å½•入人数据
            List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
                    salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getRecorderName).collect(Collectors.toList())));
@@ -692,7 +692,7 @@
                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
                        .eq(PurchaseLedger::getPurchaseContractNumber, salesLedgerImportDto.getPurchaseContractNumber())
                        .last("limit 1"));
                if(purchaseLedger != null){
                if (purchaseLedger != null) {
                    continue;
                }
                PurchaseLedger salesLedger = new PurchaseLedger();
@@ -719,12 +719,12 @@
                    throw new RuntimeException("采购单号:" + salesLedgerImportDto.getPurchaseContractNumber() + ",无对应产品数据!");
                salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                        .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
                        .reduce(BigDecimal.ZERO,BigDecimal::add));
                        .reduce(BigDecimal.ZERO, BigDecimal::add));
                // é€šè¿‡é”€å”®å•号绑定销售
                SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
                        .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo())
                        .last("LIMIT 1"));
                if(salesLedger1 != null){
                if (salesLedger1 != null) {
                    salesLedger.setSalesLedgerId(salesLedger1.getId());
                }
                // é‡‡è´­å®¡æ ¸
@@ -745,6 +745,24 @@
                for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
                    SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
                    // æŸ¥è¯¢äº§å“
                    Product product = productMapper.selectOne(new LambdaQueryWrapper<Product>()
                            .eq(Product::getProductName, salesLedgerProductImportDto.getProductCategory()));
                    if (product == null) {
                        throw new RuntimeException("请维护产品:" + salesLedgerProductImportDto.getProductCategory());
                    }
                    // æŸ¥è¯¢äº§å“åž‹å·
                    ProductModel productModel = productModelMapper.selectOne(new LambdaQueryWrapper<ProductModel>()
                            .eq(ProductModel::getProductId, product.getId())
                            .eq(ProductModel::getModel, salesLedgerProductImportDto.getSpecificationModel())
                            .eq(ProductModel::getUidNo, salesLedgerProductImportDto.getUidNo()));
                    if (productModel == null) {
                        throw new RuntimeException("请维护产品【" + salesLedgerProductImportDto.getProductCategory() + "】的型号【"
                                + salesLedgerProductImportDto.getSpecificationModel() + "】和UID码【"
                                + salesLedgerProductImportDto.getUidNo() + "】");
                    }
                    salesLedgerProduct.setProductModelId(productModel.getId());
                    salesLedgerProduct.setProductId(product.getId());
                    BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                    salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                    salesLedgerProduct.setType(2);
@@ -764,21 +782,25 @@
                    salesLedgerProduct.setApproveStatus(0);
                    salesLedgerProduct.setPendingTicketsTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
                    // æ˜¯å¦è´¨æ£€åˆ¤æ–­
                    if (salesLedgerProductImportDto.getIsChecked() == null) {
                        throw new RuntimeException("请填写是否质检!");
                    }
                    salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() == 1);
                    if(salesLedgerProductImportDto.getIsChecked() == 1){
                    if (salesLedgerProductImportDto.getIsChecked() == 1) {
                        addQualityInspect(salesLedger, salesLedgerProduct);
                    } else {
                        //直接入库
                        stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
                                salesLedger.getId(), salesLedgerProduct.getBatchNo(), salesLedger.getSupplierName(), LocalDate.now());
                    }
                    salesLedgerProductMapper.insert(salesLedgerProduct);
                }
                // é‡‡è´­å®¡æ ¸
                addApproveByPurchase(loginUser,salesLedger);
            }
            return AjaxResult.success("导入成功");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
        return AjaxResult.success("导入失败");
    }
    @Override
@@ -807,7 +829,7 @@
        return resultDto;
    }
    public void addApproveByPurchase(LoginUser loginUser,PurchaseLedger purchaseLedger) throws Exception {
    public void addApproveByPurchase(LoginUser loginUser, PurchaseLedger purchaseLedger) throws Exception {
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(5);
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -1,12 +1,9 @@
package com.ruoyi.sales.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author :yys
@@ -32,6 +29,18 @@
    private String specificationModel;
    /**
     * æ‰¹å·
     */
    @Excel(name = "批号")
    private String batchNo;
    /**
     * UID码
     */
    @Excel(name = "UID码")
    private String uniNo;
    /**
     * å•位
     */
    @Excel(name = "单位")
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -285,7 +285,7 @@
        List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
                .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
                .orderByDesc(ProcessRoute::getCreateTime));
        if (processRoutes.size()>0){
        if (!processRoutes.isEmpty()){
            ProcessRoute processRoute = processRoutes.get(0);
            //新增生产订单工艺路线主表
            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -429,6 +429,10 @@
                for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
                    SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
                    List<StockInventory> stockInventories = stockInventoryMapper.selectList(new LambdaQueryWrapper<StockInventory>().in(StockInventory::getBatchNo, salesLedgerProductImportDto.getBatchNo()));
                    if (CollectionUtils.isEmpty(stockInventories)) {
                        throw new RuntimeException("产品批号:" + salesLedgerProductImportDto.getBatchNo() + ",库存无对应产品数据!");
                    }
                    BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                    salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                    salesLedgerProduct.setType(1);
@@ -458,16 +462,13 @@
                    salesLedgerProduct.setApproveStatus(0);
                    salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
                    salesLedgerProductMapper.insert(salesLedgerProduct);
                    // æ·»åŠ ç”Ÿäº§æ•°æ®
                    salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
                }
            }
            return AjaxResult.success("导入成功");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
        return AjaxResult.success("导入失败");
    }
    @Override
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -5,15 +5,22 @@
<mapper namespace="com.ruoyi.sales.mapper.SalesLedgerProductMapper">
    <select id="selectSalesLedgerProductList" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
        WITH stock_summary AS (
        SELECT
        product_model_id,
        SUM(qualitity) AS total_quantity,
        SUM(locked_quantity) AS total_locked
        FROM stock_inventory
        GROUP BY product_model_id
        )
        SELECT
        T1.*,
        CASE
        WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >= IFNULL(T1.quantity, 0) THEN 1
        WHEN (IFNULL(s.total_quantity, 0) - IFNULL(s.total_locked, 0)) >= IFNULL(T1.quantity, 0) THEN 1
        ELSE 0
        END as has_sufficient_stock
        FROM
        sales_ledger_product T1
        LEFT JOIN stock_inventory t2 ON T1.product_model_id = t2.product_model_id
        FROM sales_ledger_product T1
        LEFT JOIN stock_summary s ON T1.product_model_id = s.product_model_id
        <where>
            <if test="salesLedgerProduct.salesLedgerId != null">
                AND T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId}
src/main/resources/static/²É¹ºÌ¨Õ˵¼ÈëÄ£°å.xlsx
Binary files differ
src/main/resources/static/ÏúÊŲ̂Õ˵¼ÈëÄ£°å.xlsx
Binary files differ