ImportMethod.cs 7.19 KB
using Hh.Mes.Common.log;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.Response;
using Hh.Mes.Service.Repository;
using NPOI.OpenXmlFormats.Dml.Diagram;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using static Hh.Mes.Common.Exel.NpoiExcelImportHelper;

namespace Hh.Mes.Service.WebService.Planned
{
    /// <summary>
    /// 定义导入方法加上特性
    /// dicDtSource 添加需要保存到数据源的数据源 
    /// 注意:只改对应业务的dt 数据【公共方法里面的读取的数据源不要修改、其他地方可能需要用到】
    /// </summary>
    public class ImportMethod : RepositorySqlSugar<base_material>
    {
        public string materialDtKey { get; set; }

        public ImportMethod()
        {

        }

        #region 设备管理 Action里面的 equipment  是数据库表名 ,方法名没有特殊要求 ,注意不要删除sysDicDtSource里面的key
        [Action("equipment")]
        public Response EquipmentMethod(Dictionary<string, SysDtAllCls> sysDicDtSource, dynamic user, DateTime nowTime)
        {
            #region init
            var response = new Response();
            //【修改项1】
            var excelFileNameKeys = ExcelName.equipment.ToString();
            response = ImportMethodBefore(sysDicDtSource, response, excelFileNameKeys);
            if (response.Code != 200) {
                response.Message = $"【{TableName.excelEquipmentChinese}】" + response.Message;
                return response;
            }
            //公共方法数据源,需要判断的数据源单独建一个
            DataTable excelDtSourceDt = response.Result.data;

            DataTable titleVerifySourceDt = response.Result.title;
            #endregion

            #region 创建dt、添加保存到数据库的dicDtSource 【修改项2
            var eqSaveDt = GetTableStructure(TableName.tableNameEquipment);
            var temp = new SysDtAllCls()
            {
                dtData = eqSaveDt
            };
            sysDicDtSource.Add(TableName.tableNameDataEquipment, temp);
            #endregion

            #region 去重 【修改项3 根据实际业务】
            var tempExcelDtSourceDt = excelDtSourceDt.Distinct("Code");
            #endregion

            #region 赋值  理论上是通用的,修改excel文件名 【修改项4
            var columns = tempExcelDtSourceDt.Columns;
            for (int i = 0; i < tempExcelDtSourceDt.Rows.Count; i++)
            {
                var dr = eqSaveDt.NewRow();
                for (int c = 0; c < columns.Count; c++)
                {
                    var colName = columns[c].ColumnName;
                    dynamic colNameVal = tempExcelDtSourceDt.Rows[i][colName].ToString();
                    response= SetDataTableDataBefore(response, i, colName, colNameVal, titleVerifySourceDt, TableName.excelEquipmentChinese);
                    if (response.Code != 200) return response;

                    colNameVal = SetDataTableData(colNameVal, eqSaveDt.Columns[colName].DataType.Name);
                    dr[colName] = colNameVal;
                }

                dr["CreatedBy"] = user;
                dr["Created"] =nowTime;
                eqSaveDt.Rows.Add(dr);
            }
            #endregion

            #region 逻辑判断


            #endregion

            return response;
        }
        #endregion

        #region SaveSuccessAfter 

        /// <summary>
        /// equipment
        /// </summary>
        /// <param name="dateTime"></param>
        public void SaveSuccessAfterEquipment(DateTime dateTime)
        {

            
        }


        #endregion

        #region 公共方法

        public Response ImportMethodBefore(Dictionary<string, SysDtAllCls> pairs, Response response, string keys)
        {
            DataTable dt;
            if (pairs.ContainsKey(keys))
            {
                dt = pairs[keys].dtData;
            }
            else
            {
                response.Code = 500;
                response.Status = false;
                response.Message = $"导入Excel不存在[{keys}]文件]";
                return response;
            }
            if (dt == null || dt.Rows.Count == 0)
            {
                response.Code = 500;
                response.Message = $"[{keys}]导入Excel文件没有数据!";
                return response;
            }
            response.Result = new {
                data = dt,
                title = pairs[keys].dtTitle
            };
            return response;
        }


        /// <summary>
        /// 获取表结构 没有数据源,并设置dt的表名 ,去掉id列
        /// </summary>
        public DataTable GetTableStructure(string tableName)
        {
            var sql = $"select * from {tableName} where 1!=1";
            var dt = base.Context.Ado.GetDataTable(sql);
            dt.TableName = tableName;
            //var columnsId = "id";
            // if (dt.Columns.Contains(columnsId)) dt.Columns.Remove(columnsId);
            return dt;
        }

        /// <summary>
        ///  设置DataTable 
        /// </summary>
        public dynamic SetDataTableData(dynamic colNameVal, string dataTypeName)
        {
            var selectKey = "__";

            if (!string.IsNullOrEmpty(colNameVal) && colNameVal.IndexOf(selectKey) > -1)
            {
                var tempArr = colNameVal.Split(selectKey);
                switch (dataTypeName)
                {
                    case "Int32":
                        colNameVal = int.Parse(tempArr[1]);
                        break;
                    default:
                        colNameVal = tempArr[1];
                        break;
                }

            }
            else if (string.IsNullOrEmpty(colNameVal))
            {
                switch (dataTypeName)
                {
                    case "String":
                        colNameVal = "";
                        break;
                    case "Int32":
                    case "DateTime":
                        colNameVal = DBNull.Value;
                        break;
                    default:
                        colNameVal = DBNull.Value;
                        break;
                }
            }
            return colNameVal;
        }


        /// <summary>
        ///  设置DataTable  Before( 
        /// </summary>
        public Response SetDataTableDataBefore(Response response, int index ,string colName,string colNameVal, DataTable titleVerifySourceDt,string excelName)
        {
            var keys = "*";
            if (index == 0)
            {
                string tempVerifyVal = titleVerifySourceDt.Rows[index][colName].ToString();
                if (tempVerifyVal.IndexOf(keys) > -1 && string.IsNullOrEmpty(colNameVal))
                {
                    response.Code = 500;
                    response.Status = false;
                    response.Message = $"【{excelName}】导入 Excel 列名【{colName}、{tempVerifyVal}】不能为空";
                    return response;
                }
            }
            response.Message = "";
            response.Code = 200;
            return response;
        }
        #endregion
    }
}