diff --git a/BasicData/Tnb.BasicData.Entities/Dto/BasEbom/EbomTreeOutput.cs b/BasicData/Tnb.BasicData.Entities/Dto/BasEbom/EbomTreeOutput.cs index 637fec3b..497b111c 100644 --- a/BasicData/Tnb.BasicData.Entities/Dto/BasEbom/EbomTreeOutput.cs +++ b/BasicData/Tnb.BasicData.Entities/Dto/BasEbom/EbomTreeOutput.cs @@ -82,11 +82,11 @@ namespace Tnb.BasicData.Entities.Dto /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } } \ No newline at end of file diff --git a/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs index 8b149423..75b8f853 100644 --- a/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs +++ b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs @@ -67,10 +67,10 @@ /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } } diff --git a/BasicData/Tnb.BasicData.Entities/Entity/BasEbomD.cs b/BasicData/Tnb.BasicData.Entities/Entity/BasEbomD.cs index eacd115d..de340f9e 100644 --- a/BasicData/Tnb.BasicData.Entities/Entity/BasEbomD.cs +++ b/BasicData/Tnb.BasicData.Entities/Entity/BasEbomD.cs @@ -76,10 +76,10 @@ public partial class BasEbomD : BaseEntity /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } diff --git a/BasicData/Tnb.BasicData.Entities/Entity/BasMaterial.cs b/BasicData/Tnb.BasicData.Entities/Entity/BasMaterial.cs index 72b051b5..75971bc9 100644 --- a/BasicData/Tnb.BasicData.Entities/Entity/BasMaterial.cs +++ b/BasicData/Tnb.BasicData.Entities/Entity/BasMaterial.cs @@ -278,4 +278,9 @@ public partial class BasMaterial : BaseEntity /// 物料型号 /// public string? material_standard { get; set; } + + /// + /// erp修改时间 + /// + public string erp_modify_time { get; set; } } diff --git a/BasicData/Tnb.BasicData.Entities/Entity/BasMbomInput.cs b/BasicData/Tnb.BasicData.Entities/Entity/BasMbomInput.cs index a710a2f2..94b86d5e 100644 --- a/BasicData/Tnb.BasicData.Entities/Entity/BasMbomInput.cs +++ b/BasicData/Tnb.BasicData.Entities/Entity/BasMbomInput.cs @@ -52,10 +52,10 @@ public partial class BasMbomInput : BaseEntity /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } diff --git a/BasicData/Tnb.BasicData.Entities/Entity/BasMbomOutput.cs b/BasicData/Tnb.BasicData.Entities/Entity/BasMbomOutput.cs index b238218b..b64b889b 100644 --- a/BasicData/Tnb.BasicData.Entities/Entity/BasMbomOutput.cs +++ b/BasicData/Tnb.BasicData.Entities/Entity/BasMbomOutput.cs @@ -52,10 +52,10 @@ public partial class BasMbomOutput : BaseEntity /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } diff --git a/BasicData/Tnb.BasicData/BasEbomService.cs b/BasicData/Tnb.BasicData/BasEbomService.cs index a84a6cfc..72dc9960 100644 --- a/BasicData/Tnb.BasicData/BasEbomService.cs +++ b/BasicData/Tnb.BasicData/BasEbomService.cs @@ -60,7 +60,7 @@ namespace Tnb.BasicData material_id_id = b.id, status = SqlFunc.IIF(a.status == "0", "禁用", "启用"), descrip = a.descrip, - quantity = a.quantity, + // quantity = a.quantity, version = a.version, route_id = c.name, route_id_id = c.id, diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/MaterialPreparationPlanOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/MaterialPreparationPlanOutput.cs index 44cc660a..5d70733d 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/MaterialPreparationPlanOutput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/MaterialPreparationPlanOutput.cs @@ -31,11 +31,11 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage /// /// 比列分子 /// - public int molecule { get; set; } + public decimal molecule { get; set; } /// /// 比列分母 /// - public int denominator { get; set; } + public decimal denominator { get; set; } } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/BomList.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/BomList.cs new file mode 100644 index 00000000..598840e3 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/BomList.cs @@ -0,0 +1,38 @@ +using SqlSugar; + +namespace Tnb.ProductionMgr.Entities.Entity.ErpEntity +{ + [SugarTable("BOM_LIST")] + public class BomList + { + /// + /// 关联id + /// + public string BOMID { get; set; } + /// + /// 父物料编号 + /// + public string MPRODID { get; set; } + /// + /// 父物料单位 + /// + public string UNIT { get; set; } + /// + /// 版本 + /// + public string HVERSION { get; set; } + /// + /// 子物料编号 + /// + public string SUBPRODID { get; set; } + + /// + /// 底数 + /// + public decimal DISHU { get; set; } + /// + /// 数量 + /// + public decimal BATCHAMOUNT { get; set; } + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/ErpBdMaterial.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/ErpBdMaterial.cs index ac90fc09..194606da 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/ErpBdMaterial.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/ErpEntity/ErpBdMaterial.cs @@ -52,5 +52,9 @@ namespace Tnb.ProductionMgr.Entities.Entity.ErpEntity /// 物料主键+物料主单位 /// public string AID { get; set; } + /// + /// 修改时间 + /// + public string MODIFIEDTIME { get; set; } } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/MesForErpService.cs b/ProductionMgr/Tnb.ProductionMgr/MesForErpService.cs index 8d6a5ce1..13a4194a 100644 --- a/ProductionMgr/Tnb.ProductionMgr/MesForErpService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/MesForErpService.cs @@ -7,6 +7,7 @@ using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Logging; using JNPF.Message.Service; +using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.TaskScheduler; using Microsoft.AspNetCore.Authorization; @@ -92,8 +93,10 @@ namespace Tnb.ProductionMgr throw Oops.Bah($"系统中无法找到物料清单{item.ebom_version}版本"); } - + DictionaryDataEntity unitDic = await _db.Queryable().Where(x=>x.DictionaryTypeId==WmsWareHouseConst.UNITTYPEID && x.EnCode==item.unit_id).FirstAsync(); + item.id = SnowflakeIdHelper.NextId(); + item.material_id = basMaterial.id; item.mo_source = "1"; item.mo_type = moTypeDic[item.mo_type]; item.mo_code = item.mo_code; @@ -103,6 +106,7 @@ namespace Tnb.ProductionMgr item.erp_mo_pk = item.erp_mo_pk; item.erp_line_pk = item.erp_line_pk; item.erp_lineno = item.erp_lineno; + item.unit_id = unitDic?.Id ?? item.unit_id; moList.Add(item); } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs index eb673953..62d1a8ee 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs @@ -758,7 +758,7 @@ namespace Tnb.ProductionMgr foreach (BasEbomD item in basEbomDs) { // decimal? num1 = beforeReportNum / basEbomH.quantity * item.quantity; - decimal? num1 = beforeReportNum / basEbomH.quantity * (item.molecule/item.denominator); + decimal? num1 = beforeReportNum / (item.molecule/item.denominator); List prdFeedingDs = await _db.Queryable() .LeftJoin((a, b) => a.feeding_id == b.id) .Where((a, b) => a.material_id == item.material_id && b.mo_task_id == mo_task_id) @@ -775,7 +775,7 @@ namespace Tnb.ProductionMgr else { // decimal? num2 = prdReport.reported_qty / basEbomH.quantity * item.quantity; - decimal? num2 = prdReport.reported_qty / basEbomH.quantity * (item.molecule/item.denominator); + decimal? num2 = prdReport.reported_qty / (item.molecule/item.denominator); if (sum2 <= num2) { prdFeedingIds.Add(item.id); @@ -1094,7 +1094,7 @@ namespace Tnb.ProductionMgr foreach (PrdReport prdReport in prdReports) { // decimal needNum = (prdReport.reported_qty ?? 0) / basEbomH.quantity * basEbomD.quantity; - decimal needNum = (prdReport.reported_qty ?? 0) / basEbomH.quantity * (basEbomD.molecule/basEbomD.denominator); + decimal needNum = (prdReport.reported_qty ?? 0) / (basEbomD.molecule/basEbomD.denominator); if (beforeIn - needNum >= 0) { beforeIn -= needNum; diff --git a/ProductionMgr/Tnb.ProductionMgr/TimeWorkService.cs b/ProductionMgr/Tnb.ProductionMgr/TimeWorkService.cs index 20863fa6..1c6b3b3f 100644 --- a/ProductionMgr/Tnb.ProductionMgr/TimeWorkService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/TimeWorkService.cs @@ -773,47 +773,226 @@ namespace Tnb.ProductionMgr [AllowAnonymous] public async Task SyncBaseData() { - var mysqlDb = _db.AsTenant().GetConnection("erpdb"); - List list = await mysqlDb.Queryable().ToListAsync(); - List erpExtendFields = await _db.Queryable().Where(x=>x.table_name=="base_dictionarydata").ToListAsync(); - Dictionary unitDic = await _db.Queryable().Where(x=>x.DictionaryTypeId==WmsWareHouseConst.UNITTYPEID).ToDictionaryAsync(x=>x.Id,y=>y.EnCode); - List materials = await _db.Queryable().ToListAsync(); - List insertMaterial = new List(); - List insertMaterialUnits = new List(); - List insertExtendFields = new List(); - foreach (ErpBdMaterial erpBdMaterial in list) + try { - if (erpExtendFields.All(x => x.cmaterialoid != erpBdMaterial.ID)) + string[] tables = new[] { "base_dictionarydata", "bas_material" }; + var erpdb = _db.AsTenant().GetConnection("erpdb"); + List list = await erpdb.Queryable().ToListAsync(); + List bomList = erpdb.Queryable().ToList(); + List erpExtendFields = await _db.Queryable() + .Where(x => tables.Contains(x.table_name)).ToListAsync(); + Dictionary unitDic = await _db.Queryable() + .Where(x => x.DictionaryTypeId == WmsWareHouseConst.UNITTYPEID) + .ToDictionaryAsync(x => x.Id, y => y.EnCode); + Dictionary unitDic2 = await _db.Queryable() + .Where(x => x.DictionaryTypeId == WmsWareHouseConst.UNITTYPEID) + .ToDictionaryAsync(x => x.FullName, y => y.EnCode); + List materials = await _db.Queryable().ToListAsync(); + List basEbomHs = await _db.Queryable().ToListAsync(); + List insertMaterial = new List(); + List insertMaterialUnits = new List(); + List insertBasEbomHs = new List(); + List insertBasEbomDs = new List(); + List insertExtendFields = new List(); + + await _db.Ado.BeginTranAsync(); + + foreach (ErpBdMaterial erpBdMaterial in list) { string unitId = erpExtendFields.Find(x => x.cunitid == erpBdMaterial.PK_MEASDOC)?.table_id ?? ""; unitId = unitDic.ContainsKey(unitId) ? unitDic[unitId].ToString() : ""; - string auxiliaryUnitId = erpExtendFields.Find(x => x.cunitid == erpBdMaterial.FMEASDOC)?.table_id ?? ""; + string auxiliaryUnitId = + erpExtendFields.Find(x => x.cunitid == erpBdMaterial.FMEASDOC)?.table_id ?? ""; auxiliaryUnitId = unitDic.ContainsKey(auxiliaryUnitId) ? unitDic[auxiliaryUnitId].ToString() : ""; - BasMaterial basMaterial = new BasMaterial() - { - id = SnowflakeIdHelper.NextId(), - name = erpBdMaterial.NAME, - code = erpBdMaterial.CODE, - org_id = WmsWareHouseConst.AdministratorOrgId, - material_specification = erpBdMaterial.MATERIALSPEC, - material_standard = erpBdMaterial.MATERIALTYPE, - category_id = "[\"CGJCJ\"]", - unit_id = unitId, - }; - insertMaterial.Add(basMaterial); - string[] unitArr = erpBdMaterial.MEASRATE.Split("/"); - insertMaterialUnits.Add(new BasMaterialUnit() + if (erpExtendFields.All(x => x.cmaterialoid != erpBdMaterial.ID)) { - id = SnowflakeIdHelper.NextId(), - material_id = basMaterial.id, - number_of_primary_unit = unitArr[0], - number_of_auxiliary_unit = unitArr[1], - auxiliary_unit_id = auxiliaryUnitId - }); + BasMaterial basMaterial = new BasMaterial() + { + id = SnowflakeIdHelper.NextId(), + name = erpBdMaterial.NAME, + code = erpBdMaterial.CODE, + org_id = WmsWareHouseConst.AdministratorOrgId, + material_specification = erpBdMaterial.MATERIALSPEC, + material_standard = erpBdMaterial.MATERIALTYPE, + category_id = "[\"CGJCJ\"]", + unit_id = unitId, + create_time = DateTime.Now + }; + insertMaterial.Add(basMaterial); + + insertMaterialUnits.Add(new BasMaterialUnit() + { + id = SnowflakeIdHelper.NextId(), + material_id = basMaterial.id, + number_of_primary_unit = unitArr[0], + number_of_auxiliary_unit = unitArr[1], + auxiliary_unit_id = auxiliaryUnitId + }); + } + else + { + ErpExtendField extendField = erpExtendFields.Find(x => x.cmaterialoid == erpBdMaterial.ID); + string materialId = extendField?.table_id ?? ""; + BasMaterial basMaterial = await _db.Queryable().SingleAsync(x => x.id == materialId); + if (erpBdMaterial.MODIFIEDTIME != basMaterial.erp_modify_time) + { + int updateRow = await _db.Updateable() + .SetColumns(x => x.name == erpBdMaterial.NAME) + .SetColumns(x => x.code == erpBdMaterial.CODE) + .SetColumns(x => x.material_specification == erpBdMaterial.MATERIALSPEC) + .SetColumns(x => x.material_standard == erpBdMaterial.MATERIALTYPE) + .SetColumns(x => x.unit_id == unitId) + .SetColumns(x => x.name == erpBdMaterial.NAME) + .SetColumns(x => x.erp_modify_time == erpBdMaterial.MODIFIEDTIME) + .Where(x => x.id == materialId) + .ExecuteCommandAsync(); + if (updateRow <= 0) + { + Log.Error($"未找到物料{erpBdMaterial.ID},跳过此条数据"); + continue; + } + + BasMaterialUnit basMaterialUnit = await _db.Queryable() + .Where(x => x.material_id == materialId && x.auxiliary_unit_id == auxiliaryUnitId) + .FirstAsync(); + if (basMaterialUnit == null) + { + insertMaterialUnits.Add(new BasMaterialUnit() + { + id = SnowflakeIdHelper.NextId(), + material_id = materialId, + number_of_primary_unit = unitArr[0], + number_of_auxiliary_unit = unitArr[1], + auxiliary_unit_id = auxiliaryUnitId + }); + } + else + { + await _db.Updateable() + .SetColumns(x => x.number_of_primary_unit == unitArr[0]) + .SetColumns(x => x.number_of_auxiliary_unit == unitArr[1]) + .Where(x => x.id == basMaterialUnit.id) + .ExecuteCommandAsync(); + } + } + } } + + await _db.Insertable(insertMaterial).ExecuteCommandAsync(); + await _db.Insertable(insertMaterialUnits).ExecuteCommandAsync(); + + //物料清单开始同步 + materials = await _db.Queryable().ToListAsync(); + var groupList = bomList.GroupBy(x => x.BOMID); + foreach (var item in groupList) + { + string key = item.Key; + List itemList = item.ToList(); + BomList firstItemInList = itemList[0]; + BasMaterial material = materials.Find(x => x.code==firstItemInList.MPRODID); + if (material == null) continue; + string unitId = unitDic.ContainsKey(firstItemInList.UNIT) ? unitDic[firstItemInList.UNIT].ToString() : ""; + if (basEbomHs.All(x => x.material_id != material.id && x.version != firstItemInList.HVERSION)) + { + BasEbomH basEbomH = new BasEbomH() + { + id = SnowflakeIdHelper.NextId(), + org_id = WmsWareHouseConst.AdministratorOrgId, + material_id = material.id, + unit_id = unitId, + version = firstItemInList.HVERSION, + create_time = DateTime.Now, + }; + + + bool flag = false; + List tempList = new List(); + foreach (var children in itemList) + { + BasMaterial childrenMaterial = materials.Find(x => x.code==children.SUBPRODID); + if (childrenMaterial == null) + { + flag = true; + tempList = new List(); + break; + } + + BasEbomD basEbomD = new BasEbomD() + { + id = SnowflakeIdHelper.NextId(), + ebom_id = basEbomH.id, + material_id = childrenMaterial.id, + denominator = children.DISHU, + molecule = children.BATCHAMOUNT, + }; + tempList.Add(basEbomD); + } + + if (flag) + { + continue; + } + + insertBasEbomHs.Add(basEbomH); + insertBasEbomDs.AddRange(tempList); + + } + else + { + BasEbomH basEbomH = await _db.Queryable().Where(x=>x.material_id==material.id && x.version==firstItemInList.HVERSION).FirstAsync(); + if (basEbomH == null) continue; + + bool flag = false; + List tempList = new List(); + foreach (var children in itemList) + { + BasMaterial childrenMaterial = materials.Find(x => x.code==children.SUBPRODID); + if (childrenMaterial == null) + { + flag = true; + tempList = new List(); + break; + } + + BasEbomD basEbomD = new BasEbomD() + { + id = SnowflakeIdHelper.NextId(), + ebom_id = basEbomH.id, + material_id = childrenMaterial.id, + denominator = children.DISHU, + molecule = children.BATCHAMOUNT, + }; + tempList.Add(basEbomD); + } + + if (flag) + { + continue; + } + + insertBasEbomDs.AddRange(tempList); + await _db.Updateable() + .SetColumns(x => x.unit_id == unitId) + .Where(x => x.id == basEbomH.id) + .ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.ebom_id == basEbomH.id).ExecuteCommandAsync(); + } + } + + await _db.Insertable(insertBasEbomHs).ExecuteCommandAsync(); + await _db.Insertable(insertBasEbomDs).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); } - return "true"; + catch (Exception e) + { + Log.Error(e.Message, e); + await _db.Ado.RollbackTranAsync(); + throw Oops.Bah(e.Message); + } + + return "成功"; } /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 5ebb027f..c621c60f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -871,7 +871,7 @@ namespace Tnb.WarehouseMgr ["crowno"] = wmsMaterialTransferd.lineno, ["csourcebillbid"] = wmsMaterialTransferd.erp_line_pk, ["csourcebillhid"] = wmsMaterialTransfer.erp_pk, - ["cunitid"] = erpExtendFields.Find(x=>x.table_id==unitData.Id)?.cunitid ?? "", + ["cunitid"] = erpExtendFields.Find(x=>x.table_id==unitData?.Id)?.cunitid ?? "", ["cvendorid"] = "", ["cvendorvid"] = "", ["dbizdate"] = nowStr,