Files
tougao/application/common/ProductionArticleReferLiteratureService.php

178 lines
6.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\common;
use think\Db;
/**
* 参考文献外部文献内容t_production_article_refer_literature
*/
class ProductionArticleReferLiteratureService
{
/**
* @return array|null
*/
public function getByPReferId($pReferId, $pArticleId = 0)
{
$pReferId = intval($pReferId);
if ($pReferId <= 0) {
return null;
}
$q = Db::name('production_article_refer_literature')->where('p_refer_id', $pReferId);
if (intval($pArticleId) > 0) {
$q->where('p_article_id', intval($pArticleId));
}
$row = $q->find();
return is_array($row) ? $row : null;
}
/**
* 从 t_production_article_refer_literature 读取校对用文献字段(不回落 refer 主表)
*
* @return array{
* abstract_text:string,
* content_text:string,
* mesh_terms:string,
* refer_content_cleaned:string,
* literature_pdf_url:string,
* fetch_sources:string,
* fetch_log:string,
* refer_doi:string
* }
*/
public function loadForCheck($pReferId, $pArticleId = 0)
{
$empty = [
'abstract_text' => '',
'content_text' => '',
'mesh_terms' => '',
'pub_language' => '',
'pub_country' => '',
'refer_content_cleaned' => '',
'literature_pdf_url' => '',
'fetch_sources' => '',
'fetch_log' => '',
'refer_doi' => '',
];
$stored = $this->getByPReferId($pReferId, $pArticleId);
if (empty($stored)) {
return $empty;
}
return [
'abstract_text' => trim((string)($stored['abstract_text'] ?? '')),
'content_text' => trim((string)($stored['content_text'] ?? '')),
'mesh_terms' => trim((string)($stored['mesh_terms'] ?? '')),
'pub_language' => trim((string)($stored['pub_language'] ?? '')),
'pub_country' => trim((string)($stored['pub_country'] ?? '')),
'refer_content_cleaned' => trim((string)($stored['refer_content_cleaned'] ?? '')),
'literature_pdf_url' => trim((string)($stored['literature_pdf_url'] ?? '')),
'fetch_sources' => trim((string)($stored['fetch_sources'] ?? '')),
'fetch_log' => trim((string)($stored['fetch_log'] ?? '')),
'refer_doi' => trim((string)($stored['refer_doi'] ?? '')),
];
}
/**
* @deprecated 使用 loadForCheck保留兼容仅读下属表
*/
public function resolveLiteratureFields(array $refer, $pArticleId = 0)
{
$pReferId = intval($refer['p_refer_id'] ?? 0);
$lit = $this->loadForCheck($pReferId, $pArticleId);
return [
'abstract_text' => $lit['abstract_text'],
'content_text' => $lit['content_text'],
'mesh_terms' => $lit['mesh_terms'],
'refer_content_cleaned' => $lit['refer_content_cleaned'],
'literature_pdf_url' => $lit['literature_pdf_url'],
];
}
/**
* 写入/更新文献内容
*
* @param array $data abstract_text, content_text, mesh_terms, refer_content_cleaned, literature_pdf_url, refer_doi, fetch_sources, fetch_log
*/
public function upsert($pArticleId, $pReferId, array $data)
{
$pArticleId = intval($pArticleId);
$pReferId = intval($pReferId);
if ($pReferId <= 0) {
return 0;
}
$now = date('Y-m-d H:i:s');
$row = [
'p_article_id' => $pArticleId,
'p_refer_id' => $pReferId,
'refer_doi' => $this->clip((string)($data['refer_doi'] ?? ''), 128),
'abstract_text' => (string)($data['abstract_text'] ?? ''),
'content_text' => (string)($data['content_text'] ?? ''),
'mesh_terms' => $this->formatMeshTerms($data['mesh_terms'] ?? ''),
'pub_language' => $this->clip(strtolower(trim((string)($data['pub_language'] ?? ''))), 16),
'pub_country' => $this->clip(strtolower(trim((string)($data['pub_country'] ?? ''))), 64),
'refer_content_cleaned' => (string)($data['refer_content_cleaned'] ?? ''),
'literature_pdf_url' => $this->clip((string)($data['literature_pdf_url'] ?? ''), 1024),
'fetch_sources' => $this->clip($this->formatSources($data['fetch_sources'] ?? ''), 255),
'fetch_log' => $this->clip((string)($data['fetch_log'] ?? ''), 512),
'updated_at' => $now,
];
$existing = Db::name('production_article_refer_literature')->where('p_refer_id', $pReferId)->find();
if (!empty($existing)) {
Db::name('production_article_refer_literature')
->where('p_refer_id', $pReferId)
->update($row);
return intval($existing['id']);
}
$row['created_at'] = $now;
return intval(Db::name('production_article_refer_literature')->insertGetId($row));
}
public function formatMeshTerms($mesh)
{
if (is_array($mesh)) {
$parts = [];
foreach ($mesh as $term) {
$term = trim((string)$term);
if ($term !== '') {
$parts[$term] = $term;
}
}
return implode('; ', array_values($parts));
}
return trim((string)$mesh);
}
private function formatSources($sources)
{
if (is_array($sources)) {
return implode(',', array_values(array_unique(array_filter(array_map('strval', $sources)))));
}
return trim((string)$sources);
}
private function clip($text, $max)
{
$text = trim((string)$text);
if ($text === '' || $max <= 0) {
return '';
}
if (mb_strlen($text) <= $max) {
return $text;
}
return mb_substr($text, 0, $max);
}
}