using System; using SqlSugar; using Infrastructure.Attribute; using ZR.Model; using ZR.Repository; using ZR.Service.mes.wms.IService; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; using Mapster; using System.Collections.Generic; using System.Data; using JinianNet.JNTemplate.Dynamic; namespace ZR.Service.mes.wms { /// /// 出货单(物料+客户)Service业务层处理 /// [AppService(ServiceType = typeof(IWmOutOrderService), ServiceLifetime = LifeTime.Transient)] public class WmOutOrderService : BaseService, IWmOutOrderService { /// /// 查询出货单(物料+客户)列表 /// /// /// public PagedInfo GetList(WmOutOrderQueryDto parm) { var predicate = Expressionable.Create(); var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } /// /// 获取详情 /// /// /// public WmOutOrder_material_num GetInfo(string ShipmentNum) { WmOutOrder WmOutOrderList = Context.Queryable() .Where(it => it.ShipmentNum == ShipmentNum) .First(); WmOutOrder_material_num wmOutOrderItem = null; if (WmOutOrderList != null) { wmOutOrderItem = WmOutOrderList.Adapt(); List moList = Context.Queryable() .Where(it => it.FkOutorderId == WmOutOrderList.ShipmentNum) .ToList(); if (moList != null && moList.Count > 0) { List Material_stock = new List(); foreach (var moItem in moList) { WmMaterial material = Context.Queryable().Where(it => it.Id == moItem.FkMaterialId).First(); WmMaterialQuery_stockQuantityDto2 dto2 = material.Adapt(); dto2.requireOutNum = moItem.OuthouseNum; Material_stock.Add(dto2); } wmOutOrderItem.MaterialList = Material_stock; } } return wmOutOrderItem; } /// /// 添加出货单(物料+客户) /// /// /// public WmOutOrder AddWmOutOrder(WmOutOrder_materialDto model) { string today_id = "EG" + DateTime.Now.ToString("yyMMdd"); string last_outorder_ShipmentNum = Context.Queryable().Where(it => it.ShipmentNum.StartsWith(today_id)).Max(it => it.ShipmentNum); if (string.IsNullOrEmpty(last_outorder_ShipmentNum)) { model.ShipmentNum = today_id + "001"; } else { int flow = int.Parse(last_outorder_ShipmentNum.Substring(last_outorder_ShipmentNum.Length - 3, 3)) + 1; model.ShipmentNum = today_id + flow.ToString("000"); } WmOutOrder wmOutOrder = model.Adapt(); // 关联表也要新增 if (model.MaterialList != null) { if (model.MaterialList.Count > 0) { List materialOutorderList = new List(); foreach (var item in model.MaterialList) { WmMaterialOutorder materialOutorder = new WmMaterialOutorder(); materialOutorder.FkMaterialId = item.Id; materialOutorder.FkOutorderId = model.ShipmentNum; materialOutorder.OuthouseNum = item.requireOutNum; materialOutorder.CreatedBy = model.CreatedBy; materialOutorder.CreatedTime = DateTime.Now; materialOutorderList.Add(materialOutorder); }; int result = Context.Insertable(materialOutorderList).ExecuteCommand(); } } return Context.Insertable(wmOutOrder).ExecuteReturnEntity(); } /// /// 修改出货单(物料+客户) /// /// /// public int UpdateWmOutOrder(WmOutOrder model) { //var response = Update(w => w.ShipmentNum == model.ShipmentNum, it => new WmOutOrder() //{ // CustomNo = model.CustomNo, // CustomName = model.CustomName, // CustomAddress = model.CustomAddress, // Remarks = model.Remarks, // Type = model.Type, // Status = model.Status, // Year = model.Year, // Week = model.Week, // Date = model.Date, // CreatedBy = model.CreatedBy, // CreatedTime = model.CreatedTime, // UpdatedBy = model.UpdatedBy, // UpdatedTime = model.UpdatedTime, //}); //return response; return Update(model, true); } /// /// 获取用户信息 /// /// public List GetCustominfo() { return Context.Queryable().ToList(); } /// /// 查询物料记录表列表 /// /// /// public (List, int) GetmaterialList(WmMaterialQueryDto parm) { int total = 0; var predicate = Expressionable.Create() .AndIF(parm.Partnumber != null, it => it.Partnumber.Contains(parm.Partnumber)) .AndIF(parm.U8InventoryCode != null, it => it.U8InventoryCode.Contains(parm.U8InventoryCode)) .AndIF(parm.ProductName != null, it => it.ProductName.Contains(parm.ProductName)) .AndIF(parm.Color != null, it => it.Color.Contains(parm.Color)) .AndIF(parm.Specification != null, it => it.Specification.Contains(parm.Specification)) .AndIF(parm.Description != null, it => it.Description.Contains(parm.Description)) .AndIF(parm.Search1 != null, it => it.Search1.Contains(parm.Search1) || it.Search2.Contains(parm.Search1)) .AndIF(parm.Status > -1, it => it.Status == parm.Status); List materialList = Context.Queryable() .Where(predicate.ToExpression()).OrderByDescending(it => it.CreatedTime) .ToPageList(parm.PageNum, parm.PageSize, ref total); List material_stockQuantity_list = new List(); if (materialList.Count > 0) { foreach (WmMaterial item in materialList) { WmMaterialQuery_stockQuantityDto wmMaterialQuery_Stock_item = item.Adapt(); int material_num = 0; List productioList = Context .Queryable() .Where(it => it.Partnumber == item.Partnumber) .ToList(); if (productioList.Count > 0) { foreach (var product in productioList) { material_num = material_num + (int)product.GoodsNumLogic; } } wmMaterialQuery_Stock_item.stockQuantity = material_num; material_stockQuantity_list.Add(wmMaterialQuery_Stock_item); } } return (material_stockQuantity_list, total); } /// /// 查询出货单的物料信息 /// /// /// public List Queryoutoder_matrials(string shipment_num) { List stockList = Context.Queryable() .LeftJoin((mo, m) => mo.FkMaterialId == m.Id) .Where(mo => mo.FkOutorderId == shipment_num) .Select((mo, m) => new WmMaterialQuery_print() { //物料号 Partnumber = m.Partnumber, // 描述 ProductName = m.ProductName, //需求零件数 RequireOutNum = mo.OuthouseNum }).ToList(); if (stockList != null && stockList.Count > 0) { foreach (var stock in stockList) { //现有箱数 stock.PackageNum = Context.Queryable().Where(it => it.Partnumber == shipment_num).Count(); //现有零件数 int? num = Context.Queryable().Where(it => it.Partnumber == shipment_num).Sum(it => it.GoodsNumLogic); stock.PackageNum = num ?? 0; } } return stockList; } /// /// 生成出货单的出货计划 /// /// 出货单号 /// public List Generate_outorderplan(string shipment_num) { List wmOutOrderPlans = new List(); // 获取当前出货单下的物料信息 List materialQuery_Prints = this.Queryoutoder_matrials(shipment_num); if (materialQuery_Prints != null && materialQuery_Prints.Count > 0) { foreach (var material in materialQuery_Prints) { //todo 判断要出多少货 按照最早工单和批次号 进行出货(重要算法) //1. 这个物料要出多少货 int require_num = material.RequireOutNum; // 物料号 string partnumber = material.Partnumber; /*此物料下的最早列表 List wmGoodsNows = Context.Queryable().Where(it => it.Partnumber == partnumber) .OrderByDescending(it => it.EntryWarehouseTime).ToList(); if (wmGoodsNows != null && wmGoodsNows.Count > 0) { foreach (var witem in wmGoodsNows) { if (require_num >= witem.GoodsNumLogic) { // 取出同一批次下列表 string patchcode = witem.PackageCodeClient.Split("_")[0]; List Samebatch_wmGoodsNows = Context.Queryable() .Where(it => it.Partnumber == partnumber) .Where(it => it.PackageCodeClient.StartsWith(patchcode)).ToList(); 出货计划 WmOutOrderPlan orderPlan = new WmOutOrderPlan(); orderPlan.FkOutOrderId = shipment_num; orderPlan.Patchcode = witem.PackageCodeClient; orderPlan.MaterialCode = witem.Partnumber; orderPlan.WarehouseCode = witem.LocationCode; orderPlan.PackageNum = 1; orderPlan.RequireNum = require_num; orderPlan.Patchtime = Resolution_bath(witem.PackageCodeClient); wmOutOrderPlans.Add(orderPlan); } else { 一个箱子就可以做一个出货计划 WmOutOrderPlan orderPlan = new WmOutOrderPlan(); orderPlan.FkOutOrderId = shipment_num; orderPlan.Patchcode = witem.PackageCodeClient; orderPlan.MaterialCode = witem.Partnumber; orderPlan.WarehouseCode = witem.LocationCode; orderPlan.PackageNum = 1; orderPlan.RequireNum = require_num; orderPlan.Patchtime = Resolution_bath(witem.PackageCodeClient); } } }*/ List wmGoodsNowsList = Context.Queryable().Where(it => it.Partnumber == partnumber) .OrderByDescending(it => it.PackageCodeClient).ToList(); foreach(var witem in wmGoodsNowsList) { int accumulation_num = 0; if (require_num>= accumulation_num) { WmOutOrderPlan orderPlan = new WmOutOrderPlan(); orderPlan.FkOutOrderId = shipment_num; orderPlan.Patchcode = witem.PackageCodeClient; orderPlan.MaterialCode = witem.Partnumber; orderPlan.WarehouseCode = witem.LocationCode; orderPlan.PackageNum =int.Parse( witem.PackageCodeClient.Split("_")[1] ); orderPlan.RequireNum = require_num; orderPlan.Patchtime = Resolution_bath(witem.PackageCodeClient); wmOutOrderPlans.Add(orderPlan); accumulation_num = accumulation_num+ witem.GoodsNumLogic??0; } else { //超了 break; } } } } foreach (var witem in wmOutOrderPlans) { witem.Outorder = wmOutOrderPlans.IndexOf(witem); } return wmOutOrderPlans; } /// /// 传入批次号 解析出时间 BNW240318007_105 /// /// /// private string Resolution_bath(string bath_code) { if (string.IsNullOrEmpty(bath_code)) { return ""; } string temp = bath_code.Split("_")[0]; return "20" + temp.Substring(2, 6); } } }