using HH.WMS.BLL; using HH.WMS.BLL.Basic; using HH.WMS.BLL.Common; using HH.WMS.BLL.OutStock; using HH.WMS.Common; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Entitys.PrintDataSource; using HH.WMS.WebApi.Areas.Common.Controllers; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace HH.WMS.WebApi.Areas.OutStock.Controllers { public class PackReviewController : BaseController { #region 扫描出库订单&扫描物流单 /// /// 扫描出库订单&扫描物流单 /// /// /// 是否为物流单 /// [HttpGet] public OperateResult ScanOut(string scanNo, bool wayBill = false) { return ValidateToken(t => { //参数校验 if (string.IsNullOrEmpty(scanNo)) return OperateResult.Error("单据号不可为空"); TN_WM_OUT_MSTEntity outMst = new TN_WM_OUT_MSTEntity(); if (wayBill) { outMst = BLLCreator.Create>().GetSingleEntity(new { CN_S_WAYBILL_NO = scanNo }); if (outMst == null) return OperateResult.Error("未找到物流单号:" + scanNo + "所属的出库单"); scanNo = outMst.CN_S_OP_NO; } else { outMst = BLLCreator.Create>().GetSingleEntity(new { CN_S_OP_NO = scanNo }); if (outMst == null) return OperateResult.Error("未找到出库订单:" + scanNo); } if (outMst.CN_S_STATE == Constants.State_Cancel) return OperateResult.Error("该单据已取消!"); if (!(outMst.CN_S_STATE == Constants.State_WaitOut || outMst.CN_S_STATE == Constants.Sorting_Being || outMst.CN_S_STATE == Constants.Sorting_Sorted)) return OperateResult.Error("当前出库单状态不允许包装复验!"); var waveMst = BLLCreator.Create>().GetSingleEntity(new { CN_S_WAVE_NO = outMst.CN_S_WAVE_CODE }); if (waveMst == null) return OperateResult.Error("未找到该出库单波次,请先打印分拣单!"); if (waveMst.CN_S_STATE == Constants.Sorting_Stay || waveMst.CN_S_STATE == Constants.Sorting_Being) return OperateResult.Error("当前出库单波次存在未分拣的物料!"); var outDtl = BLLCreator.Create>().GetList(new { CN_S_OP_NO = scanNo, CN_C_AUTO_INOUT = false }); if (!outDtl.Any()) return OperateResult.Error("未找到出库订单:" + scanNo + "的出库明细"); var reviewList = BLLCreator.Create>().GetList(new { CN_S_ORDER_NO = scanNo }); List items = (BLLCreator.Create().GetItemList(outDtl.Select(x => x.CN_S_ITEM_CODE).ToList()) ?? new List()); //TN_WM_B_UNIQUE_BARCODEEntity uniqueBig = CreateDAL>().GetSingleEntity(new { CN_S_ITEM_CODE = itemenity.CN_S_ITEM_CODE, CN_S_PARENT_CODE = "" }); //if (uniqueBig != null) //{ // itemenity.CN_F_BOXPACKING_QTY = Math.Round(Convert.ToDecimal(uniqueBig.CN_F_PACKING_QTY), 0).ToString(); // itemenity.CN_F_BOXPACKING_UNIT = uniqueBig.CN_S_PACKING_UNIT.ToString(); //} var result = new { OutNo = scanNo, PackCode = "", PackItems = outDtl.Select(x => { //TN_WM_B_UNIQUE_BARCODEEntity uniqueBig = BLLCreator.CreateDapper().GetSingleEntity(new //{ // CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, // CN_S_PARENT_CODE = "" //}); //string packingQty = ""; //string packingUnit = ""; //if (uniqueBig != null) //{ // packingQty = Math.Round(Convert.ToDecimal(uniqueBig.CN_F_PACKING_QTY), 0).ToString(); // packingUnit = uniqueBig.CN_S_PACKING_UNIT.ToString(); //} var currentItem = items.Find(m => m.CN_S_ITEM_CODE == x.CN_S_ITEM_CODE); string isSn = "N"; var _currentItem = items.Find(m => m.CN_S_ITEM_CODE.Equals(x.CN_S_ITEM_CODE)); if (_currentItem != null) { if (!string.IsNullOrEmpty(_currentItem.CN_C_IS_SN)) { isSn = _currentItem.CN_C_IS_SN; } } return new { //CN_F_BOXPACKING_QTY = packingQty, //CN_F_BOXPACKING_UNIT = packingUnit, AuxiliaryUnitList = currentItem.AuxiliaryUnitList ?? new List(), ItemCode = x.CN_S_ITEM_CODE, ItemName = x.CN_S_ITEM_NAME, ItemState = x.CN_S_ITEM_STATE, ItemLotNo = x.CN_S_LOT_CODE, ItemProLotNo = x.CN_S_PRODUCTION_BATCH, ItemModel = x.CN_S_MODEL, ItemFigureNo = x.CN_S_FIGURE_NO, ItemUnit = x.CN_S_MEASURE_UNIT, Owner = outMst.CN_S_OWNER, Qty = x.CN_F_QUANTITY, IsSn = isSn, PrQty = reviewList.FindAll(s => { s.CN_S_LOT_NO = s.CN_S_LOT_NO ?? ""; s.CN_S_PRODUCTION_BATCH = s.CN_S_PRODUCTION_BATCH ?? ""; x.CN_S_LOT_CODE = x.CN_S_LOT_CODE ?? ""; x.CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH ?? ""; return s.CN_S_ITEM_CODE.Equals(x.CN_S_ITEM_CODE) && s.CN_S_ITEM_STATE.Equals(x.CN_S_ITEM_STATE) && s.CN_S_OWNER.Equals(outMst.CN_S_OWNER) && //s.CN_S_LOT_NO.Equals(x.CN_S_LOT_CODE) && (string.IsNullOrEmpty(x.CN_S_PRODUCTION_BATCH) || s.CN_S_PRODUCTION_BATCH.Equals(x.CN_S_PRODUCTION_BATCH)); }).Sum(q => q.CN_F_RECHECK) }; }) }; return OperateResult.Succeed(null, result); }); } #endregion #region 保存包装复验物料 /// /// 保存包装复验物料 /// /// /// [HttpPost] public OperateResult ConfirmReview(dynamic confirmReview) { string tokenId = Util.ToString(confirmReview.tokenId); return ValidateToken(tokenId, t => { //出库订单 string outNo = Util.ToString(confirmReview.OutNo); //是否全部包装复验完 bool isAllReview = Convert.ToBoolean(confirmReview.IsAllReview ?? false); //是否强制完成 bool forceComplete = Convert.ToBoolean(confirmReview.ForceComplete ?? false); //包装码 string packCode = Util.ToString(confirmReview.PackCode); if (confirmReview.ReviewItems == null) return OperateResult.Error("包装复验物料不可为空"); //包装复验的物料 List reviewItems = JsonConvert.DeserializeObject>(Util.ToString(confirmReview.ReviewItems)); reviewItems.ForEach(p => { p.CN_S_ORDER_NO = outNo; p.CN_GUID = Guid.NewGuid().ToString(); p.CN_S_SERIAL_NO = p.CN_S_SERIAL_NO ?? ""; p.CN_S_GROUP = p.CN_S_GROUP ?? ""; p.CN_S_TURNOVERBOX_CODE = p.CN_S_TURNOVERBOX_CODE ?? ""; p.CN_S_SORTING_CAR = p.CN_S_SORTING_CAR ?? ""; p.CN_S_PACKING_CODE = p.CN_S_PACKING_CODE ?? packCode; p.CN_C_ISPACK = Constants.Y; p.CN_S_ISSOWING = Constants.Y; p.CN_S_CREATOR = t.CN_S_LOGIN; p.CN_S_CREATOR_BY = t.CN_S_NAME; p.CN_T_CREATE = DateTime.Now; p.CN_S_MODIFY = t.CN_S_LOGIN; p.CN_S_MODIFY_BY = t.CN_S_NAME; p.CN_T_MODIFY = DateTime.Now; }); List boxDtlList = new List(); if (!string.IsNullOrEmpty(packCode)) { var existsBoxDtl = BLLCreator.Create>().GetList(new { CN_S_PACKING_CODE = packCode }); int rowNo = 1; if (existsBoxDtl.Any()) rowNo = existsBoxDtl.Max(x => x.CN_N_ROW_NO) ?? 1; foreach (var reviewItem in reviewItems) { TN_WM_B_BOX_DTLEntity boxDtlEntity = new TN_WM_B_BOX_DTLEntity() { CN_F_QUANTITY = reviewItem.CN_F_QUANTITY, CN_N_ROW_NO = rowNo, CN_S_IN_FROM_NO = reviewItem.CN_S_IN_FROM_NO, CN_S_IN_OP_FROM = reviewItem.CN_S_IN_OP_FROM, CN_S_ITEM_CODE = reviewItem.CN_S_ITEM_CODE, CN_S_ITEM_NAME = reviewItem.CN_S_ITEM_NAME, CN_S_ITEM_STATE = reviewItem.CN_S_ITEM_STATE, CN_S_LOT_CODE = reviewItem.CN_S_LOT_NO, CN_S_MEASURE_UNIT = reviewItem.CN_S_MEASURE_UNIT,//计量单位 CN_S_OWNER = reviewItem.CN_S_OWNER, CN_S_PACKCODE = reviewItem.CN_S_PACK_CODE, CN_S_PACKING_CODE = packCode, CN_S_SERIAL_NO = reviewItem.CN_S_SERIAL_NO, }; boxDtlList.Add(boxDtlEntity); } } //非强制完成 if (!forceComplete) { var osAllList = BLLCreator.Create>().GetList(new { CN_S_ORDER_NO = outNo, CN_C_ISPACK = Constants.Y }); var outDtl = BLLCreator.Create>().GetList(new { CN_S_OP_NO = outNo, CN_C_AUTO_INOUT = false }); if (outDtl.Sum(x => x.CN_F_QUANTITY) == (osAllList.Sum(x => x.CN_F_QUANTITY) + reviewItems.Sum(x => x.CN_F_QUANTITY))) isAllReview = true; } else { isAllReview = true; } return BLLCreator.Create().ConfirmReview(isAllReview, outNo, reviewItems, boxDtlList); }); } #endregion #region 扫描包装码 /// /// 扫描包装码 /// /// [HttpGet] public OperateResult ScanPack(string packCode, string outNo) { return ValidateToken(t => { if (string.IsNullOrEmpty(packCode)) return OperateResult.Error("包装码不可为空!"); if (string.IsNullOrEmpty(outNo)) return OperateResult.Error("出库单不可为空!"); var outPackEntity = BLLCreator.Create>().GetSingleEntity(new { CN_S_PACKING_CODE = packCode }); if (outPackEntity == null) return OperateResult.Error("未找到包装码:" + packCode); if (outPackEntity.CN_S_OP_NO.Equals(outNo)) { return OperateResult.Succeed(null, outPackEntity); } else { return OperateResult.Error("包装码:" + packCode + "已绑定了出库单:" + outPackEntity.CN_S_OP_NO); } }); } #endregion #region 获取出库单包装信息 /// /// 获取出库单包装信息 /// /// /// [HttpGet] public OperateResult GenerateOutPack(string scanNo, int packNum = 0, bool wayBill = false) { return ValidateToken(t => { if (packNum <= 0) return OperateResult.Error("数量必须大于0"); TN_WM_OUT_MSTEntity outMst = new TN_WM_OUT_MSTEntity(); if (wayBill) { outMst = BLLCreator.Create>().GetSingleEntity(new { CN_S_WAYBILL_NO = scanNo }); if (outMst == null) return OperateResult.Error("未找到物流单号:" + scanNo + "所属的出库单"); scanNo = outMst.CN_S_OP_NO; } else { outMst = BLLCreator.Create>().GetSingleEntity(new { CN_S_OP_NO = scanNo }); } if (outMst == null) return OperateResult.Error("未找到出库单:" + scanNo); //装箱 List outPackList = new List(); List optList = new List(); var user = new UserRuleEntity() { LoginCode = Util.ToString(t.CN_S_LOGIN).Trim(), LoginName = Util.ToString(t.CN_S_NAME).Trim(), OrgCode = Util.ToString(t.CN_S_ORGCODE).Trim(), OrgFlag = Util.ToString(t.CN_S_ORGFLAG).Trim(), RuleCode = Constants.PackCode }; for (int i = 1; i <= packNum; i++) { OutPackTagEntity optEntity = new OutPackTagEntity() { PackNo = user.GenerateNo(), TotalNum = packNum, CurrentNum = i, ReceiverName = Util.ToString(outMst.CN_S_RECEIVER_NAME), ReceiverPhone = Util.ToString(outMst.CN_S_PHONE), Province = Util.ToString(outMst.CN_S_PROVINCE), City = Util.ToString(outMst.CN_S_CITY), Area = Util.ToString(outMst.CN_S_AREA), Town = Util.ToString(outMst.CN_S_TOWN), ReceiverAddress = Util.ToString(outMst.CN_S_DETAIL_ADDRESS), Logistics = Util.ToString(outMst.CN_S_LOGISTICS_NAME) }; TN_WM_B_OUT_PACKEntity outPackEntity = new TN_WM_B_OUT_PACKEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_S_OP_NO = outMst.CN_S_OP_NO, CN_S_OPERATOR = t.CN_S_NAME, CN_S_PACKING_CODE = optEntity.PackNo, CN_T_DATE = DateTime.Now, CN_S_BOX_STYLE = Constants.PackCode }; outPackList.Add(outPackEntity); optList.Add(optEntity); } var result = BLLCreator.Create>().AddRange(outPackList); if (!result.Success) return result; return OperateResult.Succeed(null, optList); }); } #endregion #region 扫描条码 返回条码实体 /// /// 扫描条码 返回条码实体 /// /// 扫描条码 /// /// [HANHE(XDL)] CREATED BY 2018-11-14 [HttpGet] public string AnalysisCode(string barCode) { return ValidateToken(t => { MONGO_KEYTYPE_MAP map = BLLCreator.Create().GetEntity(barCode); if (map == null) return null; ScanCodeClass scanCodeMode = new ScanCodeClass(); switch (map.Type) { case "1"://CS程序打印条码 MONGO_PRINT_BARCODE barcode = BLLCreator.Create().GetValue(barCode); scanCodeMode = new ScanCodeClass() { Key = map.Key, Type = map.Type, PrintBarCode = barcode }; break; case "2"://三生XML唯一码 var existsUniqueCode = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_UNIQUE_CODE = barCode, CN_C_ISPACK = Constants.Y }); if (existsUniqueCode != null) return JsonConvert.SerializeObject(OperateResult.Error("该唯一码已扫描过!")); TN_WM_B_UNIQUE_BARCODEEntity uniqueCode = BLLCreator.Create().GetValue(barCode); if (uniqueCode == null) { scanCodeMode = null; break; } AutoBomItemEntity itemEnity = BLLCreator.Create().GetItem(uniqueCode.CN_S_ITEM_CODE); if (uniqueCode != null) { if (itemEnity == null) { scanCodeMode = null; } else { uniqueCode.CN_F_MIN_PACK_QTY = Convert.ToString(itemEnity.CN_F_MIN_PACK_QTY); uniqueCode.CN_C_IS_LOT_OUT = Convert.ToString(itemEnity.CN_C_IS_LOT_OUT); uniqueCode.CN_C_IS_SN = Convert.ToString(itemEnity.CN_C_IS_SN); uniqueCode.AuxiliaryUnitList = itemEnity.AuxiliaryUnitList;//辅助单位 scanCodeMode = new ScanCodeClass() { Key = map.Key, Type = map.Type, uniqueCode = uniqueCode }; } } break; case "3": break; case "4"://准物料编码 var index = barCode.IndexOf("*"); var qty = 0; if (index > 0) { qty = Convert.ToInt32(barCode.Substring(barCode.IndexOf("*"), barCode.Length)); barCode = barCode.Substring(0, barCode.IndexOf("*")); } AutoBomItemEntity itemenity = BLLCreator.Create().GetItem(barCode); AutoBomItemQtyEntity qtyEntity = new AutoBomItemQtyEntity() { itemEntity = itemenity, itemEntityQty = qty }; scanCodeMode = new ScanCodeClass() { Key = map.Key, Type = map.Type, Item = qtyEntity }; break; case "5"://物流单号 scanCodeMode = new ScanCodeClass() { Key = map.Key, Type = map.Type, Item = null }; break; default: break; } if (scanCodeMode == null) return JsonConvert.SerializeObject(OperateResult.Error("找不到物料!")); return JsonConvert.SerializeObject(OperateResult.Succeed("", scanCodeMode)); }); } #endregion #region (cs端)获取包装复验的出库单 /// /// (cs端)获取包装复验的出库单 /// /// [HttpGet] public OperateResult GetPackReviewOut() { return ValidateToken(t => { string collectCode = "HBQ01"; var waveMst = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_COLLECT_CODE = collectCode }); if (waveMst == null) return OperateResult.Error("当前没有需要包装复验的出库单"); var outList = BLLCreator.Create().GetOutListByWave(waveMst.CN_S_WAVE_NO); var orderSortingRel = BLLCreator.CreateDapper().GetList(new { CN_S_ORDER_NO = outList.Select(s => s.CN_S_OP_NO).ToList() }); var result = outList.Select(s => new TN_WM_OUT_MSTEntity() { CN_S_OP_NO = s.CN_S_OP_NO, Sowed = s.OutDtlList.Sum(m => m.CN_F_QUANTITY) == orderSortingRel.Where(w => w.CN_S_ORDER_NO == s.CN_S_OP_NO).Sum(m => m.CN_F_RECHECK) }).ToList(); return OperateResult.Succeed(null, result); }); } #endregion #region (cs端)包装复验扫位置码/出库单 /// /// (cs端)包装复验扫位置码/出库单 /// /// /// [HttpGet] public OperateResult GetPackReviewOutDtl(string outNo) { return ValidateToken(t => { var outMst = BLLCreator.Create().GetOut(outNo); var orderSortingRel = BLLCreator.CreateDapper().GetList(new { CN_S_ORDER_NO = outNo }); var result = outMst.OutDtlList.Select(s => new TN_WM_OUT_DTLEntity() { CN_S_ITEM_CODE = s.CN_S_ITEM_CODE, CN_S_ITEM_NAME = s.CN_S_ITEM_NAME, CN_S_MODEL = s.CN_S_MODEL, CN_S_FIGURE_NO = s.CN_S_FIGURE_NO, CN_F_QUANTITY = s.CN_F_QUANTITY, CN_F_PACKED_QTY = orderSortingRel.Where(w => w.CN_S_ITEM_CODE == s.CN_S_ITEM_CODE).Sum(m => m.CN_F_RECHECK) ?? 0, CN_S_MEASURE_UNIT = s.CN_S_MEASURE_UNIT }); return OperateResult.Succeed(null, result); }); } #endregion #region (cs端)扫包装码,并保存之前扫过的包装物料 /// /// 扫包装码,并保存之前扫过的包装物料 /// /// /// [HttpPost] public OperateResult ScanPackingBox(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { string boxNo = Util.ToString(postEntity.PostData.BoxNo); string outNo = Util.ToString(postEntity.PostData.OutNo); List boxDtl = JsonConvert.DeserializeObject>(Util.ToString(postEntity.PostData.BoxDtl)); var currentBox = BLLCreator.CreateDapper().GetSingleEntity(new { CN_S_PACKING_CODE = boxNo }); if (currentBox == null) return OperateResult.Error("未找到装箱码:" + boxNo); if (!string.IsNullOrEmpty(currentBox.CN_S_OP_NO) && currentBox.CN_S_OP_NO != outNo) return OperateResult.Error("当前装箱码已绑定了出库单:" + outNo); if (boxDtl.Any()) { var result = SaveBoxDtl(outNo, boxDtl); if (!result.Success) return result; } var currentBoxDtl = BLLCreator.CreateDapper().GetList(new { CN_S_PACKING_CODE = boxNo }); return OperateResult.Succeed(null, currentBoxDtl); }); } #endregion #region (cs端)保存包装复验 /// /// 保存包装复验 /// /// /// /// private OperateResult SaveBoxDtl(string outNo, List boxDtl) { var orderSortingRel = BLLCreator.CreateDapper().GetList(new { CN_S_ORDER_NO = outNo }); foreach (var d in boxDtl) { var qty = d.CN_F_QUANTITY; var currentItemOS = orderSortingRel.Where(w => w.CN_S_ITEM_CODE == d.CN_S_ITEM_CODE); foreach (var cos in currentItemOS) { var sQty = cos.CN_F_QUANTITY - cos.CN_F_RECHECK; if (qty == 0) break; if (sQty == 0) continue; if (sQty >= qty) { cos.CN_F_RECHECK += qty; qty = 0; } else { qty -= sQty; cos.CN_F_RECHECK += sQty; } } if (qty > 0) return OperateResult.Error("物料:" + d.CN_S_ITEM_CODE + "复验数大于出库数"); } return BLLCreator.Create().SaveBoxDtl(outNo, orderSortingRel, boxDtl); } #endregion #region (cs端)保存包装复验 /// /// 保存包装复验 /// /// /// [HttpPost] public OperateResult SaveBoxDtl(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { string outNo = Util.ToString(postEntity.PostData.OutNo); List boxDtl = JsonConvert.DeserializeObject>(Util.ToString(postEntity.PostData.BoxDtl)); return SaveBoxDtl(outNo, boxDtl); }); } #endregion } }