This commit is contained in:
dev02 2023-01-10 16:05:34 +08:00
commit b0e9ba73f0
25 changed files with 1541 additions and 880 deletions

View File

@ -777,6 +777,11 @@ namespace Backend.Controllers
{ {
device_guid_record = device_guid.ToString(); device_guid_record = device_guid.ToString();
node_priority = 1; node_priority = 1;
Dictionary<string, object> deviceForLight = new Dictionary<string, object>();
deviceForLight.Add("@device_coordinate_3d", idfc.device_coordinate_3d);
deviceForLight.Add("@forge_dbid", idfc.forge_dbid);
deviceForLight.Add("@updated_at", DateTime.Now);
await backendRepository.UpdateOneByCustomTable(deviceForLight, "device", $@" device_guid = '{device_guid}'");
} }
//燈具 //燈具
@ -798,11 +803,9 @@ namespace Backend.Controllers
Dictionary<string, object> device = new Dictionary<string, object>(); Dictionary<string, object> device = new Dictionary<string, object>();
device.Add("@device_coordinate_3d", idfc.device_coordinate_3d); device.Add("@device_coordinate_3d", idfc.device_coordinate_3d);
device.Add("@forge_dbid", idfc.forge_dbid); device.Add("@forge_dbid", idfc.forge_dbid);
device.Add("@updated_at", DateTime.Now);
await backendRepository.UpdateOneByCustomTable(device, "device", $@" device_number = '{idfc.device_number}'"); await backendRepository.UpdateOneByCustomTable(device, "device", $@" device_number = '{idfc.device_number}'");
} }
} }
} }
apiResult.Code = "0000"; apiResult.Code = "0000";
@ -823,5 +826,91 @@ namespace Backend.Controllers
return apiResult; return apiResult;
} }
/// <summary>
/// 更新forge_room room_id(dbid), room_name
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> ImportForgeRoom([FromBody] List<ImportForgeRoom> post)
{
ApiResult<string> apiResult = new ApiResult<string>();
//var device_guid_record = "";
try
{
if (post != null)
{
if (post.Count > 0)
{
//清空device_node資料表
await backendRepository.TruncateTable("forge_room");
foreach (var idfc in post)
{
// var room_name_arr = idfc.room_name.Split('_');
string full_name = idfc.room_name;
char first = full_name[0];
if (first != 'B' && first != 'R' && first != 'U')
{
full_name = 'U' + full_name;
}
//var param = new { floor_name = floor_name };
//房間 新增Data至forge_room資料表
Dictionary<string, object> room = new Dictionary<string, object>();
room.Add("@room_id", idfc.room_id);
room.Add("@deleted", 0);
room.Add("@room_name", full_name);
room.Add("@created_at", DateTime.Now);
await backendRepository.AddOneByCustomTableReturnId(room, "forge_room", false);
}
//更新forge_room資料表 building_tag, floor_guid欄位
string sql = @"
update forge_room a
join (
select building_tag, floor_guid,
case when right(floor_name, 1) = 'F' then floor_name
else CONCAT(floor_name, 'F') end floor_name , priority
from (
SELECT
a.building_tag,
a.floor_guid, a.full_name,
case when left(a.full_name, 1) = 'B' then a.full_name
when left(a.full_name, 1) = 'R' then a.full_name
when left(a.full_name, 1) = 'U' then a.full_name
else CONCAT('U', a.full_name) end as floor_name,
a.priority
FROM floor AS a
INNER JOIN building AS b ON a.building_tag = b.building_tag
WHERE a.deleted = 0 AND b.deleted = 0
)y
)x on SUBSTRING_INDEX(a.room_name, '_', 1) = x.floor_name
set a.building_tag = x.building_tag,
a.floor_guid = x.floor_guid";
await backendRepository.ExecuteSql(sql);
}
apiResult.Code = "0000";
apiResult.Msg = "編輯成功";
}
else
{
apiResult.Code = "0001";
apiResult.Msg = "無資料輸入";
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
} }
} }

View File

@ -270,4 +270,23 @@ namespace Backend.Models
public string device_coordinate_3d { get; set; } public string device_coordinate_3d { get; set; }
public int forge_dbid { get; set; } public int forge_dbid { get; set; }
} }
public class ImportForgeRoom
{
public string building_tag { get; set; }
public string floor_guid { get; set; }
public int room_id { get; set; }
public int deleted { get; set; }
public string room_name { get; set; }
public string created_at { get; set; }
}
public class Import_floor_data
{
public string building_tag { get; set; }
public string floor_guid { get; set; }
public string floor_name { get; set; }
public int priority { get; set; }
}
} }

View File

@ -54,11 +54,9 @@
<th>左邊預設頁面</th> <th>左邊預設頁面</th>
<th>左邊是否顯示<br>平面圖</th> <th>左邊是否顯示<br>平面圖</th>
<th>左邊昇位圖<br>詳細資料設定</th> <th>左邊昇位圖<br>詳細資料設定</th>
<th>左邊昇位圖<br>詳細資料URL</th>
<th>右邊預設頁面</th> <th>右邊預設頁面</th>
<th>右邊是否顯示<br>平面圖</th> <th>右邊是否顯示<br>平面圖</th>
<th>右邊昇位圖<br>詳細資料設定</th> <th>右邊昇位圖<br>詳細資料設定</th>
<th>右邊昇位圖<br>詳細資料URL</th>
@*<th>昇位圖URL</th>*@ @*<th>昇位圖URL</th>*@
<th>功能</th> <th>功能</th>
</tr> </tr>
@ -215,12 +213,12 @@
<div class="col"> <div class="col">
<div class="custom-control custom-checkbox"> <div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="icon_click[]" id="icon_click_url" value="1"> <input type="checkbox" class="custom-control-input" name="icon_click[]" id="icon_click_url" value="1">
<label class="custom-control-label" for="icon_click_url">顯示詳細資料</label> <label class="custom-control-label" for="icon_click_url">顯示詳細資料 - (抓取設備八段路徑呈現詳細資料)</label>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group col-12" id="build_menu_icon_click_url_modal_div" name="drawing_extend"> @*<div class="form-group col-12" id="build_menu_icon_click_url_modal_div" name="drawing_extend">
<label class="form-label" for="build_menu_icon_click_url_modal">詳細資料 URL</label><br> <label class="form-label" for="build_menu_icon_click_url_modal">詳細資料 URL</label><br>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_building_tag', 'l')">+/[device_building_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_building_tag', 'l')">+/[device_building_tag]</button>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_system_tag', 'l')">+/[device_system_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_system_tag', 'l')">+/[device_system_tag]</button>
@ -229,7 +227,7 @@
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_serial_tag', 'l')">+/[device_serial_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_serial_tag', 'l')">+/[device_serial_tag]</button>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('tag_name', 'l')">+/[tag_name]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('tag_name', 'l')">+/[tag_name]</button>
<input type="text" id="build_menu_icon_click_url_modal" class="form-control"> <input type="text" id="build_menu_icon_click_url_modal" class="form-control">
</div> </div>*@
<div class="form-group col-12" id="build_menu_icon_click_url_width_height_modal_div"> <div class="form-group col-12" id="build_menu_icon_click_url_width_height_modal_div">
<label class="form-label">詳細資料 顯示視窗設定</label><br> <label class="form-label">詳細資料 顯示視窗設定</label><br>
<div class="row"> <div class="row">
@ -340,12 +338,12 @@
<div class="col"> <div class="col">
<div class="custom-control custom-checkbox"> <div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="icon_click[]_r" id="icon_click_url_r" value="1"> <input type="checkbox" class="custom-control-input" name="icon_click[]_r" id="icon_click_url_r" value="1">
<label class="custom-control-label" for="icon_click_url_r">顯示詳細資料</label> <label class="custom-control-label" for="icon_click_url_r">顯示詳細資料 - (抓取設備八段路徑呈現詳細資料)</label>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group col-12" id="build_menu_icon_click_url_modal_div_r" name="drawing_extend_r"> @*<div class="form-group col-12" id="build_menu_icon_click_url_modal_div_r" name="drawing_extend_r">
<label class="form-label" for="build_menu_icon_click_url_modal_r">詳細資料 URL</label><br> <label class="form-label" for="build_menu_icon_click_url_modal_r">詳細資料 URL</label><br>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_building_tag')">+/[device_building_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_building_tag')">+/[device_building_tag]</button>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_system_tag')">+/[device_system_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_system_tag')">+/[device_system_tag]</button>
@ -354,7 +352,7 @@
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_serial_tag')">+/[device_serial_tag]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('device_serial_tag')">+/[device_serial_tag]</button>
<button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('tag_name')">+/[tag_name]</button> <button type="button" class="btn btn-secondary waves-effect waves-themed mb-2" onclick="AddTagIntoClickUrl('tag_name')">+/[tag_name]</button>
<input type="text" id="build_menu_icon_click_url_modal_r" class="form-control"> <input type="text" id="build_menu_icon_click_url_modal_r" class="form-control">
</div> </div>*@
<div class="form-group col-12" id="build_menu_icon_click_url_width_height_modal_div_r"> <div class="form-group col-12" id="build_menu_icon_click_url_width_height_modal_div_r">
<label class="form-label">詳細資料 顯示視窗設定</label><br> <label class="form-label">詳細資料 顯示視窗設定</label><br>
<div class="row"> <div class="row">
@ -478,14 +476,14 @@
str.push("點擊開關") str.push("點擊開關")
} }
if (1 & parseInt(data) > 0) { if (1 & parseInt(data) > 0) {
str.push("顯示詳細資料") str.push("顯示詳細資料 - (抓取設備八段路徑呈現詳細資料)")
} }
return str.join(";"); return str.join(";");
} }
}, },
{ //{
"data": "left_icon_click_url" // "data": "left_icon_click_url"
}, //},
{ {
"data": "right_drawing_name" "data": "right_drawing_name"
}, },
@ -500,14 +498,14 @@
str.push("點擊開關") str.push("點擊開關")
} }
if (1 & parseInt(data) > 0) { if (1 & parseInt(data) > 0) {
str.push("顯示詳細資料") str.push("顯示詳細資料 - (抓取設備八段路徑呈現詳細資料)")
} }
return str.join(";"); return str.join(";");
} }
}, },
{ //{
"data": "right_icon_click_url" // "data": "right_icon_click_url"
}, //},
{ {
"data": null, "data": null,
"render": function (data, type, row, meta){ "render": function (data, type, row, meta){
@ -542,13 +540,13 @@
$.each(this.data, function (k, rel) { $.each(this.data, function (k, rel) {
rel.sub_system_guid_name = "<font color='#7c91df'>" + rel.sub_system_guid_name + "</font>" rel.sub_system_guid_name = "<font color='#7c91df'>" + rel.sub_system_guid_name + "</font>"
if (rel.left_drawing == 2) { if (rel.left_drawing == 2) {
rel.left_drawing_name = rel.left_drawing_name + "<br>" + '<a href = "' + rel.system_url + '" target="_blank" >點擊連結</a >' rel.left_drawing_name = rel.left_drawing_name + "<br>" + '<a href = "' + rel.left_system_url + '" target="_blank" >點擊連結</a >'
} }
if (rel.left_drawing == 1) { if (rel.left_drawing == 1) {
rel.left_drawing_name = rel.left_drawing_name + "<br>" + '[' + rel.floor_guid_name + ']' rel.left_drawing_name = rel.left_drawing_name + "<br>" + '[' + rel.floor_guid_name + ']'
} }
if (rel.right_drawing == 2) { if (rel.right_drawing == 2) {
rel.right_drawing_name = rel.right_drawing_name + "<br>" + '<a href = "' + rel.system_url + '" target="_blank" >點擊連結</a >' rel.right_drawing_name = rel.right_drawing_name + "<br>" + '<a href = "' + rel.right_system_url + '" target="_blank" >點擊連結</a >'
} }
if (rel.right_drawing == 1) { if (rel.right_drawing == 1) {
rel.right_drawing_name = rel.right_drawing_name + "<br>" + '[' + rel.floor_guid_name + ']' rel.right_drawing_name = rel.right_drawing_name + "<br>" + '[' + rel.floor_guid_name + ']'
@ -787,20 +785,20 @@
//#endregion //#endregion
$('#build_menu_icon_click_onoff_modal_div').on("click", "input[type=checkbox]", function () { $('#build_menu_icon_click_onoff_modal_div').on("click", "input[type=checkbox]", function () {
if ($(this).prop("checked") && $(this).val() == 1) { if ($(this).prop("checked") && $(this).val() == 1) {
$('#build_menu_icon_click_url_modal_div').show(); //$('#build_menu_icon_click_url_modal_div').show();
$('#build_menu_icon_click_url_width_height_modal_div').show(); $('#build_menu_icon_click_url_width_height_modal_div').show();
} else { } else {
$('#build_menu_icon_click_url_modal_div').hide(); //$('#build_menu_icon_click_url_modal_div').hide();
$('#build_menu_icon_click_url_width_height_modal_div').hide(); $('#build_menu_icon_click_url_width_height_modal_div').hide();
} }
}); });
$('#build_menu_icon_click_onoff_modal_div_r').on("click", "input[type=checkbox]", function () { $('#build_menu_icon_click_onoff_modal_div_r').on("click", "input[type=checkbox]", function () {
if ($(this).prop("checked") && $(this).val() == 1) { if ($(this).prop("checked") && $(this).val() == 1) {
$('#build_menu_icon_click_url_modal_div_r').show(); //$('#build_menu_icon_click_url_modal_div_r').show();
$('#build_menu_icon_click_url_width_height_modal_div_r').show(); $('#build_menu_icon_click_url_width_height_modal_div_r').show();
} else { } else {
$('#build_menu_icon_click_url_modal_div_r').hide(); //$('#build_menu_icon_click_url_modal_div_r').hide();
$('#build_menu_icon_click_url_width_height_modal_div_r').hide(); $('#build_menu_icon_click_url_width_height_modal_div_r').hide();
} }
}); });
@ -977,7 +975,7 @@
let drawingParent = $(value).parents("[id^=build_menu_position]") let drawingParent = $(value).parents("[id^=build_menu_position]")
$(drawingParent).find('[id^=build_menu_icon_click_onoff_modal_div]').hide(); $(drawingParent).find('[id^=build_menu_icon_click_onoff_modal_div]').hide();
$(drawingParent).find('[id^=build_menu_blankurl_modal_div]').hide(); $(drawingParent).find('[id^=build_menu_blankurl_modal_div]').hide();
$(drawingParent).find('[id^=build_menu_icon_click_url_modal_div]').hide(); //$(drawingParent).find('[id^=build_menu_icon_click_url_modal_div]').hide();
$(drawingParent).find('[id^=build_menu_icon_click_url_width_height_modal_div]').hide(); $(drawingParent).find('[id^=build_menu_icon_click_url_width_height_modal_div]').hide();
$(drawingParent).find('[id^=build_menu_planimetric_floor_modal_div]').hide(); $(drawingParent).find('[id^=build_menu_planimetric_floor_modal_div]').hide();
$(drawingParent).find('[id^=build_menu_systemurl_modal_div]').hide(); $(drawingParent).find('[id^=build_menu_systemurl_modal_div]').hide();
@ -989,7 +987,7 @@
$(drawingParent).find('[id^="planimetric_click"]').attr("disabled", false); $(drawingParent).find('[id^="planimetric_click"]').attr("disabled", false);
$(drawingParent).find('[id^=build_menu_icon_click_onoff_modal_div]').show(); $(drawingParent).find('[id^=build_menu_icon_click_onoff_modal_div]').show();
if ($(drawingParent).find("[id^=icon_click_url]").prop('checked')) { if ($(drawingParent).find("[id^=icon_click_url]").prop('checked')) {
$(drawingParent).find('[id^=build_menu_icon_click_url_modal_div]').show(); //$(drawingParent).find('[id^=build_menu_icon_click_url_modal_div]').show();
$(drawingParent).find('[id^=build_menu_icon_click_url_width_height_modal_div]').show(); $(drawingParent).find('[id^=build_menu_icon_click_url_width_height_modal_div]').show();
} }
} else if ($(value).val() == 1) { } else if ($(value).val() == 1) {

View File

@ -40,7 +40,7 @@
<button type="button" class="btn btn-dark" onclick="cancelTransparentModel()">取消透明物件</button> <button type="button" class="btn btn-dark" onclick="cancelTransparentModel()">取消透明物件</button>
<button type="button" class="btn btn-danger" onclick="proFile()">剖面</button> <button type="button" class="btn btn-danger" onclick="proFile()">剖面</button>
<button type="button" class="btn btn-dark" onclick="getLevels()">取得levels</button> <button type="button" class="btn btn-dark" onclick="getLevels()">取得levels</button>
<button type="button" class="btn btn-success" onclick="importDevCor()">匯入設備座標及dbid</button> <button type="button" class="btn btn-success" onclick="importDevCor()">匯入設備座標及房間等dbid</button>
<!--<input id="lightBar" type="range" min="0" max="100" step="5" onchange="changeLightPower()">亮度--> <!--<input id="lightBar" type="range" min="0" max="100" step="5" onchange="changeLightPower()">亮度-->
<!-- <input type="range">Main Axis</input> --> <!-- <input type="range">Main Axis</input> -->
</div> </div>
@ -240,8 +240,13 @@
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA');
//雙模式 //雙模式
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA=='); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA==');
//01.06 樓層刪除燈具
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1vZGVsX3Rlc3QxMTIxLyVFMyU4MCU5MCVFNSU4RiVCMCVFNSU4QyU5NyVFNCVCOCVBRCVFOCU4RiVCMSVFNSVBNCVBNyVFNiVBOCU5MyVFMyU4MCU5MUFSQyVFOSU5QiU5OSVFNiVBOCVBMSVFNSVCQyU4RitNRVAlRTYlOEIlODYlRTclQjMlQkIlRTclQjUlQjFfJUU1JTg4JUFBJUU3JTg3JTg4JUU1JTg1JUI3XzIwMjNfMDFfMDYubndk');
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1vZGVsX3Rlc3QxMTIxLyVFMyU4MCU5MCVFNSU4RiVCMCVFNSU4QyU5NyVFNCVCOCVBRCVFOCU4RiVCMSVFNSVBNCVBNyVFNiVBOCU5MyVFMyU4MCU5MUFSQyVFOSU5QiU5OSVFNiVBOCVBMSVFNSVCQyU4RitNRVAlRTYlOEIlODYlRTclQjMlQkIlRTclQjUlQjFfJUU1JTg4JUFBJUU3JTg3JTg4JUU1JTg1JUI3XzIwMjNfMDFfMDYubndk');
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxXzIwMjJfMTJfMTMubndk');//new ARC //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxXzIwMjJfMTJfMTMubndk');//new ARC
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwTUVQJUUzJTgwJTkxXzIwMjJfMTJfMTMubndj');//new MEP //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwTUVQJUUzJTgwJTkxXzIwMjJfMTJfMTMubndj');//new MEP
@ -381,6 +386,7 @@
function importDevCor() { function importDevCor() {
ImportDevForCor(); ImportDevForCor();
ImportForgeRoom();
} }
function ImportDevForCor() {//callback = null function ImportDevForCor() {//callback = null
@ -412,9 +418,38 @@
fail: function (xhr, status, error) { fail: function (xhr, status, error) {
} }
}); });
} }
function ImportForgeRoom() {
var url = "/DeviceImport/ImportForgeRoom";
$.ajax({
method: "POST",
url: url,
data: JSON.stringify(roomDataList),
cache: false,
async: false,
contentType: "application/json; charset=UTF-8",
dataType: 'json',
success: function (rel) {
if (rel.code != "0000") {
if (rel.code == "9999") {
console.log(rel.msg);
}
else {
console.log(rel.msg);
}
return;
}
else {
console.log(rel.msg);
return;
}
},
fail: function (xhr, status, error) {
}
});
}
</script> </script>

View File

@ -13,7 +13,8 @@ var levels;//剖面用
var baseApiUrl = "http://localhost:3604"; var baseApiUrl = "http://localhost:3604";
var instanceTree; var instanceTree;
//var objSendData = { Data: null }; //var objSendData = { Data: null };
var tagIdDevList = []; var tagIdDevList = [];//模型設備List: device_number、device_coordinate_3d、forge_dbid
var roomDataList = [];//模型房間List: room_id、room_name
function launchViewer(urn) { function launchViewer(urn) {
var av = Autodesk.Viewing; var av = Autodesk.Viewing;
@ -274,39 +275,36 @@ function onDocumentLoadSuccess(doc) {
e.properties.forEach(function (item) { e.properties.forEach(function (item) {
if (item.displayName == "【tag_id】") { // Tag_name tag_id 【tag_id】 if (item.displayName == "【tag_id】") { // Tag_name tag_id 【tag_id】
if (item.displayValue != "") { if (item.displayValue != "") {
//if ((item.displayValue).indexOf('TPE_B1_ME_M10') > -1) { ////if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {// TPE_B1_ME_M10
console.log("--------------------------------------------------"); //console.log("--------------------------------------------------");
console.log("Tag_name dbid: " + e.dbId); //console.log("Tag_name dbid: " + e.dbId);
console.log("value: " + item.displayValue); //console.log("value: " + item.displayValue);
////}
//myDataList.forEach((myData, index) => { var str = item.displayValue.split('_');
// devices.push({ id: index, position: JSON.parse(myData.device_coordinate_3d), sensorTypes: ["temperature", "humidity"] }); if (str.length == 2) { //兩段為房間 ex: U7F_01
//}); roomDataList.push({ room_id: e.dbId, room_name: item.displayValue });
//} }
else if (str.length == 8) { //八段為設備 ex: TPE_B1_ME_M10_U7F_NA_FCU_N1
let bounds = new THREE.Box3(); //取得座標
let bounds = new THREE.Box3();
instanceTree.enumNodeFragments(e.dbId, (fragId) => {
let box = new THREE.Box3();
fragList.getWorldBounds(fragId, box);
bounds.union(box);
}, true);
var position = bounds.center();
////if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {
//console.log("position: (" + (position.x).toFixed(2) + ", " + (position.y).toFixed(2) + ", " + (position.z).toFixed(2) + ")");
//console.log("--------------------------------------------------");
////}
tagIdDevList.push({ device_number: item.displayValue, device_coordinate_3d: '{ "x": ' + (position.x).toFixed(2) + ', "y": ' + (position.y).toFixed(2) + ', "z": ' + (position.z).toFixed(2) + ' }', forge_dbid: e.dbId });
}
instanceTree.enumNodeFragments(e.dbId, (fragId) => {
let box = new THREE.Box3();
fragList.getWorldBounds(fragId, box);
bounds.union(box);
}, true);
var position = bounds.center();
//if ((item.displayValue).indexOf('TPE_B1_ME_M10') > -1) {
console.log("position: (" + (position.x).toFixed(2) + ", " + (position.y).toFixed(2) + ", " + (position.z).toFixed(2) + ")");
tagIdDevList.push({ device_number: item.displayValue, device_coordinate_3d: '{ "x": ' + (position.x).toFixed(2) + ', "y": ' + (position.y).toFixed(2) + ', "z": ' + (position.z).toFixed(2) + ' }', forge_dbid: e.dbId });
console.log("--------------------------------------------------");
//}
} }
//getFragmentWorldMatrixByNodeId(e.dbId, viewer);
//let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
} }
}); });
}) })
}) })
//---------------------- end --------------------------------------------------- //---------------------- end ---------------------------------------------------
@ -792,8 +790,6 @@ function setElevatorSpeed(speed) { //0.01 ~ 1
} }
function movElevator() { function movElevator() {
let tree = viewer.model.getData().instanceTree;//三組:(749,750,751),(755,756,757),(761,762,763) let tree = viewer.model.getData().instanceTree;//三組:(749,750,751),(755,756,757),(761,762,763)
let nodeId = 12112;//12104; //749; //10952; let nodeId = 12112;//12104; //749; //10952;
let nodeId2 = 12111;//12105; //750; let nodeId2 = 12111;//12105; //750;
@ -908,64 +904,6 @@ function hideColor(nodeId) {//顏色改成透明
viewer.setThemingColor(nodeId, color); viewer.setThemingColor(nodeId, color);
} }
//function movElevator() {
// let tree = viewer.model.getData().instanceTree;
// let nodeId = 750;// 10952;
// let fragProxyZ = 0;
// var movStatus = 0; // 0=no 1=up 2=down
// if (fragProxy.position.z > targetFloorZ) {
// movStatus = 2
// }
// else if (fragProxy.position.z < targetFloorZ) {
// movStatus = 1
// }
// if (movStatus == 0) {
// return;
// }
// tree.enumNodeFragments(nodeId, function (frag) {
// fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// fragProxy.getAnimTransform();
// //let fragPosition = new THREE.Vector3(0, 0, 15);// 一樓0 二樓15 三樓 26
// if (movStatus == 2) {
// fragProxy.position.z -= elevatorSpeed;
// }
// else if (movStatus == 1) {
// fragProxy.position.z += elevatorSpeed;
// }
// fragProxyZ = fragProxy.position.z;
// fragProxy.updateAnimTransform()
// });
// viewer.impl.sceneUpdated(true);
// if (movStatus == 2) {
// if (fragProxyZ >= targetFloorZ) {
// requestAnimationFrame(movElevator);
// }
// }
// else if (movStatus == 1) {
// if (fragProxyZ <= targetFloorZ) {
// requestAnimationFrame(movElevator);
// }
// }
// //let fragPosition = new THREE.Vector3(position);// 一樓0 二樓15 三樓 26
// //fragProxy.position = fragPosition;
// //fragProxy.updateAnimTransform();
// //viewer.impl.sceneUpdated(true);
//}
function getAllDbIds(viewer) { function getAllDbIds(viewer) {
var instanceTree = viewer.model.getData().instanceTree; var instanceTree = viewer.model.getData().instanceTree;
@ -1025,10 +963,6 @@ function onButtonClicked() {
this.viewer.setCutPlanes([upperCutPlaneParam, lowerCutPlaneParam]); this.viewer.setCutPlanes([upperCutPlaneParam, lowerCutPlaneParam]);
} }
function displayCuttedPlane() {
}
/** /**
* Autodesk.Viewing.Document.load() failuire callback. * Autodesk.Viewing.Document.load() failuire callback.
*/ */
@ -1082,27 +1016,7 @@ async function loadHeatmaps(model) {
position: { x: 6.98, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (-4.93, -3.85, 16.86) position: { x: 6.98, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (-4.93, -3.85, 16.86)
sensorTypes: ["temperature", "humidity"] sensorTypes: ["temperature", "humidity"]
} }
//{
// id: "Oficina 5",
// //name: "Oficina-",
// position: { x: 3.35, y: -4.81, z: 12.88 }, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
// sensorTypes: ["temperature", "humidity"]
//},
//{
// id: "Oficina 4",
// //name: "Oficina-",
// position: { x: 37.03, y: -4.81, z: 12.88 }, // x: 0, y: 25.03, z: -2.52 (37.03, -4.81, 12.88)
// sensorTypes: ["temperature", "humidity"]
//},
//{
// id: "Oficina 3",
// //name: "Oficina-",
// position: { x: 2.83, y: -22.60, z: 12.88 }, // x: 0, y: 25.03, z: -2.52 (2.83, -22.60, 12.88)
// sensorTypes: ["temperature", "humidity"]
//}
]; ];
//冷氣N5: (6.98, -19.00, 16.86), N4: (35.85, -2.24, 16.86), N3: (6.98, -2.24, 16.86)
// Initialize sensor values // Initialize sensor values
let sensorVals = []; let sensorVals = [];
@ -1228,11 +1142,6 @@ async function loadHeatmap() {
function hideObject() { function hideObject() {
//viewer.hide(4); //viewer.hide(4);
//viewer.hide(58);
//viewer.hide(613);
//viewer.hide(640);
//viewer.hide(560);
for (var i = 0; i < allDbIdsStr.length; i++) { for (var i = 0; i < allDbIdsStr.length; i++) {
viewer.hide(parseInt(allDbIdsStr[i])); viewer.hide(parseInt(allDbIdsStr[i]));
} }
@ -1240,11 +1149,6 @@ function hideObject() {
function openObject() { function openObject() {
//viewer.show(4); //viewer.show(4);
//viewer.show(58);
//viewer.show(613);
//viewer.show(640);
//viewer.show(560);
for (var i = 0; i < allDbIdsStr.length; i++) { for (var i = 0; i < allDbIdsStr.length; i++) {
viewer.show(parseInt(allDbIdsStr[i])); viewer.show(parseInt(allDbIdsStr[i]));
} }
@ -1252,67 +1156,11 @@ function openObject() {
async function setObjectTransparent() { async function setObjectTransparent() {
//setTransparency(4, 0); //setTransparency(4, 0);
//setTransparency(58, 0);
//setTransparency(613, 0);
//setTransparency(640, 0);
//setTransparency(560, 0);
//setTransparency(parseInt(515), 0);
//for (var i = 0; i < allDbIdsStr.length; i++) {
// setTransparency(parseInt(allDbIdsStr[i]), 0);
//}
//setTransparency(parseInt(515), 0);
//setTransparency(parseInt(516), 0);
//setTransparency(parseInt(517), 0);
//setTransparency(parseInt(518), 0);
//setTransparency(parseInt(519), 0);
//setTransparency(parseInt(399), 0);
//setTransparency(parseInt(101), 0);
//setTransparency(parseInt(100), 0);
//setTransparency(parseInt(58), 0);
//setTransparency(parseInt(587), 0);
//setTransparency(parseInt(586), 0);
//setTransparency(parseInt(585), 0);
//setTransparency(parseInt(584), 0);
//setTransparency(parseInt(583), 0);
//setTransparency(parseInt(562), 0);
//setTransparency(parseInt(361), 0);
//test();
//hideColor(587);
//hideColor(586);
//hideColor(585);
//hideColor(584);
//hideColor(583);
//hideColor(562);
//hideColor(361);
setTransparentBuilding(); setTransparentBuilding();
} }
async function cancelObjectTransparent() { async function cancelObjectTransparent() {
//setTransparency(4, 1); //setTransparency(4, 1);
//setTransparency(58, 1);
//setTransparency(613, 1);
//setTransparency(640, 1);
//setTransparency(560, 1);
//for (var i = 0; i < allDbIdsStr.length; i++) {
// setTransparency(parseInt(allDbIdsStr[i]), 1);
//}
//setTransparency(515, 0.2);
//setTransparency(516, 0.2);
//setTransparency(517, 0.2);
//setTransparency(518, 0.2);
//setTransparency(519, 0.2);
//setTransparency(399, 0.2);
//setTransparency(101, 0.2);
//setTransparency(100, 0.2);
//setTransparency(58, 0.2);
recoverTransparentBuilding(); recoverTransparentBuilding();
} }
@ -1348,7 +1196,6 @@ async function test() {
} }
//------------ 剖面 ---------------------- //------------ 剖面 ----------------------
async function getRemoteLevels() { async function getRemoteLevels() {
const aecData = await Autodesk.Viewing.Document.getAecModelData(this.viewer.model.getDocumentNode()); const aecData = await Autodesk.Viewing.Document.getAecModelData(this.viewer.model.getDocumentNode());
@ -1364,26 +1211,6 @@ async function getLevelsData() {
this.levels = data; this.levels = data;
} }
//function getCutPlaneParam(idx, n) {
// if (idx < 0 || !n) return;
// const level = this.levels[idx];
// if (!level) return;
// //const precision = Autodesk.Viewing.Private.calculatePrecision( level.elevation );
// const model = this.viewer.model;
// const globalOffset = model.getData().globalOffset;
// const units = model.getUnitString();
// const elevRaw = Autodesk.Viewing.Private.convertUnits('ft', units, 1, level.elevation);
// let d = elevRaw - globalOffset.z - 0.5;
// if (n == 1)
// d = -1 * d;
// return new THREE.Vector4(0, 0, n, d);
//}
function profile() { function profile() {
const upperIdx = 6; const upperIdx = 6;
const upperCutPlaneParam = this.getCutPlaneParam(upperIdx, 1); const upperCutPlaneParam = this.getCutPlaneParam(upperIdx, 1);
@ -1393,71 +1220,3 @@ function profile() {
} }
//----------------- end ----------------------------------------------- //----------------- end -----------------------------------------------
// 設備的dbid和3D座標 存進 資料庫
//function ImportDevForCor() {//callback = null
// var url = "/DeviceImport/ImportDevForCor";
// //let sendData = {
// // "device_number": pageAct.AreaTag,
// // "device_coordinate_3d": "",
// // "device_dbid": "",
// //};
// objSendData.Data = tagIdDevList;
// //ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
// // if (!res || res.code != "0000" || !res.data) {
// // } else {
// // }
// //}, null, "POST").send();
// //$.post(url, objSendData, function (rel) {
// // if (rel.code != "0000") {
// // if (rel.code == "9999") {
// // toast_error(rel.msg);
// // }
// // else {
// // toast_warning(rel.msg);
// // }
// // return;
// // }
// // else {
// // toast_ok(rel.msg);
// // //ReloadRawDataCheckTable();
// // }
// //}, 'json');
// //headers={'content-type': 'application/json'}
// $.ajax({
// type: "POST",
// url: url,
// data: objSendData,
// cache: false,
// contentType: 'application/json',
// processData: false,
// success: function (rel) {
// //$("#save-building-btn").html('確定').attr("disabled", false);
// if (rel.code != "0000") {
// if (rel.code == "9999") {
// toast_error(rel.msg);
// }
// else {
// toast_warning(rel.msg);
// }
// return;
// }
// else {
// toast_ok(rel.msg);
// //buildInfoTable.ajax.reload(null, false);
// //$('#build-modal').modal('hide');
// return;
// }
// },
// fail: function (xhr, status, error) {
// //$("#save-building-btn").html('確定').attr("disabled", false);
// //toast_error(rel.msg);
// }
// });
//}

12
Frontend/Web.config Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<!--<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\Backend.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />-->
</system.webServer>
</location>
</configuration>
<!--ProjectGuid: C0B93B4D-F0AF-4C80-ABF9-5C984425749C-->

View File

@ -161,27 +161,16 @@
</div> </div>
<div class="col-sm-12 col-lg-4"> <div class="col-sm-12 col-lg-4">
<div class="row"> <div class="row h-100">
<div class="col-lg-6"> <div class="col-lg-6">
<div id="panel-3" class="panel" data-panel-sortable data-panel-collapsed data-panel-close> <div id="panel-3" class="panel" style="height: calc(100% - 1.5rem);">
<div class="panel-hdr"> <div class="panel-hdr">
<h2> <h2>
異常狀態 異常狀態
</h2> </h2>
</div> </div>
<div class="panel-container show"> <div class="panel-container h-100 show">
<div class="panel-content poisition-relative p-0"> <div class="panel-content poisition-relative p-0 row p-0 h-100">
<!--<div class="pb-5 pt-3">
<div class="d-flex mr-4">
<div class="mr-2">
<span class="peity-donut" data-peity="{ &quot;fill&quot;: [&quot;#967bbd&quot;, &quot;#ccbfdf&quot;], &quot;innerRadius&quot;: 14, &quot;radius&quot;: 20 }">7/10</span>
</div>
<div>
<label class="fs-sm mb-0 mt-2 mt-md-0">New Sessions</label>
<h4 class="font-weight-bold mb-0">70.60%</h4>
</div>
</div>
</div>-->
<div class="col-12 mb-2 position-relative row m-0 justify-content-center"> <div class="col-12 mb-2 position-relative row m-0 justify-content-center">
<canvas class="chart" id="errRecChart"></canvas> <canvas class="chart" id="errRecChart"></canvas>
</div> </div>
@ -193,34 +182,20 @@
</div> </div>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<div id="panel-3" class="panel" data-panel-sortable data-panel-collapsed data-panel-close> <div id="panel-3" class="panel" style="height: calc(100% - 1.5rem);">
<div class="panel-hdr"> <div class="panel-hdr">
<h2> <h2>
工單進度 工單進度
</h2> </h2>
</div> </div>
<div class="panel-container show"> <div class="panel-container h-100 show">
<div class="panel-content poisition-relative p-0"> <div class="panel-content poisition-relative row p-0 h-100 p-0">
<!--<div class="pb-5 pt-3">
<div class="d-flex mr-0">
<div class="mr-2">
<span class="peity-donut" data-peity="{ &quot;fill&quot;: [&quot;#2196F3&quot;, &quot;#9acffa&quot;], &quot;innerRadius&quot;: 14, &quot;radius&quot;: 20 }">3/10</span>
</div>
<div>
<label class="fs-sm mb-0 mt-2 mt-md-0">Page Views</label>
<h4 class="font-weight-bold mb-0">14,134</h4>
</div>
</div>
</div>-->
<div class="col-12 mb-2 position-relative row m-0 justify-content-center"> <div class="col-12 mb-2 position-relative row m-0 justify-content-center">
<span class="text-center position-absolute t-white" style="top:25%;left:27%;">已完成<br>6</span> <canvas class="chart" id="worOrdErrChart"></canvas>
<img src="img/u40.png" class="" style="width:75%;margin-left:0px;left:-22px;">
<span class="text-center position-absolute t-white" style="top:51%;left:58%;">未完成<br>8</span>
</div> </div>
<div class="col-12 mb-2 position-relative row m-0 justify-content-center"> <div class="col-12 mb-2 position-relative row m-0 justify-content-center">
<span class="text-center position-absolute t-white" style="top:43%;left:26%;">未派工<br>5</span> <canvas class="chart" id="worOrdFinChart"></canvas>
<img src="img/u43.png" class="mt-2 mb-1" style="width:51%;">
<span class="text-center position-absolute t-white" style="top:42%;left:58%;">派工中<br>9</span>
</div> </div>
</div> </div>
</div> </div>
@ -244,6 +219,8 @@
var timeOuters = []; var timeOuters = [];
var eveDayElecChart = null; var eveDayElecChart = null;
var eveWeekElecChart = null; var eveWeekElecChart = null;
var worOrdErrChart = null;
var worOrdFinChart = null;
var errRecChart = null; var errRecChart = null;
var errChkChart = null; var errChkChart = null;
var loadedCnt = 0; var loadedCnt = 0;
@ -262,6 +239,11 @@
{ mainSys: "FE", subSys: "F2", iconClass: "fal fa-smog" }, { mainSys: "FE", subSys: "F2", iconClass: "fal fa-smog" },
{ mainSys: "WP", subSys: "W1", iconClass: "fal fa-stopwatch" }, { mainSys: "WP", subSys: "W1", iconClass: "fal fa-stopwatch" },
{ mainSys: "S", subSys: "R", iconClass: "fal fa-user-shield" }, { mainSys: "S", subSys: "R", iconClass: "fal fa-user-shield" },
{ mainSys: "LT", subSys: "L2", iconClass: "fal fa-sun"},
{ mainSys: "ME", subSys: "M1", iconClass: "fal fa-icicles"},
{ mainSys: "ME", subSys: "M8", iconClass: "fal fa-bong"},
{ mainSys: "W3", subSys: "W1", iconClass: "fal fa-tint"},
]; ];
var tempSysSubText = [ var tempSysSubText = [
@ -270,12 +252,16 @@
{ text: "緊急發電機", mainSys: "EE", subSys: "E3", }, { text: "緊急發電機", mainSys: "EE", subSys: "E3", },
{ text: "電錶系統", mainSys: "EE", subSys: "E4", }, { text: "電錶系統", mainSys: "EE", subSys: "E4", },
{ text: "二線式照明系統", mainSys: "LT", subSys: "L1", }, { text: "二線式照明系統", mainSys: "LT", subSys: "L1", },
{ text: "景觀照明系統", mainSys: "LT", subSys: "L2", },
{ text: "儲冰系統", mainSys: "ME", subSys: "M1", },
{ text: "小型送風機", mainSys: "ME", subSys: "M10", }, { text: "小型送風機", mainSys: "ME", subSys: "M10", },
{ text: "排油煙設備", mainSys: "ME", subSys: "M8", },
{ text: "環境感測設備", mainSys: "ME", subSys: "M12", }, { text: "環境感測設備", mainSys: "ME", subSys: "M12", },
{ text: "電梯設備", mainSys: "ELEV", subSys: "EL", }, { text: "電梯設備", mainSys: "ELEV", subSys: "EL", },
{ text: "消防設備", mainSys: "FE", subSys: "F1", }, { text: "消防設備", mainSys: "FE", subSys: "F1", },
{ text: "排煙系統", mainSys: "FE", subSys: "F2", }, { text: "排煙系統", mainSys: "FE", subSys: "F2", },
{ text: "電子水錶", mainSys: "WP", subSys: "W1", }, { text: "電子水錶", mainSys: "WP", subSys: "W1", },
{ text: "熱水系統", mainSys: "W3", subSys: "W1", },
{ text: "門禁安全系統", mainSys: "S", subSys: "R", } { text: "門禁安全系統", mainSys: "S", subSys: "R", }
]; ];
@ -291,7 +277,7 @@
let strHtml = ``; let strHtml = ``;
$.each(tempSysSubText, (idx, obj) => { $.each(tempSysSubText, (idx, obj) => {
if (isExiNames.indexOf(obj.text) == -1 && $("#sysSubBtnList .dev-group").length < 12) { if (isExiNames.indexOf(obj.text) == -1 && $("#sysSubBtnList .dev-group").length < 16) {
let iconObj = sysIconList.filter(x => x.mainSys == obj.mainSys && x.subSys == obj.subSys)[0]; let iconObj = sysIconList.filter(x => x.mainSys == obj.mainSys && x.subSys == obj.subSys)[0];
strHtml = `<div class="btn-group btn-group-lg col-lg-3 mb-4 dev-group"> strHtml = `<div class="btn-group btn-group-lg col-lg-3 mb-4 dev-group">
<button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4"><i class="${iconObj.iconClass || "fal fa-hdd"} fa-2x py-2"></i></button> <button name="topFunBtn" data-page="alert" type="button" class="btn btn-secondary col-4"><i class="${iconObj.iconClass || "fal fa-hdd"} fa-2x py-2"></i></button>
@ -408,14 +394,14 @@
// 本週與上週用電量 (每天) // 本週與上週用電量 (每天)
getElectricMeterDayDataByBaja(devNum + "_KWH", n4Sup, prevTwoWeek, tomorrow, (data) => { getElectricMeterDayDataByBaja(devNum + "_KWH", n4Sup, prevTwoWeek, tomorrow, (data) => {
let curDay = (new Date()).getDay() == 0 ? 7 : (new Date()).getDay(); let curDay = (new Date()).getDay() == 0 ? 7 : (new Date()).getDay();
let curWeekData = data.data.filter(x => strToDate(displayDate(new Date(), "date"), null, 0 - (curDay - 1)) <= strToDate(x.timestamp.$cEncStr)); let curWeekData = data.data.filter(x => strToDate(displayDate(new Date(), "date"), null, 1 - 7) <= strToDate(x.timestamp.$cEncStr));
let prevWeekData = data.data.filter(x => strToDate(displayDate(new Date(), "date"), null, 0 - 7 - (curDay - 1)) <= strToDate(x.timestamp.$cEncStr) && strToDate(new Date(), null, 0 - 7) >= strToDate(x.timestamp.$cEncStr)); let prevWeekData = data.data.filter(x => strToDate(displayDate(new Date(), "date"), null, 1 - 14) <= strToDate(x.timestamp.$cEncStr) && strToDate(new Date(), null, 1 - 7) >= strToDate(x.timestamp.$cEncStr));
debugger
chartEveWeeksElec(curWeekData, prevWeekData) chartEveWeeksElec(curWeekData, prevWeekData)
chkBajaLoaded(); chkBajaLoaded();
}) })
// 異常數量與歸數量 // 異常數量與歸數量
getAlarmCountByBaja((aData) => { getAlarmCountByBaja((aData) => {
chartDataCnt.alarmCnt = aData.count; chartDataCnt.alarmCnt = aData.count;
chkBajaLoaded(); chkBajaLoaded();
@ -424,7 +410,7 @@
chartDataCnt.recCnt = rData.count; chartDataCnt.recCnt = rData.count;
chkBajaLoaded(); chkBajaLoaded();
}) })
// 異常數量與歸數量 // 異常數量與歸數量
getCheckedAckedCountByBaja((data) => { getCheckedAckedCountByBaja((data) => {
chartDataCnt.chkedErrCnt = data.count; chartDataCnt.chkedErrCnt = data.count;
chkBajaLoaded(); chkBajaLoaded();
@ -440,8 +426,10 @@
loadedCnt++; loadedCnt++;
if (loadedCnt == 9) { if (loadedCnt == 9) {
chartErrRec(["異常數量", "歸數量"], [chartDataCnt.alarmCnt, chartDataCnt.recCnt]); chartErrRec(["異常數量", "歸數量"], [chartDataCnt.alarmCnt, chartDataCnt.recCnt]);
chartErrChk(["已確認異常", "未確認異常"], [chartDataCnt.chkedErrCnt, chartDataCnt.unChkedErrCnt]); chartErrChk(["已確認異常", "未確認異常"], [chartDataCnt.chkedErrCnt, chartDataCnt.unChkedErrCnt]);
chartWorOrdErr();
chartWorOrdFin();
endPageLoading(); endPageLoading();
} }
@ -628,7 +616,7 @@
} }
} }
// 圖表 - 異常與歸圖表 (圓餅圖) // 圖表 - 異常與歸圖表 (圓餅圖)
function chartErrRec(labels, datas) { function chartErrRec(labels, datas) {
let errRecChartCanvas = ctx = $('#errRecChart').get(0).getContext('2d'); let errRecChartCanvas = ctx = $('#errRecChart').get(0).getContext('2d');
@ -720,6 +708,101 @@
} }
// 圖表 - 異常未派工與異常已派工 (圓環圖)
function chartWorOrdErr(labels, datas) {
labels = ["異常未派工", "異常已派工"]
datas = [5, 9]
let worOrdErrChartCanvas = ctx = $('#worOrdErrChart').get(0).getContext('2d');
let worOrdErrChartData = {
labels: labels,
datasets: [
{
label: '數量',
unit: '個',
fill: true,
backgroundColor: [color.danger._500, color.info._300],
//data: worOrdErrArr.map(x => parseInt((Math.random() * (1500 - 300) + 300))),
data: datas,
}
]
}
let worOrdErrChartOptions = {
//maintainAspectRatio: false,
responsive: true,
legend: {
display: true,
},
tooltips: {
enabled: true,
},
}
if (worOrdErrChart == null) {
worOrdErrChart = new Chart(worOrdErrChartCanvas, {
type: "doughnut",
data: worOrdErrChartData,
options: worOrdErrChartOptions
})
} else {
worOrdErrChart.data.datasets.forEach((dataset) => {
dataset.data = datas;
});
}
}
// 圖表 - 工單已完成與工單未完成 (圓環圖)
function chartWorOrdFin(labels, datas) {
labels = ["工單已完成","工單未完成"]
datas = [5,9]
let worOrdFinChartCanvas = ctx = $('#worOrdFinChart').get(0).getContext('2d');
let worOrdFinChartData = {
labels: labels,
datasets: [
{
label: '數量',
unit: '個',
fill: true,
backgroundColor: [color.danger._500, color.info._300],
//data: worOrdFinArr.map(x => parseInt((Math.random() * (1500 - 300) + 300))),
data: datas,
}
]
}
let worOrdFinChartOptions = {
//maintainAspectRatio: false,
responsive: true,
legend: {
display: true,
},
tooltips: {
enabled: true,
},
}
if (worOrdFinChart == null) {
worOrdFinChart = new Chart(worOrdFinChartCanvas, {
type: "doughnut",
data: worOrdFinChartData,
options: worOrdFinChartOptions
})
} else {
worOrdFinChart.data.datasets.forEach((dataset) => {
dataset.data = datas;
});
}
}
// 從 baja 訂閱 左下角各系統小類異常狀態 // 從 baja 訂閱 左下角各系統小類異常狀態
function getAlarmSub(data) { function getAlarmSub(data) {
$.each(data.data, (idx, alaObj) => { $.each(data.data, (idx, alaObj) => {

View File

@ -38,14 +38,17 @@
var allDevList = []; //全設備清單 var allDevList = []; //全設備清單
var subDeviceData = []; var subDeviceData = [];
var heatMap = null; var heatMap = null;
var buildMenuData = {};
$(function () { $(function () {
getBuildMenu((arr, data) => { getBuildMenu((arr, data) => {
buildMenuData = data;
if (arr.indexOf(4) != -1) { if (arr.indexOf(4) != -1) {
getFloDevList(); getFloDevList(arr[0] == 4 ? "left" :"right");
setLightColor(); setLightColor();
} }
if (arr.indexOf(3) != -1) { if (arr.indexOf(3) != -1) {
getLightPoint();
getHotspotPoint(() => { getHotspotPoint(() => {
show3DModel(data.urn_3D); show3DModel(data.urn_3D);
}); });
@ -72,7 +75,10 @@
</div>`; </div>`;
break; break;
case 3: case 3:
strHtml = `<div name="forgeViewer" style="height:85vh;"></div>`; strHtml = `<div class="d-flex mb-4" style="gap:15px">
${setTopHeatBar()}
</div>
<div name="forgeViewer" style="height:85vh;"></div>`;
break; break;
} }
@ -90,6 +96,7 @@
} }
myBaja.setSubscribeDevicesByBql(ordPath); myBaja.setSubscribeDevicesByBql(ordPath);
myBaja.setSubscribeDevicesCallBack(function (data) { myBaja.setSubscribeDevicesCallBack(function (data) {
console.log(data)
let matchDevice = allDevList.filter(x => x.device_number == data.device_number_full)[0]; let matchDevice = allDevList.filter(x => x.device_number == data.device_number_full)[0];
if (!matchDevice) { if (!matchDevice) {
return false; return false;
@ -127,18 +134,35 @@
} else if (data.point_name == errDevPoiName && data.value == matchDevice.device_error_point_value) { } else if (data.point_name == errDevPoiName && data.value == matchDevice.device_error_point_value) {
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "error").data("light-type", "error"); $(`#${matchDevice.device_number}_status`).attr("data-light-type", "error").data("light-type", "error");
} }
setLightColor(); setLightColor();
setForgeHotSpotColor(matchDevice); setForgeHotSpotColor(matchDevice);
lightDevForgeSpotLig(matchDevice)
// 從設備訂閱更新每個設備卡片即時點位
setDevItemPoiValBySub(data);
}); });
myBaja.setSubscribeDeviceEndCallBack(function (data) { myBaja.setSubscribeDeviceEndCallBack(function (data) {
endPageLoading(); endPageLoading();
}); });
} }
function lightDevForgeSpotLig(devObj) {
}
// 從設備訂閱更新每個設備卡片即時點位
function setDevItemPoiValBySub(data) {
let pointSpan = $(`.card.device-wrap[data-number=${data.device_number_full}] span[name=devItemPoiVal]`);
if (pointSpan && pointSpan.data("point") == data.point_name) {
console.log(data)
pointSpan.text(data.value);
}
}
function setLightColor() { function setLightColor() {
$("[data-light-type]").each((index, ele) => { $("[data-light-type]").each((index, ele) => {
let type = $(ele).data("light-type"); let type = $(ele).data("light-type");
@ -192,6 +216,12 @@
return strHtml; return strHtml;
} }
// 設置 Forge 3D 溫度條
function setTopHeatBar() {
let strHtml = `<canvas name="forgeHeatBar" width="200" height="30" style="z-index:9999"></canvas>`;
return strHtml;
}
// forge 3D 異常點位變紅色 // forge 3D 異常點位變紅色
function setForgeHotSpotColor(device) { function setForgeHotSpotColor(device) {
let subData = subDeviceData.filter(x => x.device_number == device.device_number)[0] let subData = subDeviceData.filter(x => x.device_number == device.device_number)[0]
@ -200,8 +230,17 @@
} }
} }
// 取得昇位圖點位 (deviceItem)
function getRiserPoiObj() {
let tarDevItem = pageAct.devItems?.filter(x => x.is_show_riserDiagram == 1);
if (tarDevItem && tarDevItem[0]) {
return tarDevItem[0];
}
return null;
}
// 取得設備列表 並繪製卡片 // 取得設備列表 並繪製卡片
function getFloDevList() { function getFloDevList(position = "left") {
let url = baseApiUrl + "/api/Device/GetDeviceList"; let url = baseApiUrl + "/api/Device/GetDeviceList";
let sendData = { let sendData = {
sub_system_tag: pageAct.sysSubTag, sub_system_tag: pageAct.sysSubTag,
@ -220,8 +259,8 @@
strHtml += `<div class="col p-0 d-grid grid-gap-5 grid-temp-col-c" style="--c-grid-temp-col:repeat(auto-fill,minmax(250px,1fr))">` strHtml += `<div class="col p-0 d-grid grid-gap-5 grid-temp-col-c" style="--c-grid-temp-col:repeat(auto-fill,minmax(250px,1fr))">`
$.each(floObj.device_list, (index2, devObj) => { $.each(floObj.device_list, (index2, devObj) => {
allDevList.push(devObj); allDevList.push(devObj);
let devItem = getRiserPoiObj();
strHtml += `<div class="card m-1 border device-wrap"> strHtml += `<div class="card m-1 border device-wrap" data-number="${devObj.device_number}" data-position="${position}">
<div class="card-body p-2"> <div class="card-body p-2">
<div class="d-flex mb-2"> <div class="d-flex mb-2">
<div class="mr-5 cur-poi"> <div class="mr-5 cur-poi">
@ -233,7 +272,7 @@
</div> </div>
<div class="d-flex mb-0 mt-2 align-items-center"> <div class="d-flex mb-0 mt-2 align-items-center">
<span id="${devObj.device_number}_status" class="circle-light"></span> <span id="${devObj.device_number}_status" class="circle-light"></span>
<span class="d-none">即時功率:</span> <span class="${devItem ? "" : "d-none"} ml-2">${devItem?.full_name}<span name="devItemPoiVal" data-point="${devItem?.points}"></span>${devItem?.unit}</span>
<a href="javascript:;" name="devItem" data-id="${devObj.device_guid}" data-number="${devObj.device_number}" data-name="${devObj.full_name}" class=" ml-2 mb-0 ">詳細資料</a> <a href="javascript:;" name="devItem" data-id="${devObj.device_guid}" data-number="${devObj.device_number}" data-name="${devObj.full_name}" class=" ml-2 mb-0 ">詳細資料</a>
</div> </div>
</div> </div>
@ -295,19 +334,27 @@
// Card 即時狀態 // Card 即時狀態
function drawStateTabBlo(devNum) { function drawStateTabBlo(devNum) {
let devPath = devNum.replaceAll("_", "/"); let devPath = devNum.replaceAll("_", "/");
let strHtml = `<div style="height:100%"> let position = $(`.card.device-wrap[data-number=${devNum}]`).data("position");
<iframe src="/ord?station:%7Cslot:/${devPath}|view:?fullScreen=true" style="width:100%;height:100%;min-height:30vh"></iframe> let width = buildMenuData[position + "_icon_click_url_width"] ? buildMenuData[position + "_icon_click_url_width"] + "px" : "100%";
let height = buildMenuData[position + "_icon_click_url_height"] ? buildMenuData[position + "_icon_click_url_height"] + "px" : "100%";
let strHtml = `<div style="height:100%;width:100%">
<iframe src="/ord?station:%7Cslot:/${devPath}|view:?fullScreen=true" style="width:${width};height:${height};min-height:100px;"></iframe>
</div>` </div>`
return strHtml; return strHtml;
} }
function iframeResize(obj) { function iframeResize(obj) {
obj.style.height = obj.contentWindow.document.documentElement.scrollHeight + 'px'; obj.style.height = obj.contentWindow.document.documentElement.scrollHeight + 'px';
} }
function show3DModel(urn) { function show3DModel(urn) {
$(loadEle).Loading("start"); $(loadEle).Loading("start");
getLightData(allDevList);
launchViewerForHotspot(urn, (viewer, nodeIds) => { launchViewerForHotspot(urn, (viewer, nodeIds) => {
showHeat("[name=forgeHeatBar]");
let devDbIds = allDevList.map(x => x.forge_dbid); let devDbIds = allDevList.map(x => x.forge_dbid);
/*hideAllObjects(devDbIds);*/ /*hideAllObjects(devDbIds);*/
setTransparentBuilding(0, devDbIds); setTransparentBuilding(0, devDbIds);
$(loadEle).Loading("close"); $(loadEle).Loading("close");
@ -416,11 +463,49 @@
} }
async function getLightPoint(callback = null) {
let url = baseApiUrl + "/api/GetDevNodeForCor";
let sendData = {
"device_area_tag": pageAct.AreaTag,
"device_building_tag": pageAct.buiTag,
"device_system_tag": pageAct.sysMainTag,
"device_name_tag": pageAct.sysSubTag,
};
objSendData.Data = sendData;
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
if (!res || res.code != "0000" || !res.data) {
} else {
let myDataList = [];
$.each(res.data, (idx, data) => {
let item = {};
item.position = {};
if (data.device_node_coordinate_3d != null && isJSON(data.device_node_coordinate_3d)) {
item.position = JSON.parse(data.device_node_coordinate_3d);
}
$.extend(item, data);
myDataList.push(item);
})
console.log("2", myDataList)
setLightPoint(myDataList);
callback ? callback() : "";
}
}, null, "POST").send();
}
function setHotspotPoint(myDataList = []) { function setHotspotPoint(myDataList = []) {
console.log(myDataList) console.log(myDataList)
getHopspotPoint(myDataList); getHopspotPoint(myDataList);
} }
async function setLightPoint(myDataList = []) {
console.log(myDataList)
getLightData(myDataList);
}
var parentEle = ""; var parentEle = "";
onEvent("autodesk:click:sprite", "[name=forgeViewer]", function (e, obj) { onEvent("autodesk:click:sprite", "[name=forgeViewer]", function (e, obj) {
forgeUnFocusAll(); forgeUnFocusAll();

View File

@ -1,8 +1,4 @@
<style> 
[id^=yt_tooltip] {
width: 650px;
}
</style>
<div class="container-fluid"> <div class="container-fluid">
<div class="row bg-dark align-items-center"> <div class="row bg-dark align-items-center">
<label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label> <label id="sysSubText" class=" mx-5 mb-0 fs-1-05"></label>

View File

@ -10,7 +10,7 @@
label[id$='-error'].error { color: var(--yt-red-2); } label[id$='-error'].error { color: var(--yt-red-2); }
[id^=yt_tooltip] { min-width: 650px !important; } /*[id^=yt_tooltip] { min-width: 650px !important; }*/
.circle-light { display: inline-block; width: 25px; height: 25px; border-radius: 50px; } .circle-light { display: inline-block; width: 25px; height: 25px; border-radius: 50px; }
@ -89,8 +89,25 @@ input:-webkit-autofill { background-color: rgba(0, 0, 0, 0.15) !important; }
.yt-navbar-content ul li a:active, .yt-navbar-content ul li a.active { background-color: var(--theme-fusion-500); } .yt-navbar-content ul li a:active, .yt-navbar-content ul li a.active { background-color: var(--theme-fusion-500); }
.card-header.p-3.ui-draggable-handle:hover { cursor: move; } .card-header.p-3.ui-draggable-handle:hover { cursor: move; }
@media screen and (max-width: 576px) {
.yt-left-navbar { width: 100%; max-width: 100%; margin-top: 0; } .device-wrap .card-body #info, .device-wrap .card-body #errRec, .device-wrap .card-body #opeRec { min-width: 500px; }
.scrolledTable { overflow-y: auto; clear: both; max-height:100%;}
/*a[data-tabname="topFunBtn"] { color: #fff }
a[data-tabname="topFunBtn"].active { color: #886ab5 }
a[data-tabname="topFunBtn"]:hover { color: var(--theme-primary-50); }
.userblock {
color:#fff;
}
.userblock:hover { color: var(--theme-primary-50); }
.dropdown.show .userblock { color: var(--theme-primary-50) !important; }*/
.page-header a {color:#fff !important;}
.page-header a:hover { color: var(--theme-primary-50) !important; }
.page-header a.active { color: var(--theme-primary-500) !important; }
.dropdown.show a { color: var(--theme-primary-50) !important; }
@media screen and (max-width: 576px) { .yt-left-navbar { width: 100%; max-width: 100%; margin-top: 0; }
} }
@keyframes lds-ring { @keyframes lds-ring {

View File

@ -51,6 +51,7 @@
<canvas id="iot-heatmap-legend" width="300" height="50"></canvas> <canvas id="iot-heatmap-legend" width="300" height="50"></canvas>
</div> </div>
<button type="button" class="btn btn-info" onclick="showHeat()">顯示熱圖圖示</button> <button type="button" class="btn btn-info" onclick="showHeat()">顯示熱圖圖示</button>
<button type="button" class="btn btn-default" onclick="showList()">顯示設備清單</button>
<!--<input id="lightBar" type="range" min="0" max="100" step="5" onchange="changeLightPower()">亮度--> <!--<input id="lightBar" type="range" min="0" max="100" step="5" onchange="changeLightPower()">亮度-->
<!-- <input type="range">Main Axis</input> --> <!-- <input type="range">Main Axis</input> -->
</div> </div>
@ -244,7 +245,7 @@
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1pdHN1YmlzaGkvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU5JUExJUFGXzEyMjgubndk'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1pdHN1YmlzaGkvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU5JUExJUFGXzEyMjgubndk');
//12.30 整棟樓 ARC + MEP //12.30 整棟樓 ARC + MEP
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8xMl8zMC5ud2Q'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8xMl8zMC5ud2Q');
//12.30 整棟樓 ARC + MEP 半透明 //12.30 整棟樓 ARC + MEP 半透明
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8lRTUlOEQlOEElRTklODAlOEYlRTYlOTglOEUlRTUlQkIlQkElRTclQUYlODlfMTJfMzAubndk'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8lRTUlOEQlOEElRTklODAlOEYlRTYlOTglOEUlRTUlQkIlQkElRTclQUYlODlfMTJfMzAubndk');
@ -254,8 +255,11 @@
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwTUVQJUUzJTgwJTkxXzIwMjJfMTJfMTMubndj');//new MEP //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwTUVQJUUzJTgwJTkxXzIwMjJfMTJfMTMubndj');//new MEP
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxJUU1JTg1JUE4JUU2JUEzJTlGXzIwMjJfMTJfMTMubndj');//全棟 ARC //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxJUU1JTg1JUE4JUU2JUEzJTlGXzIwMjJfMTJfMTMubndj');//全棟 ARC
//01.06 加上room_id(樓層有燈具)
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIzXzAxXzA2Lm53ZA');
//01.06 樓層刪除燈具
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6LW1vZGVsX3Rlc3QxMTIxLyVFMyU4MCU5MCVFNSU4RiVCMCVFNSU4QyU5NyVFNCVCOCVBRCVFOCU4RiVCMSVFNSVBNCVBNyVFNiVBOCU5MyVFMyU4MCU5MUFSQyVFOSU5QiU5OSVFNiVBOCVBMSVFNSVCQyU4RitNRVAlRTYlOEIlODYlRTclQjMlQkIlRTclQjUlQjFfJUU1JTg4JUFBJUU3JTg3JTg4JUU1JTg1JUI3XzIwMjNfMDFfMDYubndk');
}); });
//function move1Floor() { //function move1Floor() {
@ -412,6 +416,10 @@
createHeatmapRect(labels, colorStops); createHeatmapRect(labels, colorStops);
} }
function showList() {
consoleList();
}
function createHeatmapRect(labels, colorStops) { function createHeatmapRect(labels, colorStops) {
if (!this.canvas) { if (!this.canvas) {
return; return;
@ -438,7 +446,7 @@
context.fillRect(10, 20, 280, 20); context.fillRect(10, 20, 280, 20);
} }
</script> </script>

View File

@ -180,7 +180,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
</div> </div>
<div class="dropdown"> <div class="dropdown">
<a class="dropdown-toggle" href="javascript:;" role="button" id="buiActDrop" <a class="dropdown-toggle fs-1" href="javascript:;" role="button" id="buiActDrop"
data-target="buiList" data-toggle="dropdown" aria-haspopup="true"> data-target="buiList" data-toggle="dropdown" aria-haspopup="true">
</a> </a>
@ -199,8 +199,11 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
<!--<img src="img/demo/avatars/avatar-admin.png" class="profile-image rounded-circle" <!--<img src="img/demo/avatars/avatar-admin.png" class="profile-image rounded-circle"
alt="Dr. Codex Lantern">--> alt="Dr. Codex Lantern">-->
<!--you can also add username next to the avatar with the codes below:--> <!--you can also add username next to the avatar with the codes below:-->
<span id="usrName" class="ml-1 mr-2 text-truncate text-truncate-header hidden-xs-down"></span> <div class="row m-0 justify-content-center userblock">
<i class="ni ni-chevron-down hidden-xs-down"></i> <i class="fas fa-user-circle fs-1-5 w-100 text-center"></i>
<span id="usrName" class="text-truncate text-truncate-header hidden-xs-down"></span>
</div>
</a> </a>
<div id="logoutList" class="dropdown-menu dropdown-menu-right dropdown-lg"> <div id="logoutList" class="dropdown-menu dropdown-menu-right dropdown-lg">
@ -726,9 +729,11 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
if (location.href.indexOf("ord") != -1) { if (location.href.indexOf("ord") != -1) {
location.href = "/file/index.html" location.href = "/file/index.html"
} }
var lastPage = sessionStorage.getItem("lastPage");
// 執行初步 Loading // 執行初步 Loading
var loadEle = pageLoading(); var loadEle = pageLoading();
var errRecTable = null, opeRecTable = null; var errRecTable = null, opeRecTable = null;
var tolSubList = [];
/** /**
* 頁面 Loading 建立 * 頁面 Loading 建立
@ -770,7 +775,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
"lib/statistics/flot/flot.bundle", "lib/statistics/flot/flot.bundle",
"lib/statistics/peity/peity.bundle", "lib/statistics/peity/peity.bundle",
"lib/jquery-validation/dist/jquery.validate", "lib/jquery-validation/dist/jquery.validate",
"lib/jquery-validation/dist/additional-methods.min", /*"lib/jquery-validation/dist/additional-methods.min",*/ /* 會影響 messages_zh_TW 文字呈現 */
"lib/jquery-validation/dist/localization/messages_zh_TW", "lib/jquery-validation/dist/localization/messages_zh_TW",
"lib/jquery-ui/jquery-ui.min", "lib/jquery-ui/jquery-ui.min",
"lib/chart.js/Chart.min", "lib/chart.js/Chart.min",
@ -825,8 +830,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
* 登入驗證完成 Callback * 登入驗證完成 Callback
* */ * */
function isValidLogin() { function isValidLogin() {
$("#app").load("_dashboard.html", loadCallback);
getUserInfo(); getUserInfo();
iniFroList(); iniFroList();
showMainSys(); showMainSys();
@ -834,6 +838,24 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
getSysMonBtnList(); getSysMonBtnList();
checkDevState(); checkDevState();
if (lastPage) {
let lastPageAct = {};
if (isJSON(sessionStorage.getItem("pageAct"))) {
lastPageAct = JSON.parse(sessionStorage.getItem("pageAct"));
}
if (lastPageAct.sysSubTag && lastPage == "systemMonitor") {
$(`#subSysBtn${lastPageAct.sysSubTag}`).click();
$("#sysMonTopBtn").YTTab("set");
} else {
$(`[data-tabname=topFunBtn][data-page=${lastPage}]`).YTTab("setAndClick");
}
/*$(`[name=topFunBtn][data-page=${lastPage}]`).click();*/
} else {
$("#app").load("_dashboard.html", loadCallback);
}
function getBuiList() { function getBuiList() {
let url = baseApiUrl + "/api/Device/GetBuild"; let url = baseApiUrl + "/api/Device/GetBuild";
ytAjax = new YourTeam.Ajax(url, null, function (res) { ytAjax = new YourTeam.Ajax(url, null, function (res) {
@ -893,10 +915,17 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
onEvent("click", "[name=topFunBtn]", function () { onEvent("click", "[name=topFunBtn]", function () {
_ytTabInited = []; _ytTabInited = [];
let page = $(this).data("page"); let page = $(this).data("page");
if (!page) {
return;
}
if (page != "systemMonitor") { if (page != "systemMonitor") {
$("#sysMonBtnList .dropdown-item").removeClass("active"); $("#sysMonBtnList .dropdown-item").removeClass("active");
pageAct.sysMainTag = null; pageAct.sysMainTag = null;
pageAct.sysSubTag = null;
} else {
setSysTagForPageAct(this);
$("#sysMonTopBtn").YTTab("set");
$(`#subSysBtn${pageAct.sysSubTag}`).YTTab("set");
} }
$.each(tolSubList, (idx, sub) => { $.each(tolSubList, (idx, sub) => {
sub.unsubscribeAll(); sub.unsubscribeAll();
@ -914,6 +943,9 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
} }
getUserInfo(); getUserInfo();
sessionStorage.setItem("lastPage", page);
sessionStorage.setItem("pageAct", JSON.stringify(pageAct));
$("#app").load(`_${page}.html`, loadCallback); $("#app").load(`_${page}.html`, loadCallback);
}) })
@ -924,10 +956,11 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
}) })
onEvent("click", "#sysMonBtnList a", function (e) { onEvent("click", "#sysMonBtnList a", function (e) {
pageAct.sysMainTag = $(this).data("subSysObj").main_system_tag; //pageAct.sysMainTag = $(this).data("subSysObj").main_system_tag;
pageAct.sysSubTag = $(this).data("subSysObj").sub_system_tag; //pageAct.sysSubTag = $(this).data("subSysObj").sub_system_tag;
pageAct.sysSubName = $(this).data("subSysObj").full_name; //pageAct.sysSubName = $(this).data("subSysObj").full_name;
pageAct.sysSubObj = $(this).data("subSysObj"); //pageAct.sysSubObj = $(this).data("subSysObj");
//getDevItem();
}) })
onEvent("active:change", "#buiList", function (e, actEle) { onEvent("active:change", "#buiList", function (e, actEle) {
@ -945,6 +978,12 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
} }
}) })
onEvent("yt:tab:prechange", "[data-tabname=topFunBtn]", function (e, arg) {
if ($(this)[0].id == "sysMonTopBtn" || !$(this).data("page")) {
arg.cancel = true;
}
})
onEvent("click", "#testsysbtn", function () { onEvent("click", "#testsysbtn", function () {
}) })
@ -1080,7 +1119,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
</div> </div>
</div> </div>
<div class="card-body p-2 tab-content"> <div class="card-body p-2 tab-content">
<div id="state" class="show active" data-tabname="cardTab" data-tabrole="child" style="height:100%"> <div id="state" class="show active" data-tabname="cardTab" data-tabrole="child" style="height:100%;width:100%">
${drawStateTabBlo(devNum)} ${drawStateTabBlo(devNum)}
</div> </div>
<div id="info" data-tabname="cardTab" data-tabrole="child"> <div id="info" data-tabname="cardTab" data-tabrole="child">
@ -1106,18 +1145,27 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
} }
$(tooltipEle).draggable({ $(tooltipEle).draggable({
cursor: "move", cursor: "move",
handle: ".card-header" // 只能通过卡片的标题栏拖拽 handle: ".card-header", // 只能通过卡片的标题栏拖拽
containment: "document",
scroll: true
}); });
$(tooltipEle).resizable({ $(tooltipEle).resizable({
resize: function (event,ui) { resize: function (event,ui) {
let iframe = $(ui.element).find("iframe"); let iframe = $(ui.element).find("iframe");
if (iframe.length != 0) { if (iframe.length != 0) {
//let cardBodyHei = $(ui.element).find(".card-body").css("height"); if (ui.size.width != ui.originalSize.width) {
//if (cardBodyHei) { iframe.css("width", "100%");
// $(iframe).css("height", cardBodyHei); } else if (ui.size.height != ui.originalSize.height) {
//} iframe.css("height", "100%");
}
} }
} let cardBodyHeight = $(ui.element).find(".card-body").css("height");
$(ui.element).find(".scrolledTable").css("height", cardBodyHeight)
errRecTable.draw(false)
},
minWidth: 200,
minHeight:150,
}); });
typeof subDeviceSetTable != "undefined" ? subDeviceSetTable($(oriEle).data("number")) : "" typeof subDeviceSetTable != "undefined" ? subDeviceSetTable($(oriEle).data("number")) : ""
}, },
@ -1172,7 +1220,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
]; ];
opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi"); opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "<'scrolledTable'tpi>");
} }
function loadLightSchTable(devGuid) { function loadLightSchTable(devGuid) {
@ -1294,7 +1342,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
let json_object = JSON.parse(result); let json_object = JSON.parse(result);
datas = json_object['data']; datas = json_object['data'];
errRecTable = new YourTeam.JqDataTables.getTableByStatic(tag, datas, columns, column_defs, null, null, null, null, "tpi"); errRecTable = new YourTeam.JqDataTables.getTableByStatic(tag, datas, columns, column_defs, null, null, null, null, "<'scrolledTable'tpi>");
} }
@ -1350,6 +1398,30 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
$(loadEle).Loading("close"); $(loadEle).Loading("close");
} }
function setSysTagForPageAct(obj) {
pageAct.sysMainTag = $(obj).data("subSysObj").main_system_tag;
pageAct.sysSubTag = $(obj).data("subSysObj").sub_system_tag;
pageAct.sysSubName = $(obj).data("subSysObj").full_name;
pageAct.sysSubObj = $(obj).data("subSysObj");
getDevItem();
}
function getDevItem() {
let url = baseApiUrl + "/api/Device/GetDeviceItem";
objSendData.Data = {
main_system_tag: pageAct.sysMainTag,
sub_system_tag: pageAct.sysSubTag,
}
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
if (!res || res.code != "0000" || !res.data) {
} else {
pageAct.devItems = res.data;
}
}, null, "POST").send();
}
function alarmIconBlink(data) { function alarmIconBlink(data) {
if (data?.data.length != 0) { if (data?.data.length != 0) {
$(".page-header [name=topFunBtn][data-page=alert] i").addClass("blink"); $(".page-header [name=topFunBtn][data-page=alert] i").addClass("blink");
@ -1411,7 +1483,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
} else { } else {
let strHtml = `<div class="btn-group mx-4"> let strHtml = `<div class="btn-group mx-4">
<a href="javascript:;" name="topFunBtn" data-page="dashboard" class="text-center"> <a href="javascript:;" name="topFunBtn" data-page="dashboard" data-tabname="topFunBtn" class="text-center">
<i class="fal fa-home fa-2x"></i><br>首頁 <i class="fal fa-home fa-2x"></i><br>首頁
</a> </a>
<!--<div class="dropdown-menu"> <!--<div class="dropdown-menu">
@ -1424,7 +1496,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
$.each(res.data, function (i, v) { $.each(res.data, function (i, v) {
if (v.authCode == 'PF1') { if (v.authCode == 'PF1') {
strHtml += `<div class="btn-group mx-4" > strHtml += `<div class="btn-group mx-4" >
<a href="javascript:;" id="sysMonTopBtn" class="text-center" data-toggle="navbar" data-target="#sysMonNavbar" aria-haspopup="true" aria-expanded="false"> <a href="javascript:;" id="sysMonTopBtn" class="text-center" data-toggle="navbar" data-target="#sysMonNavbar" data-tabname="topFunBtn" aria-haspopup="true" aria-expanded="false">
<i class="fal fa-tv fa-2x"></i><br>${v.subName} <i class="fal fa-tv fa-2x"></i><br>${v.subName}
</a> </a>
@ -1433,9 +1505,9 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
hasMonitor = true; hasMonitor = true;
} }
else { else {
let icon = v.authCode == 'PF2' ? 'fa-chart-pie' : v.authCode == 'PF3' ? 'fa-chart-area' : v.authCode == 'PF4' ? 'fa-bell' : v.authCode == 'PF5' ? 'fa-server' : v.authCode == 'PF6' ? 'fa-image' : v.authCode == 'PF7' ? 'fa-user' : ''; let icon = v.authCode == 'PF2' ? 'fa-chart-pie' : v.authCode == 'PF3' ? 'fa-chart-area' : v.authCode == 'PF4' ? 'fa-chart-line' : v.authCode == 'PF5' ? 'fa-bell' : v.authCode == 'PF6' ? 'fa-server' : v.authCode == 'PF7' ? 'fa-image' : v.authCode == 'PF8' ? 'fa-user' : '';
strHtml += `<div class="btn-group mx-4"> strHtml += `<div class="btn-group mx-4">
<a href="javascript:;" name="topFunBtn" class="dropdown-toggle no-arrow text-center" <a href="javascript:;" name="topFunBtn" data-tabname="topFunBtn" class="dropdown-toggle no-arrow text-center"
data-page="${v.showView}"> data-page="${v.showView}">
<i class="fal ${icon} fa-2x"></i><br>${v.subName} <i class="fal ${icon} fa-2x"></i><br>${v.subName}
</a> </a>
@ -1464,7 +1536,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
} else { } else {
$("#sysMonBtnList").html("") $("#sysMonBtnList").html("")
debugger
$.each(res.data.history_Main_Systems, (index, mainSysObj) => { $.each(res.data.history_Main_Systems, (index, mainSysObj) => {
$.each(mainSysObj.history_Sub_systems, (index2, subSysObj) => { $.each(mainSysObj.history_Sub_systems, (index2, subSysObj) => {
let page = "systemMonitor"; let page = "systemMonitor";

View File

@ -330,15 +330,6 @@ class elevator3D {
} }
function onDocumentLoadSuccess(doc, eleOption) { function onDocumentLoadSuccess(doc, eleOption) {
//取得燈光清單
if (lightDataList != undefined && lightDataList != null && lightDataList.length > 0) {
lightDataList.forEach((myData, index) => {
//if (myData.priority == 5) {
const position = JSON.parse(myData.device_node_coordinate_3d);
lightList.push({ dbid: myData.forge_dbid, spotLight: newLight(position) });
//}
});
}
var viewables = doc.getRoot().getDefaultGeometry(); var viewables = doc.getRoot().getDefaultGeometry();
viewer.loadDocumentNode(doc, viewables).then(i => { viewer.loadDocumentNode(doc, viewables).then(i => {
@ -727,15 +718,26 @@ function hideColor(nodeId) {//顏色改成透明
} }
//------------------ 紀錄熱點座標 --------------- //紀錄燈具座標
function getHopspotPoint(data) { async function getLightData(data) {
//var av = Autodesk.Viewing; lightDataList = data;
myDataList = data; }
//viewer.addEventListener(av.GEOMETRY_LOADED_EVENT, addHotPoint, {
// once: true, async function testNewLight(dataList) {
//}); dataList.forEach((myData, index) => {
const position = JSON.parse(myData.device_node_coordinate_3d);
lightList.push({ dbid: myData.forge_dbid, device_guid: myData.device_guid, lightObject: new THREE.SpotLight(0xffffff, 200, 20, 0.6, 0.5, 10) });
lightList[index].lightObject.position.set(position.x, position.y, position.z);
lightList[index].lightObject.castShadow = true;
lightList[index].lightObject.visible = true;
lightList[index].lightObject.target.position.set(position.x, position.y, position.z - 20);
viewer.scene.add(lightList[index].lightObject.target);
viewer.scene.add(lightList[index].lightObject);
viewer.impl.sceneUpdated(true);
});
} }
//-------------------- end ----------------------
//------------------- 加入熱點 ----------------- //------------------- 加入熱點 -----------------
async function addHotPoint(data) { async function addHotPoint(data) {
@ -753,13 +755,10 @@ async function addHotPoint(data) {
const style = new DataVizCore.ViewableStyle(viewableType, spriteColor, spriteIcon); const style = new DataVizCore.ViewableStyle(viewableType, spriteColor, spriteIcon);
//取得燈光清單 if (lightDataList != undefined && lightDataList != null && lightDataList.length > 0) {
//if (lightDataList != undefined && lightDataList != null && lightDataList.length > 0) { testNewLight(lightDataList);
// lightDataList.forEach((myData, index) => { }
// const position = JSON.parse(myData.device_node_coordinate_3d);
// lightList.push({ dbid: myData.forge_dbid, spotLight: newLight(position) });
// });
//}
//熱點 點擊事件註冊 //熱點 點擊事件註冊
viewer.addEventListener(DataVizCore.MOUSE_CLICK, onSpriteClicked);// SPRITE_SELECTED viewer.addEventListener(DataVizCore.MOUSE_CLICK, onSpriteClicked);// SPRITE_SELECTED
@ -790,12 +789,17 @@ async function addHotPoint(data) {
if (event != undefined && event != null) { if (event != undefined && event != null) {
if (event.dbId >= dbIdStart) {//event.dbId > 0 && event.dbId < 19 if (event.dbId >= dbIdStart) {//event.dbId > 0 && event.dbId < 19
console.log(`Sprite clicked: ${event.dbId}`); console.log(`Sprite clicked: ${event.dbId}`);
openHotspotModal();
for (let i = dbIdStart; i <= myDataList.length + 10; i++) { for (let i = dbIdStart; i <= myDataList.length + 10; i++) {
changeColorForHotspot(i); changeColorForHotspot(i);
changeScaleForHotspot(i, false); changeScaleForHotspot(i, false);
} }
let myData = myDataList.filter(x => x._dbId == event.dbId)[0]; let myData = myDataList.filter(x => x._dbId == event.dbId)[0];
if (lightList != undefined && lightList != null && lightList.length > 0) {
//setLightOpenOrClose(false, myData.device_guid);//關燈測試
//setLightValues(myData.device_guid, 20, 0x00ff00);//更改燈光顏色和強度的測試
moveViewToDevice(myData.forge_dbid);//移動視角至該設備
}
$(selector).trigger("autodesk:click:sprite", { event, myData }); $(selector).trigger("autodesk:click:sprite", { event, myData });
} else { } else {
$(selector).trigger("autodesk:clickOut:sprite", { event }); $(selector).trigger("autodesk:clickOut:sprite", { event });
@ -817,7 +821,6 @@ async function addHotPoint(data) {
// if (dbIds.length > 0) { // if (dbIds.length > 0) {
// // 處理已選取元件的邏輯 // // 處理已選取元件的邏輯
// $(selector).trigger("autodesk:click:sprite", event); // $(selector).trigger("autodesk:click:sprite", event);
// //openHotspotModal();
// console.log(`------ name: ${viewer.model.getInstanceTree().getNodeName(dbIds)} , dbId: ${dbIds}`);//, id: ${event.clickInfo.object.id}, position.x: ${event.clickInfo.point.x}, y: ${event.clickInfo.point.y}, z: ${event.clickInfo.point.z} // console.log(`------ name: ${viewer.model.getInstanceTree().getNodeName(dbIds)} , dbId: ${dbIds}`);//, id: ${event.clickInfo.object.id}, position.x: ${event.clickInfo.point.x}, y: ${event.clickInfo.point.y}, z: ${event.clickInfo.point.z}
// } else { // } else {
// // 處理沒有選取元件的邏輯 // // 處理沒有選取元件的邏輯
@ -864,22 +867,7 @@ async function changeScaleForHotspot(dbId, type = true) {
//------------------- end -------------- //------------------- end --------------
//----------------- 開關熱點小視窗 ----------------------
function openHotspotModal() {
//var modal = document.getElementById("hotspotModal");
//modal.style.display = "block";
//$("#pills-register-tab").removeClass("active");
//$("#pills-alarm-tab").removeClass("active");
//$("#pills-operation-tab").removeClass("active");
//$("#pills-login-tab").tab("show");
}
function closeHotspotModal() {
//var modal = document.getElementById("hotspotModal");
//modal.style.display = "none";
}
//------------------ end --------------------------------
//------------------ 熱圖 ------------------------------- //------------------ 熱圖 -------------------------------
async function loadHeatmaps(model) { async function loadHeatmaps(model) {
@ -1106,6 +1094,7 @@ async function newLight(lightPosition) {
//聚光燈 //聚光燈
var spotLight = new THREE.SpotLight(0xffffff, 200, 20, 0.6, 0.5, 10); var spotLight = new THREE.SpotLight(0xffffff, 200, 20, 0.6, 0.5, 10);
spotLight.position.set(lightPosition.x, lightPosition.y, lightPosition.z); spotLight.position.set(lightPosition.x, lightPosition.y, lightPosition.z);
console.log(lightPosition.x, lightPosition.y, lightPosition.z)
spotLight.castShadow = false; spotLight.castShadow = false;
spotLight.visible = true; spotLight.visible = true;
spotLight.target.position.set(lightPosition.x, lightPosition.y, lightPosition.z-20); spotLight.target.position.set(lightPosition.x, lightPosition.y, lightPosition.z-20);
@ -1117,25 +1106,24 @@ async function newLight(lightPosition) {
} }
//調整燈光 強度、顏色 //調整燈光 強度、顏色
async function setLightValues(dbid, intensity, color) { async function setLightValues(deviceGuid, intensity, color) {
for (var i = 0; i < lightList.length; i++) { for (var i = 0; i < lightList.length; i++) {
if (lightList[i].dbid == dbid) { if (lightList[i].device_guid == deviceGuid) {
lightList[i].spotLight.intensity = intensity; lightList[i].lightObject.intensity = intensity;
var tempcolor = new THREE.Color().setHex(color); var tempcolor = new THREE.Color().setHex(color);
lightList[i].spotLight.color = tempcolor; lightList[i].lightObject.color = tempcolor;
viewer.impl.sceneUpdated(true);
} }
} }
viewer.impl.sceneUpdated(true);
} }
//燈光開關 //燈光開關
function setLightOpenOrClose(value, light) { async function setLightOpenOrClose(value, deviceGuid) {
if (value) { for (var i = 0; i < lightList.length; i++) {
light.visible = true; if (lightList[i].device_guid == deviceGuid) {
} lightList[i].lightObject.visible = value;
else { }
light.visible = false;
} }
viewer.impl.sceneUpdated(true); viewer.impl.sceneUpdated(true);
} }
@ -1166,17 +1154,48 @@ function showAllObjects() {
} }
} }
function showHeat(selector) {
const labels = [
`${(10).toFixed(2)}${"°C"}`,
`${(40 / 2).toFixed(2)}${"°C"}`,
`${(30).toFixed(2)}${"°C"}`
];
const colorStops = ['blue', 'green', 'yellow', 'red'];
createHeatmapRect(labels, colorStops, selector);
}
function createHeatmapRect(labels, colorStops, selector) {
if (!$(selector)[0]) {
return;
}
const context = $(selector)[0].getContext('2d');
let i, len;
context.clearRect(0, 0, 300, 50);
context.fillStyle = 'back';//white
for (i = 0, len = labels.length; i < len; i++) {
let x = 10 + 280 * i / (len - 1);
if (i === len - 1) {
x -= context.measureText(labels[i]).width;
}
else if (i > 0) {
x -= 0.5 * context.measureText(labels[i]).width;
}
context.fillText(labels[i], x, 10);
}
const gradient = context.createLinearGradient(0, 0, 300, 0);
for (i = 0, len = colorStops.length; i < len; i++) {
gradient.addColorStop(i / (len - 1), colorStops[i]);
}
context.fillStyle = gradient;
context.fillRect(10, 20, 280, 20);
}
//======================== 外部呼叫function =========================== //======================== 外部呼叫function ===========================
//紀錄熱點座標 //紀錄熱點座標
function getHopspotPoint(data) { function getHopspotPoint(data) {
myDataList = data; myDataList = data;
} }
//紀錄燈具座標
async function getLightData(data) {
lightDataList = data;
}
//呼叫載入熱圖 //呼叫載入熱圖
async function toLoadHeatmap(roomArr) { async function toLoadHeatmap(roomArr) {
const model = viewer.model; const model = viewer.model;
@ -1188,4 +1207,15 @@ function setShadowShow(type = false) {
viewer.impl.sceneUpdated(true); viewer.impl.sceneUpdated(true);
} }
//============================= end =================================== //============================= end ===================================
function moveViewToDevice(letter) {
if (letter != "") {
viewer.clearSelection();
viewer.select(letter);
viewer.fitToView([letter]);
}
else {
viewer.clearSelection();
}
}

View File

@ -5,6 +5,7 @@ var elevatorSpeed;
var allDbIdsStr; var allDbIdsStr;
let bulbLight;//點燈 let bulbLight;//點燈
var spotLight;//聚光燈 var spotLight;//聚光燈
let testLight;
var myDataList;//設備清單 var myDataList;//設備清單
var viewableData; var viewableData;
var dataVizExtn; var dataVizExtn;
@ -12,7 +13,9 @@ var spriteColorRed;
var levels;//剖面用 var levels;//剖面用
var light; var light;
let pointLightHelper; let pointLightHelper;
var tagIdDevList = [];//模型設備List: device_number、device_coordinate_3d、forge_dbid
var roomDataList = [];//模型房間List: room_id、room_name
function launchViewer(urn) { function launchViewer(urn) {
var av = Autodesk.Viewing; var av = Autodesk.Viewing;
var options = { var options = {
@ -139,12 +142,10 @@ function onDocumentLoadSuccess(doc) {
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () { viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
var instanceTree = viewer.model.getData().instanceTree; var instanceTree = viewer.model.getData().instanceTree;
var domElem = document.getElementById('all_id');
var domElem = document.getElementById('all_id'); allDbIdsStr = Object.keys(instanceTree.nodeAccess.dbIdToIndex);
allDbIdsStr = Object.keys(instanceTree.nodeAccess.dbIdToIndex); domElem.innerText = allDbIdsStr;
domElem.innerText = allDbIdsStr;
//parseInt(allDbIdsStr[i] //parseInt(allDbIdsStr[i]
//for (var i = 0; i < allDbIdsStr.length; i++) { //for (var i = 0; i < allDbIdsStr.length; i++) {
// //setTransparency(parseInt(allDbIdsStr[i]), 0.2); // //setTransparency(parseInt(allDbIdsStr[i]), 0.2);
@ -161,105 +162,152 @@ function onDocumentLoadSuccess(doc) {
// }) // })
//} //}
// ------------------ 取得tag_id底下的nodeId -------------------------------------- //// ------------------ 取得tag_id底下的nodeId --------------------------------------
var curDbId = 0; //var curDbId = 0;
var tagId = 0; ////var tagId = 0;
var _parentId = 0; ////var _parentId = 0;
var _childId = 0; ////var _childId = 0;
var itemName = ''; ////var itemName = '';
var childIdArr = new Array(); ////var childIdArr = new Array();
let evelMap = new Map(); ////let evelMap = new Map();
let tree = viewer.model.getData().instanceTree; //let tree = viewer.model.getData().instanceTree;
const model = viewer.model; //const model = viewer.model;
const fragList = model.getFragmentList(); //const fragList = model.getFragmentList();
//loadHeatmaps(model); // //loadHeatmaps(model);
////allDbIdsStr.forEach((dbId) => {
//// curDbId = parseInt(dbId);
//// viewer.getProperties(curDbId, function (e) {
//// e.properties.forEach(function (item) {
//// if (item.displayName == "tag_id" && e.name == "【電梯】") {
//// //getFragmentWorldMatrixByNodeId(e.dbId, viewer);
//// //let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
//// tree.enumNodeFragments(e.dbId, function (frag) {
//// let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
//// let matrix = new THREE.Matrix4();
//// console.log("proxy: " + fragProxy.position);
//// fragProxy.getWorldMatrix(matrix);
//// });
//// tagId = e.dbId;
//// viewer.getProperties(tagId, function (e2) {
//// e2.properties.forEach(function (item2) {
//// if (item2.displayName == "child") {
//// _parentId = item2.displayValue;
//// viewer.getProperties(_parentId, function (e3) {
//// let itemMap = new Map();
//// e3.properties.forEach(function (item3) {
//// if (item3.displayName == "child") {
//// _childId = item3.displayValue;
//// childIdArr.push(_childId);
//// var n = 0;
//// viewer.getProperties(childIdArr[n], function (e5) {
//// e5.properties.forEach(function (item5) {
//// if (item5.displayName == "Name") {
//// itemName = item5.displayValue;
//// itemMap.set(childIdArr[0], itemName)
//// console.log("childIdArr[0] ", childIdArr[0])
//// console.log("item name: ", itemName);
//// n += 3;
//// }
//// });
//// })
//// n = 1;
//// viewer.getProperties(childIdArr[n], function (e6) {
//// e6.properties.forEach(function (item6) {
//// if (item6.displayName == "Name") {
//// itemName = item6.displayValue;
//// itemMap.set(childIdArr[1], itemName)
//// console.log("childIdArr[1] ", childIdArr[1])
//// console.log("item name: ", itemName);
//// n += 3;
//// }
//// });
//// })
//// n = 2;
//// viewer.getProperties(childIdArr[n], function (e7) {
//// e7.properties.forEach(function (item7) {
//// if (item7.displayName == "Name") {
//// itemName = item7.displayValue;
//// itemMap.set(childIdArr[2], itemName)
//// console.log("childIdArr[2] ", childIdArr[2])
//// console.log("item name: ", itemName);
//// n += 3;
//// }
//// });
//// })
//// }
//// });
//// evelMap.set(item.displayValue, itemMap)
//// })
//// }
//// });
//// })
//// }
//// });
//// })
////})
//allDbIdsStr.forEach((dbId) => { //allDbIdsStr.forEach((dbId) => {
// curDbId = parseInt(dbId); // curDbId = parseInt(dbId);
// viewer.getProperties(curDbId, function (e) { // viewer.getProperties(curDbId, function (e) {
// e.properties.forEach(function (item) { // e.properties.forEach(function (item) {
// if (item.displayName == "tag_id" && e.name == "【電梯】") { // if (item.displayName == "【tag_id】") { // Tag_name tag_id 【tag_id】
// if (item.displayValue != "") {
// if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {// TPE_B1_ME_M10
// console.log("--------------------------------------------------");
// console.log("Tag_name dbid: " + e.dbId);
// console.log("value: " + item.displayValue);
// }
// //var v = getFragmentWorldMatrixByNodeId(e.dbId, viewer);
// //console.log("v: " + v);
// //tree.enumNodeFragments(e.dbId, function (frag) {
// // fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// // fragProxy.getAnimTransform();
// // console.log("postion: " + fragProxy.position + ", fragP: " + fragProxy.fragPosition);
// //});
// let bounds = new THREE.Box3();
// instanceTree.enumNodeFragments(e.dbId, (fragId) => {
// let box = new THREE.Box3();
// fragList.getWorldBounds(fragId, box);
// bounds.union(box);
// }, true);
// var position = bounds.center();
// if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {
// console.log("position: (" + (position.x).toFixed(2) + ", " + (position.y).toFixed(2) + ", " + (position.z).toFixed(2) + ")");
// console.log("--------------------------------------------------");
// }
// }
// //getFragmentWorldMatrixByNodeId(e.dbId, viewer); // //getFragmentWorldMatrixByNodeId(e.dbId, viewer);
// //let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag); // //let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// tree.enumNodeFragments(e.dbId, function (frag) {
// let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// let matrix = new THREE.Matrix4();
// console.log("proxy: " + fragProxy.position);
// fragProxy.getWorldMatrix(matrix);
// });
// tagId = e.dbId;
// viewer.getProperties(tagId, function (e2) {
// e2.properties.forEach(function (item2) {
// if (item2.displayName == "child") {
// _parentId = item2.displayValue;
// viewer.getProperties(_parentId, function (e3) {
// let itemMap = new Map();
// e3.properties.forEach(function (item3) {
// if (item3.displayName == "child") {
// _childId = item3.displayValue;
// childIdArr.push(_childId);
// var n = 0;
// viewer.getProperties(childIdArr[n], function (e5) {
// e5.properties.forEach(function (item5) {
// if (item5.displayName == "Name") {
// itemName = item5.displayValue;
// itemMap.set(childIdArr[0], itemName)
// console.log("childIdArr[0] ", childIdArr[0])
// console.log("item name: ", itemName);
// n += 3;
// }
// });
// })
// n = 1;
// viewer.getProperties(childIdArr[n], function (e6) {
// e6.properties.forEach(function (item6) {
// if (item6.displayName == "Name") {
// itemName = item6.displayValue;
// itemMap.set(childIdArr[1], itemName)
// console.log("childIdArr[1] ", childIdArr[1])
// console.log("item name: ", itemName);
// n += 3;
// }
// });
// })
// n = 2;
// viewer.getProperties(childIdArr[n], function (e7) {
// e7.properties.forEach(function (item7) {
// if (item7.displayName == "Name") {
// itemName = item7.displayValue;
// itemMap.set(childIdArr[2], itemName)
// console.log("childIdArr[2] ", childIdArr[2])
// console.log("item name: ", itemName);
// n += 3;
// }
// });
// })
// }
// });
// evelMap.set(item.displayValue, itemMap)
// })
// }
// });
// })
// } // }
// }); // });
@ -267,54 +315,64 @@ function onDocumentLoadSuccess(doc) {
//}) //})
allDbIdsStr.forEach((dbId) => { ////---------------------- end ---------------------------------------------------
curDbId = parseInt(dbId);
viewer.getProperties(curDbId, function (e) { // ------------------ 2023.01.06 取得tag_id、底下的nodeId --------------------------------------
e.properties.forEach(function (item) { var curDbId = 0;
if (item.displayName == "【tag_id】") { // Tag_name tag_id 【tag_id】
if (item.displayValue != "") { let tree = viewer.model.getData().instanceTree;
if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {// TPE_B1_ME_M10 const model = viewer.model;
console.log("--------------------------------------------------"); const fragList = model.getFragmentList();
console.log("Tag_name dbid: " + e.dbId);
console.log("value: " + item.displayValue);
allDbIdsStr.forEach((dbId) => {
curDbId = parseInt(dbId);
viewer.getProperties(curDbId, function (e) {
e.properties.forEach(function (item) {
if (item.displayName == "【tag_id】") { // Tag_name tag_id 【tag_id】
if (item.displayValue != "") {
////if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {// TPE_B1_ME_M10
//console.log("--------------------------------------------------");
//console.log("Tag_name dbid: " + e.dbId);
//console.log("value: " + item.displayValue);
////}
var str = item.displayValue.split('_');
if (str.length == 2) { //兩段為房間 ex: U7F_01
roomDataList.push({ room_id: e.dbId, room_name: item.displayValue });
}
else if (str.length == 8) { //八段為設備 ex: TPE_B1_ME_M10_U7F_NA_FCU_N1
//取得座標
let bounds = new THREE.Box3();
instanceTree.enumNodeFragments(e.dbId, (fragId) => {
let box = new THREE.Box3();
fragList.getWorldBounds(fragId, box);
bounds.union(box);
}, true);
var position = bounds.center();
////if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {
//console.log("position: (" + (position.x).toFixed(2) + ", " + (position.y).toFixed(2) + ", " + (position.z).toFixed(2) + ")");
//console.log("--------------------------------------------------");
////}
tagIdDevList.push({ device_number: item.displayValue, device_coordinate_3d: '{ "x": ' + (position.x).toFixed(2) + ', "y": ' + (position.y).toFixed(2) + ', "z": ' + (position.z).toFixed(2) + ' }', forge_dbid: e.dbId });
}
} }
//var v = getFragmentWorldMatrixByNodeId(e.dbId, viewer);
//console.log("v: " + v);
//tree.enumNodeFragments(e.dbId, function (frag) {
// fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// fragProxy.getAnimTransform();
// console.log("postion: " + fragProxy.position + ", fragP: " + fragProxy.fragPosition);
//});
let bounds = new THREE.Box3();
instanceTree.enumNodeFragments(e.dbId, (fragId) => {
let box = new THREE.Box3();
fragList.getWorldBounds(fragId, box);
bounds.union(box);
}, true);
var position = bounds.center();
if ((item.displayValue).indexOf('TPE_B1_LT_L1') > -1) {
console.log("position: (" + (position.x).toFixed(2) + ", " + (position.y).toFixed(2) + ", " + (position.z).toFixed(2) + ")");
console.log("--------------------------------------------------");
}
} }
//getFragmentWorldMatrixByNodeId(e.dbId, viewer); });
//let fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
})
}
});
}) })
//---------------------- end ---------------------------------------------------
})
//---------------------- end ---------------------------------------------------
@ -359,116 +417,51 @@ function onDocumentLoadSuccess(doc) {
// }) // })
//}) //})
//let tree = viewer.model.getData().instanceTree;
let nodeId = 12112;//12104; //749; //10952;
let nodeId2 = 12111;//12105; //750;
let nodeId3 = 12110;//12104; //751;
tree.enumNodeFragments(nodeId, function (frag) {
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
fragProxy.getAnimTransform();
let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
fragProxy.position = fragPosition // //let tree = viewer.model.getData().instanceTree;
//let nodeId = 12112;//12104; //749; //10952;
//let nodeId2 = 12111;//12105; //750;
//let nodeId3 = 12110;//12104; //751;
fragProxy.updateAnimTransform() //tree.enumNodeFragments(nodeId, function (frag) {
// fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// fragProxy.getAnimTransform();
// let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
// fragProxy.position = fragPosition
// fragProxy.updateAnimTransform()
//});
//viewer.impl.sceneUpdated(true);
}); ////------------ add -------------
viewer.impl.sceneUpdated(true); //tree.enumNodeFragments(nodeId2, function (frag) {
// fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// fragProxy.getAnimTransform();
// let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
//------------ add ------------- // fragProxy.position = fragPosition
tree.enumNodeFragments(nodeId2, function (frag) {
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
fragProxy.getAnimTransform();
let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
fragProxy.position = fragPosition // fragProxy.updateAnimTransform()
fragProxy.updateAnimTransform() //});
//viewer.impl.sceneUpdated(true);
}); //tree.enumNodeFragments(nodeId3, function (frag) {
viewer.impl.sceneUpdated(true); // fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
// fragProxy.getAnimTransform();
// let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
tree.enumNodeFragments(nodeId3, function (frag) { // fragProxy.position = fragPosition
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
fragProxy.getAnimTransform();
let fragPosition = new THREE.Vector3(0, 0, 0);// 一樓0 二樓15 三樓 26
fragProxy.position = fragPosition // fragProxy.updateAnimTransform()
fragProxy.updateAnimTransform() //});
//viewer.impl.sceneUpdated(true);
});
viewer.impl.sceneUpdated(true);
}); });
//newLight();
//add toolbar fail //testLight = new THREE.SpotLight();
//function ToolbarExtension(viewer, options) {
// Autodesk.Viewing.Extension.call(this, viewer, options);
//}
//ToolbarExtension.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
//ToolbarExtension.prototype.constructor = ToolbarExtension;
//ToolbarExtension.prototype.load = function () {
// this.viewer.setLightPreset(6);
// this.viewer.setEnvMapBackground(true);
// this.viewer.fitToView();
// return true;
//};
//ToolbarExtension.prototype.unload = function () {
//};
//Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension);
//ToolbarExtension.prototype.onToolbarCreated = function (toolbar) {
// //alert('TODO: customize Viewer toolbar');
// var viewer = this.viewer;
// var button1 = new Autodesk.Viewing.UI.Button('show-env-bg-button');
// button1.onClick = function (e) {
// viewer.setEnvMapBackground(true);
// };
// button1.addClass('show-env-bg-button');
// button1.setToolTip('Show Environment');
// //SubToolbar
// this.subToolbar = new Autodesk.Viewing.UI.ControlGroup('my-custom-toolbar');
// this.subToolbar.addControl(button1);
// toolbar.addControl(this.subToolbar);
//};
//加入點燈光
//bulbLight = new THREE.PointLight(0xffffff, 1, 1, 2);//0xff0000
//bulbLight.position.set(-17.33, 51.03, -2.52);//17.880840301513672
//bulbLight.castShadow = true;
//bulbLight.intensity = 50;
//bulbLight.distance = 1;
//bulbLight.emissiveIntensity = bulbLight.intensity / Math.pow(0.02, 2.0);
//viewer.scene.add(bulbLight);
//聚光燈
//spotLight = new THREE.SpotLight(0xffff00, 80, 10);//0xffffff
//spotLight.position.set(-7.58, 18.20, -0.25); //set(-17.33, 51.03, -2.52);
//spotLight.castShadow = true;
//spotLight.visible = true;
//var geom = new THREE.BoxGeometry(); //create 幾何對象 -17.33, 51.03, -4.52
//var material = new THREE.MeshLambertMaterial({ color: 0xffff00 });//0xff0000
//var cube = new THREE.Mesh(geom, material);
//cube.position.set(-7.58, 18.20, -1); //set(-17.33, 51.03, -10);//-4.52
//viewer.scene.add(cube);
//spotLight.target = cube;
//viewer.scene.add(spotLight);
//light = newLight();
newLight();
} }
//------------------- 加入熱點 ----------------- //------------------- 加入熱點 -----------------
@ -482,7 +475,8 @@ async function addHotPoint(data) {
const spriteIcon = "https://d2zqnmauvnpnnm.cloudfront.net/assets-1/images/circle.svg"; //"/img/forge/hotspot.svg"; const spriteIcon = "https://d2zqnmauvnpnnm.cloudfront.net/assets-1/images/circle.svg"; //"/img/forge/hotspot.svg";
const style = new DataVizCore.ViewableStyle(viewableType, spriteColor, spriteIcon); const style = new DataVizCore.ViewableStyle(viewableType, spriteColor, spriteIcon);
var a = newLight(); //var a = newLight();
newLight();
//function onSpriteClicked(event) { //function onSpriteClicked(event) {
// console.log(`Sprite clicked: ${event.dbId}`); // console.log(`Sprite clicked: ${event.dbId}`);
//} //}
@ -521,7 +515,7 @@ async function addHotPoint(data) {
event.hasStopped = true; event.hasStopped = true;
if (event != undefined && event != null) { if (event != undefined && event != null) {
if (event.dbId >= 10 && event.dbId <= 13) {//event.dbId > 0 && event.dbId < 19 if (event.dbId >= 10 && event.dbId <= 13) {//event.dbId > 0 && event.dbId < 19
setLightValues(20, 0x00ff00) setLightValues(20, 0x00ff00);
console.log(`Sprite clicked: ${event.dbId}`); console.log(`Sprite clicked: ${event.dbId}`);
openHotspotModal(); openHotspotModal();
} }
@ -1387,26 +1381,26 @@ async function newLight() {
//angle - 光從其上界為 Math.PI / 2 的方向散射的最大角度。 //angle - 光從其上界為 Math.PI / 2 的方向散射的最大角度。
//半影 - 由於半影而衰減的聚光燈錐體的百分比。取值介於 0 和 1 之間。默認值為零。 //半影 - 由於半影而衰減的聚光燈錐體的百分比。取值介於 0 和 1 之間。默認值為零。
//decay - 光沿光的距離變暗的量。 //decay - 光沿光的距離變暗的量。
//spotLight = new THREE.SpotLight(0xff0000, 200, 20, 0.6, 0.5, 10);//0xffffff 80, 10 //15, 20 , Math.PI / 12 spotLight = new THREE.SpotLight(0xff0000, 200, 20, 0.6, 0.5, 10);//0xffffff 80, 10 //15, 20 , Math.PI / 12
//spotLight.position.set(43.72, -15.65, -44.96); //set(-17.33, 51.03, -2.52); // -7.58, 18.20, -0.25 -44.96 spotLight.position.set(43.72, -15.65, -44.96); //set(-17.33, 51.03, -2.52); // -7.58, 18.20, -0.25 -44.96
//spotLight.castShadow = false; spotLight.castShadow = false;
//spotLight.visible = true; spotLight.visible = true;
//spotLight.target.position.set(43.72, -15.65, -60);// -15.65 -48 spotLight.target.position.set(43.72, -15.65, -60);// -15.65 -48
//viewer.scene.add(spotLight.target); viewer.scene.add(spotLight.target);
//viewer.scene.add(spotLight); viewer.scene.add(spotLight);
//viewer.impl.sceneUpdated(true); viewer.impl.sceneUpdated(true);
//return spotLight; //return spotLight;
//加入點燈光 //加入點燈光
bulbLight = new THREE.PointLight(0xff0000, 50, 20, 2);//0xff0000 //bulbLight = new THREE.PointLight(0xffffff, 50, 20, 2);//0xff0000
bulbLight.position.set(43.72, -15.65, -44.96);//17.880840301513672 //bulbLight.position.set(43.72, -15.65, -44.96);//17.880840301513672
bulbLight.castShadow = true; //bulbLight.castShadow = true;
bulbLight.visible = true; //bulbLight.visible = true;
viewer.scene.add(bulbLight); //viewer.scene.add(bulbLight);
//pointLightHelper = new THREE.PointLightHelper(pointLight); //pointLightHelper = new THREE.PointLightHelper(pointLight);
//viewer.scene.add(pointLightHelper); //viewer.scene.add(pointLightHelper);
@ -1439,13 +1433,15 @@ function setLightValues(intensity, color) {// distance, angle, penumbra, decay,
function setLightOpenOrClose(value) {//, light function setLightOpenOrClose(value) {//, light
if (value) { if (value) {
//light.visible = true; //light.visible = true;
//spotLight.visible = true; spotLight.visible = true;
bulbLight.visible = true; //bulbLight.visible = true;
//testLight.visible = true;
} }
else { else {
//light.visible = false; //light.visible = false;
//spotLight.visible = false; spotLight.visible = false;
bulbLight.visible = false; //bulbLight.visible = false;
//testLight.visible = false;
} }
viewer.impl.sceneUpdated(true); viewer.impl.sceneUpdated(true);
} }
@ -1457,3 +1453,7 @@ function setLightTransparency(value) {
} }
//------------- end ----------------------------------- //------------- end -----------------------------------
function consoleList() {
console.log(tagIdDevList);
console.log(roomDataList);
}

View File

@ -21,27 +21,238 @@ var endPageLoading; // 開始 loading
window.tolSubList = []; window.tolSubList = [];
var user_name = ""; var user_name = "";
function subscriptionDevices() {
// 用BQL的方式去訂閱 class subscriptionDevices {
this.setSubscribeDevicesByBql = function (tempOrdPath) { constructor() {
ordPath = tempOrdPath; this.ordPath = {};
BajaSubscribeDevicesByBql(); this.changeCallback = null;
this.changeEndCallback = null;
}
setSubscribeDevicesByBql = function (tempOrdPath) {
this.ordPath = tempOrdPath;
this.BajaSubscribeDevicesByBql();
}; };
// BQL去訂閱回傳的Function
this.setSubscribeDevicesCallBack = function (callBackFunc) { setSubscribeDevicesCallBack = function (callBackFunc) {
if (callBackFunc != undefined && callBackFunc != null) { if (callBackFunc != undefined && callBackFunc != null) {
baja_subscribe_device_callback_func = callBackFunc; this.changeCallback = callBackFunc;
} }
} }
// BQL訂閱結束回傳的Function // BQL訂閱結束回傳的Function
this.setSubscribeDeviceEndCallBack = function (callBackFunc) { setSubscribeDeviceEndCallBack = function (callBackFunc) {
if (callBackFunc != undefined && callBackFunc != null) { if (callBackFunc != undefined && callBackFunc != null) {
baja_subscribe_end_device_callback_func = callBackFunc; this.changeEndCallback = callBackFunc;
} }
} }
BajaSubscribeDevicesByBql = function () {
let _this = this;
require(['baja!'], function (baja) {
console.log("進入Function 準備執行BQL訂閱");
startPageLoading ? startPageLoading() : ""
var init_start = new Date(Date.now());
var sub = new baja.Subscriber();
sub.attach('changed', function (prop) {
if (prop.getName() === 'out') {
var out_value = this.getOutDisplay();
var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
var point_name = this.getDisplayName();
//依據Facets判斷回傳的內容值為何
var facets_split = this.getFacets1().$cEncStr.split('|');
var facets_arr = [];
facets_split.forEach(function (item, index) {
facets_arr.push(item.split('=s:'));
});
var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
var point_out_split = this.getOutDisplay().split(' ');
let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
if (key == undefined) {
key = point_out_split[0];
}
var modify_target_device = {
"device_number": target_device_number ? target_device_number : null,
"device_number_full": this.$parent.getSlotPath().$names.join("_"),
"point_name": point_name ? point_name : null,
"value": key
}
if (_this.changeCallback != undefined && _this.changeCallback != null) {
_this.changeCallback(modify_target_device, true); //第2參數用在平面圖刷新畫面
}
}
}, function (err) {
console.log(err)
});
//使用bql語法
// var building_tag = "H";
// var system_tag = "M10";
// baja.Ord.make(`ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/${building_tag}/${system_tag}|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint`)
console.log(`local:|foxs:|station:|slot:/TPE/${_this.ordPath.building_tag}/${_this.ordPath.system_tag}/${_this.ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`);
baja.Ord.make(`local:|foxs:|station:|slot:/TPE/${_this.ordPath.building_tag}/${_this.ordPath.system_tag}/${_this.ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`)
.get(
function (table) {
var tableStart, tableFinish;
var subStart, subFinish;
var component_index = 0;
var total_component_index = 0;
var totalTargetDevice = [];
var readBqlFinish = new Date(Date.now());
// $("#readPath-finish-timestamp").html(readBqlFinish.toISOString());
// $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
table.cursor({
before: function () {
totalTargetDevice = [];
tableStart = new Date(Date.now());
$("#table-start-timestamp").html(tableStart.toISOString());
},
each: function (item, index) {
if (index < 1) {
subStart = new Date(Date.now());
$("#sub-start").html(subStart.toISOString());
}
$("#sub-number").html(index + 1);
total_component_index = index;
var target_device_number_split = this.getDisplay("slotPath").split('/');
var target_device_number = target_device_number_split[8];
//console.log(target_device_number);
var point_name = this.getDisplay("name");
var facets = this.getDisplay("facets");
//依據Facets判斷回傳的內容值為何
var facets_split = facets.split(',');
var facets_arr = [];
facets_split.forEach(function (item, index) {
facets_arr.push(item.split('='));
});
facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
var point_out_split = this.getDisplay("out").split(' ');
let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
if (key == undefined) {
key = point_out_split[0];
}
var modify_target_device = {
"device_number": target_device_number ? target_device_number : null,
"device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
"point_name": point_name ? point_name : null,
"value": key
}
totalTargetDevice.push(modify_target_device);
//取得component當下就更新設備點位
if (_this.changeCallback != undefined && _this.changeCallback != null) {
_this.changeCallback(modify_target_device);
}
baja.Ord.make("local:|foxs:|station:|" + this.getDisplay("slotPath"))
.get()
.then(function (component) {
component_index++;
var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
var point_name = component.getDisplayName();
// //依據Facets判斷回傳的內容值為何
// var facets_split = component.getFacets1().$cEncStr.split('|');
// var facets_arr = [];
// facets_split.forEach(function (item, index) {
// facets_arr.push(item.split('=s:'));
// });
// var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
// var point_out_split = component.getOutDisplay().split(' ');
// let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
// if (key == undefined) {
// key = point_out_split[0];
// }
// var modify_target_device = {
// "device_number": target_device_number ? target_device_number : null,
// "point_name": point_name ? point_name : null,
// "value": key
// }
// //取得component當下就更新設備點位
// if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
// if (component_index == total_component_index) {
// baja_subscribe_device_callback_func(modify_target_device, true);
// }
// else {
// baja_subscribe_device_callback_func(modify_target_device);
// }
// }
sub.subscribe({
comps: component,
});
tolSubList.push(sub);
subFinish = new Date(Date.now());
$("#sub-end").html(subFinish.toISOString());
$("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
// console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
});
},
after: function () {
tableFinish = new Date(Date.now());
// $("#table-finish-timestamp").html(tableFinish.toISOString());
// $("#table-time").html((tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
//取得component當下就更新設備點位
if (_this.changeEndCallback != undefined && _this.changeEndCallback != null) {
_this.changeEndCallback(totalTargetDevice);
}
endPageLoading ? endPageLoading() : ""
console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
},
limit: -1,
offset: 0
});
});
})
}
} }
//function subscriptionDevices() {
// // 用BQL的方式去訂閱
// this.setSubscribeDevicesByBql = function (tempOrdPath) {
// ordPath = tempOrdPath;
// BajaSubscribeDevicesByBql();
// };
// // BQL去訂閱回傳的Function
// this.setSubscribeDevicesCallBack = function (callBackFunc) {
// if (callBackFunc != undefined && callBackFunc != null) {
// baja_subscribe_device_callback_func = callBackFunc;
// }
// }
// // BQL訂閱結束回傳的Function
// this.setSubscribeDeviceEndCallBack = function (callBackFunc) {
// if (callBackFunc != undefined && callBackFunc != null) {
// baja_subscribe_end_device_callback_func = callBackFunc;
// }
// }
//}
function subscriptionAlarms() { function subscriptionAlarms() {
// 用BQL的方式去訂閱 // 用BQL的方式去訂閱
this.setSubscribeAlarmsByBql = function (tempOrdPath) { this.setSubscribeAlarmsByBql = function (tempOrdPath) {
@ -96,191 +307,191 @@ function MyBaja() {
/** /**
* 使用者透過BQL指定路徑去訂閱設備點位 * 使用者透過BQL指定路徑去訂閱設備點位
*/ */
function BajaSubscribeDevicesByBql() { //function BajaSubscribeDevicesByBql() {
require(['baja!'], function (baja) { // require(['baja!'], function (baja) {
console.log("進入Function 準備執行BQL訂閱"); // console.log("進入Function 準備執行BQL訂閱");
startPageLoading ? startPageLoading() : "" // startPageLoading ? startPageLoading() : ""
var init_start = new Date(Date.now()); // var init_start = new Date(Date.now());
var sub = new baja.Subscriber(); // var sub = new baja.Subscriber();
sub.attach('changed', function (prop) { // sub.attach('changed', function (prop) {
if (prop.getName() === 'out') { // if (prop.getName() === 'out') {
var out_value = this.getOutDisplay(); // var out_value = this.getOutDisplay();
var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_'); // var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
var point_name = this.getDisplayName(); // var point_name = this.getDisplayName();
//依據Facets判斷回傳的內容值為何 // //依據Facets判斷回傳的內容值為何
var facets_split = this.getFacets1().$cEncStr.split('|'); // var facets_split = this.getFacets1().$cEncStr.split('|');
var facets_arr = []; // var facets_arr = [];
facets_split.forEach(function (item, index) { // facets_split.forEach(function (item, index) {
facets_arr.push(item.split('=s:')); // facets_arr.push(item.split('=s:'));
}); // });
var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {}) // var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
var point_out_split = this.getOutDisplay().split(' '); // var point_out_split = this.getOutDisplay().split(' ');
let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]); // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
if (key == undefined) { // if (key == undefined) {
key = point_out_split[0]; // key = point_out_split[0];
} // }
var modify_target_device = { // var modify_target_device = {
"device_number": target_device_number ? target_device_number : null, // "device_number": target_device_number ? target_device_number : null,
"device_number_full": this.$parent.getSlotPath().$names.join("_"), // "device_number_full": this.$parent.getSlotPath().$names.join("_"),
"point_name": point_name ? point_name : null, // "point_name": point_name ? point_name : null,
"value": key // "value": key
} // }
if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) { // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
baja_subscribe_device_callback_func(modify_target_device, true); //第2參數用在平面圖刷新畫面 // baja_subscribe_device_callback_func(modify_target_device, true); //第2參數用在平面圖刷新畫面
} // }
} // }
}, function (err) { // }, function (err) {
console.log(err) // console.log(err)
}); // });
//使用bql語法 // //使用bql語法
// var building_tag = "H"; // // var building_tag = "H";
// var system_tag = "M10"; // // var system_tag = "M10";
// baja.Ord.make(`ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/${building_tag}/${system_tag}|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint`) // // baja.Ord.make(`ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/${building_tag}/${system_tag}|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint`)
console.log(`local:|foxs:|station:|slot:/${ordPath.area_tag}/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`); // console.log(`local:|foxs:|station:|slot:/TPE/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`);
baja.Ord.make(`local:|foxs:|station:|slot:/${ordPath.area_tag}/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`) // baja.Ord.make(`local:|foxs:|station:|slot:/TPE/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets from control:ControlPoint`)
.get( // .get(
function (table) { // function (table) {
var tableStart, tableFinish; // var tableStart, tableFinish;
var subStart, subFinish; // var subStart, subFinish;
var component_index = 0; // var component_index = 0;
var total_component_index = 0; // var total_component_index = 0;
var totalTargetDevice = []; // var totalTargetDevice = [];
var readBqlFinish = new Date(Date.now()); // var readBqlFinish = new Date(Date.now());
// $("#readPath-finish-timestamp").html(readBqlFinish.toISOString()); // // $("#readPath-finish-timestamp").html(readBqlFinish.toISOString());
// $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec"); // // $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec"); // console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
table.cursor({ // table.cursor({
before: function () { // before: function () {
totalTargetDevice = []; // totalTargetDevice = [];
tableStart = new Date(Date.now()); // tableStart = new Date(Date.now());
$("#table-start-timestamp").html(tableStart.toISOString()); // $("#table-start-timestamp").html(tableStart.toISOString());
render_start = new Date(Date.now()); // render_start = new Date(Date.now());
}, // },
each: function (item, index) { // each: function (item, index) {
if (index < 1) { // if (index < 1) {
subStart = new Date(Date.now()); // subStart = new Date(Date.now());
$("#sub-start").html(subStart.toISOString()); // $("#sub-start").html(subStart.toISOString());
} // }
$("#sub-number").html(index + 1); // $("#sub-number").html(index + 1);
total_component_index = index; // total_component_index = index;
var target_device_number_split = this.getDisplay("slotPath").split('/'); // var target_device_number_split = this.getDisplay("slotPath").split('/');
var target_device_number = target_device_number_split[8]; // var target_device_number = target_device_number_split[8];
//console.log(target_device_number); // //console.log(target_device_number);
var point_name = this.getDisplay("name"); // var point_name = this.getDisplay("name");
var facets = this.getDisplay("facets"); // var facets = this.getDisplay("facets");
//依據Facets判斷回傳的內容值為何 // //依據Facets判斷回傳的內容值為何
var facets_split = facets.split(','); // var facets_split = facets.split(',');
var facets_arr = []; // var facets_arr = [];
facets_split.forEach(function (item, index) { // facets_split.forEach(function (item, index) {
facets_arr.push(item.split('=')); // facets_arr.push(item.split('='));
}); // });
facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {}) // facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
var point_out_split = this.getDisplay("out").split(' '); // var point_out_split = this.getDisplay("out").split(' ');
let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]); // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
if (key == undefined) { // if (key == undefined) {
key = point_out_split[0]; // key = point_out_split[0];
} // }
var modify_target_device = { // var modify_target_device = {
"device_number": target_device_number ? target_device_number : null, // "device_number": target_device_number ? target_device_number : null,
"device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"), // "device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
"point_name": point_name ? point_name : null, // "point_name": point_name ? point_name : null,
"value": key // "value": key
} // }
totalTargetDevice.push(modify_target_device); // totalTargetDevice.push(modify_target_device);
//取得component當下就更新設備點位 // //取得component當下就更新設備點位
if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) { // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
baja_subscribe_device_callback_func(modify_target_device); // baja_subscribe_device_callback_func(modify_target_device);
} // }
baja.Ord.make("local:|foxs:|station:|" + this.getDisplay("slotPath")) // baja.Ord.make("local:|foxs:|station:|" + this.getDisplay("slotPath"))
.get() // .get()
.then(function (component) { // .then(function (component) {
component_index++; // component_index++;
var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_'); // var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
var point_name = component.getDisplayName(); // var point_name = component.getDisplayName();
// //依據Facets判斷回傳的內容值為何 // // //依據Facets判斷回傳的內容值為何
// var facets_split = component.getFacets1().$cEncStr.split('|'); // // var facets_split = component.getFacets1().$cEncStr.split('|');
// var facets_arr = []; // // var facets_arr = [];
// facets_split.forEach(function (item, index) { // // facets_split.forEach(function (item, index) {
// facets_arr.push(item.split('=s:')); // // facets_arr.push(item.split('=s:'));
// }); // // });
// var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {}) // // var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
// var point_out_split = component.getOutDisplay().split(' '); // // var point_out_split = component.getOutDisplay().split(' ');
// let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]); // // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
// if (key == undefined) { // // if (key == undefined) {
// key = point_out_split[0]; // // key = point_out_split[0];
// } // // }
// var modify_target_device = { // // var modify_target_device = {
// "device_number": target_device_number ? target_device_number : null, // // "device_number": target_device_number ? target_device_number : null,
// "point_name": point_name ? point_name : null, // // "point_name": point_name ? point_name : null,
// "value": key // // "value": key
// } // // }
// //取得component當下就更新設備點位 // // //取得component當下就更新設備點位
// if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) { // // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
// if (component_index == total_component_index) { // // if (component_index == total_component_index) {
// baja_subscribe_device_callback_func(modify_target_device, true); // // baja_subscribe_device_callback_func(modify_target_device, true);
// } // // }
// else { // // else {
// baja_subscribe_device_callback_func(modify_target_device); // // baja_subscribe_device_callback_func(modify_target_device);
// } // // }
// } // // }
sub.subscribe({ // sub.subscribe({
comps: component, // comps: component,
}); // });
tolSubList.push(sub); // tolSubList.push(sub);
subFinish = new Date(Date.now()); // subFinish = new Date(Date.now());
$("#sub-end").html(subFinish.toISOString()); // $("#sub-end").html(subFinish.toISOString());
$("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec"); // $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
// console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec"); // // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
}); // });
}, // },
after: function () { // after: function () {
tableFinish = new Date(Date.now()); // tableFinish = new Date(Date.now());
// $("#table-finish-timestamp").html(tableFinish.toISOString()); // // $("#table-finish-timestamp").html(tableFinish.toISOString());
// $("#table-time").html((tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec"); // // $("#table-time").html((tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
//取得component當下就更新設備點位 // //取得component當下就更新設備點位
if (baja_subscribe_end_device_callback_func != undefined && baja_subscribe_end_device_callback_func != null) { // if (baja_subscribe_end_device_callback_func != undefined && baja_subscribe_end_device_callback_func != null) {
baja_subscribe_end_device_callback_func(totalTargetDevice); // baja_subscribe_end_device_callback_func(totalTargetDevice);
} // }
endPageLoading ? endPageLoading() : "" // endPageLoading ? endPageLoading() : ""
console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec"); // console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
}, // },
limit: -1, // limit: -1,
offset: 0 // offset: 0
}); // });
}); // });
}) // })
} //}
/** /**
* 使用者透過BQL指定路徑去訂閱Alarm * 使用者透過BQL指定路徑去訂閱Alarm
@ -296,7 +507,7 @@ function BajaSubscribeAlarmsByBql(ordPathForAlarm) {
var sourceState = (this.$map.$map.in10.$val.$map.$map.value.$display) == 'true' ? "Offnormal" : "Normal"; var sourceState = (this.$map.$map.in10.$val.$map.$map.value.$display) == 'true' ? "Offnormal" : "Normal";
var modify_target_device = { var modify_target_device = {
"system": ordPathForAlarm.area_tag + "_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag, "system": "TPE_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag,
"sourceState": sourceState ? sourceState : null "sourceState": sourceState ? sourceState : null
} }
@ -307,8 +518,8 @@ function BajaSubscribeAlarmsByBql(ordPathForAlarm) {
}); });
//使用bql語法 //使用bql語法
console.log(`local:|foxs:|alarm:|bql:select top 1 timestamp, sourceState, normalTime where alarmData.sourceName like '%${ordPathForAlarm.area_tag}_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`); console.log(`local:|foxs:|alarm:|bql:select top 1 timestamp, sourceState, normalTime where alarmData.sourceName like '%TPE_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`);
baja.Ord.make(`local:|foxs:|alarm:|bql:select top 1 timestamp, sourceState, alarmData, alarmData.sourceName, normalTime where alarmData.sourceName like '%${ordPathForAlarm.area_tag}_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`) baja.Ord.make(`local:|foxs:|alarm:|bql:select top 1 timestamp, sourceState, alarmData, alarmData.sourceName, normalTime where alarmData.sourceName like '%TPE_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`)
.get( .get(
function (table) { function (table) {
var tableStart, tableFinish; var tableStart, tableFinish;
@ -338,7 +549,7 @@ function BajaSubscribeAlarmsByBql(ordPathForAlarm) {
var normalTime = this.getDisplay("normalTime"); var normalTime = this.getDisplay("normalTime");
var modify_target_device = { var modify_target_device = {
"system": ordPathForAlarm.area_tag + "_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag, "system": "TPE_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag,
"sourceState": sourceState ? sourceState : null "sourceState": sourceState ? sourceState : null
} }
totalTargetDevice.push(modify_target_device); totalTargetDevice.push(modify_target_device);

View File

@ -368,16 +368,29 @@ function dayToChiDay(num) {
} }
// 取得現在或前後時間,輸出單位依據 type // 取得現在或前後時間,輸出單位依據 type
function getTimeByType(type = null, cal = 0) { function getTimeByType(type = null, cal = 0, unit = "d") {
let now = new Date(); let now = new Date();
return strToDate(now, type, cal); return strToDate(now, type, cal, unit);
} }
// 取得某當下時間或前後時間,輸出單位依據 type // 取得某當下時間或前後時間,輸出單位依據 type
function strToDate(text, type = null, cal = 0) { function strToDate(text, type = null, cal = 0, unit = "d") {
let calDay = function (_d, _cal) { let dec = 24 * 60 * 60 * 1000;
return new Date(_d.getTime() + (cal * 24 * 60 * 60 * 1000));
if (unit == "d") {
dec = 24 * 60 * 60 * 1000;
} else if (unit == "h") {
dec = 60 * 60 * 1000;
} else if (unit == "m") {
dec = 60 * 1000;
} else if (unit == "s") {
dec = 1000;
} }
let calDay = function (_d, _cal) {
return new Date(_d.getTime() + (cal * dec));
}
let tarDate = new Date(text); let tarDate = new Date(text);
let result = 0; let result = 0;
if (type == "year") { if (type == "year") {
@ -394,6 +407,23 @@ function strToDate(text, type = null, cal = 0) {
return result; return result;
} }
function dateRanCutPart(start, end, cutNum) {
let sTime = (new Date(start)).getTime();
let eTime = (new Date(end)).getTime();
let cutTimeArr = [];
if (sTime < eTime) return [];
let partNum = (sTime - eTime) / cutNum;
for (let i = eTime; i <= sTime; i = i + partNum) {
cutTimeArr.push(i)
}
cutTimeArr.forEach(x => new Date(x));
return cutTimeArr;
}
function isJSON(str) { function isJSON(str) {
try { try {
JSON.parse(str); JSON.parse(str);

View File

@ -307,7 +307,14 @@ function displayDate(dateTime, dateType = "YMdHms", locale = 'zh-TW') {
if (dateTime) { if (dateTime) {
let regex = /^\/Date\((\d+)\)\/$/gm; let regex = /^\/Date\((\d+)\)\/$/gm;
let t = Date.parse(dateTime); //若從資料庫回傳 /Date(xxxxxxxxxxxxxx)/ DateTime格式 let t = null; //若從資料庫回傳 /Date(xxxxxxxxxxxxxx)/ DateTime格式
if (typeof dateTime == "number" && dateTime > 1000000) {
dateTime = new Date(dateTime);
}
t = Date.parse(dateTime);
if (regex.test(dateTime)) { if (regex.test(dateTime)) {
t = parseInt(dateTime.replace(regex, '$1')); t = parseInt(dateTime.replace(regex, '$1'));
} }
@ -354,9 +361,30 @@ function displayDate(dateTime, dateType = "YMdHms", locale = 'zh-TW') {
hour = d.getHours(); hour = d.getHours();
minute = d.getMinutes(); minute = d.getMinutes();
} }
date = [year, String(month).padStart(2, '0'), String(day).padStart(2, '0')].filter(n => n).join("/"); date = [year, String(month).padStart(2, '0'), String(day).padStart(2, '0')].filter(n => n).join("/");
time = [String(hour).padStart(2, '0'), String(minute).padStart(2, '0')].filter(n => n).join(":");
result = date.toString() + " " + time.toString(); time = [String(hour).padStart(2, '0'), String(minute).padStart(2, '0')];
if (dateType != "date" && dateType != "time" && dateType != "datetime") {
let showArr = [];
if (year) showArr.push(year);
if (month) showArr.push(month.toString().padStart(2, '0'));
if (day) showArr.push(day.toString().padStart(2, '0'));
if (showArr.length != 0) {
result += showArr.join("/");
showArr = [];
}
if (hour) showArr.push(hour.toString().padStart(2, '0'));
if (minute) showArr.push(minute.toString().padStart(2, '0'));
if (second) showArr.push(second.toString().padStart(2, '0'));
if (millisecond) showArr.push(millisecond.toString().padStart(3, '0'));
if (showArr.length != 0) {
result += " " + showArr.join(":");
}
} else {
result = date.toString() + " " + time.toString();
}
if (dateType == "date") { if (dateType == "date") {
result = date.toString(); result = date.toString();

View File

@ -103,7 +103,7 @@ class YourTeamNavbar {
$("[data-toggle=navbar]").each((idx, ele) => { $("[data-toggle=navbar]").each((idx, ele) => {
let target = $(ele).data("target"); let target = $(ele).data("target");
if ($(this.element)[0] == $(target)[0]) { if ($(this.element)[0] == $(target)[0]) {
$(ele).off("click").on("click", () => { $(ele).on("click", () => {
this.toggle(); this.toggle();
}) })
} }

View File

@ -33,7 +33,10 @@ function initTabsByEle() {
class YourTeamTab { class YourTeamTab {
constructor(option = {}) { constructor(option = {}) {
this.tabName = option.tabName ?? null; this.tabName = option.tabName ?? null;
this.activeEle = null;
this.eventArg = { cancel: false };
this.init() this.init()
} }
init = function () { init = function () {
@ -44,23 +47,49 @@ class YourTeamTab {
this.event(); this.event();
$(`[data-tabname=${this.tabName}][data-tabrole=child]`).css("display", "none"); $(`[data-tabname=${this.tabName}][data-tabrole=child]`).css("display", "none");
if ($(`[data-tabname=${this.tabName}][data-target].active`).length == 0) { if ($(`[data-tabname=${this.tabName}][data-target].active`).length == 0) {
$(`[data-tabname=${this.tabName}][data-target]`).first().trigger("click"); let parTabEle = $(`[data-tabname=${this.tabName}][data-target]`).first();
if (parTabEle.data("toggle") == "tab" || !parTabEle.data("toggle")) {
$(`[data-tabname=${this.tabName}][data-target]`).first().trigger("click");
}
} else { } else {
$(`[data-tabname=${this.tabName}][data-target].active`).first().trigger("click"); $(`[data-tabname=${this.tabName}][data-target].active`).first().trigger("click");
} }
_ytTabInited.push(this.tabName); _ytTabInited.push(this.tabName);
this.setThisObj();
}
setThisObj = function () {
$(`[data-tabname=${this.tabName}]`).each((idx, ele) => {
$(ele)[0]._ytTab = this;
})
}
setActItem = function (element) {
this.activeEle = element;
}
updActClass = function () {
$(`[data-tabname=${this.tabName}]:not([data-tabrole=child])`).removeClass("active");
$(this.activeEle).addClass("active");
} }
event = function () { event = function () {
let clsObj = this; let clsObj = this;
// Tab Item 按鈕 click // Tab Item 按鈕 click
$(`[data-tabname=${this.tabName}]`).off("click").on("click", function (e) { $(`[data-tabname=${this.tabName}]`).on("click", function (e) {
let target = $(this).data("target"); let target = $(this).data("target");
let obj = this; let obj = this;
$(`[data-tabname=${clsObj.tabName}]:not([data-tabrole=child])`).removeClass("active"); clsObj.eventArg.cancel = false;
$(obj).addClass("active"); $(obj).trigger("yt:tab:prechange", clsObj.eventArg)
if (clsObj.eventArg.cancel) {
return;
}
clsObj.activeEle = obj;
clsObj.updActClass();
// 觸發 yt:tab:change事件 // 觸發 yt:tab:change事件
$(obj).trigger("yt:tab:change"); $(obj).trigger("yt:tab:change");
if (target) { if (target) {
@ -80,4 +109,30 @@ class YourTeamTab {
} }
} }
$.fn.YTTab = function (method,...arg) {
let tabObj = $(this)[0]._ytTab;
if (!tabObj) {
let tabName = $(this).data("tabname");
if (tabName && _ytTabInited.indexOf(tabName) == -1) {
let ytTab = new YT.Tab({ tabName: tabName })
_ytTabInited.push(tabName);
tabObj = ytTab;
} else {
return this;
}
}
if (method == "set") {
tabObj.setActItem(this);
tabObj.updActClass();
} else if (method == "setAndClick") {
tabObj.setActItem(this);
$(this).click();
}
return tabObj;
}
YT.Tab = YT.Tab || YourTeamTab; YT.Tab = YT.Tab || YourTeamTab;

View File

@ -872,5 +872,43 @@ namespace FrontendWebApi.ApiControllers
} }
return Ok(apiResult); return Ok(apiResult);
} }
/// <summary>
/// 取得 Device Item 系統小類下的點位資訊
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetDeviceItem")]
public async Task<ActionResult<ApiResult<List<DeviceItemViewModel>>>> GetDeviceItem([FromBody] FindDeviceItem fdi)
{
ApiResult<List<DeviceItemViewModel>> apiResult = new ApiResult<List<DeviceItemViewModel>>();
if (string.IsNullOrEmpty(fdi.main_system_tag) || string.IsNullOrEmpty(fdi.sub_system_tag))
{
apiResult.Code = "0002";
apiResult.Msg = "需傳入大小類tag";
return apiResult;
}
try
{
var sqlString = $@" SELECT * FROM device_item
WHERE deleted = '0' AND device_system_tag = @main_system_tag AND device_name_tag = @sub_system_tag AND points = IFNULL(@points,points)";
var param = new { @main_system_tag = fdi.main_system_tag, @sub_system_tag = fdi.sub_system_tag, @points = fdi.points };
var fr = await backendRepository.GetAllAsync<DeviceItemViewModel>(sqlString, param);
apiResult.Code = "0000";
apiResult.Data = fr;
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return Ok(apiResult);
}
return Ok(apiResult);
}
} }
} }

View File

@ -1,14 +1,18 @@
using FrontendWebApi.Models; using FrontendWebApi.Models;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using NPOI.SS.Formula.PTG;
using Repository.BackendRepository.Interface; using Repository.BackendRepository.Interface;
using Repository.FrontendRepository.Interface; using Repository.FrontendRepository.Interface;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.SqlTypes; using System.Data.SqlTypes;
using System.IO; using System.IO;
using System.Linq;
using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace FrontendWebApi.ApiControllers namespace FrontendWebApi.ApiControllers
@ -47,5 +51,72 @@ namespace FrontendWebApi.ApiControllers
} }
return Ok(apiResult); return Ok(apiResult);
} }
[HttpPost]
[Route("api/Energe/GetAutDemVal")]
public async Task<ActionResult<ApiResult<List<Variable>>>> GetAutDemVal()
{
ApiResult<List<Variable>> apiResult = new ApiResult<List<Variable>>();
try
{
var sqlString = $@"SELECT system_value,system_key FROM variable
where system_type = 'automated_demand_response' and deleted = '0'";
var ess = await backendRepository.GetAllAsync<Variable>(sqlString);
apiResult.Code = "0000";
apiResult.Data = ess;
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return Ok(apiResult);
}
return Ok(apiResult);
}
[HttpPost]
[Route("api/Energe/EdiAutDemVal")]
public async Task<ActionResult<ApiResult<List<int?>>>> EdiAutDemVal([FromBody] List<Variable> variables)
{
ApiResult<List<int?>> apiResult = new ApiResult<List<int?>>();
try
{
var sqlString = $@"SELECT system_value,system_key FROM variable
where system_type = 'automated_demand_response' and deleted = '0'";
var vs = await backendRepository.GetAllAsync<Variable>(sqlString);
var autDemKeys = vs.Select(x => x.System_key);
foreach (var v in variables) {
if (autDemKeys.Where(x => x == v.System_key).Count() != 0) {
Dictionary<string, object> sqlParam = new Dictionary<string, object>() {
{ "@system_key", v.System_key},
{ "@system_value", v.system_value},
{ "@updated_by", myUser.userinfo_guid},
{ "@updated_at", DateTime.Now},
};
await backendRepository.UpdateOneByCustomTable(sqlParam, "variable", $" system_type = 'automated_demand_response' AND system_key = @system_key");
}
}
apiResult.Code = "0000";
apiResult.Data = null;
apiResult.Msg = "編輯成功";
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "系統內部錯誤,請聯絡管理者。" + exception.Message;
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return Ok(apiResult);
}
return Ok(apiResult);
}
} }
} }

View File

@ -141,4 +141,27 @@ namespace FrontendWebApi.Models
public string device_node_coordinate_3d { get; set; } public string device_node_coordinate_3d { get; set; }
public int? forge_dbid { get; set; } public int? forge_dbid { get; set; }
} }
public class DeviceItemViewModel
{
public int id { get; set; }
public short deleted { get; set; }
public string full_name { get; set; }
public string points { get; set; }
public string unit { get; set; }
public short is_show { get; set; }
public short? is_show_riserDiagram { get; set; }
public short is_controll { get; set; }
public short is_bool { get; set; }
public short is_link { get; set; }
public short is_show_history { get; set; }
public string device_system_tag { get; set; }
public string device_name_tag { get; set; }
}
public class FindDeviceItem : FindDevice
{
public string points { get; set; }
}
} }

View File

@ -7,4 +7,6 @@
public string system_remark { get; set; } public string system_remark { get; set; }
public string priority { get; set; } public string priority { get; set; }
} }
} }

View File

@ -48,10 +48,10 @@ namespace FrontendWebApi.Models
public class Variable : Actor public class Variable : Actor
{ {
public int id { get; set; } public int? id { get; set; }
public string System_type { get; set; } public string System_type { get; set; }
public string System_key { get; set; } public string System_key { get; set; }
public string system_value { get; set; } public string system_value { get; set; }
public int system_parent_id { get; set; } public int? system_parent_id { get; set; }
} }
} }

View File

@ -6,10 +6,10 @@
"Microsoft.Hosting.Lifetime": "Information" "Microsoft.Hosting.Lifetime": "Information"
} }
}, },
"LoginExpireMinute": 3600, //() "LoginExpireMinute": 3600, //<EFBFBD>n<EFBFBD>J<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD>)
"JwtSettings": { "JwtSettings": {
"Issuer": "Admin", // "Issuer": "Admin", //<EFBFBD>o<EFBFBD>e<EFBFBD><EFBFBD>
"SignKey": "TaipeiDome123456", ////16 "SignKey": "TaipeiDome123456", //ñ<EFBFBD><EFBFBD>//<EFBFBD>̤<EFBFBD>16<EFBFBD>r<EFBFBD><EFBFBD>
"JwtLifeSeconds": 3600 "JwtLifeSeconds": 3600
}, },
"DBConfig": { "DBConfig": {