裝置datatable

This commit is contained in:
b110212000 2021-06-17 21:41:21 +08:00
parent 40396c8e85
commit 0a9713fc94
8 changed files with 536 additions and 20 deletions

View File

@ -67,6 +67,26 @@ namespace SolarPower.Controllers
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
/// <summary>
/// 取裝置類型下拉選單
/// </summary>
/// <returns></returns>
public async Task<ApiResult<List<UserSelectItemList>>> GetDeviceTypeSelectOptionList()
{
ApiResult<List<UserSelectItemList>> apiResult = new ApiResult<List<UserSelectItemList>>();
try
{
var userSelectItemLists = await powerStationRepository.DeviceType();
apiResult.Code = "0000";
apiResult.Data = userSelectItemLists;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
/// <summary>
/// 取得單一電站基本資料
@ -297,7 +317,7 @@ namespace SolarPower.Controllers
/// 運維資料DataTable
/// </summary>
/// <param name="stationId"></param>
/// <returns></returns>
/// <returns></returns>
public async Task<ActionResult> OperationTable(int stationId)
{
@ -399,6 +419,108 @@ namespace SolarPower.Controllers
return apiResult;
}
/// <summary>
/// 新增 / 修改 裝置資料
/// </summary>
/// <param name="Device"></param>
/// <returns></returns>
public async Task<ApiResult<string>> SaveDevice(DeviceInfo Device)
{
ApiResult<string> apiResult = new ApiResult<string>();
try
{
if (Device.Id == 0)
{
Device DeviceInfo = new Device()
{
Brand = Device.Brand,
ColName = Device.ColName,
PowerStationId = Device.PowerStationId,
DBName = Device.DBName,
Id = Device.Id,
Name = Device.Name,
ProductModel = Device.ProductModel,
Remark = Device.Remark,
TableName = Device.TableName,
Type = Device.Type,
UID = Device.PowerStationId + "-" + Device.Type,
CreatedBy = myUser.Id
};
List<string> properties = new List<string>()
{
"Brand",
"ColName",
"PowerStationId",
"DBName",
"Id",
"Name",
"ProductModel",
"Remark",
"TableName",
"Type",
"UID",
"CreatedBy"
};
await powerStationRepository.AddDevice(DeviceInfo,properties);
apiResult.Code = "0000";
apiResult.Msg = "新增成功";
}
else
{
Device DeviceInfo = new Device()
{
Brand = Device.Brand,
ColName = Device.ColName,
PowerStationId = Device.PowerStationId,
DBName = Device.DBName,
Id = Device.Id,
Name = Device.Name,
ProductModel = Device.ProductModel,
Remark = Device.Remark,
TableName = Device.TableName,
Type = Device.Type,
UID = Device.PowerStationId + "-" + Device.Type,
CreatedBy = myUser.Id
};
List<string> properties = new List<string>()
{
"Brand",
"ColName",
"PowerStationId",
"DBName",
"Id",
"Name",
"ProductModel",
"Remark",
"TableName",
"Type",
"UID",
"CreatedBy"
};
await powerStationRepository.AddDevice(DeviceInfo, properties);
apiResult.Code = "0000";
apiResult.Msg = "儲存成功";
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = exception.ToString();
}
return apiResult;
}
public async Task<ActionResult> DeviceTable(int stationId)
{
List<DeviceTable> deviceTables = new List<DeviceTable>();
ApiResult<List<DeviceTable>> apiResult = new ApiResult<List<DeviceTable>>();
var result = Json(new
{
data = apiResult
});
return result;
}
}
}

View File

@ -82,12 +82,12 @@ namespace SolarPower.Models.PowerStation
public class OperationInfo : Created
{
public int Id { get; set; }
public int PowerStationId { get; set; }
public int Type { get; set; }
public string Name { get; set; }
public string ContactPerson { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public int PowerStationId { get; set; }//電廠id
public int Type { get; set; }//廠商類別
public string Name { get; set; }//名稱
public string ContactPerson { get; set; }//聯絡人
public string Phone { get; set; }//電話
public string Email { get; set; }//Email
}
public class OperationStationId
{
@ -95,9 +95,50 @@ namespace SolarPower.Models.PowerStation
}
public class OperationTable : OperationInfo
{
public string CreatedName { get; set; }
public string Function { get; set; }
public string CreatedName { get; set; }//建立者名稱
public string Function { get; set; }//功能
public string TypeName { get; set; }
}
/// <summary>
/// 設備裝置下拉選單
/// </summary>
public class Type
{
public string Name { get; set; }
public string EName { get; set; }
}
public class Root
{
public List<Type> Type { get; set; }
}
public class Variable
{
public string name { get; set; }
public string value { get; set; }
}
/// <summary>
/// 設備
/// </summary>
public class DeviceInfo
{
public int Id { get; set; }
public int PowerStationId { get; set; }//所屬電站編號
public string Name { get; set; }//名稱
public string Type { get; set; }//類型
public string Brand { get; set; }//廠牌
public string ProductModel { get; set; }//型號
public string DBName { get; set; }
public string TableName { get; set; }
public string ColName { get; set; }
public string Remark { get; set; }
}
public class Device : DeviceInfo
{
public string UID { get; set; }//設備編號
public int CreatedBy { get; set; }//建立者
}
public class DeviceTable : DeviceInfo
{
public string Function { get; set; }//功能
}
}

View File

@ -1,6 +1,7 @@
using Dapper;
using SolarPower.Helper;
using SolarPower.Models.PowerStation;
using SolarPower.Models.User;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
@ -8,6 +9,7 @@ using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;
namespace SolarPower.Repository.Implement
{
@ -75,7 +77,11 @@ namespace SolarPower.Repository.Implement
return count;
}
}
/// <summary>
/// 運維DataTable
/// </summary>
/// <param name="stationId"></param>
/// <returns></returns>
public async Task<List<OperationTable>> OperationTable (int stationId)
{
@ -103,7 +109,11 @@ namespace SolarPower.Repository.Implement
return operation;
}
}
/// <summary>
/// 選取單一運維
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<OperationInfo> OneOperationInfo (int id)
{
using (IDbConnection conn = _databaseHelper.GetConnection())
@ -158,5 +168,98 @@ namespace SolarPower.Repository.Implement
conn.Close();
}
}
/// <summary>
/// 裝置類型下拉選單
/// </summary>
/// <returns></returns>
public async Task<List<UserSelectItemList>> DeviceType()
{
List<UserSelectItemList> result = new List<UserSelectItemList>();
using IDbConnection conn = _databaseHelper.GetConnection();
conn.Open();
var trans = conn.BeginTransaction();
try
{
string sql = @$"SELECT * FROM variable WHERE name = @name";
var json = await conn.QueryFirstOrDefaultAsync<Variable>(sql, new { name = "Type" });
Root jsonfor = JsonSerializer.Deserialize<Root>(json.value);
foreach(Models.PowerStation.Type a in jsonfor.Type)
{
UserSelectItemList KeyValue = new UserSelectItemList
{
Value = a.EName,
Text = a.Name
};
result.Add(KeyValue);
}
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
return result;
}
/// <summary>
/// 新增裝置資料
/// </summary>
/// <param name="DeviceInfo"></param>
/// <param name="properties"></param>
/// <returns></returns>
public async Task AddDevice(Device DeviceInfo, List<string> properties)
{
using IDbConnection conn = _databaseHelper.GetConnection();
conn.Open();
try
{
string sql = GenerateInsertQueryWithCustomTable(properties, "device");
await conn.ExecuteAsync(sql, DeviceInfo);
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
}
/// <summary>
/// 修改裝置資料
/// </summary>
/// <param name="DeviceInfo"></param>
/// <param name="properties"></param>
/// <returns></returns>
public async Task UpdateDevice(Device DeviceInfo, List<string> properties)
{
using IDbConnection conn = _databaseHelper.GetConnection();
conn.Open();
var trans = conn.BeginTransaction();
try
{
var updateQuery = GenerateUpdateQueryOtherTable(properties, "device");
await conn.ExecuteAsync(updateQuery.ToString(), DeviceInfo, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}

View File

@ -344,5 +344,28 @@ namespace SolarPower.Repository.Implement
return updateQuery.ToString();
}
/// <summary>
/// 產生Update語句(不同資料表)
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
protected string GenerateUpdateQueryOtherTable(List<string> properties, string table_name)
{
var updateQuery = new StringBuilder($"UPDATE {table_name} SET ");
properties.ForEach(property =>
{
if (!property.Equals("Id"))
{
updateQuery.Append($"{property}=@{property},");
}
});
updateQuery.Remove(updateQuery.Length - 1, 1); //remove last comma
updateQuery.Append(" WHERE id = @Id");
return updateQuery.ToString();
}
}
}

View File

@ -1,4 +1,5 @@
using SolarPower.Models.PowerStation;
using SolarPower.Models.User;
using System;
using System.Collections.Generic;
using System.Linq;
@ -12,6 +13,23 @@ namespace SolarPower.Repository.Interface
Task<List<OperationTable>> OperationTable (int stationId);
Task<OperationInfo> OneOperationInfo (int stationId);
Task UpdateOperation(OperationInfo operation, List<string> properties);
/// <summary>
/// 裝置類型下拉式選單
/// </summary>
/// <returns></returns>
Task<List<UserSelectItemList>> DeviceType();
/// <summary>
/// 新增 裝置
/// </summary>
/// <param name=""></param>
/// <returns></returns>
Task AddDevice(Device DeviceInfo, List<string> properties);
/// <summary>
/// 修改 裝置
/// </summary>
/// <param name="DeviceInfo"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task UpdateDevice(Device DeviceInfo, List<string> properties);
}
}

View File

@ -65,5 +65,6 @@ namespace SolarPower.Repository.Interface
/// <param name="tablename"></param>
/// <returns></returns>
Task DeleteOneOtherTable(int id, string tablename);
}
}

View File

@ -171,6 +171,91 @@
}
}
});
//#endregion
//#region 運維列表 DataTable
DeviceTable = $("#Device_table").DataTable({
"paging": true,
"lengthChange": false,
"searching": false,
"ordering": true,
"info": true,
"autoWidth": false,
"responsive": true,
"order": [[9, "desc"]],
"columns": [{
"data": "uID"
}, {
"data": "name"
}, {
"data": "type"
}, {
"data": "brand"
}, {
"data": "productModel"
}, {
"data": "dBName"
}, {
"data": "tableName"
}, {
"data": "colName"
}, {
"data": "remark"
},{
"data": "function"
}],
"columnDefs": [{
'targets': 1,
'searchable': false,
'orderable': false,
'className': 'dt-body-center'
}],
"language": {
"emptyTable": "無資料...",
"processing": "處理中...",
"loadingRecords": "載入中...",
"lengthMenu": "顯示 _MENU_ 項結果",
"zeroRecords": "沒有符合的結果",
"info": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
"infoEmpty": "顯示第 0 至 0 項結果,共 0 項",
"infoFiltered": "(從 _MAX_ 項結果中過濾)",
"infoPostFix": "",
"search": "搜尋:",
"paginate": {
"first": "第一頁",
"previous": "上一頁",
"next": "下一頁",
"last": "最後一頁"
},
"aria": {
"sortAscending": ": 升冪排列",
"sortDescending": ": 降冪排列"
}
},
'createdRow': function (row, data, dataIndex) {
$(row).attr('data-id', data.id);
},
"ajax": {
"url": "/PowerStation/DeviceTable",
"type": "POST",
"data": function (d) {
d.stationId = stationId;
},
"dataSrc": function (rel) {
if (rel.data.code == "9999") {
toast_error(rel.data.msg);
return;
}
data = rel.data.data;
if (data == null || data.length == 0) {
this.data = [];
}
return data;
}
}
});
//#endregion
//#region 電站資料 view 控制
if (stationId == 'new') {
@ -206,7 +291,7 @@
$("#BoEPart").hide();
$("#land_buildingPart").hide();
/*$("#tablist").hide();*/
$("#tablist").hide();
} else {
var url = "/PowerStation/GetOnePowerStation"
@ -255,7 +340,25 @@
$("#power_station_operation_personnel").val($("#power_station_operation_personnel option:first").val());
});
//#endregion
$('.js-example-basic-multiple').select2();
var url_DeviceType = "/PowerStation/GetDeviceTypeSelectOptionList";
$.get(url_DeviceType, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$("Device_Type_modal").empty();
$.each(rel.data, function (index, val) {
$("#Device_Type_modal").append($("<option />").val(val.value).text(val.text));
});
})
});
//#region 代管切換
@ -655,7 +758,46 @@
});
//#endregion
//#region 新增裝置資料
function AddDevice() {
$("#Device-modal .modal-title").html("裝置資料 - 新增");
$("#Device-form").trigger("reset");
$("#Device-modal").modal();
}
//#endregion
//#region 儲存裝置資料
function SaveDevice() {
if ($("#Device-form").valid()) {
var url = "/PowerStation/SaveDevice";
var send_data = {
Id: selected_id,
PowerStationId: stationId,
Name: $("#Device_Name_modal").val(),
Type: $("#Device_Type_modal").val(),
Brand: $("#Device_Brand_modal").val(),
ProductModel: $("#Device_ProductModel_modal").val(),
DBName: $("#Device_DBName_modal").val(),
TableName: $("#Device_TableName_modal").val(),
ColName: $("#Device_ColName_modal").val(),
Remark: $("#Device_Remark_modal").val(),
}
$.post(url, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
else {
toast_ok(rel.msg);
$('#Device-modal').modal('hide');
return;
}
}, 'json');
}
}
//#endregion
</script>
}

View File

@ -1,13 +1,12 @@
<div class="row mb-5">
<div class="col-6"><h3>裝置設定</h3></div>
<div class="col-6 text-right">
<button type="button" class="btn btn-success waves-effect waves-themed mb-3">
<span class="fal fa-plus mr-1"></span>
新增
</button>
<a href="javascript:;" class="btn btn-success waves-effect waves-themed mb-3" id="addDevice-btn" onclick="AddDevice()">
<span class="fal fa-plus mr-1"></span>新增
</a>
</div>
<div class="w-100">
<table class="table table-bordered table-hover m-0 text-center">
<table id="Device_table" class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>設備ID</th>
@ -69,4 +68,71 @@
</tbody>
</table>
</div>
</div>
<div class="modal fade" id="Device-modal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
裝置資料 - 新增
</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="fal fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<form class="Device-form" id="Device-form">
<div class="row">
<div class="form-group col-lg-6">
<label class="form-label" for="Device_Name_modal"><span class="text-danger">*</span>裝置名稱</label>
<input type="text" id="Device_Name_modal" name="Device_Name_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="Device_Type_modal"><span class="text-danger">*</span>裝置類型</label>
<select class="form-control" id="Device_Type_modal">
</select>
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="Device_Brand_modal"><span class="text-danger">*</span>廠牌</label>
<input type="text" id="Device_Brand_modal" name="Device_Brand_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="Device_ProductModel_modal"><span class="text-danger">*</span>型號</label>
<input type="text" id="Device_ProductModel_modal" name="Device_ProductModel_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<div style="margin-bottom: 0.3rem">
<label class="form-label" for="Device_DBName_modal"><span class="text-danger">*</span>DBName</label>
<input type="text" id="Device_DBName_modal" name="Device_DBName_modal" class="form-control">
</div>
</div>
<div class="form-group col-lg-6">
<div style="margin-bottom: 0.3rem">
<label class="form-label" for="Device_TableName_modal"><span class="text-danger">*</span>tableName</label>
<input type="text" id="Device_TableName_modal" name="Device_TableName_modal" class="form-control">
</div>
</div>
<div class="form-group col-lg-6">
<div style="margin-bottom: 0.3rem">
<label class="form-label" for="Device_ColName_modal"><span class="text-danger">*</span>columnName</label>
<input type="text" id="Device_ColName_modal" name="Device_ColName_modal" class="form-control">
</div>
</div>
<div class="form-group col-lg-6">
<div style="margin-bottom: 0.3rem">
<label class="form-label" for="Device_Remark_modal"><span class="text-danger">*</span>備註</label>
<input type="text" id="Device_Remark_modal" name="Device_Remark_modal" class="form-control">
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="SaveDevice()">確定</button>
</div>
</div>
</div>
</div>