xhWxMenuService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <?php
  2. namespace common\services;
  3. use Yii;
  4. use common\components\weixinUtil;
  5. use common\components\util;
  6. use common\components\configDict;
  7. use common\models\xhWxMenu;
  8. class xhWxMenuService
  9. {
  10. /**
  11. * 初始化菜单
  12. */
  13. public static function applyInit($merchant)
  14. {
  15. $merchantId = $merchant['id'];
  16. self::delMenuList($merchantId);//删除之前存在的菜单
  17. $menuOption = configDict::getConfig('wxMenuOption');
  18. $button = [
  19. ["type" => 'view', "name" => "这里买花", "keyName" => "mall", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['frontUrl'] . "/mobile/index?account=" . $merchant['id']],
  20. ["type" => "view", "name" => "会员服务", "keyName" => "memberCenter", "menuOption" => $menuOption['redirectToCommonUseUrl'], "sub_button" => [
  21. ["type" => "view", "name" => "注册会员", "keyName" => "myMemberCard", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['frontUrl'] . "/center/info?account=" . $merchantId],
  22. ["type" => "view", "name" => "我的会员卡", "keyName" => "myMemberCard", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['frontUrl'] . "/center/qr-code?account=" . $merchantId],
  23. ["type" => "view", "name" => "快速下单", "keyName" => "quickOrder", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['frontUrl'] . "/payment/quick-order?account=" . $merchantId],
  24. ],],
  25. ["type" => 'view', "name" => "我的订单", "keyName" => "myOrder", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['frontUrl'] . "/center/order?account=" . $merchantId],
  26. ];
  27. $merchantName = $merchant['merchantName'];
  28. if (in_array($merchantName, ['花美灵', '中花汇', '花卉宝', '花汇宝'])) {
  29. $button = [
  30. ["type" => 'view', "name" => "登陆后台", "keyName" => "mall", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['adminUrl']],
  31. ["type" => "view", "name" => "申请接入", "menuOption" => $menuOption['redirectToCustomUrl'], "url" => Yii::$app->params['openUrl'] . "/join/apply"],
  32. ["type" => "view", "name" => "申请公众号", "menuOption" => $menuOption['redirectToCustomUrl'], "url" => Yii::$app->params['openUrl'] . "/main/apply"],
  33. ];
  34. }
  35. $account = $merchant['id'];
  36. $trainDemo = configDict::getConfig('trainDemo');
  37. $demoPlatformAccount = $trainDemo['platform']['account'];
  38. if ($account == $demoPlatformAccount) {
  39. $button = [
  40. ["type" => 'view', "name" => "登陆后台", "keyName" => "mall", "menuOption" => $menuOption['redirectToCommonUseUrl'], "url" => Yii::$app->params['adminUrl']],
  41. ["type" => "view", "name" => "申请接入", "menuOption" => $menuOption['redirectToCustomUrl'], "url" => Yii::$app->params['openUrl'] . "/join/apply"],
  42. ["type" => "view", "name" => "更多", "keyName" => "memberCenter", "menuOption" => $menuOption['redirectToCommonUseUrl'], "sub_button" => [
  43. ["type" => "view", "name" => "申请公众号", "menuOption" => $menuOption['redirectToCustomUrl'], "url" => Yii::$app->params['openUrl'] . "/main/apply"],
  44. ["type" => "view", "name" => "清空数据", "menuOption" => $menuOption['redirectToCustomUrl'], "url" => Yii::$app->params['adminUrl'] . "/init/clear"],
  45. ],],
  46. ];
  47. }
  48. $weixinUtil = new weixinUtil($merchant);
  49. $menuList = $button;
  50. foreach ($button as $key => $val) {
  51. unset($button[$key]['keyName']);
  52. }
  53. $menu['button'] = $button;
  54. $info = $weixinUtil->userMenuToWeiXin($menu);
  55. $info = json_decode($info, true);
  56. xhMerchantExtendService::updateByMerchantId($merchantId, ['wxMenuInit' => 1]);
  57. $now = time();
  58. $date = date("Y-m-d H:i:s", $now);
  59. $mapped = configDict::getConfig('commonUseUrlMapped');
  60. $redirectUrl = configDict::getConfig('replyType', 'redirectUrl');//回复类型 跳转链接
  61. if ($info['errcode'] == 0) {
  62. foreach ($menuList as $key => $val) {
  63. $addData = [];
  64. $addData['parentId'] = 0;
  65. $addData['merchantId'] = $merchantId;
  66. $addData['menuOrder'] = $key;
  67. $addData['menuOption'] = $val['menuOption'];
  68. $addData['hasSonMenu'] = isset($val['sub_button']) && !empty($val['sub_button']) ? 1 : 0;
  69. $addData['name'] = $val['name'];
  70. $addData['menuKey'] = $merchantId . '_' . $key;
  71. $addData['createTime'] = $date;
  72. $addData['replyType'] = $redirectUrl;//回复类型:常用链接、自定义网址、文字、报名类活动
  73. $addData['targetId'] = isset($val['keyName']) ? $mapped[$val['keyName']] : 0;//常用链接的链接选项id;活动id等
  74. $addData['replyUrl'] = isset($val['url']) ? $val['url'] : '';
  75. $parentMenu = self::add($addData);
  76. if (isset($val['sub_button']) && !empty($val['sub_button'])) {
  77. foreach ($val['sub_button'] as $sonKey => $sonVal) {
  78. $sonAddData = [];
  79. $sonAddData['parentId'] = $parentMenu['id'];
  80. $sonAddData['merchantId'] = $merchantId;
  81. $sonAddData['menuOrder'] = $sonKey;
  82. $sonAddData['menuOption'] = $sonVal['menuOption'];//回复类型
  83. $sonAddData['hasSonMenu'] = 0;
  84. $sonAddData['name'] = $sonVal['name'];
  85. $sonAddData['menuKey'] = $merchantId . '_' . $key . '_' . $sonKey;
  86. $sonAddData['createTime'] = $date;
  87. $sonAddData['replyType'] = $redirectUrl;//回复类型:常用链接、自定义网址、文字、报名类活动
  88. $sonAddData['targetId'] = isset($sonVal['keyName']) ? $mapped[$sonVal['keyName']] : 0;//常用链接的链接选项id;活动id等
  89. $sonAddData['replyUrl'] = isset($sonVal['url']) ? $sonVal['url'] : '';
  90. self::add($sonAddData);
  91. }
  92. }
  93. }
  94. return true;
  95. }
  96. return false;
  97. }
  98. public static function getByMenuKey($menuKey)
  99. {
  100. $cacheKey = configDict::getCacheKey('xhWxMenuKey') . $menuKey;
  101. $menu = Yii::$app->redis->executeCommand('HGETALL', [$cacheKey]);
  102. if (!empty($menu)) {
  103. $arr = [];
  104. $i = 0;
  105. $x = 0;
  106. foreach ($menu as $key => $val) {
  107. $i++;
  108. if ($i % 2 == 0) {
  109. $arr[$x]['value'] = $val;
  110. $x++;
  111. } else {
  112. $arr[$x]['key'] = $val;
  113. }
  114. }
  115. $menuArr = [];
  116. foreach ($arr as $key => $val) {
  117. $menuArr[$val['key']] = $val['value'];
  118. }
  119. unset($menuArr['info_already_get_by_sql']);
  120. return $menuArr;
  121. }
  122. $menu = xhWxMenu::find()->where(['menuKey' => $menuKey])->asArray()->one();
  123. $params = [$cacheKey];
  124. $params[] = 'info_already_get_by_sql';
  125. $params[] = 'ok';//redis没有办法设置带空值的键,加此可以数据空时表示取过
  126. if (!empty($menu)) {
  127. foreach ($menu as $key => $val) {
  128. $params[] = $key;
  129. $params[] = $val;
  130. }
  131. }
  132. Yii::$app->redis->executeCommand('HMSET', $params);
  133. return $menu;
  134. }
  135. public static function getMenuList($merchantId)
  136. {
  137. $cacheKey = configDict::getCacheKey('xhWxMenuList') . $merchantId;
  138. $menuString = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
  139. if (empty($menuString)) {
  140. $list = self::getAllMenu($merchantId);
  141. $menuString = json_encode($list);
  142. Yii::$app->redis->executeCommand('SET', [$cacheKey, $menuString]);
  143. } else {
  144. $list = json_decode($menuString, true);
  145. }
  146. return $list;
  147. }
  148. /**
  149. * 取出商家所有菜单
  150. */
  151. public static function getAllMenu($merchantId, $getKeyName = false)
  152. {
  153. $list = self::getMenuById(0, $merchantId, $getKeyName);
  154. return $list;
  155. }
  156. /**
  157. * 根据菜单id取子菜单
  158. * @return $getKeyName false 默认不带键名 true 返回带键名的
  159. */
  160. public static function getMenuById($parentId, $merchantId, $getKeyName = false)
  161. {
  162. $condition = ['parentId' => $parentId, 'merchantId' => $merchantId];
  163. $wxMenu = xhWxMenu::getAllByCondition($condition, 'menuOrder asc');
  164. $data = [];
  165. if (empty($wxMenu)) {
  166. return $data;
  167. }
  168. foreach ($wxMenu as $k => $v) {
  169. $id = $v['id'];
  170. $cate = [
  171. 'id' => $id,
  172. 'name' => $v['name'],
  173. 'menuKey' => $v['menuKey'],
  174. 'menuOption' => $v['menuOption'],
  175. 'parentId' => $v['parentId'],
  176. 'merchantId' => $v['merchantId'],
  177. 'replyType' => $v['replyType'],
  178. 'replyUrl' => $v['replyUrl'],
  179. 'replyText' => $v['replyText'],
  180. 'targetId' => $v['targetId'],
  181. 'replyNews' => $v['replyNews'],
  182. 'replyMultiNews' => $v['replyMultiNews'],
  183. 'hasSonMenu' => $v['hasSonMenu'],
  184. 'menuOrder' => $v['menuOrder'],
  185. 'createTime' => $v['createTime'],
  186. 'updateTime' => $v['updateTime'],
  187. 'child' => self::getMenuById($id, $merchantId, $getKeyName),
  188. ];
  189. if ($getKeyName) {
  190. $data[$id] = $cate;
  191. } else {
  192. $data[] = $cate;
  193. }
  194. }
  195. return $data;
  196. }
  197. public static function delMenuList($merchantId)
  198. {
  199. $menu = xhWxMenu::getAllByCondition(['merchantId' => $merchantId]);
  200. if (!empty($menu)) {
  201. foreach ($menu as $val) {
  202. $id = $val['id'];
  203. $menuKey = $val['menuKey'];
  204. xhWxMenu::deleteById($id);
  205. $cacheKey = configDict::getCacheKey('xhWxMenuKey') . $menuKey;
  206. Yii::$app->redis->executeCommand('DEL', [$cacheKey]);
  207. }
  208. }
  209. $cacheKey = configDict::getCacheKey('xhWxMenuList') . $merchantId;
  210. Yii::$app->redis->executeCommand('DEL', [$cacheKey]);
  211. }
  212. public static function add($data)
  213. {
  214. return xhWxMenu::add($data);
  215. }
  216. public static function getFormatData($wxMenuContent, $wxMenuOption, $merchant)
  217. {
  218. $addData = [];
  219. $wxMenuOptionList = configDict::getConfig('wxMenuOption');
  220. $commonUseUrl = configDict::getConfig('commonUseUrl');
  221. switch ($wxMenuOption) {
  222. case $wxMenuOptionList['redirectToCommonUseUrl']://链接到 常用链接
  223. foreach ($commonUseUrl as $comKey => $comVal) {
  224. if ($comKey == $wxMenuContent) {
  225. $addData['replyUrl'] = Yii::$app->params['frontUrl'] . $comVal['url'] . '?account=' . $merchant['id'];
  226. $addData['targetId'] = $wxMenuContent;
  227. }
  228. }
  229. break;
  230. case $wxMenuOptionList['redirectToCustomUrl']://链接到-自定义网址
  231. $addData['replyUrl'] = urldecode($wxMenuContent);
  232. break;
  233. case $wxMenuOptionList['showText']://链接到-文字
  234. $addData['replyText'] = $wxMenuContent;
  235. break;
  236. case $wxMenuOptionList['redirectToActive']://链接到-报名类活动
  237. $addData['targetId'] = $wxMenuContent;
  238. $addData['replyUrl'] = Yii::$app->params['frontUrl'] . '/pay/active?id=' . $wxMenuContent . '&account=' . $merchant['id'];
  239. break;
  240. default:
  241. }
  242. return $addData;
  243. }
  244. }