index.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <?php
  2. use yii\grid\GridView;
  3. use common\helpers\Url;
  4. use common\helpers\Auth;
  5. use common\helpers\Html;
  6. use common\helpers\ImageHelper;
  7. use addons\Wechat\common\enums\FansSubscribeSceneEnum;
  8. use addons\Wechat\common\enums\FansFollowEnum;
  9. $this->title = '粉丝管理';
  10. $this->params['breadcrumbs'][] = ['label' => $this->title];
  11. ?>
  12. <div class="row">
  13. <div class="col-2">
  14. <div class="box box-solid rfAddonMenu">
  15. <div class="box-header with-border pt-4 pl-3">
  16. <h3 class="rf-box-title">粉丝标签</h3>
  17. </div>
  18. <div class="box-body no-padding" style="padding-top: 0">
  19. <ul class="nav nav-pills nav-stacked">
  20. <li class="nav-item">
  21. <a href="<?= Url::to(['index']) ?>" class="nav-link"> 全部粉丝(<strong class="text-danger"><?= $fansCount ?></strong>)</a>
  22. <?php foreach ($fansTags as $k => $tag) { ?>
  23. <a href="<?= Url::to(['index', 'SearchModel[tags.tag_id]' => $tag['id']]) ?>" class="nav-link"> <?= $tag['name'] ?>(<strong class="text-danger"><?= $tag['count'] ?></strong>)</a>
  24. <?php } ?>
  25. </li>
  26. </ul>
  27. <div class="hr-line-dashed"></div>
  28. </div>
  29. </div>
  30. </div>
  31. <div class="col-10">
  32. <div class="box">
  33. <div class="box-header">
  34. <h3 class="box-title"><?= $this->title; ?></h3>
  35. <div class="box-tools">
  36. <!-- 权限校验判断 -->
  37. <?php if (Auth::verify('/wechat/fans/sync')) { ?>
  38. <span class="btn btn-white btn-sm" id="sync"><i class="fa fa-cloud-download"></i> 同步选中粉丝信息</span>
  39. <?php } ?>
  40. <span class="btn btn-white btn-sm" onclick="getAllFansInfo()"><i class="fa fa-cloud-download"></i> 同步没信息粉丝信息</span>
  41. <!-- 权限校验判断 -->
  42. <?php if (Auth::verify('/wechat/fans/get-all-fans')) { ?>
  43. <span class="btn btn-white btn-sm" onclick="getAllFans()"><i class="fa fa-cloud-download"></i> 同步全部粉丝信息</span>
  44. <?php } ?>
  45. </div>
  46. </div>
  47. <div class="box-body table-responsive">
  48. <?= GridView::widget([
  49. 'dataProvider' => $dataProvider,
  50. 'filterModel' => $searchModel,
  51. //重新定义分页样式
  52. 'tableOptions' => [
  53. 'class' => 'table table-hover rf-table',
  54. 'fixedNumber' => 1,
  55. 'fixedRightNumber' => 1,
  56. ],
  57. 'options' => [
  58. 'id' => 'grid',
  59. ],
  60. 'columns' => [
  61. [
  62. 'class' => 'yii\grid\CheckboxColumn',
  63. 'checkboxOptions' => function ($model, $key, $index, $column) {
  64. return ['value' => $model->openid];
  65. },
  66. ],
  67. [
  68. 'class' => 'yii\grid\SerialColumn',
  69. ],
  70. [
  71. 'attribute' => 'head_portrait',
  72. 'value' => function ($model) {
  73. return Html::img(ImageHelper::defaultHeaderPortrait(Html::encode($model->auth->head_portrait ?? '')),
  74. [
  75. 'class' => 'img-circle rf-img-md elevation-1',
  76. ]);
  77. },
  78. 'filter' => false,
  79. 'format' => 'raw',
  80. ],
  81. [
  82. 'attribute' => 'nickname',
  83. 'value' => function ($model) {
  84. return empty($model->auth) ? '未授权' : $model->auth->nickname;
  85. },
  86. ],
  87. [
  88. 'attribute' => 'follow',
  89. 'label' => '关注状态',
  90. 'filter' => Html::activeDropDownList($searchModel, 'follow',
  91. FansFollowEnum::getMap(), [
  92. 'prompt' => '全部',
  93. 'class' => 'form-control'
  94. ]
  95. ),
  96. 'value' => function ($model) {
  97. return FansFollowEnum::getValue($model->follow);
  98. },
  99. 'format' => 'raw',
  100. 'headerOptions' => ['class' => 'col-md-1'],
  101. ],
  102. [
  103. 'attribute' => 'subscribe_scene',
  104. 'label' => '关注来源',
  105. 'filter' => Html::activeDropDownList($searchModel, 'subscribe_scene',
  106. FansSubscribeSceneEnum::getMap(), [
  107. 'prompt' => '全部',
  108. 'class' => 'form-control'
  109. ]
  110. ),
  111. 'value' => function ($model) {
  112. return FansSubscribeSceneEnum::getValue($model->subscribe_scene);
  113. },
  114. 'format' => 'raw',
  115. 'headerOptions' => ['class' => 'col-md-1'],
  116. ],
  117. [
  118. 'label' => '关注/取消时间',
  119. 'value' => function ($model) {
  120. if ($model->follow == FansFollowEnum::ON) {
  121. return Yii::$app->formatter->asDatetime($model->follow_time);
  122. }
  123. return Yii::$app->formatter->asDatetime($model->unfollow_time);
  124. },
  125. 'format' => 'raw'
  126. ],
  127. [
  128. 'label' => '标签',
  129. 'headerOptions' => ['class' => 'col-md-1'],
  130. 'value' => function ($model) use ($allTag) {
  131. $str = [];
  132. foreach ($model->tags as $tag) {
  133. $str[] = '<span class="label label-success">' . $allTag[$tag['tag_id']] . '</span>';
  134. }
  135. if (empty($str)) {
  136. $str[] = '<span class="label label-default">无标签</span>';
  137. }
  138. if (Auth::verify('/wechat/fans/move-tag')) {
  139. $str[] = '<a href=' . Url::to(['move-tag', 'fan_id' => $model->id]) . ' data-toggle="modal" data-target="#ajaxModal" style="color: #76838f">
  140. <i class="icon ion-arrow-down-b "></i>
  141. </a>';
  142. }
  143. return implode('', $str);
  144. },
  145. 'format' => 'raw'
  146. ],
  147. 'openid',
  148. 'remark',
  149. [
  150. 'header' => "操作",
  151. 'class' => 'yii\grid\ActionColumn',
  152. 'template' => '{remark} {send-message}',
  153. 'headerOptions' => ['class' => 'col-md-2'],
  154. 'buttons' => [
  155. 'remark' => function ($url, $model, $key) {
  156. return Html::linkButton(['ajax-edit', 'id' => $model->id], '备注', [
  157. 'data-toggle' => 'modal',
  158. 'data-target' => '#ajaxModal',
  159. ]);
  160. },
  161. 'send-message' => function ($url, $model, $key) {
  162. return Html::linkButton(['send-message', 'openid' => $model->openid],
  163. '发送消息', [
  164. 'data-toggle' => 'modal',
  165. 'data-target' => '#ajaxModalLg',
  166. ]);
  167. },
  168. ],
  169. ],
  170. ],
  171. ]); ?>
  172. </div>
  173. </div>
  174. </div>
  175. </div>
  176. <script>
  177. var num = 1;
  178. // 同步所有粉丝openid
  179. function getAllFans() {
  180. rfAffirm('同步中,请不要关闭当前页面');
  181. num = 1;
  182. syncOpenid();
  183. }
  184. function syncOpenid(next_openid = '') {
  185. $.ajax({
  186. type: "get",
  187. url: "<?= Url::to(['sync-all-openid'])?>",
  188. dataType: "json",
  189. data: {next_openid: next_openid},
  190. success: function (data) {
  191. if (parseInt(data.code) === 200) {
  192. if (data.data.next_openid) {
  193. syncOpenid(data.data.next_openid);
  194. } else {
  195. sync('all');
  196. }
  197. } else {
  198. rfAffirm(data.message);
  199. window.location.reload();
  200. }
  201. }
  202. });
  203. }
  204. // 同步粉丝资料
  205. function sync(type, page = 0, openids = null) {
  206. $.ajax({
  207. type: "post",
  208. url: "<?= Url::to(['sync'])?>",
  209. dataType: "json",
  210. data: {type: type, page: page, openids: openids},
  211. success: function (data) {
  212. if (parseInt(data.code) === 200 && data.data.page) {
  213. sync(type, data.data.page);
  214. $('#syncPage').html('同步第 ' + num + ' 次');
  215. num++;
  216. } else {
  217. rfAffirm(data.message);
  218. window.location.reload();
  219. }
  220. }
  221. });
  222. }
  223. function getAllFansInfo() {
  224. num = 1;
  225. rfAffirm('同步中,请不要关闭当前页面');
  226. syncInfo()
  227. }
  228. function syncInfo() {
  229. $.ajax({
  230. type: "post",
  231. url: "<?= Url::to(['sync-info'])?>",
  232. dataType: "json",
  233. success: function (data) {
  234. if (parseInt(data.code) === 200) {
  235. syncInfo();
  236. $('#syncPage').html('同步第 ' + num + ' 次');
  237. num++;
  238. } else {
  239. rfAffirm(data.message);
  240. window.location.reload();
  241. }
  242. }
  243. });
  244. }
  245. // 同步选中的粉丝
  246. $("#sync").click(function () {
  247. var openids = [];
  248. $("#grid :checkbox").each(function () {
  249. if (this.checked) {
  250. var openid = $(this).val();
  251. if (openid !== "1") {
  252. openids.push(openid);
  253. }
  254. }
  255. });
  256. sync('check', 0, openids);
  257. });
  258. </script>
粤ICP备19079148号