| | |
| | | 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.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.basic.dto.TemplateInspectionItemDto; |
| | | import com.ruoyi.basic.utils.StandardTemplateInspectionItemParser; |
| | | import com.ruoyi.common.utils.GZipUtil; |
| | | 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.mapper.*; |
| | | import com.ruoyi.inspect.pojo.*; |
| | | 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 jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.AllArgsConstructor; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.net.URLEncoder; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class InsSampleReceiptServiceImpl extends ServiceImpl<InsSampleReceiptMapper, InsSampleReceipt> |
| | | implements InsSampleReceiptService { |
| | | private static final String DIRECT_TEMPLATE_LABORATORY = "新聚"; |
| | | |
| | | private final InsSampleReceiptMapper receiptMapper; |
| | | private final InsOrderMapper insOrderMapper; |
| | | private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper; |
| | |
| | | private final UserMapper userMapper; |
| | | |
| | | @Override |
| | | public com.baomidou.mybatisplus.core.metadata.IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) { |
| | | return receiptMapper.selectPage(page, query); |
| | | public IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) { |
| | | IPage<SampleReceiptPageDto> result = receiptMapper.selectPage(page, query); |
| | | result.getRecords().forEach(this::fillInspectionItemsFromSnapshots); |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public SampleReceiptPageDto detail(Integer id) { |
| | | return receiptMapper.selectDetail(id); |
| | | SampleReceiptPageDto detail = receiptMapper.selectDetail(id); |
| | | fillInspectionItemsFromSnapshots(detail); |
| | | return detail; |
| | | } |
| | | |
| | | @Override |
| | |
| | | Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery() |
| | | .eq(InsProduct::getInsSampleId, sample.getId()).eq(InsProduct::getState, 1)); |
| | | if (productCount == 0) { |
| | | throw new ErrorException("该委托未绑定检验项目,不能提交检验"); |
| | | List<TemplateInspectionItemDto> items = getSnapshotInspectionItems(order.getId()); |
| | | if (items.isEmpty()) { |
| | | throw new ErrorException("订单原始记录模板未配置检验项或导出值,不能提交检验"); |
| | | } |
| | | int sort = 0; |
| | | for (TemplateInspectionItemDto item : items) { |
| | | InsProduct product = new InsProduct(); |
| | | product.setInsSampleId(sample.getId()); |
| | | product.setInspectionItem(item.getInspectionItem()); |
| | | product.setInspectionItemClass(""); |
| | | product.setInspectionItemSubclass(""); |
| | | product.setLaboratory(order.getLaboratory()); |
| | | product.setSample(order.getSample()); |
| | | product.setTemplateId(item.getTemplateId()); |
| | | product.setTemplateRowIndex(item.getTemplateRowIndex()); |
| | | product.setSonLaboratory(DIRECT_TEMPLATE_LABORATORY); |
| | | product.setState(1); |
| | | product.setSort(sort++); |
| | | insProductMapper.insert(product); |
| | | } |
| | | } |
| | | if (userMapper.selectById(dto.getMainInspectorId()) == null) { |
| | | throw new ErrorException("主检验人不存在或已停用"); |
| | |
| | | } |
| | | } |
| | | |
| | | private List<TemplateInspectionItemDto> getSnapshotInspectionItems(Integer orderId) { |
| | | List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateMapper.selectList( |
| | | Wrappers.<InsOrderStandardTemplate>lambdaQuery() |
| | | .eq(InsOrderStandardTemplate::getInsOrderId, orderId) |
| | | .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId)); |
| | | List<TemplateInspectionItemDto> items = new ArrayList<>(); |
| | | for (InsOrderStandardTemplate snapshot : snapshots) { |
| | | String thing = snapshot.getThing(); |
| | | try { |
| | | thing = GZipUtil.uncompress(thing); |
| | | } catch (RuntimeException ignored) { |
| | | // 兼容未压缩的历史模板快照。 |
| | | } |
| | | items.addAll(StandardTemplateInspectionItemParser.parse( |
| | | snapshot.getTemplateId(), snapshot.getSort(), thing)); |
| | | } |
| | | return items; |
| | | } |
| | | |
| | | private void fillInspectionItemsFromSnapshots(SampleReceiptPageDto row) { |
| | | if (row == null || row.getOrderId() == null || StringUtils.isNotBlank(row.getInspectionItem())) { |
| | | return; |
| | | } |
| | | try { |
| | | String names = getSnapshotInspectionItems(row.getOrderId()).stream() |
| | | .map(TemplateInspectionItemDto::getInspectionItem) |
| | | .distinct().collect(Collectors.joining("\n")); |
| | | row.setInspectionItem(names); |
| | | } catch (RuntimeException ignored) { |
| | | // 列表仍可查看;提交检验时会返回具体的模板解析错误。 |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void export(SampleReceiptQueryDto query, HttpServletResponse response) { |
| | | List<SampleReceiptPageDto> list = receiptMapper.selectExportList(query); |
| | | list.forEach(this::fillInspectionItemsFromSnapshots); |
| | | response.setContentType("application/vnd.ms-excel"); |
| | | response.setCharacterEncoding("UTF-8"); |
| | | try { |