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 { /// /// 報工資料檔 /// [Route("api/[controller]")] [ApiController] public class ActualTimeController : ControllerBase { private readonly AMESContext _context; private readonly IConfiguration _config; /// /// /// /// public ActualTimeController(AMESContext context) { _config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("appsettings.json").Build(); _context = context; } /// /// /// /// /// /// /// [Route("[action]")] [HttpGet] public async Task> 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 result = new ResultModel(); 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 list = new List(); 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)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; } /// /// /// /// /// 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); } } } }