using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using WMS.Web.Core;
using WMS.Web.Core.Help;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Domain.Values;
namespace WMS.Web.Domain.Entitys
{
///
/// erp出库任务单
///
[Serializable]
[Table("t_erp_outstock_task")]
public class OutStockTask : EntityBase
{
public OutStockTask() { }
///
/// 主键 订单编号
///
[Column("Id")]
public override int Id { get; set; }
///
/// 单据编号
///
[Column("BillNo")]
public string BillNo { get; set; }
///
/// 发货组织
///
[Column("DeliveryOrgId")]
public int DeliveryOrgId { get; set; }
///
/// 收货客户
///
[Column("ReceiptCustomerId")]
public int ReceiptCustomerId { get; set; }
///
/// 单据状态
///
[Column("Status")]
public OutStockStatus Status { get; set; } = OutStockStatus.Wait;
///
/// 单据类型
///
[Column("Type")]
public OutStockType Type { get; set; } = OutStockType.Sal;
///
/// 操作人(出库人)
///
[Column("OperatorId")]
public int? OperatorId { get; set; }
///
/// 操作时间(出库时间)
///
[Column("OperateTime")]
public DateTime? OperateTime { get; set; }
///
/// 创建时间(erp那边的创建时间)
///
[Column("CreateTime")]
public DateTime? CreateTime { get; set; }
///
/// 明细
///
public List Details = new List();
public void Create(OutStockType type, int deliveryOrgId, int receiptCustomerId, DateTime createTime)
{
this.Type = type;
//this.SourceBillNos.Add(sourceBillNo);
this.DeliveryOrgId = deliveryOrgId;
this.ReceiptCustomerId = receiptCustomerId;
this.CreateTime = createTime;
}
///
/// 出库 反写 任务单
///
///
///
///
public Result OutStock(int materialId, decimal qty)
{
if (this.Status == OutStockStatus.Already)
return Result.ReFailure(ResultCodes.OutStockTaskAlready);
if (this.Status == OutStockStatus.Repeal)
return Result.ReFailure(ResultCodes.OutStockTaskRepeal);
var detail = this.Details.FirstOrDefault(f => f.MaterialId == materialId);
if (detail == null) return Result.ReFailure(ResultCodes.OrderNoData);
if ((detail.AccruedQty - detail.RealityQty) < qty)
return Result.ReFailure(ResultCodes.OutStockQtyError);
if (detail.RealityQty <= 0)
detail.OutStockBeginTime = DateTime.Now;
//全部出库完成
if (detail.AccruedQty == (detail.RealityQty + qty))
detail.OutStockEndTime = DateTime.Now;
detail.RealityQty = detail.RealityQty + qty;
if (this.Details.Where(w => w.RealityQty >= w.AccruedQty).Count() == this.Details.Count())
this.Status = OutStockStatus.Already;
else
this.Status = OutStockStatus.Part;
return Result.ReSuccess();
}
///
/// 生成单据号
///
public void GenerateNo()
{
//用户手动输入了 就不自动生成了
if (!string.IsNullOrEmpty(this.BillNo)) return;
if (this.Id.ToString().Length >= 8)
{
this.BillNo = "CKRW" + this.Id.ToString();
return;
}
string idStr = this.Id.ToString();
while (true)
{
idStr = "0" + idStr;
if (idStr.Length >= 8) break;
}
//this.Number = CNSpellTranslator.GetFirstSpell(this.Name) + idStr;
this.BillNo = "CKZL" + idStr;
}
///
/// 作废
///
public void Repeal(int creatorId)
{
this.OperatorId = creatorId;
this.OperateTime = DateTime.Now;
this.Status = OutStockStatus.Repeal;
}
///
/// 合并
///
///
///
///
public Result Merge(List list, int creatorId)
{
if (list.Count() <= 1) return Result.ReFailure(ResultCodes.MergeNumberError);
// 符合合并数据逻辑:出库状态为”待拣货”+出库类型为:销售出库+发货组织一致+收货客户一致+发货仓库一致
if (list.Where(w => w.Status != OutStockStatus.Wait).Any()) return Result.ReFailure(ResultCodes.MergeStatusError);
if (list.Where(w => w.Type != OutStockType.Sal).Any()) return Result.ReFailure(ResultCodes.MergeStatusError);
if (list.GroupBy(g => g.DeliveryOrgId).Count() > 1) return Result.ReFailure(ResultCodes.MergeStatusError);
if (list.GroupBy(g => g.ReceiptCustomerId).Count() > 1) return Result.ReFailure(ResultCodes.MergeStatusError);
var details = list.SelectMany(s => s.Details).ToList();
if (details.GroupBy(g => g.StockCode).Count() > 1) return Result.ReFailure(ResultCodes.MergeStatusError);
List details_new = new List();
//清空数据绑定
foreach (var d in details)
{
d.Id = 0;
d.Fid = 0;
var detail_new = details_new.FirstOrDefault(f => f.MaterialId == d.MaterialId);
if (detail_new != null)
{
detail_new.AccruedQty += d.AccruedQty;//应出数量累加
foreach (var erpd in d.ErpDetails)
{
var cd = erpd.Clone();
cd.Id = 0;cd.DetailId = 0;
detail_new.ErpDetails.Add(cd);
}
}
else
details_new.Add(d);
}
this.OperatorId = creatorId;
this.OperateTime = DateTime.Now;
this.Status = OutStockStatus.Wait;
this.Type = OutStockType.Sal;
this.Details = details_new;
return Result.ReSuccess();
}
}
}