大更新,1投稿系统参考文献的类型增加功能,,,2官网数据库功能

This commit is contained in:
wangjinlei
2026-07-08 11:15:44 +08:00
parent 186126a726
commit 05af67bc1a
22 changed files with 1634 additions and 81 deletions

View File

@@ -7,6 +7,13 @@ use think\Db;
use think\Queue;
use sftp\Sftp;
use think\Validate;
use app\master\service\DbPushManager;
use app\master\service\DbPushLogger;
use app\master\service\XmlBuilder;
use app\master\service\push\PorticoPusher;
use app\master\service\push\ScopusPusher;
use app\master\service\push\EbscoPusher;
use app\master\service\push\CnkiPusher;
/**
* @title 数据库接口
@@ -774,66 +781,159 @@ class Datebase extends Controller
public function dataPush()
{
$data = $this->request->post();
$stage_info = $this->journal_stage_obj->where("journal_stage_id", $data["journal_stage_id"])->find();
$this->createEmailFile($data["journal_stage_id"]);
$journal_info = $this->journal_obj->where("journal_id", $stage_info["journal_id"])->find();
$zipfile = ROOT_PATH . "public/dataFile/" . $data["journal_stage_id"] . '/' . $data["journal_stage_id"] . '.zip';
$tt = "Dear Database,<br><br>";
$tt .= "Please find the PDF files in attachment of published issue (Vol. " . $stage_info['stage_vol'] . ", No." . $stage_info['stage_no'] . ") of " . $journal_info['title'] . ".<br><br>";
$tt .= "Yours Sincerely<br>";
$tt .= "Dan Chen<br>";
$tt .= "Manager<br>";
$tt .= "TMR Publishing Group | Editorial Office | New Zealand<br>";
$tt .= "Telephone: +64 02108293806<br>";
$tt .= "Email: publisher@tmrjournals.com<br>";
$tt .= "Website:www.tmrjournals.com";
$elist = [];
$elist[] = "jgatelicensing@informaticsglobal.com";
// $elist[] = "3601240974@qq.com";
if ($journal_info["journal_id"] == 1) {
$elist[] = "958518573@qq.com";
$elist[] = "swyy2@wanfangdata.com.cn";//万方数据库
$rule = new Validate([
"journal_stage_id" => "require"
]);
if (!$rule->check($data)) {
return jsonError($rule->getError());
}
$elist[] = "3097953993@qq.com";
// $elist[] = "849192806@qq.com"; //皮皮
$elist[] = "751475802@qq.com"; //我
// $elist[] = "ELD@dia.govt.nz";
foreach ($elist as $v) {
$cdata['email'] = $v;
$cdata['title'] = "Data submitted-TMR Publishing Group";
$cdata["fromname"] = "Data submitted-TMR Publishing Group";
$cdata["content"] = $tt;
$cdata["temail"] = $journal_info['email'];
$cdata["tpassword"] = $journal_info['epassword'];
$cdata["fj"] = $zipfile;
Queue::push('app\api\job\mail@puchAndFJ', $cdata, "mail");
// sendEmail_data($v, "Data submitted-TMR Publishing Group", "Data submitted-TMR Publishing Group", $tt, $journal_info['email'], $journal_info['epassword'],$zipfile);
}
//发送sftp
$this->bf_db_push($data["journal_stage_id"]);
// 发送ftp
// $this->createFtpFileInfo($data["journal_stage_id"]);//cnki数据库
if($journal_info['journal_id']==1||$journal_info['journal_id']==11){
$this->scopusPushXML($data["journal_stage_id"]);//scopus数据库
}
// if(in_array($journal_info["journal_id"],[2,8,20,15,9,10,3,1])){//ep数据库
// $this->pushXmlToEp($data["journal_stage_id"]);
// }
//EBSCO上传XML新增期刊ID[14,11,4,18,8,1,2] chengxiaoling 20250402 start
if(in_array($journal_info["journal_id"],[2,8,20,15,9,10,3,1,14,11,4,18,8])){//ep数据库2,8,20,15,9,10,3,1 //EBSCO上传XML
$this->pushXmlToEp($data["journal_stage_id"]);
}
//EBSCO上传XML新增期刊ID[14,11,4,18,8,1,2] chengxiaoling 20250402 end
return jsonSuccess([]);
// 配置驱动 + 全程留痕 + 可异步的统一推送(渠道由 j_db_channel / 默认配置决定)
$operator = session('admin.realname') ?: (session('admin.username') ?: '');
$manager = new DbPushManager();
$summary = $manager->run($data["journal_stage_id"], $operator);
return jsonSuccess(['summary' => $summary]);
}
/**
* @title 获取某期推送情况
* @description 查看指定分期在各数据库的推送记录/状态
* @url /master/Datebase/getPushStatus
* @method POST
*
* @param name:journal_stage_id type:int require:1 desc:分期id
* @return list:推送日志array#
*/
public function getPushStatus()
{
$data = $this->request->post();
$rule = new Validate([
"journal_stage_id" => "require"
]);
if (!$rule->check($data)) {
return jsonError($rule->getError());
}
$logger = new DbPushLogger();
$list = $logger->stageStatus($data['journal_stage_id']);
$statusMap = [0 => '待推送/排队中', 1 => '成功', 2 => '失败'];
foreach ($list as $k => $v) {
$list[$k]['status_text'] = isset($statusMap[$v['status']]) ? $statusMap[$v['status']] : '未知';
$list[$k]['ctime_text'] = $v['ctime'] ? date('Y-m-d H:i:s', $v['ctime']) : '';
$list[$k]['utime_text'] = $v['utime'] ? date('Y-m-d H:i:s', $v['utime']) : '';
}
return jsonSuccess(['list' => $list]);
}
/**
* @title 重推
* @description 针对某条推送日志重新推送(用于失败补推)
* @url /master/Datebase/retryPush
* @method POST
*
* @param name:log_id type:int require:1 desc:推送日志id
*/
public function retryPush()
{
$data = $this->request->post();
$rule = new Validate([
"log_id" => "require"
]);
if (!$rule->check($data)) {
return jsonError($rule->getError());
}
$manager = new DbPushManager();
$res = $manager->retry($data['log_id']);
if (empty($res['ok'])) {
return jsonError(isset($res['msg']) ? $res['msg'] : '重推失败');
}
return jsonSuccess($res);
}
/**
* @title 获取推送渠道配置
* @description 获取数据库推送渠道配置列表
* @url /master/Datebase/getChannels
* @method POST
* @return list:渠道配置array#
*/
public function getChannels()
{
$list = Db::name('db_channel')->where('state', 0)->order('sort desc')->select();
return jsonSuccess(['list' => $list]);
}
/**
* @title 保存推送渠道配置
* @description 新增或编辑数据库推送渠道channel_id 存在则编辑)
* @url /master/Datebase/saveChannel
* @method POST
*
* @param name:channel_id type:int require:0 desc:渠道id(编辑时传)
* @param name:channel_key type:string require:1 desc:渠道标识
* @param name:name type:string require:1 desc:展示名
* @param name:transport type:string require:1 desc:传输方式 sftp/ftp/email
* @param name:pusher type:string require:0 desc:推送器标识(留空同channel_key)
* @param name:journal_ids type:string require:0 desc:适用期刊id逗号分隔(留空=全部)
* @param name:config type:string require:0 desc:JSON额外配置
* @param name:is_enable type:int require:0 default:1 desc:是否启用
* @param name:sort type:int require:0 default:0 desc:排序
*/
public function saveChannel()
{
$data = $this->request->post();
$rule = new Validate([
"channel_key" => "require",
"name" => "require",
"transport" => "require",
]);
if (!$rule->check($data)) {
return jsonError($rule->getError());
}
if (!empty($data['config']) && json_decode($data['config'], true) === null && strtolower(trim($data['config'])) !== 'null') {
return jsonError('config 必须为合法 JSON');
}
$save = [
'channel_key' => $data['channel_key'],
'name' => $data['name'],
'transport' => $data['transport'],
'pusher' => isset($data['pusher']) ? $data['pusher'] : '',
'journal_ids' => isset($data['journal_ids']) ? $data['journal_ids'] : '',
'config' => isset($data['config']) ? $data['config'] : '',
'is_enable' => isset($data['is_enable']) ? intval($data['is_enable']) : 1,
'sort' => isset($data['sort']) ? intval($data['sort']) : 0,
'utime' => time(),
];
if (!empty($data['channel_id'])) {
Db::name('db_channel')->where('channel_id', $data['channel_id'])->update($save);
} else {
$save['ctime'] = time();
Db::name('db_channel')->insert($save);
}
return jsonSuccess([]);
}
/**
* @title 删除推送渠道配置
* @description 删除数据库推送渠道
* @url /master/Datebase/delChannel
* @method POST
*
* @param name:channel_id type:int require:1 desc:渠道id
*/
public function delChannel()
{
$data = $this->request->post();
$rule = new Validate([
"channel_id" => "require"
]);
if (!$rule->check($data)) {
return jsonError($rule->getError());
}
Db::name('db_channel')->where('channel_id', $data['channel_id'])->update(['state' => 1, 'utime' => time()]);
return jsonSuccess([]);
}
public function scopusTest(){
$data = $this->request->post();
$rule = new Validate([

View File

@@ -1708,11 +1708,20 @@ class Journal extends Controller
public function addJournalAbs()
{
$data = $this->request->post();
$rule = new Validate([
'journal_id' => 'require',
'title' => 'require',
'url' => 'require',
]);
if (!$rule->check($data)) {
return json(['code' => 1, 'msg' => $rule->getError()]);
}
$add_data['journal_id'] = $data['journal_id'];
$add_data['title'] = $data['title'];
$add_data['url'] = $data['url'];
$add_data['sort'] = $data['sort'];
$add_data['is_show'] = $data['is_show'];
$add_data['sort'] = isset($data['sort']) ? intval($data['sort']) : 0;
$add_data['is_show'] = isset($data['is_show']) ? intval($data['is_show']) : 1;
$add_data['state'] = 0;
$res = $this->journal_abs_obj->insert($add_data);
if ($res) {
return json(['code' => 0, 'msg' => 'success']);
@@ -1754,7 +1763,46 @@ class Journal extends Controller
public function editJournalAbs()
{
$data = $this->request->post();
$this->journal_abs_obj->update($data);
$rule = new Validate([
'journal_abstracting_id' => 'require',
]);
if (!$rule->check($data)) {
return json(['code' => 1, 'msg' => $rule->getError()]);
}
// 白名单,避免误更新未知字段(数据库开启了 fields_strict
$update = [];
foreach (['journal_id', 'title', 'url', 'sort', 'is_show'] as $f) {
if (isset($data[$f])) {
$update[$f] = $data[$f];
}
}
if (empty($update)) {
return json(['code' => 1, 'msg' => 'nothing to update']);
}
$this->journal_abs_obj->where('journal_abstracting_id', $data['journal_abstracting_id'])->update($update);
return json(['code' => 0, 'msg' => 'success']);
}
/**
* @title 批量排序期刊外链
* @description 拖拽排序后批量保存收录数据库外链顺序
* @url /master/Journal/sortJournalAbs
* @method POST
*
* @param name:ids type:string require:1 desc:journal_abstracting_id 顺序数组(从大到小排序权重递减)
*/
public function sortJournalAbs()
{
$data = $this->request->post();
$ids = isset($data['ids']) ? $data['ids'] : [];
if (!is_array($ids) || empty($ids)) {
return json(['code' => 1, 'msg' => 'ids 不能为空']);
}
// 数组顺序即展示顺序:越靠前 sort 越大
$total = count($ids);
foreach ($ids as $index => $id) {
$this->journal_abs_obj->where('journal_abstracting_id', $id)->update(['sort' => $total - $index]);
}
return json(['code' => 0, 'msg' => 'success']);
}