//檢視未出貨訂單明細,並要可以勾選要出貨的明細,檢視該採購單所有的產品,並可以選擇出貨那些產品 public ActionResult UnshipOrderDtl([Bind(Include = "PurchaseOrderID")] UnshipOrderDtlViewModel purchaseOrder) { return(View(purchaseOrder)); }
public ActionResult shipCheckDtl(UnshipOrderDtlViewModel unshipOrderDtl) { //建立一個LIST用來接住所有的OrderDtlItemChecked IList <OrderDtlItemChecked> OrderDtlChecked = unshipOrderDtl.orderDtlItemCheckeds; //用來存放確定有要出貨的LIST(有勾選) List <PurchaseOrderDtl> orderDtls = new List <PurchaseOrderDtl>(); //檢查是否有勾選出貨,true為有勾,有則放進orderDtls foreach (var dtl in OrderDtlChecked) { if (dtl.Checked) { PurchaseOrderDtl purchaseOrderDtl = db.PurchaseOrderDtl.Find(dtl.PurchaseOrderDtlCode); orderDtls.Add(purchaseOrderDtl); } } DateTime now = DateTime.Now; List <SourceList> sourceLists = new List <SourceList>(); //檢查庫存是否足夠,不足則顯示庫存不足的訊息,足夠則扣掉該或源清單庫存 //並新增該採購單明細實際出貨日期,新增出貨明細// foreach (var dtl in orderDtls) { SourceList sourceList = db.SourceList.Find(dtl.SourceListID); if (sourceList.UnitsInStock < dtl.Qty) { //這裡要return 錯誤訊息,並且回到原頁面 TempData["message"] = "<script>Swal.fire({ icon: 'error', title: 'Oops...', text: '庫存不足!', footer: '<a href>Why do I have this issue?</a>'})</script>"; return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID })); } //扣除該料件貨源清單的庫存以及訂單數量 sourceList.UnitsInStock = sourceList.UnitsInStock - dtl.Qty; if (sourceList.UnitsOnOrder < dtl.Qty) { sourceList.UnitsOnOrder = 0; } else { sourceList.UnitsOnOrder = sourceList.UnitsOnOrder - dtl.Qty; } sourceLists.Add(sourceList); dtl.ShipDate = now; //新增出貨通知 應該在這 先檢查是否有該筆出貨通知(因為有可能分開出貨,所以同筆訂單後出貨的就不用在增加出貨通知,只要增加出貨明細即可) if (db.ShipNotice.Where(x => x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID).FirstOrDefault() == null) { //新增出貨通知//感覺應該要在外面再加一個迴圈做出貨通知以及出貨明細 ShipNotice shipNotice = new ShipNotice(); string snId = $"SN-{now:yyyyMMdd}-"; int count = db.ShipNotice.Where(x => x.ShipNoticeID.StartsWith(snId)).Count(); count++; snId = $"{snId}{count:000}"; shipNotice.ShipNoticeID = snId; shipNotice.PurchaseOrderID = unshipOrderDtl.PurchaseOrderID; shipNotice.ShipDate = now; shipNotice.EmployeeID = db.PurchaseOrder.Find(unshipOrderDtl.PurchaseOrderID).EmployeeID; shipNotice.CompanyCode = db.Employee.Find(shipNotice.EmployeeID).CompanyCode; shipNotice.SupplierAccountID = supplierAccount; db.ShipNotice.Add(shipNotice); //先把新增的出貨通知資料存進資料庫 db.SaveChanges(); } //新增出貨明細 保存期限先不填 ShipNoticeDtl shipNoticeDtl = new ShipNoticeDtl(); shipNoticeDtl.ShipNoticeID = db.ShipNotice.Where(x => x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID).FirstOrDefault().ShipNoticeID; shipNoticeDtl.PurchaseOrderDtlCode = dtl.PurchaseOrderDtlCode; shipNoticeDtl.ShipQty = dtl.Qty; //金額為數量*單價*折扣*批量 shipNoticeDtl.ShipAmount = Convert.ToInt32(dtl.Qty * dtl.PurchaseUnitPrice * (1 - dtl.Discount) * dtl.QtyPerUnit); //把新出貨明細資料加進資料庫 db.ShipNoticeDtl.Add(shipNoticeDtl); //把資料庫中的每筆訂單以及貨源清單資料狀態改為追蹤 db.Entry(dtl).State = EntityState.Modified; db.Entry(sourceList).State = EntityState.Modified; } //存進資料庫 db.SaveChanges(); //檢查該筆訂單所有產品是否都已經出貨,如果是,將該筆採購單狀態改為已出貨"S" //預設先當作都已出貨 bool poCheck = true; var q = from pod in db.PurchaseOrderDtl where pod.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID select pod; foreach (var pod in q) { if (pod.ShipDate == null) { //找到未出貨產品,代表尚未全部出貨 poCheck = false; } } //確認是否已全部出貨,如果是修改採購單狀態為已出貨(S)並新增一筆採購單異動資料 //採購單明細的POChangedOID欄位也要更新 if (poCheck) { //改採購單狀態 db.PurchaseOrder.Find(unshipOrderDtl.PurchaseOrderID).PurchaseOrderStatus = POChangedCategoryCodeShipped; //新增採購單異動總表 POChanged pOChanged = new POChanged(); pOChanged.PurchaseOrderID = unshipOrderDtl.PurchaseOrderID; pOChanged.POChangedCategoryCode = POChangedCategoryCodeShipped; pOChanged.RequestDate = now; pOChanged.RequesterRole = RequesterRoleSupplier; pOChanged.RequesterID = supplierAccount; db.POChanged.Add(pOChanged); db.SaveChanges(); //更新採購單明細POChangedOID欄位 //2019 11/20 23:06 下方註解掉的程式碼不知道為甚麼會發生無法辨識此方法,無法放入站存區,所以只好分開來寫 //int a = db.POChanged.Last(x => (x.RequesterRole == RequesterRoleSupplier) && (x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID)).POChangedOID; //先找出最新一筆採購單異動資料且是供應商的 var poc = db.POChanged.Where(x => (x.RequesterRole == RequesterRoleSupplier) && (x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID)); DateTime dt = poc.FirstOrDefault().RequestDate; int pOChangedOID = poc.FirstOrDefault().POChangedOID; foreach (var pocD in poc) { if (pocD.RequestDate > dt) { dt = pocD.RequestDate; pOChangedOID = pocD.POChangedOID; } } //然後把找出來的採購單異動總表最新的POChangedOID更新至採購單明細POChangedOID欄位中 var podQueryForPOChangedOID = from pod in db.PurchaseOrderDtl where pod.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID select pod; foreach (var pod in podQueryForPOChangedOID) { pod.POChangedOID = pOChangedOID; db.Entry(pod).State = EntityState.Modified; } db.SaveChanges(); TempData["message"] = "<script>Swal.fire({position: 'top-end',icon: 'success',title: '出貨處理成功,庫存已扣除',showConfirmButton: false,timer: 1500})</script>"; } //成功回原頁面 TempData["message"] = "<script>Swal.fire({position: 'top-end',icon: 'success',title: '已全部出貨',showConfirmButton: false,timer: 1500})</script>"; return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID })); }
//出貨按鈕ACTION結束在這 /// <summary> /// UnshipOrderDtl的patialView方法 /// 改用PARTIALVIEW寫寫看 /// </summary> /// <returns></returns> //回傳PATIALVIEW給UnShipOrderDtl.cshtml //這裡應該要檢查庫存不足,和已出貨的明細,並直接顯示在第一欄 public ActionResult GetPurchaseOrderDtlPatialView(UnshipOrderDtlViewModel unshipOrderDtlViewModel) { var q = from pod in db.PurchaseOrderDtl.AsEnumerable() join sl in db.SourceList on pod.SourceListID equals sl.SourceListID where pod.PurchaseOrderID == unshipOrderDtlViewModel.PurchaseOrderID select new { pod.PurchaseOrderID, pod.PurchaseOrderDtlOID, pod.PurchaseOrderDtlCode, pod.Qty, sl.UnitsInStock }; IList <OrderDtlItemChecked> odc = new List <OrderDtlItemChecked>(); foreach (var item in q) { OrderDtlItemChecked orderDtlItemChecked = new OrderDtlItemChecked(); orderDtlItemChecked.PurchaseOrderDtlOID = item.PurchaseOrderDtlOID; orderDtlItemChecked.PurchaseOrderDtlCode = item.PurchaseOrderDtlCode; //顯示庫存是否足夠 if (item.UnitsInStock >= item.Qty) { orderDtlItemChecked.IsEnough = true; } else { orderDtlItemChecked.IsEnough = false; } //預設為沒有勾選 orderDtlItemChecked.Checked = false; odc.Add(orderDtlItemChecked); } IEnumerable <OrderDtlItem> od = null; var queryOrderitem = from pod in db.PurchaseOrderDtl join sl in db.SourceList on pod.SourceListID equals sl.SourceListID where pod.PurchaseOrderID == unshipOrderDtlViewModel.PurchaseOrderID select new OrderDtlItem { PurchaseOrderDtlOID = pod.PurchaseOrderDtlOID, PurchaseOrderDtlCode = pod.PurchaseOrderDtlCode, PartName = pod.PartName, QtyPerUnit = pod.QtyPerUnit, TotalPartQty = pod.TotalPartQty, Qty = pod.Qty, SourceListID = pod.SourceListID, CommittedArrivalDate = pod.CommittedArrivalDate, ShipDate = pod.ShipDate, DateRequired = pod.DateRequired, UnitsInStock = sl.UnitsInStock }; od = queryOrderitem.ToList(); foreach (var orderdtl in od) { if (orderdtl.ShipDate == null) { orderdtl.Unship = true; } else { orderdtl.Unship = false; } } UnshipOrderDtlViewModel uodvm = new UnshipOrderDtlViewModel() { PurchaseOrderID = unshipOrderDtlViewModel.PurchaseOrderID, orderDtlItems = od, orderDtlItemCheckeds = odc }; return(PartialView("_GetPurchaseOrderDtlPatialView", uodvm)); }