ibms-dome/FrontendWebApi/ApiControllers/TenantBillController.cs

618 lines
27 KiB
C#
Raw Normal View History

2024-01-23 09:12:08 +08:00
using FrontendWebApi.Models;
using Microsoft.AspNetCore.Mvc;
using Repository.BackendRepository.Interface;
using Repository.FrontendRepository.Interface;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using System.IO;
using static FrontendWebApi.Models.Bill;
using Microsoft.Extensions.Logging;
using System.Text.Json;
2024-01-23 14:41:38 +08:00
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using WkHtmlToPdfDotNet.Contracts;
using WkHtmlToPdfDotNet;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Configuration;
using Serilog.Core;
using static FrontendWebApi.ApiControllers.TenantBillController;
using System.Reflection;
2024-02-06 07:28:36 +08:00
using Microsoft.CodeAnalysis.CSharp.Syntax;
2024-02-07 17:57:20 +08:00
using System.Data.SqlTypes;
2024-01-23 09:12:08 +08:00
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace FrontendWebApi.ApiControllers
{
//[Route("api/[controller]")]
//[ApiController]
2024-01-30 11:13:46 +08:00
//public class TenantBillController
public class TenantBillController : MyBaseApiController<TenantBillController>
2024-01-23 09:12:08 +08:00
{
private readonly IBackendRepository backendRepository;
private readonly ILogger<TenantBillController> _logger;
private readonly IConfiguration Configuration;
private IWebHostEnvironment _webHostEnvironment;
private readonly IConverter _converter;
2024-01-23 09:12:08 +08:00
const string TenantListtable = "archive_electric_meter_tenant_list";
const string TenantBilltable = "archive_electric_meter_tenant_bill";
public TenantBillController(IBackendRepository backendRepository, IFrontendRepository frontendRepository, ILogger<TenantBillController> logger,
IConfiguration configuration,
IWebHostEnvironment webHostEnvironment,
IConverter converter)
2024-01-23 09:12:08 +08:00
{
this.backendRepository = backendRepository;
this._logger = logger;
Configuration = configuration;
_webHostEnvironment = webHostEnvironment;
_converter = converter;
2024-01-23 09:12:08 +08:00
}
[HttpPost]
public async Task<ApiResult<List<TenantList>>> GetTenantList()
{
ApiResult<List<TenantList>> apiResult = new ApiResult<List<TenantList>>();
List<TenantList> tenantList = new List<TenantList>();
try
{
2024-01-23 18:21:53 +08:00
var sqlString = $"SELECT tenant_guid,list_id,tenant_name,bill_perKWH,bill_perRCV " +
2024-01-23 09:12:08 +08:00
$"from {TenantListtable} order by created_at";
tenantList = await backendRepository.GetAllAsync<TenantList>(sqlString);
apiResult.Code = "0000";
apiResult.Data = tenantList;
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "讀取不到用戶資料。";
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
[HttpPost]
2024-01-23 14:41:38 +08:00
public async Task<ApiResult<string>> AddOneTenantList([FromBody] TenantList tl)
2024-01-23 09:12:08 +08:00
{
ApiResult<string> apiResult = new ApiResult<string>();
try
{
var tenant_guid = Guid.NewGuid();
var tenant_name = tl.tenant_name;
var bill_perKWH = tl.bill_perKWH;
var bill_perRCV = tl.bill_perRCV;
var created_at = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
2024-01-23 18:21:53 +08:00
var sqlString = $"INSERT INTO {TenantListtable} (tenant_guid,list_id,tenant_name, bill_perKWH, bill_perRCV, created_by,created_at) " +
$"VALUES ('{tenant_guid}','{tl.list_id}','{tenant_name}', {bill_perKWH}, {bill_perRCV},'{tl.created_by}', '{created_at}')";
2024-01-23 09:12:08 +08:00
await backendRepository.ExecuteSql(sqlString);
apiResult.Code = "0000";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "新增成功";
2024-01-23 09:12:08 +08:00
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "新增用戶失敗。";
if (exception.Message.Contains($" for key 'PRIMARY'"))
{
2024-02-01 17:40:49 +08:00
apiResult.Code = "0001";
2024-02-06 07:28:36 +08:00
apiResult.Msg = "已有相同用戶。";
}
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
[HttpPost]
2024-01-23 14:41:38 +08:00
public async Task<ApiResult<string>> UpdateOneTenantList([FromBody] TenantList tl)
2024-01-23 09:12:08 +08:00
{
ApiResult<string> apiResult = new ApiResult<string>();
try
{
var updated_at = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var sqlString = $"UPDATE {TenantListtable} SET " +
$"`tenant_name` = '{tl.tenant_name}', " +
$"`bill_perKWH` = {tl.bill_perKWH}, " +
$"`bill_perRCV` = {tl.bill_perRCV}, " +
$"`updated_at` = '{updated_at}' " +
$"WHERE `tenant_guid` = '{tl.tenant_guid}'";
await backendRepository.ExecuteSql(sqlString);
apiResult.Code = "0000";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "修改用戶成功";
2024-01-23 09:12:08 +08:00
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "修改失敗。";
if (exception.Message.Contains($"a foreign key constraint"))
{
2024-02-01 17:40:49 +08:00
apiResult.Code = "0001";
apiResult.Msg = "水電報表仍有該用戶,無法修改名稱。";
}
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
[HttpPost]
2024-01-23 14:41:38 +08:00
public async Task<ApiResult<string>> DelOneTenantList([FromBody] TenantList tl)
2024-01-23 09:12:08 +08:00
{
ApiResult<string> apiResult = new ApiResult<string>();
try
{
var sqlString = $"delete from {TenantListtable} WHERE tenant_guid = '{tl.tenant_guid}' ";
await backendRepository.ExecuteSql(sqlString);
apiResult.Code = "0000";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "刪除成功";
2024-01-23 09:12:08 +08:00
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "刪除用戶失敗。";
if (exception.Message.Contains($"a foreign key constraint"))
{
2024-02-01 17:40:49 +08:00
apiResult.Code = "0001";
apiResult.Msg = "水電報表仍有該用戶,無法刪除。";
}
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
2024-01-23 14:41:38 +08:00
2024-01-23 09:12:08 +08:00
[HttpPost]
2024-01-23 14:41:38 +08:00
public async Task<ApiResult<List<TenantBill>>> GetTenantBill([FromBody] TenantBill tb)
2024-01-23 09:12:08 +08:00
{
ApiResult<List<TenantBill>> apiResult = new ApiResult<List<TenantBill>>();
List<TenantBill> tenantBill = new List<TenantBill>();
try
{
2024-01-23 14:41:38 +08:00
string tableType = tb.tableType;
string building_tag = tb.building_tag;
2024-01-23 09:12:08 +08:00
string ElecOrWater = tableType == "elec" ? "E4" : "W1";
string sqlString = null;
2024-02-06 07:28:36 +08:00
if (building_tag == "D2")
2024-01-23 09:12:08 +08:00
{
sqlString =
$"SELECT bill_id,a.device_number,a.full_name,start_timestamp,end_timestamp,result,bill,tenant_name,tenant_guid " +
2024-01-23 09:12:08 +08:00
$"from {TenantBilltable} a join device b on a.device_number =b.device_number " +
$"where device_building_tag = 'D1' and a.device_name_tag = '{ElecOrWater}' || device_building_tag = 'D2' and a.device_name_tag = '{ElecOrWater}'";
}
else
{
sqlString =
$"SELECT bill_id,a.device_number,a.full_name,start_timestamp,end_timestamp,result,bill,tenant_name,tenant_guid " +
2024-01-23 09:12:08 +08:00
$"from {TenantBilltable} a join device b on a.device_number =b.device_number " +
$"where device_building_tag = '{building_tag}' and a.device_name_tag = '{ElecOrWater}' ";
}
2024-02-07 17:57:20 +08:00
2024-01-23 09:12:08 +08:00
tenantBill = await backendRepository.GetAllAsync<TenantBill>(sqlString);
apiResult.Code = "0000";
apiResult.Data = tenantBill;
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "讀取水電參考報表失敗。";
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
[HttpPost]
2024-01-23 14:41:38 +08:00
public async Task<ApiResult<string>> UpdateTenantBill([FromBody] TenantBill tb)
2024-01-23 09:12:08 +08:00
{
ApiResult<string> apiResult = new ApiResult<string>();
try
{
2024-01-23 14:41:38 +08:00
string bill_per = tb.tableType == "elec" ? "bill_perKWH" : "bill_perRCV";
2024-01-23 09:12:08 +08:00
var updated_at = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
2024-01-23 18:21:53 +08:00
var start_timestamp = tb.start_timestamp;
var end_timestamp = tb.end_timestamp;
2024-01-23 09:12:08 +08:00
string sqlString = null;
2024-02-07 17:57:20 +08:00
string result = "0";
if (tb.start_timestamp == "" || tb.end_timestamp == "" || tb.tenant_guid == "" || tb.tenant_guid == null)
{
2024-02-07 17:57:20 +08:00
sqlString = $@"UPDATE {TenantBilltable}
set tenant_name = (SELECT tenant_name from archive_electric_meter_tenant_list
WHERE tenant_guid = '{tb.tenant_guid}'), start_timestamp = '{start_timestamp}',end_timestamp = '{end_timestamp}' ,
result= 0,
bill = 0,
updated_at = '{updated_at}',
tenant_guid = '{tb.tenant_guid}'
WHERE device_number = '{tb.device_number}'";
2024-02-06 07:28:36 +08:00
await backendRepository.ExecuteSql(sqlString);
apiResult.Code = "0000";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "資料填寫不完整";
return apiResult;
}
2024-02-07 17:57:20 +08:00
else
{
2024-02-07 17:57:20 +08:00
List<string> howManyMonth = new List<string>();
List<string> existMonth = new List<string>();
DateTime date1 = DateTime.Parse(start_timestamp);
DateTime date2 = DateTime.Parse(end_timestamp);
int monthsApart = ((date2.Year - date1.Year) * 12) + date2.Month - date1.Month;
// 找出資料庫存在的水電月份表
string checkTabelSql = $@"SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'ibms_dome_dome' and TABLE_NAME like 'archive_electric_water_meter_day_%'";
var existTable = await backendRepository.GetAllAsync<string>(checkTabelSql);
for (var i = 0; i <= monthsApart; i++)
2024-02-06 07:28:36 +08:00
{
2024-02-07 17:57:20 +08:00
howManyMonth.Add($@"archive_electric_water_meter_day_{date1.AddMonths(i).ToString("yyyyMM")}");
2024-02-06 07:28:36 +08:00
}
2024-02-07 17:57:20 +08:00
foreach (var item in existTable)
2024-02-06 07:28:36 +08:00
{
2024-02-07 17:57:20 +08:00
foreach (var data in howManyMonth)
2024-02-06 07:28:36 +08:00
{
2024-02-07 17:57:20 +08:00
if (item == data)
{
existMonth.Add(data);
}
2024-02-06 07:28:36 +08:00
}
}
2024-02-07 17:57:20 +08:00
if (existMonth.Count == 0)
2024-02-06 07:28:36 +08:00
{
2024-02-07 17:57:20 +08:00
sqlString = $@"UPDATE {TenantBilltable}
set tenant_name = (SELECT tenant_name from archive_electric_meter_tenant_list
WHERE tenant_guid = '{tb.tenant_guid}'), start_timestamp = '{start_timestamp}',end_timestamp = '{end_timestamp}' ,
result= 0,
bill = 0,
updated_at = '{updated_at}',
tenant_guid = '{tb.tenant_guid}'
WHERE device_number = '{tb.device_number}'";
2024-02-06 07:28:36 +08:00
}
else
{
2024-02-07 17:57:20 +08:00
string month = $@"
SELECT start_timestamp,device_number, sub_result
FROM {existMonth[0]}
WHERE device_number = '{tb.device_number}'";
for (var i = 1; i < existMonth.Count; i++)
2024-02-06 07:28:36 +08:00
{
month += $@"UNION ALL
SELECT start_timestamp,device_number, sub_result
2024-02-07 17:57:20 +08:00
FROM {existMonth[i]}
2024-02-06 07:28:36 +08:00
WHERE device_number = '{tb.device_number}' ";
}
2024-02-07 17:57:20 +08:00
string checkDataSql = $@"(SELECT sum(sub_result)
FROM ( {month}
) combined_result
WHERE start_timestamp BETWEEN '{start_timestamp}' and '{end_timestamp}'
GROUP BY device_number) ";
var existData = await backendRepository.GetAllAsync<string>(checkDataSql);
if (existData.Count != 0)
{
result = $@"(SELECT sum(sub_result)
FROM ( {month}
) combined_result
WHERE start_timestamp BETWEEN '{start_timestamp}' and '{end_timestamp}'
GROUP BY device_number) ";
}
2024-02-06 07:28:36 +08:00
sqlString =
$@"UPDATE {TenantBilltable}
set tenant_name = (SELECT tenant_name from archive_electric_meter_tenant_list WHERE tenant_guid = '{tb.tenant_guid}'), start_timestamp = '{start_timestamp}',end_timestamp = '{end_timestamp}' ,
2024-02-07 17:57:20 +08:00
result= {result},
bill = ROUND(result *(SELECT {bill_per} from {TenantListtable} WHERE tenant_guid = '{tb.tenant_guid}') ),
2024-02-06 07:28:36 +08:00
updated_at = '{updated_at}',
tenant_guid = '{tb.tenant_guid}'
WHERE device_number = '{tb.device_number}'";
}
2024-02-07 17:57:20 +08:00
await backendRepository.ExecuteSql(sqlString);
2024-01-23 09:12:08 +08:00
}
2024-02-07 17:57:20 +08:00
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "修改水電參考報表失敗。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return apiResult;
2024-01-23 09:12:08 +08:00
2024-02-07 17:57:20 +08:00
}
apiResult = await CheckDay(tb);
return apiResult;
}
[HttpPost]
public async Task<ApiResult<string>> CheckDay([FromBody] TenantBill tb)
{
ApiResult<string> apiResult = new ApiResult<string>();
if (tb.start_timestamp != "" && tb.end_timestamp != "" && tb.tenant_guid != "")
{
List<TenantBill> tenantBill = new List<TenantBill>();
try
{
string sqlString = $@"select * from {TenantBilltable} WHERE tenant_guid= '{tb.tenant_guid}'";
2024-01-23 09:12:08 +08:00
2024-02-07 17:57:20 +08:00
tenantBill = await backendRepository.GetAllAsync<TenantBill>(sqlString);
if (tenantBill.Count > 1)
{
foreach (TenantBill t in tenantBill)
{
if (t.start_timestamp == tb.start_timestamp && t.end_timestamp == tb.end_timestamp)
{
continue;
}
else
{
apiResult.Code = "0001";
apiResult.Msg = "該用戶設備的起訖日期不一致,是否將所有設備起訖日期調為一致?";
return apiResult;
}
}
apiResult.Code = "0000";
apiResult.Msg = "修改成功且該用戶的所有設備日期一致";
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "確認日期失敗。";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
}
apiResult.Code = "0000";
apiResult.Msg = "修改成功且不執行CheckDay";
return apiResult;
}
[HttpPost]
public async Task<ApiResult<string>> ChangeDay([FromBody] TenantBill tb)
{
ApiResult<string> apiResult = new ApiResult<string>();
List<TenantBill> tenantBill = new List<TenantBill>();
try
{
string sqlString = $@"select * from {TenantBilltable} WHERE tenant_guid= '{tb.tenant_guid}'";
tenantBill = await backendRepository.GetAllAsync<TenantBill>(sqlString);
foreach (TenantBill t in tenantBill)
{
if (t.start_timestamp == tb.start_timestamp && t.end_timestamp == tb.end_timestamp)
{
continue;
}
else
{
t.start_timestamp = tb.start_timestamp;
t.end_timestamp = tb.end_timestamp;
await UpdateTenantBill(t);
}
}
2024-01-23 09:12:08 +08:00
apiResult.Code = "0000";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "修改成功";
2024-01-23 09:12:08 +08:00
}
catch (Exception exception)
{
apiResult.Code = "9999";
2024-02-07 17:57:20 +08:00
apiResult.Msg = "更換日期失敗。";
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
2024-01-23 09:12:08 +08:00
}
return apiResult;
}
2024-01-23 09:12:08 +08:00
[HttpPost]
public async Task<IActionResult> OutputTenantBill()
2024-01-23 09:12:08 +08:00
{
List<OutputBill> outputBill = new List<OutputBill>();
try
{
string sqlString =
$@"SELECT
2024-02-07 17:57:20 +08:00
a.tenant_name,
MIN(NULLIF(a.start_timestamp, '')) AS start_timestamp,
MAX(NULLIF(a.end_timestamp, '')) AS end_timestamp,
bill_perKWH,
bill_perRCV,
2024-02-06 07:28:36 +08:00
SUM(CASE WHEN device_name_tag = 'E4' THEN result ELSE 0 END) AS elec_result,
SUM(CASE WHEN device_name_tag = 'W1' THEN result ELSE 0 END) AS water_result,
SUM(CASE WHEN device_name_tag = 'E4' THEN bill ELSE 0 END) AS elec_bill,
SUM(CASE WHEN device_name_tag = 'W1' THEN bill ELSE 0 END) AS water_bill,
SUM(bill) AS total_bill
FROM archive_electric_meter_tenant_bill a
2024-02-07 17:57:20 +08:00
JOIN archive_electric_meter_tenant_list b ON a.tenant_guid = b.tenant_guid
2024-02-06 07:28:36 +08:00
GROUP BY a.tenant_name;";
2024-01-23 09:12:08 +08:00
outputBill = await backendRepository.GetAllAsync<OutputBill>(sqlString);
string filePath = CreateOutputForm(outputBill);
2024-01-23 09:12:08 +08:00
byte[] file = System.IO.File.ReadAllBytes(filePath);
return new FileContentResult(file, "application/pdf")
{
FileDownloadName = "水電報表.pdf"
};
2024-01-23 09:12:08 +08:00
}
catch (Exception exception)
2024-01-29 18:24:35 +08:00
{
2024-01-30 11:13:46 +08:00
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return new FileContentResult(new byte[0], "application/pdf")
2024-01-23 09:12:08 +08:00
{
FileDownloadName = "Empty.pdf"
};
}
public string CreateOutputForm(List<OutputBill> outputBill)
{
try
{
string htmlStr = this.getOutputFormHtmlStr(outputBill);
string filepath = Configuration.GetValue<string>("FilePath:OutputForm");
if (!Directory.Exists(filepath))
{
Directory.CreateDirectory(filepath);
_logger.LogInformation("file CreateOutputForm path: " + filepath);
}
var nowString = DateTime.UtcNow.AddHours(8).ToString("yyyyMMdd_HHmmss");
//Random r1 = new System.Random();
//string r2 = r1.Next(0, 999).ToString("0000");
//string r2 = RandomNumberGenerator.GetInt32(0, 999).ToString("0000");
filepath += $"{nowString}_水電報表.pdf";
var doc = new HtmlToPdfDocument()
{
GlobalSettings = {
ColorMode = ColorMode.Color,
//Orientation = Orientation.Landscape,
PaperSize = PaperKind.A4,
Out = filepath,
Margins = new MarginSettings
{
Unit = Unit.Millimeters,
Top = 10,
Bottom = 10,
Right = 0,
Left = 0
},
},
Objects = {
new ObjectSettings() {
HtmlContent=htmlStr,
WebSettings = { DefaultEncoding = "utf-8"},
FooterSettings = new FooterSettings() {
Center = "第 [page] 頁 共 [topage] 頁",
FontName = "DFKai-sb",
},
LoadSettings = new LoadSettings() {
JSDelay = 1000,
StopSlowScript = false,
BlockLocalFileAccess = false,
DebugJavascript = true
}
//HeaderSettings = { FontSize = 9, Right = "Page [page] of [toPage]", Line = true, Spacing = 2.812 }
}
}
};
// _converter.Warning += ConvertWarning;
_converter.Convert(doc);
//IntPtr converter = _converter.CreateConverter(doc);
//_converter.Tools.DestroyConverter();
return filepath;
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
}
private string getOutputFormHtmlStr(List<OutputBill> outputBill)
{
try
{
string path = Configuration.GetValue<string>("FilePath:OutputFormTemplate");
2024-01-30 11:13:46 +08:00
string image = Configuration.GetValue<string>("FilePath:Image");
//string path = _webHostEnvironment.ContentRootPath + "\\StaticFiles\\import.html";
2024-01-29 18:24:35 +08:00
if (!System.IO.File.Exists(path))
{
return "";
}
//string cssroot = _webHostEnvironment.ContentRootPath + "\\StaticFiles\\css\\";
string htmlStr = System.IO.File.ReadAllText(path);
//string vendorscss = System.IO.File.ReadAllText(cssroot + "vendors.bundle.css");
//string appBundelCss = System.IO.File.ReadAllText(cssroot + "app.bundle.css");
//string skinmasterCss = System.IO.File.ReadAllText(cssroot + "skins\\skin-master.css");
string bill = "";
foreach (var item in outputBill)
{
bill += $" <div class=\"container a4-page\"> " +
$" <div class=\"header\"> " +
2024-01-30 11:13:46 +08:00
$" <img src=\"{image}\" alt=\"Taipei Dome Logo\" width=\"150\"> " +
$" <h2>水電費用明細</h2> " +
$" </div> " +
$" <div class=\"statistics\"> " +
$" <h3>費用資訊</h3> " +
$" <p><strong>用戶: </strong>{item.tenant_name}</p> " +
$" <p><strong>起訖時間: </strong>{item.start_timestamp} ~ {item.end_timestamp}</p> " +
$" <table class=\"br\"> " +
$" <tr> " +
$" <td><strong>用電量: </strong>{item.elec_result}度</td> " +
$" <td><strong>單價: </strong>{item.bill_perKWH}元/度</td> " +
$" <td><strong>電費總計: </strong>{item.elec_bill}元</td> " +
$" </tr> " +
$" <tr> " +
$" <td><strong>用水量: </strong>{item.water_result}度</td> " +
$" <td><strong>單價: </strong>{item.bill_perRCV}元/度</td> " +
$" <td><strong>水費總計: </strong>{item.water_bill}元</td> " +
$" </tr> " +
$" </table> " +
$" </div> " +
$" <div class=\"total\"> " +
$" <div class=\"total-area\"> " +
$" <p>總計金額</p> " +
$" <div class=\"total-box\"> " +
$" <span class=\"total-money\">{item.total_bill}</span>元 " +
$" </div> " +
$" </div> " +
$" </div> " +
$" </div>";
2024-02-07 17:57:20 +08:00
}
htmlStr = htmlStr.Replace("{{bill}}", bill);
2024-02-07 17:57:20 +08:00
return htmlStr;
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
2024-01-23 09:12:08 +08:00
}
}
}
}