using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using MES.Service.util;
using SqlSugar;
using System.Data;
namespace MES.Service.service;
///
/// 生产订单
///
public class WomcaaManager : Repository
{
//当前类已经继承了 Repository 增、删、查、改的方法
//这里面写的代码不会给覆盖,如果要重新生成请删除 WomcaaManager.cs
private readonly WomcabManager _womcabManager = new();
public bool SaveList(List rohIns)
{
var result = rohIns.Select(Save).ToList();
return result.All(b => b);
}
public bool Save(ErpWOM wom)
{
var womErpCaa = wom.ErpCaa;
var mesWomcaa = MapErpCAAtoWomcaa(womErpCaa, wom.ErpCabs[0].FBillNo);
var mesWomcabs =
MapErpCABtoWomcab(wom.ErpCabs);
return UseTransaction(db =>
{
switch (womErpCaa.Type)
{
case "3":
return SaveOrUpdateData(db, mesWomcaa, mesWomcabs,womErpCaa.Type)
? 1
: 0;
//return UpdateData(db, mesWomcaa, mesWomcabs) ? 1 : 0; //反审核不删除,做update。
case "2":
case "4":
//kyy 2024-09-13 变更
case "5":
return SaveOrUpdateData(db, mesWomcaa, mesWomcabs,womErpCaa.Type)
? 1
: 0;
default:
throw new NotImplementedException(
$"type没有{womErpCaa.Type}这个类型");
}
}) > 0;
}
private bool SaveOrUpdateData(SqlSugarScope db, Womcaa mesWomcaa,
List mesWomcabs, string type)
{
if(type == "3" || (mesWomcaa.DocumentStatus != null && mesWomcaa.DocumentStatus != "C"))
{
mesWomcaa.Typea = "3"; // 新增字段赋值
mesWomcaa.Caa001 = mesWomcaa.Caa001 + "F" + mesWomcaa.Erpid.ToString();
}
if (StringUtil.CheckGuid(mesWomcaa.Guid))
base.DeleteById(mesWomcaa.Guid);
//if (mesWomcabs.Count > 0)
// db.Deleteable()
// .Where(s => s.Pid == mesWomcaa.Erpid).ExecuteCommand();
// 在插入 mesWomcabs 之前,先删除所有 Guid 已存在的记录
//var guids = mesWomcabs.Select(x => x.Guid).ToList();
//if (guids.Count > 0)
//{
// db.Deleteable().In(x => x.Guid, guids).ExecuteCommand();
//}
if (mesWomcabs.Count > 0)
{
// 先按 Pid 删除
db.Deleteable()
.Where(s => s.Pid == mesWomcaa.Erpid).ExecuteCommand();
// // 再按 Guid 删除,彻底避免主键冲突
// var guids = mesWomcabs.Select(x => x.Guid).ToList();
// db.Deleteable().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)
.IgnoreColumns(true).ExecuteCommand() > 0;
//批量插入忽略空字段
var baOrUpdate = db.Insertable(mesWomcabs).PageSize(1)
.IgnoreColumnsNull()
.ExecuteCommand() > 0;
// if (orUpdate && baOrUpdate)
// throw new NotImplementedException("插入或更新失败");
if (orUpdate && baOrUpdate)
{
// 调用存储过程更新用料清单
db.Ado.ExecuteCommand("exec [dbo].[prc_update_womdab] @outMsg output,@outSum output,@inEdtUserGuid,@inCaaGuid",
new {
outMsg = (string)null, // 输出参数
outSum = (int?)null, // 输出参数
inEdtUserGuid = new Guid("11111111-1111-1111-1111-111111111111"),
inCaaGuid = new Guid(mesWomcaa.Guid.ToString())
});
return true;
}
throw new NotImplementedException("插入或更新失败");
}
private bool UpdateData(SqlSugarScope db, Womcaa mesWomcaa,
List mesWomcabs)
{
//throw new NotImplementedException("存在下有单据,不允许反审");
var decimals = mesWomcabs.Select(s => s.Guid).ToArray();
var update = base.DeleteById(mesWomcaa.Guid);
var insertOrUpdate = db
.Deleteable().In(decimals)
.ExecuteCommand() > 0;
if (update && insertOrUpdate) return true;
throw new NotImplementedException("更新失败");
}
private Womcaa MapErpCAAtoWomcaa(ErpCAA dto,string PPBOMNO)
{
var entity = new Womcaa
{
Erpid = Convert.ToInt32(dto.Id), /// ERPID
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, /// 产品编码
Caa009 = dto.FUnitId, /// 单位
Caa012 = !string.IsNullOrEmpty(dto.FQty)
? Convert.ToDecimal(dto.FQty)
: null, /// 数量
WorkGroupId = dto.FWorkGroupId, /// 计划组
PlanId = dto.FPlannerID, /// 计划员
Caa010 = dto.FPlanStartDate, /// 预计开工时间
Caa011 = dto.FPlanFinishDate, /// 预计完工时间
Caa005 = DateTime.TryParse(dto.FConveyDate, out var conveyDate)
? (conveyDate <= new DateTime(1900, 1, 1) ? null : conveyDate.ToString())
: null, /// 开单日期
StockInlimith = dto.FStockInLimitH, /// 入库上限
StockInlimitl = dto.FStockInLimitL, /// 入库下限
Mtono = dto.FMTONO, /// 计划跟踪号
Lot = dto.FLot, /// 批号
Caa013 = dto.FBomId, /// BOM版次
Caa015 = dto.F_UNW_Text_xsddh, /// 订单单号
Caa015Head = dto.xsddh_type, /// 订单单别
CreateType = dto.FCreateType, /// 生成方式
Caa018 = !string.IsNullOrEmpty(dto.PLAN_ID)
? Convert.ToInt32(dto.PLAN_ID)
: null, /// ERP源单ID
Caa019 = !string.IsNullOrEmpty(dto.PLAN_SEQ)
? Convert.ToInt32(dto.PLAN_SEQ)
: null, /// ERP源单行号
Caa020 = dto.PLAN_NUM, /// ERP源单单号(任务单号)
ForceCloserid = dto.FForceCloserId, /// 结案人
CloseType = dto.FCloseType, /// 结案类型
SrcSplitBillno = dto.FSrcSplitBillNo, /// 源拆分订单编号
Caa016 = dto.FMemoItem, /// 备注
SrcBillNo = dto.FSrcBillNo, /// 源单编号
SrcBillentryseq = dto.FSrcBillEntrySeq, /// 源单分录行号
SaleOrderNo = dto.FSaleOrderNo, /// 需求单据号
SaleOrderEntryseq = dto.FSaleOrderEntrySeq, /// 需求单据行号
ErpSczz = Convert.ToInt32(dto.FPrdOrgId), /// 生产组织ID
ErpWtzz = Convert.ToInt32(dto.FEnTrustOrgId), /// 委托组织ID
Btbz = dto.Btbz, /// 委托组织ID
//MainProductNo = dto.F_XIFG_Base_w5c, /// 主产品编码
// MainProductQty =
// Convert.ToInt32(dto.F_XIFG_Qty_yrr), /// 主产品生产数量
// CustomerItemNumber = dto.F_XIFG_Text_fg2, /// 客户货号
// PackingListNumber = dto.F_XIFG_Text_yrr, /// 包装单号
// CustomerName = dto.F_XIFG_Text_qtr1, /// 客户名称
// Customer = dto.F_XIFG_Base_83g1, /// 客户
//Caa0111 = dto.FPlanFinishDate, /// 预计完工时间备份
//Typea = dto.TypeA, /// 预计完工时间备份
//Typeb = dto.TypeB /// 预计完工时间备份
SynchronousDate = DateTime.Now,
DocumentStatus = dto.FDocumentStatus
};
//根据单号+单别,获取对应的id
var singleId = Db.Queryable()
.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;
return entity;
}
private List MapErpCABtoWomcab(List dtoList)
{
var womcabList = new List();
foreach (var dto in dtoList)
{
var womcab = new Womcab
{
Erpid = Convert.ToInt32(dto.Id), /// ERPID
Cab001 = dto.FBillNo, /// 工单单号
//Cab002 = Convert.ToInt32(dto.FSeq), /// 序号
Cab002 = Convert.ToInt32(dto.FBillNoType), /// 序号
Cab003 = dto.FMaterialID2, /// 材料编码
Cab006 = !string.IsNullOrEmpty(dto.FNeedQty)
? Convert.ToDecimal(dto.FNeedQty)
: null, /// 需领用量
Cab007 = !string.IsNullOrEmpty(dto.FPickedQty)
? Convert.ToDecimal(dto.FPickedQty)
: null, /// 已领用量
PositionNo = dto.FPositionNO, /// 位置号
SupplyOrganization = dto.FChildSupplyOrgId, /// 供应组织
IssuingOrganization = dto.FSUPPLYORG, /// 发料组织
OwnerId = dto.FOwnerID, /// 货主
Mtono = dto.FMTONO, /// 计划跟踪号
Lot = dto.FLot, /// 批号
DepotCode = dto.FStockID, /// 仓库
IssueType = dto.FIssueType, /// 发料方式
Cab008 = dto.F_UNW_Text_tpgy, /// 工艺
Cab009 = dto.FUnitID, /// 单位
SupplyType = dto.FSupplyType, /// 供应类型(C采购 Z自制 W委外)
Cab012 = !string.IsNullOrEmpty(dto.FStdQty)
? Convert.ToDecimal(dto.FStdQty)
: null, /// 组成用量
Cab014 = dto.FIsKeyItem, /// 是否替料
Numerator = dto.FNumerator, /// 分子
Denominator = dto.FDenominator, /// 分母
Pid = Convert.ToInt32(dto.PID), /// ERP头ID
Eid = Convert.ToInt32(dto.Id), /// ERP ID
Scrapqty = dto.FFixScrapQty, /// 固定损耗
Scraprate = dto.FScrapRate, /// 变动损耗率
Freplacegroup = Convert.ToInt32(dto.FReplaceGroup),
UseRate = Convert.ToDecimal(dto.FUseRate),
MaterialType = dto.FMaterialType,
MustQty = Convert.ToDecimal(dto.FMustQty),
Typeb = dto.TypeB,
F_UNW_QTY_YFSL = dto.F_UNW_QTY_YFSL,
// Fsaleorderno = dto.FSALEORDERNO, /// 销售订单
//
// CustomerItemNumber = dto.F_XIFG_Text_re5, /// 客户货号
// PackingListNumber = dto.F_XIFG_Text_apv, /// 包装单号
// MainProduct = dto.F_XIFG_Base_re5, /// 主产品
// MainProductQty =
// Convert.ToInt32(dto.F_XIFG_Qty_apv), /// 主产品数量
// ParentItemName = dto.F_XIFG_Base_apv /// 父项物料名称
};
//根据单号+单别+材料品号,获取对应的id
var singleId = Db.Queryable()
.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()
.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;
}
/////
///// 生成新的主表ID,确保不重复
/////
//private decimal GenerateNewId()
//{
// // 处理空表的情况,从1开始
// var maxId = Db.Queryable().Max(x => (decimal?)x.Erpid) ?? 0;
// var newId = maxId + 1;
// // 双重检查,确保生成的ID不存在
// while (Db.Queryable().Where(x => x.Erpid == newId).Any())
// {
// newId++;
// }
// return newId;
//}
///
/// 生成新的主表ID,通过数据库序列获取唯一ID
///
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);
}
}
///
/// 生成新的子表ID,通过数据库序列获取唯一ID
///
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);
}
}
///
/// 整单删除,调用存储过程
///
/// 单号
/// 被删除的单号
public (int outSum, string outMsg) Delete(string FBillNo, string FBillTypeID)
{
try
{
var outMsg = string.Empty;
var outSum = 0;
var parameters = new List
{
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_DeleteMesRohInByBillNo", 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_DeleteMesRohInByBillNo 失败: {ex.Message}", ex);
}
}
}