This commit is contained in:
dev02 2023-01-04 15:25:28 +08:00
commit 18426a3624
9 changed files with 224 additions and 138 deletions

View File

@ -755,6 +755,7 @@ namespace Backend.Controllers
public async Task<ApiResult<string>> ImportDevForCor([FromBody] List<ImportDevForCoo> post) public async Task<ApiResult<string>> ImportDevForCor([FromBody] List<ImportDevForCoo> post)
{ {
ApiResult<string> apiResult = new ApiResult<string>(); ApiResult<string> apiResult = new ApiResult<string>();
var device_guid_record = "";
try try
{ {
if (post != null) if (post != null)
@ -762,38 +763,43 @@ namespace Backend.Controllers
if (post.Count > 0) if (post.Count > 0)
{ {
//清空device_node資料表 //清空device_node資料表
//await backendRepository.TruncateTable("device_node"); await backendRepository.TruncateTable("device_node");
//int node_priority = 1; int node_priority = 1;
foreach(var idfc in post) foreach(var idfc in post)
{ {
//if(idfc.device_number.IndexOf("_LT_L1") > -1) if (idfc.device_number.IndexOf("_LT_L1") > -1)
//{ {
// //取得device_guid //取得device_guid
// var sWhere = $@"where deleted = 0 and device_number = " + idfc.device_number; var sWhere = $@" deleted = 0 and device_number = '" + idfc.device_number + "'";
// var device_guid = await backendRepository.GetOneAsync<string>("device_node", sWhere, "device_guid"); var device_guid = await backendRepository.GetOneColAsync("device", sWhere, "device_guid");
if(device_guid.ToString() != device_guid_record)
{
device_guid_record = device_guid.ToString();
node_priority = 1;
}
// //燈具 //燈具
// Dictionary<string, object> device = new Dictionary<string, object>(); Dictionary<string, object> device = new Dictionary<string, object>();
// device.Add("@device_node_guid", Guid.NewGuid()); device.Add("@device_node_guid", Guid.NewGuid());
// device.Add("@deleted", 0); device.Add("@deleted", 0);
// device.Add("@device_guid", device_guid); device.Add("@device_guid", device_guid);
// device.Add("@device_node_coordinate_3d", idfc.device_coordinate_3d); device.Add("@device_node_coordinate_3d", idfc.device_coordinate_3d);
// device.Add("@forge_dbid", idfc.forge_dbid); device.Add("@forge_dbid", idfc.forge_dbid);
// device.Add("@priority", node_priority); device.Add("@priority", node_priority);
// device.Add("@created_by", myUserInfo.Userinfo_guid); device.Add("@created_by", myUserInfo.Userinfo_guid);
// device.Add("@created_at", DateTime.Now); device.Add("@created_at", DateTime.Now);
// node_priority++; node_priority++;
// await backendRepository.AddOneByCustomTableReturnId(device, "device_node", false); await backendRepository.AddOneByCustomTableReturnId(device, "device_node", false);
//} }
//else else
//{ {
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);
await backendRepository.UpdateOneByCustomTable(device, "device", $@" device_number = '{idfc.device_number}'"); await backendRepository.UpdateOneByCustomTable(device, "device", $@" device_number = '{idfc.device_number}'");
//} }

View File

@ -184,7 +184,6 @@
<script> <script>
var curLightIsOpen = true; var curLightIsOpen = true;
var objSendData = { Data: null };
$(document).ready(function () { $(document).ready(function () {
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDLm53ZA'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDLm53ZA');
@ -238,8 +237,10 @@
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8lRTUlOEQlOEElRTklODAlOEYlRTYlOTglOEUlRTUlQkIlQkElRTclQUYlODlfMTJfMzAubndk'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8lRTUlOEQlOEElRTklODAlOEYlRTYlOTglOEUlRTUlQkIlQkElRTclQUYlODlfMTJfMzAubndk');
//12.31 整棟樓 //12.31 整棟樓
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA'); //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA');
//雙模式
launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGEzaHFzZmZ6cWJub3V4a3BsZGt1a3NldzRzajIxdzUtYmltc19tb2RlbHMvJUUzJTgwJTkwJUU1JThGJUIwJUU1JThDJTk3JUU0JUI4JUFEJUU4JThGJUIxJUU1JUE0JUE3JUU2JUE4JTkzJUUzJTgwJTkxQVJDJUU5JTlCJTk5JUU2JUE4JUExJUU1JUJDJThGK01FUCVFNiU4QiU4NiVFNyVCMyVCQiVFNyVCNSVCMV8yMDIyXzEyXzMxLm53ZA==');
//launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxXzIwMjJfMTJfMTMubndk');//new ARC //launchViewer('dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxXzIwMjJfMTJfMTMubndk');//new ARC
@ -384,75 +385,6 @@
function ImportDevForCor() {//callback = null function ImportDevForCor() {//callback = null
var url = "/DeviceImport/ImportDevForCor"; 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) {
// console.log(rel.msg);
// } else {
// console.log(rel.msg);
// }
//}, null, "POST").send();
//$.post(url, objSendData.Data, function (rel) {
// if (rel.code != "0000") {
// if (rel.code == "9999") {
// //toast_error(rel.msg);
// console.log(rel.msg);
// }
// else {
// //toast_warning(rel.msg);
// console.log(rel.msg);
// }
// return;
// }
// else {
// //toast_ok(rel.msg);
// console.log(rel.msg);
// //ReloadRawDataCheckTable();
// }
//}, 'json');
//headers={'content-type': 'application/json'}
//$.ajax({
// type: "POST",
// url: url,
// data: objSendData.Data,
// 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);
// console.log(rel.msg);
// }
// else {
// //toast_warning(rel.msg);
// console.log(rel.msg);
// }
// return;
// }
// else {
// //toast_ok(rel.msg);
// console.log(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);
// }
//});
$.ajax({ $.ajax({
method: "POST", method: "POST",
@ -463,29 +395,21 @@
contentType: "application/json; charset=UTF-8", contentType: "application/json; charset=UTF-8",
dataType: 'json', dataType: 'json',
success: function (rel) { success: function (rel) {
//$("#save-building-btn").html('確定').attr("disabled", false);
if (rel.code != "0000") { if (rel.code != "0000") {
if (rel.code == "9999") { if (rel.code == "9999") {
//toast_error(rel.msg);
console.log(rel.msg); console.log(rel.msg);
} }
else { else {
//toast_warning(rel.msg);
console.log(rel.msg); console.log(rel.msg);
} }
return; return;
} }
else { else {
//toast_ok(rel.msg);
console.log(rel.msg); console.log(rel.msg);
//buildInfoTable.ajax.reload(null, false);
//$('#build-modal').modal('hide');
return; return;
} }
}, },
fail: function (xhr, status, error) { fail: function (xhr, status, error) {
//$("#save-building-btn").html('確定').attr("disabled", false);
//toast_error(rel.msg);
} }
}); });

View File

@ -45,7 +45,9 @@
setLightColor(); setLightColor();
} }
if (arr.indexOf(3) != -1) { if (arr.indexOf(3) != -1) {
getHotspotPoint(() => { getHotspotPoint(() => {
getLightDevice();
show3DModel(data.urn_3D); show3DModel(data.urn_3D);
}); });
@ -335,11 +337,50 @@
} }
async function getLightDevice() {//callback = null
getLightData(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 myLightList = [];
$.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);
myLightList.push(item);
})
console.log("2", myLightList);
setLightList(myLightList);
//callback ? callback() : "";
}
}, null, "POST").send();
}
function setHotspotPoint(myDataList = []) { function setHotspotPoint(myDataList = []) {
console.log(myDataList) console.log(myDataList)
getHopspotPoint(myDataList); getHopspotPoint(myDataList);
} }
async function setLightList(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

@ -5,6 +5,7 @@ var targetFloorZ;
var elevatorSpeed; var elevatorSpeed;
var selector = "#forgeViewer"; var selector = "#forgeViewer";
var myDataList; var myDataList;
var lightDataList;
var lightList = [];//燈光清單 var lightList = [];//燈光清單
var levels;//剖面用 var levels;//剖面用
var lowerIdx;//剖面的下方樓層 var lowerIdx;//剖面的下方樓層
@ -304,6 +305,16 @@ 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 => {
// documented loaded, any action? // documented loaded, any action?
@ -323,6 +334,7 @@ function onDocumentLoadSuccess(doc, eleOption) {
$(selector).trigger("autodesk:loaded", nodeIds); $(selector).trigger("autodesk:loaded", nodeIds);
}); });
}); });
@ -607,35 +619,18 @@ class ADHeatMaps {
} }
} }
//全部物件 透明度: 輸入0:透明輸入1:不透明
function setTransparentBuilding() { function setTransparentBuilding(transparent) {
//allDbIdsStr.forEach((dbId) => {
// setTransparency(dbId, 0.2);
//})
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]), transparent);
}
}
function recoverTransparentBuilding() {
//allDbIdsStr.forEach((dbId) => {
// setTransparency(dbId, 1);
//})
for (var i = 0; i < allDbIdsStr.length; i++) {
setTransparency(parseInt(allDbIdsStr[i]), 1);
} }
} }
//設定模型 透明度 //設定模型 透明度
function setTransparency(nodeId, opacity) { function setTransparency(nodeId, opacity) {
var model = viewer.model; var model = viewer.model;
//var nodeId = 1633;
var fragList = viewer.model.getFragmentList(); var fragList = viewer.model.getFragmentList();
var fragIds = [];
var fragIds = []
model.getData().instanceTree.enumNodeFragments( model.getData().instanceTree.enumNodeFragments(
nodeId, (fragId) => { nodeId, (fragId) => {
@ -694,6 +689,14 @@ 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) {
// 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
@ -711,9 +714,6 @@ async function addHotPoint(data) {
const viewable = new DataVizCore.SpriteViewable(myPosition, style, dbId); const viewable = new DataVizCore.SpriteViewable(myPosition, style, dbId);
myData._dbId = dbId; myData._dbId = dbId;
viewableData.addViewable(viewable); viewableData.addViewable(viewable);
if (myData.device_number.indexOf("_LT_L1_") > -1) {
lightList.push({ dbid: myData.forge_dbid, name: myData.device_number, spotLight: newLight(myPosition) });
}
}); });
await viewableData.finish(); await viewableData.finish();
@ -913,7 +913,7 @@ function profile() {
//新增燈光 //新增燈光
async function newLight(lightPosition) { async function newLight(lightPosition) {
//聚光燈 //聚光燈
spotLight = new THREE.SpotLight(0xff0000, 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);
spotLight.castShadow = false; spotLight.castShadow = false;
spotLight.visible = true; spotLight.visible = true;
@ -925,15 +925,11 @@ async function newLight(lightPosition) {
return spotLight; return spotLight;
} }
//調整燈光參數 setLightValues(13593, 10, 10, 0.1, 0.3, 1, 0xffff00); //調整燈光 強度、顏色
async function setLightValues(dbid, intensity, distance, angle, penumbra, decay, color) { async function setLightValues(dbid, 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].dbid == dbid) {
lightList[i].spotLight.intensity = intensity; lightList[i].spotLight.intensity = intensity;
lightList[i].spotLight.distance = distance;
lightList[i].spotLight.angle = angle;
lightList[i].spotLight.penumbra = penumbra;
lightList[i].spotLight.decay = decay;
var tempcolor = new THREE.Color().setHex(color); var tempcolor = new THREE.Color().setHex(color);
lightList[i].spotLight.color = tempcolor; lightList[i].spotLight.color = tempcolor;
@ -942,6 +938,23 @@ async function setLightValues(dbid, intensity, distance, angle, penumbra, decay,
} }
} }
//燈光開關
function setLightOpenOrClose(value, light) {
if (value) {
light.visible = true;
}
else {
light.visible = false;
}
viewer.impl.sceneUpdated(true);
}
//透過nodeId更改物件顏色或顯示與否color請填寫THREE.Vector4
function changeColorTransparency(nodeId, color) {//變綠色
//var color = new THREE.Vector4(0, 1, 0, 1);//綠色前三個代表r、g、b; 亦可填入255/255
//var color = new THREE.Vector4(0, 1, 0, 0);//不顯示顏色;最後的參數為透明度
viewer.setThemingColor(nodeId, color);
}
//======================== 外部呼叫function =========================== //======================== 外部呼叫function ===========================
//紀錄熱點座標 //紀錄熱點座標
@ -949,6 +962,11 @@ 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;

View File

@ -711,6 +711,37 @@ namespace FrontendWebApi.ApiControllers
return Ok(apiResult); return Ok(apiResult);
} }
[HttpPost]
[Route("api/GetDevNodeForCor")]
public async Task<ActionResult<List<DevNodeForCor>>> GetDevNodeForCor([FromBody] Device p)
{
ApiResult<List<DevNodeForCor>> apiResult = new ApiResult<List<DevNodeForCor>>();
List<DevNodeForCor> device = new List<DevNodeForCor>();
try
{
apiResult.Code = "0001";
if (p != null )
{
if (p.device_system_tag == "LT" && p.device_name_tag == "L1")
{
var d = await backendRepository.GetAllAsync<DevNodeForCor>($@"select device_guid,priority,device_node_coordinate_3d,forge_dbid from device_node where deleted = 0");
apiResult.Data = d;
apiResult.Code = "0000";
}
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return Ok(apiResult);
}
return Ok(apiResult);
}
/// <summary> /// <summary>
/// 燈控排程列表 /// 燈控排程列表
/// </summary> /// </summary>

View File

@ -793,6 +793,17 @@ namespace FrontendWebApi.ApiControllers
}); });
} }
[HttpPost]
[Route("api/getUserFull")]
public ActionResult GetUserFull()
{
return Json(new
{
code = "0000",
data = myUser
});
}
[HttpPost] [HttpPost]
public async Task<ApiResult<string>> GetUsrRolId([FromBody] User post) public async Task<ApiResult<string>> GetUsrRolId([FromBody] User post)
{ {

View File

@ -133,4 +133,12 @@ namespace FrontendWebApi.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 DevNodeForCor
{
public string device_guid { get; set; }
public int priority { get; set; }
public string device_node_coordinate_3d { get; set; }
public int? forge_dbid { get; set; }
}
} }

View File

@ -270,6 +270,41 @@ namespace Repository.BaseRepository.Implement
return result; return result;
} }
} }
/// <summary>
/// 取得單一筆資料某一欄位(排序)
/// </summary>
/// <param name="tableName"></param>
/// <param name="sWhere"></param>
/// <param name="selCol">填放欄位</param>
/// <param name="param">參數值</param>
/// <param name="sOrderBy"></param>
/// <returns></returns>
public virtual async Task<string> GetOneColAsync(string tableName, string sWhere, string selCol, object param = null, string sOrderBy = "")
{
string result;
using (IDbConnection conn = GetDbConnection())
{
try
{
var sql = $"SELECT {selCol} FROM {tableName}";
if (!string.IsNullOrEmpty(sWhere))
{
sql += $" WHERE {sWhere}";
}
if (!string.IsNullOrEmpty(sOrderBy))
{
sql += $" ORDER BY {sOrderBy}";
}
result = await conn.QueryFirstOrDefaultAsync<string>(sql, param);
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary> /// <summary>
/// 取得單一筆資料(根據自訂SQL, 自訂參數) /// 取得單一筆資料(根據自訂SQL, 自訂參數)

View File

@ -95,6 +95,18 @@ namespace Repository.BaseRepository.Interface
/// <returns></returns> /// <returns></returns>
Task<object> GetOneAsync(string tableName, string sWhere, string selCol, object param = null, string sOrderBy = ""); Task<object> GetOneAsync(string tableName, string sWhere, string selCol, object param = null, string sOrderBy = "");
/// <summary> /// <summary>
/// 取得單一筆資料某一欄位(排序)不需sWhere及sOrderBy填""
/// <para>
/// SELECT {selCol} FROM {tableName} WHERE {sWhere} ORDER BY {sOrderBy}
/// </para>
/// </summary>
/// <param name="tableName"></param>
/// <param name="sWhere"></param>
/// <param name="sOrderBy"></param>
/// <param name="selCol">填放欄位</param>
/// <returns></returns>
Task<string> GetOneColAsync(string tableName, string sWhere, string selCol, object param = null, string sOrderBy = "");
/// <summary>
/// 取得單一筆資料(根據自訂SQL, 自訂參數) /// 取得單一筆資料(根據自訂SQL, 自訂參數)
/// </summary> /// </summary>
/// <param name="sqlString"></param> /// <param name="sqlString"></param>