activityManagementDb = new Activity();
$this->receiptManagementDb = new Receipt();
$this->syslogactManagementDb = new Syslogact();
}
public function getActivitys(
&$cnt = 0,
$orderColumn,
$orderDir,
$start,
$length,
$searchValue
)
{
$activity = $this->activityManagementDb
->select([
'id',
\DB::raw("CONCAT('', activityName, '') as activityName"),
\DB::raw("CONCAT(reqTimeBegin, '
', reqTimeFinal) as reqTime"),
'drawTime',
\DB::raw("replace(drawNumbers, ',', '
') as drawNumbers"),
\DB::raw("
(case
-- 現在時間小於開獎時間 (NOW是+8時區,UNIX_TIMESTAMP之後就變成+0時區)
when UNIX_TIMESTAMP(NOW()) < UNIX_TIMESTAMP(CONCAT(drawTime, ' 00:00:00'))
then '尚未到開獎時間'
-- 現在時間大於開獎時間
else (case isDraw
-- 決定顯示出來的開獎按鈕可不可以按
when '' then CONCAT('點我開獎')
else '已經開獎'
end)
end) as drawBtn
"),
\DB::raw("CONCAT(redeemTimeBegin, '
', redeemTimeFinal) as redeemTime"),
\DB::raw("
(case
-- 現在時間小於驗證時間首日 (NOW是+8時區,UNIX_TIMESTAMP之後就變成+0時區)
when UNIX_TIMESTAMP(NOW()) < UNIX_TIMESTAMP(CONCAT(checkTimeBegin, ' 00:00:00'))
then '尚未到驗證時間'
-- 現在時間大於驗證時間首日
else (case isCheckBegin
-- 決定顯示出來的驗證按鈕可不可以按
when '' then CONCAT('點我啟動驗證流程')
else '已啟動驗證流程'
end)
end) as checkBtn
"),
\DB::raw("CONCAT(checkTimeBegin, '
', checkTimeFinal) as checkTime"),
\DB::raw("CONCAT(getTimeBegin, '
', getTimeFinal) as getTime"),
\DB::raw("
(case
-- 現在時間小於領獎時間迄日 (NOW是+8時區,UNIX_TIMESTAMP之後就變成+0時區)
when UNIX_TIMESTAMP(NOW()) < UNIX_TIMESTAMP(CONCAT(getTimeFinal, ' 00:00:00'))
then '尚未到領獎結束時間'
-- 現在時間大於領獎時間迄日
else (case isGetFinal
-- 決定顯示出來的驗證按鈕可不可以按
when '' then CONCAT('點我關閉領獎活動')
else '已關閉領獎活動'
end)
end) as getBtn
"),
'cdate',
'mdate',
\DB::raw("(select name from users where id=activity.oid) as oid"),
]);
// 過濾搜尋條件
// 取總筆數
$cnt = $activity->count();
// 排序
$activity = $activity
->orderByRaw((int)$orderColumn . ' ' . $orderDir);
// 彙整
// 分頁
$activity = $activity
->skip($start)->take($length);
// 實際取資料
$activity = $activity
->get()
->toArray();
// 整理返回值並返回
return $activity;
}
public function getActivityById($id)
{
// 取得參數
// 調用資料庫(或者其他業務邏輯)
$activity = $this->activityManagementDb->select([
'id',
'activityName',
'reqTimeBegin',
'reqTimeFinal',
'drawTime',
'drawNumbers',
'redeemTimeBegin',
'redeemTimeFinal',
'checkTimeBegin',
'checkTimeFinal',
'getTimeBegin',
'getTimeFinal',
'cdate',
'mdate',
\DB::raw("(select name from users where id=activity.oid) as oid"),
])
->where('id', $id)
->first()
->toArray();
// 整理返回值並返回
return $activity;
}
public function insertActivity($activityName, $reqTimeBegin, $reqTimeFinal, $drawTime, $drawNumbers, $redeemTimeBegin, $redeemTimeFinal, $checkTimeBegin, $checkTimeFinal, $getTimeBegin, $getTimeFinal, $oid)
{
// 取得參數
$data = [
'activityName' => $activityName,
'reqTimeBegin' => $reqTimeBegin,
'reqTimeFinal' => $reqTimeFinal,
'drawTime' => $drawTime,
'drawNumbers' => $drawNumbers,
'redeemTimeBegin' => $redeemTimeBegin,
'redeemTimeFinal' => $redeemTimeFinal,
'checkTimeBegin' => $checkTimeBegin,
'checkTimeFinal' => $checkTimeFinal,
'getTimeBegin' => $getTimeBegin,
'getTimeFinal' => $getTimeFinal,
'cdate' => date('Y-m-d H:i:s'),
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
];
// 調用資料庫(或者其他業務邏輯)
$this->activityManagementDb
->insert($data);
$id = \DB::getPdo()->lastInsertId();
// syslogact
$this->syslogactManagementDb
->insert([
'type' => GeneralConst::LOG_ADMIN,
'func' => __FUNCTION__,
'k' => $oid,
'memoIn' => json_encode(['data' => $data], JSON_UNESCAPED_UNICODE),
'memoOut' => json_encode(['id' => $id], JSON_UNESCAPED_UNICODE),
'cdate' => date("Y-m-d H:i:s"),
]);
// 整理返回值並返回
return $id;
}
public function modifyActivity($id, $activityName, $reqTimeBegin, $reqTimeFinal, $drawTime, $drawNumbers, $redeemTimeBegin, $redeemTimeFinal, $checkTimeBegin, $checkTimeFinal, $getTimeBegin, $getTimeFinal, $oid)
{
// 取得參數
$data = [
'activityName' => $activityName,
'reqTimeBegin' => $reqTimeBegin,
'reqTimeFinal' => $reqTimeFinal,
'drawTime' => $drawTime,
'drawNumbers' => $drawNumbers,
'redeemTimeBegin' => $redeemTimeBegin,
'redeemTimeFinal' => $redeemTimeFinal,
'checkTimeBegin' => $checkTimeBegin,
'checkTimeFinal' => $checkTimeFinal,
'getTimeBegin' => $getTimeBegin,
'getTimeFinal' => $getTimeFinal,
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
];
// 調用資料庫(或者其他業務邏輯)
$res = $this->activityManagementDb
->where('id', $id)
->update($data);
$rc = \DB::select("SELECT ROW_COUNT() AS rc;");
$rc = $rc[0]->rc;
// syslogact
$this->syslogactManagementDb
->insert([
'type' => GeneralConst::LOG_ADMIN,
'func' => __FUNCTION__,
'k' => $oid,
'memoIn' => json_encode(['id' => $id, 'data' => $data], JSON_UNESCAPED_UNICODE),
'memoOut' => json_encode(['rc' => $rc], JSON_UNESCAPED_UNICODE),
'cdate' => date("Y-m-d H:i:s"),
]);
// 整理返回值並返回
return $res;
}
public function draw($id, $oid)
{
// 取得該期獎號
$drawNumbers = $this->activityManagementDb
->select(['drawNumbers'])
->where('id', $id)
->where('isDraw', '') // 尚未開獎
->where('isCheckBegin', '')
->where('isGetFinal', '')
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(drawTime, ' 00:00:00'))") // 開獎時間再次確認
->first()->toArray();
$drawNumbers = explode(',', $drawNumbers['drawNumbers']);
// 掃描[該期][狀態=1=未開獎]的訂單編號,並比對獎號更改狀態,應該是兩句 SQL 就夠了
$receipts = $this->receiptManagementDb
->select([
'id',
\DB::raw("FROM_BASE64(AES_DECRYPT(UNHEX(tranOrderNo), \"" . env('KK') . "\")) as tranOrderNo"),
])
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_INIT) // 是初始登錄完畢狀態的
->where('canGet', '') // 以防萬一連這個欄位也檢查
->get()->toArray();
$draw_fail = [];
$draw_done = [];
foreach ($receipts as $r) {
if (in_array(substr($r['tranOrderNo'], -3), $drawNumbers)) {
$draw_done[] = $r['id'];
} else {
$draw_fail[] = $r['id'];
}
}
$this->receiptManagementDb
->whereIn('id', $draw_fail)
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_INIT) // 是初始登錄完畢狀態的
->where('canGet', '') // 以防萬一連這個欄位也檢查
->update([
'rStatus' => GeneralConst::RSTATUS_DRAW_FAIL,
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
$this->receiptManagementDb
->whereIn('id', $draw_done)
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_INIT) // 是初始登錄完畢狀態的
->where('canGet', '') // 以防萬一連這個欄位也檢查
->update([
'rStatus' => GeneralConst::RSTATUS_DRAW_DONE,
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// 更改開獎狀態位
$this->activityManagementDb
->where('id', $id)
->where('isDraw', '')
->where('isCheckBegin', '')
->where('isGetFinal', '')
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(drawTime, ' 00:00:00'))") // 開獎時間再次確認
->update([
'isDraw' => 'Y',
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// syslogact
$data = [
'aid' => $id,
'drawNumbers' => $drawNumbers,
'draw_fail' => $draw_fail,
'draw_done' => $draw_done,
];
$this->syslogactManagementDb
->insert([
'type' => GeneralConst::LOG_ADMIN,
'func' => __FUNCTION__,
'k' => $oid,
'memoIn' => json_encode(['data' => $data], JSON_UNESCAPED_UNICODE),
'memoOut' => json_encode([], JSON_UNESCAPED_UNICODE),
'cdate' => date("Y-m-d H:i:s"),
]);
return true;
}
public function check($id, $oid)
{
// 取得該期ID (有點像脫褲子放屁,但這是為了確認時間是否符合以及各項狀態位的管控)
$chk = $this->activityManagementDb
->select(['id'])
->where('id', $id)
->where('isDraw', 'Y') // 已開獎
->where('isCheckBegin', '') // 未啟動驗證
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(checkTimeBegin, ' 00:00:00'))") // 驗證流程時間再次確認
->get();
if (count($chk) == 0) return false; // 碰到這種情況按完鈕後不會有反應,且操作人也不知為何,就需要工程師介入
// 取得該期所有狀態位為已中獎但未送出驗證的紀錄
$receipts = $this->receiptManagementDb
->select([
'id',
])
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_DRAW_DONE) // 是已中獎但未送出驗證的紀錄的
->where('canGet', '') // 以防萬一連這個欄位也檢查
->get()->toArray();
$draw_done_expired = [];
foreach ($receipts as $r) $draw_done_expired[] = $r['id'];
$this->receiptManagementDb
->whereIn('id', $draw_done_expired)
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_DRAW_DONE) // 是已中獎但未送出驗證的紀錄的
->where('canGet', '') // 以防萬一連這個欄位也檢查
->update([
'rStatus' => GeneralConst::RSTATUS_DRAW_DONE_EXPIRED,
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// 更改驗證狀態位
$this->activityManagementDb
->where('id', $id)
->where('isDraw', 'Y')
->where('isCheckBegin', '')
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(checkTimeBegin, ' 00:00:00'))") // 開獎時間再次確認
->update([
'isCheckBegin' => 'Y',
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// syslogact
$data = [
'aid' => $id,
'draw_done_expired' => $draw_done_expired,
];
$this->syslogactManagementDb
->insert([
'type' => GeneralConst::LOG_ADMIN,
'func' => __FUNCTION__,
'k' => $oid,
'memoIn' => json_encode(['data' => $data], JSON_UNESCAPED_UNICODE),
'memoOut' => json_encode([], JSON_UNESCAPED_UNICODE),
'cdate' => date("Y-m-d H:i:s"),
]);
return true;
}
public function get($id, $oid)
{
// 取得該期ID (有點像脫褲子放屁,但這是為了確認時間是否符合以及各項狀態位的管控)
$chk = $this->activityManagementDb
->select(['id'])
->where('id', $id)
->where('isDraw', 'Y') // 已開獎
->where('isCheckBegin', 'Y') // 已啟動驗證
->where('isGetFinal', '') // 未關閉活動
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(getTimeFinal, ' 00:00:00'))") // 領獎時間再次確認
->get();
if (count($chk) == 0) return false; // 碰到這種情況按完鈕後不會有反應,且操作人也不知為何,就需要工程師介入
// 取得該期所有狀態位為已中獎但未送出驗證的紀錄
$receipts = $this->receiptManagementDb
->select([
'id',
])
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_DRAW_DONE_REDEEM_DONE) // 是已驗證通過但未領取的
->where('canGet', 'Y') // 以防萬一連這個欄位也檢查
->get()->toArray();
$get_done_expired = [];
foreach ($receipts as $r) $get_done_expired[] = $r['id'];
$this->receiptManagementDb
->whereIn('id', $get_done_expired)
->where('aid', $id) // 是指定活動的
->where('rStatus', GeneralConst::RSTATUS_DRAW_DONE_REDEEM_DONE) // 是已驗證通過但未領取的
->where('canGet', 'Y') // 以防萬一連這個欄位也檢查
->update([
'rStatus' => GeneralConst::RSTATUS_DRAW_DONE_REDEEM_DONE_EXPIRED,
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// 更改驗證狀態位
$this->activityManagementDb
->where('id', $id)
->where('isDraw', 'Y')
->where('isCheckBegin', 'Y')
->where('isGetFinal', '')
->whereRaw("UNIX_TIMESTAMP(NOW()) >= UNIX_TIMESTAMP(CONCAT(getTimeFinal, ' 00:00:00'))") // 領獎時間再次確認
->update([
'isGetFinal' => 'Y',
'mdate' => date('Y-m-d H:i:s'),
'oid' => $oid,
]);
// syslogact
$data = [
'aid' => $id,
'redeem_done_expired' => $get_done_expired,
];
$this->syslogactManagementDb
->insert([
'type' => GeneralConst::LOG_ADMIN,
'func' => __FUNCTION__,
'k' => $oid,
'memoIn' => json_encode(['data' => $data], JSON_UNESCAPED_UNICODE),
'memoOut' => json_encode([], JSON_UNESCAPED_UNICODE),
'cdate' => date("Y-m-d H:i:s"),
]);
return true;
}
}