LogsServices.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <?php
  2. namespace backend\modules\mall\services;
  3. use addons\Mch\common\models\MchAdmin;
  4. use addons\Store\common\models\StoreAdmin;
  5. use common\enums\AddonsEnum;
  6. use common\enums\OrderBehaviorLogsEnum;
  7. use common\enums\RefundStatusEnum;
  8. use common\enums\StatusEnum;
  9. use common\enums\UserBehaviorLogsEnum;
  10. use common\models\backend\Admin;
  11. use common\models\mall\MallAddons;
  12. use common\models\order\Order;
  13. use common\models\order\OrderBehaviorLogs;
  14. use common\models\user\User;
  15. use common\models\user\UserBehaviorLogs;
  16. class LogsServices extends BaseService
  17. {
  18. /**
  19. * 获取用户日志
  20. *
  21. * @param array $params
  22. *
  23. * @return array
  24. */
  25. public function getUserLogs(array $params): array
  26. {
  27. $operatorUserType = $params['operator_user_type'] ?? 0;
  28. $operatorUserKeyword = $params['operator_user_keyword'] ?? 0;
  29. $operatorTargetUserKeyword = $params['operator_target_user_keyword'] ?? '';
  30. $behavior = $params['behavior'] ?? 0;
  31. $where = [['mall_id' => $this->mall_id]];
  32. if ($operatorUserType) {
  33. $where[] = ['operator_user_type' => $operatorUserType];
  34. }
  35. if ($operatorUserKeyword) {
  36. if ($operatorUserType == UserBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN) {
  37. $adminFind = Admin::find();
  38. Admin::paramPack([
  39. 'where' => [
  40. ['mall_id' => [0, $this->mall_id]],
  41. [
  42. 'or',
  43. ['like', 'username', $operatorUserKeyword],
  44. ['like', 'account', $operatorUserKeyword]
  45. ]
  46. ],
  47. 'select' => 'id'
  48. ], $adminFind);
  49. $adminIdsBy = $adminFind->column();
  50. $where[] = ['operator_user_id' => $adminIdsBy];
  51. } elseif ($operatorUserType == UserBehaviorLogsEnum::OPERATOR_USER_TYPE_USER) {
  52. $userIdsByMobile = User::find()
  53. ->where(['like', 'mobile', $operatorUserKeyword])
  54. ->andWhere(['mall_id' => $this->mall_id])
  55. ->select('id')
  56. ->column();
  57. $where[] = ['operator_user_id' => array_merge([$operatorUserKeyword], $userIdsByMobile)];
  58. }
  59. }
  60. if ($operatorTargetUserKeyword) {
  61. $userIdsByOperatorTargetUserKeyword = User::find()
  62. ->where(['like', 'mobile', $operatorTargetUserKeyword])
  63. ->andWhere(['mall_id' => $this->mall_id])
  64. ->select('id')
  65. ->column();
  66. $where[] = [
  67. 'or',
  68. ['=', 'operator_target_user_id', $operatorTargetUserKeyword],
  69. ['in', 'operator_target_user_id', $userIdsByOperatorTargetUserKeyword]
  70. ];
  71. }
  72. if ($behavior) {
  73. $where[] = ['=', 'behavior', $behavior];
  74. }
  75. $userSelect = 'id, mobile, nickname, avatar_url';
  76. $with = [
  77. 'user' => function ($query) use ($userSelect) {
  78. $query->select($userSelect);
  79. }
  80. ];
  81. $order = 'id desc';
  82. $list = UserBehaviorLogs::listPage(compact('where', 'with', 'order'));
  83. $operatorUserIds = [];
  84. array_walk($list['list'], function ($item) use (&$operatorUserIds) {
  85. $operatorUserIds[$item['operator_user_type']][] = $item['operator_user_id'];
  86. });
  87. // 查询用户
  88. $userList = [];
  89. if (!empty($operatorUserIds[UserBehaviorLogsEnum::OPERATOR_USER_TYPE_USER])) {
  90. $userList = User::getUserList(
  91. [
  92. ['in', 'id', $operatorUserIds[UserBehaviorLogsEnum::OPERATOR_USER_TYPE_USER]]
  93. ],
  94. $userSelect,
  95. [],
  96. true
  97. );
  98. }
  99. // 查询后台管理员
  100. $adminList = [];
  101. if (!empty($operatorUserIds[UserBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN])) {
  102. $adminList = Admin::lists([
  103. 'where' => [
  104. [
  105. 'id' => $operatorUserIds[UserBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN],
  106. 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]
  107. ]
  108. ],
  109. 'select' => "id, account mobile, username nickname"
  110. ]);
  111. }
  112. $userList = array_column($userList, null, 'id');
  113. $adminList = array_column($adminList, null, 'id');
  114. array_walk($list['list'], function (&$item) use ($adminList, $userList) {
  115. $item['extra_info'] = json_decode($item['extra_info'], true);
  116. $item['behavior_text'] = UserBehaviorLogsEnum::getMapValueByKey(0, $item['behavior']);
  117. $item['operator_user_type_text'] = UserBehaviorLogsEnum::getMapValueByKey(1, $item['operator_user_type']);
  118. $item['created_at_text'] = date('Y-m-d H:i:s', $item['created_at']);
  119. $item['ip_text'] = $item['ip'] ? long2ip($item['ip']) : '-';
  120. $item['operator_user'] = UserBehaviorLogsEnum::OPERATOR_USER_TYPE_USER == $item['operator_user_type'] ?
  121. ($userList[$item['operator_user_id']] ?? []) :
  122. ($adminList[$item['operator_user_id']] ?? []);
  123. });
  124. return $list;
  125. }
  126. /**
  127. * 获取用户日志
  128. *
  129. * @param array $params
  130. *
  131. * @return array
  132. */
  133. public function getOrderLogs(array $params): array
  134. {
  135. $operatorUserType = $params['operator_user_type'] ?? 0;
  136. $operatorUserKeyword = $params['operator_user_keyword'] ?? 0;
  137. $behavior = $params['behavior'] ?? 0;
  138. $orderId = $params['order_id'] ?? 0;
  139. $orderNo = $params['order_no'] ?? '';
  140. $createdAt = $params['created_at'] ?? [];
  141. $where = [['mall_id' => $this->mall_id]];
  142. if ($operatorUserType) {
  143. $where[] = ['operator_user_type' => $operatorUserType];
  144. }
  145. if ($operatorUserKeyword) {
  146. if ($operatorUserType == OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN) {
  147. $adminFind = Admin::find();
  148. Admin::paramPack([
  149. 'where' => [
  150. ['mall_id' => [0, $this->mall_id]],
  151. [
  152. 'or',
  153. ['like', 'username', $operatorUserKeyword],
  154. ['like', 'account', $operatorUserKeyword]
  155. ]
  156. ],
  157. 'select' => 'id'
  158. ], $adminFind);
  159. $adminIdsBy = $adminFind->column();
  160. $where[] = ['operator_user_id' => $adminIdsBy];
  161. } elseif ($operatorUserType == OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER) {
  162. $userIdsByMobile = User::find()
  163. ->where(['like', 'mobile', $operatorUserKeyword])
  164. ->andWhere(['mall_id' => $this->mall_id])
  165. ->select('id')
  166. ->column();
  167. $where[] = ['operator_user_id' => array_merge([$operatorUserKeyword], $userIdsByMobile)];
  168. }
  169. }
  170. if ($behavior) {
  171. $where[] = ['=', 'behavior', $behavior];
  172. }
  173. if ($orderId) {
  174. $where[] = ['=', 'order_id', $orderId];
  175. }
  176. if ($orderNo) {
  177. $orderIds = Order::find()
  178. ->where(['mall_id' => $this->mall_id])
  179. ->andWhere(['like', 'order_no', $orderNo])
  180. ->select('id')
  181. ->column();
  182. $where[] = ['in', 'order_id', $orderIds];
  183. }
  184. if ($createdAt) {
  185. $strToTime = array_map(function ($value) {
  186. return strtotime($value);
  187. }, $createdAt);
  188. if (!empty($strToTime)) {
  189. $where[] = ['between', 'created_at', $strToTime[0], $strToTime[1]];
  190. }
  191. }
  192. $with = [
  193. 'order' => function ($query) {
  194. $query->select('id, order_no');
  195. }
  196. ];
  197. $order = 'id desc';
  198. $list = OrderBehaviorLogs::listPage(compact('where', 'with', 'order'));
  199. $operatorUserIds = [];
  200. array_walk($list['list'], function ($item) use (&$operatorUserIds) {
  201. $operatorUserIds[$item['operator_user_type']][] = $item['operator_user_id'];
  202. });
  203. $userArr = $this->getOperatorOrderUserList($operatorUserIds);
  204. array_walk($list['list'], function (&$item) use ($userArr) {
  205. $item['extra_info'] = json_decode($item['extra_info'], true);
  206. $item['operator_user_type_text'] = OrderBehaviorLogsEnum::getMap(1)[$item['operator_user_type']] ?? '-';
  207. $item['created_at_text'] = date('Y-m-d H:i:s', $item['created_at']);
  208. $item['ip_text'] = $item['ip'] ? long2ip($item['ip']) : '-';
  209. $item['operator_user'] = $userArr[$item['operator_user_type']][$item['operator_user_id']] ?? [];
  210. $item['behavior_text'] = $this->getBehaviorText($item);
  211. $item['desc'] = $this->getDescText($item);
  212. });
  213. return $list;
  214. }
  215. /**
  216. * 获取行为text
  217. *
  218. * @param array $item
  219. *
  220. * @return string
  221. */
  222. protected function getBehaviorText(array $item): string
  223. {
  224. if (!isset(OrderBehaviorLogsEnum::getMap()[$item['behavior']])) {
  225. return '';
  226. }
  227. $str = OrderBehaviorLogsEnum::getMap()[$item['behavior']];
  228. if (!empty($item['extra_info']['is_manual'])) {
  229. $str .= '(手动)';
  230. } elseif (!empty($item['extra_info']['is_expired'])) {
  231. $str .= '(超过售后期限,撤销售后订单)';
  232. } elseif (!empty($item['extra_info']['is_batch'])) {
  233. $str .= '(批量)';
  234. }
  235. return $str;
  236. }
  237. /**
  238. * 获取desc
  239. *
  240. * @param array $item
  241. *
  242. * @return string
  243. */
  244. protected function getDescText(array $item): string
  245. {
  246. $str = $item['behavior_text'] . ($item['desc'] ? '-' . $item['desc'] : '');
  247. if (!empty($item['extra_info']['step_status'])) {
  248. $str .= sprintf('-(%s)', RefundStatusEnum::getStepStatusText($item['extra_info']['step_status'])['desc']);
  249. }
  250. return $str;
  251. }
  252. /**
  253. * @param array $operatorUserIds
  254. *
  255. * @return array
  256. */
  257. protected function getOperatorOrderUserList(array $operatorUserIds): array
  258. {
  259. $userArr = [];
  260. // 查询用户
  261. if (!empty($operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER])) {
  262. $userList = User::getUserList(
  263. [
  264. ['in', 'id', $operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER]]
  265. ],
  266. 'id, mobile, nickname, avatar_url',
  267. [],
  268. true
  269. );
  270. $userArr[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER] = array_column($userList, null, 'id');
  271. }
  272. // 查询后台管理员
  273. if (!empty($operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN])) {
  274. $adminList = Admin::lists([
  275. 'where' => [
  276. [
  277. 'id' => $operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN],
  278. 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]
  279. ]
  280. ],
  281. 'select' => "id, account mobile, username nickname"
  282. ]);
  283. $userArr[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN] = array_column($adminList, null, 'id');
  284. }
  285. // 查询门店管理员
  286. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_STORE) && !empty($operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_STORE])) {
  287. $storeList = StoreAdmin::lists([
  288. 'where' => [
  289. [
  290. 'id' => $operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_STORE],
  291. 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]
  292. ]
  293. ],
  294. 'select' => "id, account mobile, username nickname"
  295. ]);
  296. $userArr[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_STORE] = array_column($storeList, null, 'id');
  297. }
  298. // 查询多商户管理员
  299. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_MCH) && !empty($operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_MCH])) {
  300. $mchList = MchAdmin::lists([
  301. 'where' => [
  302. [
  303. 'id' => $operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_MCH],
  304. 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]
  305. ]
  306. ],
  307. 'select' => "id, account mobile, username nickname"
  308. ]);
  309. $userArr[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_MCH] = array_column($mchList, null, 'id');
  310. }
  311. // 查询aiyunuo管理员
  312. if (MallAddons::isInstall($this->mall_id, 'Aiyunuo') && !empty($operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_AIYUNUO])) {
  313. $aiyunuoList = Admin::lists([
  314. 'where' => [
  315. [
  316. 'id' => $operatorUserIds[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_AIYUNUO],
  317. 'status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]
  318. ]
  319. ],
  320. 'select' => "id, account mobile, username nickname"
  321. ]);
  322. $userArr[OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_AIYUNUO] = array_column($aiyunuoList, null, 'id');
  323. }
  324. return $userArr;
  325. }
  326. }