Commit 3b6d5ce7 by ruyun.zhang

更换EPPlus读取规则

parent 274f5acf
using Dapper;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Performance.Infrastructure.Extensions
{
public static class DapperExtensions
{
/// <summary>
/// 批量新增
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="connectionString"></param>
/// <param name="entities"></param>
/// <param name="tableName"></param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <param name="relevantColumns"></param>
/// <param name="ignoreColumns"></param>
/// <param name="batchCount"></param>
/// <returns></returns>
public static int BulkInsert<TEntity>(string connectionString,
List<TEntity> entities,
string? tableName = null,
IDbTransaction? transaction = null,
int? commandTimeout = null,
List<string>? relevantColumns = null,
List<string>? ignoreColumns = null,
int batchCount = 1000)
{
var type = typeof(TEntity);
var properties = type.GetProperties().AsEnumerable();
if (relevantColumns?.Any() == true)
properties = properties.Where(w => relevantColumns.Contains(w.Name));
if (ignoreColumns?.Any() == true)
properties = properties.Where(w => !ignoreColumns.Contains(w.Name));
var columnNames = properties.Select(w => w.Name).ToList();
for (int i = 0; i < Math.Ceiling((double)entities.Count / batchCount); i++)
{
var startIndex = batchCount * i;
var currEntities = entities.Skip(startIndex).Take(batchCount);
var strsql = new StringBuilder();
strsql.Append($"INSERT INTO {tableName}({string.Join(',', columnNames)}) VALUES");
DynamicParameters parameters = new DynamicParameters();
foreach (var item in currEntities.Select((row, index) => (row, index)))
{
var vNames = new List<string>();
foreach (var name in columnNames)
{
var pName = $"@{name}_{item.index}";
if (!vNames.Contains(pName)) vNames.Add(pName);
var value = GetValue<TEntity, object>(item.row, name);
if (value != null && value.GetType().IsClass)
value = value.ToString();
parameters.Add(pName, value);
}
tableName ??= typeof(TEntity).Name;
strsql.Append($"({string.Join(',', vNames)}),");
}
strsql.Remove(strsql.Length - 1, 1);
strsql.Append(';');
var inserSql = strsql.ToString();
using (var conn = new MySqlConnection(connectionString))
{
if (conn.State != ConnectionState.Open) conn.Open();
conn.Execute(inserSql, parameters, transaction, commandTimeout);
conn.Close();
}
}
return entities.Count;
}
/// <summary>
/// 对象取值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="item"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
public static TValue GetValue<T, TValue>(T item, string propertyName)
{
ParameterExpression parameter = Expression.Parameter(typeof(T), "w");
MemberExpression member = Expression.Property(parameter, propertyName);
UnaryExpression conversion = Expression.Convert(member, typeof(TValue));
var lambda = Expression.Lambda<Func<T, TValue>>(conversion, parameter);
Func<T, TValue> getter = lambda.Compile();
return getter(item);
}
}
}
......@@ -8,6 +8,7 @@
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using Masuit.Tools.Models;
using Microsoft.EntityFrameworkCore;
using Performance.DtoModels;
using Performance.EntityModels;
......@@ -69,28 +70,16 @@ public new List<AccountUnit> GetEmployeeUnit(Expression<Func<per_employee, bool>
/// <returns></returns>
public DtoModels.Comparison<view_check_emp> CheckEmployeeRealGiveFeeDiff(ComparisonPagingRequest request)
{
var queryData = $@"
SELECT
HospitalId,Year,Month,AllotID,ComputeId,UnitType,AccountingUnit,JobNumber,MAX(EmployeeName) AS EmployeeName,
SUM(RealGiveFeeExecl) AS RealGiveFeeExecl,SUM(RealGiveFeeCompute) AS RealGiveFeeCompute,SUM(RealGiveFeeExecl) - SUM(RealGiveFeeCompute) AS Diff
FROM (
SELECT * FROM view_check_emp WHERE AllotId = @allotId
) TAB
WHERE if(@searchQuery='','',AccountingUnit) LIKE @parm OR if(@searchQuery='','',JobNumber) LIKE @parm OR if(@searchQuery='','',EmployeeName) LIKE @parm
GROUP BY HospitalId,Year,Month,AllotID,UnitType,AccountingUnit,JobNumber
ORDER BY HospitalId,Year,Month,ABS(SUM(RealGiveFeeExecl) - SUM(RealGiveFeeCompute)) DESC LIMIT {(request.PageIndex - 1) * request.PageSize},{request.PageSize}
";
var queryCount = @"
SELECT COUNT(0) FROM (
SELECT * FROM view_check_emp WHERE AllotId = @allotId
) TAB
WHERE if(@searchQuery='','',AccountingUnit) LIKE @parm OR if(@searchQuery='','',JobNumber) LIKE @parm OR if(@searchQuery='','',EmployeeName) LIKE @parm
";
var queryData = $@"CALL proc_allot_check_emp(@allotId);";
var checkEmps = DapperQuery<view_check_emp>(queryData, new { allotId = request.AllotId });
if (!string.IsNullOrEmpty(request.SearchQuery))
checkEmps = checkEmps.Where(w => w.UnitType.Contains(request.SearchQuery) || w.AccountingUnit.Contains(request.SearchQuery) || w.JobNumber.Contains(request.SearchQuery) || w.EmployeeName.Contains(request.SearchQuery));
checkEmps = checkEmps.OrderByDescending(w => Math.Abs(w.Diff ?? 0));
return new DtoModels.Comparison<view_check_emp>()
{
Datas = DapperQuery<view_check_emp>(queryData, new { allotId = request.AllotId, searchQuery = request.SearchQuery, parm = $"%{request.SearchQuery}%" }, commandTimeout: 10000)?.ToList() ?? new List<view_check_emp>(),
TotalCount = DapperQuery<int>(queryCount, new { allotId = request.AllotId, searchQuery = request.SearchQuery, parm = $"%{request.SearchQuery}%" }, commandTimeout: 10000)?.FirstOrDefault() ?? 0,
Datas = checkEmps.ToPagedList(request.PageIndex, request.PageSize).Data,
TotalCount = checkEmps.Count(),
};
}
......@@ -99,26 +88,16 @@ public DtoModels.Comparison<view_check_emp> CheckEmployeeRealGiveFeeDiff(Compari
/// </summary>
public DtoModels.Comparison<view_check_emp> CheckAccountingUnitRealGiveFeeDiff(ComparisonPagingRequest request)
{
var queryData = $@"
SELECT *,IFNULL(RealGiveFeeExecl,0) - IFNULL(RealGiveFeeCompute,0) AS Diff FROM (
SELECT * FROM view_check_dept_account WHERE AllotId = @allotId UNION ALL
SELECT * FROM view_check_dept_specialunit WHERE AllotId = @allotId
) TAB
WHERE if(@searchQuery='','',AccountingUnit) LIKE @parm
ORDER BY HospitalId,Year,Month,ABS(DIFF) DESC LIMIT {(request.PageIndex - 1) * request.PageSize},{request.PageSize}
";
var queryCount = @"
SELECT count(0) FROM (
SELECT * FROM view_check_dept_account WHERE AllotId = @allotId UNION ALL
SELECT * FROM view_check_dept_specialunit WHERE AllotId = @allotId
) TAB
WHERE if(@searchQuery='','',AccountingUnit) LIKE @parm
";
var queryData = $@"CALL proc_allot_check_dept(@allotId);";
var checkEmps = DapperQuery<view_check_emp>(queryData, new { allotId = request.AllotId });
if (!string.IsNullOrEmpty(request.SearchQuery))
checkEmps = checkEmps.Where(w => w.UnitType.Contains(request.SearchQuery) || w.AccountingUnit.Contains(request.SearchQuery) || w.JobNumber.Contains(request.SearchQuery) || w.EmployeeName.Contains(request.SearchQuery));
checkEmps = checkEmps.OrderByDescending(w => Math.Abs(w.Diff ?? 0));
return new DtoModels.Comparison<view_check_emp>()
{
Datas = DapperQuery<view_check_emp>(queryData, new { allotId = request.AllotId, searchQuery = request.SearchQuery, parm = $"%{request.SearchQuery}%" })?.ToList() ?? new List<view_check_emp>(),
TotalCount = DapperQuery<int>(queryCount, new { allotId = request.AllotId, searchQuery = request.SearchQuery, parm = $"%{request.SearchQuery}%" })?.FirstOrDefault() ?? 0,
Datas = checkEmps.ToPagedList(request.PageIndex, request.PageSize).Data,
TotalCount = checkEmps.Count(),
};
}
......@@ -127,17 +106,16 @@ public DtoModels.Comparison<view_check_emp> CheckAccountingUnitRealGiveFeeDiff(C
/// </summary>
public DtoModels.Comparison<DeptComparisonTotal> CheckView_check_deptUnitRealGiveFeeDiffTotal(int allotId)
{
var queryData = @"SELECT UnitType,Count(1) Count,Sum(RealGiveFeeCompute) SumFee FROM
(SELECT *,IFNULL(RealGiveFeeExecl,0) - IFNULL(RealGiveFeeCompute,0) AS Diff FROM (
SELECT * FROM view_check_dept_account UNION ALL
SELECT * FROM view_check_dept_specialunit
) TAB
ORDER BY HospitalId,Year,Month,ABS(DIFF) DESC )view_check_dept
where AllotID = @allotId and Diff <> 0 GROUP BY UnitType";
return new DtoModels.Comparison<DeptComparisonTotal>()
var queryData = $@"CALL proc_allot_check_dept(@allotId);";
var checkEmps = DapperQuery<view_check_emp>(queryData, new { allotId });
var datas = checkEmps.Where(w => w.Diff != 0).GroupBy(w => w.UnitType).Select(w => new DeptComparisonTotal
{
Datas = DapperQuery<DeptComparisonTotal>(queryData, new { allotId })?.ToList() ?? new List<DeptComparisonTotal>(),
};
UnitType = w.Key,
Count = w.Count(),
SumFee = w.Sum(p => p.RealGiveFeeCompute),
}).ToList();
return new DtoModels.Comparison<DeptComparisonTotal>() { Datas = datas };
}
public IDbConnection GetDbConnection()
......
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure;
//using System.Collections.Generic;
//using System.IO;
//using System.Linq;
//using NPOI.HSSF.UserModel;
//using NPOI.SS.UserModel;
//using NPOI.XSSF.UserModel;
//using Performance.DtoModels;
//using Performance.EntityModels;
//using Performance.Infrastructure;
namespace Performance.Services
{
public class AgainService : IAutoInjection
{
private PerHeaderService perHeaderService;
private int DataFirstRowNum = 4;//数据起始行
private int FactorRow = 3;//系数行
public AgainService(PerHeaderService perHeaderService)
{
this.perHeaderService = perHeaderService;
}
//namespace Performance.Services
//{
// public class AgainService : IAutoInjection
// {
// private PerHeaderService perHeaderService;
// private int DataFirstRowNum = 4;//数据起始行
// private int FactorRow = 3;//系数行
// public AgainService(PerHeaderService perHeaderService)
// {
// this.perHeaderService = perHeaderService;
// }
/// <summary>
/// 导入excel数据
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public PerAgainExcel ReadData(per_againallot again)
{
using (FileStream fs = new FileStream(again.Path, FileMode.Open))
{
var excelVersion = FileHelper.GetExtension(again.Path) == ".xlsx" ? ExcelVersion.xlsx : ExcelVersion.xls;
IWorkbook workbook = (excelVersion == ExcelVersion.xlsx) ? new XSSFWorkbook(fs) : new HSSFWorkbook(fs);
for (int i = 0; i < workbook.NumberOfSheets; i++)
{
var sheet = workbook.GetSheetAt(i);
if (sheet.SheetName == "二次分配表")
{
var point = new PerSheetPoint { DataFirstRowNum = 2, HeaderFirstCellNum = 0, HeaderFirstRowNum = 1, HeaderLastRowNum = 2 };
var perHeader = perHeaderService.GetPerHeader(sheet, point);
var results = ReadData(sheet, perHeader);
// /// <summary>
// /// 导入excel数据
// /// </summary>
// /// <param name="path"></param>
// /// <returns></returns>
// public PerAgainExcel ReadData(per_againallot again)
// {
// using (FileStream fs = new FileStream(again.Path, FileMode.Open))
// {
// var excelVersion = FileHelper.GetExtension(again.Path) == ".xlsx" ? ExcelVersion.xlsx : ExcelVersion.xls;
// IWorkbook workbook = (excelVersion == ExcelVersion.xlsx) ? new XSSFWorkbook(fs) : new HSSFWorkbook(fs);
// for (int i = 0; i < workbook.NumberOfSheets; i++)
// {
// var sheet = workbook.GetSheetAt(i);
// if (sheet.SheetName == "二次分配表")
// {
// var point = new PerSheetPoint { DataFirstRowNum = 2, HeaderFirstCellNum = 0, HeaderFirstRowNum = 1, HeaderLastRowNum = 2 };
// var perHeader = perHeaderService.GetPerHeader(sheet, point);
// var results = ReadData(sheet, perHeader);
return new PerAgainExcel { Header = results.Header, AgainData = results.AgainData, AgainEmployee = results.AgainEmployee };
}
}
}
return null;
}
// return new PerAgainExcel { Header = results.Header, AgainData = results.AgainData, AgainEmployee = results.AgainEmployee };
// }
// }
// }
// return null;
// }
private (PerHeader Header, List<PerAgainData> AgainData, List<PerAgainEmployee> AgainEmployee) ReadData(ISheet sheet, List<PerHeader> perHeader)
{
List<PerAgainData> slideDataList = new List<PerAgainData>();
List<PerAgainEmployee> fixatDataList = new List<PerAgainEmployee>();
var header = perHeader.FirstOrDefault(p => p.CellValue == "工作量绩效工资");
if (header != null && header.Children != null)
{
for (int r = DataFirstRowNum; r < sheet.LastRowNum + 1; r++)
{
var row = sheet.GetRow(r);
if (row == null) continue;
// private (PerHeader Header, List<PerAgainData> AgainData, List<PerAgainEmployee> AgainEmployee) ReadData(ISheet sheet, List<PerHeader> perHeader)
// {
// List<PerAgainData> slideDataList = new List<PerAgainData>();
// List<PerAgainEmployee> fixatDataList = new List<PerAgainEmployee>();
// var header = perHeader.FirstOrDefault(p => p.CellValue == "工作量绩效工资");
// if (header != null && header.Children != null)
// {
// for (int r = DataFirstRowNum; r < sheet.LastRowNum + 1; r++)
// {
// var row = sheet.GetRow(r);
// if (row == null) continue;
fixatDataList.Add(FixatRowRead(perHeader, r, row));
slideDataList.AddRange(SlideRowRead(sheet, header, r, row));
}
}
return (header, slideDataList, fixatDataList);
}
/// <summary>
/// 可扩展列读取
/// </summary>
/// <param name="sheet"></param>
/// <param name="header"></param>
/// <param name="r"></param>
/// <param name="row"></param>
/// <returns></returns>
private List<PerAgainData> SlideRowRead(ISheet sheet, PerHeader header, int r, IRow row)
{
List<PerAgainData> slideDataList = new List<PerAgainData>();
// fixatDataList.Add(FixatRowRead(perHeader, r, row));
// slideDataList.AddRange(SlideRowRead(sheet, header, r, row));
// }
// }
// return (header, slideDataList, fixatDataList);
// }
// /// <summary>
// /// 可扩展列读取
// /// </summary>
// /// <param name="sheet"></param>
// /// <param name="header"></param>
// /// <param name="r"></param>
// /// <param name="row"></param>
// /// <returns></returns>
// private List<PerAgainData> SlideRowRead(ISheet sheet, PerHeader header, int r, IRow row)
// {
// List<PerAgainData> slideDataList = new List<PerAgainData>();
for (int c = 0; c < header.Children.Count(); c++)
{
var athead = header.Children.ElementAt(c);
//var cellValue = NopiSevice.GetCellValue(row.GetCell(athead.PointCell));
var cellValue = ConvertHelper.ToDecimalOrNull(row.GetCell(athead.PointCell).GetValue());
if (!cellValue.HasValue || cellValue.Value == 0)
continue;
var factorValue = ConvertHelper.ToDecimalOrNull(sheet.GetRow(FactorRow).GetCell(athead.PointCell)?.ToString());
PerAgainData data = new PerAgainData
{
RowNumber = r,
TypeName = athead?.CellValue,
CellValue = cellValue,
IsTotal = 2,
IsFactor = factorValue.HasValue ? 1 : 2,
FactorValue = factorValue,
Annotation = row.GetCell(athead.PointCell)?.CellComment?.String?.String,
SignID = athead.SignID,
};
slideDataList.Add(data);
}
return slideDataList;
}
// for (int c = 0; c < header.Children.Count(); c++)
// {
// var athead = header.Children.ElementAt(c);
// //var cellValue = NopiSevice.GetCellValue(row.GetCell(athead.PointCell));
// var cellValue = ConvertHelper.ToDecimalOrNull(row.GetCell(athead.PointCell).GetValue());
// if (!cellValue.HasValue || cellValue.Value == 0)
// continue;
// var factorValue = ConvertHelper.ToDecimalOrNull(sheet.GetRow(FactorRow).GetCell(athead.PointCell)?.ToString());
// PerAgainData data = new PerAgainData
// {
// RowNumber = r,
// TypeName = athead?.CellValue,
// CellValue = cellValue,
// IsTotal = 2,
// IsFactor = factorValue.HasValue ? 1 : 2,
// FactorValue = factorValue,
// Annotation = row.GetCell(athead.PointCell)?.CellComment?.String?.String,
// SignID = athead.SignID,
// };
// slideDataList.Add(data);
// }
// return slideDataList;
// }
/// <summary>
/// 固定列读取
/// </summary>
/// <param name="perHeader"></param>
/// <param name="r"></param>
/// <param name="row"></param>
/// <returns></returns>
private static PerAgainEmployee FixatRowRead(List<PerHeader> perHeader, int r, IRow row)
{
return new PerAgainEmployee
{
RowNumber = r,
Name = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "姓名").PointCell)?.ToString(),
JobTitle = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "职务").PointCell)?.ToString(),
JobFactor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "职称系数").PointCell)?.ToString()),
Attendance = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "出勤").PointCell)?.ToString()),
YearFactor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "年资").PointCell)?.ToString()),
Award = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "重点奖励").PointCell)?.ToString()),
Allowance = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "管理津贴").PointCell)?.ToString()),
AlonePerfor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "单独核算人员绩效").PointCell)?.ToString()),
NightShift = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "夜班费").PointCell)?.ToString()),
};
}
}
}
// /// <summary>
// /// 固定列读取
// /// </summary>
// /// <param name="perHeader"></param>
// /// <param name="r"></param>
// /// <param name="row"></param>
// /// <returns></returns>
// private static PerAgainEmployee FixatRowRead(List<PerHeader> perHeader, int r, IRow row)
// {
// return new PerAgainEmployee
// {
// RowNumber = r,
// Name = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "姓名").PointCell)?.ToString(),
// JobTitle = row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "职务").PointCell)?.ToString(),
// JobFactor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "职称系数").PointCell)?.ToString()),
// Attendance = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "出勤").PointCell)?.ToString()),
// YearFactor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "年资").PointCell)?.ToString()),
// Award = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "重点奖励").PointCell)?.ToString()),
// Allowance = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "管理津贴").PointCell)?.ToString()),
// AlonePerfor = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "单独核算人员绩效").PointCell)?.ToString()),
// NightShift = ConvertHelper.ToDecimalOrNull(row.GetCell(perHeader.FirstOrDefault(p => p.CellValue == "夜班费").PointCell)?.ToString()),
// };
// }
// }
//}
using AutoMapper;
using Dapper;
using Masuit.Tools.Systems;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.Extensions.Configuration;
using MySql.Data.MySqlClient;
using NPOI.Util;
using OfficeOpenXml;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Infrastructure.Extensions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
namespace Performance.Services.AllotCompute
{
public class EPImportDataService : IAutoInjection
{
private readonly IConfiguration _configuration;
private readonly IMapper _mapper;
private readonly PerSheetService _perSheetService;
private readonly LogManageService _logManageService;
public EPImportDataService(IConfiguration configuration, IMapper mapper, PerSheetService perSheetService, LogManageService logManageService)
{
_configuration = configuration;
_mapper = mapper;
_perSheetService = perSheetService;
_logManageService = logManageService;
}
public void DeleteSheetData(per_allot allot)
{
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
using var conn = new MySqlConnection(connectionString);
if (conn.State != ConnectionState.Open) conn.Open();
conn.Execute("DELETE FROM im_orig_data WHERE AllotId = @AllotId", new { AllotId = allot.ID });
}
public List<ImportData> ReadSheetData(per_allot allot)
{
var maximumColIndex = _configuration.GetValue("AllotFileReadOption:MaximumColIndex", 256);
var maxEmptyRowIndex = _configuration.GetValue("AllotFileReadOption:MaxEmptyRowIndex", 30);
var maxEmptyColIndex = _configuration.GetValue("AllotFileReadOption:MaxEmptyColIndex", 10);
var skipUnidentifiable = _configuration.GetValue("AllotFileReadOption:SkipUnidentifiable", true);
var version = SnowFlake.GetInstance().GetLongId();
List<ImportData> importDatas = new List<ImportData>();
_logManageService.WriteMsg("读取文件", $"文件读取中...当前操作需要一点时间,请耐心等待", 1, allot.ID, "ReceiveMessage", true);
try
{
using ExcelPackage package = new ExcelPackage(new FileInfo(allot.Path));
foreach (var sheet in package.Workbook.Worksheets.Where(sheet => sheet.Dimension != null))
{
if (sheet.AutoFilterAddress != null)
sheet.Cells[sheet.AutoFilterAddress.Address].AutoFilter = false;
var sheetType = (int)_perSheetService.GetSheetType(sheet.Name);
if (skipUnidentifiable && sheetType == (int)SheetType.Unidentifiable) continue;
_logManageService.WriteMsg("准备读取文件", $"正在准备读取“{sheet.Name}”", 1, allot.ID, "ReceiveMessage", true);
for (int rowIndex = sheet.Dimension.Start.Row; rowIndex <= sheet.Dimension.End.Row; rowIndex++)
{
// 判断当前行与最后一条有效数据的行号 连续空行 中断读取
if (rowIndex > maxEmptyRowIndex && rowIndex - importDatas.Max(w => w.RowIndex) > maxEmptyRowIndex)
{
break;
}
var maxColIndex = rowIndex > maxEmptyRowIndex ? importDatas.Max(w => w.ColIndex) + maxEmptyColIndex : maximumColIndex;
var colCount = Math.Min(sheet.Dimension.End.Column, maxColIndex);
for (int colIndex = sheet.Dimension.Start.Column; colIndex <= colCount; colIndex++)
{
var cell = sheet.Cells[rowIndex, colIndex];
var endRowIndex = rowIndex;
var endColIndex = colIndex;
if (cell.Merge)
{
var mergedCellRang = sheet.MergedCells[rowIndex, colIndex];
var endCellName = mergedCellRang.Split(":").Last();
var endCell = sheet.Cells[endCellName];
endRowIndex = endCell.End.Row;
endColIndex = endCell.End.Column;
}
if (!string.IsNullOrEmpty(cell?.Text))
{
var cellData = new ImportData
{
AllotId = allot.ID,
SheetName = sheet.Name,
SheetIndex = sheet.Index,
SheetType = sheetType,
RowIndex = rowIndex,
ColIndex = colIndex,
Address = cell.Address,
Text = cell.Text?.Clean() ?? "",
Value = cell.Value?.ToString()?.Clean() ?? "",
Comment = cell.Comment?.Text ?? "",
EndRowIndex = endRowIndex,
EndColIndex = endColIndex,
Sign = SnowFlake.GetInstance().GetUniqueShortId(),
ColName = ExcelCellBase.GetAddressCol(colIndex),
Version = version,
//Fulladdress = cell.FullAddress,
//Formula = cell.Formula,
//Format = cell.Style.Numberformat.Format,
//NumFmtId = cell.Style.Numberformat.NumFmtID,
};
importDatas.Add(cellData);
}
}
}
}
}
catch (Exception ex)
{
_logManageService.WriteMsg("读取文件失败", ex.Message.ToString(), 4, allot.ID, "ReceiveMessage", true);
throw;
}
_logManageService.WriteMsg("读取文件", $"EXCEL文件基础数据读取完成!", 1, allot.ID, "ReceiveMessage", true);
_logManageService.WriteMsg("保存基础数据", $"基础数据保存中...当前操作需要一点时间,请耐心等待", 1, allot.ID, "ReceiveMessage", true);
try
{
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
DapperExtensions.BulkInsert(connectionString, importDatas, tableName: "im_orig_data", commandTimeout: 60 * 60 * 5);
}
catch (Exception ex)
{
_logManageService.WriteMsg("保存数据失败", ex.Message.ToString(), 4, allot.ID, "ReceiveMessage", true);
throw;
}
_logManageService.WriteMsg("保存基础数据", $"基础数据保存完成!", 1, allot.ID, "ReceiveMessage", true);
return importDatas;
}
public PerExcel GetImportExcel(per_allot allot)
{
PerExcel excel = new PerExcel
{
Path = allot.Path,
FileName = Path.GetFileName(allot.Path),
PerSheet = new List<PerSheet>()
};
var (accountbasic, specialunit, data, employee, employee_clinic, employee_logistics, header, sheets) = GetImportData(allot);
foreach (var sheet in sheets)
{
if (sheet.SheetType == (int)SheetType.Employee)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var rows = _mapper.Map<List<PerDataEmployee>>(employee);
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
else if (sheet.SheetType == (int)SheetType.LogisticsEmployee)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var rows = _mapper.Map<List<PerDataLogisticsEmployee>>(employee_logistics);
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
else if (sheet.SheetType == (int)SheetType.ClinicEmployee)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var rows = _mapper.Map<List<PerDataClinicEmployee>>(employee_clinic);
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
else if (sheet.SheetType == (int)SheetType.AccountBasic)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var rows = accountbasic.Select(item =>
new PerDataAccountBaisc
{
UnitType = Enum.IsDefined(typeof(UnitType), item.UnitType) ? ((UnitType)item.UnitType).ToString() : "",
AccountingUnit = item.DoctorAccountingUnit,
Drg = item.Drg,
PermanentStaff = item.PermanentStaff,
Number = item.DoctorNumber ?? 0,
BasicFactor = item.DoctorBasicFactor ?? 0,
Extra = item.DoctorExtra,
AssessBeforeOtherFee = item.AssessBeforeOtherFee,
MedicineExtra = item.MedicineExtra,
MaterialsExtra = item.MaterialsExtra,
ScoringAverage = item.DoctorScoringAverage,
AssessLaterOtherFee = item.AssessLaterOtherFee,
AdjustFactor = item.DoctorAdjustFactor,
AdjustLaterOtherFee = item.AdjustLaterOtherFee,
RealGiveFee = item.RealGiveFee,
});
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
else if (sheet.SheetType == (int)SheetType.SpecialUnit)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var rows = _mapper.Map<List<PerDataSpecialUnit>>(specialunit);
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
else if (sheet.SheetType != (int)SheetType.Unidentifiable)
{
var items = header.Where(w => w.SheetID == sheet.ID);
var list = data.Where(w => w.SheetID == sheet.ID);
var rows = _mapper.Map<List<PerData>>(list);
PerSheet perSheet = new PerSheet
{
SheetName = sheet.SheetName,
SheetType = (SheetType)sheet.SheetType,
ModuleName = EnumHelper.GetDescription((SheetType)sheet.SheetType),
PerHeader = _mapper.Map<List<PerHeader>>(items),
PerData = rows.Select(w => (IPerData)w).ToList(),
};
excel.PerSheet.Add(perSheet);
}
}
return excel;
}
private (IEnumerable<im_accountbasic> accountbasic, IEnumerable<im_specialunit> specialunit, IEnumerable<im_data> data, IEnumerable<im_employee> employee, IEnumerable<im_employee_clinic> employee_clinic, IEnumerable<im_employee_logistics> employee_logistics, IEnumerable<im_header> header, IEnumerable<per_sheet> sheet) GetImportData(per_allot allot)
{
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
using var conn = new MySqlConnection(connectionString);
if (conn.State != ConnectionState.Open) conn.Open();
var sql = @"
SELECT * FROM im_accountbasic WHERE AllotId = @AllotId;
SELECT * FROM im_specialunit WHERE AllotId = @AllotId;
SELECT * FROM im_data WHERE AllotId = @AllotId;
SELECT * FROM im_employee WHERE AllotId = @AllotId;
SELECT * FROM im_employee_clinic WHERE AllotId = @AllotId;
SELECT * FROM im_employee_logistics WHERE AllotId = @AllotId;
SELECT * FROM im_header WHERE AllotId = @AllotId;
SELECT * FROM per_sheet WHERE AllotId = @AllotId;
";
var multipleResults = conn.QueryMultiple(sql, new { AllotId = allot.ID });
var accountbasic = multipleResults.Read<im_accountbasic>();
var specialunit = multipleResults.Read<im_specialunit>();
var data = multipleResults.Read<im_data>();
var employee = multipleResults.Read<im_employee>();
var employee_clinic = multipleResults.Read<im_employee_clinic>();
var employee_logistics = multipleResults.Read<im_employee_logistics>();
var header = multipleResults.Read<im_header>();
var sheet = multipleResults.Read<per_sheet>();
return (accountbasic, specialunit, data, employee, employee_clinic, employee_logistics, header, sheet);
}
public void SheetDataImport(per_allot allot)
{
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
using var conn = new MySqlConnection(connectionString);
if (conn.State != ConnectionState.Open) conn.Open();
conn.Execute("call proc_allot_import(@AllotId);", new { AllotId = allot.ID });
}
}
public class ImportData
{
public long Id { get; set; }
/// <summary>
/// 绩效分配月ID
/// </summary>
public long AllotId { get; set; }
/// <summary>
/// 工作表ID
/// </summary>
public long SheetId { get; set; }
/// <summary>
/// 工作表名称
/// </summary>
public string SheetName { get; set; }
/// <summary>
/// 工作表索引
/// </summary>
public int SheetIndex { get; set; }
/// <summary>
/// 行号
/// </summary>
public int RowIndex { get; set; }
/// <summary>
/// 列号
/// </summary>
public int ColIndex { get; set; }
/// <summary>
/// 合并结束行号
/// </summary>
public int EndRowIndex { get; set; }
/// <summary>
/// 合并结束列号
/// </summary>
public int EndColIndex { get; set; }
/// <summary>
/// 文本值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 单元格名称
/// </summary>
public string Address { get; set; }
/// <summary>
/// 文本值
/// </summary>
public string Text { get; set; }
/// <summary>
/// 唯一签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 列名
/// </summary>
public string ColName { get; set; }
/// <summary>
/// 单元格备注
/// </summary>
public string Comment { get; set; }
public int SheetType { get; set; }
public long Version { get; set; }
/// <summary>
/// 数据格式
/// </summary>
//public string Format { get; set; }
///// <summary>
///// 公式
///// </summary>
//public string Formula { get; set; }
///// <summary>
///// 格式ID(第三方)
///// </summary>
//public int? NumFmtId { get; set; }
///// <summary>
///// 单元格地址
///// </summary>
//public string Fulladdress { get; set; }
///// <summary>
///// 创建人
///// </summary>
//public long CreateBy { get; set; }
///// <summary>
///// 创建时间
///// </summary>
//public DateTime CreateTime { get; set; }
///// <summary>
///// 最后修改人
///// </summary>
//public long UpdateBy { get; set; }
///// <summary>
///// 修改时间
///// </summary>
//public DateTime UpdateTime { get; set; }
}
}
......@@ -2,10 +2,12 @@
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
using Performance.Infrastructure.Extensions;
using Performance.Repository;
namespace Performance.Services.AllotCompute
......@@ -15,6 +17,7 @@ namespace Performance.Services.AllotCompute
/// </summary>
public class ProcessComputService : IAutoInjection
{
private readonly IConfiguration _configuration;
private readonly IMapper _mapper;
private readonly IOptions<Application> _options;
private readonly BudgetService _budgetService;
......@@ -34,6 +37,7 @@ public class ProcessComputService : IAutoInjection
private readonly PerforPerallotRepository perallotRepository;
public ProcessComputService(
IConfiguration configuration,
IMapper mapper,
IOptions<Application> options,
BudgetService budgetService,
......@@ -52,6 +56,7 @@ public class ProcessComputService : IAutoInjection
PerforHospitalRepository hospitalRepository,
PerforPerallotRepository perallotRepository)
{
_configuration = configuration;
_mapper = mapper;
_options = options;
_budgetService = budgetService;
......@@ -103,15 +108,14 @@ private void SaveComputeAccount(PerSheet sheet, int allotId)
perforPerSheetRepository.Add(imsheet);
var dataList = sheet.PerData.Select(t => (PerDataAccountBaisc)t);
List<res_account> addList = new List<res_account>();
foreach (var data in dataList)
List<res_account> addList = _mapper.Map<List<res_account>>(dataList);
foreach (var data in addList)
{
var imdata = _mapper.Map<res_account>(data);
imdata.SheetID = imsheet.ID;
imdata.AllotID = allotId;
addList.Add(imdata);
data.SheetID = imsheet.ID;
data.AllotID = allotId;
}
perforResaccountRepository.AddRange(addList.ToArray());
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
DapperExtensions.BulkInsert(connectionString, addList, tableName: "res_account", commandTimeout: 60 * 60 * 5);
}
/// <summary>
......@@ -122,6 +126,7 @@ private void SaveComputeAccount(PerSheet sheet, int allotId)
/// <returns></returns>
private void SaveCommon(PerSheet sheet, int allotId)
{
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
var imsheet = new per_sheet { AllotID = allotId, SheetName = sheet.SheetName, Source = 2, SheetType = (int)sheet.SheetType };
perforPerSheetRepository.Add(imsheet);
......@@ -144,18 +149,16 @@ private void SaveCommon(PerSheet sheet, int allotId)
}
}
}
perforImHeaderRepository.AddRange(addHeadList.ToArray());
DapperExtensions.BulkInsert(connectionString, addHeadList, tableName: "im_header", commandTimeout: 60 * 60 * 5);
List<im_data> addDataList = new List<im_data>();
var dataList = sheet.PerData.Select(t => (PerData)t);
foreach (var data in dataList)
List<im_data> addDataList = _mapper.Map<List<im_data>>(dataList);
foreach (var data in addDataList)
{
var imdata = _mapper.Map<im_data>(data);
imdata.SheetID = imsheet.ID;
imdata.AllotID = allotId;
addDataList.Add(imdata);
data.SheetID = imsheet.ID;
data.AllotID = allotId;
}
perforImDataRepository.AddRange(addDataList.ToArray());
DapperExtensions.BulkInsert(connectionString, addDataList, tableName: "im_data", commandTimeout: 60 * 60 * 5);
}
/// <summary>
......
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using AutoMapper;
using AutoMapper;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OfficeOpenXml;
......@@ -16,6 +12,11 @@
using Performance.Repository;
using Performance.Services.AllotCompute;
using Performance.Services.ExtractExcelService;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
namespace Performance.Services
{
......@@ -23,6 +24,7 @@ public class AllotService : IAutoInjection
{
private BaiscNormService baiscNormService;
private ImportDataService importDataService;
private readonly EPImportDataService _epImportDataService;
private ProcessComputService processComputService;
private ResultComputeService resultComputeService;
private PerforLogdbugRepository logdbug;
......@@ -36,6 +38,7 @@ public class AllotService : IAutoInjection
private IEmailService emailService;
private readonly IOptions<Application> options;
private readonly IOptions<AppConnection> _appConnection;
private readonly IConfiguration _configuration;
private readonly ComputeDirector _computeDirector;
private readonly PerforRescomputeRepository _perforRescomputeRepository;
private readonly PerforImemployeeRepository _perforImEmployeeRepository;
......@@ -62,6 +65,7 @@ public class AllotService : IAutoInjection
PerforPerallotRepository allotRepository,
BaiscNormService baiscNormService,
ImportDataService importDataService,
EPImportDataService epImportDataService,
ProcessComputService processComputService,
ResultComputeService resultComputeService,
ConfigService configService,
......@@ -70,6 +74,7 @@ public class AllotService : IAutoInjection
IEmailService emailService,
IOptions<Application> options,
IOptions<AppConnection> appConnection,
IConfiguration configuration,
ComputeDirector computeDirector,
PerforRescomputeRepository perforRescomputeRepository,
PerforImemployeeRepository perforImEmployeeRepository,
......@@ -97,11 +102,13 @@ public class AllotService : IAutoInjection
_evn = evn;
this.baiscNormService = baiscNormService;
this.importDataService = importDataService;
_epImportDataService = epImportDataService;
this.processComputService = processComputService;
this.resultComputeService = resultComputeService;
this.emailService = emailService;
this.options = options;
_appConnection = appConnection;
_configuration = configuration;
_computeDirector = computeDirector;
_perforRescomputeRepository = perforRescomputeRepository;
_perforImEmployeeRepository = perforImEmployeeRepository;
......@@ -338,10 +345,22 @@ public void Generate(per_allot allot)
logManageService.WriteMsg("绩效开始执行", $"数据来源:用户上传的Excel。", 1, allot.ID, "ReceiveMessage", true);
configService.Clear(allot.ID);
var useNewRead = _configuration.GetValue("AllotFileReadOption:UseNewRead", true);
if (useNewRead)
{
_epImportDataService.DeleteSheetData(allot);
_epImportDataService.ReadSheetData(allot);
_epImportDataService.SheetDataImport(allot);
excel = _epImportDataService.GetImportExcel(allot);
}
else
{
// 关闭筛选功能
ExtractHelper.CloseAutoFilter(allot.Path);
// 导出数据
excel = importDataService.ReadDataAndSave(allot);
}
//if (!checkDataService.Check(excel, allot))
//{
......
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Dapper;
using Microsoft.Extensions.Configuration;
using MySql.Data.MySqlClient;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Repository;
......@@ -8,11 +13,12 @@ namespace Performance.Services
{
public class TaskService : IAutoInjection
{
private readonly IConfiguration _configuration;
private readonly PerforBgtaskRepository _taskRepository;
public TaskService(
PerforBgtaskRepository taskRepository)
public TaskService(IConfiguration configuration, PerforBgtaskRepository taskRepository)
{
_configuration = configuration;
_taskRepository = taskRepository;
}
......@@ -23,7 +29,13 @@ public class TaskService : IAutoInjection
/// <returns></returns>
public List<bg_task> GetTasks(int hours = -10)
{
return _taskRepository.GetEntities(w => w.CreateTime > DateTime.Now.AddHours(hours));
var connectionString = _configuration.GetValue("AppConnection:PerformanceConnectionString", "");
using var conn = new MySqlConnection(connectionString);
if (conn.State != ConnectionState.Open) conn.Open();
var sql = @"SELECT * FROM bg_task WHERE CreateTime > DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL CAST(@hours AS signed) hour);";
var tasks = conn.Query<bg_task>(sql, new { hours }).ToList();
return tasks;
}
public bool Add(Background.JobType type, string argument = "")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment