无关风月
10 小时以前 27d8f8fbb2e02be63338b80f808969faa35adac0
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
package com.ruoyi.system.service.impl;
 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationAssetMapper;
import com.ruoyi.system.model.OaApprovalApplicationAsset;
import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
import com.ruoyi.system.service.OaApprovalApplicationAssetService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalTodoService;
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 OaApprovalApplicationAssetServiceImpl extends ServiceImpl<OaApprovalApplicationAssetMapper, OaApprovalApplicationAsset> implements OaApprovalApplicationAssetService {
 
    private final OaApprovalApplicationsService oaApprovalApplicationsService;
    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
    private final OaApprovalTodoService oaApprovalTodoService;
    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitReceive(OaApprovalApplicationAssetReceiveDTO dto) {
        if (CollectionUtils.isEmpty(dto.getAssetItems())) {
            throw new ServiceException("领用资产列表不能为空");
        }
 
        // 1. 构建并保存审批主表
        OaApprovalApplications applications = buildOaApprovalApplications(dto);
 
        // 2. 获取流程首节点,设置当前节点,并保存
        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.GRAB.getCode());
        applications.setCurrentFlowNodeId(firstFlowNode.getId());
        oaApprovalApplicationsService.save(applications);
 
        // 3. 创建待办
        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
 
        // 4. 保存领用明细
        OaApprovalApplicationAsset detail = buildOaApprovalApplicationAsset(dto, applications.getId());
        this.save(detail);
 
        // 5. 保存关联的资产项
        List<OaApprovalApplicationAssetItem> items = dto.getAssetItems().stream()
                .map(i -> {
                    OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem();
                    item.setApprovalApplicationId(applications.getId());
                    item.setAssetMainId(i.getAssetMainId());
                    return item;
                })
                .collect(Collectors.toList());
        oaApprovalApplicationAssetItemService.saveBatch(items);
    }
 
    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);
    }
 
    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationAssetReceiveDTO dto) {
        OaApprovalApplications applications = new OaApprovalApplications();
        applications.setApplicationCode(generateApplicationCode());
        applications.setApprovalId(ApprovalTypeEnum.GRAB.getCode());
        applications.setApplicantUserId(dto.getApplicantUserId());
        applications.setApplicantName(dto.getApplicantName());
        applications.setDeptId(dto.getDeptId());
        applications.setDeptName(dto.getDeptName());
        applications.setApplicationDate(dto.getOperateTime());
        applications.setApplicationReason(dto.getApplicationReason());
        applications.setAttachmentUrl(dto.getAttachmentUrl());
        applications.setDisabled(0);
        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
        return applications;
    }
 
    private OaApprovalApplicationAsset buildOaApprovalApplicationAsset(OaApprovalApplicationAssetReceiveDTO dto, Integer applicationId) {
        OaApprovalApplicationAsset asset = new OaApprovalApplicationAsset();
        asset.setApprovalApplicationId(applicationId);
        asset.setTitle(dto.getTitle());
        asset.setAssetTypeId(dto.getAssetTypeId());
        asset.setOperateTime(dto.getOperateTime());
        asset.setExpectReturnDate(dto.getExpectReturnDate());
        asset.setType(Boolean.FALSE); // 0-领用
        return asset;
    }
 
    /**
     * 生成申请单号:LY + yyyyMMdd + 3位序号
     */
    private String generateApplicationCode() {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String prefix = "LY" + dateStr;
        Long count = oaApprovalApplicationsService.lambdaQuery()
                .like(OaApprovalApplications::getApplicationCode, prefix)
                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
                .count();
        int sequence = (count != null ? count.intValue() : 0) + 1;
        String sequenceStr = String.format("%03d", sequence);
        return prefix + sequenceStr;
    }
}