服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-12-25 c4c9228d894b455327c76a6e286e394513ef542a
生成入库单更新
已修改6个文件
420 ■■■■ 文件已修改
Tiger.Business.MES/Transaction/InStoreOrderNo.cs 225 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/iERP/MES_U9C.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Controllers.MES/Controllers/MESController.InStoreOrderNo.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.MES/Transaction/IInStoreOrderNo.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_ERP_PROD_IN_BTH.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/InStoreOrderNo.cs
@@ -38,7 +38,7 @@
            OrgCode = input.OrgCode;
            pageSize = input.pageSize;
            _GetScannedList();
            CurBatchNo = !inStoreInfos.IsNullOrEmpty() && inStoreInfos.InStoreScanInfos.Count>0? InStoreScanInfos[0].BATCH_NO: DateTime.Now.ToString("yyyyMMddHHmmss");
            CurBatchNo = !inStoreInfos.IsNullOrEmpty() && inStoreInfos.InStoreScanInfos.Count > 0 ? InStoreScanInfos[0].BATCH_NO : DateTime.Now.ToString("yyyyMMddHHmmss");
            Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
            return this;
        }
@@ -66,8 +66,9 @@
        #region Functions
        public ApiAction<InStoreInfos> GetInStoreInfos() {
            return new() { Data= inStoreInfos };
        public ApiAction<InStoreInfos> GetInStoreInfos()
        {
            return new() { Data = inStoreInfos };
        }
        /// <summary>
        /// 扫描条码
@@ -230,7 +231,7 @@
                RcvRptInput.labels = new();
                RcvRptInput.ErpProdInBths = ErpProdInBths;
                RcvRptInput.userId = UserCode;
                inStoreInfos= new()
                inStoreInfos = new()
                {
                    ErpProdInBths = ErpProdInBths,
                    InStoreScanInfos = InStoreScanInfos,
@@ -294,7 +295,7 @@
                {
                    foreach (var sn in ErpProdInSns)
                    {
                        var d = action.Data.ErpProdInBths.Where(q=> q.WORK_ORDER == sn.SOURCECODE).FirstOrDefault();
                        var d = action.Data.ErpProdInBths.Where(q => q.WORK_ORDER == sn.SOURCECODE).FirstOrDefault();
                        if (!d.IsNullOrEmpty())
                        {
                            sn.BUSINESSCODE = d.ORDER_NO;
@@ -345,12 +346,13 @@
        /// 查询已扫描列表
        /// </summary>
        /// <returns></returns>
        public async Task<ApiAction<RcvRptDocCreateInput>> GetScannedList()
        public async Task<ApiAction<InStoreInfos>> GetScannedList()
        {
            var action = new ApiAction<RcvRptDocCreateInput>();
            var action = new ApiAction<InStoreInfos>();
            try
            {
                action.Data = _GetScannedList();
                _GetScannedList();
                action.Data = inStoreInfos;
            }
            catch (Exception ex)
            {
@@ -366,40 +368,71 @@
        private RcvRptDocCreateInput _GetScannedList()
        {
            RcvRptInput.RcvRptDocBases = new();
            RcvRptInput.ErpProdInBths = new();
            RcvRptInput.PrintJsons = new();
            RcvRptInput.labels = new();
            RcvRptInput.userId = UserCode;
            if (RcvRptInput.ErpProdInBths.Count == 0)
            ErpProdInSns.Clear();
            ErpProdIns.Clear();
            ErpProdInBths.Clear();
            InStoreScanInfos.Clear();
            RcvRptInput.ErpProdInBths = Biz.Db.Queryable<BIZ_ERP_PROD_IN_BTH>()
                .Where(q => q.BATCH_NO == SqlFunc.Subqueryable<BIZ_ERP_PROD_IN_BTH>().Where(s => s.ORDER_NO == UserCode && s.GHOST_ROW == false).Select(s => s.BATCH_NO))
                .IncludesAllFirstLayer().ToList();
            foreach (var item in RcvRptInput.ErpProdInBths)
            {
                RcvRptInput.ErpProdInBths = Biz.Db.Queryable<BIZ_ERP_PROD_IN_BTH>()
                    .Where(q => q.BATCH_NO == SqlFunc.Subqueryable<BIZ_ERP_PROD_IN_BTH>().Where(s => s.ORDER_NO == UserCode).Select(s => s.BATCH_NO))
                    .IncludesAllFirstLayer().ToList();
                foreach (var item in RcvRptInput.ErpProdInBths)
                var values = item.ProdInSns.GroupBy(x => x.CARTONNO)
                    .Select(g => new InStoreScanInfo() { SN = g.Key, SALES_ORDER = item.SALES_ORDER, BATCH_NO = item.BATCH_NO, WORK_ORDER = item.WORK_ORDER, SCAN_QTY = g.Sum(x => x.Qty).ToDouble() });
                foreach (var t in values)
                {
                    var values = item.ProdInSns.GroupBy(x => x.CARTONNO)
                        .Select(g => new InStoreScanInfo() { SN = g.Key, SALES_ORDER = item.SALES_ORDER, BATCH_NO = item.BATCH_NO, WORK_ORDER = item.WORK_ORDER, SCAN_QTY = g.Sum(x => x.Qty).ToDouble() });
                    foreach (var t in values)
                    InStoreScanInfos.Add(t);
                }
                item.CartonQty = values.Count();
                ErpProdIns.Add(new()
                {
                    AUTH_ORG = OrgCode,
                    BILLCODE = UserCode,
                    BILLDATE = DateTime.Now,
                    STATUS = 0,
                    HANDLED = -1,
                    WAREHOUSECODE = "",
                    SOURCECODE = item.WORK_ORDER,
                    HANDLED_DATE = DateTime.Now,
                });
                ErpProdInSns.AddRange(item.ProdInSns);
                //生成打印实体
                if (RcvRptInput.PrintJsons.Count == 0)
                {
                    RcvRptInput.PrintJsons.Add(new()
                    {
                        InStoreScanInfos.Add(t);
                        ID = Guid.NewGuid().ToString("N"),
                        Items = new() {
                            item
                        }
                    });
                }
                else
                {
                    //拼分页
                    bool isAdded = false;
                    foreach (var p in RcvRptInput.PrintJsons)
                    {
                        if (!p.Items.Any(q => q.WORK_ORDER == item.WORK_ORDER))
                        {
                            if (p.Items.Count < pageSize)
                            {
                                p.Items.Add(item);
                                isAdded = true;
                            }
                        }
                        else
                        {
                            isAdded = true;
                        }
                    }
                    item.CartonQty = values.Count();
                    BIZ_ERP_PROD_IN prodIn = new()
                    {
                        AUTH_ORG = OrgCode,
                        BILLCODE = UserCode,
                        BILLDATE = DateTime.Now,
                        STATUS = 0,
                        HANDLED = -1,
                        WAREHOUSECODE = "",
                        SOURCECODE = item.WORK_ORDER,
                        HANDLED_DATE = DateTime.Now,
                    };
                    ErpProdIns.Add(prodIn);
                    ErpProdInSns.AddRange(item.ProdInSns);
                    //生成打印实体
                    if (RcvRptInput.PrintJsons.Count == 0)
                    if (!isAdded)
                    {
                        RcvRptInput.PrintJsons.Add(new()
                        {
@@ -409,40 +442,10 @@
                        }
                        });
                    }
                    else
                    {
                        //拼分页
                        bool isAdded = false;
                        foreach (var p in RcvRptInput.PrintJsons)
                        {
                            if (!p.Items.Any(q => q.WORK_ORDER == item.WORK_ORDER))
                            {
                                if (p.Items.Count < pageSize)
                                {
                                    p.Items.Add(item);
                                    isAdded = true;
                                }
                            }
                            else
                            {
                                isAdded = true;
                            }
                        }
                        if (!isAdded)
                        {
                            RcvRptInput.PrintJsons.Add(new()
                            {
                                ID = Guid.NewGuid().ToString("N"),
                                Items = new() {
                            item
                        }
                            });
                        }
                    }
                }
                ErpProdInBths = RcvRptInput.ErpProdInBths;
            }
            ErpProdInBths = RcvRptInput.ErpProdInBths;
            inStoreInfos = new()
            {
                ErpProdInBths = ErpProdInBths,
@@ -451,6 +454,94 @@
            return RcvRptInput;
        }
        /// <summary>
        /// 删除箱
        /// </summary>
        /// <param name="SN"></param>
        /// <returns></returns>
        public async Task<ApiAction> Delete(string CartonNo)
        {
            var action = new ApiAction();
            try
            {
                var ErpProdInSn = ErpProdInSns.Where(s => s.CARTONNO == CartonNo).ToList();
                BIZ_ERP_PROD_IN_BTH erpbth = new();
                if (!ErpProdInSn.IsNullOrEmpty())
                {
                    erpbth = ErpProdInBths.Where(q => q.WORK_ORDER == ErpProdInSn[0].SOURCECODE).FirstOrDefault();
                    if (!erpbth.IsNullOrEmpty())
                    {
                        erpbth.SCAN_QTY -= ErpProdInSn.Count(q => q.CARTONNO == CartonNo);
                        erpbth.CartonQty--;
                    }
                }
                //保存数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    db.Deleteable<BIZ_ERP_PROD_IN_SN>().Where(x => x.BUSINESSCODE == UserCode && x.CARTONNO == CartonNo).ExecuteCommand();
                    db.Updateable(erpbth, $"InStoreOrderNo_{UserCode}").ExecuteCommand();
                    if (erpbth.CartonQty == 0)
                    {
                        db.Deleteable(erpbth).ExecuteCommand();
                    }
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction delete exception");
                    this.Close(!dbTran.IsSuccess);
                    throw dbTran.ErrorException;
                }
            }
            catch (Exception ex)
            {
                action.CatchExceptionWithLog(ex, $"查询已扫描列表异常");
            }
            return action;
        }
        /// <summary>
        /// 清除
        /// </summary>
        /// <returns></returns>
        public async Task<ApiAction> Clear()
        {
            var action = new ApiAction();
            try
            {
                RcvRptInput = new();
                ProdInBatchs = new() { };
                ErpProdInBths = new() { };
                ErpProdIns = new();
                /// <summary>
                /// 扫描列表
                /// </summary>
                InStoreScanInfos = new() { };
                ErpProdInSns = new();
                inStoreInfos = new() { };
                //保存数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    db.Deleteable<BIZ_ERP_PROD_IN_BTH>().Where(x => x.ORDER_NO == UserCode && x.IS_HANDLED == "N").ExecuteCommand();
                    db.Deleteable<BIZ_ERP_PROD_IN_SN>().Where(x => x.BUSINESSCODE == UserCode).ExecuteCommand();
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
                    this.Close(!dbTran.IsSuccess);
                    throw dbTran.ErrorException;
                }
            }
            catch (Exception ex)
            {
                action.CatchExceptionWithLog(ex, $"查询已扫描列表异常");
            }
            return action;
        }
        #endregion Functions
        public override bool Close(bool needSaveHistoryLog = false)
Tiger.Business.MES/iERP/MES_U9C.cs
@@ -26,13 +26,16 @@
{
    public partial class MES_U9C : IMES_U9C
    {
        public static string U9CAuthLoginUrl { get; set; } = Cache.SysParam["U9CAuthLoginUrl_Test", "U9CUrl"].PARAM_VALUE; // "http://172.16.80.20/U9C/webapi/OAuth2/AuthLogin?"; 测试
        public static string U9CAuthLoginUrl { get; set; } = ApiConfig.IsTestServer ? Cache.SysParam["U9CAuthLoginUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["U9CAuthLoginUrl", "U9CUrl"].PARAM_VALUE; // "http://172.16.80.20/U9C/webapi/OAuth2/AuthLogin?"; 测试
        //public static string U9CAuthLoginUrl { get; set; } = Cache.SysParam["U9CAuthLoginUrl", "U9CUrl"].PARAM_VALUE; //正式
        public static string secret = "&entcode=02&orgcode=101&clientid=mes&clientsecret=12c8ee7e9bb74ad2a6a0fb3315c8af20";
        public static string RcvRptDocCreateUrl
        { get; set; } = Cache.SysParam["RcvRptDocCreateUrl_Test", "U9CUrl"].PARAM_VALUE;  //"http://172.16.80.20/u9C/webapi/RcvRptDoc/Create"; 测试
        { get; set; } = ApiConfig.IsTestServer ? Cache.SysParam["RcvRptDocCreateUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["RcvRptDocCreateUrl", "U9CUrl"].PARAM_VALUE;  //"http://172.16.80.20/u9C/webapi/RcvRptDoc/Create"; 测试
        //public static string RcvRptDocCreateUrl
        //{ get; set; } = Cache.SysParam["RcvRptDocCreateUrl", "U9CUrl"].PARAM_VALUE;  //正式
        public static string U9CBarcodeCreateUrl
        { get; set; } = ApiConfig.IsTestServer ? Cache.SysParam["U9CBarcodeCreateUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["U9CBarcodeCreateUrl", "U9CUrl"].PARAM_VALUE;
        /// <summary>
        /// 入库单接口
@@ -132,6 +135,15 @@
                                    }
                                }
                                Logger.Interface.Info($"生成入库单成功");
                                //条码主档
                                BarcodeCreateInput barcodeCreateInput = new() {
                                    RevDocId = result.Data[0].m_iD,
                                    userId = input.userId,
                                    token = token,
                                    IsLogin = false,
                                };
                                U9CBarcodeCreate(barcodeCreateInput);
                            }
                            else
                            {
@@ -179,6 +191,65 @@
            return action;
        }
        /// <summary>
        /// 入库单条码主档接口
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<ApiAction<BarcodeCreateInput>> U9CBarcodeCreate(BarcodeCreateInput input)
        {
            Logger.Interface.Info($"/**\r\n *进入入库单条码主档接口....\r\n */\r\n"); //固定写法
            var action = new ApiAction<BarcodeCreateInput>();
            try
            {
                if (input.IsLogin)
                {
                    var u9CLoginResult = await HttpHelper.GetAsync<U9CLoginResult>($"{U9CAuthLoginUrl}userCode={input.userId}{secret}");
                    if (u9CLoginResult.Success)
                    {
                        input.token = u9CLoginResult.Data;
                        Logger.Interface.Info($"U9C登录token: {input.token}");
                    }
                }
                List<BarcodeCreateParam> param = new() {
                     new() {
                     CreateEntityKeys = new(){
                                           new CreateEntityKeys
                                           {
                                                ID = input.RevDocId, //入库单ID
                                                EntityType="UFIDA.U9.Complete.RCVRpt.RcvRptDoc"
                                           }
                                        },
                                        IsCreateHeadBarCode = true,
                                        BarCodeRuleCode = "DJCPRK01",
                                        GenerateCount = 1,
                                        BCQty = 1,
                     }
                };
                var response = await HttpHelper.PostAsync(U9CBarcodeCreateUrl, JsonConvert.SerializeObject(param), new Dictionary<string, string>() { { "token", input.token } });
                var result = JsonConvert.DeserializeObject<U9CResult>(response.Message);
                if (result != null)
                {
                    if (result.Success && result.Data[0].m_isSucess)
                    {
                        Logger.Interface.Info($"生成入库单条码主档接口提交Json: {JsonConvert.SerializeObject(param)},返回Json: {response.Message}");
                    }
                    else
                    {
                        action.IsSuccessed = false;
                        action.LocaleMsg = new($"{action.Message}; {result.Data[0].m_errorMsg}");
                        Logger.Interface.Info($"生成入库单条码主档失败:{result.Data[0].m_errorMsg}");
                    }
                }
            }
            catch (System.Exception ex)
            {
                action.CatchExceptionWithLog(ex, "生成入库单条码主档异常");
            }
            Logger.Interface.Info($"/* 入库单条码主档接口结束 */\r\n"); //固定写法
            return action;
        }
        private List<BAS_LABEL_TEMP> GetLabels(List<InStorePrintJson> printJsons)
        {
            List<BAS_LABEL_TEMP> labels = new List<BAS_LABEL_TEMP>();
Tiger.Controllers.MES/Controllers/MESController.InStoreOrderNo.cs
@@ -238,5 +238,95 @@
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// 清除
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/InStoreOrderNo/Clear")]
        public async Task<IActionResult> InStoreOrderNo_ClearAsync([FromBody] ApiAction action)
        {
            ApiAction response;
            IInStoreOrderNo trans = null;
            try
            {
                if (iBiz.MES.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.MES.Context.GetTransDic()[action.ID] as IInStoreOrderNo;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.Clear());
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.Clear().Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: 入库单事务[ID:{action.ID}]已经关闭", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: 入库单事务[ID:{action.ID}]已经被关闭", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/InStoreOrderNo/Delete")]
        public async Task<IActionResult> InStoreOrderNo_DeleteAsync([FromBody] ApiAction action)
        {
            ApiAction response;
            IInStoreOrderNo trans = null;
            try
            {
                if (iBiz.MES.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.MES.Context.GetTransDic()[action.ID] as IInStoreOrderNo;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.Delete(action.Data?.ToString()));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.Delete(action.Data?.ToString()).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: 入库单事务[ID:{action.ID}]已经关闭", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: 入库单事务[ID:{action.ID}]已经被关闭", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
    }
}
Tiger.IBusiness.MES/Transaction/IInStoreOrderNo.cs
@@ -15,9 +15,10 @@
        public IInStoreOrderNo Init(string id, string apiHost, InstoreDocInput input);
        public Task<ApiAction<InStoreInfos>> Submit(string code);
        public Task<ApiAction<RcvRptDocCreateInput>> GenerateInStoreOrder();
        public Task<ApiAction<RcvRptDocCreateInput>> GetScannedList();
        public Task<ApiAction<InStoreInfos>> GetScannedList();
        public ApiAction<InStoreInfos> GetInStoreInfos();
        public Task<ApiAction> Clear();
        public Task<ApiAction> Delete(string CartonNo);
        public bool Close(bool needSaveHistoryLog = false);
    }
}
Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs
@@ -97,6 +97,29 @@
        public int DocState { get; set; } = 1;
    }
    public class BarcodeCreateInput
    {
        public string RevDocId { get; set; }
        public string userId { get; set; }
        public string token { get; set; }
        public bool IsLogin { get; set; }
    }
    public class BarcodeCreateParam
    {
        public List<CreateEntityKeys> CreateEntityKeys { get; set; }
        public bool IsCreateHeadBarCode { get; set; }
        public string BarCodeRuleCode { get; set; }
        public int GenerateCount { get; set; }
        public int BCQty { get; set; }
    }
    public class CreateEntityKeys
    {
        public string ID { get; set; }
        public string EntityType { get; set; }
    }
    public class MOKey
    {
        public string DocNo { get; set; }
Tiger.Model.Net/Entitys/WMS/BIZ_ERP_PROD_IN_BTH.cs
@@ -132,7 +132,7 @@
        [Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_ERP_PROD_IN_BTHId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        [Navigate(NavigateType.OneToMany, nameof(BIZ_ERP_PROD_IN_SN.BUSINESSCODE), nameof(ORDER_NO), "GHOST_ROW = 0")]//一对一 ClassAId是BIZ_MES_WO类里面的外键ID字段
        [Navigate(NavigateType.OneToMany, nameof(BIZ_ERP_PROD_IN_SN.SOURCECODE), nameof(WORK_ORDER), "GHOST_ROW = 0")]//一对一 ClassAId是BIZ_MES_WO类里面的外键ID字段
        public List<BIZ_ERP_PROD_IN_SN> ProdInSns { get; set; }
        #endregion