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
package com.ruoyi.production.controller;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.service.ProductProcessRouteItemService;
import com.ruoyi.production.service.ProductWorkOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
 
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
@RequestMapping("/productProcessRoute")
@RestController
@AllArgsConstructor
@Api(tags = "生产工艺路线")
public class ProductProcessRouteItemController {
 
    private ProductProcessRouteItemService productProcessRouteItemService;
 
    private ProductWorkOrderService productWorkOrderService;
 
    private ProductWorkOrderMapper productWorkOrderMapper;
 
    @GetMapping("list")
    @ApiOperation("根据Id查询工艺项目")
    public R list(Long orderId) {
        return R.ok(productProcessRouteItemService.listItem(orderId));
    }
 
    @PostMapping("/updateRouteItem")
    @ApiOperation("批量新增修改")
    @Transactional(rollbackFor = Exception.class)
    public R addOrUpdate(@RequestBody ProductProcessRouteItemDto processRouteItemDto) {
        List<ProductProcessRouteItem> items = processRouteItemDto.getProcessRouteItem();
        if (CollectionUtils.isEmpty(items)) {
            return R.ok();
        }
 
        Map<Boolean, List<ProductProcessRouteItem>> partitioned = items.stream()
                .collect(Collectors.partitioningBy(
                        item -> item.getId() != null && item.getId() > 0
                ));
 
        List<ProductProcessRouteItem> toUpdate = partitioned.get(true);
        List<ProductProcessRouteItem> toInsert = partitioned.get(false);
        // 批量处理
        boolean result = true;
        if (!toInsert.isEmpty()) {
            result = productProcessRouteItemService.saveBatch(toInsert);
            if (result) {
                // 生成工单号
                String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                // 查询今日最大工单号
                QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
                queryWrapper.likeRight("work_order_no", datePrefix)
                        .select("MAX(work_order_no) as maxNo");
 
                List<Map<String, Object>> maxNoList = productWorkOrderMapper.selectMaps(queryWrapper);
                String maxWorkOrderNo = null;
                if (!maxNoList.isEmpty() && maxNoList.get(0) != null && maxNoList.get(0).get("maxNo") != null) {
                    maxWorkOrderNo = maxNoList.get(0).get("maxNo").toString();
                }
                int startSequence = 1;
                if (maxWorkOrderNo != null && maxWorkOrderNo.startsWith(datePrefix)) {
                    try {
                        String seqStr = maxWorkOrderNo.substring(datePrefix.length());
                        startSequence = Integer.parseInt(seqStr) + 1;
                    } catch (NumberFormatException e) {
                        startSequence = 1;
                    }
                }
                // 批量生成工单
                List<ProductWorkOrder> workOrders = new ArrayList<>();
                for (int i = 0; i < toInsert.size(); i++) {
                    ProductProcessRouteItem item = toInsert.get(i);
                    String workOrderNoStr = String.format("%s%03d", datePrefix, startSequence + i);
                    ProductWorkOrder workOrder = new ProductWorkOrder();
                    workOrder.setProductProcessRouteItemId(item.getId());
                    workOrder.setProductOrderId(item.getRouteId());
                    workOrder.setWorkOrderNo(workOrderNoStr);
                    workOrder.setStatus(1);
                    workOrders.add(workOrder);
                }
                result = productWorkOrderService.saveBatch(workOrders);
            }
        }
        if (!toUpdate.isEmpty()) {
            result = productProcessRouteItemService.updateBatchById(toUpdate) && result;
        }
        return R.ok(result);
    }
 
    @DeleteMapping("/deleteRouteItem")
    @ApiOperation("删除生产工艺路线")
    @Transactional(rollbackFor = Exception.class)
    public R deleteRouteItem(@RequestBody ProductProcessRouteItemDto processRouteItemDto) {
        if (processRouteItemDto == null || processRouteItemDto.getId() == null) {
            return R.fail("参数错误,ID不能为空");
        }
 
        try {
            // 先删除关联的工单数据
            LambdaQueryWrapper<ProductWorkOrder> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(ProductWorkOrder::getProductProcessRouteItemId, processRouteItemDto.getId());
            productWorkOrderMapper.delete(wrapper);
 
            // 删除主表数据
            productProcessRouteItemService.removeById(processRouteItemDto.getId());
            return R.ok();
        } catch (Exception e) {
            throw new RuntimeException("删除失败:" + e.getMessage());
        }
    }
 
}