快乐的昕的电脑
3 天以前 250d7667b3229969a6dd3bc6ebc68d828a266fe8
MES.Service/service/WomcaaManager.cs
@@ -3,9 +3,12 @@
using MES.Service.Modes;
using MES.Service.util;
using SqlSugar;
using System.Data;
namespace MES.Service.service;
/// <summary>
/// 生产订单
/// </summary>
public class WomcaaManager : Repository<Womcaa>
{
    //当前类已经继承了 Repository 增、删、查、改的方法
@@ -65,10 +68,30 @@
        if (StringUtil.CheckGuid(mesWomcaa.Guid))
            base.DeleteById(mesWomcaa.Guid);
        //if (mesWomcabs.Count > 0)
        //    db.Deleteable<Womcab>()
        //        .Where(s => s.Pid == mesWomcaa.Erpid).ExecuteCommand();
        // 在插入 mesWomcabs 之前,先删除所有 Guid 已存在的记录
        //var guids = mesWomcabs.Select(x => x.Guid).ToList();
        //if (guids.Count > 0)
        //{
        //    db.Deleteable<Womcab>().In(x => x.Guid, guids).ExecuteCommand();
        //}
        if (mesWomcabs.Count > 0)
        {
            // 先按 Pid 删除
            db.Deleteable<Womcab>()
                .Where(s => s.Pid == mesWomcaa.Erpid).ExecuteCommand();
            //    // 再按 Guid 删除,彻底避免主键冲突
            //    var guids = mesWomcabs.Select(x => x.Guid).ToList();
            //    db.Deleteable<Womcab>().In(x => x.Guid, guids).ExecuteCommand();
        }
        //// 检查 Guid 是否唯一
        //if (mesWomcabs.Select(x => x.Guid).Distinct().Count() != mesWomcabs.Count)
        //    throw new Exception("即将插入的Womcab数据中存在重复的Guid,请检查数据生成逻辑。");
        //单条插入忽略空字段
        var orUpdate = db.Insertable(mesWomcaa)
@@ -119,12 +142,17 @@
        var entity = new Womcaa
        {
            Erpid = Convert.ToInt32(dto.Id), ///     ERPID
            Caa001 = PPBOMNO, ///     单号
            Caa021 = dto.FWorkShopID, ///     工作车间
            SrcBillType = dto.FSrcBillType, ///     工单单别
            Caa001=dto.FBillNo, ///     工单单号
            //Caa001 = PPBOMNO, ///     单号
            Caa021 = dto.FWorkShopID0, ///     工作中心
            //Caa021 = dto.FWorkShopID, ///     工作车间
            RoutingId = dto.FRoutingId, ///     工艺路线
            WorkShopId = dto.FREMWorkShopId, ///     产线
            DepotCode = dto.FStockId, ///     仓库
            CreateDate = dto.FDate, ///     单据日期
            Caa004 = dto.FBILLTYPE, ///     单据类型
            Caa023 = dto.FStatus, ///     状态 完工,未完工
            Caa006 = dto.FMaterialId, ///     产品编码
@@ -144,17 +172,9 @@
            Mtono = dto.FMTONO, ///     计划跟踪号
            Lot = dto.FLot, ///     批号
            Caa013 = dto.FBomId, ///     BOM版次
            Caa015 = dto.F_UNW_Text_xsddh, ///     订单单号
            Caa015Head = dto.xsddh_type, ///     订单单别
            CreateType = dto.FCreateType, ///     生成方式
            SrcBillType = dto.FSrcBillType, ///     源单类型
            SrcBillNo = dto.FSrcBillNo, ///     源单编号
            SrcBillentryseq = dto.FSrcBillEntrySeq, ///     源单分录行号
            SaleOrderNo = dto.FSaleOrderNo, ///     需求单据号
            SaleOrderEntryseq = dto.FSaleOrderEntrySeq, ///     需求单据行号
            ForceCloserid = dto.FForceCloserId, ///     结案人
            CloseType = dto.FCloseType, ///     结案类型
            SrcSplitBillno = dto.FSrcSplitBillNo, ///     源拆分订单编号
            Caa016 = dto.FDESCRIPTION, ///     备注
            Caa018 = !string.IsNullOrEmpty(dto.PLAN_ID)
                ? Convert.ToInt32(dto.PLAN_ID)
@@ -163,11 +183,23 @@
                ? Convert.ToInt32(dto.PLAN_SEQ)
                : null, ///     ERP源单行号
            Caa020 = dto.PLAN_NUM, ///     ERP源单单号(任务单号)
            //Caa015 = dto.F_UNW_Text_xsddh, ///     销售订单号
            ForceCloserid = dto.FForceCloserId, ///     结案人
            CloseType = dto.FCloseType, ///     结案类型
            SrcSplitBillno = dto.FSrcSplitBillNo, ///     源拆分订单编号
            Caa016 = dto.FMemoItem, ///     备注
            SrcBillNo = dto.FSrcBillNo, ///     源单编号
            SrcBillentryseq = dto.FSrcBillEntrySeq, ///     源单分录行号
            SaleOrderNo = dto.FSaleOrderNo, ///     需求单据号
            SaleOrderEntryseq = dto.FSaleOrderEntrySeq, ///     需求单据行号
            CustNumber = dto.CustNumber, ///     客户编号
            ErpSczz = Convert.ToInt32(dto.FPrdOrgId), ///     生产组织ID
            ErpWtzz = Convert.ToInt32(dto.FEnTrustOrgId), ///     委托组织ID
            Btbz = dto.Btbz, ///     委托组织ID
            //Caa015Head = dto.F_XIFG_Integer_tzk, ///     销售订单行号
            //MainProductNo = dto.F_XIFG_Base_w5c, ///     主产品编码
            // MainProductQty =
            //     Convert.ToInt32(dto.F_XIFG_Qty_yrr), ///     主产品生产数量
@@ -175,12 +207,129 @@
            // PackingListNumber = dto.F_XIFG_Text_yrr, ///     包装单号
            // CustomerName = dto.F_XIFG_Text_qtr1, ///     客户名称
            // Customer = dto.F_XIFG_Base_83g1, ///     客户
            Caa0111 = dto.FPlanFinishDate, ///     预计完工时间备份
            Typea = dto.TypeA, ///     预计完工时间备份
            //Caa0111 = dto.FPlanFinishDate, ///     预计完工时间备份
            //Typea = dto.TypeA, ///     预计完工时间备份
            //Typeb = dto.TypeB ///     预计完工时间备份
            SynchronousDate = DateTime.Now,
            DocumentStatus = dto.FDocumentStatus
        };
        //工作中心编码转ID,Caa021 = dto.FWorkShopID0
        var entityCaa021 = Db.Queryable<SysDepartment>()
        .Where(x => x.Departmentcode == dto.FWorkShopID0)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityCaa021))
        {
            entity.Caa021 = entityCaa021;
        }
        else
        {
            entity.Caa021 = "0";
        }
        //仓库编码转ID,DepotCode = dto.FStockId,
        var entityDepotCode = Db.Queryable<MesDepots>()
        .Where(x => x.DepotCode == dto.FStockId)
        .Select(x => x.DepotId.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityDepotCode))
        {
            entity.DepotCode = entityDepotCode;
        }
        else
        {
            entity.DepotCode = "0";
        }
        //产品(物料)编码转ID,Caa006 = dto.FMaterialId, ///
        var entityCaa006 = Db.Queryable<MesItems>()
        .Where(x => x.ItemNo == dto.FMaterialId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityCaa006))
        {
            entity.Caa006 = entityCaa006;
        }
        else
        {
            entity.Caa006 = "0";
        }
        //单位编码转ID,Caa009 = dto.FUnitId,
        var entityCaa009 = Db.Queryable<MesUnit>()
        .Where(x => x.Fnumber == dto.FUnitId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityCaa009))
        {
            entity.Caa009 = entityCaa009;
        }
        else
        {
            entity.Caa009 = "0";
        }
        //计划员编码转ID,PlanId = dto.FPlannerID,
        var entityPlanId = Db.Queryable<MesStaff>()
        .Where(x => x.StaffNo == dto.FPlannerID)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityPlanId))
        {
            entity.PlanId = entityPlanId;
        }
        else
        {
            entity.PlanId = "0";
        }
        //结案人编码转ID,ForceCloserid = dto.FForceCloserId,
        var entityForceCloserid = Db.Queryable<MesStaff>()
        .Where(x => x.StaffNo == dto.FForceCloserId)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityForceCloserid))
        {
            entity.ForceCloserid = entityForceCloserid;
        }
        else
        {
            entity.ForceCloserid = "0";
        }
        //客户编码转ID,CustNumber = dto.CustNumber,
        var entityCustNumber = Db.Queryable<MesStaff>()
        .Where(x => x.StaffNo == dto.CustNumber)
        .Select(x => x.Id.ToString())
        .First();
        if (!string.IsNullOrWhiteSpace(entityCustNumber))
        {
            entity.CustNumber = entityCustNumber;
        }
        else
        {
            entity.CustNumber = "0";
        }
        //根据单号+单别,获取对应的id
        var singleId = Db.Queryable<Womcaa>()
            .Where(x => x.SrcBillType == dto.FSrcBillType && x.Caa001 == dto.FBillNo)
            .Select(x => x.Erpid)
            .First();
        //如果没有则生成一个新的id
        if (singleId == null || string.IsNullOrWhiteSpace(singleId.ToString()))
        {
            entity.Erpid = (int)GenerateNewId();
            //entity.Erpid = GenerateNewId().ToString();
            //rohIn.id = GenerateNewId().ToString("0");
        }
        else//如果有则使用已有的id
        {
            entity.Erpid = Convert.ToInt32(singleId);
            //entity.Erpid = singleId.ToString();
        }
        var single = base.GetSingle(it => it.Erpid == entity.Erpid);
        if (single != null) entity.Guid = single.Guid;
@@ -198,8 +347,9 @@
            {
                Erpid = Convert.ToInt32(dto.Id), /// ERPID 
                Cab001 = dto.FBillNo, /// 工单单号 
                Cab002 = Convert.ToInt32(dto.FSeq), /// 序号
                Cab003 = dto.FMaterialID, /// 材料编码
                //Cab002 = Convert.ToInt32(dto.FSeq), /// 序号
                Cab002 = Convert.ToInt32(dto.FBillNoType), /// 序号
                Cab003 = dto.FMaterialID2, /// 材料编码
                Cab006 = !string.IsNullOrEmpty(dto.FNeedQty)
                    ? Convert.ToDecimal(dto.FNeedQty)
                    : null, /// 需领用量 
@@ -214,7 +364,7 @@
                Lot = dto.FLot, /// 批号 
                DepotCode = dto.FStockID, /// 仓库 
                IssueType = dto.FIssueType, /// 发料方式 
                // Cab008 = dto.F_UNW_Text_tpgy, /// 工艺
                Cab008 = dto.F_UNW_Text_tpgy, /// 工艺
                Cab009 = dto.FUnitID, /// 单位 
                SupplyType = dto.FSupplyType, /// 供应类型(C采购 Z自制 W委外) 
                Cab012 = !string.IsNullOrEmpty(dto.FStdQty)
@@ -244,13 +394,169 @@
                // ParentItemName = dto.F_XIFG_Base_apv /// 父项物料名称 
            };
            //仓库编码转ID,DepotCode = dto.FStockID,
            var entityDepotCode = Db.Queryable<MesDepots>()
            .Where(x => x.DepotCode == dto.FStockID)
            .Select(x => x.DepotId.ToString())
            .First();
            if (!string.IsNullOrWhiteSpace(entityDepotCode))
            {
                womcab.DepotCode = entityDepotCode;
            }
            else
            {
                womcab.DepotCode = "0";
            }
            //单位编码转ID,Cab009 = dto.FUnitID,
            var entityCab009 = Db.Queryable<MesUnit>()
            .Where(x => x.Fnumber == dto.FUnitID)
            .Select(x => x.Id.ToString())
            .First();
            if (!string.IsNullOrWhiteSpace(entityCab009))
            {
                womcab.Cab009 = entityCab009;
            }
            else
            {
                womcab.Cab009 = "0";
            }
            //根据单号+单别+材料品号,获取对应的id
            var singleId = Db.Queryable<Womcab>()
            .Where(x => x.Cab001 == dto.FBillNo && x.Cab003 == dto.FMaterialID2 && x.Cab002 == Convert.ToInt32(dto.FBillNoType))
            .Select(x => x.Erpid)
            .First();
            if (singleId == null)//如果没有则生成一个新的id
            {
                //entity.EbelnK3id = GenerateNewId2().ToString();
                womcab.Erpid = (int)GenerateNewId2();
            }
            else//如果有则使用已有的id
            {
                //entity.EbelnK3id = singleId.EbelnK3id;
                womcab.Erpid = singleId;
            }
            var entity = Db.Queryable<Womcab>()
                .Where(s => s.Eid == womcab.Eid).Single();
            if (entity != null) womcab.Guid = entity.Guid;
                .Where(s => s.Cab001 == womcab.Cab001 && s.Cab002 == womcab.Cab002 && s.Cab003 == womcab.Cab003)
                .Single();
            if (entity != null)
                womcab.Guid = entity.Guid;
            else
                womcab.Guid = Guid.NewGuid(); // 确保每条新数据唯一
            womcabList.Add(womcab);
        }
        return womcabList;
    }
    ///// <summary>
    ///// 生成新的主表ID,确保不重复
    ///// </summary>
    //private decimal GenerateNewId()
    //{
    //    // 处理空表的情况,从1开始
    //    var maxId = Db.Queryable<Womcaa>().Max(x => (decimal?)x.Erpid) ?? 0;
    //    var newId = maxId + 1;
    //    // 双重检查,确保生成的ID不存在
    //    while (Db.Queryable<Womcaa>().Where(x => x.Erpid == newId).Any())
    //    {
    //        newId++;
    //    }
    //    return newId;
    //}
    /// <summary>
    /// 生成新的主表ID,通过数据库序列获取唯一ID
    /// </summary>
    private decimal GenerateNewId()
    {
        try
        {
            // 替换为:
            var sequenceValueObj = Db.Ado.GetScalar("SELECT NEXT VALUE FOR MES_WOMCAB_IN_seq");
            var sequenceValue = Convert.ToDecimal(sequenceValueObj);
            // 验证序列值是否有效
            if (sequenceValue <= 0)
            {
                throw new InvalidOperationException($"数据库序列 MES_WOMCAB_IN_seq 返回了无效的值: {sequenceValue}");
            }
            return sequenceValue;
        }
        catch (Exception ex)
        {
            // 记录异常信息
            Console.WriteLine($"调用数据库序列 MES_WOMCAB_IN_seq 失败: {ex.Message}");
            // 向上层抛出明确的异常信息
            throw new InvalidOperationException($"生成子表ID失败,无法获取数据库序列值: {ex.Message}", ex);
        }
    }
    /// <summary>
    /// 生成新的子表ID,通过数据库序列获取唯一ID
    /// </summary>
    private decimal GenerateNewId2()
    {
        try
        {
            // 替换为:
            var sequenceValueObj = Db.Ado.GetScalar("SELECT NEXT VALUE FOR MES_WOMCAB_IN_DATA_seq");
            var sequenceValue = Convert.ToDecimal(sequenceValueObj);
            // 验证序列值是否有效
            if (sequenceValue <= 0)
            {
                throw new InvalidOperationException($"数据库序列 MES_WOMCAB_IN_DATA_seq 返回了无效的值: {sequenceValue}");
            }
            return sequenceValue;
        }
        catch (Exception ex)
        {
            // 记录异常信息
            Console.WriteLine($"调用数据库序列 MES_WOMCAB_IN_DATA_seq 失败: {ex.Message}");
            // 向上层抛出明确的异常信息
            throw new InvalidOperationException($"生成子表ID失败,无法获取数据库序列值: {ex.Message}", ex);
        }
    }
    //唯一键组合:主表就是工单单别+工单单号,子表是工单单号+工单单号+材料品号
    /// <summary>
    /// 整单删除,调用存储过程
    /// </summary>
    /// <param name="billNo">单号</param>
    /// <returns>被删除的单号</returns>
    public (int outSum, string outMsg) Delete(string FBillNo, string FBillTypeID)
    {
        try
        {
            var outMsg = string.Empty;
            var outSum = 0;
            var parameters = new List<SugarParameter>
    {
        new SugarParameter("@FBillNo", FBillNo),
        new SugarParameter("@FBillTypeID", FBillTypeID),
        new SugarParameter("@outMsg", outMsg, typeof(string), ParameterDirection.Output, 2500),
        new SugarParameter("@outSum", outSum, typeof(int), ParameterDirection.Output)
    };
            Db.Ado.UseStoredProcedure().ExecuteCommand("ERP_DeleteWomcaaByBillNo", parameters);
            outMsg = parameters[2].Value?.ToString() ?? "";
            outSum = parameters[3].Value != null ? Convert.ToInt32(parameters[index: 3].Value) : -1;
            return (outSum, outMsg);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException($"调用存储过程 ERP_DeleteWomcaaByBillNo 失败: {ex.Message}", ex);
        }
    }
}