liding
6 小时以前 51786b723d0a91d11476776d9ce50af7994dc4bd
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
package com.ruoyi.inspect.service.impl;
 
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
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.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.SampleReceiptActionDto;
import com.ruoyi.inspect.dto.SampleReceiptPageDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
import com.ruoyi.inspect.mapper.InsSampleUserMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import com.ruoyi.inspect.pojo.InsSampleUser;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsOrderStateService;
import com.ruoyi.inspect.service.InsSampleReceiptService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
 
@Service
@AllArgsConstructor
public class InsSampleReceiptServiceImpl extends ServiceImpl<InsSampleReceiptMapper, InsSampleReceipt>
        implements InsSampleReceiptService {
    private final InsSampleReceiptMapper receiptMapper;
    private final InsOrderMapper insOrderMapper;
    private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
    private final InsSampleMapper insSampleMapper;
    private final InsProductMapper insProductMapper;
    private final InsSampleUserMapper insSampleUserMapper;
    private final InsOrderStateService insOrderStateService;
    private final InsOrderService insOrderService;
    private final UserMapper userMapper;
 
    @Override
    public com.baomidou.mybatisplus.core.metadata.IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) {
        return receiptMapper.selectPage(page, query);
    }
 
    @Override
    public SampleReceiptPageDto detail(Integer id) {
        return receiptMapper.selectDetail(id);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submit(SampleReceiptActionDto dto) {
        if (dto == null || dto.getReceiptId() == null || dto.getMainInspectorId() == null) {
            throw new ErrorException("请选择主检验人");
        }
        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
        ensurePending(receipt);
        InsOrder order = insOrderMapper.selectById(receipt.getInsOrderId());
        if (order == null || !Integer.valueOf(1).equals(order.getState())) {
            throw new ErrorException("该委托当前状态不允许样品接收");
        }
        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getInsOrderId, order.getId()).orderByAsc(InsSample::getId));
        if (samples.size() != 1 || !samples.get(0).getId().equals(receipt.getInsSampleId())) {
            throw new ErrorException("该委托的样品数量异常,请检查下单数据");
        }
        InsSample sample = samples.get(0);
        // 只走新聚直绑模板流程:委托单必须已绑定原始记录模板(下单时生成订单模板快照)
        Long snapshotCount = insOrderStandardTemplateMapper.selectCount(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
        if (snapshotCount == 0) {
            throw new ErrorException("该委托未绑定原始记录模板,不能提交检验");
        }
        Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getInsSampleId, sample.getId()).eq(InsProduct::getState, 1));
        if (productCount == 0) {
            throw new ErrorException("该委托未绑定检验项目,不能提交检验");
        }
        if (userMapper.selectById(dto.getMainInspectorId()) == null) {
            throw new ErrorException("主检验人不存在或已停用");
        }
        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, order.getId())) > 0
                || insSampleUserMapper.selectCount(Wrappers.<InsSampleUser>lambdaQuery()
                .eq(InsSampleUser::getInsSampleId, order.getId())) > 0) {
            throw new ErrorException("该委托已进入检验任务,不能重复提交");
        }
        String appointed = LocalDateTime.now().plusHours(insProductMapper.selectOrderManDay(order.getId()))
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        insOrderService.upInsOrder(order.getId(), sample.getId(), appointed, dto.getMainInspectorId(), null);
        receipt.setStatus(1);
        receipt.setMainInspectorId(dto.getMainInspectorId());
        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
        receipt.setReceiveTime(LocalDateTime.now());
        receipt.setSubmitTime(LocalDateTime.now());
        receiptMapper.updateById(receipt);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void reject(SampleReceiptActionDto dto) {
        if (dto == null || dto.getReceiptId() == null || StringUtils.isBlank(dto.getRemark())) {
            throw new ErrorException("请填写拒收备注");
        }
        if (dto.getRemark().trim().length() > 500) {
            throw new ErrorException("拒收备注不能超过500个字符");
        }
        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
        ensurePending(receipt);
        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, receipt.getInsOrderId())) > 0) {
            throw new ErrorException("该委托已进入检验任务,不能拒收");
        }
        receipt.setStatus(2);
        receipt.setRejectRemark(dto.getRemark().trim());
        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
        receipt.setReceiveTime(LocalDateTime.now());
        receiptMapper.updateById(receipt);
        InsOrder order = new InsOrder();
        order.setId(receipt.getInsOrderId());
        order.setState(5);
        insOrderMapper.updateById(order);
    }
 
    private void ensurePending(InsSampleReceipt receipt) {
        if (receipt == null || !Integer.valueOf(0).equals(receipt.getStatus())) {
            throw new ErrorException("该样品接收记录已被处理,请刷新后重试");
        }
    }
 
    @Override
    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
        List<SampleReceiptPageDto> list = receiptMapper.selectExportList(query);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        try {
            String fileName = URLEncoder.encode("样品接收导出", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet sheet = EasyExcel.writerSheet(0, "样品接收导出").head(SampleReceiptPageDto.class).build();
            excelWriter.write(list, sheet);
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
}