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(); } } }