This commit is contained in:
Default
2025-04-08 00:27:02 +08:00
parent df4278d1d8
commit fe3fb26bd7
18 changed files with 461 additions and 46 deletions

View File

@@ -62,8 +62,6 @@ abstract class BaseController
*/ */
protected function initialize() protected function initialize()
{ {
// TODO 因为视图无法渲染 request 暂时使用这个
View::assign("DomainModel", $this->request->DomainModel);
$this->initSiteTKD(); $this->initSiteTKD();
} }

View File

@@ -357,14 +357,13 @@ class Novel extends BaseController
*/ */
public function getKanNovelInfo(Request $Request) public function getKanNovelInfo(Request $Request)
{ {
// TODO 这个页面数据没有处理
// FIXED 不要这样打标记好不好,沟通成本太高了,你直接标注缺少什么数据,什么数据有问题,什么数据需要转换
// TODO 这个是 kan 小说页面的控制器,是直接复制 小说详情的控制器,
// 1.从这个页面上看,这个应该展示 kan 小说的名字才对,目前 title 还是 小说的名字
// $arrNovel['og_novel_book_name'] = kan 小说 的 名字 // $arrNovel['og_novel_book_name'] = kan 小说 的 名字
$intNId = $Request->param('n_id'); $intNId = $Request->param('n_id');
$intForgeId = $Request->param('n_forge_id');
$boolIsMobile = $Request->param('boolIsMobile'); $boolIsMobile = $Request->param('boolIsMobile');
$NovelModel = new NovelModel; $NovelModel = new NovelModel;
@@ -372,6 +371,13 @@ class Novel extends BaseController
// 小说详情 // 小说详情
$arrNovel = $NovelModel->getNovelByNId($intNId); $arrNovel = $NovelModel->getNovelByNId($intNId);
foreach ($arrNovel['n_forge_novel'] as $arrForgeNovel) {
if ($arrForgeNovel['n_forge_id'] == $intForgeId) {
$arrNovel['og_novel_book_name'] = $arrForgeNovel['n_forge_title'];
break;
}
}
// 分品拼音 // 分品拼音
$arrNovel['category_pinyin'] = CategoryModel::getPinYinByZh($arrNovel['og_novel_category']); $arrNovel['category_pinyin'] = CategoryModel::getPinYinByZh($arrNovel['og_novel_category']);
@@ -826,9 +832,7 @@ class Novel extends BaseController
ConverterMovel::setVal([ ConverterMovel::setVal([
'intPage' => $intPage, 'intPage' => $intPage,
'strSearchKeywords' => $strSearchKeywords, 'strSearchKeywords' => $strSearchKeywords,
// FIXED 如果不知道怎么做,就不要用这个模板,你现在太过依赖这个模板,这个模板如果是一个刚毕业的大学生的垃圾论文项目,你也被他的四维锁死?
// 这个和模板没有关系, 昨天 grok 使用超限制了使用you.com 提供的 tkd 设计,它设计的 tkd模板 需要的 字段比较多,那几个 性别 和 分类 放在搜索是不太合理
// 现在改了使用grok 设计的 ai 记录在 app/home/view/kuangyu/推广SEO过程设计记录/TKD/搜索页Tkd.md
]); ]);
$strTitleTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE'); $strTitleTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE');

View File

@@ -91,14 +91,8 @@
<!-- 现在是使用这个 --> <!-- 现在是使用这个 -->
{$DomainModel->d_statis|raw} {$DomainModel->d_statis|raw}
{:request()->DomainModel->d_statis}
<!-- FIXED 打开TP模板文档找到变量原样输出 -->
<!-- TODO 问题描述:下面 -->
<!-- 我这边测试: 无法调用用 Request 渲染 只能渲染 通过 view:assign() 传递过来的变量 START-->
<!-- 1.{Request->DomainModel->d_statis|raw} 这个在页面上展示的 就是: {Request->DomainModel->d_statis} -->
<!-- 2.{$DomainModel->d_statis|raw} 使用这个是可以正常渲染的这个在basecontroll 里面 加入 assign了你看看这样操作行不-->
<!-- TODO END -->
{:request()->DomainModel->d_domian}
</body> </body>
</html> </html>

View File

@@ -124,4 +124,15 @@ class CategoryModel extends MongoModel
{ {
return in_array($strName, self::$arrMan) ? 'man' : 'women'; return in_array($strName, self::$arrMan) ? 'man' : 'women';
} }
/**
* determine the gender of the novel category
*
* @param string $strName
* @return string
*/
static public function checkSexZh(string $strName): string
{
return in_array($strName, self::$arrMan) ? '男生' : '女生';
}
} }

View File

@@ -123,7 +123,7 @@ class ChapterModel extends MongoModel
* @param integer $intNId * @param integer $intNId
* @return null|array * @return null|array
*/ */
public function getLatestChapter(int $intNId): null|array public function getLatestChapter(int $intNId, bool $boolReadContent = true): null|array
{ {
$arrFilter = ['n_id' => $intNId, 'c_page' => 0]; $arrFilter = ['n_id' => $intNId, 'c_page' => 0];
@@ -135,9 +135,11 @@ class ChapterModel extends MongoModel
if (!empty($arrChapter)) { if (!empty($arrChapter)) {
applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate'); applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate');
$arrChapter['content'] = '';
if ($boolReadContent) {
$arrChapter['content'] = StorageCore::getInstance()->read($arrChapter['c_content_path']); $arrChapter['content'] = StorageCore::getInstance()->read($arrChapter['c_content_path']);
} }
}
return $arrChapter ?? []; return $arrChapter ?? [];
} }

View File

@@ -88,6 +88,7 @@ class NovelModel extends MongoModel
$arrOptions['limit'] = $intCount; $arrOptions['limit'] = $intCount;
$arrFilter['n_have_chapter'] = 1;
$Cursor = $this->getCol()->find($arrFilter, $arrOptions); $Cursor = $this->getCol()->find($arrFilter, $arrOptions);
@@ -110,14 +111,11 @@ class NovelModel extends MongoModel
*/ */
public function getNovelByNId(int $intNId): null|array public function getNovelByNId(int $intNId): null|array
{ {
$arrFilter = ['n_id' => $intNId]; $arrFilter = ['n_id' => $intNId, 'n_have_chapter' => 1];
$arrOptions = self::$arrNovelOptions; $arrOptions = self::$arrNovelOptions;
$arrNovel = $this->getOne($arrFilter, $arrOptions); $arrNovel = $this->getOne($arrFilter, $arrOptions);
applyToKeys($arrNovel, ['created_at', 'updated_at'], 'formatMongoDate'); applyToKeys($arrNovel, ['created_at', 'updated_at'], 'formatMongoDate');
if (!empty($arrNovel['og_novel_category'])) {
$arrNovel['category_pinyin'] = CategoryModel::getPinYinByZh($arrNovel['og_novel_category']);
$arrNovel['category_sex'] = CategoryModel::checkSex($arrNovel['og_novel_category']);
}
return $arrNovel; return $arrNovel;
} }
@@ -141,6 +139,8 @@ class NovelModel extends MongoModel
return $arrResult; return $arrResult;
} }
$arrFilter['n_have_chapter'] = 1;
$pipeline = [ $pipeline = [
['$match' => $arrFilter], ['$match' => $arrFilter],
['$sample' => ['size' => $intCount]] ['$sample' => ['size' => $intCount]]
@@ -180,7 +180,7 @@ class NovelModel extends MongoModel
$strStatus = NULL, $strStatus = NULL,
array $arrSort = ['n_level' => -1] array $arrSort = ['n_level' => -1]
): array { ): array {
$arrFilter = []; $arrFilter = ['n_have_chapter' => 1,];
switch ($intType) { switch ($intType) {
case 1: case 1:
@@ -219,6 +219,7 @@ class NovelModel extends MongoModel
int $intLifeTime = 24 * 3600, int $intLifeTime = 24 * 3600,
): array { ): array {
try { try {
$arrFilter['n_have_chapter'] = 1;
$arrResult = $this->checkCacheByKey($strKey); $arrResult = $this->checkCacheByKey($strKey);
if ($arrResult !== NULL) { if ($arrResult !== NULL) {
@@ -295,7 +296,7 @@ class NovelModel extends MongoModel
return $arrResult; return $arrResult;
} }
$arrFilter = []; $arrFilter = ['n_have_chapter' => 1,];
switch ($intType) { switch ($intType) {
case 1: case 1:
@@ -367,7 +368,7 @@ class NovelModel extends MongoModel
return $arrResult; return $arrResult;
} }
$arrFilter = []; $arrFilter = ['n_have_chapter' => 1,];
switch ($intType) { switch ($intType) {
case 1: case 1:
$arrCategory = array_values(CategoryModel::getManCategory()); $arrCategory = array_values(CategoryModel::getManCategory());
@@ -435,6 +436,7 @@ class NovelModel extends MongoModel
} }
$arrFilter = [ $arrFilter = [
'og_novel_status' => "已完结", 'og_novel_status' => "已完结",
'n_have_chapter' => 1,
]; ];
$arrOptions = [ $arrOptions = [
@@ -487,18 +489,15 @@ class NovelModel extends MongoModel
if ($arrResult !== NULL) { if ($arrResult !== NULL) {
return $arrResult; return $arrResult;
} }
$arrFilter = ['n_have_chapter' => 1,];
if ($intType == 1) { if ($intType == 1) {
$arrCategory = array_values(CategoryModel::getManCategory()); $arrCategory = array_values(CategoryModel::getManCategory());
$arrFilter = [ $arrFilter['og_novel_category'] = ['$in' => $arrCategory];
'og_novel_category' => ['$in' => $arrCategory]
];
} elseif ($intType == 2) { } elseif ($intType == 2) {
$arrCategory = array_values(CategoryModel::getWomenCategory()); $arrCategory = array_values(CategoryModel::getWomenCategory());
$arrFilter = [ $arrFilter['og_novel_category'] = ['$in' => $arrCategory];
'og_novel_category' => ['$in' => $arrCategory]
];
} else {
$arrFilter = [];
} }
$arrOptions = [ $arrOptions = [

View File

@@ -37,7 +37,7 @@ class Scheduler
$arrFilter = []; $arrFilter = [];
// for ($intNId = 1; $intNId <= 531208; $intNId++) { // for ($intNId = 1; $intNId <= 531208; $intNId++) {
// for ($intNId = 1; $intNId <= 10000; $intNId++) { // for ($intNId = 1; $intNId <= 10000; $intNId++) {
for ($intNId = 1; $intNId <= 20000; $intNId++) { for ($intNId = 1; $intNId <= 6; $intNId++) {
$arrFilter[] = [ $arrFilter[] = [
'n_source_id' => $intNId, 'n_source_id' => $intNId,
'page' => 0, 'page' => 0,

View File

@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace app\task\crawler\zw630\page; namespace app\task\crawler\zw630\page;
use app\model\ChapterModel;
use storage\StorageCore; use storage\StorageCore;
class ChapterPage extends BasePage class ChapterPage extends BasePage
@@ -70,7 +71,7 @@ class ChapterPage extends BasePage
$arrExisting = (array) $arrExisting; $arrExisting = (array) $arrExisting;
$this->arrChapterInfo = array_merge($arrExisting, $this->getChapterInfo()); $this->arrChapterInfo = array_merge($arrExisting, $this->getChapterInfo());
$this->arrChapterInfo['updated_at'] = new \MongoDB\BSON\UTCDateTime(); // 添加更新时间 $this->arrChapterInfo['updated_at'] = new \MongoDB\BSON\UTCDateTime();
$Col->updateOne( $Col->updateOne(
['c_site_uuid' => $strUUId], ['c_site_uuid' => $strUUId],
['$set' => $this->arrChapterInfo], ['$set' => $this->arrChapterInfo],
@@ -94,6 +95,8 @@ class ChapterPage extends BasePage
$this->getMongoBase()->insertOne('chapter', $this->arrChapterInfo); $this->getMongoBase()->insertOne('chapter', $this->arrChapterInfo);
$this->updateNovelHaveChapter($intNId);
if (!StorageCore::getInstance()->has($this->arrChapterInfo['c_content_path'])) { if (!StorageCore::getInstance()->has($this->arrChapterInfo['c_content_path'])) {
StorageCore::getInstance()->set($this->arrChapterInfo['c_content_path'], $this->strChapterContent); StorageCore::getInstance()->set($this->arrChapterInfo['c_content_path'], $this->strChapterContent);
} }
@@ -106,6 +109,29 @@ class ChapterPage extends BasePage
} }
} }
/**
* Undocumented function
*
* @param integer $intNId
* @return void
*/
protected function updateNovelHaveChapter(int $intNId)
{
$arrFilter = [
'n_id' => $intNId,
];
$ChapterModel = new ChapterModel;
$arrLasteChapter = $ChapterModel->getLatestChapter($intNId, false);
if (!empty($arrLasteChapter)) {
$arrUpdate['$set']['n_have_chapter'] = 1;
$arrUpdate['$set']['og_novel_latest_chapter_name'] = $arrLasteChapter['name'];
$this->getMongoBase()->updateOne('novel', $arrFilter, $arrUpdate);
}
}
protected $arrNextPage; protected $arrNextPage;
/** /**

View File

@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace app\task\crawler\zw630\page; namespace app\task\crawler\zw630\page;
use app\model\CategoryModel;
use ddl\DDLManage; use ddl\DDLManage;
use QL\QueryList; use QL\QueryList;
@@ -51,6 +52,7 @@ class NovelPage extends BasePage
$arrNovelInfo['n_site_uuid'] = $strUUId; $arrNovelInfo['n_site_uuid'] = $strUUId;
$arrNovelInfo['n_source_id'] = $intNSourceId; $arrNovelInfo['n_source_id'] = $intNSourceId;
$arrNovelInfo['n_level'] = 1; $arrNovelInfo['n_level'] = 1;
$arrNovelInfo['n_have_chapter'] = 0;
$arrNovelInfo['n_id'] = $this->getMongoBase()->getNextSequence('novel'); $arrNovelInfo['n_id'] = $this->getMongoBase()->getNextSequence('novel');
$this->getMongoBase()->insertOne('novel', $arrNovelInfo); $this->getMongoBase()->insertOne('novel', $arrNovelInfo);
} }
@@ -176,7 +178,17 @@ class NovelPage extends BasePage
$this->arrNovelInfo['n_source_id'] = $this->arrData['n_source_id']; $this->arrNovelInfo['n_source_id'] = $this->arrData['n_source_id'];
$this->arrNovelInfo['n_id'] = $this->getMongoBase()->getNextSequence('novel'); $this->arrNovelInfo['n_id'] = $this->getMongoBase()->getNextSequence('novel');
$this->arrNovelInfo['n_level'] = 1; $this->arrNovelInfo['n_level'] = 1;
$this->arrNovelInfo['n_have_chapter'] = 0;
$this->arrNovelInfo['n_cover_path'] = '/img/' . date('Y/m/d', time() - 24 * 3600 * 14) . '/' . $this->arrNovelInfo['n_id'] . '.jpg'; $this->arrNovelInfo['n_cover_path'] = '/img/' . date('Y/m/d', time() - 24 * 3600 * 14) . '/' . $this->arrNovelInfo['n_id'] . '.jpg';
if (!empty($this->arrNovelInfo['og_novel_category'])) {
$this->arrNovelInfo['category_pinyin'] = CategoryModel::getPinYinByZh($this->arrNovelInfo['og_novel_category']);
$this->arrNovelInfo['category_sex'] = CategoryModel::checkSex($this->arrNovelInfo['og_novel_category']);
$this->arrNovelInfo['category_sex_zh'] = CategoryModel::checkSexZh($this->arrNovelInfo['og_novel_category']);
}
$this->getMongoBase()->insertOne('novel', $this->arrNovelInfo); $this->getMongoBase()->insertOne('novel', $this->arrNovelInfo);
$this->boolIsFirstSave = true; $this->boolIsFirstSave = true;

View File

@@ -25,7 +25,7 @@ class Site
* *
* @var string * @var string
*/ */
protected $strDomain = 'https://www.630zw.org'; protected $strDomain = 'https://www.630zw.com';
/** /**
* Undocumented function * Undocumented function

View File

@@ -11,5 +11,7 @@ return [
'commands' => [ 'commands' => [
'task' => 'microserver\ServerConsole', 'task' => 'microserver\ServerConsole',
'db:manage' => 'db\DatabaseManage', 'db:manage' => 'db\DatabaseManage',
'mongo:manage' => 'db\MongoMigrate',
'novel:manage' => 'db\NovelManage',
], ],
]; ];

View File

@@ -0,0 +1,10 @@
<?php
return [
'collection' => 'category',
'indexes' => [
[
'key' => ['ca_name' => 1],
'options' => ['unique' => true]
],
]
];

View File

@@ -0,0 +1,23 @@
<?php
return [
'collection' => 'chapter',
'indexes' => [
[
'key' => ['c_site_uuid' => 1],
'options' => ['unique' => true]
],
[
'key' => ['n_id' => 1],
'options' => ['unique' => false]
],
[
'key' => ['c_sort_num' => 1],
'options' => ['unique' => false]
],
[
'key' => ['c_page' => 1],
'options' => ['unique' => false]
],
]
];

View File

@@ -0,0 +1,34 @@
<?php
return [
'collection' => 'novel',
'indexes' => [
[
'key' => ['n_id' => 1],
'options' => ['unique' => false]
],
[
'key' => ['og_title' => 1],
'options' => ['unique' => false]
],
[
'key' => ['og_novel_status' => 1],
'options' => ['unique' => false]
],
[
'key' => ['n_site_uuid' => 1],
'options' => ['unique' => true]
],
[
'key' => ['n_related_novel.n_id' => 1],
'options' => ['unique' => false]
],
[
'key' => ['n_forge_novel.n_forge_id' => 1],
'options' => ['unique' => false]
],
[
'key' => ['n_have_chapter' => 1],
'options' => ['unique' => false]
],
]
];

View File

@@ -0,0 +1,10 @@
<?php
return [
'collection' => 'novel_clicks',
'indexes' => [
[
'key' => ['n_id' => 1, 'nc_date' => 1, 'nc_type' => 1],
'options' => ['unique' => true]
],
]
];

View File

@@ -0,0 +1,176 @@
<?php
namespace db;
use db\mongo\MongoBase;
use ddl\DDLManage;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class MongoMigrate extends Command
{
protected function configure()
{
$this->setName('mongo:manage')
->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: migrate')
->setDescription('Manage the mongo, migarte index or drop all index');
}
/**
* Undocumented function
*
* @param Input $input
* @param Output $Output
* @return void
*/
protected function execute(Input $input, Output $Output)
{
$strAction = $input->getArgument('action');
if ($strAction === 'migrate') {
$this->migrate($Output);
} else if ($strAction === 'drop') {
$this->dropAllIndexes($Output);
} else {
$Output->writeln("Invalid action. Use 'migrate' or 'drop'");
}
}
/**
* Undocumented function
*
* @param Output $Output
* @return void
*/
protected function dropAllIndexes(Output $Output)
{
try {
DDLManage::load('MongoBase');
$Db = MongoBase::getInstance()->getDb();
$ColsInfo = $Db->listCollections();
foreach ($ColsInfo as $ColInfo) {
$strColName = $ColInfo->getName();
$Col = $Db->selectCollection($strColName);
$arrIndexes = iterator_to_array($Col->listIndexes());
$arrIndexesToDrop = [];
foreach ($arrIndexes as $Index) {
$strIndexName = $Index->getName();
if ($strIndexName !== '_id_') {
$arrIndexesToDrop[] = $strIndexName;
}
}
if (!empty($arrIndexesToDrop)) {
foreach ($arrIndexesToDrop as $strIndexName) {
$Col->dropIndex($strIndexName);
$Output->writeln(" Dropped index: {$strIndexName} from collection: {$strColName}");
}
} else {
$Output->writeln(" No non-_id indexes found in collection: {$strColName}");
}
}
} catch (\Exception $e) {
$Output->writeln("<error>Failed to drop indexes: {$e->getMessage()}</error>");
}
}
/**
* Undocumented function
*
* @param Output $Output
* @return void
*/
protected function migrate(Output $Output)
{
try {
DDLManage::load('MongoBase');
$strMigrationDir = root_path() . 'database/mongo/migrations';
if (!is_dir($strMigrationDir)) {
mkdir($strMigrationDir, 0755, true);
$Output->writeln("<info>Created migration directory: {$strMigrationDir}</info>");
}
$arrFiles = glob($strMigrationDir . '/*.php');
if (empty($arrFiles)) {
$Output->writeln('<comment>No migration files found.</comment>');
return 0;
}
sort($arrFiles);
$Db = MongoBase::getInstance()->getDb();
foreach ($arrFiles as $strFile) {
$Output->writeln("Processing migration: " . basename($strFile));
$arrMigration = require $strFile;
if (!is_array($arrMigration) || !isset($arrMigration['collection']) || !isset($arrMigration['indexes'])) {
$Output->writeln("<error>Invalid migration format in {$strFile}</error>");
continue;
}
$strCollectionName = $arrMigration['collection'];
$arrIndexes = $arrMigration['indexes'];
$Col = $Db->selectCollection($strCollectionName);
$arrExistingIndexes = iterator_to_array($Col->listIndexes());
$arrExistingIndexKeys = [];
foreach ($arrExistingIndexes as $Index) {
$strKey = json_encode($Index->getKey());
$arrExistingIndexKeys[$strKey] = $Index->getName();
}
foreach ($arrIndexes as $arrIndex) {
$arrKey = $arrIndex['key'];
$arrOptions = $arrIndex['options'] ?? [];
$strKey = json_encode($arrKey);
if (array_key_exists($strKey, $arrExistingIndexKeys)) {
$Output->writeln(" Index for " . json_encode($arrKey) . " already exists as {$arrExistingIndexKeys[$strKey]}, skipping...");
continue;
}
$arrIndexNameParts = [];
foreach ($arrKey as $field => $direction) {
$arrIndexNameParts[] = "{$field}_{$direction}";
}
$strIndexName = implode('_', $arrIndexNameParts);
$arrOptions['name'] = $strIndexName;
$Col->createIndex($arrKey, $arrOptions);
$Output->writeln(" Created index: {$strIndexName} for " . json_encode($arrKey));
}
}
$Output->writeln('<info>Migration completed successfully!</info>');
return 0;
} catch (\Exception $e) {
$Output->writeln("<error>Error: {$e->getMessage()}</error>");
return 1;
}
}
}

View File

@@ -0,0 +1,114 @@
<?php
namespace db;
use app\model\CategoryModel;
use app\model\ChapterModel;
use database\seeders\SeedManager;
use db\mongo\MongoBase;
use ddl\DDLManage;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;
use think\console\input\Option;
use think\facade\Db;
class NovelManage extends Command
{
protected function configure()
{
$this->setName('novel:manage')
->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: reset')
->setDescription('Manage the novel data: reset or ...');
}
protected function execute(Input $input, Output $Output)
{
$strAction = $input->getArgument('action');
if ($strAction === 'reset') {
$this->resetData($Output);
} else {
$Output->writeln("Invalid action. Use 'reset' ");
}
}
private function resetData(Output $Output)
{
DDLManage::load('MongoBase');
$Db = MongoBase::getInstance()->getDb();
$NovelCol = $Db->selectCollection('novel');
$ChapterCol = $Db->selectCollection('chapter');
$ChapterModel = new ChapterModel;
$intBatchSize = 1000;
$LastId = null;
while (true) {
$arrFilter = [];
if (!is_null($LastId)) {
$arrFilter['_id'] = ['$gt' => $LastId];
}
$arrOptions = [
'sort' => ['_id' => 1],
'limit' => $intBatchSize,
'noCursorTimeout' => true,
];
$Cursor = $NovelCol->find($arrFilter, $arrOptions);
$arrDocs = iterator_to_array($Cursor);
if (empty($arrDocs)) {
echo "全部处理完毕。\n";
break;
}
$arrBulkOps = [];
foreach ($arrDocs as $arrDoc) {
$arrUpdateData = [];
if (!empty($arrDoc['og_novel_category'])) {
$arrUpdateData['category_pinyin'] = CategoryModel::getPinYinByZh($arrDoc['og_novel_category']);
$arrUpdateData['category_sex'] = CategoryModel::checkSex($arrDoc['og_novel_category']);
$arrUpdateData['category_sex_zh'] = CategoryModel::checkSexZh($arrDoc['og_novel_category']);
}
$arrLasteChapter = $ChapterModel->getLatestChapter($arrDoc['n_id'], false);
if (!empty($arrLasteChapter)) {
$arrUpdateData['n_have_chapter'] = 1;
$arrUpdateData['og_novel_latest_chapter_name'] = $arrLasteChapter['name'];
}
if (!empty($arrUpdateData)) {
$arrBulkOps[] = [
'updateOne' => [
['_id' => $arrDoc['_id']],
['$set' => $arrUpdateData],
],
];
}
$LastId = $arrDoc['_id'];
}
if (!empty($arrBulkOps)) {
$Result = $NovelCol->bulkWrite($arrBulkOps);
printf("本批匹配 %d 条记录, 修改 %d 条记录\n", $Result->getMatchedCount(), $Result->getModifiedCount());
} else {
echo "本批无需要更新的记录。\n";
}
echo "已处理一批,最后 _id: " . (string)$LastId . "\n";
}
}
}