mitao
14 小时以前 6534aeb7d0f8bf1541140645d161ffade21b3fbc
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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.OaApprovalApplicationPurchaseDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper;
import com.ruoyi.system.model.OaApprovalApplicationPurchase;
import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalApplicationPurchaseItemService;
import com.ruoyi.system.service.OaApprovalApplicationPurchaseService;
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;
 
/**
 * <p>
 * 采购申请详情 服务实现类
 * </p>
 *
 * @author WuGuanFengYue
 * @since 2025-09-15
 */
@Service
@RequiredArgsConstructor
public class OaApprovalApplicationPurchaseServiceImpl extends ServiceImpl<OaApprovalApplicationPurchaseMapper, OaApprovalApplicationPurchase> implements OaApprovalApplicationPurchaseService {
 
    private final OaApprovalApplicationsService oaApprovalApplicationsService;
    private final OaApprovalApplicationPurchaseItemService oaApprovalApplicationPurchaseItemService;
    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
    private final OaApprovalTodoService oaApprovalTodoService;
    private final ISysUserService sysUserService;
    private final ISysDeptService sysDeptService;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submit(OaApprovalApplicationPurchaseDTO dto) {
        // 1. 保存审批申请主表数据
        OaApprovalApplications applications = buildOaApprovalApplications(dto);
        
        // 2. 如果是提交操作,获取流程节点并创建待办
        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(dto.getApprovalId());
        applications.setCurrentFlowNodeId(firstFlowNode.getId());
        oaApprovalApplicationsService.save(applications);
 
        // 3. 创建待办事项记录(公共服务)
        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
 
        // 4.保存采购资产明细数据
        List<OaApprovalApplicationPurchaseItem> items = buildOaApprovalApplicationPurchaseItems(dto, applications.getId());
        oaApprovalApplicationPurchaseItemService.saveBatch(items);
 
        // 5. 保存采购申请详情数据
        OaApprovalApplicationPurchase purchase = buildOaApprovalApplicationPurchase(dto, applications.getId());
        save(purchase);
    }
    /**
     * 获取第一个流程节点
     */
    private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
        // 1. 查询审批流程配置
        List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery()
                .eq(OaApprovalFlowNode::getApprovalId, approvalId)
                .eq(OaApprovalFlowNode::getStatus, 1) // 启用状态
                .orderByAsc(OaApprovalFlowNode::getSortOrder)
                .list();
 
        if (CollectionUtils.isEmpty(flowNodes)) {
            throw new ServiceException("未找到有效的审批流程配置");
        }
 
        // 2. 获取第一个流程节点
        return flowNodes.get(0);
    }
 
    /**
     * 构建审批申请主表数据
     */
    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) {
        OaApprovalApplications applications = new OaApprovalApplications();
        applications.setApplicationCode(generateApplicationCode());
        applications.setApprovalId(dto.getApprovalId());
        applications.setApplicantUserId(dto.getApplicantUserId());
        applications.setApplicantName(dto.getApplicantName());
        applications.setDeptId(dto.getDeptId());
        applications.setDeptName(dto.getDeptName());
        applications.setApplicationDate(dto.getApplicationDate());
        applications.setApplicationReason(dto.getApplicationReason());
        applications.setAttachmentUrl(dto.getAttachmentUrl());
        applications.setDisabled(0); // 未删除
        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
        return applications;
    }
 
    /**
     * 构建采购申请详情数据
     */
    private OaApprovalApplicationPurchase buildOaApprovalApplicationPurchase(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) {
        OaApprovalApplicationPurchase purchase = new OaApprovalApplicationPurchase();
        purchase.setApprovalApplicationId(applicationId);
        // 使用事项标题,而非采购说明
        purchase.setTitle(dto.getTitle());
        // 表结构中无 application_date 字段,此处不再设置
        purchase.setAssetTypeId(dto.getAssetTypeId());
        purchase.setTotalAmount(dto.getTotalAmount());
 
        return purchase;
    }
 
    /**
     * 构建采购资产明细数据
     */
    private List<OaApprovalApplicationPurchaseItem> buildOaApprovalApplicationPurchaseItems(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) {
        return dto.getPurchaseItems().stream()
                .map(item -> {
                    OaApprovalApplicationPurchaseItem purchaseItem = new OaApprovalApplicationPurchaseItem();
                    purchaseItem.setApprovalApplicationId(applicationId);
                    purchaseItem.setAssetName(item.getAssetName());
                    purchaseItem.setAssetTypeId(item.getAssetTypeId());
                    purchaseItem.setSpec(item.getSpec());
                    purchaseItem.setUnit(item.getUnit());
                    purchaseItem.setQuantity(item.getQuantity());
                    purchaseItem.setPrice(item.getPrice());
                    purchaseItem.setTotalAmount(item.getTotalAmount());
                    return purchaseItem;
                })
                .collect(java.util.stream.Collectors.toList());
    }
 
    /**
     * 生成申请单号
     * 格式:CG + 年月日 + 3位序号
     */
    private String generateApplicationCode() {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String prefix = "CG" + dateStr;
        
        // 查询当天已生成的申请单号数量
        Long count = oaApprovalApplicationsService.lambdaQuery()
                .like(OaApprovalApplications::getApplicationCode, prefix)
                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
                .count();
        
        // 生成3位序号,从001开始
        int sequence = (count != null ? count.intValue() : 0) + 1;
        String sequenceStr = String.format("%03d", sequence);
        
        return prefix + sequenceStr;
    }
}