服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2025-02-20 35721fc8c34198b7cbc97f88213a3d25f24431c0
雅达-半成品入库打印
已修改3个文件
已重命名2个文件
315 ■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/In_SemiProd.cs 311 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/iERP/IMES_U9C.cs 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/iERP/IU9C_MES.cs 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
Tiger.Business.WMS/Transaction/In_SemiProd.cs
@@ -16,6 +16,8 @@
using Tiger.Model.MES.Yada;
using Apache.NMS.ActiveMQ.Commands;
using System.Diagnostics;
using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
using Tiger.Model.Entitys.MES.U9C;
namespace Tiger.Business.WMS.Transaction
{
@@ -24,6 +26,7 @@
    /// </summary>
    public class In_SemiProd : WMSTransactionBase, IIn_SemiProd
    {
        private readonly IMES_U9C _IMES_U9C = DI.Resolve<IMES_U9C>();
        public IIn_SemiProd Init(string id, string userCode, string apiHost, string orgCode)
        {
            TransID = id;
@@ -38,9 +41,18 @@
        public string UserCode { get; set; }
        public long UserId { get; set; }
        public string OrgCode { get; set; }
        public string LocationCode { get; set; }
        public List<V_WMS_ITEM> Vitem { get; set; } = new();
        public ScanShelfInfo CurScanShelf { get; set; }
        public List<V_WMS_ITEM> Vitem { get; set; } = new();
        public int pageSize { get; set; }
        public RcvRptDocCreateInput RcvRptInput { get; set; } = new RcvRptDocCreateInput();
        public List<ProdInBatch> ProdInBatchs { get; set; } = new List<ProdInBatch>();
        public List<BIZ_ERP_PROD_IN_BTH> ErpProdInBths { get; set; } = new List<BIZ_ERP_PROD_IN_BTH>();
        public List<BIZ_ERP_PROD_IN> ErpProdIns { get; set; } = new List<BIZ_ERP_PROD_IN>();
        /// <summary>
        /// 扫描列表
        /// </summary>
        public List<InStoreScanInfo> InStoreScanInfos { get; set; } = new List<InStoreScanInfo>();
        public List<BIZ_ERP_PROD_IN_SN> ErpProdInSns { get; set; } = new List<BIZ_ERP_PROD_IN_SN>();
        public InStoreInfos inStoreInfos { get; set; }
        #endregion
@@ -56,72 +68,157 @@
                if (input.SN.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L("WMS.RePrint.ScanItem.SnEmptyFailure");
                    action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.SnEmptyFailure");
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                var LotNos = Biz.DataSource["YadaU9C"].Client.Ado.SqlQuery<mes_WhLotCodeQtyInfo>($"select *,'' as ID from mes_WhLotCodeQtyInfo where Bin = '{input.SN}'");
                //Biz.DataSource["YadaU9C"].Client.Queryable<mes_WhLotCodeQtyInfo>().Where(t => t.Bin == input.SN).ToList();
                CurScanShelf = new ScanShelfInfo();
                // 查询货架信息
                var whUnit = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => (t.SHELF_CODE.ToUpper() == input.SN || t.LOCATION_CODE.ToUpper() == input.SN) && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                if (!whUnit.IsNullOrEmpty() && whUnit.LOCATION_CODE == input.SN)
                var wo = await Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == input.SN).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q._ItemInfos).FirstAsync();
                if (wo == null)
                {
                    if (whUnit.IS_ACTIVE == "N")
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("扫描的储位[{0}]未启用");
                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfOrLocationDisabled", input.SN);
                        return action;
                    }
                    if (whUnit.Shelf.IsLightShelf || whUnit.Location.IS_SINGLE == "Y")
                    {
                        var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == whUnit.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
                        if (!locationData.IsNullOrEmpty())
                        {
                            action.IsSuccessed = false;
                            //action.LocaleMsg = Biz.L("储位[{0}]已存有物料[{1}],请检查系统库存信息");
                            action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", input.SN, locationData.SN);
                            return action;
                        }
                    }
                    CurScanShelf.Shelf = whUnit.Shelf;
                    CurScanShelf.Location = whUnit.Location;
                    CurScanShelf.WarehouseCode = whUnit.WH_CODE;
                    CurScanShelf.RegionCode = whUnit.REGION_CODE;
                    CurScanShelf.ShelfCode = whUnit.SHELF_CODE;
                    CurScanShelf.LocationCode = whUnit.LOCATION_CODE;
                    CurScanShelf.IsSmartRack = false;
                    LocationCode = whUnit.LOCATION_CODE;
                }
                else {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("请输入或扫描有效的货架/储位码");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
                    action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.WoEmptyFailure", input.SN); // $"工单[{input.SN}]不存在"
                    return action;
                }
                var temps = new List<TemplateInput>();
                foreach (var item in LotNos)
                InStoreInfo Info = new()
                {
                    var temp = new TemplateInput
                    ErpProdInBth = new()
                    {
                        custCode="",
                        itemCode= item.ItemCode,
                        itemDesc= item.Description,
                        sapItemCode= item.SapCode,
                        WoBatch = item.LotCode,
                        batchQty= item.StoreQty,
                        qrCode="",
                        WORK_ORDER = wo.ORDER_NO,
                        BATCH_NO = "",
                        SALES_ORDER = wo.SALES_ORDER,
                        ITEM_CODE = wo.ITEM_CODE,
                        ITEM_NAME = wo.ItemInfo?.ITEM_DESC,
                        SapCode = wo.ItemInfo?.ExtInfo?.SapCode,
                        SCAN_QTY = input.Data.ToInt32(),
                        IS_HANDLED = "N" //Y-已生成,N-未生成,F-失败
                    },
                    InStoreScanInfo = new()
                    {
                        SN = "",
                        SALES_ORDER = wo.SALES_ORDER,
                        WORK_ORDER = wo.ORDER_NO,
                        BATCH_NO = "",
                        SCAN_QTY = input.Data.ToInt32()
                    }
                };
                //要存入的批次入库单数据
                int n = InStoreScanInfos.Where(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER).Count();
                if (!ErpProdInBths.Any(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER))
                {
                    Info.ErpProdInBth.AUTH_ORG = OrgCode;
                    Info.ErpProdInBth.BATCH_NO = "";
                    Info.ErpProdInBth.CREATE_USER = UserCode;
                    Info.ErpProdInBth.CREATE_TIME = DateTime.Now;
                    Info.ErpProdInBth.SCANED_DATE = DateTime.Now;
                    Info.ErpProdInBth.HANDLED_DATE = DateTime.Now;
                    Info.ErpProdInBth.IS_SCANED = "Y";
                    Info.ErpProdInBth.ORDER_NO = UserCode;
                    Info.ErpProdInBth.IS_HANDLED = "N";
                    Info.ErpProdInBth.CartonQty = n == 0 ? 1 : n;
                    BIZ_ERP_PROD_IN prodIn = new()
                    {
                        AUTH_ORG = OrgCode,
                        BILLCODE = UserCode,
                        BILLDATE = DateTime.Now,
                        STATUS = 0,
                        HANDLED = -1,
                        WAREHOUSECODE = "",
                        SOURCECODE = Info.ErpProdInBth.WORK_ORDER,
                        HANDLED_DATE = DateTime.Now,
                    };
                    temps.Add(temp);
                    ErpProdInBths.Add(Info.ErpProdInBth);
                    ErpProdIns.Add(prodIn);
                }
                //else
                //{
                //    if (!InStoreScanInfos.Any(q => q.WORK_ORDER == Info?.ErpProdInBth.WORK_ORDER && q.SN == CurSN))
                //    {
                //        var erpbth = ErpProdInBths.Where(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER).FirstOrDefault();
                //        if (!erpbth.IsNullOrEmpty())
                //        {
                //            erpbth.SCAN_QTY += Info.InStoreScanInfo.SCAN_QTY.ToDouble();
                //            erpbth.CartonQty = n + 1;
                //        }
                //    }
                //}
                //生成打印实体
                if (RcvRptInput.PrintJsons.Count == 0)
                {
                    RcvRptInput.PrintJsons.Add(new()
                    {
                        ID = Guid.NewGuid().ToString("N"),
                        Items = new() {
                            Info.ErpProdInBth
                        }
                    });
                }
                else
                {
                    //拼分页
                    bool isAdded = false;
                    foreach (var item in RcvRptInput.PrintJsons)
                    {
                        if (!item.Items.Any(q => q.WORK_ORDER == Info.ErpProdInBth.WORK_ORDER))
                        {
                            if (item.Items.Count < pageSize)
                            {
                                item.Items.Add(Info.ErpProdInBth);
                                isAdded = true;
                            }
                        }
                        else
                        {
                            isAdded = true;
                        }
                    }
                    if (!isAdded)
                    {
                        RcvRptInput.PrintJsons.Add(new()
                        {
                            ID = Guid.NewGuid().ToString("N"),
                            Items = new() {
                            Info.ErpProdInBth
                        }
                        });
                    }
                }
                var y = Biz.Db.Storageable(LotNos, UserCode)
                               .WhereColumns(t => new { t.ItemCode, t.LotCode })
                               .ToStorage();
                y.AsInsertable.ExecuteCommand();
                y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
                action.Data.Data = temps;
                action.LocaleMsg = Biz.L("WMS.RePrint.ScanItem.ScanSuccessed");
                //保存数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    var x = db.Storageable(ErpProdInBths, $"InStoreOrderNo_{UserCode}")
                             .WhereColumns(t => new { t.ORDER_NO, t.WORK_ORDER, t.GHOST_ROW })
                             .ToStorage();
                    x.AsInsertable.ExecuteCommand();
                    x.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
                    //var s = db.Storageable(ErpProdInSns, $"InStoreOrderNo_{UserCode}")
                    //            .WhereColumns(t => new { t.CARTONNO, t.SN, t.GHOST_ROW })
                    //            .ToStorage();
                    //s.AsInsertable.ExecuteCommand();
                    //s.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
                    this.Close(!dbTran.IsSuccess);
                    throw dbTran.ErrorException;
                }
                RcvRptInput.RcvRptDocBases = new();
                RcvRptInput.labels = new();
                RcvRptInput.ErpProdInBths = ErpProdInBths;
                RcvRptInput.userId = UserCode;
                inStoreInfos = new()
                {
                    ErpProdInBths = ErpProdInBths,
                    InStoreScanInfos = InStoreScanInfos,
                };
                action.Data.Data = inStoreInfos;
                action.LocaleMsg = Biz.L("WMS.InSemiProd.ScanItem.ScanSuccessed"); //$"工单条码[{input.SN}]扫描成功,请填入工单数量后点提交"
            }
            catch (Exception ex)
            {
@@ -145,6 +242,104 @@
            return action;
        }
        /// <summary>
        /// 调用U9C接口生成入库单
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public async Task<ApiAction<RcvRptDocCreateInput>> GenerateInStoreOrder()
        {
            var action = new ApiAction<RcvRptDocCreateInput>();
            try
            {
                //如果扫描记录为0
                if (!RcvRptInput.ErpProdInBths.Any(q => q.IS_HANDLED == "N"))
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L($"没有要入库的产品数据,请扫描包装完成的箱二维码重新生成入库单据!");
                    return action;
                }
                if (RcvRptInput.RcvRptDocBases.IsNullOrEmpty() || RcvRptInput.RcvRptDocBases.Count == 0)
                {
                    foreach (var item in RcvRptInput.ErpProdInBths)
                    {
                        var DocBase = new RcvRptDocBase()
                        {
                            WorkOrder = item.WORK_ORDER,
                            ItemCode = item.ITEM_CODE,
                            WhCode = "10105",
                            PkgQty = item.SCAN_QTY.ToInt32(),
                            CompleteQty = item.SCAN_QTY.ToInt32(),
                            OutputType = 0,
                            StorageType = 4,
                            DocState = 1,
                            Status = "N"
                        };
                        if (!RcvRptInput.RcvRptDocBases.Any(q => q.WorkOrder == item.WORK_ORDER))
                        {
                            RcvRptInput.RcvRptDocBases.Add(DocBase);
                        }
                    }
                }
                else
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = Biz.L($"有存在未提交的入库单,不能生成入库单");
                    return action;
                }
                action = await _IMES_U9C.RcvRptDocCreate(RcvRptInput);
                if (action.IsSuccessed)
                {
                    foreach (var sn in ErpProdInSns)
                    {
                        var d = action.Data.ErpProdInBths.Where(q => q.WORK_ORDER == sn.SOURCECODE).FirstOrDefault();
                        if (!d.IsNullOrEmpty())
                        {
                            sn.BUSINESSCODE = d.ORDER_NO;
                            sn.UPDATE_USER = UserCode;
                            sn.UPDATE_TIME = DateTime.Now;
                        }
                    }
                    foreach (var p in ErpProdIns)
                    {
                        var d = action.Data.ErpProdInBths.Where(q => q.WORK_ORDER == p.SOURCECODE).FirstOrDefault();
                        if (!d.IsNullOrEmpty())
                        {
                            p.BILLCODE = d.ORDER_NO;
                            p.UPDATE_USER = UserCode;
                            p.UPDATE_TIME = DateTime.Now;
                            p.HANDLED = 0;
                        }
                    }
                    //保存数据库
                    var db = Business.Biz.Db;
                    var dbTran = db.UseTran(() =>
                    {
                        db.Updateable(ErpProdInSns, $"InStoreOrderNo_{UserCode}").UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.BUSINESSCODE }).ExecuteCommand();
                        var x = db.Storageable(ErpProdIns, $"InStoreOrderNo_{UserCode}")
                                 .WhereColumns(t => new { t.BILLCODE, t.SOURCECODE, t.GHOST_ROW })
                                 .ToStorage();
                        x.AsInsertable.ExecuteCommand();
                        x.AsUpdateable.IgnoreColumns(x => x.ID).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, $"调用U9C接口生成入库单异常");
            }
            return action;
        }
        #endregion
        public override bool Close(bool needSaveHistoryLog = false)
Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj
@@ -13,4 +13,8 @@
    <ProjectReference Include="..\Tiger.IBusiness\Tiger.IBusiness.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="iERP\" />
  </ItemGroup>
</Project>
Tiger.IBusiness/iERP/IMES_U9C.cs
Tiger.IBusiness/iERP/IU9C_MES.cs