hao
2025-09-18 4598e856759f043f203d45a0674626b9e2ff89b8
StandardInterface/MES.Service/service/ZZCXDManager.cs
@@ -8,7 +8,7 @@
namespace MES.Service.service
{
    public class ZzcxdManager : Repository<Zzcxa>
    public class ZzcxManager : Repository<ZZCX>
    {
        public bool SaveList(List<ERPZZCXD> list)
        {
@@ -18,51 +18,51 @@
        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)
@@ -71,41 +71,89 @@
            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.Eid == subEntity.Eid).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<ZZCXA>().Where(d => d.YdId == head.Erpid).ExecuteCommand();
            db.Deleteable<ZZCXB>().Where(d => d.Erpid == head.Erpid).ExecuteCommand();
            var insertedHead = db.Insertable(head)
                .IgnoreColumns(true)
@@ -113,23 +161,69 @@
            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("删除失败");
        }
    }
}