|
|
|
@ -0,0 +1,247 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using BWP.B3Frameworks; |
|
|
|
using BWP.B3Frameworks.BO.NamedValueTemplate; |
|
|
|
using BWP.B3Frameworks.Utils; |
|
|
|
using BWP.B3Sale.BL; |
|
|
|
using BWP.B3Sale.BO; |
|
|
|
using BWP.B3Sale.Utils; |
|
|
|
using BWP.B3UnitedInfos.BO; |
|
|
|
using Forks.EnterpriseServices.DomainObjects2; |
|
|
|
using Forks.EnterpriseServices.DomainObjects2.DQuery; |
|
|
|
using Forks.Utils; |
|
|
|
using TSingSoft.WebPluginFramework; |
|
|
|
|
|
|
|
namespace B3_QiLianMuGe.Utils |
|
|
|
{ |
|
|
|
[TypeIOC(typeof(SaleOutStoreBL), typeof(SaleOutStoreBL.ICreateInOutStoreBill))] |
|
|
|
public class CreateInOutStoreBillIOC : SaleOutStoreBL.ICreateInOutStoreBill |
|
|
|
{ |
|
|
|
public void Invoke(IDmoSession session, SaleOutStore saleOutStore, InOutStoreBill target, ref bool flag) |
|
|
|
{ |
|
|
|
SetInOutStoreBillDetailByWeightInfos(session, saleOutStore, target); |
|
|
|
if (target.Details.Count > 0) |
|
|
|
flag = true; |
|
|
|
else |
|
|
|
flag = false; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 处理扫条码按条码的生产批次对应的存货批次出库
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dmo"></param>
|
|
|
|
/// <param name="target"></param>
|
|
|
|
private void SetInOutStoreBillDetailByWeightInfos(IDmoSession Session,SaleOutStore dmo, InOutStoreBill target) |
|
|
|
{ |
|
|
|
var query = new DQueryDom(new JoinAlias(typeof(WeightingInfor))); |
|
|
|
query.Columns.Add(DQSelectColumn.Field("DetailID")); |
|
|
|
query.Columns.Add(DQSelectColumn.Field("Goods_ID")); |
|
|
|
query.Columns.Add(DQSelectColumn.Field("Product_Batch")); |
|
|
|
query.Columns.Add(DQSelectColumn.Sum("MainUnitNum")); |
|
|
|
query.Columns.Add(DQSelectColumn.Sum("SecondNumber")); |
|
|
|
query.Where.Conditions.Add(DQCondition.EQ("BillType", DmoTypeIDAttribute.GetID(typeof(SaleOutStore)))); |
|
|
|
query.Where.Conditions.Add(DQCondition.EQ("BillID", dmo.ID)); |
|
|
|
query.GroupBy.Expressions.Add(DQExpression.Field("DetailID")); |
|
|
|
query.GroupBy.Expressions.Add(DQExpression.Field("Goods_ID")); |
|
|
|
query.GroupBy.Expressions.Add(DQExpression.Field("Product_Batch")); |
|
|
|
var tuples = query.EExecuteList<long, long?, string, Money<decimal>?, Money<decimal>?>(Session); |
|
|
|
if (tuples.Count() > 0) |
|
|
|
{ |
|
|
|
var results = tuples.Where(x => string.IsNullOrEmpty(x.Item3) && x.Item4 > 0); |
|
|
|
foreach (var result in results) |
|
|
|
{ |
|
|
|
var oDetails = dmo.Details.Where(x => x.ID == result.Item1); |
|
|
|
if (oDetails.Count() > 0) |
|
|
|
{ |
|
|
|
var detail = oDetails.First(); |
|
|
|
detail.UnitNum = result.Item4; |
|
|
|
detail.Number = result.Item4; |
|
|
|
detail.SecondNumber = result.Item5; |
|
|
|
detail.GoodsBatch_ID = null; |
|
|
|
var dic = new Dictionary<long, List<TmpData>>(); |
|
|
|
var outDetails = AddDetailByPdAndBatchNo(Session, dmo, detail, dic); |
|
|
|
foreach (var item in outDetails) |
|
|
|
{ |
|
|
|
var targetDetail = new InOutStoreBill_Detail(); |
|
|
|
target.Details.Add(targetDetail); |
|
|
|
var details = dmo.Details.Where(x => x.ID == detail.ID); |
|
|
|
SaleOutStore_Detail outDetail = null; |
|
|
|
if (details.Count() > 0) |
|
|
|
{ |
|
|
|
outDetail = details.First(); |
|
|
|
} |
|
|
|
if (dmo.BusinessProperty == B3Sale业务属性.正常出库) |
|
|
|
targetDetail.Store_ID = dmo.Store_ID ?? 0; |
|
|
|
else |
|
|
|
{ |
|
|
|
if (outDetail != null) |
|
|
|
targetDetail.Store_ID = outDetail.Store_ID ?? 0; |
|
|
|
} |
|
|
|
targetDetail.Goods_ID = item.SaleGoods_ID; |
|
|
|
targetDetail.Number = item.Number.Value; |
|
|
|
targetDetail.SecondNumber = item.SecondNumber; |
|
|
|
targetDetail.GoodsBatch_ID = item.GoodsBatch_ID; |
|
|
|
if (outDetail != null) |
|
|
|
{ |
|
|
|
targetDetail.CargoSpace_ID = item.CargoSpace_ID; |
|
|
|
targetDetail.Price = item.Price; |
|
|
|
targetDetail.Money = item.Price * item.Number; |
|
|
|
targetDetail.BrandItem_ID = item.BrandItem_ID; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var detail in tuples.Where(x => !string.IsNullOrEmpty(x.Item3))) |
|
|
|
{ |
|
|
|
if (detail.Item4 == null || detail.Item4 == 0) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
|
var targetDetail = new InOutStoreBill_Detail(); |
|
|
|
target.Details.Add(targetDetail); |
|
|
|
var details = dmo.Details.Where(x => x.ID == detail.Item1); |
|
|
|
SaleOutStore_Detail outDetail = null; |
|
|
|
if (details.Count() > 0) |
|
|
|
{ |
|
|
|
outDetail = details.First(); |
|
|
|
} |
|
|
|
if (dmo.BusinessProperty == B3Sale业务属性.正常出库) |
|
|
|
targetDetail.Store_ID = dmo.Store_ID ?? 0; |
|
|
|
else |
|
|
|
{ |
|
|
|
if (outDetail != null) |
|
|
|
targetDetail.Store_ID = outDetail.Store_ID ?? 0; |
|
|
|
} |
|
|
|
targetDetail.Goods_ID = detail.Item2.Value; |
|
|
|
targetDetail.Number = detail.Item4 ?? 0; |
|
|
|
targetDetail.SecondNumber = detail.Item5 ?? 0; |
|
|
|
var tuple = SaleUtil.GetGoodsBatch(DomainContext.Current.ID, detail.Item3, detail.Item2.Value); |
|
|
|
if (tuple != null) |
|
|
|
targetDetail.GoodsBatch_ID = tuple.Item1; |
|
|
|
if (outDetail != null) |
|
|
|
{ |
|
|
|
targetDetail.CargoSpace_ID = outDetail.CargoSpace_ID; |
|
|
|
targetDetail.Price = outDetail.Price; |
|
|
|
targetDetail.Money = outDetail.Price * targetDetail.Number; |
|
|
|
targetDetail.BrandItem_ID = outDetail.BrandItem_ID; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static List<SaleOutStore_Detail> AddDetailByPdAndBatchNo(IDmoSession session, SaleOutStore saleOutStore, SaleOutStore_Detail outStoreDetail, Dictionary<long, List<TmpData>> dic) |
|
|
|
{ |
|
|
|
if (!dic.ContainsKey(outStoreDetail.SaleGoods_ID)) |
|
|
|
{ |
|
|
|
dic.Add(outStoreDetail.SaleGoods_ID, GetStoreDetailInfor(session, saleOutStore.Store_ID, outStoreDetail.SaleGoods_ID)); |
|
|
|
} |
|
|
|
var list = dic[outStoreDetail.SaleGoods_ID]; |
|
|
|
var theNum = outStoreDetail.Number ?? 0;//需要转的数量
|
|
|
|
var theSecNum = outStoreDetail.SecondNumber ?? 0;//需要转的辅数量
|
|
|
|
var num = theNum; |
|
|
|
var details = new List<SaleOutStore_Detail>(); |
|
|
|
foreach (var unionView in list) |
|
|
|
{ |
|
|
|
if (num <= 0) |
|
|
|
break; |
|
|
|
if (unionView.Number <= 0) |
|
|
|
continue; |
|
|
|
Money<decimal> thisNum;//当前明细分配数量
|
|
|
|
Money<decimal> thisSecNum;//当前明细分配辅数量
|
|
|
|
if (unionView.Number >= num) |
|
|
|
{ |
|
|
|
thisNum = num; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
thisNum = unionView.Number; |
|
|
|
} |
|
|
|
if (unionView.SecondNumber >= theSecNum) |
|
|
|
{ |
|
|
|
thisSecNum = theSecNum; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
thisSecNum = unionView.SecondNumber; |
|
|
|
} |
|
|
|
|
|
|
|
var outDetail = new SaleOutStore_Detail(); |
|
|
|
DmoUtil.CopyDmoFields(outStoreDetail, outDetail, "UnitNum", "Number", "SecondNumber", "Money", "RebateMoney"); |
|
|
|
outDetail.Price = outStoreDetail.Price; |
|
|
|
outDetail.ProductionDate = unionView.ProductionDate; |
|
|
|
outDetail.GoodsBatch_ID = unionView.GoodsBatch_ID; |
|
|
|
outDetail.Number = thisNum; |
|
|
|
if (outDetail.RightRatio != 0) |
|
|
|
outDetail.UnitNum = outDetail.Number / outDetail.RightRatio * outDetail.LeftRatio; |
|
|
|
if (outDetail.Goods_UnitConvertDirection == 主辅转换方向.由主至辅 || outDetail.Goods_UnitConvertDirection == 主辅转换方向.双向转换) |
|
|
|
{ |
|
|
|
outDetail.SecondNumber = outDetail.Number / outDetail.RightRatio * outDetail.LeftRatio; |
|
|
|
thisSecNum = outDetail.SecondNumber ?? 0; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
outDetail.SecondNumber = thisSecNum; |
|
|
|
} |
|
|
|
outDetail.HiddenNumber = outDetail.Number; |
|
|
|
outDetail.HiddenUnitNum = outDetail.UnitNum; |
|
|
|
outDetail.HiddenSecondNumber = outDetail.SecondNumber; |
|
|
|
|
|
|
|
details.Add(outDetail); |
|
|
|
num -= thisNum; |
|
|
|
theSecNum -= thisSecNum; |
|
|
|
unionView.Number -= thisNum; |
|
|
|
unionView.SecondNumber -= thisSecNum; |
|
|
|
} |
|
|
|
|
|
|
|
if (num != 0) |
|
|
|
throw new Exception(string.Format("{0}可用库存还差{1},不允许出库,审核失败", outStoreDetail.Goods_Name, num)); |
|
|
|
var lastDetail = details.LastOrDefault(); |
|
|
|
if (lastDetail != null) |
|
|
|
{ |
|
|
|
lastDetail.Money = (lastDetail.Money ?? 0m) + (outStoreDetail.Money ?? 0) - details.Sum(x => (x.Money ?? 0).Value); |
|
|
|
lastDetail.SecondNumber = (lastDetail.SecondNumber ?? 0m) + (outStoreDetail.SecondNumber ?? 0) - details.Sum(x => (x.SecondNumber ?? 0).Value); |
|
|
|
} |
|
|
|
return details; |
|
|
|
} |
|
|
|
|
|
|
|
static List<TmpData> GetStoreDetailInfor(IDmoSession session, long? store_ID, long? saleGoods_ID) |
|
|
|
{ |
|
|
|
var dom1 = new DQueryDom(new JoinAlias(typeof(StoreDetail))); |
|
|
|
dom1.Columns.Add(DQSelectColumn.Field("GoodsBatch_ProductionDate")); |
|
|
|
dom1.Columns.Add(DQSelectColumn.Field("GoodsBatch_ID")); |
|
|
|
dom1.Columns.Add(DQSelectColumn.Field("Number")); |
|
|
|
dom1.Columns.Add(DQSelectColumn.Field("SecondNumber")); |
|
|
|
dom1.Where.Conditions.Add(DQCondition.EQ("Goods_ID", saleGoods_ID)); |
|
|
|
dom1.Where.Conditions.Add(DQCondition.EQ("Store_ID", store_ID)); |
|
|
|
dom1.Where.Conditions.Add(DQCondition.GreaterThan(DQExpression.Field("Number"), DQExpression.Value(0))); |
|
|
|
dom1.OrderBy.Expressions.Add(DQOrderByExpression.Create("GoodsBatch_ProductionDate")); |
|
|
|
dom1.OrderBy.Expressions.Add(DQOrderByExpression.Create("GoodsBatch_ID")); |
|
|
|
|
|
|
|
var list = new List<TmpData>(); |
|
|
|
using (var reader = session.ExecuteReader(dom1)) |
|
|
|
{ |
|
|
|
while (reader.Read()) |
|
|
|
{ |
|
|
|
var tmp = new TmpData(); |
|
|
|
tmp.ProductionDate = (DateTime?)reader[0]; |
|
|
|
tmp.GoodsBatch_ID = (long?)reader[1]; |
|
|
|
tmp.Number = (Money<decimal>?)reader[2] ?? 0; |
|
|
|
tmp.SecondNumber = (Money<decimal>?)reader[3] ?? 0; |
|
|
|
list.Add(tmp); |
|
|
|
} |
|
|
|
} |
|
|
|
return list; |
|
|
|
} |
|
|
|
|
|
|
|
class TmpData |
|
|
|
{ |
|
|
|
public long? GoodsBatch_ID { get; set; } |
|
|
|
public DateTime? ProductionDate { get; set; } |
|
|
|
public Money<decimal> Number { get; set; } |
|
|
|
public Money<decimal> SecondNumber { get; set; } |
|
|
|
} |
|
|
|
} |
|
|
|
} |