User.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. <?php
  2. namespace common\models;
  3. use common\helpers\Cache;
  4. use common\helpers\Tool;
  5. use common\helpers\user\Info;
  6. use Yii;
  7. use yii\data\Pagination;
  8. use yii\helpers\Json;
  9. use common\libs\logging\operate\valueType\Config as ValueTypeConfig;
  10. /**
  11. * This is the model class for table "{{%USER}}".
  12. *
  13. * @property string $ID
  14. * @property string $USER_NAME 帐号
  15. * @property string $PASSWORD_HASH 登录密码
  16. * @property string $PAY_PASSWORD 支付密码
  17. * @property int $NATION 民族
  18. * @property string $REAL_NAME 姓名
  19. * @property string $ID_CARD 身份证号
  20. * @property int $ID_TYPE 证件类型
  21. * @property string $MOBILE 手机号
  22. * @property string $ADDRESS 身份证地址
  23. * @property string $ID_IMAGE 证件图片
  24. * @property string $OPEN_BANK 开户行
  25. * @property string $BANK_ADDRESS 银行地址
  26. * @property string $BANK_NO 银行卡号
  27. * @property int $BANK_PROVINCE 银行省份
  28. * @property int $BANK_CITY 银行城市
  29. * @property int $BANK_COUNTY 银行县区
  30. * @property string $SPOUSE_NAME 配偶姓名
  31. * @property string $SPOUSE_IDCARD 配偶证件号
  32. * @property int $CREATED_AT 创建时间
  33. * @property int $UPDATED_AT 更新时间
  34. * @property int $STATUS 状态
  35. * @property int $DEC_CLOSED 是否关闭报单功能
  36. * @property int $DEC_CLOSED_AT 关闭时间
  37. * @property string $DEC_LV 报单级别
  38. * @property string $EMP_LV 聘级
  39. * @property int $PROVINCE 省份
  40. * @property int $CITY 城市
  41. * @property int $COUNTY 县区
  42. * @property string $TEL 座机
  43. * @property string $SUB_COM_ID 子公司ID
  44. * @property string $AVATAR 头像
  45. * @property int $DELETED 是否删除
  46. * @property int $DELETED_AT 删除时间
  47. * @property int $IS_DEC 是否为报单中心
  48. * @property int $IS_ATLAS 是否显示图谱
  49. * @property int $IS_RECHARGE 是否显示充值
  50. * @property string $DEC_ID 报单中心ID
  51. * @property string $BIRTHDAY 生日
  52. * @property string $DEC_ROLE_ID 报单中心级别
  53. * @property int $PERIOD_AT 期数
  54. * @property int $DEC_PROVINCE 报单中心所属的省份
  55. * @property int $DEC_CITY 报单中心所属的城市
  56. * @property int $DEC_COUNTY 报单中心所属的县区
  57. * @property int $IS_UNION 是否为点位合作
  58. * @property int $STATUS_AT 状态更改时间
  59. * @property int $VERIFIED 是否认证
  60. * @property int $VERIFIED_AT 认证时间
  61. * @property int $ALLOW_LOGIN 允许登录
  62. * @property int $NOT_OPERATING 不运作
  63. * @property int $REG_FROM 注册类型
  64. * @property string $ID_CARD_PREFIX 身份证前缀
  65. * @property string $SEX 性别
  66. * @property string $DEC_ACCOUNT_OLD 老系统中的报单中心编号
  67. * @property int $BANK_UPDATED_AT 银行信息更新时间
  68. * @property int $IS_DIRECT_SELLER 是否为直销员
  69. * @property int $DEC_LV_UPDATED_AT 报单级别更新时间
  70. * @property int $DEC_LV_UPDATED_PERIOD 报单级别更新期数
  71. * @property string $DEC_ADDRESS 报单中心详细地址
  72. * @property string $DEC_PHONE 报单中心电话
  73. * @property string $GUARANTOR 担保人编号
  74. * @property string $GUARANTOR_NAME 担保人姓名
  75. * @property int $PART_FUNC_CLOSED 部分功能开启
  76. * @property int $LAST_DEC_LV_UPDATED_PERIOD 上次报单级别更新期数
  77. * @property string $USER_CREATOR 创建人
  78. * @property string $USER_UPDATER 修改人
  79. * @property int $LAST_DEC_LV_UPDATED_AT 上次报单级别更新时间
  80. * @property int $DEC_CREATED_AT 成为报单中心时间
  81. * @property string $PART_FUNC_CLOSED_REMARK 部分功能关闭原因
  82. * @property int $DEC_CREATED_PERIOD 成为报单中心期数
  83. * @property int $PASSWORD_CHANGED 是否修改过密码
  84. * @property int $SUB_COM_LEADER 是否为分公司领导
  85. * @property string $ZG_UPGRADE_PV 增购升级PV
  86. * @property string $APP_CLIENT_ID APP设备ID
  87. * @property int $READ_AGREEMENT 已读协议
  88. * @property string $LAST_DEC_LV 上次的报单级别
  89. * @property string $BONUS_APP_CLIENT_ID 结算APP设备ID
  90. * @property int $IS_FIRST_OPEN 首次开通
  91. * @property int $IS_MODIFY_PASSWORD 是否修改密码
  92. * @property int $IS_STUDIO 是否是工作室
  93. * @property int $IS_STUDIO_CODE 工作室编号
  94. * @property int $IS_STUDIO_DATE 工作室时间
  95. */
  96. class User extends \common\components\ActiveRecord
  97. {
  98. /**
  99. * @inheritdoc
  100. */
  101. public static function tableName()
  102. {
  103. return '{{%USER}}';
  104. }
  105. /**
  106. * @inheritdoc
  107. */
  108. public function rules()
  109. {
  110. return [
  111. [['USER_NAME', 'PASSWORD_HASH', 'PAY_PASSWORD', 'REAL_NAME', 'ID_CARD', 'AVATAR'], 'required'],
  112. [['NATION', 'ID_TYPE', 'BANK_PROVINCE', 'BANK_CITY', 'BANK_COUNTY', 'CREATED_AT', 'UPDATED_AT', 'STATUS', 'DEC_CLOSED', 'DEC_CLOSED_AT', 'PROVINCE', 'CITY', 'COUNTY', 'DELETED', 'DELETED_AT', 'IS_DEC', 'IS_ATLAS', 'IS_RECHARGE','IS_STUDIO', 'PERIOD_AT', 'DEC_PROVINCE', 'DEC_CITY', 'DEC_COUNTY', 'IS_UNION', 'STATUS_AT', 'VERIFIED', 'VERIFIED_AT', 'ALLOW_LOGIN', 'NOT_OPERATING', 'REG_FROM', 'BANK_UPDATED_AT', 'IS_DIRECT_SELLER', 'DEC_LV_UPDATED_AT', 'DEC_LV_UPDATED_PERIOD', 'PART_FUNC_CLOSED', 'LAST_DEC_LV_UPDATED_PERIOD', 'LAST_DEC_LV_UPDATED_AT', 'DEC_CREATED_AT', 'DEC_CREATED_PERIOD', 'PASSWORD_CHANGED', 'SUB_COM_LEADER', 'READ_AGREEMENT', 'IS_FIRST_OPEN', 'IS_MODIFY_PASSWORD'], 'integer'],
  113. [['ZG_UPGRADE_PV'], 'number'],
  114. [['ID', 'OPEN_BANK', 'BANK_NO', 'DEC_LV', 'EMP_LV', 'SUB_COM_ID', 'DEC_ID', 'DEC_ROLE_ID', 'ID_CARD_PREFIX', 'SEX', 'DEC_PHONE', 'GUARANTOR', 'USER_CREATOR', 'USER_UPDATER', 'LAST_DEC_LV'], 'string', 'max' => 32],
  115. [['USER_NAME', 'SPOUSE_NAME', 'TEL'], 'string', 'max' => 16],
  116. [['PASSWORD_HASH', 'PAY_PASSWORD', 'ID_IMAGE', 'BANK_ADDRESS', 'AVATAR'], 'string', 'max' => 255],
  117. [['REAL_NAME', 'APP_CLIENT_ID', 'BONUS_APP_CLIENT_ID'], 'string', 'max' => 128],
  118. [['ID_CARD', 'SPOUSE_IDCARD'], 'string','min' => 18, 'max' => 18],
  119. [['MOBILE'], 'string','min' => 11, 'max' => 11],
  120. [['ADDRESS', 'DEC_ADDRESS'], 'string', 'max' => 2000],
  121. [['DEC_ACCOUNT_OLD', 'GUARANTOR_NAME'], 'string', 'max' => 64],
  122. [['PART_FUNC_CLOSED_REMARK'], 'string', 'max' => 4000],
  123. [['USER_NAME'], 'unique'],
  124. [['ID'], 'unique'],
  125. ];
  126. }
  127. /**
  128. * @inheritdoc
  129. */
  130. public function attributeLabels()
  131. {
  132. return [
  133. 'ID' => 'ID',
  134. 'USER_NAME' => '帐号',
  135. 'PASSWORD_HASH' => '登录密码',
  136. 'PAY_PASSWORD' => '支付密码',
  137. 'NATION' => '民族',
  138. 'REAL_NAME' => '姓名',
  139. 'ID_CARD' => '身份证号',
  140. 'ID_TYPE' => '证件类型',
  141. 'MOBILE' => '手机号',
  142. 'ADDRESS' => '身份证地址',
  143. 'ID_IMAGE' => '证件图片',
  144. 'OPEN_BANK' => '开户行',
  145. 'BANK_ADDRESS' => '银行地址',
  146. 'BANK_NO' => '银行卡号',
  147. 'BANK_PROVINCE' => '银行省份',
  148. 'BANK_CITY' => '银行城市',
  149. 'BANK_COUNTY' => '银行县区',
  150. 'SPOUSE_NAME' => '配偶姓名',
  151. 'SPOUSE_IDCARD' => '配偶证件号',
  152. 'CREATED_AT' => '创建时间',
  153. 'UPDATED_AT' => '更新时间',
  154. 'STATUS' => '状态',
  155. 'DEC_CLOSED' => '是否关闭报单功能',
  156. 'DEC_CLOSED_AT' => '关闭时间',
  157. 'DEC_LV' => '报单级别',
  158. 'EMP_LV' => '聘级',
  159. 'PROVINCE' => '省份',
  160. 'CITY' => '城市',
  161. 'COUNTY' => '县区',
  162. 'TEL' => '座机',
  163. 'SUB_COM_ID' => '子公司ID',
  164. 'AVATAR' => '头像',
  165. 'DELETED' => '是否删除',
  166. 'DELETED_AT' => '删除时间',
  167. 'IS_DEC' => '是否为报单中心',
  168. 'IS_ATLAS' => '是否显示图谱',
  169. 'IS_RECHARGE' => '是否显示充值',
  170. 'DEC_ID' => '报单中心ID',
  171. 'BIRTHDAY' => '生日',
  172. 'DEC_ROLE_ID' => '报单中心级别',
  173. 'PERIOD_AT' => '期数',
  174. 'DEC_PROVINCE' => '报单中心所属的省份',
  175. 'DEC_CITY' => '报单中心所属的城市',
  176. 'DEC_COUNTY' => '报单中心所属的县区',
  177. 'IS_UNION' => '是否为点位合作',
  178. 'STATUS_AT' => '状态更改时间',
  179. 'VERIFIED' => '是否认证',
  180. 'VERIFIED_AT' => '认证时间',
  181. 'ALLOW_LOGIN' => '允许登录',
  182. 'NOT_OPERATING' => '不运作',
  183. 'REG_FROM' => '注册类型',
  184. 'ID_CARD_PREFIX' => '身份证前缀',
  185. 'SEX' => '性别',
  186. 'DEC_ACCOUNT_OLD' => '老系统中的报单中心编号',
  187. 'BANK_UPDATED_AT' => '银行信息更新时间',
  188. 'IS_DIRECT_SELLER' => '是否为直销员',
  189. 'DEC_LV_UPDATED_AT' => '报单级别更新时间',
  190. 'DEC_LV_UPDATED_PERIOD' => '报单级别更新期数',
  191. 'DEC_ADDRESS' => '报单中心详细地址',
  192. 'DEC_PHONE' => '报单中心电话',
  193. 'GUARANTOR' => '担保人编号',
  194. 'GUARANTOR_NAME' => '担保人姓名',
  195. 'PART_FUNC_CLOSED' => '部分功能开启',
  196. 'LAST_DEC_LV_UPDATED_PERIOD' => '上次报单级别更新期数',
  197. 'USER_CREATOR' => '创建人',
  198. 'USER_UPDATER' => '修改人',
  199. 'LAST_DEC_LV_UPDATED_AT' => '上次报单级别更新时间',
  200. 'DEC_CREATED_AT' => '成为报单中心时间',
  201. 'PART_FUNC_CLOSED_REMARK' => '部分功能关闭原因',
  202. 'DEC_CREATED_PERIOD' => '成为报单中心期数',
  203. 'PASSWORD_CHANGED' => '是否修改过密码',
  204. 'SUB_COM_LEADER' => '是否为分公司领导',
  205. 'ZG_UPGRADE_PV' => '增购升级PV',
  206. 'APP_CLIENT_ID' => 'APP设备ID',
  207. 'READ_AGREEMENT' => '已读协议',
  208. 'LAST_DEC_LV' => '上次的报单级别',
  209. 'BONUS_APP_CLIENT_ID' => '结算APP设备ID',
  210. 'IS_FIRST_OPEN' => '首次开通',
  211. 'IS_MODIFY_PASSWORD' => '是否修改密码',
  212. 'IS_STUDIO' => '是否是工作室',
  213. 'IS_STUDIO_CODE' => '工作室编号',
  214. 'IS_STUDIO_DATE' => '工作室日期',
  215. ];
  216. }
  217. public function getUserInfo()
  218. {
  219. return $this->hasOne(UserInfo::class, ['USER_ID' => 'ID']);
  220. }
  221. public static function checkUser($userName){
  222. return self::find()->select('ID')->where('USER_NAME=:USER_NAME', [':USER_NAME'=>$userName])->asArray()->one();
  223. }
  224. /**
  225. * 获取会员基本信息
  226. * @param $userId
  227. * @return array|null|\yii\db\ActiveRecord
  228. */
  229. public static function getBaseInfo($userId){
  230. return static::findUseSlaves()->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
  231. }
  232. /**
  233. * 获取用户基本信息从redis里面
  234. * @param $userId
  235. * @return array|null|\yii\db\ActiveRecord
  236. */
  237. public static function getBaseInfoFromRedis($userId){
  238. $userInfo = Yii::$app->redis->hget(Cache::USER_INFO_KEY, $userId);
  239. if(!$userInfo){
  240. $userInfo = static::find()->select('ID,USER_NAME,NATION,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
  241. Yii::$app->redis->hset(Cache::USER_INFO_KEY, $userId, Json::encode($userInfo));
  242. } else {
  243. $userInfo = Json::decode($userInfo);
  244. }
  245. return $userInfo;
  246. }
  247. /**
  248. * 更新缓存
  249. * @param $userId
  250. * @return mixed
  251. */
  252. public static function updateBaseInfoToRedis($userId){
  253. $userInfo = static::find()->select('ID,USER_NAME,NATION,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
  254. return Yii::$app->redis->hset(Cache::USER_INFO_KEY, $userId, Json::encode($userInfo));
  255. }
  256. /**
  257. * @param $userId
  258. * 删除用户信息缓存
  259. */
  260. public static function deleteBaseInfoFromRedis($userId) {
  261. Yii::$app->redis->hdel(Cache::USER_INFO_KEY, $userId);
  262. }
  263. /**
  264. * 批量删除用户
  265. * @return void
  266. */
  267. public static function deleteAllBaseInfoFromRedis() {
  268. Yii::$app->redis->del(Cache::USER_INFO_KEY);
  269. }
  270. /**
  271. * 获取会员的部分信息并对敏感信息加密
  272. * @param $userId
  273. * @return array
  274. */
  275. public static function getEnCodeInfo($userId){
  276. $userInfo = self::getBaseInfoFromRedis($userId);
  277. return [
  278. 'ID' => $userId,
  279. 'USER_NAME' => $userInfo['USER_NAME'],
  280. 'NATION' => \Yii::$app->params['nation'][$userInfo['NATION']]['name']??'',
  281. 'NATION_ID' => \Yii::$app->params['nation'][$userInfo['NATION']]['id']??'',
  282. 'REAL_NAME' => $userInfo['REAL_NAME'],
  283. 'ID_CARD' => $userInfo['ID_CARD'],
  284. // 'ID_CARD' => Tool::hideIdCard($userInfo['ID_CARD']),
  285. 'MOBILE' => $userInfo['MOBILE'],
  286. // 'MOBILE' => Tool::hideMobile($userInfo['MOBILE']),
  287. 'AVATAR' => $userInfo['AVATAR'],
  288. 'VERIFIED' => $userInfo['VERIFIED'],
  289. 'IS_UNION' => $userInfo['IS_UNION'],
  290. 'IS_DEC' => $userInfo['IS_DEC'],
  291. 'IS_ATLAS' => $userInfo['IS_ATLAS'],
  292. 'IS_RECHARGE' => $userInfo['IS_RECHARGE'],
  293. 'IS_STUDIO' => $userInfo['IS_STUDIO'],
  294. 'DEC_ROLE_ID' => $userInfo['DEC_ROLE_ID'],
  295. 'OPEN_BANK' => $userInfo['OPEN_BANK'],
  296. 'BANK_ADDRESS' => $userInfo['BANK_ADDRESS'],
  297. 'DEC_LV' => $userInfo['DEC_LV'],
  298. 'EMP_LV' => $userInfo['EMP_LV'],
  299. 'PROVINCE' => $userInfo['PROVINCE'],
  300. 'CITY' => $userInfo['CITY'],
  301. 'COUNTY' => $userInfo['COUNTY'],
  302. 'BANK_NO' => $userInfo['BANK_NO'],
  303. // 'BANK_NO' => Tool::hideBankNo($userInfo['BANK_NO']) ,
  304. ];
  305. }
  306. /**
  307. * 验证密码
  308. * @param $password
  309. * @return bool
  310. */
  311. public function validatePassword($password) {
  312. if( !$this->PASSWORD_HASH ) return false;
  313. return password_verify($password, $this->PASSWORD_HASH);
  314. }
  315. /**
  316. * verificationPassword
  317. *
  318. * @param string $password password to validate
  319. * @return bool if password provided is valid for current user
  320. */
  321. public function verificationPassword($password,$scenario,$model)
  322. {
  323. // 判断密码长度不能少于8位
  324. if (strlen($password) < 8){
  325. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码不能小于8位' ];
  326. }
  327. // 判断密码中数字、大写字母、小写字母、特殊字符至少三种
  328. $symbol = '`~!@#$^&*()=|{}\'\":;\',\\[\\].<>\/?~!@#¥……&*()——|{}【】‘;:”。,、?';
  329. // $requiredRules = '/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)(?!['.$symbol.']+$)[\da-zA-z'.$symbol.']{8,}$/'; // 这是两种的正则
  330. $requiredRules = '/^(?![\da-z]+$)(?![\dA-Z]+$)(?![\d'.$symbol.']+$)(?![a-zA-Z]+$)(?![a-z'.$symbol.']+$)(?![A-Z'.$symbol.']+$)[\da-zA-z'.$symbol.']{8,}$/';
  331. $requiredHandleResults = preg_match($requiredRules,$password);
  332. if (!$requiredHandleResults){
  333. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码中需要包含数字、大写字母、小写字母、特殊字符至少三种' ];
  334. }
  335. // 判断有三位以上重复性
  336. if(preg_match('/(\w)*(\w)\1{2}(\w)*/',$password)) {
  337. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码中数字、大写字母、小写字母不能连续重复三个以上' ];
  338. }
  339. // 判断密码中不能出现登录账号
  340. if (strpos($password, $model->USER_NAME) !== false){
  341. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码中不允许出现会员登录账号的信息' ];
  342. }
  343. // 判断密码中不能出现会员的手机号
  344. if ($model->MOBILE){
  345. if (strpos($password, $model->MOBILE) !== false){
  346. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码中不允许出现会员的联系方式' ];
  347. }
  348. }
  349. // 判断密码中不能出现会员的生日
  350. if ($model->ID_CARD && strlen($model->ID_CARD) == 18){
  351. $idCard = substr($model->ID_CARD,6,8);
  352. if (strpos($password, $idCard) !== false){
  353. return [ 'code' => 1000, 'type' => $scenario , 'message' => '登录密码中不允许出现会员的生日' ];
  354. }
  355. }
  356. return [ 'code' => 200, 'type' => $scenario , 'message' => '验证通过了' ];
  357. }
  358. /**
  359. * 验证支付密码
  360. * @param $payPassword
  361. * @return bool
  362. */
  363. public function validatePasswordPay($payPassword) {
  364. if( !$this->PAY_PASSWORD ) return false;
  365. return password_verify($payPassword, $this->PAY_PASSWORD);
  366. }
  367. /**
  368. * 检验支付密码
  369. * @param $userId
  370. * @param $password
  371. * @return bool
  372. */
  373. public static function validatePayPassword($userId, $password){
  374. $oneUser = static::find()->select('PAY_PASSWORD')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
  375. if($oneUser){
  376. return password_verify($password, $oneUser['PAY_PASSWORD']);
  377. } else {
  378. return false;
  379. }
  380. }
  381. /**
  382. * 判断用户是否是观察期
  383. * 观望期:自加入算起2个月
  384. * 例子:2022年5月14日加入, 观望期至2022年7月31日。
  385. * true为是观察期用户 false为不是观察期用户
  386. * @param $addAt 用户的加入时间
  387. * @param $month 观察期月份限制 系统初始化为2个月
  388. */
  389. public static function checkIsObserve($addAt, $month) {
  390. if (empty($month)) {
  391. // 如果0 代表全站全额升级
  392. return false;
  393. }
  394. $appendMonth = date("Y-m", strtotime("first day of +$month month", $addAt)); // 指定月份
  395. $lastDay = date("t", strtotime($appendMonth)); // 获取指定月的最后一天
  396. $eTime = strtotime($appendMonth.'-'.$lastDay);
  397. return time() < $eTime ? true : false;
  398. }
  399. // 获取用户报单PV总和
  400. public static function sumDevPvByUserId($userId) {
  401. $decOrderPv = DecOrder::find()
  402. ->select('SUM(DEC_PV) AS PV_SUM')
  403. ->where('TO_USER_ID=:TO_USER_ID AND IS_DEL=0',
  404. [
  405. 'TO_USER_ID'=>$userId,
  406. ]
  407. )
  408. ->asArray()
  409. ->one();
  410. $decOrderPv = isset($decOrderPv['PV_SUM']) ? $decOrderPv['PV_SUM'] : 0;
  411. $orderDecPv = OrderDec::find()
  412. ->select('SUM(PAY_PV) AS PV_SUM')
  413. ->where('USER_ID=:USER_ID AND IS_DELETE=0',
  414. [
  415. 'USER_ID'=>$userId,
  416. ]
  417. )
  418. ->asArray()
  419. ->one();
  420. $orderDecPv = isset($orderDecPv['PV_SUM']) ? $orderDecPv['PV_SUM'] : 0;
  421. // 还得加上用户在老系统中的所有报单PV之和
  422. $originPv = OriginDecPv::find()
  423. ->select('SUM(DEC_PV) AS PV_SUM')
  424. ->where('USER_ID=:USER_ID',
  425. [
  426. 'USER_ID'=>$userId,
  427. ]
  428. )
  429. ->asArray()
  430. ->one();
  431. $originPv = isset($originPv['PV_SUM']) ? $originPv['PV_SUM'] : 0;
  432. $total = $orderDecPv + $decOrderPv + $originPv;
  433. return $total;
  434. }
  435. /**
  436. * 操作日志记录条件
  437. * @return array
  438. */
  439. public function attrLabelsWithLogType(){
  440. return [
  441. 'ID' => 'ID',
  442. 'USER_NAME' => '帐号',
  443. 'NATION' => [
  444. 'label' => '民族',
  445. 'type' => function($data){
  446. $value = $data['value'];
  447. return \Yii::$app->params['nation'][$value]['name']??'';
  448. },
  449. ],
  450. 'REAL_NAME' => '姓名',
  451. 'ID_CARD' => '身份证号',
  452. 'ID_TYPE' => [
  453. 'label' => '证件类型',
  454. 'type' => function($data){
  455. return '身份证';
  456. },
  457. ],
  458. 'MOBILE' => '手机号',
  459. 'ADDRESS' => '身份证地址',
  460. 'ID_IMAGE' => '证件图片',
  461. 'OPEN_BANK' => '开户行',
  462. 'BANK_ADDRESS' => '银行地址',
  463. 'BANK_NO' => '银行卡号',
  464. 'BANK_PROVINCE' => [
  465. 'label' => '银行省份',
  466. 'type' => ValueTypeConfig::REGION_TYPE
  467. ],
  468. 'BANK_CITY' => [
  469. 'label' => '银行城市',
  470. 'type' => ValueTypeConfig::REGION_TYPE
  471. ],
  472. 'BANK_COUNTY' => [
  473. 'label' => '银行县区',
  474. 'type' => ValueTypeConfig::REGION_TYPE
  475. ],
  476. 'SPOUSE_NAME' => '配偶姓名',
  477. 'SPOUSE_IDCARD' => '配偶证件号',
  478. 'STATUS' => [
  479. 'label' => '状态',
  480. 'type' => ValueTypeConfig::USER_STATUS_TYPE
  481. ],
  482. 'DEC_CLOSED' => [
  483. 'label' => '是否关闭报单功能',
  484. 'type' => ValueTypeConfig::YES_NO_TYPE,
  485. ],
  486. 'DEC_CLOSED_AT' => [
  487. 'label' => '关闭报单时间',
  488. 'type' => ValueTypeConfig::DATE_TIME_TYPE,
  489. ],
  490. 'DEC_LV' => [
  491. 'label' => '报单级别',
  492. 'type' => ValueTypeConfig::DEC_LV_TYPE,
  493. ],
  494. 'EMP_LV' => [
  495. 'label' => '聘级',
  496. 'type' => ValueTypeConfig::EMP_LV_TYPE,
  497. ],
  498. 'LAST_DEC_LV' => [
  499. 'label' => '上次的报单级别',
  500. 'type' => ValueTypeConfig::DEC_LV_TYPE,
  501. ],
  502. 'PROVINCE' => [
  503. 'label' => '省份',
  504. 'type' => ValueTypeConfig::REGION_TYPE
  505. ],
  506. 'CITY' => [
  507. 'label' => '城市',
  508. 'type' => ValueTypeConfig::REGION_TYPE
  509. ],
  510. 'COUNTY' => [
  511. 'label' => '县区',
  512. 'type' => ValueTypeConfig::REGION_TYPE
  513. ],
  514. 'TEL' => '备用手机号码',
  515. 'SUB_COM_ID' => '分公司ID',
  516. 'TRANSFER_PROP' => '转帐比例',
  517. 'IS_DEC' => [
  518. 'label' => '是否为报单中心',
  519. 'type' => ValueTypeConfig::YES_NO_TYPE,
  520. ],
  521. 'DEC_ROLE_ID' => [
  522. 'label' => '报单中心级别',
  523. 'type' => ValueTypeConfig::DEC_ROLE_ID_TYPE,
  524. ],
  525. 'IS_UNION' => [
  526. 'label' => '是否为点位合作',
  527. 'type' => ValueTypeConfig::YES_NO_TYPE,
  528. ],
  529. 'STATUS_AT' => '状态修改时间',
  530. 'ALLOW_LOGIN' => [
  531. 'label' => '是否允许商城登录',
  532. 'type' => ValueTypeConfig::YES_NO_TYPE,
  533. ],
  534. 'NOT_OPERATING' => [
  535. 'label' => '不运作',
  536. 'type' => ValueTypeConfig::YES_NO_TYPE,
  537. ],
  538. 'BIRTHDAY' => '生日',
  539. 'SEX' => '性别',
  540. ];
  541. }
  542. /**
  543. * 获取列表
  544. * @param string $condition
  545. * @param array $params
  546. * @param array $argv
  547. * @return array
  548. */
  549. public static function lists($condition = '', $params = [], $argv = []) {
  550. self::prepare($condition, $params, $argv, true);
  551. unset($condition, $params, $argv);
  552. $countQuery = clone self::$query;
  553. $simpleQuery = clone self::$query;
  554. if(!$simpleQuery->params){
  555. $simpleQuery->join = [];
  556. $count = $simpleQuery->count(self::$argv['count']);
  557. } else {
  558. $count = $countQuery->count(self::$argv['count']); // 得到总数
  559. }
  560. // $count = $countQuery->count(self::$argv['count']); // 得到总数
  561. $pagination = new Pagination(['totalCount' => $count]);
  562. $pagination->setPageSize(self::$argv['pageSize']);
  563. if(self::$argv['page'] !== null){
  564. $pagination->setPage(self::$argv['page']);
  565. }
  566. self::$query->offset($pagination->offset)->limit($pagination->limit);
  567. if(self::$argv['asArray']){
  568. self::$query->asArray();
  569. }
  570. $lists = self::$query->all();
  571. self::$query = null;
  572. unset($countQuery);
  573. $startNum = $pagination->page * $pagination->pageSize + 1;
  574. return [
  575. 'list' => $lists ? $lists : [],
  576. 'pagination' => $pagination,
  577. // 'sql'=self::$rawSql,
  578. 'currentPage'=>$pagination->page,
  579. 'totalPages'=>$pagination->pageCount,
  580. 'startNum' => $startNum,
  581. 'totalCount' => $pagination->totalCount,
  582. 'pageSize' => $pagination->pageSize,
  583. ];
  584. }
  585. }