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("导出失败");
|
}
|
}
|
}
|