diff --git a/src/Services/Tg/Hook/Dog.php b/src/Services/Tg/Hook/Dog.php index 529b82d68..26155722b 100644 --- a/src/Services/Tg/Hook/Dog.php +++ b/src/Services/Tg/Hook/Dog.php @@ -24,6 +24,8 @@ class Dog extends Mod\Base { public $aOutFormat = []; public $sDogName; private $aMsg = []; + public $aSelectField = []; + public $aHideField = []; public function __construct($oModelSelf = false) { @@ -31,11 +33,38 @@ class Dog extends Mod\Base { } //// 定义系列 + + // 必须,关联option和me那些 + public function _setDogName($sDogName) + { + $this->sDogName = $sDogName; + } + + // 必须,使用的model + public function _setModel($oModelSelf) + { + $this->oModelSelf = $oModelSelf; + } + + // str字段的最大长度 public function _setStrMaxLen($iStrMaxLen) { $this->iStrMaxLen = $iStrMaxLen; } + // 隐藏某些字段[id,name] + public function _setHideField($aHideField = []) + { + $this->aHideField = $aHideField; + } + + // 选择性取某些字段[id,name] + public function _setSelectField($aSelectField = []) + { + $this->aSelectField = $aSelectField; + } + + // 设置长字符串字段 public function _setStrField($aStrField) { $this->iStrMaxLen = ModelDogOption::_hit($this->sDogName, "str_len_max"); @@ -49,35 +78,24 @@ class Dog extends Mod\Base { $this->aStrField = $aStrField; } - public function _setDogName($sDogName) - { - $this->sDogName = $sDogName; - } - - - public function _setModel($oModelSelf) - { - $this->oModelSelf = $oModelSelf; - } - + // 设置主键 public function _setPrimaryKey($key) { $this->sPrimaryKey = $key; } + // 写入数据时格式化某些字段 [transfer_enable => gb] public function _setInFormat($aInFormat) { $this->aInFormat = $aInFormat; } + // 输出数据时格式化某些字段 [transfer_enable => gb] public function _setOutFormat($aOutFormat) { $this->aOutFormat = $aOutFormat; } -// public function _setFormatField($aFormatField) -// { -// $this->aFormatField = $aFormatField; -// } + //// 定义系列 end //// option 系列 @@ -417,12 +435,12 @@ class Dog extends Mod\Base { $sHitField = $aParam["sHitField"] ?? false; if ($sValue == "?") { - return "#find__{field?primaryKey}__{page?1} {value?all}"; + return "#find__{field?primaryKey}__{page?1} {value?_all}"; } $iLimit = $this->_getLimit(); - if ($sValue === false ) { + if ($sValue === "_all" ) { $oSelf = $this->oModelSelf; @@ -555,6 +573,20 @@ class Dog extends Mod\Base { private function filterData($aData) { + if ($this->aSelectField) { + $aDataNew = []; + foreach ($this->aSelectField as $sSelectField) { + $aDataNew[$sSelectField] = $aData[$sSelectField]; + } + $aData = $aDataNew; + } + + if ($this->aHideField) { + foreach ($this->aHideField as $sHideField) { + unset($aData[$sHideField]); + } + } + foreach ($this->aStrField as $sStrField) { $aData[$sStrField] = $this->subStr($aData[$sStrField]); } @@ -564,6 +596,8 @@ class Dog extends Mod\Base { $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); } else if ($sFormatType == "dateFull") { $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); + } else if ($sFormatType == "gb") { + $aData[$sFormatField] = round($aData[$sFormatField] / 1073741824, 2)."gb"; } } diff --git a/src/Services/Tg/Hook/Mod/Invoice.php b/src/Services/Tg/Hook/Mod/Invoice.php new file mode 100644 index 000000000..568142a04 --- /dev/null +++ b/src/Services/Tg/Hook/Mod/Invoice.php @@ -0,0 +1,48 @@ +oDog = new Dog(new ModelIvoice()); + $this->oDog->_setDogName("Invoice"); // 必须,me用,正常就是类名,只不过后期没准改名,所以就这里写死 +// $this->oDog->_setPrimaryKey("code"); // 可选,默认id +// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 +// $this->oDog->_setInFormat(["date"]); + $this->oDog->_setOutFormat([ + "create_time" => "date", + "update_time" => "date", + "pay_time" => "date", + ]); + } + + public function __call($sName, $aArg) + { + + return $this->oDog->$sName($aArg[0]); + + } + + public function findFull($aParam) + { + return $this->oDog->find($aParam); + } + + public function find($aParam) + { +// $this->oDog->_setHideField([ +// "content" +// ]); + + return $this->oDog->find($aParam); + } + +} diff --git a/src/Services/Tg/Hook/Mod/Order.php b/src/Services/Tg/Hook/Mod/Order.php index 4332fdd14..8a941bd94 100644 --- a/src/Services/Tg/Hook/Mod/Order.php +++ b/src/Services/Tg/Hook/Mod/Order.php @@ -1,153 +1,32 @@ ValueTypeFormat($sValue); - - if (!$iId) { - return "没有id"; - } - - $oOrder = ModelOrder::find($iId); - - if (!$oOrder) { - return "没找到"; - } - - $oOrder->$sField = $sValue; - $r = $oOrder->save(); - - return $r; - - } - - public function Limit($aParam) - { - $iLimit = $aParam['aArg'][1] ?? 1; - - $aOrder = ModelOrder::orderBy('id', 'desc')->limit($iLimit)->get()->toArray(); - - foreach ($aOrder as $v) { - $aOrderSingle = $this->format($v); - $sMsg = json_encode($aOrderSingle, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - $this->oTGHttp->sendToTG($sMsg); - } - - $this->oHttp::response(200, 'ok'); - - } - - public function Find($aParam) - { - $iId = $aParam['aArg'][1]; - - $aOrder = ModelOrder::where("id", $iId)->first()->toArray(); - - $sMsg = json_encode($this->format($aOrder), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - - return $sMsg; - } - - public function FindByUser($aParam) - { - - $iUserId = $aParam['aArg'][1]; - - $aOrder = ModelOrder::where("user_id", $iUserId)->get()->toArray(); - - if ($aOrder) { - $aOrderNew = []; - foreach ($aOrder as $k => $v) { - $aOrderNew[] = $this->format($v); - } - } else { - $aOrderNew = ["not have id" => $iUserId]; - } - - $sMsg = json_encode($aOrderNew, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - - return $sMsg; - - } - - public function GroupBySaleCode($aParam) - { - -// @list($sCmd, $iDay) = explode("#", $sText, 2); - - if (!isset($aParam['aArg'][1])) { - $iDay = 0; - } else { - $iDay = $aParam['aArg'][1]; - } - - // 确保 $iDay 是一个有效的数字 - if (!is_numeric($iDay) || $iDay < 0) { - throw new \Exception("无效的天数参数"); - } + private $oDog; - $sStartTime = strtotime("-$iDay days"); - $tmp = date("Y-m-d", $sStartTime); - $sStartTime = strtotime($tmp); - - $aOrderList = ModelOrder::where('update_time', '>=', $sStartTime) - ->whereIn('status', ['activated', 'pending_activation']) // 添加状态条件 - ->select('coupon', - \App\Services\DB::raw('count(*) as total'), - \App\Services\DB::raw('SUM(price) as total_price')) - ->groupBy('coupon') - ->get() - ->toArray(); - - $sMsg = '从 '.date("Y-m-d H:i:s", $sStartTime); - foreach ($aOrderList as $row) { - $coupon = str_replace('.', '#', $row['coupon']); - if (!$coupon) { - $coupon = '无'; - } - $sMsg .= "\n\n"; - $sMsg .= $coupon . ' - ' . $row['total_price'] . ' / ' . $row['total']; - } - - return $sMsg; + public function __construct($aUpdate) + { + + $this->oDog = new Dog(new ModelOrder()); + $this->oDog->_setDogName("order"); // 必须,me用,正常就是类名,只不过后期没准改名,所以就这里写死 +// $this->oDog->_setPrimaryKey("code"); // 可选,默认id +// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 + $this->oDog->_setOutFormat([ + "create_time" => "date", + "update_time" => "date", + ]); + } + public function __call($sName, $aArg) + { + + return $this->oDog->$sName($aArg[0]); + } } diff --git a/src/Services/Tg/Hook/Mod/OrderOld.php b/src/Services/Tg/Hook/Mod/OrderOld.php new file mode 100644 index 000000000..4332fdd14 --- /dev/null +++ b/src/Services/Tg/Hook/Mod/OrderOld.php @@ -0,0 +1,153 @@ +ValueTypeFormat($sValue); + + if (!$iId) { + return "没有id"; + } + + $oOrder = ModelOrder::find($iId); + + if (!$oOrder) { + return "没找到"; + } + + $oOrder->$sField = $sValue; + $r = $oOrder->save(); + + return $r; + + } + + public function Limit($aParam) + { + $iLimit = $aParam['aArg'][1] ?? 1; + + $aOrder = ModelOrder::orderBy('id', 'desc')->limit($iLimit)->get()->toArray(); + + foreach ($aOrder as $v) { + $aOrderSingle = $this->format($v); + $sMsg = json_encode($aOrderSingle, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + $this->oTGHttp->sendToTG($sMsg); + } + + $this->oHttp::response(200, 'ok'); + + } + + public function Find($aParam) + { + $iId = $aParam['aArg'][1]; + + $aOrder = ModelOrder::where("id", $iId)->first()->toArray(); + + $sMsg = json_encode($this->format($aOrder), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + + return $sMsg; + } + + public function FindByUser($aParam) + { + + $iUserId = $aParam['aArg'][1]; + + $aOrder = ModelOrder::where("user_id", $iUserId)->get()->toArray(); + + if ($aOrder) { + $aOrderNew = []; + foreach ($aOrder as $k => $v) { + $aOrderNew[] = $this->format($v); + } + } else { + $aOrderNew = ["not have id" => $iUserId]; + } + + $sMsg = json_encode($aOrderNew, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + + return $sMsg; + + } + + public function GroupBySaleCode($aParam) + { + +// @list($sCmd, $iDay) = explode("#", $sText, 2); + + if (!isset($aParam['aArg'][1])) { + $iDay = 0; + } else { + $iDay = $aParam['aArg'][1]; + } + + // 确保 $iDay 是一个有效的数字 + if (!is_numeric($iDay) || $iDay < 0) { + throw new \Exception("无效的天数参数"); + } + + $sStartTime = strtotime("-$iDay days"); + $tmp = date("Y-m-d", $sStartTime); + $sStartTime = strtotime($tmp); + + $aOrderList = ModelOrder::where('update_time', '>=', $sStartTime) + ->whereIn('status', ['activated', 'pending_activation']) // 添加状态条件 + ->select('coupon', + \App\Services\DB::raw('count(*) as total'), + \App\Services\DB::raw('SUM(price) as total_price')) + ->groupBy('coupon') + ->get() + ->toArray(); + + $sMsg = '从 '.date("Y-m-d H:i:s", $sStartTime); + foreach ($aOrderList as $row) { + $coupon = str_replace('.', '#', $row['coupon']); + if (!$coupon) { + $coupon = '无'; + } + $sMsg .= "\n\n"; + $sMsg .= $coupon . ' - ' . $row['total_price'] . ' / ' . $row['total']; + } + + return $sMsg; + + } + +} diff --git a/src/Services/Tg/Hook/Mod/User.php b/src/Services/Tg/Hook/Mod/User.php index c78aa079a..78215809f 100644 --- a/src/Services/Tg/Hook/Mod/User.php +++ b/src/Services/Tg/Hook/Mod/User.php @@ -1,209 +1,122 @@ "; - } else if ($sType == "class0") { - $sTypePre = ">="; - } - - $aUser = ModelUser::where("class", $sTypePre, 0)->orderBy("id", "desc")->limit($iLimit)->get()->toArray(); - - foreach ($aUser as $row) { - $sMsg = json_encode($this->format($row), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - $this->oTGHttp->sendToTG($sMsg); - } - - $this->oHttp::response(200, 'ok'); - - } - - private function ValueTypeFormat($sValue) - { - list($sValue, $sValueType) = explode("#", $sValue); - - if ($sValueType) { - if ($sValueType == "gb") { - $sValue = Tools::tomGbToB($sValue); - } else if ($sValueType == "date") { - $sValue = strtotime($sValue); - } - } - - return $sValue; - } - - public function Set($aParam) - { - -// $iId = 1778; - $iId = $aParam['aOption'][1]; - $sField = $aParam['aOption'][2]; - $sValue = $aParam['aArg'][1]; - $sValue = $this->ValueTypeFormat($sValue); - - if (!$iId) { - return "没有id"; - } - - $oUser = ModelUser::find($iId); - - if ($oUser) { - $oUser->$sField = $sValue; - $r = $oUser->save(); - } else { - $r = '没有'; - } - - return $r; - - } - - public function Find($aParam) - { - -// list(, $iUserId) = explode(" ", $sText, 2); - - $iUserId = $aParam['aArg'][1]; - - $oUser = ModelUser::find($iUserId); - - if ($oUser) { - $aUser = $oUser->toArray(); - $aUser = $this->format($aUser); -// unset($aUser['pass']); -// unset($aUser['passwd']); -// unset($aUser['uuid']); -// unset($aUser['method']); -// unset($aUser['is_admin']); -// unset($aUser['theme']); -// unset($aUser['ga_token']); -// unset($aUser['ga_enable']); -// unset($aUser['api_token']); -// unset($aUser['is_dark_mode']); -// unset($aUser['locale']); -// -// $aUser['transfer_today'] = Tools::flowToGB($aUser['transfer_today']).'GB'; -// $aUser['transfer_total'] = Tools::flowToGB($aUser['transfer_total']).'GB'; -// $aUser['transfer_enable'] = Tools::flowToGB($aUser['transfer_enable']).'GB'; -// $aUser['u'] = Tools::flowToGB($aUser['u']).'GB'; -// $aUser['d'] = Tools::flowToGB($aUser['d']).'GB'; -// $aUser['ud'] = $aUser['u'] + $aUser['d']; -// $aUser['last_use_time'] = date('Y-m-d H:i:s', $aUser['last_use_time']); - } else { - $aUser = ["not have id" => $iUserId]; - } + private $oDog; - $sMsg = json_encode($aUser, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + public function __construct($aUpdate) + { - return $sMsg; + $this->oDog = new Dog(new ModelUser()); + $this->oDog->_setDogName("user"); // 必须,me用,正常就是类名,只不过后期没准改名,所以就这里写死 +// $this->oDog->_setPrimaryKey("code"); // 可选,默认id +// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 +// $this->oDog->_setInFormat(["date"]); + $this->oDog->_setOutFormat([ + "transfer_enable" => "gb", + "u" => "gb", + "d" => "gb", + ]); + } + + public function __call($sName, $aArg) + { + + return $this->oDog->$sName($aArg[0]); } - public function Report($aParam) + public function findFull($aParam) { - -// @list(, $sOption1, $sOption2, $sOption3) = explode("_", $sText, 4); - - @$sOption1 = $aParam['aOption'][1]; - @$sOption2 = $aParam['aOption'][2]; - @$sOption3 = $aParam['aOption'][3]; - @$sOption4 = $aParam['aOption'][4]; - - $sMsg = '?'; - - if ($sOption1 == 'day') { - $sMsg = (new ServiceTgReportUser())->ByDay($sOption2); - } - - if ($sOption1 == 'date') { - $sMsg = (new ServiceTgReportUser())->ByDate($sOption2, $sOption3); - } - - return $sMsg; - + return $this->oDog->find($aParam); } - public function delDone($aParam) + public function find($aParam) { - $aParam["bIsDone"] = true; + $sMail = $aParam["aArg"][1] ?? false; - return $this->del($aParam); + $aSelectField = [ + "id", + "email", + "money", + "total_pay", + "class", + "class_expire", + "transfer_enable", + "u", + "d", + "reg_date", + ]; + + $this->_setSelectField($aSelectField); + + return $this->oDog->find($aParam); } - public function del($aParam) + public function moneyAdd($aParam) { - $iId = $aParam["aArg"][1] ?? false; - $bIsDone = $aParam["bIsDone"] ?? false; + $aParam["_sUpDown"] = "up"; - if (!$iId) { - return "需要id"; + if ($aParam["aArg"][1] == "?") { + return "/user#moneyAdd__[key]__[where]__确认[y/n:default] [money]"; } - if ($iId == "?") { - return "/user#del {user_id}"; + return $this->_moneyUpDown($aParam); + } + + private function _moneyUpDown($aParam) + { + $sKey = $aParam["aOption"][1] ?? false; + $sWhere = $aParam["aOption"][2] ?? false; + $sConfirm = $aParam["aOption"][3] ?? "n"; + $iMoney = $aParam["aArg"][1] ?? false; + + $sUpDown = $aParam["_sUpDown"] ?? false; + + if (!$sUpDown) { + return "需要upDown"; } - $oUser = ModelUser::where("id", $iId)->first(); + if (!$sKey) { + return "需要key"; + } + + if (!$sWhere) { + return "需要where"; + } + + if (!$iMoney) { + return "需要money"; + } + + $oUser = ModelUser::select("id", "email", "money", "total_pay", "class")->where($sKey, $sWhere)->first(); if (!$oUser) { - return "没有这个用户:".$iId; + return "没有这个user"; } - if ($bIsDone === true) { - $r = $oUser->delete(); + if ($sConfirm == "n") { + $sStr = "

给他加【".$iMoney."】的money,确认加y

"; + $sStr .= $this->toJson($oUser); - return "删除".$r."条数据"; + return $sStr; } - $sMsg = "清确认信息,没问题用delDone \n\n"; + if ($sConfirm == "y") { + $oUser->money += $iMoney; + $oUser->save(); + + return $this->toJson($oUser); + } - $sUserJson = $this->toJson($this->format($oUser->toArray())); - - $sReturn = $sMsg.$sUserJson; - - return $sReturn; } public function CountReg($aParam) @@ -241,4 +154,28 @@ final class User extends Base return $sTop.$sTotal.$sMsg.$sFoot; } + public function Report($aParam) + { + +// @list(, $sOption1, $sOption2, $sOption3) = explode("_", $sText, 4); + + @$sOption1 = $aParam['aOption'][1]; + @$sOption2 = $aParam['aOption'][2]; + @$sOption3 = $aParam['aOption'][3]; + @$sOption4 = $aParam['aOption'][4]; + + $sMsg = '?'; + + if ($sOption1 == 'day') { + $sMsg = (new ServiceTgReportUser())->ByDay($sOption2); + } + + if ($sOption1 == 'date') { + $sMsg = (new ServiceTgReportUser())->ByDate($sOption2, $sOption3); + } + + return $sMsg; + + } + } diff --git a/src/Services/Tg/Hook/Mod/UserOld.php b/src/Services/Tg/Hook/Mod/UserOld.php new file mode 100644 index 000000000..c78aa079a --- /dev/null +++ b/src/Services/Tg/Hook/Mod/UserOld.php @@ -0,0 +1,244 @@ +"; + } else if ($sType == "class0") { + $sTypePre = ">="; + } + + $aUser = ModelUser::where("class", $sTypePre, 0)->orderBy("id", "desc")->limit($iLimit)->get()->toArray(); + + foreach ($aUser as $row) { + $sMsg = json_encode($this->format($row), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + $this->oTGHttp->sendToTG($sMsg); + } + + $this->oHttp::response(200, 'ok'); + + } + + private function ValueTypeFormat($sValue) + { + list($sValue, $sValueType) = explode("#", $sValue); + + if ($sValueType) { + if ($sValueType == "gb") { + $sValue = Tools::tomGbToB($sValue); + } else if ($sValueType == "date") { + $sValue = strtotime($sValue); + } + } + + return $sValue; + } + + public function Set($aParam) + { + +// $iId = 1778; + $iId = $aParam['aOption'][1]; + $sField = $aParam['aOption'][2]; + $sValue = $aParam['aArg'][1]; + $sValue = $this->ValueTypeFormat($sValue); + + if (!$iId) { + return "没有id"; + } + + $oUser = ModelUser::find($iId); + + if ($oUser) { + $oUser->$sField = $sValue; + $r = $oUser->save(); + } else { + $r = '没有'; + } + + return $r; + + } + + public function Find($aParam) + { + +// list(, $iUserId) = explode(" ", $sText, 2); + + $iUserId = $aParam['aArg'][1]; + + $oUser = ModelUser::find($iUserId); + + if ($oUser) { + $aUser = $oUser->toArray(); + $aUser = $this->format($aUser); +// unset($aUser['pass']); +// unset($aUser['passwd']); +// unset($aUser['uuid']); +// unset($aUser['method']); +// unset($aUser['is_admin']); +// unset($aUser['theme']); +// unset($aUser['ga_token']); +// unset($aUser['ga_enable']); +// unset($aUser['api_token']); +// unset($aUser['is_dark_mode']); +// unset($aUser['locale']); +// +// $aUser['transfer_today'] = Tools::flowToGB($aUser['transfer_today']).'GB'; +// $aUser['transfer_total'] = Tools::flowToGB($aUser['transfer_total']).'GB'; +// $aUser['transfer_enable'] = Tools::flowToGB($aUser['transfer_enable']).'GB'; +// $aUser['u'] = Tools::flowToGB($aUser['u']).'GB'; +// $aUser['d'] = Tools::flowToGB($aUser['d']).'GB'; +// $aUser['ud'] = $aUser['u'] + $aUser['d']; +// $aUser['last_use_time'] = date('Y-m-d H:i:s', $aUser['last_use_time']); + } else { + $aUser = ["not have id" => $iUserId]; + } + + $sMsg = json_encode($aUser, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + + return $sMsg; + + } + + public function Report($aParam) + { + +// @list(, $sOption1, $sOption2, $sOption3) = explode("_", $sText, 4); + + @$sOption1 = $aParam['aOption'][1]; + @$sOption2 = $aParam['aOption'][2]; + @$sOption3 = $aParam['aOption'][3]; + @$sOption4 = $aParam['aOption'][4]; + + $sMsg = '?'; + + if ($sOption1 == 'day') { + $sMsg = (new ServiceTgReportUser())->ByDay($sOption2); + } + + if ($sOption1 == 'date') { + $sMsg = (new ServiceTgReportUser())->ByDate($sOption2, $sOption3); + } + + return $sMsg; + + } + + public function delDone($aParam) + { + $aParam["bIsDone"] = true; + + return $this->del($aParam); + } + + public function del($aParam) + { + $iId = $aParam["aArg"][1] ?? false; + $bIsDone = $aParam["bIsDone"] ?? false; + + if (!$iId) { + return "需要id"; + } + + if ($iId == "?") { + return "/user#del {user_id}"; + } + + $oUser = ModelUser::where("id", $iId)->first(); + + if (!$oUser) { + return "没有这个用户:".$iId; + } + + if ($bIsDone === true) { + $r = $oUser->delete(); + + return "删除".$r."条数据"; + } + + $sMsg = "清确认信息,没问题用delDone \n\n"; + + $sUserJson = $this->toJson($this->format($oUser->toArray())); + + $sReturn = $sMsg.$sUserJson; + + return $sReturn; + } + + public function CountReg($aParam) + { + + @$sOption1 = $aParam['aOption'][1] ?? 'day'; + @$sOption2 = $aParam['aOption'][2] ?? 0; + @$sOption3 = $aParam['aOption'][3]; + @$sOption4 = $aParam['aOption'][4]; + + $sMsg = '?'; + + if ($sOption1 == 'day') { + $r = (new ServiceCountUser())->RegByDay($sOption2); + } + + if ($sOption1 == 'date') { + $r = (new ServiceCountUser())->RegByDate($sOption2, $sOption3); + } + + $sTop = "\n\n--注册统计--------------------"; + $sMsg = ''; + $iTotalCount = 0; + foreach ($r as $row) { + $sMsg .= "\n\n"; + $sMsg .= $row['from'].":".$row['count']; + $iTotalCount += $row['count'] ?? 0; + } + + $sTotal = "\n\n总数:".$iTotalCount; + $sTotal .= "\n\n---------------------------"; + + $sFoot = "\n\n---------------------------"; + + return $sTop.$sTotal.$sMsg.$sFoot; + } + +}