mitao
1 天以前 d9a63819279a0b17070d4af08d24f567ba8904e4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.ruoyi.system.service.impl;
 
import cn.hutool.core.bean.BeanUtil;
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.exception.ServiceException;
import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationDisposeMapper;
import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
import com.ruoyi.system.model.OaApprovalApplicationDispose;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
 
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 资产处置单明细表 服务实现类
 * </p>
 *
 * @author WuGuanFengYue
 * @since 2025-09-15
 */
@Service
@RequiredArgsConstructor
public class OaApprovalApplicationDisposeServiceImpl extends ServiceImpl<OaApprovalApplicationDisposeMapper, OaApprovalApplicationDispose> implements OaApprovalApplicationDisposeService {
 
    private final OaApprovalApplicationsService oaApprovalApplicationsService;
    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
    private final OaApprovalTodoService oaApprovalTodoService;
    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
 
    @Override
    public IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(OaApprovalApplicationDisposePageQuery pageQuery) {
        Page<OaApprovalApplicationDisposePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
        return this.baseMapper.getDisposePageList(page, pageQuery);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitDispose(OaApprovalApplicationDisposeDTO dto) {
        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
            throw new ServiceException("资产ID列表不能为空");
        }
        
        // 1. 构建并保存审批主表
        OaApprovalApplications applications = buildOaApprovalApplications(dto);
 
        // 2. 获取流程首节点,设置当前节点,并保存
        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.ASSET_DISPOSE.getCode());
        applications.setCurrentFlowNodeId(firstFlowNode.getId());
        oaApprovalApplicationsService.save(applications);
 
        // 3. 创建待办
        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
 
        // 4. 保存处置明细
        OaApprovalApplicationDispose detail = buildOaApprovalApplicationDispose(dto, applications.getId());
        this.save(detail);
 
        // 5. 保存关联的资产项
        List<OaApprovalApplicationAssetItem> items = dto.getAssetMainIds().stream()
                .map(i -> {
                    OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem();
                    item.setApprovalApplicationId(applications.getId());
                    item.setAssetMainId(i);
                    return item;
                })
                .collect(Collectors.toList());
        oaApprovalApplicationAssetItemService.saveBatch(items);
    }
 
    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationDisposeDTO dto) {
        OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
        applications.setApplicationCode(generateApplicationCode("CZ"));
        applications.setApprovalId(ApprovalTypeEnum.ASSET_DISPOSE.getCode());
        applications.setApplicationDate(LocalDate.now());
        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
        return applications;
    }
 
    private OaApprovalApplicationDispose buildOaApprovalApplicationDispose(OaApprovalApplicationDisposeDTO dto, Integer applicationId) {
        OaApprovalApplicationDispose dispose = BeanUtil.copyProperties(dto, OaApprovalApplicationDispose.class);
        dispose.setApprovalApplicationId(applicationId);
        return dispose;
    }
 
    private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
        List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, approvalId)
                .eq(OaApprovalFlowNode::getStatus, 1)
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .list();
        if (CollectionUtils.isEmpty(flowNodes)) {
            throw new ServiceException("未找到有效的审批流程配置");
        }
        return flowNodes.get(0);
    }
 
    /**
     * 生成申请单号:CZ + yyyyMMdd + 3位序号
     */
    private String generateApplicationCode(String prefix) {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        prefix = prefix + dateStr;
        Long count = oaApprovalApplicationsService.lambdaQuery()
                .like(OaApprovalApplications::getApplicationCode, prefix)
                .count();
        return prefix + String.format("%03d", count + 1);
    }
 
    @Override
    public void deleteByApplicationId(Integer applicationId) {
        this.lambdaUpdate().eq(OaApprovalApplicationDispose::getApprovalApplicationId, applicationId).remove();
        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove();
        oaApprovalApplicationsService.removeById(applicationId);
    }
}