快乐的昕的电脑
9 天以前 f92369eeb7587ce03ae5bb09d74524fe6fb0f3e1
MES.Service/service/BasicData/MesItemsManager.cs
@@ -1,10 +1,14 @@
using MES.Service.DB;
using AngleSharp.Dom;
using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SharpCompress.Common;
using SqlSugar;
namespace MES.Service.service.BasicData;
/// <summary>
/// 物料信息
/// </summary>
public class MesItemsManager : Repository<MesItems>
{
    public bool Save(ErpItems item)
@@ -113,16 +117,23 @@
    private MesItems GetMesItems(ErpItems item)
    {
        return new MesItems
        // 查找是否已存在相同客户编码的记录。ID、create_date
        var existingCustomer = Db.Queryable<MesItems>()
            .Where(s => s.ItemNo == item.FNumber)
            .First();
        var entity = new MesItems
        {
            Id = Convert.ToDecimal(item.Id),
            EItemId = long.Parse(item.Id),
            ItemId = long.Parse(item.Id),
            // 如果存在,使用现有的ID,后续将删除后重新插入
            // 如果不存在,设为0,InsertOrUpdate方法将生成新ID
            Id = existingCustomer?.Id ?? 0,
            EItemId = existingCustomer?.Id ?? 0,
            ItemId = existingCustomer?.Id ?? 0,
            Type = item.Type,
            ItemNo = item.FNumber,
            ItemName = item.FName,
            ItemModel = item.FSpecification,
            ItemUnit = item.FBaseUnitId,
            ItemUnit = item.FBaseUnitId,//物料基本单位编码转ID
            Lowlimit = Convert.ToDouble(item.FSafeStock),
            Highlimit = Convert.ToDouble(item.FMaxStock),
            PrdPack = Convert.ToDouble(item.FMinPackCount),
@@ -131,29 +142,249 @@
            Remarks = item.FDescription,
            Ffinishreceiptoverrate =
                Convert.ToDecimal(item.FFinishReceiptOverRate),
            Fissuetype = item.FIssueType,
            Fisbatchmanage = Convert.ToInt32(item.FIsBatchManage),
            //发料方式
            Fissuetype = item.FIssueType switch
            {
                "1" => "逐批领料",
                "2" => "自动扣料",
                _ => item.FIssueType
            },
            //Fissuetype = item.FIssueType,
            //批号管理
            Fisbatchmanage = item.FIsBatchManage switch
            {
                var v when string.Equals(v, "N", StringComparison.OrdinalIgnoreCase) => 0,
                var v when string.Equals(v, "Y", StringComparison.OrdinalIgnoreCase) => 1,
                var v when string.Equals(v, "W", StringComparison.OrdinalIgnoreCase) => 2,
                var v when string.Equals(v, "T", StringComparison.OrdinalIgnoreCase) => 3,
                _ => int.TryParse(item.FIsBatchManage, out var val) ? val : 0
            },
            Fpurchaserid = item.FPurchaserId,
            Fpurchaseunitid = Convert.ToDecimal(item.FPurchaseUnitId),
            Fpurchaseunitid = item.FPurchaseUnitId,
            Storeunit = item.FStoreUnitID,
            Saleunit = item.FSaleUnitId,
            Fforbidstatus = item.FForbidStatus,
            Fforbidstatus = item.FForbidStatus,//启用与禁用
            MaterialProperti = item.FErpClsID,
            ProductionWorkshop = item.FWorkShopId,
            ProduceUnit = item.FPRODUCEUNITID,
            SubconUnit = item.FSUBCONUNITID,
            FSubsidiary = item.FUseOrgId,
            Fumbrella = item.FCreateOrgId,
            //FSubsidiary = item.FUseOrgId,
            //Fumbrella = item.FCreateOrgId,
            LastupdateDate = DateTime.Now,
            CreateDate = DateTime.Now,
            // 如果存在,使用现有的CreateDate,后续将删除后重新插入
            // 如果不存在,设为当前时间
            CreateDate = existingCustomer?.CreateDate ?? DateTime.Now,
            MnemonicCode = item.FMnemonicCode,
            Company = "1000",
            Factory = "1000"
            Factory = "1000",
            InspectionMethod= item.Inspectionmethod,
            ExpirationDate= item.Expirationdate,
            ReviewPeriod= item.Reviewperiod,
            LeadDays= item.FLeadDays,
            Remark5 = item.FRemark5,
            FSubsidiary = string.IsNullOrEmpty(item.FUseOrgId) ? "1" : item.FUseOrgId,
            Fumbrella = string.IsNullOrEmpty(item.FCreateOrgId) ? "1" : item.FCreateOrgId,
        };
        //物料基本单位编码转ID,ItemUnit = item.FBaseUnitId
        var entityItemUnit = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FBaseUnitId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityItemUnit))
        {
            entity.ItemUnit = entityItemUnit;
        }
        else if (!string.IsNullOrWhiteSpace(item.FBaseUnitId))
        {
            entity.ItemUnit = item.FBaseUnitId;
        }
        else
        {
            entity.ItemUnit = "0";
        }
        //物料销售单位编码转ID,Saleunit = item.FSaleUnitId
        var entitySaleunit = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FSaleUnitId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entitySaleunit))
        {
            entity.Saleunit = entitySaleunit;
        }
        else if (!string.IsNullOrWhiteSpace(item.FSaleUnitId))
        {
            entity.Saleunit = item.FSaleUnitId;
        }
        else
        {
            entity.Saleunit = "0";
        }
        //物料库房单位编码转ID,Storeunit = item.FStoreUnitID
        var entityStoreunit = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FStoreUnitID)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityStoreunit))
        {
            entity.Storeunit = entityStoreunit;
        }
        else if (!string.IsNullOrWhiteSpace(item.FStoreUnitID))
        {
            entity.Storeunit = item.FStoreUnitID;
        }
        else
        {
            entity.Storeunit = "0";
        }
        //物料采购单位编码转ID,Fpurchaseunitid = item.FPurchaseUnitId
        var entityFpurchaseunitid = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FPurchaseUnitId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityFpurchaseunitid))
        {
            entity.Fpurchaseunitid = entityFpurchaseunitid;
        }
        else if (!string.IsNullOrWhiteSpace(item.FPurchaseUnitId))
        {
            entity.Fpurchaseunitid = item.FPurchaseUnitId;
        }
        else
        {
            entity.Fpurchaseunitid = "0";
        }
        //物料生产单位编码转ID,ProduceUnit = item.FPRODUCEUNITID
        var entityProduceUnit = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FPRODUCEUNITID)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityProduceUnit))
        {
            entity.ProduceUnit = entityProduceUnit;
        }
        else if (!string.IsNullOrWhiteSpace(item.FPRODUCEUNITID))
        {
            entity.ProduceUnit = item.FPRODUCEUNITID;
        }
        else
        {
            entity.ProduceUnit = "0";
        }
        //物料委外单位编码转ID,SubconUnit = item.FSUBCONUNITID
        var entitySubconUnit = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == item.FSUBCONUNITID)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entitySubconUnit))
        {
            entity.SubconUnit = entitySubconUnit;
        }
        else if (!string.IsNullOrWhiteSpace(item.FSUBCONUNITID))
        {
            entity.SubconUnit = item.FSUBCONUNITID;
        }
        else
        {
            entity.SubconUnit = "0";
        }
        //默认仓库编码转ID,DepotCode = item.FStockId,
        var entityDepotCode = Db.Queryable<MesDepots>()
        .Where(x => x.DepotCode == item.FStockId)
        .Select(x => x.DepotId.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityDepotCode))
        {
            entity.DepotCode = entityDepotCode;
        }
        else if (!string.IsNullOrWhiteSpace(item.FStockId))
        {
            entity.DepotCode = item.FStockId;
        }
        else
        {
            entity.DepotCode = "0";
        }
        //采购员编码转ID,Fpurchaserid = item.FPurchaserId,
        var entityFpurchaserid = Db.Queryable<MesStaff>()
        .Where(x => x.StaffNo == item.FPurchaserId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityFpurchaserid))
        {
            entity.Fpurchaserid = entityFpurchaserid;
        }
        else if (!string.IsNullOrWhiteSpace(item.FPurchaserId))
        {
            entity.Fpurchaserid = item.FPurchaserId;
        }
        else
        {
            entity.Fpurchaserid = "0";
        }
        //工作中心编码转ID,ProductionWorkshop = item.FWorkShopId,
        var entityProductionWorkshop = Db.Queryable<SysDepartment>()
        .Where(x => x.WorkshopCenterCode == item.FWorkShopId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityProductionWorkshop))
        {
            entity.ProductionWorkshop = entityProductionWorkshop;
        }
        else if (!string.IsNullOrWhiteSpace(item.FWorkShopId))
        {
            entity.ProductionWorkshop = item.FWorkShopId;
        }
        else
        {
            entity.ProductionWorkshop = "0";
        }
        //// ERP: Y=未禁用, N=禁用
        //// MES: A=未禁用, B=禁用
        //if (string.IsNullOrEmpty(item.FForbidStatus))
        //{
        //    entity.Fforbidstatus = "A";
        //}
        //else
        //{
        //    //我期望的值是A=启用,B=禁用
        //    //实际给我的值是Y或N,我希望为我转换从A和B的方式
        //    entity.Fforbidstatus = item.FForbidStatus == "N" ? "B" : "A";
        //}
        return entity;
    }
    private bool UpdateItemStatusBatch(SqlSugarScope db,
        List<MesItems> itemList, string status)
    /// <summary>
    /// 生成新的ID,确保不重复
    /// </summary>
    private decimal GenerateNewId()
    {
        // 处理空表的情况,从1开始
        var maxId = Db.Queryable<MesItems>().Max(x => (decimal?)x.Id) ?? 0;
        var newId = maxId + 1;
        // 双重检查,确保生成的ID不存在
        while (Db.Queryable<MesItems>().Where(x => x.Id == newId).Any())
        {
            newId++;
        }
        return newId;
    }
    private bool UpdateItemStatusBatch(SqlSugarScope db,List<MesItems> itemList, string status)
    {
        var ids = itemList.Select(it => it.Id).ToArray();
        var result = db.Updateable<MesItems>()
@@ -186,15 +417,54 @@
        throw new NotImplementedException("删除失败");
    }
    /// <summary>
    /// 同步物料信息new_0/4
    /// </summary>
    /// <param name="db"></param>
    /// <param name="entity"></param>
    /// <returns></returns>
    private bool InsertOrUpdate(SqlSugarScope db, MesItems entity)
    {
        db.Deleteable<MesItems>().Where(s => s.Id == entity.Id)
            .ExecuteCommand();
        if (entity.Id == 0)
        {
            // 新增情况:生成新ID并插入
            var newId = GenerateNewId();
            entity.Id = newId;
            entity.EItemId = newId;
            entity.ItemId = newId;
            return db.Insertable(entity).ExecuteCommand() > 0;
        }
        else
        {
            // 更新情况:删除后重新插入,保持原有ID
            var originalId = entity.Id;
        var insert = db.Insertable(entity).ExecuteCommand();
        return insert > 0;
            // 先删除原记录(如果存在)
            db.Deleteable<MesItems>().Where(s => s.Id == originalId).ExecuteCommand();
            // 重新插入,保持原有ID
            entity.Id = originalId;
            entity.EItemId = originalId;
            entity.ItemId = originalId;
            return db.Insertable(entity).ExecuteCommand() > 0;
        }
    }
    /// <summary>
    /// 同步物料信息old_0/4
    /// </summary>
    /// <param name="db"></param>
    /// <param name="entity"></param>
    /// <returns></returns>
    //private bool InsertOrUpdate(SqlSugarScope db, MesItems entity)
    //{
    //    db.Deleteable<MesItems>().Where(s => s.Id == entity.Id)
    //        .ExecuteCommand();
    //    var insert = db.Insertable(entity).ExecuteCommand();
    //    return insert > 0;
    //}
    private bool InsertOrUpdateBatch(SqlSugarScope db, List<MesItems> itemList)
    {
        return itemList.All(entity => InsertOrUpdate(db, entity));