buhuazhen
4 天以前 aeb7d490c7fa55ae4861a43d256a5a9cf649d39c
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
package com.ruoyi.production.service.impl;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
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.ProcessRouteAnticlockwiseDto;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
 
@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;
    @Autowired
    private ProcessRouteItemService processRouteItemService;
    @Autowired
    private ProductWorkOrderService productWorkOrderService;
    @Autowired
    private ProductBomService productBomService;
    @Autowired
    private ProductProcessRouteService productProcessRouteService;
    @Autowired
    private ProductProcessRouteItemService productProcessRouteItemService;
    @Autowired
    private ProductOrderService productOrderService;
    @Autowired
    private ProductProcessService productProcessService;
 
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
 
        return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
    }
 
    @Override
    public Integer saveProcessRoute(ProcessRoute processRoute) {
        this.save(processRoute);
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String newProductCode = "GYLX" + dateStr + idStr;
        // 更新数据库中的productCode
        processRoute.setProcessRouteCode(newProductCode);
        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.size() > 0) {
            throw new RuntimeException("该工艺路线生产已引用,不能删除");
        }
        //删除工艺路线详情
        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
        return processRouteMapper.deleteBatchIds(ids);
    }
 
 
    /**
     * 工艺路线反向新增  新增了bom bom子表  工艺路线  工艺路线子表 生产工艺路线主表  生产工艺路线子表 工单表
     *
     * @param processRouteAnticlockwiseDtos 工艺子表
     * @param productModelId                成品规格型号id
     * @param productOrderId                生产订单id
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Long processRouteAnticlockwise(List<ProcessRouteAnticlockwiseDto> processRouteAnticlockwiseDtos, Long productModelId, Long productOrderId) {
        ProductOrder byId = productOrderService.getById(productOrderId);
        // 1. 新增BOM
        ProductBom productBom = createProductBom(productModelId);
 
        // 2. 新增BOM子表
        List<ProductStructure> productStructures = buildProductStructures(processRouteAnticlockwiseDtos, productBom.getId());
        productStructureService.saveBatch(productStructures);
 
        // 3. 新增工艺路线
        ProcessRoute processRoute = createProcessRoute(productModelId, productBom.getId());
 
        // 4. 新增工艺路线子表
        List<ProcessRouteItem> processRouteItems = buildProcessRouteItems(processRouteAnticlockwiseDtos, processRoute.getId(), productModelId);
        processRouteItemService.saveBatch(processRouteItems);
 
        // 5. 新增生产工艺路线
        ProductProcessRoute productProcessRoute = createProductProcessRoute(productModelId, productOrderId, productBom.getId(), processRoute.getProcessRouteCode());
 
        // 6. 新增生产工艺路线子表
        buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId, productOrderId);
        return processRoute.getId();
    }
 
    /**
     * 创建产品BOM
     */
    private ProductBom createProductBom(Long productModelId) {
        ProductBom productBom = new ProductBom();
        productBom.setProductModelId(productModelId);
        productBom.setVersion("1.0.0");
        productBomService.save(productBom);
 
        productBom.setBomNo("BM." + String.format("%05d", productBom.getId()));
        productBomService.updateById(productBom);
 
        return productBom;
    }
 
    /**
     * 构建产品结构列表
     */
    private List<ProductStructure> buildProductStructures(List<ProcessRouteAnticlockwiseDto> dtos, Integer bomId) {
        List<ProductStructure> structures = new ArrayList<>(dtos.size());
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProductStructure structure = new ProductStructure();
            structure.setProductModelId(dto.getProductModelId());
            structure.setProcessId(dto.getProcessId());
            structure.setUnitQuantity(new BigDecimal(1));
            structure.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            structure.setProcessRouteNum(dto.getProcessRouteNum());
            structure.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            structure.setProcessRouteRequire(dto.getProcessRouteRequire());
            structure.setBomId(bomId);
            structure.setProcessRouteName(dto.getProcessRouteName());
            structures.add(structure);
        }
        return structures;
    }
 
    /**
     * 创建工艺路线
     */
    private ProcessRoute createProcessRoute(Long productModelId, Integer bomId) {
        ProcessRoute processRoute = new ProcessRoute();
        processRoute.setProductModelId(productModelId);
        processRoute.setBomId(bomId);
        processRoute.setDescription("");
        this.save(processRoute);
 
        processRoute.setProcessRouteCode("GYLX." + String.format("%09d", processRoute.getId()));
        this.updateById(processRoute);
 
        return processRoute;
    }
 
    /**
     * 构建工艺路线子项列表
     */
    private List<ProcessRouteItem> buildProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long routeId, Long productModelId) {
        List<ProcessRouteItem> items = new ArrayList<>(dtos.size());
        Integer num = 0;
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProcessRouteItem item = new ProcessRouteItem();
            item.setRouteId(routeId);
            item.setProcessId(dto.getProcessId());
            item.setProductModelId(productModelId);
            item.setProcessRouteName(dto.getProcessRouteName());
            item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            item.setProcessRouteNum(dto.getProcessRouteNum());
            item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            item.setProcessRouteRequire(dto.getProcessRouteRequire());
            item.setDragSort(num++);
            items.add(item);
        }
        return items;
    }
 
    /**
     * 创建生产工艺路线
     */
    private ProductProcessRoute createProductProcessRoute(Long productModelId, Long productOrderId, Integer bomId, String processRouteCode) {
        ProductProcessRoute productProcessRoute = new ProductProcessRoute();
        productProcessRoute.setProductModelId(productModelId);
        productProcessRoute.setProductOrderId(productOrderId);
        productProcessRoute.setBomId(bomId);
        productProcessRoute.setProcessRouteCode(processRouteCode);
        productProcessRouteService.save(productProcessRoute);
 
        return productProcessRoute;
    }
 
    /**
     * 构建生产工艺路线子项列表
     */
    private void buildProductProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long productRouteId, Long productModelId, Long productOrderId) {
        ProductOrder byId = productOrderService.getById(productOrderId);
        Integer num = 0;
        for (ProcessRouteAnticlockwiseDto dto : dtos) {
            ProductProcessRouteItem item = new ProductProcessRouteItem();
            item.setProductRouteId(productRouteId);
            item.setProcessId(dto.getProcessId());
            if (num >= dtos.size() - 1) {
                item.setProductModelId(productModelId);
            } else {
                item.setProductModelId(dto.getProductModelId());
            }
            item.setProcessRouteName(dto.getProcessRouteName());
            item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            item.setProcessRouteNum(dto.getProcessRouteNum());
            item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
            item.setProcessRouteRequire(dto.getProcessRouteRequire());
            item.setDragSort(num++);
            item.setIsQuality(dto.getProductProcess().getIsQuality() != null && dto.getProductProcess().getIsQuality());
            item.setUuid(dto.getUuid());
            productProcessRouteItemService.save(item);
            ProductProcess productProcess = productProcessService.getById(item.getProcessId());
            //同步新增生产工单
            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
            productWorkOrder.setProductProcessRouteItemId(item.getId());
            productWorkOrder.setProductOrderId(productOrderId);
            productWorkOrder.setPlanQuantity(new BigDecimal(dto.getProcessRouteNum()));
            productWorkOrder.setDeviceId(dto.getDeviceId());
            productWorkOrder.setUserIds(dto.getUserIds());
            productWorkOrder.setUserNames(dto.getUserNames());
            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(productProcess.getName(), byId.getNpsNo()));
            productWorkOrder.setStatus(1);
            productWorkOrderService.save(productWorkOrder);
        }
    }
}