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
}
}