UserMemberLabel.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. namespace common\models\user;
  3. use common\components\export\CsvTool;
  4. use common\enums\DownloadEnum;
  5. use common\enums\MemberLabelEnum;
  6. use common\enums\StatusEnum;
  7. use common\models\base\BaseActiveRecord;
  8. use common\models\common\Download;
  9. use yii\db\Exception;
  10. /**
  11. * This is the model class for table "qimall_user_member_label".
  12. *
  13. * @property int $id
  14. * @property int $mall_id 商城ID
  15. * @property int $user_id 会员ID
  16. * @property int $cate_id1 价值标签id
  17. * @property int $cate_id2 会员等级标签id
  18. * @property int $cate_id3 渠道等级标签id
  19. * @property int $cate_id4 复购标签id
  20. * @property int $cate_id5 推广标签id
  21. * @property int $cate_id6 领导标签id
  22. * @property int $cate_id7 活跃标签id
  23. * @property int $cate_id8 收入标签id
  24. * @property int $cate_id9 分享标签id
  25. * @property int $cate_id10 退款标签id
  26. * @property int $cate_id11 会员年龄标签id
  27. * @property int|null $status 状态[-1:删除;0:禁用;1启用]
  28. * @property int $register_time
  29. * @property int $created_at
  30. * @property int $updated_at
  31. */
  32. class UserMemberLabel extends BaseActiveRecord
  33. {
  34. /**
  35. * {@inheritdoc}
  36. */
  37. public static function tableName()
  38. {
  39. return '{{%user_member_label}}';
  40. }
  41. /**
  42. * {@inheritdoc}
  43. */
  44. public function rules()
  45. {
  46. return [
  47. [['mall_id', 'user_id', 'cate_id1', 'cate_id2', 'cate_id3', 'cate_id4', 'cate_id5', 'cate_id6', 'cate_id7', 'cate_id8', 'cate_id9', 'cate_id10', 'cate_id11', 'status', 'register_time', 'created_at', 'updated_at'], 'integer'],
  48. ];
  49. }
  50. /**
  51. * {@inheritdoc}
  52. */
  53. public function attributeLabels()
  54. {
  55. return [
  56. 'id' => 'ID',
  57. 'mall_id' => '商城ID',
  58. 'user_id' => '会员ID',
  59. 'cate_id1' => '价值标签id',
  60. 'cate_id2' => '会员等级标签id',
  61. 'cate_id3' => '渠道等级标签id',
  62. 'cate_id4' => '复购标签id',
  63. 'cate_id5' => '推广标签id',
  64. 'cate_id6' => '领导标签id',
  65. 'cate_id7' => '活跃标签id',
  66. 'cate_id8' => '收入标签id',
  67. 'cate_id9' => '分享标签id',
  68. 'cate_id10' => '退款标签id',
  69. 'cate_id11' => '会员年龄标签id',
  70. 'status' => '状态[-1:删除;0:禁用;1启用]',
  71. 'register_time' => 'Register Time',
  72. 'created_at' => 'Created At',
  73. 'updated_at' => 'Updated At',
  74. ];
  75. }
  76. public static function setData(array $params)
  77. {
  78. try {
  79. //过滤重复标签
  80. $model = self::findOne(['user_id' => $params['user_id'], 'mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]);
  81. if (empty($model)) {
  82. $model = new self();
  83. $model->loadDefaultValues();
  84. }
  85. if (!$model->load($params, '') || !$model->save()) {
  86. throw new \Exception($model->getErrorMessage());
  87. }
  88. var_dump($model->user_id);
  89. return $model;
  90. } catch (\Exception $e) {
  91. self::setStaticError($e->getMessage());
  92. return false;
  93. }
  94. }
  95. public static function fieldsList()
  96. {
  97. return [
  98. 'user_id' => '会员id',
  99. 'nickname' => '昵称',
  100. 'mobile' => '手机号',
  101. 'label' => '标签',
  102. 'register_time' => '注册时间',
  103. ];
  104. }
  105. public static function exportHandle(array $data)
  106. {
  107. date_default_timezone_set('PRC');
  108. $download_id = $data['download_id'] ?? 0;
  109. $download = Download::findOne(['id' => $download_id]);
  110. if ($download) {
  111. try {
  112. $params = json_decode($download->params, true);
  113. $filename = $download->name;
  114. $type = $download->type;
  115. $mall_id = $params['mall_id'];
  116. $showType = $params['showType'];
  117. $fields_arr = self::fieldsList();
  118. $have_select_field_arr = [];
  119. foreach ($fields_arr as $value) {
  120. $have_select_field_arr[] = $value;
  121. }
  122. $csv = new CsvTool();
  123. $csv->filename = $filename;
  124. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  125. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  126. $csv->header = $have_select_field_arr;
  127. $query = UserMemberLabel::find()->where(['mall_id' => $mall_id])->andWhere(['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]);
  128. if (!empty($params['start'])) {
  129. $temp = ['>=', 'register_time', strtotime($params['start'])];
  130. $query->andWhere($temp);
  131. }
  132. if (!empty($params['end'])) {
  133. $temp = ['<=', 'register_time', strtotime($params['end'])];
  134. $query->andWhere($temp);
  135. }
  136. if (!empty($params['nickname'])) {
  137. $userList = User::lists([
  138. 'where' => [
  139. ['mall_id' => $mall_id],
  140. ['like', 'nickname', $params['nickname']],
  141. ['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]
  142. ],
  143. 'select' => 'id',
  144. ]);
  145. $userIds = array_column($userList, 'id');
  146. $temp = ['user_id' => $userIds];
  147. $query->andWhere($temp);
  148. }
  149. if (!empty($params['user_id'])) {
  150. $temp = ['=', 'user_id', $params['user_id']];
  151. $query->andWhere($temp);
  152. }
  153. if (!empty($params['memberLabelIds']) && !empty($params['cate_id'])) {
  154. $cate_id = str_replace('key', '', $params['cate_id']);
  155. $temp = ['cate_id' . $cate_id => $params['memberLabelIds']];
  156. $query->andWhere($temp);
  157. }
  158. if (!empty($params['memberLabelIds'])) {
  159. $cateIdArr = [];
  160. foreach ($params['memberLabelIds'] as $val) {
  161. $temp_arr = explode('_', $val);
  162. $cateIdArr[$temp_arr[0]][] = $temp_arr[1];
  163. }
  164. foreach ($cateIdArr as $cate_id => $memberLabelIds) {
  165. $temp = ['cate_id' . $cate_id => $memberLabelIds];
  166. $query->andWhere($temp);
  167. }
  168. }
  169. $i = 1;
  170. $page_size = 20000;
  171. $data_list = [];
  172. $cate_map = MemberLabelEnum::getMap();
  173. $mapContent = MemberLabelEnum::getMapContent();
  174. $mapIds = array_keys($cate_map);
  175. $member_label_list = MemberLabel::lists(['where' => [['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]], 'index' => 'id']);
  176. $users = $query
  177. ->offset(($i - 1) * $page_size)->groupBy('user_id')->limit($page_size)->asArray()->all();
  178. empty($csv->header) && $csv->header = array_keys($users[0]);
  179. $userIds = array_column($users, 'user_id');
  180. $userArr = User::lists(['where' => [['id' => $userIds]], 'index' => 'id', 'select' => 'id,nickname,mobile']);
  181. foreach ($users as $user) {
  182. $row = [];
  183. $nickname = '';
  184. $mobile = '';
  185. if (isset($userArr[$user['user_id']])) {
  186. $nickname = $userArr[$user['user_id']]['nickname'];
  187. $mobile = $userArr[$user['user_id']]['mobile'];
  188. }
  189. $userMemberLabelList = [];
  190. $label_str = '';
  191. foreach ($mapIds as $cate_id) {
  192. $temp_cate_id = $user['cate_id' . $cate_id];
  193. if (isset($member_label_list[$temp_cate_id])) {
  194. if ($showType == 1) {
  195. $label_str .= $member_label_list[$temp_cate_id]['name'] . ',';
  196. } else {
  197. $content = $mapContent[$cate_id];
  198. if (!is_array($member_label_list[$temp_cate_id]['condition'])) {
  199. $member_label_list[$temp_cate_id]['condition'] = json_decode($member_label_list[$temp_cate_id]['condition'], true);
  200. }
  201. if (empty($member_label_list[$temp_cate_id]['condition']['num'])) $member_label_list[$temp_cate_id]['condition']['num'] = '';
  202. $content = str_replace('{data}', $member_label_list[$temp_cate_id]['condition']['num'], $content);
  203. $label_str .= $content . ',';
  204. }
  205. }
  206. }
  207. $label_str = trim($label_str, ',');
  208. $item['userMemberLabelList'] = $userMemberLabelList;
  209. foreach ($fields_arr as $field => $name) {
  210. switch ($field) {
  211. case 'nickname':
  212. $row[] = $nickname;
  213. break;
  214. case 'mobile':
  215. $row[] = $mobile;
  216. break;
  217. case 'label':
  218. $row[] = $label_str;
  219. break;
  220. case 'register_time':
  221. $row[] = !empty($user['register_time']) ? date('Y-m-d H:i:s', $user['register_time']) : '';
  222. break;
  223. default:
  224. if ((isset($user[$field]))) $row[] = $user[$field] ?? '';
  225. }
  226. }
  227. $data_list[] = $row;
  228. }
  229. $csv->data = $data_list;
  230. $csv->export();
  231. $url = $csv->upload($params['mall_id'], $csv->relative_filename);
  232. $download->status = 2;
  233. $download->url = $url;
  234. $download->num = $csv->line_num;
  235. $download->size = $csv->file_size;
  236. $res = $download->save();
  237. return true;
  238. } catch (Exception $e) {
  239. $download->status = 3;
  240. dd($e->getMessage());
  241. self::setStaticError($e->getMessage());
  242. return false;
  243. }
  244. }
  245. }
  246. }