2026-04-16 6ad5c2cdc193cf7bb02884961b7434cd7f607a0d
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
package com.ruoyi.production.service.impl;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.service.ProductStructureService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
 
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
 
@Service
@AllArgsConstructor
@Slf4j
public class ProcessRouteServiceImpl extends ServiceImpl<ProcessRouteMapper, ProcessRoute> implements ProcessRouteService {
 
    @Autowired
    private ProcessRouteMapper processRouteMapper;
 
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
 
    @Autowired
    private ProductOrderMapper productOrderMapper;
 
    @Autowired
    private ProductStructureService productStructureService;
 
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
        return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
    }
 
    @Override
    public Integer saveProcessRoute(ProcessRoute processRoute) {
        normalizeProductModelIds(processRoute);
        this.save(processRoute);
 
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String routeCode = "GYLX" + dateStr + idStr;
        processRoute.setProcessRouteCode(routeCode);
 
        List<ProductStructureDto> productStructureDtos = productStructureService.listDetailBybomId(processRoute.getBomId());
        if (CollectionUtils.isNotEmpty(productStructureDtos)) {
            AtomicInteger i = new AtomicInteger(1);
            productStructureDtos.forEach(productStructureDto -> {
                ProcessRouteItem processRouteItem = new ProcessRouteItem();
                processRouteItem.setRouteId(processRoute.getId());
                processRouteItem.setProcessId(productStructureDto.getProcessId());
                processRouteItem.setProductModelId(processRoute.getProductModelId());
                processRouteItem.setProductModelIds(processRoute.getProductModelIds());
                processRouteItem.setDragSort(i.get());
                processRouteItem.setIsQuality(false);
                processRouteItemMapper.insert(processRouteItem);
                i.getAndIncrement();
            });
        }
        return processRouteMapper.updateById(processRoute);
    }
 
    @Override
    public int batchDelete(List<Long> ids) {
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids)
        );
        if (!productOrders.isEmpty()) {
            throw new RuntimeException("该工艺路线已被生产订单引用,不能删除");
        }
        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
        return processRouteMapper.deleteBatchIds(ids);
    }
 
    private void normalizeProductModelIds(ProcessRoute processRoute) {
        if (processRoute == null) {
            return;
        }
        String ids = joinProductModelIds(
                processRoute.getProductModelIdList(),
                processRoute.getProductModelIds(),
                processRoute.getProductModelId()
        );
        processRoute.setProductModelIds(ids);
        processRoute.setProductModelId(firstProductModelId(ids, processRoute.getProductModelId()));
    }
 
    private String joinProductModelIds(List<Long> idList, String ids, Long fallbackId) {
        if (CollectionUtils.isNotEmpty(idList)) {
            return idList.stream()
                    .filter(item -> item != null && item > 0)
                    .distinct()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));
        }
        if (StringUtils.hasText(ids)) {
            return Arrays.stream(ids.split(","))
                    .map(String::trim)
                    .filter(StringUtils::hasText)
                    .distinct()
                    .collect(Collectors.joining(","));
        }
        return fallbackId == null ? null : String.valueOf(fallbackId);
    }
 
    private Long firstProductModelId(String ids, Long fallbackId) {
        if (!StringUtils.hasText(ids)) {
            return fallbackId;
        }
        String first = ids.split(",")[0].trim();
        if (!StringUtils.hasText(first)) {
            return fallbackId;
        }
        try {
            return Long.parseLong(first);
        } catch (NumberFormatException ignore) {
            return fallbackId;
        }
    }
}