using BPA.Franchisee.Application.FranchiseeCenter.GoodsServices;
using BPA.SAAS.Manage.Application.DataBase.Dtos.Batching;
using BPA.SAAS.Manage.Application.DataBase.Dtos.Bom;
using BPA.SAAS.Manage.Application.DataBase.Dtos.Goods;
using BPA.SAAS.Manage.Application.DataBase.Dtos.GoodsAttribute;
using BPA.SAAS.Manage.Application.DataBase.Interface;
using BPA.SAAS.Manage.Application.System.Dtos;
using BPA.SAAS.Manage.Application.System.Interface;
using BPA.SAAS.Manage.Application.System.Services;
using BPA.SAAS.Manage.Comm.Const;
using BPA.SAAS.Manage.Comm.Enum;
using BPA.SAAS.Manage.Comm.Util;
using BPA.SAAS.Manage.Core.Base;
using BPA.SAAS.Manage.Core.DataBase;
using BPA.SAAS.Manage.Core.Device;
using BPA.SAAS.Manage.Core.Product;
using Furion.ClayObject.Extensions;
using Newtonsoft.Json;
using Npoi.Mapper;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using Org.BouncyCastle.Asn1.Cms;
using System;
using System.Collections;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace BPA.SAAS.Manage.Application.DataBase.Services
{
    public class GoodsService: IGoodsService, ITransient
    {
        private readonly ISqlSugarClient _db;
        IGoodsAttributeService _goodsAttributeService;
        ISystemConfigService _SystemConfigService;
        public GoodsService(ISqlSugarClient db, IGoodsAttributeService goodsAttributeService, ISystemConfigService SystemConfigService)
        {
            _db=db;
            _goodsAttributeService=goodsAttributeService;
            _SystemConfigService = SystemConfigService;
        }
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<PageUtil> GetGoodsPage(GoodsQueryDto dto)
        {
            List<IConditionalModel> conModels = new List<IConditionalModel>();
            #region 条件查询
            if (!string.IsNullOrEmpty(dto.Name))
            {
                conModels.Add(new ConditionalModel() { FieldName = "a.Name", ConditionalType = ConditionalType.Like, FieldValue = dto.Name });
            }
          
            if (!string.IsNullOrEmpty(dto.GoodsTypeName))
            {
                conModels.Add(new ConditionalModel() { FieldName = "a.GoodsTypeId", ConditionalType = ConditionalType.Equal, FieldValue = dto.GoodsTypeName });
            }
      
            if (!string.IsNullOrEmpty(dto.Status))
            {
                conModels.Add(new ConditionalModel() { FieldName = "a.Status", ConditionalType = ConditionalType.Like, FieldValue = dto.Status });
            }
            if (!string.IsNullOrEmpty(dto.Descritption))
            {
                conModels.Add(new ConditionalModel() { FieldName = "a.Descritption", ConditionalType = ConditionalType.Like, FieldValue = dto.Descritption });
            }
            #endregion

            RefAsync<int> total = 0;
            var res =await _db.Queryable<BPA_GoodsInfo, BPA_GoodsType>((a, b) => new JoinQueryInfos(
                     JoinType.Left, a.GoodsTypeId == b.Id
                 ))
                .WhereIF(!string.IsNullOrWhiteSpace(dto.Code), (a, b) => a.Code.Contains(dto.Code))
                //  .WhereIF(dto.CreateAt.HasValue, (a, b) => SqlFunc.DateIsSame(a.CreateAt, Convert.ToDateTime(dto.CreateAt), DateType.Day))
       
                .Where(conModels)
                .OrderBy(a => a.CreateAt, OrderByType.Desc)
                .Select((a, b) => new
                {
                    Id = a.Id,
                    Code = a.Code,
                    Name = a.Name,
                    Price = a.Price,
                    ImgUrl = a.ImgUrl,
                    Status = a.Status,
                    GoodsTypeId = b.IsDeleted == 0 ? a.GoodsTypeId : "",
                    GoodsTypeName = b.IsDeleted == 0 ? b.Name : "",
                    Descritption = a.Descritption,
                    IsDeleted = a.IsDeleted,
                    a.GroupId,
                    // CreateAt = a.CreateAt,
                    GoodsUintId = a.GoodsUintId,
                    ForeignKeyRe = a.ForeignKeyRe,
                    Design = a.Design,
                    IsWeigh = a.IsWeigh,
                    DefaultMate = a.DefaultMate,
                    IsAttrubute = a.IsAttrubute,
                    Goodstechnology = SqlFunc.Subqueryable<BPA_GoodsTechnologyAction>().Where(p => p.GoodsId == a.Id).WhereIF(!string.IsNullOrWhiteSpace(dto.DeviceId),p=>p.DeviceId== dto.DeviceId).ToList(),
                })

                .ToPageListAsync(dto.Current, dto.PageSize,  total);
            PageUtil util = new PageUtil()
            {
                Total = total,
                Data = res
            };
            return util;
        }
     
        /// <summary>
        /// 查询所有商品
        /// </summary>
        /// <returns></returns>
        public async Task<List<BPA_GoodsInfo>> GetGoodsList()
        {
            var res = await _db.Queryable<BPA_GoodsInfo>().ToListAsync();
            return res;
        }
        /// <summary>
        /// 添加商品
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<bool> AddGoods(GoodsDto dto)
        {
            if (string.IsNullOrWhiteSpace(dto.Id))
            {
                var resEntity = new BPA_GoodsInfo();
                resEntity.Id = Guid.NewGuid().ToString();
                resEntity.GoodsTypeId = dto.GoodsTypeId;
                resEntity.Name = dto.Name;
                resEntity.Descritption = dto.Descritption;
                resEntity.ImgUrl = dto.ImgUrl;
                resEntity.Price = dto.Price;
                resEntity.IsWeigh = dto.IsWeigh;
                resEntity.GoodsUintId = dto.GoodsUintId;
                resEntity.IsAttrubute = dto.IsAttrubute;
                resEntity.Code = GetNumber2(8);
                var data = _db.Queryable<BPA_GoodsInfo>().Max(x => x.AutoKey);
                //if (data == 0) data = 1000;
                //else data = data + 1;
               // resEntity.AutoKey = data;
                var res = await _db.Insertable(resEntity).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                return res > 0;
            }
            else
            {
                return await UpdateGoods(dto);
            }
           
        }
     
        /// <summary>
        /// 更新商品
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<bool> UpdateGoods(GoodsDto dto)
        {
            // 查询数据库中是否存在未删除的商品类型
            var resEntity = _db.Queryable<BPA_GoodsInfo>().Where(it => it.IsDeleted == 0).First(it => it.Id == dto.Id);
            if (null == resEntity)
            {
                throw Oops.Oh("商品不存在");
            }
            resEntity.GoodsTypeId = dto.GoodsTypeId;
            resEntity.Name = dto.Name;
            resEntity.Descritption = dto.Descritption;
            resEntity.ImgUrl = dto.ImgUrl;
            resEntity.Price = dto.Price;
            resEntity.IsWeigh = dto.IsWeigh;
            resEntity.GoodsUintId = dto.GoodsUintId;
            resEntity.IsAttrubute = Convert.ToBoolean(dto.IsAttrubute);
            if (!string.IsNullOrWhiteSpace(dto.Status))
            {
                resEntity.Status = (CommonStatus)Enum.ToObject(typeof(CommonStatus), int.Parse(dto.Status));
            }
         
            var res = await _db.Updateable(resEntity).ExecuteCommandAsync();
            return res > 0;
        }
        /// <summary>
        /// 删除商品
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<bool> DeleteGoods(string id)
        {
            try
            {
                _db.Ado.BeginTran();
                var goods = _db.Queryable<BPA_GoodsInfo>().Where(x => x.Id == id).First();
                if (goods == null) throw Oops.Oh("商品不存在");
                var goodsbom = _db.Queryable<BPA_GoodsBom>().Where(x => x.Goods_Id == id).ToList();
                var goodsTechnology = _db.Queryable<BPA_GoodsTechnologyAction>().Where(x => x.GoodsId == id).ToList();
                //var FoodMenuGoods = _db.Queryable<BPA_FoodMenuGoods>().Where(x => x.GoodsId == id).ToList();
                await _db.Deleteable(goodsbom).ExecuteCommandAsync();
                await _db.Deleteable(goodsTechnology).ExecuteCommandAsync();
                //await _db.Deleteable(FoodMenuGoods).ExecuteCommandAsync();
                var res = await _db.Deleteable(goods).ExecuteCommandAsync();
                _db.Ado.CommitTran();
                return res > 0;
            }
            catch (Exception)
            {
                _db.Ado.RollbackTran();
                throw Oops.Oh("删除失败");
            }
            
        }
        /// <summary>
        /// 查询商品单位
        /// </summary>
        /// <returns></returns>
        public async Task<List<dynamic>> GetGoodsUintList()
        {
            var res = await _db.Queryable<BPA_GoodsUint>().Select<dynamic>(x => new

            {
                id = x.Id,
                name = x.Name
            }).ToListAsync();
            return res;
        }
        public async Task<List<dynamic>> GetGoodsUintList_alm()
        {
            var groupId = App.HttpContext.Request.Headers["groupId"].ToString();
            if (string.IsNullOrWhiteSpace(groupId)) throw Oops.Oh("加盟商id不能为空");
            var res = await _db.Queryable<BPA_GoodsUint>().Where(x=>x.GroupId== groupId).Select<dynamic>(x => new

            {
                id = x.Id,
                name = x.Name
            }).ToListAsync();
            return res;
        }
        /// <summary>
        /// 添加商品单位
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<bool> AddGoodsUint(GoodsUintDto dto)
        {
            var productCode = _db.Queryable<BPA_GoodsUint>().Where(x =>x.Name == dto.Name).ToList();
            if (productCode.Count() > 0)
            {
                throw Oops.Oh("商品单位已存在");
            }
            try
            {
                BPA_GoodsUint bPA_Product = new BPA_GoodsUint();
                bPA_Product.Name = dto.Name;
                var res = await _db.Insertable(bPA_Product).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                return res > 0;
            }
            catch (Exception ex)
            {
                throw Oops.Oh("添加失败");
            }
        }
        /// <summary>
        /// 商品配方
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public  async Task<PageUtil> GetGoodsBomPageAsync(GoodsBomQueryDto dto)
        {
            RefAsync<int> total = 0;
            var res =await _db.Queryable<BPA_Bom, BPA_BomAttributeValueRe>((a, b) => new JoinQueryInfos(
                     JoinType.Left, a.Id == b.BoomId
                 ))
                  .WhereIF(!string.IsNullOrWhiteSpace(dto.GoodsId), (a, b) => b.GoodsId==dto.GoodsId)
                .WhereIF(!string.IsNullOrWhiteSpace(dto.Name), (a, b) => a.Name.Contains(dto.Name))
                  .WhereIF(!string.IsNullOrWhiteSpace(dto.GoodsAttributeValue), (a, b) => b.GoodsAttributeValue.Contains(dto.GoodsAttributeValue))
                .Select((a, b) => new GoodsBomPageView
                {
                    Id = b.Id,
                    Name = a.Name,
                    BomId= b.BoomId,
                    IsMain = a.IsMain,
                    GoodsAttributeValueId=b.GoodsAttributeValueId,
                    GoodsAttributeValue=b.GoodsAttributeValue,
                })
                .ToPageListAsync(dto.Current, dto.PageSize,  total);
            PageUtil util = new PageUtil()
            {
                Total = total,
                Data = res
            };
            return util;
        }
        /// <summary>
        /// 删除商品配方
        /// </summary>
        /// <param name="Ids"></param>
        /// <returns></returns>
        public async Task<bool> BatchDelGoodsBomAsync(string Ids)
        {
            // var GoodsBom=_db.Queryable<BPA_GoodsBom>().Where(x => x.Id == Ids).First();
            var model=_db.Queryable<BPA_BomAttributeValueRe>().Where(x => x.Id == Ids).First();
            if(model==null) throw Oops.Oh("配方不存在");
            _db.Deleteable<BPA_GoodsBom>().Where(x => x.Goods_Id == model.GoodsId && x.BomId== model.BoomId).ExecuteCommand();
            // 查询数据库中是否存在未删除的商品
            var res = _db.Deleteable<BPA_BomAttributeValueRe>().In(Ids).ExecuteCommand();
            return res > 0;
        }
        /// <summary>
        /// 添加商品配方
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<bool> AddGoodsBomAttribute(GoodsBomAttributeDto dto)
        {
            _db.Ado.BeginTran();
            try
            {
                if(dto.Type== "add")
                {
                    var sortMax = _db.Queryable<BPA_Bom>().Max(x => x.Sort);
                    BPA_Bom newbPA_BOM = new BPA_Bom
                    {
                        Name = dto.BomName,
                        Code = GetNumber2(),
                        IsMain = dto.BomType == "1" ? true : false,
                        Sort = sortMax + 1,
                        Id = Guid.NewGuid().ToString(),
                        CreateAt = DateTime.Now,
                        Status = CommonStatus.ENABLE,
                    };
                    //添加配方
                    var res = _db.Insertable(newbPA_BOM).CallEntityMethod(m => m.Create()).ExecuteCommand();
                    //添加配方分类
                    var list = dto.BomtypeList.Select(item => new BPA_BomTypeInfo() { BomId = newbPA_BOM.Id, BomTypeId = item }).ToList();
                    _db.Insertable(list).CallEntityMethod(m => m.Create()).ExecuteCommand();

                    BPA_GoodsBom bom = new BPA_GoodsBom();
                    bom.Goods_Id = dto.GoodsId;
                    bom.BomId = newbPA_BOM.Id;
                    bom.Status = CommonStatus.ENABLE;
                    //添加商品配方关系
                    _db.Insertable(bom).CallEntityMethod(m => m.Create()).ExecuteCommand();
                    List<BPA_BomEntry> BOMEntryList = new();
                    if (dto.Mate.Count > 0)
                    {
                        for (int i = 0; i < dto.Mate.Count; i++)
                        {
                            BPA_BomEntry newbPA_BOMEnty = new BPA_BomEntry
                            {
                                BatchingId = dto.Mate[i].batchingId,
                                //BatchingKey = dto.Mate[i].AutoKey,
                                BomQty = dto.Mate[i].dosage,
                                BomId = newbPA_BOM.Id,
                                Status = CommonStatus.ENABLE,
                                IsReplace = false,
                            };
                            BOMEntryList.Add(newbPA_BOMEnty);
                        }
                    }
                    //添加配方物料关系
                    _db.Insertable(BOMEntryList).CallEntityMethod(m => m.Create()).ExecuteCommand();
                    BPA_BomAttributeValueRe bPA_BomAttributeValueRe = new();
                    bPA_BomAttributeValueRe.Id = Guid.NewGuid().ToString();
                    bPA_BomAttributeValueRe.GoodsId = dto.GoodsId;
                    bPA_BomAttributeValueRe.BoomId = newbPA_BOM.Id;
                    bPA_BomAttributeValueRe.GoodsAttributeValueId = string.Join(",", dto.Shuxing);
                    bPA_BomAttributeValueRe.GoodsAttributeValue = dto.GoodsAttributeValue;
                    //添加商品配方属性关系
                    _db.Insertable(bPA_BomAttributeValueRe).ExecuteCommand();
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(dto.BomId)) throw Oops.Oh("请选择配方");
                    if (!string.IsNullOrWhiteSpace(dto.BomId))
                    {
                        var check=_db.Queryable<BPA_GoodsBom>().Where(x => x.Goods_Id == dto.GoodsId && x.BomId == dto.BomId).Any();
                        if (!check)
                        {
                            BPA_GoodsBom bom = new BPA_GoodsBom();
                            bom.Goods_Id = dto.GoodsId;
                            bom.BomId = dto.BomId;
                            bom.Status = CommonStatus.ENABLE;
                            //添加商品配方关系
                            _db.Insertable(bom).CallEntityMethod(m => m.Create()).ExecuteCommand();
                        }
                        string vid = string.Join(",", dto.Shuxing);
                        var checkvid = _db.Queryable<BPA_BomAttributeValueRe>().Where(x => x.GoodsId == dto.GoodsId && x.BoomId == dto.BomId && x.GoodsAttributeValueId== vid).Any();
                        if(checkvid) throw Oops.Oh("该配方已经存在");
                        //添加商品配方属性关系
                        BPA_BomAttributeValueRe bPA_BomAttributeValueRe = new();
                            bPA_BomAttributeValueRe.Id = Guid.NewGuid().ToString();
                            bPA_BomAttributeValueRe.GoodsId = dto.GoodsId;
                            bPA_BomAttributeValueRe.BoomId = dto.BomId;
                            bPA_BomAttributeValueRe.GoodsAttributeValueId = vid;
                        bPA_BomAttributeValueRe.GoodsAttributeValue = dto.GoodsAttributeValue;
                        _db.Insertable(bPA_BomAttributeValueRe).ExecuteCommand();
                    } 
                    
                }
                _db.Ado.CommitTran();
                return true;
            }
            catch (Exception e)
            {
                _db.Ado.RollbackTran();
                throw Oops.Oh("添加失败，失败信息：" + e.Message);
            }
        }
        public async Task<bool> AddGoodsBom(GoodsBomDto dto)
        {
            var res = false;
            List<BPA_GoodsBom> list = new();
            if (dto.BomId.Count() > 0)
            {
                for (int i = 0; i < dto.BomId.Count; i++)
                {
                    BPA_GoodsBom goodsBom = new();
                    goodsBom.BomId = dto.BomId[i];
                    goodsBom.Goods_Id= dto.GoodsId;
                    goodsBom.Status = CommonStatus.ENABLE;
                    list.Add(goodsBom);
                }
            }
            if (list.Count>0)
            {
                res=await _db.Insertable(list).CallEntityMethod(m => m.Create()).ExecuteCommandAsync()>0;
            }
            return res;
        }
        /// <summary>
        /// 根据id查询商品信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<GoodsInfoBaseView> GetGoods(string id)
        {
            var res = await _db.Queryable<BPA_GoodsInfo>()
                .Where((a) => a.IsDeleted == 0 && a.Id == id)
                .OrderBy(a => a.CreateAt, OrderByType.Desc)
                .Select((a) => new GoodsInfoBaseView
                {
                    Id = a.Id,
                    Code = a.Code,
                    Name = a.Name,
                    Price = a.Price,
                    ImgUrl = a.ImgUrl,
                    Status = a.Status,
                    GoodsTypeId = a.GoodsTypeId,
                    GoodsTypeName = SqlFunc.Subqueryable<BPA_GoodsType>().Where(s => s.Id == a.GoodsTypeId && s.IsDeleted == 0).Select(s => s.Name),
                    Remark = a.Descritption,
                    // CreateAt = a.CreateAt,
                    GoodsUintId = a.GoodsUintId,
                    IsAttrubute = a.IsAttrubute,
                    GoodsUintName = SqlFunc.Subqueryable<BPA_GoodsUint>().Where(s => s.Id == a.GoodsUintId && s.IsDeleted == 0).Select(s => s.Name),
                    //GoodsAttributeList = new List<GoodsAttributeList>()
                }).FirstAsync();
            if (res!=null&&!res.IsAttrubute)
            {
                res.GoodsAttributeList = await _goodsAttributeService.GetByNameAttribute("默认属性");
            }
            else
            {
                res.GoodsAttributeList = await _goodsAttributeService.GetByGoodsIdAttribute(res.Id);
            }

            return res;
        }

        /// <summary>
        /// 更具id查询商品信息
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public async Task<List<GoodsInfoBaseView>> GetGoodsListByIds(List<string> ids)
        {
            var res = await _db.Queryable<BPA_GoodsInfo>()
                .Where((a) => a.IsDeleted == 0 && ids.Contains(a.Id))
                .OrderBy(a => a.CreateAt, OrderByType.Desc)
                .Select((a) => new GoodsInfoBaseView
                {
                    Id = a.Id,
                    Code = a.Code,
                    Name = a.Name,
                    Price = a.Price,
                    ImgUrl = a.ImgUrl,
                    Status = a.Status,
                    GoodsTypeId = a.GoodsTypeId,
                    GoodsTypeName = SqlFunc.Subqueryable<BPA_GoodsType>().Where(s => s.Id == a.GoodsTypeId && s.IsDeleted == 0).Select(s => s.Name),
                    Remark = a.Descritption,
                    // CreateAt = a.CreateAt,
                    GoodsUintId = a.GoodsUintId,
                    IsAttrubute = a.IsAttrubute,
                    GoodsUintName = SqlFunc.Subqueryable<BPA_GoodsUint>().Where(s => s.Id == a.GoodsUintId && s.IsDeleted == 0).Select(s => s.Name),
                    //GoodsAttributeList = new List<GoodsAttributeList>()
                }).ToListAsync();

            foreach (var item in res)
            {
                if (!item.IsAttrubute)
                {
                    item.GoodsAttributeList = await _goodsAttributeService.GetByNameAttribute("默认属性");
                }
                else
                {
                    item.GoodsAttributeList = await _goodsAttributeService.GetByGoodsIdAttribute(item.Id);
                }
            }

            return res;
        }

        public async Task<bool> ExportGood(IFormFile file)
        {
            bool isReplace = true;
            try
            {

                //var groupId = string.IsNullOrWhiteSpace(CurrentUser.TenantId)
                //? App.User?.FindFirst(ClaimConst.GroupId)?.Value
                // : CurrentUser.TenantId;
                var userId = App.User?.FindFirst(ClaimConst.CLAINM_USERID)?.Value;
                if (string.IsNullOrEmpty(userId))
                {
                    userId = "";
                }
                var source = file.OpenReadStream();
                var mapper = new Mapper(source);
                _db.Ado.BeginTran();
                //添加 商品_物料信息
                #region 添加 商品_物料信息

                //1.查询并且添加类型
                var nonLiquid = await _db.Queryable<BPA_BatchingType>()
                    .Where(x => x.Name == "非液体" ).FirstAsync();
                if (nonLiquid == null)
                {
                    nonLiquid = new BPA_BatchingType()
                    {
                        IsDeleted = 0,
                        Name = "非液体",
                    };
                    await _db.Insertable(nonLiquid).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                }
                var liquid = await _db.Queryable<BPA_BatchingType>()
                    .Where(x => x.Name == "液体料").FirstAsync();
                if (liquid == null)
                {
                    liquid = new BPA_BatchingType
                    {
                        IsDeleted = 0,
                        Name = "液体料",
                    };
                    await _db.Insertable(liquid).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                }

                //单位
                var unit = await _db.Queryable<BPA_BatchingUint>().Where(x => x.Name == "默认单位").FirstAsync();
                if (unit == null)
                {
                    unit = new BPA_BatchingUint
                    {
                        IsDeleted = 0,
                        Name = "默认单位",
                    };
                    await _db.Insertable(unit).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                }

                //3.物料
                ReadExcel<BatchingModel> readGoodBaseModelExcel = new();
                var GoodBaseModellist = readGoodBaseModelExcel.ExcelToList(source, mapper, "商品_物料信息");
                List<BPA_Batching> batchingList = GoodBaseModellist.Select(t => new BPA_Batching()
                {
                    Aittribute = 0,
                    Batching_Name = t.BatchingName,
                    Code = GetNumber2(),
                    IsDeleted = 0,
                    netrecovery = 0,
                    outstockUint = unit.Id,
                    Price = 0,
                    proportion = 0,
                    Specs = "默认规格",
                    Status = 0,
                    StockUint = unit.Id,
                    TypeID = t.BatchingType == "液体料" ? liquid.Id : nonLiquid.Id,
                }).ToList();

                var batchingNameList = batchingList.Select(x => x.Batching_Name).ToList();

                var batchingListrDb = _db.Queryable<BPA_Batching>().Where(x => batchingNameList.Contains(x.Batching_Name))
                    .ToList();

                //替换
                if (isReplace)
                {

                    foreach (var item2 in batchingList)
                    {
                        var thisitem = batchingListrDb.FirstOrDefault(x => x.Batching_Name == item2.Batching_Name);
                        if (thisitem != null)
                        {
                            item2.Id = thisitem.Id;
                            item2.GroupId = thisitem.GroupId;
                            item2.CreateBy = string.IsNullOrEmpty(item2.CreateBy) ? "" : item2.CreateBy;
                            _db.Updateable(item2).ExecuteCommand();
                        }
                        else
                        {
                            _db.Insertable(item2).CallEntityMethod(m => m.Create()).ExecuteCommand();
                        }
                    }
                }
                else
                {
                    var batchingListrDbName = batchingListrDb.Select(x => x.Batching_Name).ToList();
                    batchingList = batchingList.Where(x => !batchingListrDbName.Contains(x.Batching_Name)).ToList();
                    await _db.Insertable(batchingList).ExecuteCommandAsync();
                }

                #endregion


                //添加 商品_基础信息
                #region 添加 商品_基础信息

                //1.查询大分类 和小分类
                var type = new BPA_GoodsType();
                var parentType = await _db.Queryable<BPA_GoodsType>()
                    .Where(x => x.Name == "默认分类" && x.GroupId == x.GroupId).FirstAsync();
                if (parentType == null)
                {
                    parentType = new BPA_GoodsType()
                    {
                        IsDeleted = 0,
                        Name = "默认分类",
                        Remark = "",
                        Sort = 0,
                        Status = 0,
                        Pid="0"
                    };

                    type=await _db.Insertable(parentType).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync();
                    parentType = type;
                }
                //属性
                var goodsAttribute = await _db.Queryable<BPA_GoodsAttribute>()
                    .Where(x => x.AttributeName == "默认属性" ).FirstAsync();
                if (goodsAttribute == null)
                {
                    goodsAttribute = new BPA_GoodsAttribute()
                    {
                        AttributeName = "默认属性",
                        GoodsTypeId = parentType.Id,
                        IsDeleted = 0,
                        Sort = 0,

                    };
                    _db.Insertable(goodsAttribute).CallEntityMethod(m => m.Create()).ExecuteCommand();
                }

                var goodsattributevalue = await _db.Queryable<BPA_GoodsAttributeValue>()
                    .FirstAsync(x => x.AttributeValue == "默认属性值" && x.GoodsAttributeId == goodsAttribute.Id && x.IsDeleted == 0);
                if (goodsattributevalue == null)
                {
                    goodsattributevalue = new BPA_GoodsAttributeValue()
                    {
                        AttributeValue = "默认属性值",
                        GoodsAttributeId = goodsAttribute.Id,
                        IsDeleted = 0,
                        Sort = 1,
                    };
                    _db.Insertable(goodsattributevalue).CallEntityMethod(m => m.Create()).ExecuteCommand();
                }


                ReadExcel<GoodModel> readGoodModelExcel = new();
                var oodModellist = readGoodModelExcel.ExcelToList(source, mapper, "商品_基础信息");
                List<BPA_GoodsInfo> goodsInfo = new List<BPA_GoodsInfo>();
                int index = 1;
                foreach (var item in oodModellist.Where(x => !string.IsNullOrEmpty(x.Name)))
                {
                    //单位
                    var goodsUint = await _db.Queryable<BPA_GoodsUint>().Where(x => x.Name == "默认单位").FirstAsync();
                    if (goodsUint == null)
                    {
                        goodsUint = new BPA_GoodsUint()
                        {
                            IsDeleted = 0,
                            Name = "默认单位",
                            Status = 0,
                        };
                        await _db.Insertable(goodsUint).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                    }
                    Console.WriteLine("数据解析完成，开始解析图片");
                    var images = await ExcelToDatatable(file.OpenReadStream(), Path.GetExtension(file.FileName), "商品_基础信息");
                    var imagePath = images.FirstOrDefault(x => x.Index == index);
                    goodsInfo.Add(new BPA_GoodsInfo()
                    {
                        Code = GetNumber2(),
                        CreateAt = DateTime.Now,
                        CreateBy = userId,
                        DefaultMate = null,
                        Design = "默认规格",
                        ForeignKeyRe = null,
                        GoodsUintId = goodsUint.Id,
                        Descritption = "",
                       ImgMode = 0,
                       ImgUrl = imagePath?.ImgesPath,
                        Name = item.Name,
                        Sort = 0,
                        GoodsTypeId = parentType.Id,
                        Price = 0,
                        IsAttrubute = false,
                        IsDeleted = 0,
                        IsWeigh = false,
                        Key = null,
                        Status = 0,
                    });
                    index++;
                }

                var ngoodsInfoName = goodsInfo.Select(x => x.Name).ToList();
                var goodsInfoListDb = _db.Queryable<BPA_GoodsInfo>().Where(x => ngoodsInfoName.Contains(x.Name)).ToList();
                //替换
                if (isReplace)
                {

                    foreach (var item2 in goodsInfo)
                    {
                        var thisitem = goodsInfoListDb.FirstOrDefault(x => x.Name == item2.Name);

                        if (thisitem != null)
                        {
                            item2.Id = thisitem.Id;
                            item2.AutoKey = thisitem.AutoKey;
                            item2.GroupId= thisitem.GroupId;
                            _db.Updateable(item2).ExecuteCommand();
                        }
                        else
                        {
                            await _db.Insertable(item2).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                        }
                    }
                }
                else
                {
                    var goodsInfoListDbName = goodsInfoListDb.Select(x => x.Name).ToList();
                    goodsInfo = goodsInfo.Where(x => !goodsInfoListDbName.Contains(x.Name)).ToList();
                    await _db.Insertable(goodsInfo).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                }




                #endregion

                //添加设备商品仓位
                #region 添加设备商品仓位

                ReadExcel<DeviceGoodsPositionModel> deviceGoodsPositionModelExcel = new();
                var deviceGoodsPosition = deviceGoodsPositionModelExcel.ExcelToList(source, mapper, "设备物料仓位");

                var _deviceNames = deviceGoodsPosition.Select(x => x.DeviceName).ToList();
                var _goodsName = deviceGoodsPosition.Select(x => x.GoodsName).Distinct().ToList();

                var _deviceList = _db.Queryable<BPA_DeviceInfo>()
                    .Where(x => _deviceNames.Contains(x.DeviceName))
                    .ToList();

                var _goodsNameList = _db.Queryable<BPA_GoodsInfo>()
                    .Where(x => _goodsName.Contains(x.Name))
                    .ToList();

                var deviceGoodsPositionList = new List<BPA_DeviceGoodsPosition>();

                foreach (var item in deviceGoodsPosition)
                {
                    var thisDevice = _deviceList.FirstOrDefault(x => x.DeviceName == item.DeviceName);
                    var thisGoods = _goodsNameList.FirstOrDefault(x => x.Name == item.GoodsName);

                    deviceGoodsPositionList.Add(new BPA_DeviceGoodsPosition()
                    {
                        DeviceId = thisDevice?.Id,
                        GoodsId = thisGoods?.Id,
                        Id = Guid.NewGuid().ToString(),
                        Position1 = item.Position1,
                        Position2 = item.Position2,
                        Position3 = item.Position3,
                        Position4 = item.Position4,
                    });
                }

                var deviceGoodsPositionListDb = _db.Queryable<BPA_DeviceGoodsPosition>().ToList();
                foreach (var item in deviceGoodsPositionList)
                {
                    var dGPDb = deviceGoodsPositionListDb.FirstOrDefault(x => x.DeviceId == item.DeviceId && x.GoodsId == x.GoodsId);
                    if (dGPDb != null)
                    {
                        item.Id = dGPDb.Id;
                        await _db.Updateable(item).ExecuteCommandAsync();
                    }
                    else
                    {
                        await _db.Insertable(item).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                    }

                }

                #endregion


                //添加 功能_{商品名称}
                var tableName = ExcelToShtteName(file.OpenReadStream(), Path.GetExtension(file.FileName));

                #region 添加 工艺_{商品名称}

                foreach (var name in tableName)
                {
                    var nameList = name.Split('_');

                    //查询设备
                    var name1 = nameList[1];
                    var name2 = nameList[2];
                    var device = await _db.Queryable<BPA_DeviceInfo>().FirstAsync(x => x.DeviceName == name1 && x.IsDeleted == 0);
                    if (device == null)
                    {
                        throw Oops.Oh(nameList + " 设备【" + nameList[1] + "】不存在");
                    }

                    ReadExcel<GoodTechnologyModel> goodTechnologyModelExcel = new();
                    var goodTechnologyModel = goodTechnologyModelExcel.ExcelToList(source, mapper, name);
                    var goodstechnologyactionDto = new List<GoodsTechnologyActionDto>();
                    var cName = "";
                    var info = new List<ActionJson>();
                    var namestr = nameList[2];
                    var goods = await _db.Queryable<BPA_GoodsInfo>().Where(x => x.Name == namestr).FirstAsync();
                    var goodsId = goods == null ? "" : goods.Id;
                    _db.Deleteable<BPA_GoodsTechnologyAction>().Where(x => x.GoodsId == goodsId).ExecuteCommand();
                    var goodTechnologyIndex = 0;
                    for (int i = 0; i < goodTechnologyModel.Count; i++)
                    {

                        var thisName = goodTechnologyModel[i].Name == null ? cName : goodTechnologyModel[i].Name;

                        var data = await _db.Queryable<BPA_Technology>()
                            .Where(x => x.Name == thisName  && x.DeviceVersionId == device.ProductVersionId).FirstAsync();
                        if (data == null) throw Oops.Oh("该设备还没有设置工艺基础信息");
                        var data2 = await _db.Queryable<BPA_TechnologyAction>()
                           .Where(x => x.ActionName == goodTechnologyModel[i].Configuration && x.TechnologyId == data.Id).FirstAsync();
                        var batching = new BPA_Batching();
                        var IsBatch = goodTechnologyModel[i].Name != "液体料";

                        if (!string.IsNullOrEmpty(goodTechnologyModel[i].Name))
                        {

                            goodTechnologyIndex++;
                            cName = goodTechnologyModel[i].Name;
                            GoodsTechnologyActionDto item = new GoodsTechnologyActionDto()
                            {
                                ActionJson = "",
                                ChnologyId = data?.Id,
                                GoodsAttributeId = goodsattributevalue.Id,
                                GoodsId = goods?.Id,
                                IsBatch = IsBatch,
                                IsDeleted = 0,
                                Sort = goodTechnologyIndex,
                                DeviceId = device?.Id,
                                StepName = goodTechnologyModel[i].Name,
                                Index = goodTechnologyIndex.ToString(),

                            };
                            info.Add(new ActionJson
                            {
                                chnologyId = data?.Id,
                                actionName = goodTechnologyModel[i].Configuration,
                                actionValue = goodTechnologyModel[i].Value,
                                technologyactionId = !IsBatch ? batching.Id : data2?.Id,
                                index = goodTechnologyIndex.ToString(),
                            });
                            goodstechnologyactionDto.Add(item);
                        }
                        else
                        {
                            info.Add(new ActionJson
                            {
                                chnologyId = data?.Id,
                                actionName = goodTechnologyModel[i].Configuration,
                                actionValue = goodTechnologyModel[i].Value,
                                technologyactionId = !IsBatch ? batching.Id : data2?.Id,
                                index = goodTechnologyIndex.ToString(),
                            }); ;
                        }
                    }
                    foreach (var thisItem in goodstechnologyactionDto)
                    {

                        var json = info.Where(x => x.chnologyId == thisItem.ChnologyId && x.index == thisItem.Index).ToList();

                        //if (thisItem.StepName == "液体料")
                        //{
                        //    foreach (var item in json)
                        //    {
                        //        var batching = await _db.Queryable<BPA_Batching>()
                        //            .FirstAsync(x => x.Batching_Name == item.actionName);
                        //        item.technologyactionId = batching?.Id;
                        //    }
                        //}
                        if (thisItem.StepName == "主料")
                        {
                            var v1 = json.FirstOrDefault(x => x.actionName == "主料名称");
                            var v2 = deviceGoodsPosition.FirstOrDefault(x => x.GoodsName == name2 && x.DeviceName == name1);
                            var jsondb = await _db.Queryable<BPA_TechnologyAction>()
                                .Where(x => x.TechnologyId == thisItem.ChnologyId)
                                .ToListAsync();

                            foreach (var item in from item in jsondb let insertableJsondb = json.FirstOrDefault(x => x.technologyactionId == item.Id) where insertableJsondb == null select item)
                            {
                                json.Add(new ActionJson()
                                {
                                    actionName = item.ActionName,
                                    actionValue = item.ActionName == "主料重量" ? "0" : item.ActionValue,
                                    chnologyId = item.TechnologyId,
                                    index = thisItem.Index,
                                    technologyactionId = item.Id

                                });
                            }

                            foreach (var thisitem2 in json)
                            {

                                if (thisitem2.actionName == "主料位置")
                                {
                                    if (v2 == null)
                                    {
                                        throw Oops.Oh(v1.actionValue + "物料没有确定位置");
                                    }

                                    thisitem2.actionValue = GetPositionMaterial(v2, v1.actionValue);
                                    if (string.IsNullOrEmpty(thisitem2.actionValue))
                                    {
                                        throw Oops.Oh(v1.actionValue + "物料没有确定位置");
                                    }

                                }
                            }
                        }

                        thisItem.ActionJson = JsonConvert.SerializeObject(json);
                    }

                    var insertableDta = goodstechnologyactionDto.Adapt<List<BPA_GoodsTechnologyAction>>();
                    await _db.Insertable(insertableDta).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
                }

                #endregion


                _db.Ado.CommitTran();
                return true;
            }
            catch (Exception e)
            {
                _db.Ado.RollbackTran();
                throw Oops.Oh("导入失败，失败信息：" + e.Message);
            }
        }
        /// <summary>
        /// 获取 物料仓位
        /// </summary>
        /// <returns></returns>
        private string GetPositionMaterial(DeviceGoodsPositionModel item, string goodsName)
        {

            var properties = item.GetType().GetProperties();
            foreach (var item2 in properties)
            {
                var value = item.GetType().GetProperty(item2.Name)?.GetValue(item);
                if (value == null)
                {
                    value = "";
                }
                if (value.ToString().Trim() == goodsName?.Trim())
                {
                    //ColumnAttribute attribute = (ColumnAttribute)item2.GetCustomAttribute(typeof(ColumnAttribute), false);
                    //return attribute?.Name;
                    if (item2.IsDefined(typeof(Npoi.Mapper.Attributes.ColumnAttribute), false))
                    {
                        Npoi.Mapper.Attributes.ColumnAttribute attribute = (Npoi.Mapper.Attributes.ColumnAttribute)item2.GetCustomAttribute(typeof(Npoi.Mapper.Attributes.ColumnAttribute), false);
                        return attribute.Name;
                    }
                }
            }
            return "";
        }
        /// <summary>
        /// 导出 设备工艺流程
        /// </summary>
        /// <returns></returns>
        public async Task<string> TechnologyTemplateExport(string deviceId)
        {
            var result = "";

            //查询设备
            var device = await _db.Queryable<BPA_DeviceInfo>().FirstAsync(x => x.Id == deviceId);

            //设备类型
            var dictData = await _db.Queryable<BPA_TechnologyExportRecode>().FirstAsync(x => x.DeviceVersionId == device.ProductVersionId);

            return dictData?.TemplatePath ?? "";
        }
        /// <summary>
        /// 设备 版本 工序模型导入
        /// </summary>
        /// <returns></returns>
        public async Task<bool> DeviceVersionTemplateImport(DeviceVersionTemplateImportInputDto inputDto)
        {
            var file = inputDto.file;
            try
            {
                _db.Ado.BeginTran();

                //if (inputDto.IsAddGoodsTemplate)
                //{
                    
                //}
                //else
                //{
                   
                    var source = file.OpenReadStream();
                    var mapper = new Mapper(source);
                    var deviceVersion = await _db.Queryable<BPA_ProductVesion>().FirstAsync(x => x.ProductId == inputDto.DeviceClientType && x.Vesion == inputDto.Version);
                    //添加 设备_烹饪工序模型
                    #region  添加 设备_烹饪工序模型
                    ReadExcel<GoodstechnologyModel> readGoodstechnologyExcel = new();
                    var GoodstechnologyModellist = readGoodstechnologyExcel.ExcelToList(source, mapper);
                    List<BPA_Technology> GoodsTechnologyList = new();
                    List<BPA_TechnologyAction> GoodsTechnologyActionList = new();
                    var GoodsTechnologyListDB = await _db.Queryable<BPA_Technology>()
                        .Where(x => x.DeviceVersionId == deviceVersion.Id).ToListAsync();
                    string currennaid = "";
                    string currennaname = "";
                    for (int i = 0; i < GoodstechnologyModellist.Count; i++)
                    {
                        var goodsTechnologyId = GoodsTechnologyListDB.FirstOrDefault(x => x.Name == GoodstechnologyModellist[i].Name);

                        if (!string.IsNullOrWhiteSpace(GoodstechnologyModellist[i].Name))
                        {

                            BPA_Technology item = new BPA_Technology()
                            {
                                Id = goodsTechnologyId == null ? Guid.NewGuid().ToString() : goodsTechnologyId.Id,
                                Name = GoodstechnologyModellist[i].Name,
                                DeviceVersionId = deviceVersion.Id
                            };
                            GoodsTechnologyList.Add(item);
                            currennaid = item.Id;
                            currennaname = item.Name;
                        }
                        var actvalueary = GoodstechnologyModellist[i].ActionValue?.Split('、');
                        if (string.IsNullOrEmpty(GoodstechnologyModellist[i].ActionType) && currennaname != "液体料")
                        {
                            throw Oops.Oh($"类型错误");
                        }
                        BPA_TechnologyAction technologyAction = new()
                        {
                            Id = Guid.NewGuid().ToString(),
                            TechnologyId = currennaid,
                            ActionName = GoodstechnologyModellist[i].ActionName,
                            ActionType = CharacterConversion(GoodstechnologyModellist[i].ActionType),
                            Sort = i,
                            TechnologyType = GoodstechnologyModellist[i].TechnologyType == "物料" ? TechnologyEnums.Batch : TechnologyEnums.Other,
                            CreateAt = DateTime.Now,
                            //ActionValue = GoodstechnologyModellist[i].ActionValue,
                        };
                        List<ActionValueModel> ActionValueModelList = new();
                        if (actvalueary != null)
                        {
                            foreach (var item in actvalueary)
                            {
                                ActionValueModelList.Add(new ActionValueModel() { actionValueName = item });
                            }
                            technologyAction.ActionValue = JsonConvert.SerializeObject(ActionValueModelList);
                        }
                        GoodsTechnologyActionList.Add(technologyAction);
                    }

                    //修改添加 主表
                    foreach (var item in GoodsTechnologyList)
                    {
                        var thisitem = GoodsTechnologyListDB.FirstOrDefault(x => x.Name == item.Name);

                        if (thisitem != null)
                        {
                            item.Id = thisitem.Id;
                            item.CreateAt = DateTime.Now;
                            _db.Updateable(item).ExecuteCommand();
                        }
                        else
                        {
                            //item.Id = Guid.NewGuid().ToString();
                            item.CreateAt = DateTime.Now;
                            await _db.Insertable(item).ExecuteCommandAsync();
                        }
                    }

                    //修改添从表
                    GoodsTechnologyActionList = GoodsTechnologyActionList.Where(x => !string.IsNullOrEmpty(x.ActionName)).ToList();
                    var goodstechnologyIds = GoodsTechnologyList.Select(x => x.Id).ToList();
                    var GoodsTechnologyActionListDb = await _db.Queryable<BPA_TechnologyAction>()
                        .Where(x => goodstechnologyIds.Contains(x.TechnologyId)).ToListAsync();

                    foreach (var item in GoodsTechnologyActionList)
                    {
                        var thisitem = GoodsTechnologyActionListDb.FirstOrDefault(x => item.TechnologyId == x.TechnologyId && item.ActionName == x.ActionName);
                        if (thisitem != null)
                        {
                            item.Id = thisitem.Id;
                            item.CreateAt = DateTime.Now;
                            _db.Updateable(item).ExecuteCommand();
                        }
                        else
                        {
                            item.Id = Guid.NewGuid().ToString();
                            item.CreateAt= DateTime.Now;
                            await _db.Insertable(item).ExecuteCommandAsync();
                        }
                    }
                #endregion
                var path = await _SystemConfigService.GetCosImgesURL(file);
                var TechnologyExportRecode = _db.Queryable<BPA_TechnologyExportRecode>().Where(x=>x.DeviceVersionId == inputDto.Id).First();
                    if (TechnologyExportRecode != null)
                    {
                        TechnologyExportRecode.CreateAt= DateTime.Now;
                    TechnologyExportRecode.TemplatePath = path;
                  var vvv=  await _db.Updateable(TechnologyExportRecode).ExecuteCommandAsync();
                    }
                    else
                    {
                  
                    BPA_TechnologyExportRecode _TechnologyExportRecode = new();
                        _TechnologyExportRecode.Id = Guid.NewGuid().ToString();
                        _TechnologyExportRecode.CreateAt = DateTime.Now;
                        _TechnologyExportRecode.ProductId = inputDto.DeviceClientType;
                        _TechnologyExportRecode.DeviceVersionId = inputDto.Id;
                        _TechnologyExportRecode.TemplatePath= path;
                        await _db.Insertable(_TechnologyExportRecode).ExecuteCommandAsync();
                   
                    //await _db.Updateable<BPA_TechnologyExportRecode>()
                    //    .SetColumns(it => it.TemplatePath == path)
                    //    .Where(it => it.Id == inputDto.Id)
                    //    .ExecuteCommandAsync();
                }
                    
                //}
                _db.Ado.CommitTran();
            }
            catch (Exception e)
            {
                _db.Ado.RollbackTran();
                throw Oops.Oh($"Excel导入错误，" + e.Message);
            }
            return true;
        }

        public string GetValueStr(string str)
        {
            try
            {
                var obj = JsonConvert.DeserializeObject<List<ActionValueJsonDto>>(str);
                var result = String.Join(",", obj.Select(x => x.ActionValueName).ToArray());
                return result;
            }
            catch (Exception e)
            {
                return "";
            }
        }
        public string CharacterConversion(string str)
        {
            switch (str)
            {
                case "下拉框":
                    return "select";
                case "数字输入框":
                    return "digit";
                case "文本框":
                    return "text";
                case "开关":
                    return "switch";
                case "文字域":
                    return "textarea";
                default:
                    break;
            }

            return "";
        }
        /// <summary>
        /// 设置excel的下拉框
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="col"></param>
        /// <param name="selectData"></param>
        private void SetExcelSelect(ISheet sheet, List<string> selectData, int firstRow, int lastRow, int firstCol, int lastCol)
        {
            var count = selectData.Sum(item => item.Count());


            if (count > 180)
            {
                return;
            }
            //设置生成下拉框的行和列
            var cellRegions = new CellRangeAddressList(1, 65535, firstCol, lastCol);
            //设置 下拉框内容
            DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(selectData.ToArray());
            //绑定下拉框和作用区域，并设置错误提示信息
            HSSFDataValidation dataValidate = new HSSFDataValidation(cellRegions, constraint);
            dataValidate.CreateErrorBox("输入不合法", "请输入或选择下拉列表中的值。");
            dataValidate.ShowPromptBox = true;
            sheet.AddValidationData(dataValidate);
        }

        /// <summary>   
        /// 将 Stream 写入文件   
        /// </summary>   
        private void StreamToFile(byte[] bytes, string filepath)
        {
            // 把 byte[] 写入文件   
            FileStream fs = new FileStream(filepath, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(bytes);
            bw.Close();
            fs.Close();
        }
        /// <summary>
        /// 获取 shtte name
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileType"></param>
        /// <param name="strMsg"></param>
        /// <param name="sheetName"></param>
        /// <returns></returns>
        private List<string> ExcelToShtteName(Stream stream, string fileType, bool isGY = true)
        {

            var result = new List<string>();
            ISheet sheet = null;
            IWorkbook workbook = null;
            var shellCount = 0;
            try
            {
                #region 判断excel版本
                //2007以上版本excel
                if (fileType == ".xlsx")
                {
                    workbook = new XSSFWorkbook(stream);
                    shellCount = ((XSSFWorkbook)workbook).Count;
                }
                //2007以下版本excel
                else if (fileType == ".xls")
                {
                    workbook = new HSSFWorkbook(stream);
                    shellCount = ((HSSFWorkbook)workbook).Count;
                }
                else
                {
                    throw Oops.Oh($"传入的不是Excel文件");
                }
                #endregion

                for (int sheetI = 0; sheetI < shellCount; sheetI++)
                {
                    sheet = workbook.GetSheetAt(sheetI);

                    if (isGY)
                    {
                        if (sheet.SheetName.Contains("工艺"))
                        {
                            result.Add(sheet.SheetName);
                        }
                    }
                    else
                    {
                        result.Add(sheet.SheetName);
                    }

                }
            }
            catch (Exception ex)
            {
                throw Oops.Oh($"Excel操作错误" + ex.Message);
            }
            return result;
        }
        /// <summary>
        /// 将Excel单表转为Datatable
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileType"></param>
        /// <param name="strMsg"></param>
        /// <param name="sheetName"></param>
        /// <returns></returns>
        public async Task<List<ExcelDtoImagDto>> ExcelToDatatable(Stream stream, string fileType, string sheetName = null)
        {
            var result = new List<ExcelDtoImagDto>();
            ISheet sheet = null;
            IWorkbook workbook = null;

            try
            {
                #region 判断excel版本
                //2007以上版本excel
                if (fileType == ".xlsx")
                {
                    workbook = new XSSFWorkbook(stream);
                }
                //2007以下版本excel
                else if (fileType == ".xls")
                {
                    workbook = new HSSFWorkbook(stream);
                }
                else
                {
                    throw new Exception("传入的不是Excel文件！");
                }
                #endregion
                Console.WriteLine("已确定解析格式，开始解析");
                if (workbook == null)
                {
                    Console.WriteLine("已确定解析格式，工具");
                }

                IList pictures = workbook.GetAllPictures();
                Console.WriteLine("已确定解析格式，成功解析" + JsonConvert.SerializeObject(pictures));
                int i = 1;
                foreach (XSSFPictureData pic in pictures)
                {
                    Console.WriteLine("讲数据流转化为图片");
                    Image jpg1 = Image.FromStream(new MemoryStream(pic.Data));//从pic.Data数据流创建图片
                    Console.WriteLine("转化成功");
                    var imagePath = await GetCosImgesURL(PhotoImageInsert(jpg1));
                    Console.WriteLine("图片路径" + imagePath);
                    result.Add(new ExcelDtoImagDto()
                    {
                        ImgesPath = imagePath,
                        Index = i
                    });
                    i++;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return result;
        }

        //将Image转换成流数据，并保存为byte[] 
        public byte[] PhotoImageInsert(Image imgPhoto)
        {
            MemoryStream mstream = new MemoryStream();
            imgPhoto.Save(mstream, ImageFormat.Bmp);
            byte[] byData = new Byte[mstream.Length];
            mstream.Position = 0;
            mstream.Read(byData, 0, byData.Length); mstream.Close();
            return byData;
        }
        public async Task<string> GetCosImgesURL(byte[] data)
        {
            var result = "";
            TransferUploadObjectModel m = new TransferUploadObjectModel(_db);
            /// 高级接口上传对象
            result = await m.TransferUploadFile(new FileInputInfoDto()
            {
                Directory = "goods",
                FileExtension = "png",
                Method = "PUT",
            }, data);
            return result;
        }
       
        private  string GetNumber2(int Length = 10)
        {
            byte[] buffer = Guid.NewGuid().ToByteArray();
            var ram = BitConverter.ToInt64(buffer, 0);
            var str = string.Format("{0}", ram.ToString().Substring(0, Length));
            return str;
        }
    }
}
