using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; namespace MES.Service.service { public class ZzcxManager : Repository { public bool SaveList(List list) { var result = list.Select(Save).ToList(); return result.All(b => b); } public bool Save(ERPZZCXD data) { var head = MapErpToMesHead(data.Main); var children = MapErpChildren(data.Children, data.Main.erpid); return UseTransaction(db => { switch (data.Main.type) { case "3": // 删除 / 禁用 return UpdateData(db, head, children) ? 1 : 0; case "2": case "4": case "5": // 新增或更新 return SaveOrUpdateData(db, head, children) ? 1 : 0; default: throw new NotImplementedException($"type 没有 {data.Main.type} 这个类型"); } }) > 0; } private ZZCX MapErpToMesHead(ERPZZCXMain dto) { var entity = new ZZCX { BillNo = dto.bill_no, // 单据编码 Erpid = string.IsNullOrEmpty(dto.erpid) ? (decimal?)null : Convert.ToDecimal(dto.erpid), // ERP 主表 ID DjLx = dto.dj_lx, KcZz = dto.kc_zz, SwLx = dto.sw_lx, // Time = string.IsNullOrEmpty(dto.time) ? (DateTime?)null : DateTime.Parse(dto.time), Time = dto.time, Bm = dto.bm, Cgy = dto.cgy, Kcz = dto.kcz, DjZt = dto.dj_zt, Memo = dto.memo, Cphzlx = dto.cphzlx, Cphz = dto.cphz, Zjhzlx = dto.zjhzlx, Zjhz = dto.zjhz, }; var single = Db.Queryable() .Where(it => it.Erpid == entity.Erpid) .First(); if (single != null) entity.Id = single.Id; return entity; } private List MapErpChildren(List list, string mainErpId) { var result = new List(); foreach (var dto in list) { var item = new ZZCXA { /* BillNo = dto.bill_no, DjLx = dto.dj_lx, KcZz = dto.kc_zz, SwLx = dto.sw_lx, // Time = string.IsNullOrEmpty(dto.time) ? (DateTime?)null : DateTime.Parse(dto.time), Time = dto.time, Bm = dto.bm, Cgy = dto.cgy, Kcz = dto.kcz, DjZt = dto.dj_zt, Memo = dto.memo, Cphzlx = dto.cphzlx, Cphz = dto.cphz, Zjhzlx = dto.zjhzlx, Zjhz = dto.zjhz,*/ Erpid = string.IsNullOrEmpty(dto.erpid) ? (decimal?)null : Convert.ToDecimal(dto.erpid), YdId = string.IsNullOrEmpty(dto.yd_id) ? (decimal?)null : Convert.ToDecimal(dto.yd_id), ItemId = string.IsNullOrEmpty(dto.item_id) ? (decimal?)null : Convert.ToDecimal(dto.item_id), Qty = string.IsNullOrEmpty(dto.qty) ? (decimal?)null : Convert.ToDecimal(dto.qty), Unit = dto.unit, DepotId = string.IsNullOrEmpty(dto.depot_id) ? (decimal?)null : Convert.ToDecimal(dto.depot_id) }; var existing = Db.Queryable().Where(s => s.Erpid == item.Erpid).Single(); if (existing != null) item.Id = existing.Id; result.Add(item); // 孙表处理 if (dto.SubItems != null && dto.SubItems.Count > 0) { foreach (var subDto in dto.SubItems) { var subEntity = new ZZCXB { Eid = string.IsNullOrEmpty(subDto.eid) ? (decimal?)null : Convert.ToDecimal(subDto.eid), Erpid = string.IsNullOrEmpty(subDto.erpid) ? (decimal?)null : Convert.ToDecimal(subDto.erpid), YdId = string.IsNullOrEmpty(subDto.yd_id) ? (decimal?)null : Convert.ToDecimal(subDto.yd_id), ItemId = string.IsNullOrEmpty(subDto.item_id) ? (decimal?)null : Convert.ToDecimal(subDto.item_id), Qty = string.IsNullOrEmpty(subDto.qty) ? (decimal?)null : Convert.ToDecimal(subDto.qty), Unit = subDto.unit, DepotId = string.IsNullOrEmpty(subDto.depot_id) ? (decimal?)null : Convert.ToDecimal(subDto.depot_id), LotNo = subDto.lot_no, Memo = subDto.memo }; var existingSub = Db.Queryable().Where(s => s.Eid == subEntity.Eid).Single(); if (existingSub != null) subEntity.Id = existingSub.Id; item.SubItems ??= new List(); item.SubItems.Add(subEntity); } } } return result; } private bool SaveOrUpdateData(SqlSugarScope db, ZZCX head, List children) { // 1. 校验是否存在领料记录(MES_INV_ITEM_OUTS) var hasMaterialOut = db.Queryable() .Any(x => x.WorkNo == head.BillNo); if (hasMaterialOut) { throw new Exception($"MES已有领料记录,单号:{head.BillNo},不能更新!"); } if (head.Id != null) base.DeleteById(head.Id); db.Deleteable().Where(d => d.YdId == head.Erpid).ExecuteCommand(); db.Deleteable().Where(d => d.Erpid == head.Erpid).ExecuteCommand(); var insertedHead = db.Insertable(head) .IgnoreColumns(true) .ExecuteReturnIdentity(); if (insertedHead <= 0) throw new Exception("主表插入失败,未返回ID"); foreach (var child in children) { child.Pid = insertedHead; var childId = db.Insertable(child).IgnoreColumns(true).ExecuteReturnIdentity(); if (child.SubItems != null && child.SubItems.Count > 0) { foreach (var sub in child.SubItems) { sub.Pid = childId; db.Insertable(sub).IgnoreColumns(true).ExecuteCommand(); } } } return true; } /* private bool UpdateData(SqlSugarScope db, ZZCX head, List children) { // 删除主表 & 子孙表 var deletedHead = base.DeleteById(head.Id); var deletedChildren = db.Deleteable().Where(d => d.YdId == head.Erpid).ExecuteCommand(); var deletedGrand = db.Deleteable().Where(d => d.Erpid == head.Erpid).ExecuteCommand(); if (deletedHead && deletedChildren >= 0 && deletedGrand >= 0) return true; throw new NotImplementedException("删除失败"); }*/ private bool UpdateData(SqlSugarScope db, ZZCX head, List children) { // 1. 校验是否存在领料记录(MES_INV_ITEM_OUTS) var hasMaterialOut = db.Queryable() .Any(x => x.WorkNo == head.BillNo); if (hasMaterialOut) { throw new Exception($"MES已有领料记录,单号:{head.BillNo},不能删除!"); } // 删除主表 var deletedHead = db.Deleteable() .Where(d => d.Erpid == head.Erpid) .ExecuteCommand(); // 删除子表 var deletedChildren = db.Deleteable() .Where(d => d.YdId == head.Erpid) .ExecuteCommand(); // 删除孙表 var deletedGrand = db.Deleteable() .Where(d => d.Erpid == head.Erpid) .ExecuteCommand(); // 如果主表没删到记录,也认为允许(可能之前就不存在) if (deletedHead >= 0 && deletedChildren >= 0 && deletedGrand >= 0) return true; throw new NotImplementedException("删除失败"); } } }