using HH.Redis.ReisModel; using HH.WMS.BLL; using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.Common; using HH.WMS.BLL.OutStock; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.Algorithm.Out; 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 Newtonsoft.Json.Converters; 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 WaveController : BaseController { #region 打单 /// /// 打单 /// /// /// public OperateResult CreateBill(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { //出库订单,可能多个 string opNos = Util.ToString(postEntity.PostData.opNos); //打印机 string printer = Util.ToString(postEntity.PostData.printer); //打印模板 string printTemplet = Util.ToString(postEntity.PostData.printTemplet); if (string.IsNullOrEmpty(opNos)) return OperateResult.Error("出库订单号不可为空"); //登陆信息&生成单号 UserRuleEntity 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.Rule_WaveNo }; //生成波次号 string waveNo = user.GenerateNo(); if (string.IsNullOrEmpty(waveNo)) return OperateResult.Error("生成波次号失败"); return ChangeOutOperate(opNos, (outMstList, batchesList, stockList, lstStrate) => { //if (outMstList.GroupBy(x => x.CN_S_CUSTOMER).Count() != 1) // return OperateResult.Error("请选择同一客户的出库单"); //反批分分配量,并且生成出库单 var bResult = stockList.BatchesStockQty(batchesList, BatchesType.ReverseBatch, StockBatchesField.AllocationQty, lstStrate, true); if (!bResult.Success) return bResult; //批分结果数据 var batchesResult = bResult.GetData(); if (batchesResult == null) return OperateResult.Error("生成打单数据异常"); //出库单子表数据 List reduceInventoryDtlList = new List(); batchesResult.ReduceInventoryMstList.ForEach(p => { reduceInventoryDtlList.AddRange(p.DTLEntity); }); batchesResult.ReduceInventoryDtlList = reduceInventoryDtlList; //出库订单子表数据 List outDtlAllList = new List(); outMstList.ForEach(p => { //子表货主赋值 p.OutDtlList.ForEach(q => q.CN_S_OWNER = p.CN_S_OWNER); outDtlAllList.AddRange(p.OutDtlList); }); //初始化调用算法数据 List itemQuerys = outDtlAllList.GroupBy(p => new { p.CN_S_ITEM_CODE, p.CN_S_ITEM_STATE, p.CN_S_OWNER, p.CN_S_LOT_CODE, p.CN_S_PRODUCTION_BATCH }) .Select(x => new itemQueryClass() { itemCode = x.Key.CN_S_ITEM_CODE, batchCode = x.Key.CN_S_LOT_CODE, prodBatchCode = x.Key.CN_S_PRODUCTION_BATCH, itemState = x.Key.CN_S_ITEM_STATE, ownerName = x.Key.CN_S_OWNER, stockCode = batchesResult.OutMstList[0].CN_S_STOCK_CODE, itemQty = x.Sum(y => y.CN_F_QUANTITY) }).ToList(); var allArea = BLLCreator.Create().GetArea(4, batchesResult.OutMstList[0].CN_S_STOCK_CODE); List lstAreaPrior = allArea.Select(p => new areaPriorClass() { areaCode = p.CN_S_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(); Log.Info("调用OutArea参数 itemQuerys", JsonConvert.SerializeObject(itemQuerys)); Log.Info("调用OutArea参数 lstAreaPrior", JsonConvert.SerializeObject(lstAreaPrior)); //调用出库算法 var algorResultEntity = BLLCreator.Create().OutArea(itemQuerys, lstAreaPrior); if (!algorResultEntity.Success) return OperateResult.Error("算法异常:" + algorResultEntity.Msg); Log.Info("调用OutArea返回值 algorResultEntity", JsonConvert.SerializeObject(algorResultEntity)); //算法结果 var algorResult = algorResultEntity.itemOutAreaResult; Log.Info("调用OutArea返回值 algorResult", JsonConvert.SerializeObject(algorResult)); if (algorResult == null) return OperateResult.Error("库存不足,请先完成来料区的上架"); //获取分拣单数据 var sortingDataResult = BLLCreator.Create().GetSortingData(algorResult, user, waveNo); if (!sortingDataResult.Success) return sortingDataResult; //生成的分拣单数据 var sortingList = sortingDataResult.GetData>(); List itemCodes = new List(); sortingList.ForEach(x => { if (x.SortingDtlList != null) x.SortingDtlList.ForEach(y => { itemCodes.Add(y.CN_S_ITEM_CODE); }); }); //分拣单的所有库区量表数据 var stockAreaList = BLLCreator.Create>().GetList(new { CN_S_STOCK_AREA = sortingList.Select(x => x.CN_S_STOCK_AREA).ToList(), CN_S_ITEM_CODE = itemCodes }); //批分库区量表结果 //List outLockList = new List(); Log.Info("批分库区参数 sortingList:", JsonConvert.SerializeObject(sortingList)); Log.Info("批分库区参数 lstStrate:", JsonConvert.SerializeObject(lstStrate)); var batchesAreaResult = stockAreaList.BatchesAreaQty(sortingList, lstStrate); if (!batchesAreaResult.Success) return batchesAreaResult; Log.Info("批分库区结果 batchesAreaResult:", JsonConvert.SerializeObject(batchesAreaResult)); //批分托盘物料分配量,改到执行分拣单的时候分配 var sortingLocations = new List(); sortingList.ForEach(x => { sortingLocations.AddRange(x.SortingLocationList); }); //组织批分实体 var batchesTrayItem = sortingLocations.Select(x => new BatchesEntity() { TrayCode = x.CN_S_TRAY_CODE, ItemCode = x.CN_S_ITEM_CODE, Qty = x.CN_F_QUANTITY }).ToList(); var trayItem = BLLCreator.Create>().GetList(new { CN_S_ITEM_CODE = batchesTrayItem.Select(x => x.ItemCode).ToList() }); trayItem.BatchesTrayItemQty(batchesTrayItem, BatchesType.ForwardBatch); //托盘物料 batchesResult.TrayItemList = trayItem; //波次实体 batchesResult.WaveMst = GetWaveEntity(batchesResult, waveNo, t); //分拣单实体 batchesResult.SortingList = sortingList; //库区量表实体 batchesResult.StockAreaList = stockAreaList; //打单 return BLLCreator.Create().CreateBill(batchesResult); }); }); } #endregion #region 打单 /// /// 打单 /// /// /// public OperateResult SimCreateBill(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { //出库订单,可能多个 string opNos = Util.ToString(postEntity.PostData.opNos); //打印机 string printer = Util.ToString(postEntity.PostData.printer); //打印模板 string printTemplet = Util.ToString(postEntity.PostData.printTemplet); if (string.IsNullOrEmpty(opNos)) return OperateResult.Error("出库订单号不可为空"); //登陆信息&生成单号 UserRuleEntity 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.Rule_WaveNo }; //生成波次号 string waveNo = user.GenerateNo(); if (string.IsNullOrEmpty(waveNo)) return OperateResult.Error("生成波次号失败"); return ChangeOutOperate(opNos, (outMstList, batchesList, stockList, lstStrate) => { //if (outMstList.GroupBy(x => x.CN_S_CUSTOMER).Count() != 1) // return OperateResult.Error("请选择同一客户的出库单"); //反批分分配量,并且生成出库单 var bResult = stockList.BatchesStockQty(batchesList, BatchesType.ReverseBatch, StockBatchesField.AllocationQty, lstStrate, true); if (!bResult.Success) return bResult; //批分结果数据 var batchesResult = bResult.GetData(); if (batchesResult == null) return OperateResult.Error("生成打单数据异常"); //出库单子表数据 List reduceInventoryDtlList = new List(); batchesResult.ReduceInventoryMstList.ForEach(p => { reduceInventoryDtlList.AddRange(p.DTLEntity); }); batchesResult.ReduceInventoryDtlList = reduceInventoryDtlList; //出库订单子表数据 List outDtlAllList = new List(); outMstList.ForEach(p => { //子表货主赋值 p.OutDtlList.ForEach(q => q.CN_S_OWNER = p.CN_S_OWNER); outDtlAllList.AddRange(p.OutDtlList); }); //初始化调用算法数据 List itemQuerys = outDtlAllList.GroupBy(p => new { p.CN_S_ITEM_CODE, p.CN_S_ITEM_STATE, p.CN_S_OWNER, p.CN_S_LOT_CODE, p.CN_S_PRODUCTION_BATCH }) .Select(x => new itemQueryClass() { itemCode = x.Key.CN_S_ITEM_CODE, batchCode = x.Key.CN_S_LOT_CODE, prodBatchCode = x.Key.CN_S_PRODUCTION_BATCH, itemState = x.Key.CN_S_ITEM_STATE, ownerName = x.Key.CN_S_OWNER, stockCode = batchesResult.OutMstList[0].CN_S_STOCK_CODE, itemQty = x.Sum(y => y.CN_F_QUANTITY) }).ToList(); var allArea = BLLCreator.Create().GetArea(4, batchesResult.OutMstList[0].CN_S_STOCK_CODE); List lstAreaPrior = allArea.Select(p => new areaPriorClass() { areaCode = p.CN_S_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(); Log.Info("调用OutArea参数 itemQuerys", JsonConvert.SerializeObject(itemQuerys)); Log.Info("调用OutArea参数 lstAreaPrior", JsonConvert.SerializeObject(lstAreaPrior)); //调用出库算法 var algorResultEntity = BLLCreator.Create().OutArea(itemQuerys, lstAreaPrior); if (!algorResultEntity.Success) return OperateResult.Error("算法异常:" + algorResultEntity.Msg); Log.Info("调用OutArea返回值 algorResultEntity", JsonConvert.SerializeObject(algorResultEntity)); //算法结果 var algorResult = algorResultEntity.itemOutAreaResult; Log.Info("调用OutArea返回值 algorResult", JsonConvert.SerializeObject(algorResult)); if (algorResult == null) return OperateResult.Error("库存不足,请先完成来料区的上架"); //获取分拣单数据 var sortingDataResult = BLLCreator.Create().GetSortingData(algorResult, user, waveNo); if (!sortingDataResult.Success) return sortingDataResult; //生成的分拣单数据 var sortingList = sortingDataResult.GetData>(); List itemCodes = new List(); sortingList.ForEach(x => { if (x.SortingDtlList != null) x.SortingDtlList.ForEach(y => { itemCodes.Add(y.CN_S_ITEM_CODE); }); }); //分拣单的所有库区量表数据 var stockAreaList = BLLCreator.Create>().GetList(new { CN_S_STOCK_AREA = sortingList.Select(x => x.CN_S_STOCK_AREA).ToList(), CN_S_ITEM_CODE = itemCodes }); //批分库区量表结果 //List outLockList = new List(); Log.Info("批分库区参数 sortingList:", JsonConvert.SerializeObject(sortingList)); Log.Info("批分库区参数 lstStrate:", JsonConvert.SerializeObject(lstStrate)); var batchesAreaResult = stockAreaList.BatchesAreaQty(sortingList, lstStrate); if (!batchesAreaResult.Success) return batchesAreaResult; Log.Info("批分库区结果 batchesAreaResult:", JsonConvert.SerializeObject(batchesAreaResult)); //批分托盘物料分配量,改到执行分拣单的时候分配 var sortingLocations = new List(); sortingList.ForEach(x => { sortingLocations.AddRange(x.SortingLocationList); }); //组织批分实体 var batchesTrayItem = sortingLocations.Select(x => new BatchesEntity() { TrayCode = x.CN_S_TRAY_CODE, ItemCode = x.CN_S_ITEM_CODE, Qty = x.CN_F_QUANTITY }).ToList(); var trayItem = BLLCreator.Create>().GetList(new { CN_S_ITEM_CODE = batchesTrayItem.Select(x => x.ItemCode).ToList() }); trayItem.BatchesTrayItemQty(batchesTrayItem, BatchesType.ForwardBatch); //托盘物料 batchesResult.TrayItemList = trayItem; //波次实体 batchesResult.WaveMst = GetWaveEntity(batchesResult, waveNo, t); //分拣单实体 batchesResult.SortingList = sortingList; //库区量表实体 batchesResult.StockAreaList = stockAreaList; //打单 return BLLCreator.Create().CreateBill(batchesResult); }); }); } #endregion #region 获取波次实体 /// /// 获取波次实体 /// /// /// private TN_WM_WAVE_MSTEntity GetWaveEntity(BatchesResult bResult, string waveNo, RedisUserEntity user) { TN_WM_WAVE_MSTEntity waveMstEntity = new TN_WM_WAVE_MSTEntity() { CN_S_CREATE_TYPE = Constants.CreateType_Manual, CN_S_WAVE_NO = waveNo, CN_S_FROM = "WMS", CN_GUID = Guid.NewGuid().ToString(), CN_S_STATE = Constants.Sorting_Stay, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_T_OPERATE = DateTime.Now, CN_S_CREATOR = user.CN_S_NAME, CN_S_CREATOR_BY = user.CN_S_LOGIN, CN_S_MODIFY = user.CN_S_NAME, CN_S_MODIFY_BY = user.CN_S_LOGIN, CN_C_NEED_SEEDING = Constants.Y, CN_S_STATUS = Constants.State_New, CN_S_SEEDING_MODE = "", CN_S_STOCK_CODE = bResult.OutMstList[0].CN_S_STOCK_CODE }; waveMstEntity.WaveDtlList = new List(); int index = 1; foreach (var outDtl in bResult.OutMstList) { TN_WM_WAVE_DTLEntity waveDtlEntity = new TN_WM_WAVE_DTLEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_S_WAVE_NO = waveNo, CN_S_ORDER_NO = outDtl.CN_S_OP_NO, CN_S_STATE = Constants.State_New, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_CREATOR = user.CN_S_NAME, CN_S_CREATOR_BY = user.CN_S_LOGIN, CN_S_MODIFY = user.CN_S_NAME, CN_S_MODIFY_BY = user.CN_S_LOGIN, CN_S_MSTGUID = waveMstEntity.CN_GUID, CN_N_ORDER = index++ }; waveMstEntity.WaveDtlList.Add(waveDtlEntity); } return waveMstEntity; } #endregion #region 带出出库订单,批分,仓库实体 /// /// 带出出库订单实体 /// /// /// /// public OperateResult ChangeOutOperate(string opNos, Func, List, List, List, OperateResult> funcOut) { try { if (string.IsNullOrEmpty(opNos)) return OperateResult.Error("出库订单号不可为空"); var outMst = BLLCreator.Create>().GetList(new { CN_S_OP_NO = opNos.Split(',').ToList() }); if (!outMst.Any()) return OperateResult.Error("未找到出库订单号:" + opNos); List batchesList = new List(); foreach (var _out in outMst) { _out.OutDtlList = BLLCreator.Create>().GetList(new { CN_S_OP_NO = _out.CN_S_OP_NO, CN_C_AUTO_INOUT = false }); batchesList.AddRange(_out.OutDtlList.Select(p => { return new BatchesEntity() { ItemCode = p.CN_S_ITEM_CODE, ItemState = p.CN_S_ITEM_STATE, ItemArrivalLot = p.CN_S_LOT_CODE, ItemProductionLot = p.CN_S_PRODUCTION_BATCH, Owner = _out.CN_S_OWNER, Qty = p.CN_F_QUANTITY, OpNo = _out.CN_S_OP_NO, OutMst = _out, IsFilter = p.CN_C_AUTO_INOUT }; }).ToList()); } //当前子表物料库存 var stockList = BLLCreator.Create>().GetList(new { CN_S_ITEM_CODE = batchesList.Select(p => p.ItemCode).ToList() }); //算法策略 List lstStrate = BLLCreator.Create().GetStrateListByAreaOrStock("", "", Constants.Out) .OrderByDescending(a => a.CN_N_PRIORITY).Select(o => o.CN_S_CODE).ToList(); return funcOut(outMst, batchesList, stockList, lstStrate); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } #endregion #region 获取出库订单子表 /// /// 获取出库订单子表 /// /// /// public OperateResult GetOutDtl(string opNo) { try { var list = BLLCreator.Create>().GetList(new { CN_S_OP_NO = opNo }); return OperateResult.Succeed(null, list); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } #endregion #region 保存物流 /// /// 保存物流 /// /// [HttpPost] public OperateResult SaveWayBill(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { var outMstList = postEntity.GetPostData>(); if (outMstList == null || !outMstList.Any()) return OperateResult.Error("数据不正确"); var logisticsEntity = BLLCreator.Create>().GetSingleEntity( new { CN_S_LOGISTICS_FLAG = outMstList[0].CN_S_LOGISTICS_FLAG }); if (logisticsEntity == null) return OperateResult.Error("未找到物流公司标识:" + outMstList[0].CN_S_LOGISTICS_FLAG); //是否使用过该物流单号 var existsWayBill = BLLCreator.Create().GetList(outMstList.Select(x => x.CN_S_WAYBILL_NO).ToList()); if (existsWayBill.Any()) return OperateResult.Error("物流单号:" + string.Join(",", existsWayBill.Select(x => x.Key)) + "已使用"); outMstList.ForEach(p => { p.CN_S_LOGISTICS_NAME = logisticsEntity.CN_S_LOGISTICS_NAME; p.CN_S_FORWARDING_WAY = Constants.Forwarding_Logistics; }); List wayBillKeyType = outMstList .Select(x => new MONGO_KEYTYPE_MAP() { Key = x.CN_S_WAYBILL_NO, Type = "5" }).ToList(); //物流单号新增到mongo BLLCreator.Create().Insert(wayBillKeyType); return BLLCreator.Create().SaveWayBill(outMstList); }); } #endregion #region 波次列表 /// /// 波次列表 /// /// [HttpPost] public string WaveList(SearchModel searchModel) { return ValidateToken(searchModel.TokenId, t => { var result = BLLCreator.Create().WaveList(searchModel); IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; return JsonConvert.SerializeObject(result, timeFormat); }); } #endregion #region 保存打印 /// /// 保存打印 /// /// /// [HttpPost] public OperateResult SavePrinter(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { //仓库编码 string stockCode = Util.ToString(postEntity.PostData.stockCode); //打印机 string printer = Util.ToString(postEntity.PostData.printer); //打印模板 string printTemplet = Util.ToString(postEntity.PostData.printTemplet); //发货单号,多条 string opNos = Util.ToString(postEntity.PostData.opNos); //打印类型 PrintType printType = (PrintType)Convert.ToInt32(Util.ToString(postEntity.PostData.printType)); var currentPrint = BLLCreator.Create>().GetSingleEntity(new { CN_S_STOCK_CODE = stockCode, CN_S_PRINTER = printer, CN_S_TEMPLET_NAME = printTemplet }); if (currentPrint == null) return OperateResult.Error("未找到该打印机"); var outMstList = BLLCreator.Create>().GetList(new { CN_S_OP_NO = opNos.Split(',').ToList() }); if (!outMstList.Any()) return OperateResult.Error("未找到发货单信息"); //装箱 List outPackList = new List(); string content = string.Empty; switch (printType) { case PrintType.Logistics://物流单 List logisticsList = new List(); foreach (var outMst in outMstList) { LogisticsEntity logistics = new LogisticsEntity() { ReceiverName = outMst.CN_S_RECEIVER_NAME, ReceiverPhone = outMst.CN_S_PHONE, ReceiverTel = outMst.CN_S_TEL, PrintLot = outMst.CN_S_WAVE_CODE, LogisticsNum = outMst.CN_S_WAYBILL_NO, GoodsNum = 0, //托寄物数 ActualWeight = 0,//实际重量 ChargeWeight = 0,//计费重量 ReceiverAddress = outMst.CN_S_DETAIL_ADDRESS, Remark = outMst.CN_S_NOTE, City = outMst.CN_S_CITY, Province = outMst.CN_S_PROVINCE }; logisticsList.Add(logistics); } content = JsonConvert.SerializeObject(logisticsList).Replace('[', '<').Replace('{', '(').Replace('\"', '\'').Replace('}', ')').Replace(']', '>'); break; case PrintType.Pack://包装码 int packNum = Convert.ToInt32(Util.ToString(postEntity.PostData.packNum)); 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 = outMstList[0].CN_S_RECEIVER_NAME, ReceiverPhone = outMstList[0].CN_S_PHONE, Province = Util.ToString(outMstList[0].CN_S_PROVINCE), City = Util.ToString(outMstList[0].CN_S_CITY), Area = Util.ToString(outMstList[0].CN_S_AREA), Town = Util.ToString(outMstList[0].CN_S_TOWN), ReceiverAddress = outMstList[0].CN_S_DETAIL_ADDRESS, Logistics = outMstList[0].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 = outMstList[0].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); } content = JsonConvert.SerializeObject(optList).Replace('[', '<').Replace('{', '(').Replace('\"', '\'').Replace('}', ')').Replace(']', '>'); break; case PrintType.Invoice://出库单 break; } var printTask = new TN_WM_PRINT_TASKEntity() { CN_S_TEMPLET_TYPE = currentPrint.CN_S_TEMPLET_TYPE, CN_S_TEMPLET_NAME = currentPrint.CN_S_TEMPLET_NAME, CN_S_PRINTER = currentPrint.CN_S_PRINTER, CN_S_IP = currentPrint.CN_S_IP, CN_S_CONTENT = content, CN_GUID = Guid.NewGuid().ToString(), CN_C_IS_PRINTED = "N", CN_S_MAC = currentPrint.CN_S_MAC, CN_T_CREATE = DateTime.Now }; return BLLCreator.Create().SavePrinter(outMstList, printTask, printType, outPackList); }); } #endregion #region 验证打单数据 /// /// 验证打单数据 /// /// /// [HttpGet] public OperateResult ValidatePrint(string opNos) { return ValidateToken(t => { var list = BLLCreator.Create>().GetList(new { CN_S_OP_NO = opNos.Split(',').ToList() }); if (!list.Any()) return OperateResult.Error("所选单据不存在"); if (list.GroupBy(x => new { x.CN_S_STOCK_CODE, x.CN_S_STATE, x.CN_S_LOGISTICS_FLAG }).Count() != 1) { return OperateResult.Error("所选单据不允许打单,单据状态、所属仓库、物流公司必须一致!"); } return OperateResult.Succeed(null, list); }); } #endregion #region 获取订单日志 /// /// 获取订单日志 /// /// /// [HttpGet] public string GetBillExec(string opNo) { return ValidateToken(t => { var billExecList = BLLCreator.Create>().GetList(new { CN_S_OP_NO = opNo }, " ORDER BY CN_T_EXECUTE "); IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; return JsonConvert.SerializeObject(OperateResult.Succeed(null, billExecList), timeFormat); }); } #endregion #region 生成顺丰物流单号 /// /// 生成顺丰物流单号 /// /// /// [HttpGet] public OperateResult CreateLogistics(string outNos) { return ValidateToken(t => { var outMstList = BLLCreator.Create().GetOutList(outNos.Split(',').ToList()); List kdEBusinessList = new List(); outMstList.ForEach(x => kdEBusinessList.Add(KdApiEOrderHelper.GenerateLogistics(x))); return OperateResult.Succeed(null, kdEBusinessList); }); } #endregion #region 缺货查询列表 /// /// 缺货查询列表 /// /// /// public OperateResult OutOfStockList(PostEntity postEntity) { return ValidateToken(postEntity.TokenId, t => { return OperateResult.Succeed(); }); } #endregion } }