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
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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.MatrixToImageWriter;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
import com.ruoyi.production.service.ProductWorkOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Service
@Transactional(rollbackFor = Exception.class)
public class ProductWorkOrderServiceImpl extends ServiceImpl<ProductWorkOrderMapper, ProductWorkOrder> implements ProductWorkOrderService {
 
    @Autowired
    private ProductWorkOrderMapper productWorkOrdermapper;
    @Autowired
    private ProductWorkOrderFileMapper productWorkOrderFileMapper;
 
    @Value("${file.temp-dir}")
    private String tempDir;
 
    @Override
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        Long userId = SecurityUtils.getUserId();
        boolean isAdmin = SecurityUtils.isAdmin(userId) || SecurityUtils.hasRole(Constants.SUPER_ADMIN);
        return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder, userId, isAdmin);
    }
 
    @Override
    public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) {
        checkWorkOrderPermission(productWorkOrderDto.getId());
        return productWorkOrdermapper.updateById(productWorkOrderDto);
    }
 
    @Override
    public ProductWorkOrder getProductWorkOrderById(Long id) {
        checkWorkOrderPermission(id);
        return this.getById(id);
    }
 
    @Override
    public void down(HttpServletResponse response, ProductWorkOrder productWorkOrder) {
        checkWorkOrderPermission(productWorkOrder.getId());
        ProductWorkOrderDto productWorkOrderDto = productWorkOrdermapper.getProductWorkOrderFlowCard(productWorkOrder.getId());
        String codePath;
        try {
            codePath = new MatrixToImageWriter().code(productWorkOrderDto.getId().toString(), tempDir);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        List<Map<String, Object>> images = new ArrayList<>();
        List<ProductWorkOrderFile> productWorkOrderFiles = productWorkOrderFileMapper.selectList(Wrappers.<ProductWorkOrderFile>lambdaQuery().eq(ProductWorkOrderFile::getWorkOrderId, productWorkOrder.getId()));
        if (CollectionUtils.isNotEmpty(productWorkOrderFiles)) {
            productWorkOrderFiles.forEach(productWorkOrderFile -> {
                Map<String, Object> image = new HashMap<>();
                PictureRenderData pictureRenderData = Pictures.ofLocal(productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
                image.put("url", pictureRenderData);
                images.add(image);
            });
        }
        InputStream inputStream = this.getClass().getResourceAsStream("/static/work-order-template.docx");
        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(
                new HashMap<String, Object>() {{
                    put("process", productWorkOrderDto.getProcessName());
                    put("workOrderNo", productWorkOrderDto.getWorkOrderNo());
                    put("productOrderNpsNo", productWorkOrderDto.getProductOrderNpsNo());
                    put("productName", productWorkOrderDto.getProductName());
                    put("planQuantity", productWorkOrderDto.getPlanQuantity());
                    put("model", productWorkOrderDto.getModel());
                    put("completeQuantity", productWorkOrderDto.getCompleteQuantity());
                    put("scrapQty", productWorkOrderDto.getScrapQty());
                    put("planStartTime", productWorkOrderDto.getPlanStartTime());
                    put("planEndTime", productWorkOrderDto.getPlanEndTime());
                    put("actualStartTime", productWorkOrderDto.getActualStartTime());
                    put("actualEndTime", productWorkOrderDto.getActualEndTime());
                    put("twoCode", Pictures.ofLocal(codePath).create());
                    put("images", images.isEmpty() ? null : images);
                }});
 
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode("流转卡", "UTF-8");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
 
    private void checkWorkOrderPermission(Long workOrderId) {
        if (workOrderId == null) {
            throw new RuntimeException("工单ID不能为空");
        }
        Long userId = SecurityUtils.getUserId();
        boolean isAdmin = SecurityUtils.isAdmin(userId) || SecurityUtils.hasRole(Constants.SUPER_ADMIN);
        if (isAdmin) {
            return;
        }
        Integer count = productWorkOrdermapper.checkUserCanAccess(workOrderId, userId);
        if (count == null || count == 0) {
            throw new RuntimeException("无权访问该工单");
        }
    }
}