mitao
20 小时以前 7c0a8a91ae6d1c684e7a358929f4bd04f3f4bfe8
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -1,9 +1,9 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageGeneralDTO;
import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO;
@@ -12,22 +12,38 @@
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.emums.AssetTypeEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationStorageMapper;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.model.AssetGeneralExt;
import com.ruoyi.system.model.AssetMain;
import com.ruoyi.system.model.AssetPropertyExt;
import com.ruoyi.system.model.AssetVehicleExt;
import com.ruoyi.system.model.AssetWarehouse;
import com.ruoyi.system.model.OaApprovalApplicationStorage;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.service.AssetGeneralExtService;
import com.ruoyi.system.service.AssetMainService;
import com.ruoyi.system.service.AssetPropertyExtService;
import com.ruoyi.system.service.AssetTypeService;
import com.ruoyi.system.service.AssetVehicleExtService;
import com.ruoyi.system.service.AssetWarehouseService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalApplicationStorageService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.service.TDeptService;
import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -51,6 +67,8 @@
    private final OaApprovalTodoService oaApprovalTodoService;
    private final ISysUserService sysUserService;
    private final ISysDeptService sysDeptService;
    private final TDeptService tDeptService;
    private final AssetWarehouseService assetWarehouseService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -71,7 +89,7 @@
        save(storage);
        // 5. 保存通用资产数据
        saveGeneralAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
        saveGeneralAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
    }
    @Override
@@ -93,7 +111,7 @@
        save(storage);
        // 5. 保存房产资产数据
        savePropertyAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
        savePropertyAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
    }
    @Override
@@ -115,13 +133,13 @@
        save(storage);
        // 5. 保存车辆资产数据
        saveVehicleAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
        saveVehicleAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
    }
    /**
     * 保存通用资产数据
     */
    private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) {
        List<AssetMain> allAssetMains = new ArrayList<>();
        List<AssetGeneralExt> allGeneralExts = new ArrayList<>();
        
@@ -129,7 +147,7 @@
            // 根据数量创建对应数量的资产记录
            int quantity = item.getQuantity().intValue();
            for (int i = 0; i < quantity; i++) {
                AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate);
                AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate, baseDto);
                assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode());
                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -157,7 +175,7 @@
    /**
     * 保存房产资产数据
     */
    private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) {
        List<AssetMain> allAssetMains = new ArrayList<>();
        List<AssetPropertyExt> allPropertyExts = new ArrayList<>();
        
@@ -165,7 +183,7 @@
            // 根据数量创建对应数量的资产记录
            int quantity = item.getQuantity().intValue();
            for (int i = 0; i < quantity; i++) {
                AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate);
                AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate, baseDto);
                assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode());
                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -193,7 +211,7 @@
    /**
     * 保存车辆资产数据
     */
    private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) {
        List<AssetMain> allAssetMains = new ArrayList<>();
        List<AssetVehicleExt> allVehicleExts = new ArrayList<>();
        
@@ -201,7 +219,7 @@
            // 根据数量创建对应数量的资产记录
            int quantity = item.getQuantity().intValue();
            for (int i = 0; i < quantity; i++) {
                AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate);
                AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate, baseDto);
                assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode());
                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -229,7 +247,7 @@
    /**
     * 构建通用资产主表数据
     */
    private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) {
        AssetMain assetMain = new AssetMain();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -242,10 +260,9 @@
        assetMain.setUsefulLife(item.getUsefulLife());
        assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
        assetMain.setUserName(item.getUserName());
        assetMain.setUseDeptId(item.getUseDeptId());
        assetMain.setWarehouseId(item.getWarehouseId());
        assetMain.setWarehouseName(item.getWarehouseName());
        assetMain.setAddress(item.getAddress());
        // 根据整单 addressType 写入使用部门ID或仓库ID
        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
        assetMain.setAssetMainType(baseDto.getAddressType());
        assetMain.setAssetStatus(item.getAssetStatus());
        assetMain.setRemarks(item.getRemarks());
        assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -260,7 +277,7 @@
    /**
     * 构建房产资产主表数据
     */
    private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) {
        AssetMain assetMain = new AssetMain();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -273,10 +290,8 @@
        assetMain.setUsefulLife(item.getUsefulLife());
        assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
        assetMain.setUserName(item.getUserName());
        assetMain.setUseDeptId(item.getUseDeptId());
        assetMain.setWarehouseId(item.getWarehouseId());
        assetMain.setWarehouseName(item.getWarehouseName());
        assetMain.setAddress(item.getAddress());
        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
        assetMain.setAssetMainType(baseDto.getAddressType());
        assetMain.setAssetStatus(item.getAssetStatus());
        assetMain.setRemarks(item.getRemarks());
        assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -291,7 +306,7 @@
    /**
     * 构建车辆资产主表数据
     */
    private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
    private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) {
        AssetMain assetMain = new AssetMain();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -304,10 +319,8 @@
        assetMain.setUsefulLife(item.getUsefulLife());
        assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
        assetMain.setUserName(item.getUserName());
        assetMain.setUseDeptId(item.getUseDeptId());
        assetMain.setWarehouseId(item.getWarehouseId());
        assetMain.setWarehouseName(item.getWarehouseName());
        assetMain.setAddress(item.getAddress());
        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
        assetMain.setAssetMainType(baseDto.getAddressType());
        assetMain.setAssetStatus(item.getAssetStatus());
        assetMain.setRemarks(item.getRemarks());
        assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -317,6 +330,46 @@
        assetMain.setAccountingAmount(item.getAccountingAmount());
        assetMain.setDisabled(false);
        return assetMain;
    }
    /**
     * 按整单地址类型设置资产主表位置信息(使用部门ID或仓库ID或地址)
     */
    private void applyAddressToAssetMain(AssetMain assetMain, Integer addressType, String useDeptName, String warehouseName, String address) {
        if (addressType == null) {
            return;
        }
        switch (addressType) {
            case 0:
                // 使用部门
                if (useDeptName != null && !useDeptName.isEmpty()) {
                    TDept dept = tDeptService.lambdaQuery()
                            .eq(TDept::getDeptName, useDeptName)
                            .one();
                    if (dept != null) {
                        assetMain.setUseDeptId(dept.getId());
                    }
                }
                break;
            case 1:
                if (warehouseName != null && !warehouseName.isEmpty()) {
                    AssetWarehouse warehouse = assetWarehouseService.lambdaQuery()
                            .eq(AssetWarehouse::getWarehouseName, warehouseName)
                            .one();
                    if (warehouse != null) {
                        assetMain.setWarehouseId(warehouse.getId());
                        assetMain.setWarehouseName(warehouse.getWarehouseName());
                    }
                }
                break;
            case 2:
                if (address != null && !address.isEmpty()) {
                    assetMain.setAddress(address);
                }
                break;
            default:
                // ignore
        }
    }
    /**
@@ -407,7 +460,7 @@
    private OaApprovalApplications buildOaApprovalApplications(Object dto) {
        OaApprovalApplications applications = new OaApprovalApplications();
        applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
        applications.setApplicationDate(LocalDate.now());
        if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
            OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
            applications.setApplicantUserId(generalDTO.getApplicantUserId());
@@ -517,4 +570,10 @@
        
        return prefix + sequenceStr;
    }
    @Override
    public IPage<OaApprovalApplicationStoragePageVO> getPageList(com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery pageQuery) {
        Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
        return this.baseMapper.selectApplicationStoragePage(page, pageQuery);
    }
}