You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

175 lines
6.0 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.BAS;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.CommonTools.Result;
using Microsoft.Extensions.Configuration;
using System.Net;
using System.Net.Mail;
using System.Data.Common;
using System.Data;
using System.Dynamic;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
/// <summary>
/// 報工資料檔
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class ActualTimeController : ControllerBase
{
private readonly AMESContext _context;
private readonly IConfiguration _config;
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public ActualTimeController(AMESContext context)
{
_config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("appsettings.json").Build();
_context = context;
}
/// <summary>
///
/// </summary>
/// <param name="ActualDate"></param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
[Route("[action]")]
[HttpGet]
public async Task<ResultModel<dynamic>> GetActualTimeDetail(string ActualDate,int page = 0, int limit = 10)
{
DateTime date = System.DateTime.Now;
if (ActualDate != null)
date = DateTime.Parse(ActualDate); // 將字符串轉換為 DateTime 對象
// 獲取該月份的第一天
DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
// 獲取該月份的最後一天
DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
ResultModel<dynamic> result = new ResultModel<dynamic>();
string sql = string.Format(@"select c.*,b.production_time as productiontime ,c.actualTimeDetail -b.production_time actualTimeDetailExcept,b.Production_cnt_sap productionCNTSAP
from (
select a.actual_id ,To_char(a.Pass_datetime,'yyyy-mm-dd') actualDate , a.wip_no,
sum(a.a_ct) actualTime,sum(a.s_ct) ST,sum(a.rest_ct) restTime,
(sum(a.a_ct)- sum(a.rest_ct) + sum(a.s_CT)) actualTimeDetail,
case a.station_id when 0 then '人工手動' else '過站' end as TYPES,a.route
from jhames.actual_time_detail a
where to_char(a.pass_datetime ,'yyyy-MM-dd') >='{0}' and to_char(a.pass_datetime ,'yyyy-MM-dd') <='{1}'
group by a.actual_id ,To_char(a.Pass_datetime,'yyyy-mm-dd'),a.wip_no,case a.station_id when 0 then '人工手動' else '過站' end, a.route
) c
, jhames.actual_time b where b.actual_id = c.actual_id and b.route = c.route
order by c.actualDate,c.wip_no,c.route", firstDayOfMonth.ToString("yyyy-MM-dd"), lastDayOfMonth.ToString("yyyy-MM-dd"));
DbConnection conn = _context.Database.GetDbConnection();
if (conn.State != System.Data.ConnectionState.Open)
{
await conn.OpenAsync();
}
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (var reader = await cmd.ExecuteReaderAsync())
{
if (reader.HasRows)
{
List<dynamic> list = new List<dynamic>();
DataTable table = new DataTable();
table = DataReaderToDataTable(reader);
foreach (DataRow row in table.Rows)
{
dynamic dyn = new ExpandoObject();
list.Add(dyn);
foreach (DataColumn column in table.Columns)
{
var dic = (IDictionary<string, object>)dyn;
dic[column.ColumnName] = row[column];
}
}
result.DataTotal = list.Count();
//Table 頁數
if (page > 0)
{
list = list.Skip((page - 1) * limit).Take(limit).ToList();
}
result.Data = list;
}
}
}
if (result == null)
{
result.Msg = "查無資料";
result.Success = false;
return result;
}
result.Success = true;
result.Msg = "OK";
return result;
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
public static DataTable DataReaderToDataTable(DbDataReader reader)
{
try
{
DataTable dt = new DataTable();
int fieldCount = reader.FieldCount;
for (int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
{
dt.Columns.Add(reader.GetName(fieldIndex), reader.GetFieldType(fieldIndex));
}
dt.BeginLoadData();
object[] rowValues = new object[fieldCount];
while (reader.Read())
{
reader.GetValues(rowValues);
dt.LoadDataRow(rowValues, true);
}
reader.Close();
dt.EndLoadData();
return dt;
}
catch (Exception ex)
{
throw new Exception("DataReader Convert DataTable Error!", ex);
}
}
}
}