làm lại quy trình đồng bộ dữ liệu
This commit is contained in:
parent
9719e836f8
commit
9112eaaff9
|
@ -347,10 +347,11 @@ class DeviceController extends Controller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function actionGetDataSync() {
|
public function actionSyncSchedule() {
|
||||||
if (Yii::$app->request->post()) {
|
if (Yii::$app->request->post()) {
|
||||||
Yii::$app->response->format = "json";
|
Yii::$app->response->format = "json";
|
||||||
$device_id = Yii::$app->request->post("data");
|
$device_id = Yii::$app->request->post("data");
|
||||||
|
$deviceInfo = $this->findModel($device_id);
|
||||||
$doors = Door::find()->andWhere(["device_id" => $device_id])->all();
|
$doors = Door::find()->andWhere(["device_id" => $device_id])->all();
|
||||||
$filter = ["OR"];
|
$filter = ["OR"];
|
||||||
foreach ($doors as $key => $value) {
|
foreach ($doors as $key => $value) {
|
||||||
|
@ -362,20 +363,8 @@ class DeviceController extends Controller {
|
||||||
foreach ($staffs as $key => $value) {
|
foreach ($staffs as $key => $value) {
|
||||||
$schedule[] = $value->schedule_id;
|
$schedule[] = $value->schedule_id;
|
||||||
}
|
}
|
||||||
|
$schedule_lists = array_unique($schedule);
|
||||||
|
|
||||||
$schedule = array_unique($schedule);
|
|
||||||
return [
|
|
||||||
"IP" => $this->findModel($device_id)->ip_address,
|
|
||||||
"schedule" => $schedule
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function actionSyncSchedule() {
|
|
||||||
if (Yii::$app->request->post()) {
|
|
||||||
Yii::$app->response->format = "json";
|
|
||||||
$post = Yii::$app->request->post();
|
|
||||||
$schedule_lists = $post["data"];
|
|
||||||
$TimeZoneInfos = [];
|
$TimeZoneInfos = [];
|
||||||
foreach ($schedule_lists as $key => $value) {
|
foreach ($schedule_lists as $key => $value) {
|
||||||
$schedule = Schedule::findOne($value);
|
$schedule = Schedule::findOne($value);
|
||||||
|
@ -394,28 +383,29 @@ class DeviceController extends Controller {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
$res = json_decode(common::requestToCardService("/SetDeviceData/TimeZone", [
|
$res = json_decode(common::requestToCardService("/SetDeviceData/TimeZone", [
|
||||||
"DeviceIP" => $post["ip"],
|
"DeviceIP" => $deviceInfo->ip_address,
|
||||||
"TimeZoneInfos" => $TimeZoneInfos
|
"TimeZoneInfos" => $TimeZoneInfos
|
||||||
]), true);
|
]), true);
|
||||||
return [
|
return [
|
||||||
|
"IP" => $deviceInfo->ip_address,
|
||||||
"res" => $res,
|
"res" => $res,
|
||||||
"IP" => $post["ip"]
|
"staffs" => count($staffs)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function actionSyncStaffs() {
|
public function actionSyncStaff($page = 1) {
|
||||||
if (Yii::$app->request->post()) {
|
if (Yii::$app->request->post()) {
|
||||||
Yii::$app->response->format = "json";
|
Yii::$app->response->format = "json";
|
||||||
$post = Yii::$app->request->post();
|
$device_id = Yii::$app->request->post("data");
|
||||||
$device_id = Device::findOne(['ip_address' => $post['ip']])->id;
|
$deviceInfo = $this->findModel($device_id);
|
||||||
$doors = Door::find()->andWhere(["device_id" => $device_id])->all();
|
$doors = Door::find()->andWhere(["device_id" => $device_id])->all();
|
||||||
$filter = ["OR"];
|
$filter = ["OR"];
|
||||||
foreach ($doors as $key => $value) {
|
foreach ($doors as $key => $value) {
|
||||||
$filter[] = ["LIKE", "door_access", '"' . $value->id . '"'];
|
$filter[] = ["LIKE", "door_access", '"' . $value->id . '"'];
|
||||||
}
|
}
|
||||||
$staff_lists = Staff::find()->andWhere($filter)->all();
|
$offset = ($page - 1) * 200;
|
||||||
|
$staff_lists = Staff::find()->andWhere($filter)->limit(200)->offset($offset)->all();
|
||||||
$UserInfos = [];
|
$UserInfos = [];
|
||||||
$UserAuthorizeInfos = [];
|
$UserAuthorizeInfos = [];
|
||||||
|
|
||||||
|
@ -441,17 +431,19 @@ class DeviceController extends Controller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$resUser = json_decode(common::requestToCardService("/SetDeviceData/User", [
|
json_decode(common::requestToCardService("/SetDeviceData/User", [
|
||||||
"DeviceIP" => $post["ip"],
|
"DeviceIP" => $deviceInfo->ip_address,
|
||||||
"UserInfos" => $UserInfos
|
"UserInfos" => $UserInfos
|
||||||
]), true);
|
]), true);
|
||||||
common::requestToCardService("/SetDeviceData/UserAuthorize", [
|
common::requestToCardService("/SetDeviceData/UserAuthorize", [
|
||||||
"DeviceIP" => $post["ip"],
|
"DeviceIP" => $deviceInfo->ip_address,
|
||||||
"UserAuthorizeInfos" => $UserAuthorizeInfos
|
"UserAuthorizeInfos" => $UserAuthorizeInfos
|
||||||
]);
|
]);
|
||||||
return [
|
return [
|
||||||
"resUser" => $resUser,
|
"IP" => $deviceInfo->ip_address,
|
||||||
"IP" => $post["ip"]
|
"staff" => count($UserInfos),
|
||||||
|
"from" => $offset + 1,
|
||||||
|
"to" => $offset + count($UserInfos)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,4 +24,10 @@ class DeviceGrid extends CommonGrid {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function checkbox($type, $haveRoot = true) {
|
||||||
|
return function($model) use ($type) {
|
||||||
|
return "<input type='checkbox' value='{$model->id}' data='{$model->ip_address}' name='checkbox-{$type}' class='checkbox-{$type}'>";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
{DeviceAsset::register($this)|void}
|
{DeviceAsset::register($this)|void}
|
||||||
{block name='content'}
|
{block name='content'}
|
||||||
<div class="device-index">
|
<div class="device-index">
|
||||||
|
<input type='hidden' name='URL_sync_schedule' value="{Url::to(['sync-schedule'])}">
|
||||||
|
<input type='hidden' name='URL_sync_staff' value="{Url::to(['sync-staff'])}">
|
||||||
|
|
||||||
<input type='hidden' name='get_data_sync_url' value="{Url::to(['get-data-sync'])}">
|
<input type='hidden' name='get_data_sync_url' value="{Url::to(['get-data-sync'])}">
|
||||||
<input type='hidden' name='sync_schedule_url' value="{Url::to(['sync-schedule'])}">
|
<input type='hidden' name='sync_schedule_url' value="{Url::to(['sync-schedule'])}">
|
||||||
<input type='hidden' name='sync_staffs_url' value="{Url::to(['sync-staffs'])}">
|
<input type='hidden' name='sync_staffs_url' value="{Url::to(['sync-staffs'])}">
|
||||||
|
@ -61,7 +64,7 @@
|
||||||
'format' => 'raw',
|
'format' => 'raw',
|
||||||
'contentOptions' => ['class' => 'text-center'],
|
'contentOptions' => ['class' => 'text-center'],
|
||||||
'headerOptions' => ['class' => 'text-center', 'style' => 'width:3%'],
|
'headerOptions' => ['class' => 'text-center', 'style' => 'width:3%'],
|
||||||
'value' => \app\helpers\CommonGrid::checkbox("device", false)
|
'value' => \app\helpers\DeviceGrid::checkbox("device", false)
|
||||||
],
|
],
|
||||||
'name',
|
'name',
|
||||||
'serial',
|
'serial',
|
||||||
|
|
167
web/js/device.js
167
web/js/device.js
|
@ -248,10 +248,18 @@ function changeIP(e) {
|
||||||
|
|
||||||
var progress = 0;
|
var progress = 0;
|
||||||
var totals = 0;
|
var totals = 0;
|
||||||
function _sync(e) {
|
var index = 0;
|
||||||
|
var totalPage = 0;
|
||||||
|
var currentPage = 1;
|
||||||
|
var secondIncrement = 0;
|
||||||
|
|
||||||
|
async function _sync(e) {
|
||||||
var lists = [];
|
var lists = [];
|
||||||
$.each($("input[name='checkbox-device']:checked"), function () {
|
$.each($("input[name='checkbox-device']:checked"), function () {
|
||||||
lists.push($(this).val());
|
lists.push({
|
||||||
|
id: $(this).val(),
|
||||||
|
ip: $(this).attr("data")
|
||||||
|
});
|
||||||
});
|
});
|
||||||
if (lists.length == 0) {
|
if (lists.length == 0) {
|
||||||
alert("Vui lòng lựa chọn đối tượng!");
|
alert("Vui lòng lựa chọn đối tượng!");
|
||||||
|
@ -269,10 +277,8 @@ function _sync(e) {
|
||||||
common.modalOpen(data.form, false, data.title);
|
common.modalOpen(data.form, false, data.title);
|
||||||
$("#close-modal").attr("disabled", true);
|
$("#close-modal").attr("disabled", true);
|
||||||
$("#modalHeader").find("button").remove();
|
$("#modalHeader").find("button").remove();
|
||||||
totals = data.lists.length * 2;
|
totals = data.lists.length;
|
||||||
for (var i = 0; i < data.lists.length; i++) {
|
syncSchedule(data.lists[index].id, data.lists[index].ip, data);
|
||||||
getDataSync(data.lists[i]);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
error: function (jqXHR, textStatus, errorThrown) {
|
error: function (jqXHR, textStatus, errorThrown) {
|
||||||
common.modalBlock(false);
|
common.modalBlock(false);
|
||||||
|
@ -281,6 +287,71 @@ function _sync(e) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function syncSchedule(device_id, device_ip, fullData) {
|
||||||
|
appendLogs("[" + device_ip + "] Bắt đầu đồng bộ dữ liệu tới thiết bị", "blue", "minus");
|
||||||
|
$.ajax({
|
||||||
|
url: $("input[name='URL_sync_schedule']").val(),
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
data: device_id
|
||||||
|
},
|
||||||
|
success: function (data) {
|
||||||
|
var totalsStaff = data.staffs;
|
||||||
|
totalPage = parseInt(totalsStaff / 200);
|
||||||
|
if (totalsStaff % 200 > 0)
|
||||||
|
totalPage++;
|
||||||
|
secondIncrement = 1 / (totalPage + 1);
|
||||||
|
if (data.res.ErrorCode == "-1") {
|
||||||
|
appendLogs("[" + data.IP + "] Đồng bộ lịch trình tới thiết bị thất bại", "red", "remove");
|
||||||
|
index++;
|
||||||
|
if (index < totals)
|
||||||
|
syncSchedule(fullData.lists[index].id, fullData.lists[index].ip, fullData);
|
||||||
|
else {
|
||||||
|
index = 0;
|
||||||
|
processProgress(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
appendLogs("[" + data.IP + "] Đồng bộ lịch trình tới thiết bị thành công", "green", "check");
|
||||||
|
syncStaffs(device_id, device_ip, currentPage, fullData);
|
||||||
|
processProgress(secondIncrement);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (jqXHR, textStatus, errorThrown) {
|
||||||
|
common.ajaxError();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncStaffs(device_id, device_ip, page, fullData) {
|
||||||
|
appendLogs("[" + device_ip + "] Đồng bộ dữ liệu nhân viên tới thiết bị", "", "minus");
|
||||||
|
$.ajax({
|
||||||
|
url: $("input[name='URL_sync_staff']").val() + "?page=" + page,
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
data: device_id
|
||||||
|
},
|
||||||
|
success: function (data) {
|
||||||
|
appendLogs("[" + data.IP + "] Đồng bộ dữ liệu " + data.staff + " nhân viên từ " + data.from + " đến " + data.to + " tới thiết bị", "green", "check");
|
||||||
|
processProgress(secondIncrement);
|
||||||
|
currentPage++;
|
||||||
|
if (currentPage <= totalPage)
|
||||||
|
syncStaffs(device_id, device_ip, currentPage, fullData);
|
||||||
|
else {
|
||||||
|
currentPage = 1;
|
||||||
|
index++;
|
||||||
|
if (index < totals)
|
||||||
|
syncSchedule(fullData.lists[index].id, fullData.lists[index].ip, fullData);
|
||||||
|
else {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (jqXHR, textStatus, errorThrown) {
|
||||||
|
common.ajaxError();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function getDataSync(data) {
|
function getDataSync(data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: $("input[name='get_data_sync_url']").val(),
|
url: $("input[name='get_data_sync_url']").val(),
|
||||||
|
@ -315,72 +386,6 @@ function getDataSync(data) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function syncSchedule(schedule, ip) {
|
|
||||||
$.ajax({
|
|
||||||
url: $("input[name='sync_schedule_url']").val(),
|
|
||||||
type: 'POST',
|
|
||||||
data: {
|
|
||||||
data: schedule,
|
|
||||||
ip: ip
|
|
||||||
},
|
|
||||||
success: function (data) {
|
|
||||||
console.log("sync schedule: ", data.res);
|
|
||||||
var html = "";
|
|
||||||
html = "<span class='text-green'><i class='fa fa-check'></i> Đồng bộ lịch trình tới thiết bị <b>" + data.IP + "</b>.</span><br>";
|
|
||||||
progress++;
|
|
||||||
if (data.res.ErrorCode == "-1") {
|
|
||||||
html = "<span class='text-red'><i class='fa fa-remove'></i> Đồng bộ tới thiết bị <b>" + data.IP + "</b> thất bại.</span><br>";
|
|
||||||
progress++;
|
|
||||||
} else {
|
|
||||||
syncStaffs(ip);
|
|
||||||
}
|
|
||||||
$("#logs-response").append(html);
|
|
||||||
var percent = parseInt(progress / totals * 100);
|
|
||||||
$("#progress").attr("aria-valuenow", percent);
|
|
||||||
$("#progress").attr("style", "width: " + percent + "%");
|
|
||||||
$("#progress").html(percent + "%");
|
|
||||||
if (percent >= 100) {
|
|
||||||
progress = 0;
|
|
||||||
$("#close-modal").attr("disabled", false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: function (jqXHR, textStatus, errorThrown) {
|
|
||||||
common.ajaxError();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function syncStaffs(ip) {
|
|
||||||
$.ajax({
|
|
||||||
url: $("input[name='sync_staffs_url']").val(),
|
|
||||||
type: 'POST',
|
|
||||||
data: {
|
|
||||||
ip: ip
|
|
||||||
},
|
|
||||||
success: function (data) {
|
|
||||||
console.log("sync user: ", data.resUser);
|
|
||||||
var html = "";
|
|
||||||
html = "<span class='text-green'><i class='fa fa-check'></i> Đồng bộ nhân viên tới thiết bị <b>" + data.IP + "</b>.</span><br>";
|
|
||||||
if (data.res.ErrorCode == "-1") {
|
|
||||||
html = "<span class='text-red'><i class='fa fa-remove'></i> Đồng bộ nhân viên tới thiết bị <b>" + data.IP + "</b> thất bại.</span><br>";
|
|
||||||
}
|
|
||||||
$("#logs-response").append(html);
|
|
||||||
progress++;
|
|
||||||
var percent = parseInt(progress / totals * 100);
|
|
||||||
$("#progress").attr("aria-valuenow", percent);
|
|
||||||
$("#progress").attr("style", "width: " + percent + "%");
|
|
||||||
$("#progress").html(percent + "%");
|
|
||||||
if (percent >= 100) {
|
|
||||||
progress = 0;
|
|
||||||
$("#close-modal").attr("disabled", false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: function (jqXHR, textStatus, errorThrown) {
|
|
||||||
common.ajaxError();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var progressLogs = 0;
|
var progressLogs = 0;
|
||||||
var totalsLogs = 0;
|
var totalsLogs = 0;
|
||||||
function _getLogs(e) {
|
function _getLogs(e) {
|
||||||
|
@ -443,3 +448,21 @@ function syncLogs(data) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function appendLogs(text, cls, icon) {
|
||||||
|
var html = "<span class='text-" + cls + "'><i class='fa fa-" + icon + "'></i> " + text + "</span><br>";
|
||||||
|
$("#logs-response").prepend(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
function processProgress(ai) {
|
||||||
|
progress = progress + ai;
|
||||||
|
var percent = parseInt(progress / totals * 100);
|
||||||
|
if (percent >= 98)
|
||||||
|
percent = 100;
|
||||||
|
$("#progress").attr("aria-valuenow", percent);
|
||||||
|
$("#progress").attr("style", "width: " + percent + "%");
|
||||||
|
$("#progress").html(percent + "%");
|
||||||
|
if (percent >= 100) {
|
||||||
|
progress = 0;
|
||||||
|
$("#close-modal").attr("disabled", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user