using HH.WMS.BLL.Basic; using HH.WMS.BLL.InStock; using HH.WMS.BLL.MoveStock; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.External; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.MoveStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.External { public class WmsApiForWxysBLL : WmsApiBaseBLL { public override ExecuteInWorkAreaPara InWorkAreaHandlePara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //任务号 考虑是否重复? if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); ; if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM入库任务号异常,请检查是否维护生成规则!"); return executeInWorkAreaPara; } } //托盘码 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode)) { //转运并且不传托盘号,默认从货位中获取 if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y") { //查找托盘号和物料编码 and by liuying var lstObj = BLLCreator.Create().GetListByLocationCode(executeInWorkAreaPara.InWorkAreaEntity.startBit); if (lstObj.Count > 0) { //去除已经在任务中的托盘 var strTray = string.Join("','", lstObj.Select(o => o.CN_S_TRAY_CODE).ToList()); var lstTasks = BLLCreator.Create().GetTask(" AND CN_S_TRAY_CODE in ('" + strTray + "') AND (CN_S_STATE = '未执行' or CN_S_STATE = '执行中')"); var lstInTaskTray = lstTasks.Select(o => o.CN_S_TRAY_CODE).ToList(); lstObj.RemoveAll(o => lstInTaskTray.Contains(o.CN_S_TRAY_CODE)); if (lstObj.Count > 0) { executeInWorkAreaPara.InWorkAreaEntity.trayCode = lstObj[0].CN_S_TRAY_CODE; var itemEntity = new ChaoYangItemDataEntity(); executeInWorkAreaPara.InWorkAreaEntity.data = new List(); //根据托盘号查询托盘产品关联信息主表 var trayItemMst = BLLCreator.Create().GetTrayItemMst(" AND CN_S_TRAY_CODE ='" + lstObj[0].CN_S_TRAY_CODE + "'"); if (trayItemMst.Count > 0) { //查询托盘产品关联信息子表 var trayItemDtl = BLLCreator.Create().GetTrayItemDtl(" AND CN_PARENT_GUID='" + trayItemMst[0].CN_GUID + "'"); itemEntity.itemCode = trayItemMst[0].CN_S_ITEM_CODE; itemEntity.itemName = trayItemMst[0].CN_S_ITEM_NAME; itemEntity.itemPackUnit = trayItemDtl[0].CN_S_PACKING_UNIT; itemEntity.qty = (decimal)(trayItemMst[0].CN_F_QUANTITY == null ? 0 : trayItemMst[0].CN_F_QUANTITY); itemEntity.lotNo = trayItemDtl[0].CN_S_PRODUCTION_BATCH; itemEntity.itemState = trayItemMst[0].CN_S_ITEM_STATE; itemEntity.productionDate = trayItemDtl[0].CN_T_PRODUCTION; itemEntity.uniqueCode = trayItemDtl[0].CN_S_UNIQUE_CODE; //itemEntity.itemWeight = trayItemDtl[0].CN_S_SERIAL_NO; itemEntity.itemModel = trayItemMst[0].CN_S_MODEL; executeInWorkAreaPara.InWorkAreaEntity.data.Add(itemEntity); } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("该货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "中的托盘都已在任务中,不允许重复下达"); } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "没有绑定托盘"); return executeInWorkAreaPara; } } else { var trayLocation = BLLCreator.Create().GetByLocationCode(executeInWorkAreaPara.InWorkAreaEntity.startBit); if (trayLocation == null) { //生成虚拟托盘 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); //executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "没有绑定托盘"); //return executeInWorkAreaPara; } else { executeInWorkAreaPara.InWorkAreaEntity.trayCode = trayLocation.CN_S_TRAY_CODE; // if (executeInWorkAreaPara.InWorkAreaEntity.projectCode == "nt001") //if (executeInWorkAreaPara.TrayInfo == null) //{ // { // executeInWorkAreaPara.BasisResponse = BasisResponse.Error("托盘信息表无当前托盘" + trayLocation.CN_S_TRAY_CODE); // return executeInWorkAreaPara; // } //} } } } //处理物料编码 if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { foreach (var itemData in executeInWorkAreaPara.InWorkAreaEntity.data) { var item = BLLCreator.Create().GetItem(itemData.itemCode); //BLLCreator.Create>().GetSingleEntity(new { CN_S_ITEM_CODE = itemData.itemCode }); if (item != null) { itemData.itemPackUnit = item.CN_S_PACK_UNIT; itemData.itemName = item.CN_S_ITEM_NAME; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料" + itemData.itemCode + "在AutoBom中没有维护"); return executeInWorkAreaPara; } } } executeInWorkAreaPara.EndLocationEntity = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.endBit); if (executeInWorkAreaPara.EndLocationEntity != null) { executeInWorkAreaPara.EndStockAreaEntity = DALCreator.Create().GetStockAreaEntity(executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE); if (executeInWorkAreaPara.EndStockAreaEntity == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + ",库区:" + executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE + "未找到库区信息!"); return executeInWorkAreaPara; } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "未找到货位信息!"); return executeInWorkAreaPara; } if (executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y")) { executeInWorkAreaPara.RollbackLocations.Add(executeInWorkAreaPara.InWorkAreaEntity.endBit); } return executeInWorkAreaPara; } #region 完工回报 public override OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara) { var executeStatePara = ExecuteStateHandlePara(taskNo, taskState, logPara); if (!executeStatePara.result.Success) return executeStatePara.result; if (executeStatePara.transportTask.CN_S_STATE == "完成") { return OperateResult.Error("已完成的任务不能再回报状态!"); } var result = new OperateResult(); switch (taskState) { case "执行中": result = StartTask(executeStatePara, logPara); break; case "完成": result = CompleteTask(executeStatePara, logPara); if (result.Success) BLLCreator.Create().CheckComplete(taskNo, null, logPara); break; case "取消": result = CancelTask(executeStatePara, logPara); break; case "空取": result = BLLCreator.Create().EmptyFetchTask(executeStatePara); break; case "取货完成": result = BLLCreator.Create().PickSucc(executeStatePara, logPara); break; case "卸货完成": result = BLLCreator.Create().UnloadingSucc(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara); break; } return result; } /// /// 完工回报-处理参数 /// /// /// /// /// public override ExecuteStateParaDto ExecuteStateHandlePara(string taskNo, string taskState, LogPara logPara) { var executeStatePara = new ExecuteStateParaDto(); executeStatePara.result = OperateResult.Succeed(); //查询任务 executeStatePara.transportTask = CreateDAL>().GetSingleEntity(new { CN_S_TASK_NO = taskNo }); //Log.Detail(logPara, LogDescribe.Content(executeStatePara.transportTask)); if (executeStatePara.transportTask == null) { executeStatePara.result = OperateResult.Error("未找到任务:" + taskNo); return executeStatePara; } //起点货位是否绑定托盘 executeStatePara.startTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //终点货位是否绑定托盘 executeStatePara.endTrayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE }); //起点货位是否绑定任务 executeStatePara.startIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_TASK_NO = taskNo }); //终点货位是否绑定任务 executeStatePara.endIsCurrentTask = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_TASK_NO = taskNo }); //托盘物料主表 executeStatePara.trayItemMsts = CreateDAL>().GetList(new { executeStatePara.transportTask.CN_S_TRAY_CODE }); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var item = CreateDAL().GetItemEntity(trayItemMst.CN_S_ITEM_CODE); trayItemMst.CN_F_INQTY = item.CN_F_NW; trayItemMst.CN_F_QUANTITY = 0;//CN_S_WEIGHT = 0;//= item.CN_F_NW; //trayItemMst.CN_F_INQTY = 0; trayItemMst.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }); //if (trayItemMst.TrayItemDtlList.Count() > 0) //{ // foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) // { // trayItemMst.CN_F_QUANTITY += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO); // trayItemMst.CN_S_UNIQUE_CODE += (trayItemDtl.CN_S_UNIQUE_CODE + ","); // trayItemMst.CN_S_LOT_NO += (trayItemDtl.CN_S_LOT_NO + ","); // trayItemMst.CN_S_FIGURE_NO += (trayItemDtl.CN_S_EXT1 + ","); // } // if (trayItemMst.CN_S_UNIQUE_CODE.Length > 0) // trayItemMst.CN_S_UNIQUE_CODE = trayItemMst.CN_S_UNIQUE_CODE.Substring(0, trayItemMst.CN_S_UNIQUE_CODE.Length - 1); // if (trayItemMst.CN_S_LOT_NO.Length > 0) // trayItemMst.CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO.Substring(0, trayItemMst.CN_S_LOT_NO.Length - 1); // if (trayItemMst.CN_S_FIGURE_NO.Length > 0) // trayItemMst.CN_S_FIGURE_NO = trayItemMst.CN_S_FIGURE_NO.Substring(0, trayItemMst.CN_S_FIGURE_NO.Length - 1); //} } } Log.Detail(logPara, "托盘物料关联表数据:" + LogDescribe.Content(executeStatePara.trayItemMsts)); //起点库区 executeStatePara.startStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_START_AREA.Trim()); //结束库区 executeStatePara.endStockArea = CreateDAL().GetStockAreaEntity(executeStatePara.transportTask.CN_S_END_AREA.Trim()); //任务状态 executeStatePara.taskState = taskState; return executeStatePara; } public override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; Log.Detail(logPara, "isControlStockQty: " + isControlStockQty); #region 组合量表参数 //获取上架量=总量-分配量 //var trayInventory = CreateDAL().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE); var addAreaQty = new List(); var addStockQty = new List(); if (isControlStockQty) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, //CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//.CN_S_WEIGHT,//重量 Convert.ToDecimal(trayItemMst.CN_F_INQTY),//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, //CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//CN_S_WEIGHT,//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } Log.Detail(logPara, LogDescribe.Content(addAreaQty)); Log.Detail(logPara, LogDescribe.Content(addStockQty)); } #endregion var or = UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.CN_S_TASK_NO + "状态为:" + executeStatePara.taskState); #region 入库 + 转运 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); #region 下架记录 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { CompleteTaskDownHistory(executeStatePara, logPara, trans); } if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //降低起点库存 { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } #endregion } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //如果起点和终点在一个库区,不增加 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库库存!"); } } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 出库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 上架 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.endTrayLocation == null) { //添加托盘货位 var addResult = BLLCreator.Create().Add(trayLocation, trans, logPara); Log.Detail(logPara, "添加托盘货位结果:" + JsonConvert.SerializeObject(addResult)); //CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 下架/叫料 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("N")) { BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); } Log.Detail(logPara, "解除起点货位和托盘的绑定!"); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; //添加托盘货位 CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } else { Log.Detail(logPara, "终点位置未管控数量!"); } } else { Log.Detail(logPara, "起点位置与托盘已经解绑!"); } } #endregion #region 空托入(上架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")) { Log.Detail(logPara, "开始执行空托入!"); var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; Log.Detail(logPara, "endTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.endTrayLocation)); if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 空托出(下架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { Log.Detail(logPara, "开始执行空托出!"); Log.Detail(logPara, "startTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.startTrayLocation)); if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); ////删除托盘产品关联 //CreateDAL().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' "); //Log.Detail(logPara, "删除当前任务的托盘物料关联!"); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //降低仓库库存 CreateDAL().ReduceStockQty(addStockQty, trans); Log.Detail(logPara, "降低仓库量表完成!"); } } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起始货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; ////添加托盘货位 //CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "空", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 移库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 下架记录 CompleteTaskDownHistory(executeStatePara, logPara, trans); #endregion #region 上架记录 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { Log.Detail(logPara, "终点库区" + executeStatePara.transportTask.CN_S_END_AREA + "不管控库存!executeStatePara.transportTask.CN_S_END_CONTROL_INV:" + executeStatePara.transportTask.CN_S_END_CONTROL_INV); trans.Rollback(); return; } #endregion #region 库存 if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) //降低起点库存 { CreateDAL().ReduceAreaQtyAndAllocQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) //增加终点库存 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion }); if (!or.Success) return or; string isSendMes = Util.ToString(System.Configuration.ConfigurationManager.AppSettings["IsSendMes"]).Trim(); if (isSendMes == Constants.Y) { if (sendTypes.Exists(e => e == executeStatePara.transportTask.CN_S_EXT1)) { var mesFeedingDtos = new List(); if (executeStatePara.UpHistory != null && executeStatePara.UpHistory.Any()) { foreach (var item in executeStatePara.UpHistory) { WxysMesFeedingDto dto = new WxysMesFeedingDto() { sendDate = DateTime.Now, sendWorkCentre = "", sendMaterialNo = item.CN_S_ITEM_CODE, sendMaterialCon = item.CN_S_ITEM_NAME, sendModel = item.CN_S_MODEL, sendUnit = item.CN_S_MEASURE_UNIT, sendNum = item.CN_F_PACKING_QTY ?? 0, sendInstructNo = item.CN_S_LOT_NO, sendOrder = item.CN_S_FIGURE_NO, sendWeight = item.CN_F_QUANTITY, sendType = executeStatePara.transportTask.CN_S_EXT1, sendNo = "" }; mesFeedingDtos.Add(dto); } } if (executeStatePara.DownHistory != null && executeStatePara.DownHistory.Any()) { foreach (var item in executeStatePara.DownHistory) { WxysMesFeedingDto dto = new WxysMesFeedingDto() { sendDate = DateTime.Now, sendWorkCentre = "", sendMaterialNo = item.CN_S_ITEM_CODE, sendMaterialCon = item.CN_S_ITEM_NAME, sendModel = item.CN_S_MODEL, sendUnit = item.CN_S_MEASURE_UNIT, sendNum = item.CN_F_PACKING_QTY ?? 0, sendInstructNo = item.CN_S_LOT_NO, sendOrder = item.CN_S_FIGURE_NO, sendWeight = item.CN_F_QUANTITY, sendType = executeStatePara.transportTask.CN_S_EXT1, sendNo = "" }; mesFeedingDtos.Add(dto); } } if (mesFeedingDtos.Any()) { IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; var req = JsonConvert.SerializeObject(mesFeedingDtos, timeFormat); Log.Info("送料完成反馈 " + executeStatePara.transportTask.CN_S_EXT1, req); var res = WebApiManager.HttpMes_Post("sbimes/YsFeeding/api/getFeeding", req); Log.Info("送料完成反馈 " + executeStatePara.transportTask.CN_S_EXT1 + " 结果", res); } } } return OperateResult.Succeed(); } public override OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { if (!executeStatePara.transportTask.CN_S_STATE.Equals("未执行") && !executeStatePara.transportTask.CN_S_STATE.Equals("执行中")) { return OperateResult.Error("只能取消未执行和执行中的任务!"); } var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; Log.Detail(logPara, "isControlStockQty: " + isControlStockQty); #region 组合量表参数 //获取上架量=总量-分配量 //var trayInventory = CreateDAL().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE); var addAreaQty = new List(); var addStockQty = new List(); if (isControlStockQty) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, // CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO), CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, //CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO), CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } Log.Detail(logPara, LogDescribe.Content(addAreaQty)); Log.Detail(logPara, LogDescribe.Content(addStockQty)); } #endregion return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState); //终点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "预入库锁定", trans); Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的状态为正常!"); //更新终点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库取消", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } //起点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "预出库锁定", trans); //更新起点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报" + executeStatePara.transportTask.CN_S_TASK_TYPE + "取消", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { //降库区分配量 // CreateDAL().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); BLLCreator.Create().ReduceQtyAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")) { //降仓库分配量 BLLCreator.Create().ReduceQtyAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); BLLCreator.Create().ReduceStockAlloc(addStockQty, trans, logPara); } } } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { Log.Detail(logPara, "降移库任务" + executeStatePara.transportTask.CN_S_TASK_NO + "的移动量"); //降移库任务的移动量 var moveStockTaskDtl = CreateDAL().GetDtlByTaskNo(executeStatePara.transportTask.CN_S_TASK_NO); if (moveStockTaskDtl != null) { CreateDAL().ReduceAllocQty(moveStockTaskDtl.CN_PARENT_GUID, trans); //ReduceMoveQty(moveStockTaskDtl.CN_PARENT_GUID, moveStockTaskDtl.CN_F_QUANTITY.ToString(), trans); //删除移库子表任务记录 CreateDAL().DeleteDtl(" CN_S_TASK_NO='" + executeStatePara.transportTask.CN_S_TASK_NO + "' ", trans); } else { Log.Detail(logPara, "未找到移库任务" + executeStatePara.transportTask.CN_S_TASK_NO + "子表的数据"); } } }); } public override void CompleteTaskUpHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var upHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID == null ? "" : trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO), CN_F_PACKING_QTY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = trayItemDtl.CN_S_UNIQUE_CODE,//trayItemMst.CN_S_UNIQUE_CODE, CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); } } //上架记录 if (upHis.Any()) { Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); CreateDAL>().AddRange(upHis, trans); executeStatePara.UpHistory = executeStatePara.UpHistory ?? new List(); executeStatePara.UpHistory.AddRange(upHis); } } List sendTypes = new List() { "正常入库", "退料入库", "其他入库", "正常出库", "其他出库" }; public override void CompleteTaskDownHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO), CN_F_PACKING_QTY = Convert.ToDecimal(trayItemDtl.CN_F_PACKING_QTY), CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = trayItemDtl.CN_S_UNIQUE_CODE, CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); } } //下架记录 if (downHis.Any()) { CreateDAL>().AddRange(downHis, trans); Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis)); executeStatePara.DownHistory = executeStatePara.DownHistory ?? new List(); executeStatePara.DownHistory.AddRange(downHis); } } #endregion public OperateResult CallMaterial(TN_WM_B_CALL_MATERIALEntity callMaterialEntity) { var response = new OperateResult(); if (callMaterialEntity == null) return OperateResult.Error("参数不全!"); response = CreateDAL>().Add(callMaterialEntity, null); return response; } public OperateResult SendMaterial(TN_WM_B_SEND_MATERIALEntity sendMaterialEntity) { var response = new OperateResult(); if (sendMaterialEntity == null) return OperateResult.Error("参数不全!"); response = CreateDAL>().Add(sendMaterialEntity, null); return response; } public List GetStockQtyInfo(string itemName, string itemCode, string stockCode, string areaCode) { StringBuilder sb = new StringBuilder(); if (!string.IsNullOrEmpty(itemName)) { sb.Append(" AND CN_S_ITEM_NAME = '" + itemName + "'"); } if (!string.IsNullOrEmpty(itemCode)) { sb.Append(" AND CN_S_ITEM_CODE = '" + itemCode + "'"); } if (!string.IsNullOrEmpty(stockCode)) { sb.Append(" AND CN_S_STOCK_CODE = '" + stockCode + "'"); } if (!string.IsNullOrEmpty(areaCode)) { sb.Append(" AND CN_S_STOCK_AREA = '" + areaCode + "'"); } List lstAreaQty = CreateDAL().GetStockQtyInfo(sb.ToString()); foreach (TN_WM_B_AREA_QTY_YSEntity areaQty in lstAreaQty) { var item = CreateDAL().GetItemEntity(areaQty.itemCode); areaQty.safeQty = item.CN_F_SAFETY_STOCK.ToString(); if (item.CN_F_NW.Equals(0)) { areaQty.availableQty = "0"; } else { areaQty.availableQty = Math.Round((Decimal.Parse(areaQty.availableWeight) / item.CN_F_NW), 0).ToString(); } } return lstAreaQty; } public List GetStockQtyDetailList(string itemName, string itemCode, string stockCode, string areaCode) { StringBuilder sb = new StringBuilder(); if (!string.IsNullOrEmpty(itemName)) { sb.Append(" AND CN_S_ITEM_NAME = '" + itemName + "'"); } if (!string.IsNullOrEmpty(itemCode)) { sb.Append(" AND CN_S_ITEM_CODE = '" + itemCode + "'"); } if (!string.IsNullOrEmpty(stockCode)) { sb.Append(" AND CN_S_STOCK_CODE = '" + stockCode + "'"); } if (!string.IsNullOrEmpty(areaCode)) { sb.Append(" AND CN_S_STOCK_AREA = '" + areaCode + "'"); } List lstStockDetail = CreateDAL().GetStockQtyDetailList(sb.ToString()); foreach (TN_WM_B_STOCK_DETAIL_YSEntity entity in lstStockDetail) { var item = CreateDAL().GetItemEntity(entity.itemCode); if (item.CN_F_NW.Equals(0)) { entity.itemQty = "0"; } else { entity.itemQty = Math.Round((Decimal.Parse(entity.itemWeight) / item.CN_F_NW), 0).ToString(); } } return lstStockDetail; } //public override string getCode() //{ // return getName(); //} public override string getName() { return "无锡宇寿"; } #region 盘点 #endregion } }