| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- namespace console\controllers;
- use biz\shop\classes\ShopClass;
- use bizGhs\custom\models\Custom;
- use bizGhs\order\classes\OrderClass;
- use bizHd\custom\classes\CustomClass;
- use bizHd\custom\classes\HdClass;
- use bizHd\member\classes\MemberLevelClass;
- use bizHd\purchase\classes\PurchaseClass;
- use bizHd\shop\models\Shop;
- use common\components\dict;
- use common\components\noticeUtil;
- use common\components\util;
- use bizHd\user\classes\UserClass;
- use bizHd\user\models\User;
- use Overtrue\ChineseCalendar\Calendar;
- use Yii;
- use yii\console\Controller;
- class UserController extends Controller
- {
- /**
- * 每天凌晨 3:35 执行:阴历生日跨年刷新
- * 从 xhUser 分页取出 lunar=1 且 birthdayTime 已过的用户,农历转当年/次年阳历后回写用户并同步 xhCustom
- * 命令:./yii custom/update-birthday
- */
- public function actionUpdateBirthday()
- {
- try {
- date_default_timezone_set('PRC');
- ini_set('memory_limit', '512M');
- set_time_limit(0);
- $calendar = new Calendar();
- $now = time();
- $todayStart = strtotime(date('Y-m-d'));
- $updatedUserCount = 0;
- // 生日主数据在 xhUser;按 id 分页避免一次加载全表
- $query = User::find()
- ->select('id, birthday, birthdayTime, birthdayMonth, birthdayDate, lunar')
- ->where(['lunar' => 1])
- ->andWhere(['<', 'birthdayTime', $now])
- ->orderBy('id ASC');
- foreach ($query->batch(200) as $userList) {
- foreach ($userList as $user) {
- $userId = $user->id;
- $birthdayMonth = $user->birthdayMonth;
- $birthdayDate = $user->birthdayDate;
- $year = (int)date('Y');
- try {
- // 农历转公历,有多处使用,需要同步修改,关键词 change_my_birthday
- $result = $calendar->lunar($year, $birthdayMonth, $birthdayDate);
- $month = $result['gregorian_month'] ?? 1;
- $day = $result['gregorian_day'] ?? 1;
- $birthday = $year . '-' . $month . '-' . $day;
- // 今年阳历生日已过,则换算明年农历对应阳历
- if (strtotime($birthday) < $todayStart) {
- $year++;
- $result = $calendar->lunar($year, $birthdayMonth, $birthdayDate);
- $month = $result['gregorian_month'] ?? 1;
- $day = $result['gregorian_day'] ?? 1;
- $birthday = $year . '-' . $month . '-' . $day;
- }
- } catch (\InvalidArgumentException $e) {
- noticeUtil::push(
- '阴历转阳历脚本单条失败,userId:' . $userId . ' 月份:' . $birthdayMonth . ' 日期:' . $birthdayDate . ' ' . $e->getMessage(),
- '15280215347'
- );
- continue;
- }
- $birthdayTime = strtotime($birthday);
- if ($birthdayTime <= 0) {
- continue;
- }
- // 先更新用户表(生日源数据),再按 userId 同步门店客户
- UserClass::updateById($userId, [
- 'birthday' => $birthday,
- 'birthdayTime' => $birthdayTime,
- ]);
- CustomClass::updateByCondition(['userId' => $userId], [
- 'birthday' => $birthday,
- 'birthdayTime' => $birthdayTime,
- ]);
- $updatedUserCount++;
- }
- }
- Yii::info('阴历转阳历脚本成功执行,更新用户数:' . $updatedUserCount);
- echo "阴历转阳历完成,更新用户数:{$updatedUserCount}\n";
- } catch (\Exception $e) {
- Yii::error('阴历转阳历脚本执行失败,原因:' . $e->getMessage());
- echo '阴历转阳历脚本执行失败,原因:' . $e->getMessage() . "\n";
- }
- }
- }
|