kyy
2025-07-25 0a7af16f00ca918f5b61c6540c58193d53c5b70a
1、新增采购退货接口
已添加7个文件
950 ■■■■■ 文件已修改
MES.Service/Dto/webApi/ErpCgth.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/Dto/webApi/ErpCgthB.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/Dto/webApi/ErpCgtha.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/Modes/MesCgthSq.cs 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/Modes/MesCgthSqDetail.cs 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/service/BasicData/MesCgthSqManager.cs 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MESApplication/Controllers/BasicData/MesCgthSqController.cs 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MES.Service/Dto/webApi/ErpCgth.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
namespace MES.Service.Dto.webApi;
public class ErpCgth
{
    public ErpCgtha ErpCgtha { get; set; }
    public List<ErpCgthB> ErpCgthB { get; set; }
}
MES.Service/Dto/webApi/ErpCgthB.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
namespace MES.Service.Dto.webApi;
public class ErpCgthB
{
    /// <summary>
    /// ERP ç³»ç»Ÿæ˜Žç»†è®°å½• ID
    /// </summary>
    public string? ERPID { get; set; }
    /// <summary>
    /// å¤–部系统关联 ID
    /// </summary>
    public string? EID { get; set; }
    /// <summary>
    /// æºå•单号(关联原始业务单据)
    /// </summary>
    public string? FSRCBillNo { get; set; }
    /// <summary>
    /// æºå•类型(标识原始单据类型)
    /// </summary>
    public string? FSRCBillTypeId { get; set; }
    /// <summary>
    /// ç‰©æ–™ ID(对应物料主数据)
    /// </summary>
    public string? FMATERIALID { get; set; }
    /// <summary>
    /// åº“存单位(物料的计量单位)
    /// </summary>
    public string? FUnitID { get; set; }
    /// <summary>
    /// ä»“库 ID(关联仓库信息)
    /// </summary>
    public string? FSTOCKID { get; set; }
    /// <summary>
    /// ä»“位(物料在仓库中的具体存储位置)
    /// </summary>
    public string? FSTOCKLOCID { get; set; }
    /// <summary>
    /// æ‰¹å·ï¼ˆç‰©æ–™ç”Ÿäº§æ‰¹æ¬¡ç¼–号)
    /// </summary>
    public string? FLot { get; set; }
    /// <summary>
    /// å®žé€€æ•°é‡ï¼ˆå®žé™…退还的物料数量)
    /// </summary>
    public decimal? FRMREALQTY { get; set; }
    /// <summary>
    /// å¤‡æ³¨ä¿¡æ¯ï¼ˆæ˜Žç»†ç›¸å…³è¯´æ˜Žï¼‰
    /// </summary>
    public string? FNOTE { get; set; }
    /// <summary>
    /// è®¡åˆ’跟踪号(用于跟踪物料计划执行)
    /// </summary>
    public string? FMtoNo { get; set; }
}
MES.Service/Dto/webApi/ErpCgtha.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
namespace MES.Service.Dto.webApi;
public class ErpCgtha
{
    /// <summary>
    /// æ“ä½œç±»åž‹
    /// </summary>
    public string? TYPE { get; set; }
    /// <summary>
    /// ERP ä¸»è¡¨ id
    /// </summary>
    public string? ERPID { get; set; }
    /// <summary>
    /// å•据编号
    /// </summary>
    public string? billNo { get; set; }
    /// <summary>
    /// é€€æ–™æ—¥æœŸ
    /// </summary>
    public string? FDate { get; set; }
    /// <summary>
    /// å•据状态
    /// </summary>
    public string? FDocumentStatus { get; set; }
    /// <summary>
    /// ä¾›åº”商 ID
    /// </summary>
    public string? FSupplierID { get; set; }
    /// <summary>
    /// å•据类型
    /// </summary>
    public string? FBillTypeID { get; set; }
    /// <summary>
    /// ä¸šåŠ¡ç±»åž‹
    /// </summary>
    public string? FBusinessType { get; set; }
    /// <summary>
    /// é€€æ–™ç±»åž‹
    /// </summary>
    public string? FMRTYPE { get; set; }
    /// <summary>
    /// é€€æ–™æ–¹å¼
    /// </summary>
    public string? FMRMODE { get; set; }
    /// <summary>
    /// åˆ›å»ºäºº
    /// </summary>
    public string? FCreatorId { get; set; }
    /// <summary>
    /// é‡‡è´­ç»„织
    /// </summary>
    public string? FPurchaseOrgId { get; set; }
    /// <summary>
    /// é€€æ–™ç»„织
    /// </summary>
    public string? FStockOrgId { get; set; }
    /// <summary>
    /// éœ€æ±‚组织
    /// </summary>
    public string? FRequireOrgId { get; set; }
    /// <summary>
    /// é€€æ–™éƒ¨é—¨
    /// </summary>
    public string? FMRDeptId { get; set; }
    /// <summary>
    /// ä»“管员
    /// </summary>
    public string? FSTOCKERID { get; set; }
    /// <summary>
    /// é‡‡è´­å‘˜
    /// </summary>
    public string? FPURCHASERID { get; set; }
    /// <summary>
    /// é€€æ–™åŽŸå› 
    /// </summary>
    public string? FMRREASON { get; set; }
    /// <summary>
    /// é‡‡è´­éƒ¨é—¨
    /// </summary>
    public string? FPURCHASEDEPTID { get; set; }
    /// <summary>
    /// é‡‡è´­ç»„
    /// </summary>
    public string? FPURCHASERGROUPID { get; set; }
    /// <summary>
    /// éªŒæ”¶æ–¹å¼
    /// </summary>
    public string? FACCTYPE { get; set; }
    /// <summary>
    /// åˆ›å»ºæ—¥æœŸ
    /// </summary>
    public string? FCreateDate { get; set; }
    /// <summary>
    /// æ‰«ç æ ‡è¯†
    /// </summary>
    public int? F_WPVT_INTEGER_L6W { get; set; }
}
MES.Service/Modes/MesCgthSq.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
using SqlSugar;
namespace MES.Service.Modes;
/// <summary>
/// é‡‡è´­é€€è´§ç”³è¯·è¡¨
/// </summary>
[SugarTable("MES_CGTH_SQ")]
public class MesCgthSq
{
    /// <summary>
    /// è®°å½•唯一标识(主键)
    /// </summary>
    [SugarColumn(ColumnName = "ID", IsPrimaryKey = true)]
    public Guid Id { get; set; }
    /// <summary>
    /// å•据编号
    /// </summary>
    [SugarColumn(ColumnName = "BILL_NO")]
    public string BillNo { get; set; }
    /// <summary>
    /// åˆ›å»ºäºº
    /// </summary>
    [SugarColumn(ColumnName = "CREATE_BY")]
    public string? CreateBy { get; set; }
    /// <summary>
    /// åˆ›å»ºæ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "CREATE_DATE")]
    public DateTime? CreateDate { get; set; }
    /// <summary>
    /// æœ€åŽæ›´æ–°äºº
    /// </summary>
    [SugarColumn(ColumnName = "LAST_UPDATE_USER")]
    public string? LastUpdateUser { get; set; }
    /// <summary>
    /// æœ€åŽæ›´æ–°æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "LAST_UPDATE_TIME")]
    public DateTime? LastUpdateTime { get; set; }
    /// <summary>
    /// å®¡æ ¸äºº
    /// </summary>
    [SugarColumn(ColumnName = "CHECK_USER")]
    public string? CheckUser { get; set; }
    /// <summary>
    /// å®¡æ ¸æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "CHECK_DATE")]
    public DateTime? CheckDate { get; set; }
    /// <summary>
    /// çŠ¶æ€æ ‡è¯†ï¼ˆ0/1)
    /// é»˜è®¤å€¼: 0
    /// </summary>
    [SugarColumn(ColumnName = "STATUS")]
    public bool? Status { get; set; }
    /// <summary>
    /// æ˜¯å¦å®Œæˆæ ‡è¯†ï¼ˆ0/1)
    /// é»˜è®¤å€¼: 0
    /// </summary>
    [SugarColumn(ColumnName = "IS_FINISH")]
    public bool? IsFinish { get; set; }
    /// <summary>
    /// é€€è´§æ–¹å¼
    /// </summary>
    [SugarColumn(ColumnName = "RETURN_METHOD")]
    public string? ReturnMethod { get; set; }
    /// <summary>
    /// é€€è´§ç±»åž‹
    /// </summary>
    [SugarColumn(ColumnName = "RETURN_TYPE")]
    public string? ReturnType { get; set; }
    /// <summary>
    /// ä»“库 ID
    /// </summary>
    [SugarColumn(ColumnName = "DEPOT_ID")]
    public int? DepotId { get; set; }
    /// <summary>
    /// ä¾›åº”商 ID
    /// </summary>
    [SugarColumn(ColumnName = "SUPP_ID")]
    public int? SuppId { get; set; }
    /// <summary>
    /// å¤‡æ³¨ä¿¡æ¯
    /// </summary>
    [SugarColumn(ColumnName = "REMARK")]
    public string? Remark { get; set; }
    /// <summary>
    /// æ˜¯å¦å‡ºåº“标识(0/1)
    /// </summary>
    [SugarColumn(ColumnName = "IS_OUT")]
    public bool? IsOut { get; set; }
    /// <summary>
    /// é€€è´§ç»„织 ID
    /// </summary>
    [SugarColumn(ColumnName = "TH_ORG_ID")]
    public string? ThOrgId { get; set; }
    /// <summary>
    /// æ“ä½œç±»åž‹
    /// </summary>
    [SugarColumn(ColumnName = "TYPE")]
    public string? Type { get; set; }
    /// <summary>
    /// ERP ä¸»è¡¨ id
    /// </summary>
    [SugarColumn(ColumnName = "ERPID")]
    public string? ErpId { get; set; }
    /// <summary>
    /// é€€æ–™æ—¥æœŸ
    /// </summary>
    [SugarColumn(ColumnName = "FDate")]
    public string? FDate { get; set; }
    /// <summary>
    /// å•据状态
    /// </summary>
    [SugarColumn(ColumnName = "FDocumentStatus")]
    public string? FDocumentStatus { get; set; }
    /// <summary>
    /// ä¾›åº”商 ID(外部系统)
    /// </summary>
    [SugarColumn(ColumnName = "FSupplierID")]
    public string? FSupplierId { get; set; }
    /// <summary>
    /// å•据类型
    /// </summary>
    [SugarColumn(ColumnName = "FBillTypeID")]
    public string? FBillTypeId { get; set; }
    /// <summary>
    /// ä¸šåŠ¡ç±»åž‹
    /// </summary>
    [SugarColumn(ColumnName = "FBusinessType")]
    public string? FBusinessType { get; set; }
    /// <summary>
    /// é‡‡è´­ç»„织
    /// </summary>
    [SugarColumn(ColumnName = "FPurchaseOrgId")]
    public string? FPurchaseOrgId { get; set; }
    /// <summary>
    /// éœ€æ±‚组织
    /// </summary>
    [SugarColumn(ColumnName = "FRequireOrgId")]
    public string? FRequireOrgId { get; set; }
    /// <summary>
    /// é€€æ–™éƒ¨é—¨
    /// </summary>
    [SugarColumn(ColumnName = "FMRDeptId")]
    public string? FMRDeptId { get; set; }
    /// <summary>
    /// ä»“管员
    /// </summary>
    [SugarColumn(ColumnName = "FSTOCKERID")]
    public string? FStockerId { get; set; }
    /// <summary>
    /// é‡‡è´­å‘˜
    /// </summary>
    [SugarColumn(ColumnName = "FPURCHASERID")]
    public string? FPurchaserId { get; set; }
    /// <summary>
    /// é€€æ–™åŽŸå› 
    /// </summary>
    [SugarColumn(ColumnName = "FMRREASON")]
    public string? FMRReason { get; set; }
    /// <summary>
    /// é‡‡è´­éƒ¨é—¨
    /// </summary>
    [SugarColumn(ColumnName = "FPURCHASEDEPTID")]
    public string? FPurchaseDeptId { get; set; }
    /// <summary>
    /// é‡‡è´­ç»„
    /// </summary>
    [SugarColumn(ColumnName = "FPURCHASERGROUPID")]
    public string? FPurchaserGroupId { get; set; }
    /// <summary>
    /// éªŒæ”¶æ–¹å¼
    /// </summary>
    [SugarColumn(ColumnName = "FACCTYPE")]
    public string? FACCTYPE { get; set; }
    /// <summary>
    /// åˆ›å»ºæ—¥æœŸï¼ˆå¤–部系统)
    /// </summary>
    [SugarColumn(ColumnName = "FCreateDate")]
    public string? FCreateDate { get; set; }
    /// <summary>
    /// æ‰«ç æ ‡è¯†
    /// </summary>
    [SugarColumn(ColumnName = "F_WPVT_INTEGER_L6W")]
    public int? FWPVTINTEGERL6W { get; set; }
}
MES.Service/Modes/MesCgthSqDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
using SqlSugar;
namespace MES.Service.Modes;
/// <summary>
/// é‡‡è´­é€€è´§ç”³è¯·æ˜Žç»†è¡¨ï¼ˆMES_CGTH_SQ_DETAIL)
/// </summary>
[SugarTable("MES_CGTH_SQ_DETAIL")]
public class MesCgthSqDetail
{
    /// <summary>
    /// æ˜Žç»†è¡¨è®°å½•唯一标识(主键)
    /// </summary>
    [SugarColumn(ColumnName = "ID", IsPrimaryKey = true)]
    public Guid Id { get; set; }
    /// <summary>
    /// å…³è”主表(MES_CGTH_SQ)的 ID
    /// </summary>
    [SugarColumn(ColumnName = "MID")]
    public Guid? Mid { get; set; }
    /// <summary>
    /// åº“存单据编号
    /// </summary>
    [SugarColumn(ColumnName = "INV_BILL_NO")]
    public string? InvBillNo { get; set; }
    /// <summary>
    /// åº“存作业行号
    /// </summary>
    [SugarColumn(ColumnName = "INV_WORK_LINE")]
    public int? InvWorkLine { get; set; }
    /// <summary>
    /// é‡‡è´­è®¢å•号(通常来自 ERP ç³»ç»Ÿï¼‰
    /// </summary>
    [SugarColumn(ColumnName = "EBELN")]
    public string? Ebeln { get; set; }
    /// <summary>
    /// å¤–部系统 ID(关联其他系统记录)
    /// </summary>
    [SugarColumn(ColumnName = "EID")]
    public int? Eid { get; set; }
    /// <summary>
    /// ERP ç³»ç»Ÿä¸­çš„æ˜Žç»†è®°å½• ID
    /// </summary>
    [SugarColumn(ColumnName = "ERPID")]
    public int? ErpId { get; set; }
    /// <summary>
    /// ç‰©æ–™ ID(关联物料主表)
    /// </summary>
    [SugarColumn(ColumnName = "ITEM_ID")]
    public int? ItemId { get; set; }
    /// <summary>
    /// ç”³è¯·é€€è´§æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "SQ_NUM")]
    public decimal? SqNum { get; set; }
    /// <summary>
    /// å·²æ”¶é€€è´§æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "YS_NUM")]
    public decimal? YsNum { get; set; }
    /// <summary>
    /// æ˜Žç»†å¤‡æ³¨ä¿¡æ¯
    /// </summary>
    [SugarColumn(ColumnName = "REMARK")]
    public string? Remark { get; set; }
    /// <summary>
    /// æ˜Žç»†å®Œæˆæ ‡è¯†ï¼ˆ0/1)
    /// </summary>
    [SugarColumn(ColumnName = "IS_FINISH")]
    public bool? IsFinish { get; set; }
    /// <summary>
    /// æ˜Žç»†æŽ’序号
    /// </summary>
    [SugarColumn(ColumnName = "ORDER_NO")]
    public int? OrderNo { get; set; }
    /// <summary>
    /// å…¥åº“明细 GUID(关联入库单明细)
    /// </summary>
    [SugarColumn(ColumnName = "RKMX_GUID")]
    public Guid? RkmxGuid { get; set; }
    /// <summary>
    /// ä»“库 ID(关联仓库表)
    /// </summary>
    [SugarColumn(ColumnName = "depot_id")]
    public long? DepotId { get; set; }
    /// <summary>
    /// æºå•单号(关联原始业务单据)
    /// </summary>
    [SugarColumn(ColumnName = "FSRCBillNo")]
    public string? FsrcBillNo { get; set; }
    /// <summary>
    /// æºå•类型(标识原始单据类型)
    /// </summary>
    [SugarColumn(ColumnName = "FSRCBillTypeId")]
    public string? FsrcBillTypeId { get; set; }
    /// <summary>
    /// åº“存单位(物料的库存计量单位)
    /// </summary>
    [SugarColumn(ColumnName = "FUnitID")]
    public string? FUnitId { get; set; }
    /// <summary>
    /// ä»“位(物料在仓库中的具体存储位置)
    /// </summary>
    [SugarColumn(ColumnName = "FSTOCKLOCID")]
    public string? FstockLocId { get; set; }
    /// <summary>
    /// æ‰¹å·ï¼ˆç‰©æ–™ç”Ÿäº§æ‰¹æ¬¡ç¼–号)
    /// </summary>
    [SugarColumn(ColumnName = "FLot")]
    public string? FLot { get; set; }
    /// <summary>
    /// è®¡åˆ’跟踪号(跟踪物料计划)
    /// </summary>
    [SugarColumn(ColumnName = "FMtoNo")]
    public string? FMtoNo { get; set; }
}
MES.Service/service/BasicData/MesCgthSqManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using MES.Service.util;
using SqlSugar;
namespace MES.Service.service;
public class MesCgthSqManager : Repository<MesCgthSq>
{
    // æ˜Žç»†è¡¨ç®¡ç†å™¨ï¼ˆç”¨äºŽå¤„理明细数据)
    //private readonly MesCgthSqDetailManager _detailManager = new();
    /// <summary>
    /// æ‰¹é‡ä¿å­˜é‡‡è´­é€€è´§å•(主表+明细)
    /// </summary>
    public bool SaveList(List<ErpCgth> erpCgthList)
    {
        // é€æ¡å¤„理,全部成功才返回true
        var result = erpCgthList.Select(Save).ToList();
        return result.All(b => b);
    }
    /// <summary>
    /// ä¿å­˜é‡‡è´­é€€è´§å•(主表+明细)
    /// </summary>
    public bool Save(ErpCgth erpCgth)
    {
        // ä»ŽERP数据中提取主表和明细表DTO
        var erpMain = erpCgth.ErpCgtha;
        var erpDetails = erpCgth.ErpCgthB;
        // æ˜ å°„主表和明细表实体
        var mesMain = MapErpCgthaToMesCgthSq(erpMain);
        var mesDetails = MapErpCgthBToMesCgthSqDetail(erpDetails, mesMain.Id); // å…³è”主表ID
        // ä½¿ç”¨äº‹åŠ¡å¤„ç†ä¸»ä»Žè¡¨è”åŠ¨æ“ä½œ
        return UseTransaction(db =>
        {
            // æ ¹æ®æ“ä½œç±»åž‹ï¼ˆTYPE)执行不同逻辑(假设TYPE=1新增,2更新,3删除)
            switch (erpMain.TYPE)
            {
                case "1": // æ–°å¢ž
                case "2": // æ›´æ–°ï¼ˆç»Ÿä¸€èµ°æ–°å¢žæˆ–更新逻辑)
                case "4":
                    return SaveOrUpdateData(db, mesMain, mesDetails) ? 1 : 0;
                case "3": // åˆ é™¤
                    return DeleteData(db, mesMain, mesDetails) ? 1 : 0;
                default:
                    throw new NotImplementedException($"操作类型[{erpMain.TYPE}]未实现");
            }
        }) > 0;
    }
    /// <summary>
    /// æ–°å¢žæˆ–更新数据(主表+明细)
    /// </summary>
    private bool SaveOrUpdateData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails)
    {
        // 1. å¤„理主表:若已存在则更新,不存在则新增
        bool isMainExist = db.Queryable<MesCgthSq>().Where(m => m.BillNo == mesMain.BillNo).Any();
        int mainResult;
        if (isMainExist)
        {
            // æ›´æ–°ä¸»è¡¨ï¼ˆå¿½ç•¥ç©ºå­—段)
            mainResult = db.Updateable(mesMain)
                .IgnoreColumns(m => m.Id) // ä¸æ›´æ–°ä¸»é”®
                .Where(m => m.BillNo == mesMain.BillNo)
                .ExecuteCommand();
        }
        else
        {
            // æ–°å¢žä¸»è¡¨ï¼ˆç”Ÿæˆä¸»é”®ï¼‰
            mesMain.Id = Guid.NewGuid();
            mainResult = db.Insertable(mesMain).ExecuteCommand();
        }
        // 2. å¤„理明细表:先删除旧明细,再插入新明细(确保数据同步)
        // ï¼ˆé€šè¿‡ä¸»è¡¨ERPID关联旧明细)
        int oldDetailCount = db.Deleteable<MesCgthSqDetail>()
            .Where(d => d.Mid == mesMain.Id)
            .ExecuteCommand();
        // æ’入新明细(关联主表ID)
        int detailResult = mesDetails.Count > 0
            ? db.Insertable(mesDetails).ExecuteCommand()
            : 1; // æ— æ˜Žç»†æ—¶é»˜è®¤æˆåŠŸ
        // 3. æ ¡éªŒç»“æžœ
        if (mainResult > 0 && detailResult > 0)
        {
            return true;
        }
        throw new NotImplementedException("主表或明细保存失败");
    }
    /// <summary>
    /// åˆ é™¤æ•°æ®ï¼ˆä¸»è¡¨+明细)
    /// </summary>
    private bool DeleteData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails)
    {
        // å¤„理ERPID为空的情况,转换为统一的空字符串进行比较
        string mainErpId = mesMain.ErpId?.ToString() ?? string.Empty;
        // 1. åˆ é™¤æ˜Žç»†ï¼ˆé€šè¿‡ä¸»è¡¨ERPID关联)
        int detailResult = db.Deleteable<MesCgthSqDetail>()
            .Where(d => (d.Eid.ToString() ?? string.Empty) == mainErpId)
            .ExecuteCommand();
        // 2. åˆ é™¤ä¸»è¡¨ï¼ˆé€šè¿‡ERPID关联)
        int mainResult = db.Deleteable<MesCgthSq>()
            .Where(m => (m.ErpId.ToString() ?? string.Empty) == mainErpId)
            .ExecuteCommand();
        return mainResult > 0 && detailResult >= 0; // å…è®¸æ˜Žç»†åŽŸæœ¬ä¸å­˜åœ¨ï¼ˆ>=0)
    }
    /// <summary>
    /// ErpCgtha æ˜ å°„到 MesCgthSq(仅映射ErpCgtha中存在的字段)
    /// </summary>
    private MesCgthSq MapErpCgthaToMesCgthSq(ErpCgtha erpMain)
    {
        return new MesCgthSq
        {
            // ä¸»è¡¨æ ¸å¿ƒå­—段(仅从ErpCgtha取值)
            ErpId = erpMain.ERPID, // ERP主表ID
            BillNo = erpMain.billNo, // å•据编号
            Type = erpMain.TYPE, // æ“ä½œç±»åž‹
            FDate = erpMain.FDate, // é€€æ–™æ—¥æœŸ
            FDocumentStatus = erpMain.FDocumentStatus, // å•据状态
            FSupplierId = erpMain.FSupplierID, // ä¾›åº”商ID
            FBillTypeId = erpMain.FBillTypeID, // å•据类型
            FBusinessType = erpMain.FBusinessType, // ä¸šåŠ¡ç±»åž‹
            ReturnType = erpMain.FMRTYPE, // é€€æ–™ç±»åž‹ï¼ˆå¯¹åº”ErpCgtha的退料类型)
            ReturnMethod = erpMain.FMRMODE, // é€€æ–™æ–¹å¼ï¼ˆå¯¹åº”ErpCgtha的退料方式)
            CreateBy = erpMain.FCreatorId, // åˆ›å»ºäºº
            FPurchaseOrgId = erpMain.FPurchaseOrgId, // é‡‡è´­ç»„织
            ThOrgId = erpMain.FStockOrgId, // é€€æ–™ç»„织
            FRequireOrgId = erpMain.FRequireOrgId, // éœ€æ±‚组织
            FMRDeptId = erpMain.FMRDeptId, // é€€æ–™éƒ¨é—¨
            FStockerId = erpMain.FSTOCKERID, // ä»“管员
            FPurchaserId = erpMain.FPURCHASERID, // é‡‡è´­å‘˜
            FMRReason = erpMain.FMRREASON, // é€€æ–™åŽŸå› 
            FPurchaseDeptId = erpMain.FPURCHASEDEPTID, // é‡‡è´­éƒ¨é—¨
            FPurchaserGroupId = erpMain.FPURCHASERGROUPID, // é‡‡è´­ç»„
            FACCTYPE = erpMain.FACCTYPE, // éªŒæ”¶æ–¹å¼
            FCreateDate = erpMain.FCreateDate, // åˆ›å»ºæ—¥æœŸ
            FWPVTINTEGERL6W = erpMain.F_WPVT_INTEGER_L6W, // æ‰«ç æ ‡è¯†
            // DepotId = string.IsNullOrEmpty(erpMain.FSTOCKID)
            //     ? null
            //     : Convert.ToInt32(erpMain.FSTOCKID), // ä»“库ID(转换为int)
            SuppId = string.IsNullOrEmpty(erpMain.FSupplierID)
                ? null
                : Convert.ToInt32(erpMain.FSupplierID), // ä¾›åº”商ID(转换为int)
            // ç³»ç»Ÿè‡ªåŠ¨èµ‹å€¼å­—æ®µ
            CreateDate = DateTime.Now,
            LastUpdateTime = DateTime.Now
        };
    }
    /// <summary>
    /// ErpCgthB æ˜ å°„到 MesCgthSqDetail(仅映射ErpCgthB中存在的字段)
    /// </summary>
    private List<MesCgthSqDetail> MapErpCgthBToMesCgthSqDetail(List<ErpCgthB> erpDetails, Guid mainId)
    {
        return erpDetails.Select(erpDetail => new MesCgthSqDetail
        {
            // å…³è”主表ID
            Mid= mainId, // ä¸»è¡¨ID(MesCgthSq的Id)
            // æ˜Žç»†æ ¸å¿ƒå­—段(仅从ErpCgthB取值)
            ErpId = string.IsNullOrEmpty(erpDetail.ERPID) ? null : Convert.ToInt32(erpDetail.ERPID), // ERP明细ID
            Eid = string.IsNullOrEmpty(erpDetail.EID) ? null : Convert.ToInt32(erpDetail.EID), // å¤–部系统ID
            FsrcBillNo = erpDetail.FSRCBillNo, // æºå•单号
            FsrcBillTypeId = erpDetail.FSRCBillTypeId, // æºå•类型
            ItemId = string.IsNullOrEmpty(erpDetail.FMATERIALID)
                ? null
                : Convert.ToInt32(erpDetail.FMATERIALID), // ç‰©æ–™ID
            FUnitId = erpDetail.FUnitID, // åº“存单位
            DepotId = string.IsNullOrEmpty(erpDetail.FSTOCKID) ? null : Convert.ToInt64(erpDetail.FSTOCKID), // ä»“库ID
            FstockLocId = erpDetail.FSTOCKLOCID, // ä»“位
            FLot = erpDetail.FLot, // æ‰¹å·
            SqNum = erpDetail.FRMREALQTY, // å®žé€€æ•°é‡
            Remark = erpDetail.FNOTE, // å¤‡æ³¨
            FMtoNo = erpDetail.FMtoNo, // è®¡åˆ’跟踪号
            // ç³»ç»Ÿè‡ªåŠ¨èµ‹å€¼å­—æ®µ
            IsFinish = false // åˆå§‹æœªå®Œæˆ
        }).ToList();
    }
   }
MESApplication/Controllers/BasicData/MesCgthSqController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,212 @@
using System.Dynamic;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using MES.Service.service;
using MES.Service.service.BasicData;
using MES.Service.util;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
namespace MESApplication.Controllers.BasicData;
[ApiController]
[Route("api/[controller]")]
public class MesCgthSqController : ControllerBase
{
    private readonly MessageCenterManager _messageCenterManager = new();
    private readonly MesCgthSqManager _mesCgthSqManager = new();
    private readonly string _method = "POST";
    private readonly string _tableName = "MES_CGTH_SQ";
    private readonly string _baseUrl = "http://localhost:10054/api/MesCgthSq/";
    /// <summary>
    /// ä¿å­˜é‡‡è´­é€€è´§ç”³è¯·å•
    /// </summary>
    [HttpPost("Save")]
    public ResponseResult Save(ErpCgth erpCgth)
    {
// åˆå§‹åŒ–消息中心实体(用于记录接口调用日志)
        var messageEntity = new MessageCenter
        {
            TableName = _tableName,
            Url = _baseUrl + "Save",
            Method = _method,
            Data = JsonConvert.SerializeObject(erpCgth),
            Status = 1, // çŠ¶æ€ï¼š1 - å¾…处理
            CreateBy = "SYSTEM", // åˆ›å»ºäººæ ‡è¯†
            Route = erpCgth.ErpCgtha.billNo // è·¯ç”±æ ‡è¯†ï¼ˆä½¿ç”¨å•据编号)
        };
        try
        {
            dynamic resultData = new ExpandoObject();
// è°ƒç”¨ä¸šåŠ¡å±‚ä¿å­˜æ–¹æ³•ï¼ˆå°† ERP ä¼ å…¥çš„ DTO è½¬æ¢ä¸ºå®žä½“并保存)
            var saveSuccess = _mesCgthSqManager.Save(erpCgth);
            resultData.saveResult = saveSuccess;
// æ›´æ–°æ¶ˆæ¯ä¸­å¿ƒçŠ¶æ€ï¼ˆä¿å­˜æˆåŠŸï¼‰
            messageEntity.Result = 1; // ç»“果:1 - æˆåŠŸ
            messageEntity.DealWith = 1; // å¤„理状态:1 - å·²å¤„理
            _messageCenterManager.save(messageEntity);
            return new ResponseResult
            {
                status = 0,
                message = "保存成功",
                data = resultData
            };
        }
        catch (Exception ex)
        {
// å¼‚常处理:记录错误信息
            messageEntity.Result = 0; // ç»“果:0 - å¤±è´¥
            messageEntity.DealWith = 0; // å¤„理状态:0 - æœªå¤„理
            messageEntity.ResultData = ex.Message; // é”™è¯¯è¯¦æƒ…
            _messageCenterManager.save(messageEntity);
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æ‰¹é‡ä¿å­˜é‡‡è´­é€€è´§ç”³è¯·å•
    /// </summary>
    [HttpPost("SaveList")]
    public ResponseResult SaveList(List<ErpCgth> erpCgthaList)
    {
        var messageEntity = new MessageCenter
        {
            TableName = _tableName,
            Url = _baseUrl + "SaveList",
            Method = _method,
            Data = JsonConvert.SerializeObject(erpCgthaList),
            Status = 1,
            CreateBy = "SYSTEM"
        };
        try
        {
            dynamic resultData = new ExpandoObject();
            var saveSuccess = _mesCgthSqManager.SaveList(erpCgthaList);
            resultData.totalCount = erpCgthaList.Count;
            resultData.successCount = saveSuccess ? erpCgthaList.Count : 0;
            messageEntity.Result = saveSuccess ? 1 : 0;
            messageEntity.DealWith = 1;
            _messageCenterManager.save(messageEntity);
            return new ResponseResult
            {
                status = 0,
                message = $"批量保存完成,共 {erpCgthaList.Count} æ¡æ•°æ®",
                data = resultData
            };
        }
        catch (Exception ex)
        {
            messageEntity.Result = 0;
            messageEntity.DealWith = 0;
            messageEntity.ResultData = ex.Message;
            _messageCenterManager.save(messageEntity);
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// èŽ·å–é‡‡è´­é€€è´§ç”³è¯·å•åˆ—è¡¨
    /// </summary>
    [HttpGet("GetList")]
    public ResponseResult GetList()
    {
        try
        {
            var cgthList = _mesCgthSqManager.GetList();
            return new ResponseResult
            {
                status = 0,
                message = "查询成功",
                data = new { total = cgthList.Count, list = cgthList }
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æ ¹æ® ID èŽ·å–é‡‡è´­é€€è´§ç”³è¯·å•è¯¦æƒ…
    /// </summary>
    [HttpGet("GetById")]
    public ResponseResult GetById(string id)
    {
        try
        {
            var cgthEntity = _mesCgthSqManager.GetById(Guid.Parse(id));
            return new ResponseResult
            {
                status = 0,
                message = "查询成功",
                data = cgthEntity
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æ–°å¢žé‡‡è´­é€€è´§ç”³è¯·å•(直接传入实体)
    /// </summary>
    [HttpPost("Insert")]
    public ResponseResult Insert([FromBody] MesCgthSq entity)
    {
        try
        {
// è‡ªåŠ¨ç”Ÿæˆä¸»é”® ID
            entity.Id = Guid.NewGuid();
            entity.CreateDate = DateTime.Now;
            var insertSuccess = _mesCgthSqManager.Insert(entity);
            return new ResponseResult
            {
                status = 0,
                message = insertSuccess ? "新增成功" : "新增失败",
                data = new { id = entity.Id }
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æ›´æ–°é‡‡è´­é€€è´§ç”³è¯·å•
    /// </summary>
    [HttpPost("Update")]
    public ResponseResult Update([FromBody] MesCgthSq entity)
    {
        try
        {
            entity.LastUpdateTime = DateTime.Now;
            var updateSuccess = _mesCgthSqManager.Update(entity);
            return new ResponseResult
            {
                status = 0,
                message = updateSuccess ? "更新成功" : "更新失败",
                data = updateSuccess
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
}