| | |
| | | |
| | | namespace MES.Service.service |
| | | { |
| | | public class ZzcxdManager : Repository<Zzcxa> |
| | | public class ZzcxManager : Repository<ZZCX> |
| | | { |
| | | public bool SaveList(List<ERPZZCXD> list) |
| | | { |
| | | var result = list.Select(Save).ToList(); |
| | | return result.All(b => b); |
| | | /*var result = list.Select(Save).ToList(); |
| | | return result.All(b => b);*/ |
| | | foreach (var item in list) |
| | | { |
| | | try |
| | | { |
| | | Save(item); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception($"单据 {item.Main.bill_no} 出错: {ex.Message}", ex); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public bool Save(ERPZZCXD data) |
| | | { |
| | | var head = MapErpToMesHead(data.ERPZZCXA); |
| | | var details = MapErpDbckbToDbckb(data.ERPZZCXB); |
| | | var head = MapErpToMesHead(data.Main); |
| | | var children = MapErpChildren(data.Children, data.Main.erpid); |
| | | |
| | | return UseTransaction(db => |
| | | { |
| | | switch (data.ERPZZCXA.type) |
| | | switch (data.Main.type) |
| | | { |
| | | case "3": |
| | | return UpdateData(db, head, details) ? 1 : 0; |
| | | case "3": // 删除 / 禁用 |
| | | return UpdateData(db, head, children) ? 1 : 0; |
| | | |
| | | case "2": |
| | | case "4": |
| | | case "5": |
| | | return SaveOrUpdateData(db, head, details) ? 1 : 0; |
| | | case "5": // 新增或更新 |
| | | return SaveOrUpdateData(db, head, children) ? 1 : 0; |
| | | |
| | | default: |
| | | throw new NotImplementedException($"type没有 {data.ERPZZCXA.type} 这个类型"); |
| | | throw new NotImplementedException($"type 没有 {data.Main.type} 这个类型"); |
| | | } |
| | | }) > 0; |
| | | } |
| | | |
| | | private Zzcxa MapErpToMesHead(ERPZZCXA dto) |
| | | private ZZCX MapErpToMesHead(ERPZZCXMain dto) |
| | | { |
| | | var entity = new Zzcxa |
| | | var entity = new ZZCX |
| | | { |
| | | BillNo = dto.bill_no, // 单据编码 |
| | | DjLx = dto.dj_lx, // 单据类型 |
| | | KcZz = dto.kc_zz, // 库存组织 |
| | | SwLx = dto.sw_lx, // 事务类型 |
| | | 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, // 子件货主 |
| | | ItemId = string.IsNullOrEmpty(dto.item_id) ? null : Convert.ToDecimal(dto.item_id), // 物料编码id |
| | | Qty = string.IsNullOrEmpty(dto.qty) ? null : Convert.ToDecimal(dto.qty), // 数量 |
| | | Unit = dto.unit, // 单位 |
| | | DepotId = dto.depot_id, // 仓库 |
| | | Erpid = dto.erpid // ERP 主表id |
| | | 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<Zzcxa>() |
| | | var single = Db.Queryable<ZZCX>() |
| | | .Where(it => it.Erpid == entity.Erpid) |
| | | .First(); |
| | | if (single != null) |
| | |
| | | return entity; |
| | | } |
| | | |
| | | private List<Zzcxb> MapErpDbckbToDbckb(List<ERPZZCXB> list) |
| | | private List<ZZCXA> MapErpChildren(List<ERPZZCXA> list, string mainErpId) |
| | | { |
| | | var result = new List<Zzcxb>(); |
| | | var result = new List<ZZCXA>(); |
| | | |
| | | foreach (var dto in list) |
| | | { |
| | | var item = new Zzcxb |
| | | var item = new ZZCXA |
| | | { |
| | | Erpid = dto.erpid, // ERP 主表id |
| | | Eid = dto.eid, // ERP 单据头id |
| | | ItemId = string.IsNullOrEmpty(dto.item_id) ? null : Convert.ToDecimal(dto.item_id), // 物料编码id |
| | | Qty = string.IsNullOrEmpty(dto.qty) ? null : Convert.ToDecimal(dto.qty), // 数量 |
| | | Unit = dto.unit, // 单位 |
| | | DepotId = dto.depot_id, // 仓库 |
| | | LotNo = dto.lot_no, // 批号 |
| | | Memo = dto.memo // 备注 |
| | | /* 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<Zzcxb>().Where(s => s.Erpid == item.Erpid).Single(); |
| | | var existing = Db.Queryable<ZZCXA>().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<ZZCXB>().Where(s => s.Erpid == subEntity.Erpid).Single(); |
| | | if (existingSub != null) subEntity.Id = existingSub.Id; |
| | | |
| | | item.SubItems ??= new List<ZZCXB>(); |
| | | item.SubItems.Add(subEntity); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private bool SaveOrUpdateData(SqlSugarScope db, Zzcxa head, List<Zzcxb> details) |
| | | private bool SaveOrUpdateData(SqlSugarScope db, ZZCX head, List<ZZCXA> children) |
| | | { |
| | | // 1. 校验是否存在领料记录(MES_INV_ITEM_OUTS) |
| | | var hasMaterialOut = db.Queryable<MesInvItemOuts>() |
| | | .Any(x => x.WorkNo == head.BillNo); |
| | | |
| | | if (hasMaterialOut) |
| | | { |
| | | throw new Exception($"MES已有领料记录,单号:{head.BillNo},不能更新!"); |
| | | } |
| | | |
| | | if (head.Id != null) |
| | | base.DeleteById(head.Id); |
| | | |
| | | db.Deleteable<Zzcxb>() |
| | | .Where(d => d.Eid == head.Erpid) |
| | | .ExecuteCommand(); |
| | | |
| | | |
| | | // 删除孙表 |
| | | db.Deleteable<ZZCXB>().Where(d => d.YdId == head.Erpid).ExecuteCommand(); |
| | | // 删除子表(使用 yd_id 作为关联) |
| | | db.Deleteable<ZZCXA>().Where(d => d.YdId == head.Erpid).ExecuteCommand(); |
| | | // 删除主表 |
| | | db.Deleteable<ZZCX>().Where(d => d.Erpid == head.Erpid).ExecuteCommand(); |
| | | var insertedHead = db.Insertable(head) |
| | | .IgnoreColumns(true) |
| | | .ExecuteReturnIdentity(); |
| | | if (insertedHead <= 0) |
| | | throw new Exception("主表插入失败,未返回ID"); |
| | | |
| | | var success = db.Insertable(details) |
| | | .PageSize(10) |
| | | .IgnoreColumnsNull() |
| | | .ExecuteCommand() > 0; |
| | | foreach (var child in children) |
| | | { |
| | | child.Pid = insertedHead; |
| | | var childId = db.Insertable(child).IgnoreColumns(true).ExecuteReturnIdentity(); |
| | | |
| | | if (insertedHead >= 0 && success) return true; |
| | | throw new NotImplementedException("插入或更新失败"); |
| | | 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, Zzcxa head, List<Zzcxb> details) |
| | | /* private bool UpdateData(SqlSugarScope db, ZZCX head, List<ZZCXA> children) |
| | | { |
| | | // 删除主表 & 子孙表 |
| | | var deletedHead = base.DeleteById(head.Id); |
| | | var deletedChildren = db.Deleteable<ZZCXA>().Where(d => d.YdId == head.Erpid).ExecuteCommand(); |
| | | var deletedGrand = db.Deleteable<ZZCXB>().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<ZZCXA> children) |
| | | { |
| | | var ids = details.Select(d => d.Id).ToArray(); |
| | | var deletedHead = base.DeleteById(head.Id); |
| | | var deletedDetails = db.Deleteable<Zzcxb>().In(ids).ExecuteCommand() > 0; |
| | | |
| | | if (deletedHead && deletedDetails) return true; |
| | | throw new NotImplementedException("更新失败"); |
| | | // 1. 校验是否存在领料记录(MES_INV_ITEM_OUTS) |
| | | var hasMaterialOut = db.Queryable<MesInvItemOuts>() |
| | | .Any(x => x.WorkNo == head.BillNo); |
| | | |
| | | if (hasMaterialOut) |
| | | { |
| | | throw new Exception($"MES已有领料记录,单号:{head.BillNo},不能删除!"); |
| | | } |
| | | |
| | | // 删除主表 |
| | | var deletedHead = db.Deleteable<ZZCX>() |
| | | .Where(d => d.Erpid == head.Erpid) |
| | | .ExecuteCommand(); |
| | | |
| | | // 删除子表 |
| | | var deletedChildren = db.Deleteable<ZZCXA>() |
| | | .Where(d => d.YdId == head.Erpid) |
| | | .ExecuteCommand(); |
| | | |
| | | // 删除孙表 |
| | | var deletedGrand = db.Deleteable<ZZCXB>() |
| | | .Where(d => d.Erpid == head.Erpid) |
| | | .ExecuteCommand(); |
| | | |
| | | // 如果主表没删到记录,也认为允许(可能之前就不存在) |
| | | if (deletedHead >= 0 && deletedChildren >= 0 && deletedGrand >= 0) |
| | | return true; |
| | | |
| | | throw new NotImplementedException("删除失败"); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |