dd/app/Services/TG/Hook/Mod/Book.php
2025-06-10 19:55:56 +08:00

2150 lines
51 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
declare(strict_types=1);
namespace App\Services\TG\Hook\Mod;
use App\Models\Book as ModelBook;
use App\Models\BookPage as ModelBookPage;
use App\Models\BookOption as ModelBookOption;
use App\Models\BookHook as ModelBookHook;
use Illuminate\Support\Facades\DB;
class Book extends Base {
public $sPath = "/";
private $mRst = [];
private $aOption = [];
private $iPageNo = 1;
private $aParentType = [];
private $oRag = "";
private $aRagOption = "";
function __construct()
{
$sPath = ModelBookHook::_first_path();
if ($sPath) {
$this->sPath = $sPath;
} else {
$this->sPath = "/";
}
$this->iPageNo = $this->_getPageNo() ?? 1;
$aTmp = ModelBookOption::all()->toArray();
foreach ($aTmp as $v) {
$this->aOption[$v["key"]] = $v["value"];
}
$this->oRag = $this->_getParentRag();
if ($this->oRag->option) {
$this->aRagOption = json_decode($this->oRag->option, true);
} else {
$this->aRagOption = [];
// $this->aRagOption["fire_show"] = false;
// $this->aRagOption["todo_show_type"] = 1;
}
}
private function _valid($aValid)
{
foreach ($aValid as $k => $v) {
if (!$v) {
return "需要".$k;
}
}
return true;
}
public function path($aParam)
{
$sPath = $aParam["aArg"][1] ?? false;
if (!$sPath) {
return "要值";
}
$oBook = ModelBook::_path($sPath);
return $this->bookToStr($oBook);
}
private function _cd($sPath = "/")
{
ModelBookHook::_cd($sPath);
$this->sPath = $sPath;
}
public function main()
{
$this->_cd("/");
return $this->openRe();
}
//// 展开 系列
public function e()
{
$is_exp = ModelBook::where("path", $this->sPath)->where("is_del", 0)->first()?->exp;
if ($is_exp == 1) {
ModelBook::where("path", $this->sPath)->where("is_del", 0)->update(["exp" => 0]);
} else {
ModelBook::where("path", $this->sPath)->where("is_del", 0)->update(["exp" => 1]);
}
return $this->openRe();
}
public function ee()
{
$is_exp = ModelBook::where("path", "like", $this->sPath."%")->where("is_del", 0)->first()?->exp;
if ($is_exp == 1) {
ModelBook::where("path", "like", $this->sPath."%")->where("is_del", 0)->update(["exp" => 0]);
} else {
ModelBook::where("path", "like", $this->sPath."%")->where("is_del", 0)->update(["exp" => 1]);
}
return $this->openRe();
}
public function u($aParam)
{
$iNo = $aParam["aArg"][1] ?? false;
$oRag = ModelBook::where("path", $this->sPath)->where("no", $iNo)->first();
if ($oRag->exp == 1) {
$iExpNew = 0;
} else {
$iExpNew = 1;
}
$oRag->exp = $iExpNew;
$oRag->save();
return $this->openRe();
}
public function uu($aParam)
{
$iNo = $aParam["aArg"] ?? false;
$iNoId = ModelBook::where("path", $this->sPath)->where("no", $iNo)->first()?->id;
$sPathSub = $this->sPath.$iNoId."/";
$is_exp = ModelBook::where("path", "like", $sPathSub."%")->first()?->exp;
$iExpNew = $is_exp ? 0 : 1;
ModelBook::where("path", "like", $sPathSub."%")->orWhere("id", $iNoId)->where("is_del", 0)->update(["exp" => $iExpNew]);
return $this->openRe();
}
//// 展开 系列 end
//// like 系列
public function like($aParam)
{
$this->_cd("like");
return $this->open();
}
//// like 系列 end
//// 全局option 系列
public function g_option($aParam)
{
$sKey = $aParam["aOption"][1] ?? false;
$sValue = $aParam["aArg"][1] ?? false;
if (!$sKey) {
return "需要key";
}
if (!$sValue) {
return "需要value";
}
$oOption = ModelBookOption::where("key", $sKey)->first();
if (!$oOption) {
return "没查到";
}
$oOption->value = $sValue;
$r = $oOption->save();
return $r;
}
public function g_option_list()
{
$oOption = ModelBookOption::all()->toArray();
return $this->toJson($oOption);
}
public function g_option_hit($aParam)
{
$sHit = $aParam["aArg"][1];
if (!$sHit) {
return "需要key";
}
$sValue = ModelBookOption::where("key", $sHit)->first()?->value;
$r = $sValue ? $sValue : "没有";
return $r;
}
public function g_option_add($aParam)
{
$sKey = $aParam["aOption"][1] ?? false;
$sValue = $aParam["aArg"][1] ?? false;
if (!$sKey) {
return "需要key";
}
if (!$sValue) {
return "需要value";
}
$oOption = ModelBookOption::where("key", $sKey)->first();
if ($oOption) {
return "以存在";
}
$oOption = new ModelBookOption();
$oOption->key = $sKey;
$oOption->value = $sValue;
$r = $oOption->save();
return $r;
}
public function limit($aParam)
{
$iLimit = $aParam["aArg"][1];
$r1 = ModelBookOption::where("key", "page_limit")->update(["value" => $iLimit]);
return $this->openRe();
}
//// option 系列 end
//// private 系列
private function _getPageNo()
{
$iPageNo = ModelBookPage::where("path", $this->sPath)->first()?->page ?? 1;
return $iPageNo;
}
//// private 系列 end
//// type 系列
public function type($aParam)
{
$sType = $aParam["aArg"][1] ?? NULL;
$this->_type($sType);
$this->mRst[] = ["", "ok"];
return $this->openRe();
}
private function _type($sType)
{
$oParentRag = $this->_getParentRag();
$oParentRag->type = $sType;
if ($sType == "todo") {
$oParentRag->order = "rank_todo";
$oParentRag->option = json_encode([
"todo_show_type" => 1
]);
}
$r = $oParentRag->save();
return $r;
}
//// type 系列 end
//// 辅助 系列
private function _getParentPath()
{
$oParentRag = $this->_getParentRag();
$sParentPath = $oParentRag->path;
return $sParentPath;
}
private function _kv($k, $v, $aNo)
{
if (!$aNo) {
$aNo = $this->_getCheckedNo();
}
$r = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update([$k => $v]);
return $r;
}
private function _getCheckedNo()
{
$oBookCheckedNo = ModelBook::where("path", $this->sPath)->where("checked", 1)->pluck("no")->toArray();
return $oBookCheckedNo;
}
private function _getParentRag()
{
$iParentId = $this->_parentIdByPath();
// if ($iParentId == 0) {
// $iParentId = "1";
// }
$oRag = ModelBook::where("id", $iParentId)->first();
return $oRag;
}
private function _pathToSpecialId($sPath)
{
$sPath = $sPath ? $sPath : $this->sPath;
// tomd($sPath);
$aMap = [
"mian" => 1,
"firel" => 2,
"/" => 1,
];
// tomd($aMap[$sPath], 1);
return @$aMap[$sPath];
}
private function _parentIdByPath($sPath = false)
{
$sPath = $sPath ? $sPath : $this->sPath;
// tomd(11, 1);
if ($sSpecialId = $this->_pathToSpecialId($sPath)) {
return $sSpecialId;
}
$aPath = explode("/", $sPath);
$iCountPathId = count($aPath);
$iParentId = $aPath[$iCountPathId - 2] ?? false;
$iParentId = $iParentId ? $iParentId : NULL;
return $iParentId;
}
// 总是返回数组最低none
private function _typeFormat($sType)
{
$aTypeBoard = [
"none",
"none",
"none",
"none",
"none",
"none",
"none",
"none",
"none",
"none",
];
if (empty($sType)) {
return ["none"];
}
$aType = explode("_", $sType);
foreach ($aType as $k => $v) {
if (empty($v)) {
$v = "none";
}
$aTypeBoard[$k] = $v;
}
return $aTypeBoard;
}
private function _valueFormat($sValue)
{
$aValue = explode("#", $sValue);
$sValue = $aValue[0] ?? false;
$sValueType = $aValue[1] ?? false;
switch ($sValueType) {
case "day" :
$sValueNew = date('Y-m-d', strtotime("+$sValue days"));
break;
case "date" :
$sValueNew = $sValue;
break;
default :
$sValueNew = $sValue;
break;
}
return $sValueNew;
}
private function _idByChecked()
{
$aId = ModelBook::where("checked", ">", 0)->pluck("id")->toArray();
return $aId;
}
//// 辅助 系列 end
//// status 系列
//// status 系列 end
//// todo系列
private function _todoMainOpen()
{
tomd("预设", 1);
// return "预设";
// tomd(11, 1);
}
public function todo($aParam)
{
$sRank = $aParam["aOption"][1] ?? "none";
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, $sRank);
}
public function todoShowType($aParam)
{
$iType = $aParam["aArg"][1];
$aRagOption = $this->aRagOption;
$aRagOption["todo_show_type"] = $iType;
$sRagOption = json_encode($aRagOption, 1);
$oParentRag = $this->_getParentRag();
$oParentRag->option = $sRagOption;
$oParentRag->save();
return $this->openRe();
}
public function totip($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "tip");
}
public function tip($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "tip";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toBlock($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "block");
}
public function block($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "block";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toWait($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "wait");
}
public function wait($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "wait";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toTrack($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "track");
}
public function track($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "track";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toDone($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "done");
}
public function done($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "done";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toWar($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "war");
}
public function war($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "war";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toAction($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "action");
}
public function action($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "action";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toNone($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "none");
}
public function none($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "none";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
public function toKeep($aParam)
{
$sValue = $aParam["aArg"][1] ?? false;
if (!$sValue) {
return "需要value";
}
return $this->_rag(false, $sValue, "keep");
}
public function keep($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$v = "keep";
$this->_kv("rank", $v, $aNo);
$this->noRe();
return $this->openRe();
}
// public function
//// todo系列 end
//// open 系列
public function openRe()
{
return $this->open(true);
}
public function open($bRe = false)
{
$oBookPage = ModelBookPage::byPath($this->sPath);
if ($oBookPage && $bRe === false) {
return $oBookPage->content;
} else {
// 特别列表
if ($this->sPath == "firel") {
return $this->firel();
}
// 不同type处理
$oParentRag = $this->_getParentRag();
$this->aParentType = $this->_typeFormat($oParentRag->type);
if ($this->aParentType[0] == "todo") {
// $this->mRst[] = ["完", 22];
}
$oBook = ModelBook::_path($this->sPath, $this->iPageNo);
// 不同type处理 end
if ($oBook && !$oBook->isEmpty()) {
$sBookStr = $this->bookToStr($oBook);
ModelBookPage::updateOrCreate(
["path" => $this->sPath],
["path" => $this->sPath, "content" => $sBookStr]
);
return $sBookStr;
} else {
return $this->bookToStr([]);
}
}
return $this->bookToStr($oBook);
}
//// open 系列 end
//// page 系列
public function pageRe()
{
// $iPageNo = $this->_getPageNo();
$oBook = ModelBook::_path($this->sPath, $this->iPageNo);
if ($oBook) {
$sBookStr = $this->bookToStr($oBook);
ModelBookPage::updateOrCreate(
["path" => $this->sPath],
["path" => $this->sPath, "content" => $sBookStr]
);
return true;
} else {
return false;
}
}
public function page($aParam)
{
$this->iPageNo = $aParam["aArg"][1] ?? 1;
if (!$this->iPageNo) {
return "需要page";
}
$r1 = ModelBookPage::where("path", $this->sPath)->update(["page" => $this->iPageNo]);
return $this->openRe();
}
public function n()
{
return $this->_NP(1);
}
public function p()
{
return $this->_NP(-1);
}
private function _NP($int)
{
$this->iPageNo += $int;
$iLimit = ModelBookOption::_hit("page_limit");
if ($this->iPageNo < 1) {
$this->iPageNo -= $int;
return "到头了";
}
$oBook = ModelBook::where("path", $this->sPath)->where("is_del", 0)->skip(($this->iPageNo * $iLimit) - 1)->take(1)->first();
if (!$oBook) {
$this->iPageNo -= $int;
return "不存在";
}
ModelBookPage::where("path", $this->sPath)->update(["page" => $this->iPageNo]);
return $this->openRe();
}
//// page 系列 end
//// parent 系列
public function parent_detail()
{
$oParentRag = $this->_getParentRag();
return $this->toJson($oParentRag);
}
public function parent_hit($aParam)
{
$k = $aParam["aArg"][1] ?? false;
if (!$k) {
return "需要k";
}
$oParentRag = $this->_getParentRag();
if (!$oParentRag->$k) {
return "没有->".$k;
}
return $oParentRag->$k;
}
public function parent_set($aParam)
{
$k = $aParam["aArg"][1] ?? false;
$v = $aParam["aArg"][2] ?? false;
if (!$k) {
return "需要k";
}
if (!$v) {
return "需要v";
}
$oParentRag = $this->_getParentRag();
$oParentRag->$k = $v;
$oParentRag->save();
return $this->openRe();
}
//// parent 系列
//// order 系列
public function order($aParam)
{
$sOrder = $aParam["aArg"][1] ?? false;
$sOrderType = $aParam["aArg"][2] ?? "asc";
if (!$sOrder) {
return "需要order";
}
$oRag = $this->_getParentRag();
$oRag->order = $sOrder;
$oRag->order_type = $sOrderType;
$r = $oRag->save();
return $this->openRe();
}
//// order 系列 end
//// 未分类 系列
public function no($aParam)
{
$iNo = $aParam["aArg"][1];
$oBookNow = ModelBook::_no($this->sPath, $iNo);
if (!$oBookNow) {
return "没有";
}
$sPathTo = $this->sPath.$oBookNow->id."/";
$this->_cd($sPathTo);
return $this->openRe();
}
public function rag($aParam)
{
$iNo = $aParam["aOption"][1] ?? null;
$sRag = $aParam["aArg"][1] ?? null;
return $this->_rag($iNo, $sRag);
}
public function _rag($iNo, $sRag, $mCustom = false)
{
if ($iNo) {
$oBook = ModelBook::where("path", $this->sPath)->where("no", $iNo)->first();
} else {
$oBook = new ModelBook();
$oBook->no = 100000;
}
$oParentRag = $this->_getParentRag();
$aParentType = $this->_typeFormat($oParentRag->type);
if ($aParentType[0] == "todo") {
// if (isset($aParentType[1])) {
// $oBook->status = $aParentType[0]."_".$aParentType[1];
// }
if (empty($oBook->rank)) {
$oBook->rank = $mCustom;
}
}
$oBook->rag = $sRag;
$oBook->path = $this->sPath;
$oBook->save();
$this->noRe();
$this->pageRe();
return $this->openRe();
}
//// 未分类 系列
//// id 系列
// public function id ()
//// id 系列 end
//// set 系列
// public function _set
//// set 系列 end
//// tree 系列
public function tree()
{
$iPageNo = $this->_getPageNo();
$oBook = ModelBook::_path($this->sPath, $iPageNo);
$iDeepStart = $this->pathLen($this->sPath);
$this->tree_loop($oBook, $sTreeStr, $iDeepStart);
return $sTreeStr;
}
public function tree_loop($oBook, &$sTreeStr, $iDeepStart = 0)
{
foreach ($oBook as $oBookRow) {
$iDeepNow = $this->pathLen($oBookRow->path);
$iDeepRag = $iDeepNow - $iDeepStart;
$sTreeStr .= $this->_ragToStr($oBookRow, $iDeepRag);
$sSubPath = $oBookRow->path.$oBookRow->id."/";
$oBookSub = ModelBook::_path($sSubPath, "all");
if (!$oBookSub->isEmpty()) {
$this->tree_loop($oBookSub, $sTreeStr, $iDeepStart);
}
}
}
//// tree 系列 end
//// option 系列
public function option()
{
$oParentRag = $this->_getParentRag();
$aOption = json_decode($oParentRag->option);
return $this->toJson($aOption);
}
public function where($aParam)
{
$aWhere = $aParam["aArg"] ?? false;
if (!$aWhere) {
return "需要where";
}
$sWhere = implode(" ", $aWhere);
$aRagOption = $this->aRagOption;
$aRagOption["where"] = $sWhere;
$sRagOption = json_encode($aRagOption);
$oParentRag = $this->_getParentRag();
$oParentRag->option = $sRagOption;
$oParentRag->save();
return $this->option();
}
public function optionSet($aParam)
{
$sKey = $aParam["aArg"][1] ?? false;
$sValue = $aParam["aArg"][2] ?? false;
if (!$sKey) {
return "需要key";
}
if (!$sValue) {
return "需要value";
}
$aRagOption = $this->aRagOption;
$aRagOption[$sKey] = $sValue;
$sRagOption = json_encode($aRagOption);
$oParentRag = $this->_getParentRag();
$oParentRag->option = $sRagOption;
$oParentRag->save();
return $this->option();
}
public function optionDel($aParam)
{
$sKey = $aParam["aArg"][1];
$aRagOption = $this->aRagOption;
if (isset($aRagOption[$sKey])) {
unset($aRagOption[$sKey]);
} else {
return "没有这个key";
}
$sRagOption = json_encode($aRagOption);
$oParentRag = $this->_getParentRag();
$oParentRag->option = $sRagOption;
$oParentRag->save();
return $this->option();
}
//// option 系列 end
public function pathLen($sPath)
{
$tmp = trim($sPath, "/");
$aPath = explode("/", $tmp);
if (empty($aPath[0])) {
unset($aPath[0]);
}
$iLen = count($aPath);
return $iLen;
}
// 私有
private function noRe()
{
// $oBook = ModelBook::where("path", $this->sPath)->where("is_del", 0)->orderBy("no")->orderBy("updated_at", "desc")->get();
$oBook = ModelBook::_path($this->sPath, "all");
$oBookDel = ModelBook::_path($this->sPath, "all", 1);
// $oBookDel = ModelBook::where("path", $this->sPath)->where("is_del", 1)->orderBy("updated_at", "desc")->get();
if ($oBook && !$oBook->isEmpty()) {
$i = 1;
foreach ($oBook as $row) {
$row->no = $i;
$row->save();
$i++;
}
}
if ($oBookDel && !$oBook->isEmpty()) {
$i = -1;
foreach ($oBookDel as $row) {
$row->no = $i;
$row->save();
$i--;
}
}
return $i;
}
public function back()
{
$sPathNow = $this->sPath;
if ($sPathNow == "/") {
return "到头了";
}
$aPathNowEx = explode("/", $sPathNow);
$aPathNowExCount = count($aPathNowEx);
unset($aPathNowEx[$aPathNowExCount -2]);
$sPathNew = implode("/", $aPathNowEx);
$this->_cd($sPathNew);
return $this->openRe();
}
//// mark系列
// 入口
public function mark($aParam)
{
$aNo = $aParam["aArg"] ?? false;
if ($aNo) {
return $this->mark_no($aParam);
} else {
return $this->mark_checked($aParam);
}
}
// 私有
private function mark_no($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$sOption = $aParam["aOption"][1] ?? false;
if ($sOption == "un") {
$iValue = 0;
} else {
$iValue = 1;
}
$this->_mark($aNo, $iValue);
return $this->openRe();
}
public function mark_checked($aParam)
{
$sType = $aParam["aOption"][1] ?? false;
if ($sType == "un") {
$iValue = 0;
} else {
$iValue = 1;
}
$aNo = $this->_getCheckedNo();
$this->_mark($aNo, $iValue);
return $this->openRe();
}
private function _mark($aNo, $iValue)
{
$oBook = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update(["mark" => $iValue]);
}
//// mark系列 end
//// del系列
public function del($aParam)
{
$aNo = $aParam["aArg"];
$aId = $this->_noToId($aNo);
if (!$aId) {
return "没有id";
}
$oBookByNo = ModelBook::whereIn("id", $aId)->get();
$iDelCount = 0;
foreach ($oBookByNo as $row) {
// 假删的时候不需要删子页
// $iDelCount += ModelBook::where("path", "like", "%/".$row->id."/%")->where("is_del", 0)->update(["is_del" => 1]) ?? 0;
if ($row->is_del == 0) {
$row->is_del = 1;
$row->save();
$iDelCount ++;
}
}
$this->mRst[] = ["", $iDelCount];
$this->noRe();
$this->pageRe();
return $this->openRe();
}
public function del_show()
{
$oBook = ModelBook::_path($this->sPath, "all", 1);
return $this->bookToStr($oBook);
}
// 只有真删的时候会删除子页且不管子页是不是is_del
public function del_done()
{
$oBookByDel = ModelBook::where("path", $this->sPath)->where("is_del", 1)->get();
$iDelCount = 0;
foreach ($oBookByDel as $row)
{
// 子页就算不是is_del也删除没毛病
$iDelCount += ModelBook::where("path", "like", "%/".$row->id."/%")->delete() ?? 0;
$row->delete();
$iDelCount++;
}
$this->mRst[] = ["", $iDelCount];
return $this->openRe();
}
public function del_back($aParam)
{
$aNoNow = $aParam["aArg"] ?? false;
if (!$aNoNow) {
$aNoNow = ModelBook::where("path", $this->sPath)->where("checked", 1)->pluck("no")->toArray();
}
if (!$aNoNow) {
return "没号";
}
$r = ModelBook::where("path", $this->sPath)->whereIn("no", $aNoNow)->where("is_del", 1)->update(["is_del" => 0]);
$this->mRst[] = ["", $r];
return $this->openRe();
}
//// del系列 end
//// to 移动 系列
// book#to__1 2 == no
// book#to 2 == checked
public function to($aParam)
{
$aNoNow = $aParam["aOption"] ?? false;
$iNoTo = $aParam["aArg"][1] ?? false;
$this->_to($iNoTo, $aNoNow);
return $this->openRe();
}
// book#up__2 == no
// book#up == checked
public function up($aParam)
{
$aNoNow = $aParam["aOption"];
if ($aNoNow) {
$iNoMin = min($aNoNow);
} else {
$iNoMin = ModelBook::where("path", $this->sPath)->where("checked", 1)->orderBy("no")->first()?->no;
}
if (!$iNoMin) {
return "没有选中";
}
$this->_to($iNoMin - 1);
return $this->openRe();
}
public function down($aParam)
{
$aNoNow = $aParam["aOption"];
if ($aNoNow) {
$iNoMax = max($aNoNow);
} else {
$iNoMax = ModelBook::where("path", $this->sPath)->where("checked", 1)->orderBy("no", "desc")->first()?->no;
}
if (!$iNoMax) {
return "没有选中";
}
$this->_to($iNoMax + 1);
return $this->openRe();
}
private function _to($iNoTo, $aNoNow = [])
{
// 兼容checked和no模式
if ($aNoNow) {
$oBookChecked = ModelBook::where("path", $this->sPath)->whereIn("no", $aNoNow)->orderBy("no")->get();
} else {
$oBookChecked = ModelBook::where("path", $this->sPath)->where("checked", 1)->orderBy("no")->get();
}
// 将checked序列化
// 提取noNow
$i = 1;
$aNoNow = [];
foreach ($oBookChecked as $row) {
$row->no_tmp = $i; // 先把checked序列化
$r = $row->save();
$aNoNow[] = $row->no;
$i++;
}
// 分离开up和down
$aUpNo = [];
$aDownNo = [];
foreach ($aNoNow as $iNoNow) {
// 下移,上拉
if ($iNoNow < $iNoTo) {
$aDownNo[] = $iNoNow;
// 上移,下拉
} else if ($iNoNow > $iNoTo) {
$aUpNo[] = $iNoNow;
// 没动,忽略
} else {}
}
// 下移上拉
if (count($aDownNo) > 0) {
// $iDownCount = $this->_no_move($aDownNo, $iNoTo, "down");
ModelBook::where("path", $this->sPath)
->where("no", "<=", $iNoTo)
->update(['no' => DB::raw('no - 100000')]);
}
// 上移下拉
if (count($aUpNo) > 0) {
// $iUpCount = $this->_no_move($aUpNo, $iNoTo, "up");
ModelBook::where("path", $this->sPath)
->where("no", ">=", $iNoTo)
->update(['no' => DB::raw('no + 100000')]);
}
// 插入
$i = 0;
foreach ($oBookChecked as $row) {
$row->no = $iNoTo + $i;
$row->save();
$i++;
}
// 按checked排序checked以根据原先no排序
$oBookCheckedNo = ModelBook::where("no_tmp", ">", 0)->orderBy("no")->pluck('no')->toArray();
$oBookChecked = ModelBook::where("no_tmp", ">", 0)->orderBy("no_tmp")->get();
$i = 0;
foreach ($oBookChecked as $row) {
$row->no_tmp = 0;
$row->no = $oBookCheckedNo[$i];
$row->save();
$i++;
}
$this->noRe();
$this->pageRe();
}
//// to移动系列 end
//// check系列
public function checkId($aParam)
{
$aCheckId = $aParam["aArg"];
ModelBook::whereIn("id", $aCheckId)->update(["checked" => 1]);
return $this->openRe();
}
public function rcheck($aParam)
{
$aCheckNo = $aParam["aArg"];
$this->ccheck();
return $this->_check();
}
public function check($aParam)
{
$aCheckNo = $aParam["aArg"];
return $this->_check($aCheckNo);
}
public function _check($aCheckNo)
{
// 不在path里的取消check安全
ModelBook::where("path", "!=", $this->sPath)->update(["checked" => 0]);
$oBook = ModelBook::where("path", $this->sPath)->whereIn("no", $aCheckNo)->get();
foreach ($oBook as $row) {
$row->checked = 1;
$row->save();
}
return $this->openRe();
}
public function checkUn($aParam)
{
$aNo = $aParam["aArg"];
ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update(["checked" => 0]);
return $this->openRe();
}
public function checkUnId($aParam)
{
$aId = $aParam["aArg"];
ModelBook::whereIn("id", $aId)->update(["checked" => 0]);
return $this->openRe();
}
public function checkClear()
{
ModelBook::where("checked", ">", 0)->update(["checked" => 0]);
return $this->openRe();
}
//// check系列 end
//// nick系列
public function nick_no($aParam)
{
$aNo = $aParam["aOption"] ?? false;
$sNick = $aParam["aArg"][1] ?? false;
if (!$aNo) {
$aNo = ModelBook::where("path", $this->sPath)->where("checked", 1)->pluck("no")->toArray();
}
if (!$aNo) {
return "没有no";
}
if (count($aNo) > 1) {
return "nick是唯一";
}
if (!$sNick) {
return "没传值";
}
$r = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update(["nick" => $sNick]);
$this->mRst[] = ["", $r];
return $this->openRe();
}
public function nick($aParam)
{
$sNick = $aParam["aArg"][1] ?? false;
if (!$sNick) {
return "没arg";
}
$oBookByNick = ModelBook::where("nick", $sNick)->first();
$sPath = $oBookByNick->path.$oBookByNick->id."/";
$this->_cd($sPath);
return $this->openRe();
}
//// nick系列 end
//// tag系列
public function tag_set($aParam)
{
$sTag = $aParam["aArg"][1] ?? false;
$aNo = $aParam["aOption"];
if (!$sTag) {
return "没有tag";
}
// if (!$aNo) {
// $aNo = ModelBook::_noByChecked($this->sPath);
// }
$aId = $this->_noToId($aNo);
if (!$aId) {
return "没有no/id";
}
// $iCount = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update(["tag" => $sTag]);
$iCount = ModelBook::whereIn("id", $aId)->update(["tag" => $sTag]);
$this->mRst[] = ["", $iCount];
return $this->openRe();
}
public function tag($aParam)
{
$sTag = $aParam["aArg"][1] ?? false;
if (!$sTag) {
return "要有值";
}
$oBookByTag = ModelBook::where("tag", $sTag)->get();
return $this->bookToStr($oBookByTag);
}
public function tags()
{
$oTags = ModelBook::select('tag')->distinct()->get();
$str = "";
foreach ($oTags as $row) {
if ($row->tag) {
$str .= "\n".$row->tag;
}
}
return $str;
}
//// tag系列 end
//// fire系列
public function fire($aParam)
{
$aNo = $aParam["aOption"] ?? false;
$aFireTime = $aParam["aArg"] ?? false;
if (!$aFireTime) {
return "要time";
}
// if (!$aNo) {
// $aNo = ModelBook::_noByChecked($this->sPath);
// }
$aId = $this->_noToId($aNo);
if (!$aId) {
return "要id/no";
}
$sFireTime = implode(" ", $aFireTime);
$sFireTime = $this->_valueFormat($sFireTime);
// $r = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->update(["fire" => $sFireTime]);
$r = ModelBook::whereIn("id", $aId)->update(["fire" => $sFireTime]);
$this->mRst[] = ["", $r];
return $this->openRe();
}
// fire倒计时列表
public function firel()
{
$iLimit = ModelBookOption::_hit("fire_limit");
$oBookFire = ModelBook::where("fire", "!=", NULL)->orderBy("fire")->limit($iLimit)->get();
$sWarningLine = ModelBookOption::_hit("fire_warning_line");
$this->aOption["show_id"] = true;
$this->_cd("firel");
return $this->bookToStr($oBookFire);
}
public function fire_toggle() {
$aRagOption = $this->aRagOption;
if (@$aRagOption["fire_show"] == true) {
$aRagOption["fire_show"] = false;
} else {
$aRagOption["fire_show"] = true;
}
$this->oRag->option = json_encode($aRagOption);
$this->oRag->save();
return $this->openRe();
}
//// fire系列 end
/// hit detail系列
public function hit($aParam)
{
$aField = $aParam["aOption"];
$aNo = $aParam["aArg"];
if (!$aField) {
return "没有field";
}
// if (!$aNo) {
// $aNo = ModelBook::_noByChecked($this->sPath);
// }
$aId = $this->_noToId($aNo);
if (!$aId) {
return "没有id";
}
// $oBook = ModelBook::_no_arr($this->sPath, $aNo);
$oBook = ModelBook::_id_arr($this->sPath, $aId);
$str = "";
foreach ($oBook as $oBookRow)
{
$str .= "\n";
foreach ($aField as $sField) {
$str .= "\n".$sField.":".$oBookRow->$sField;
}
}
return $str;
}
public function detail($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$sType = $aParam["aOption"][1] ?? false;
if (!$aNo) {
$aNo = ModelBook::where("path", $this->sPath)->where("checked", 1)->pluck("no")->toArray();
}
if (!$aNo) {
return "没有no";
}
$oBook = ModelBook::_no_arr($this->sPath, $aNo);
if (!$oBook) {
return "没有book";
}
if ($sType == "all") {
$sBook = $this->toJson($oBook);
$aBookNew = [];
foreach ($oBook as $row) {
unset($row['created_at']);
unset($row['updated_at']);
$aBookNew[] = $this->toJson($row);
}
if (count($aBookNew) == 1) {
$aBookNew = $aBookNew[0];
}
return $aBookNew;
} else {
$str = "";
foreach ($oBook as $row) {
$str .= "\n";
$str .= "\n no:".$row->no;
$str .= "\n id:".$row->id;
$str .= "\n path:".$row->path;
if ($row->fire) {
$str .= "\n fire:".$row->fire;
}
if ($row->nick) {
$str .= "\n nick:".$row->nick;
}
}
return $str;
}
}
//// hit detail系列 end
//// sort 系列
private function _sort($sField, $sValue)
{
$oParentRag = $this->_getParentRag();
$oParentRag->sort = $sField."_".$sValue;
$r = $oParentRag->save();
return $r;
}
public function sort($aParam)
{
$sField = $aParam["aArg"][1];
$sValue = $aParam["aArg"][2];
$this->_sort($sField, $sValue);
return $this->openRe();
}
public function unsort()
{
$oParentRag = $this->_getParentRag();
$oParentRag->sort = NULL;
$r = $oParentRag->save();
return $this->openRe();
}
//// sort 系列 end
private function _noToId($aNo = false)
{
/// 是空认为是check 返回之
if (!$aNo) {
$aId = $this->_idByChecked();
return $aId;
}
/// end
/// 是id直接返回
$aId = [];
foreach ($aNo as $v) {
if (substr((string) $v, 0, 1) == "i") {
$aId[] = substr($v, 1);
}
}
if (count($aId) > 0) {
return $aId;
}
// end
/// 标准no传值
$aId = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->pluck("id")->toArray();
return $aId;
/// end
}
public function tt()
{
$this->_noToId([1, 2]);
}
//// rank系列
// book#rank__1__3 2
// book#rank 2
public function rank($aParam)
{
$aNo = $aParam["aOption"] ?? false;
$sRank = $aParam["aArg"][1] ?? false;
$aId = $this->_noToId($aNo);
$r = ModelBook::whereIn("id", $aId)->update(["rank" => $sRank]);
$this->mRst[] = ["", $r];
return $this->openRe();
}
public function srank($aParam)
{
$sValue = $aParam["aArg"][1] ?? NULL;
$this->_sort("rank", $sValue);
return $this->openRe();
}
private function _RankMap($sRank)
{
// 🟥🟧🟨🟩🟦🟪⬛️⬜️🟫
// $aMap = [
// "war" => "🟥",
// "gem" => "🟪",
// "glod" => "🟨",
// "iron" => "🟫",
// "action" => "🟩",
// "wait" => "⬜️",
// "blok" => "⬛️",
// "keep" => "🟨",
// "tip" => "🟪",
// "track" => "🟫",
// ];
$aMap = [
"war" => "🔴",
"gem" => "🟣",
"glod" => "🟡",
"iron" => "🟤",
"action" => "🟢",
"wait" => "⚪️",
"blok" => "⚫️",
"keep" => "🟡",
"tip" => "🟣",
"track" => "🟤",
];
if (!empty($aMap[$sRank])) {
$sRst = $aMap[$sRank];
} else {
$sRst = false;
}
return $sRst;
}
//// rank系列 end
//// 要有移动功能携带parentid的右接就行
public function move_no($aParam)
{
$aNo = $aParam["aArg"] ?? false;
$sType = $aParam["aOption"][1] ?? false;
if (!$aNo) {
return "需要no";
}
if (!$sType) {
return "需要type";
}
return $this->_Move($aNo, $sType);
}
public function move_id($aParam)
{
// $aId
}
public function move($aParam)
{
$sType = $aParam["aArg"][1] ?? false; // back,main,{no}
$aNo = $aParam["aOption"];
if (!$aNo) {
$aNo = ModelBook::_noByChecked($this->sPath);
}
if (!$sType) {
return "需要type";
}
if (!$aNo) {
return "需要no";
}
return $this->_move($aNo, $sType);
}
private function _move($aNo, $sType)
{
// 要移动的
$oMoveRag = ModelBook::where("path", $this->sPath)->whereIn("no", $aNo)->get();
if ($sType == "back") {
if ($this->sPath == "/") {
return "以到顶";
}
$aPath = explode("/", $this->sPath);
array_pop($aPath);
array_pop($aPath);
$sPathNew = implode("/", $aPath)."/"; // 到这里,关键
} else if ($sType == "main") {
if ($this->sPath == "/") {
return "以到顶";
}
$sPathNew = "/";
} else {
$iMoveToId = ModelBook::where("path", $this->sPath)->where("no", $sType)->first()?->id;
if (!$iMoveToId) {
return "没有这个no";
}
$sPathNew = $this->sPath.$iMoveToId."/";
}
foreach ($oMoveRag as $oMoveRagRow) {
// 找到moveRag的所有sub和他自己
$oSubRag = ModelBook::where("path", "like", $oMoveRagRow->path.$oMoveRagRow->id."/%")->get();
$oSubRag[] = $oMoveRagRow;
// 一个一个移动
$i = 0;
foreach ($oSubRag as $oSubRagRow) {
$sRowPathNew = str_replace($this->sPath, $sPathNew, $oSubRagRow->path);
// 他自己要重置nosub不用
if ($oSubRagRow->id == $oMoveRagRow->id) {
$oSubRagRow->no = 30000 + $i;
}
$oSubRagRow->path = $sRowPathNew;
$iCount = $oSubRagRow->save();
$i++;
}
}
$this->_cd($sPathNew);
$this->noRe();
// $this->pageRe();
return $this->openRe();
}
//// 移动 end
//// 子页数量
private function _SubCount($sPathSub)
{
$iSubCount = ModelBook::where("path", $sPathSub)->where("is_del", 0)->count();
return $iSubCount;
}
//// 子页数量 end
public function test()
{
$arr = [];
tomd($arr["zz"]);
}
//// 字符串生成 系列
private function bookToStr($oBook)
{
$sTopBar = "[ ";
$iDelCount = ModelBook::where("path", $this->sPath)->where("is_del", 1)->count();
if ($iDelCount > 0) {
$sTopBar .= "".$iDelCount;
}
if (count($this->mRst) > 0) {
foreach ($this->mRst as $v) {
$sTopBar .= $v[0].$v[1];
}
}
// if (count($this->mRst) > 0) {
// foreach ($this->mRst as $k => $v) {
// $sTopBar .= $k.$v;
// }
// }
if ($this->iPageNo > 1) {
$sTopBar .= "".$this->iPageNo;
}
$sTopBar .= " ]";
if (strlen($sTopBar) <= 4) {
$sTopBar = "";
} else {
$sTopBar .= "\n\n";
}
$sStr = "";
$sStr .= $sTopBar;
if ($this->sPath != "/") {
$iParentId = $this->_parentIdByPath();
$sParentRag = ModelBook::where("id", $iParentId)->first()?->rag;
$sParentStr = "";
$sParentStr .= "p:".$sParentRag;
$sStr .= $sParentStr;
}
$this->aOption["page_limit"] = ModelBookOption::_hit("page_limit");
$this->aOption["page_no"] = ModelBookPage::where("path", $this->sPath)->first()?->page ?? 1;
// $sStr = "";
$i = 0;
$iDeepStart = $this->pathLen($this->sPath);
$this->exp_loop($oBook, $sStr, $iDeepStart, $i);
return $sStr;
}
public function exp_loop($oRag, &$str, $iDeepStart, &$i)
{
foreach ($oRag as $oRagRow) {
$iPathLen = $this->pathLen($oRagRow->path);
$iDeep = $iPathLen - $iDeepStart;
$str .= $this->_ragToStr($oRagRow, $iDeep);
if ($oRagRow->exp == 1) {
$sPathSub = $oRagRow->path.$oRagRow->id."/";
$oRagSub = ModelBook::where("path", $sPathSub)->where("is_del", 0)->orderBy("no")->get();
$this->exp_loop($oRagSub, $str, $iDeepStart, $i);
}
$i++;
}
}
private function _deepToStr($iDeep)
{
if ($iDeep == 0) {
return "";
}
$str = "";
for ($i=0; $i<$iDeep; $i++) {
$str .= "-";
}
$str .= ">";
return $str;
}
private function _ragToStr_rank($sRank)
{
$str = "";
if ($this->aParentType[1] == "todo") {
} else {
$str = ":".$this->_RankMap($sRank);
}
return $str;
}
private function _RankMapTodo()
{
// $aMap
}
private function _ragToStr($oRag, $iDeep = 0)
{
$sStr = "";
$sStr .= "\n";
if ($iDeep == 0) {
$sStr .= "\n";
}
$sStr .= $this->_deepToStr($iDeep);
if (@$this->aOption["show_id"]) {
$sStr .= $oRag->id."-";
}
$sStr .= $oRag->no;
if ($oRag->checked >= 1) {
$sStr .= ":🎯";
}
if ($oRag->mark >= 1) {
$sStr .= ":⭐️";
}
if ($this->_RankMap($oRag->rank)) {
$sStr .= ":".$this->_RankMap($oRag->rank);
}
// tomd($this->oRag->option, 1);
if ((isset($this->aRagOption["fire_show"]) && $this->aRagOption["fire_show"] == true) && $oRag->fire) {
$iDayLine = ceil((strtotime($oRag->fire) - time()) / 86400);
$tmp = "";
if ($iDayLine < 1) {
$tmp .= "‼️";
} else if ($iDayLine < $this->aOption["fire_warning_line"]) {
$tmp .= "⚠️";
}
$tmp .= "⏱️";
$tmp .= $iDayLine;
$sStr .= ":".$tmp;
}
$sStr .= ":".$oRag->rag;
if ($iSubCount = $this->_SubCount($oRag->path.$oRag->id."/")) {
$sStr .= " *".$iSubCount;
}
return $sStr;
}
//// 字符串生成 系列 end
}