123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- using System;
- using System.Collections.Generic;
- using WMS.Core._02Entity;
- using WMS.Info;
- using WMS.Info.Models;
- using WMS.Util;
- namespace WMS.Core.APPBLL
- {
- public class EmptyTrayBLL : AppCoreBLL
- {
- public EmptyTrayBLL(bool isSkipOauth = false) : base(isSkipOauth)
- {
- }
- public ResInfo StockOut(EmptyTrayRequestDto reqData)
- {
- using (var ctx = SysDbCore.GetDbCtx())
- {
- ctx.BeginTran();
- try
- {
- if (string.IsNullOrWhiteSpace(reqData?.LocationNo))
- throw SysExCore.ThrowFailException("参数不能为空");
- var task = new WMS_TASK
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_isBonded = reqData.IsBonded,
- F_posidTo = reqData.LocationNo,
- F_priority = (int)EPriority.NotUrgent,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_taskType = (int)ETaskComType.OutStock
- };
- if (reqData.IsGroup)//空托盘组需要生成出库单和出库任务
- {
- if (ctx.Queryable<WMS_TASK>().Any(c => c.F_posidTo == reqData.LocationNo && c.F_taskStatus < (int)ETaskStatus.TaskFinish))
- return SysExCore.GetResSucc("请勿重复创建任务");
- var inventoryEntity = ctx.Queryable<BILL_INVENTORY>().Where(it => it.F_matType == (int)EMatType.Tary && it.F_isBonded == reqData.IsBonded).First();
- if (inventoryEntity == null)
- throw SysExCore.ThrowFailException("没有可用的空托盘组库存");
- var loctionEntity = ctx.Queryable<BASE_LOCATION>().Where(it => it.F_trayNo == inventoryEntity.F_trayNo).First();
- if (loctionEntity == null)
- throw SysExCore.ThrowFailException($"托盘{inventoryEntity.F_trayNo}货位数据状态异常!");
- if (loctionEntity.F_status != (int)EWareCellState.Stored)
- throw SysExCore.ThrowFailException($"当前已存在空托盘组出库任务!");
- var point = ctx.Queryable<BASE_POINT>().Where(c => c.F_no == reqData.LocationNo || c.F_agv == reqData.LocationNo).First();
- if (point == null)
- throw SysExCore.ThrowFailException($"当前点位信息无效!");
- if (point.F_type == (int)EPointType.BSCPJ || point.F_type == (int)EPointType.CPJ)
- task.F_posidNext = reqData.LocationNo;
- else
- task.F_posidNext = GetFreePointInfoByType((int)EPointType.YCK)?.F_no;//目标地址为agv点位从整盘口出
- var stockOut = new BILL_STOCKOUT
- {
- F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- //F_locationNo = loctionEntity.F_no,
- F_orderStatus = (int)EOrderState.New,
- F_totalOrderLines = 0,
- F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTray,
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
- };
- ctx.Insertable(stockOut).ExecuteReturnEntity();
- var stockOutLine = new BILL_STOCKOUTLINE
- {
- F_addTime = DateTime.Now,
- F_actualQty = 1,
- F_addUserNo = LoginUser.UserNo,
- F_matNo = inventoryEntity.F_matNo,
- F_matName = inventoryEntity.F_matName,
- F_matType = inventoryEntity.F_matType,
- F_orderLineNo = 1,
- F_pNo = stockOut.F_no,
- F_planQty = 1,
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
- };
- ctx.Insertable(stockOutLine).ExecuteReturnEntity();
- var stockOutLineDetail = new BILL_STOCKOUTLINEDETAIL
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_locationNo = reqData.LocationNo,
- F_boxNo = inventoryEntity.F_boxNo,
- F_matName = SysSetCore.GetSysSet().DefaultEmptyTrayGroupName,
- F_matNo = SysSetCore.GetSysSet().DefaultEmptyTrayGroupNo,
- F_matType = (int)EMatType.Tary,
- F_quantity = 1,
- F_pNo = stockOut.F_no
- };
- ctx.Insertable(stockOutLine).ExecuteReturnEntity();
- task.F_orderNo = stockOut?.F_no;
- task.F_posidFrom = loctionEntity.F_no;
- task.F_posidcur = loctionEntity.F_no;
- task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeEmptyTrayGroup;
- task.F_trayNo = inventoryEntity.F_trayNo;
- task.F_EquipmentType = (int)EEquipmentType.RGV;
- var upd = ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
- {
- F_status = (int)EWareCellState.Out,
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- //F_isBonded = reqData.IsBonded
- }).Where(w => w.F_no == loctionEntity.F_no).ExecuteCommand();
- if (upd <= 0)
- throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
- }
- else
- {
- //验证拆盘机是否还有托盘
- var pointEntiry = GetFreePointInfoByType(reqData.IsBonded ? (int)EPointType.BSCPJ : (int)EPointType.CPJ);
- if (pointEntiry == null)
- throw SysExCore.ThrowFailException("获取拆盘机信息异常");
- PolicyHelper.GetRetryTimesPolicy(3, ex =>
- {
- throw ex;
- }).Execute(() =>
- {
- var resStr = httpClinet.Get(null, $"/api/Equipment/CheckState?equNo={ pointEntiry.F_no}");
- var result = resStr.ToObject<WCSResponse>();
- if (result == null || !result.isSuccess)
- throw SysExCore.ThrowFailException($"调用wcs接口失败{result?.msg}!");
- if ((bool)result.data == true)
- throw SysExCore.ThrowFailException($"任务创建失败,没有托盘库存!");
- });
- task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeTray;
- task.F_posidFrom = pointEntiry.F_no;
- task.F_posidcur = pointEntiry.F_no;
- task.F_EquipmentType = (int)EEquipmentType.Convey;
- }
- ctx.Insertable(task).ExecuteReturnEntity();
- ctx.CommitTran();
- return SysExCore.GetResSucc();
- }
- catch (Exception ex)
- {
- ctx.RollbackTran();
- throw ex;
- }
- finally
- {
- ctx.Dispose();
- }
- }
- }
- public ResInfo TrayEntry(ScanCodeRequest reqData)
- {
- using (var ctx = SysDbCore.GetDbCtx())
- {
- try
- {
- if (string.IsNullOrWhiteSpace(reqData?.LocationNo) || string.IsNullOrWhiteSpace(reqData.TrayNo))
- throw SysExCore.ThrowFailException("参数不能为空!");
- var point = ctx.Queryable<BASE_POINT>().First(p => p.F_no == reqData.LocationNo);
- if (point == null || !(point.F_type >= (int)EPointType.YLCKJXK && point.F_type <= (int)EPointType.YLRKJXK))
- throw SysExCore.ThrowFailException("请扫码正确的位置码!");
- if (ctx.Queryable<BILL_INVENTORY>().Any(a => a.F_trayNo == reqData.TrayNo))
- throw SysExCore.ThrowFailException("当前托盘存在货位信息,无法生成空托盘入库任务!");
- var task = new WMS_TASK
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_trayNo = reqData.TrayNo,
- F_posidTo = GetFreePointInfoByType(reqData.TrayNo.StartsWith("B") ? (int)EPointType.BSDPJ : (int)EPointType.DPJ).F_no,
- F_isBonded = reqData.TrayNo.StartsWith("B"),
- F_priority = (int)EPriority.NotUrgent,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_taskType = (int)ETaskComType.InStock,
- F_EquipmentType = (int)EEquipmentType.Convey,
- F_posidFrom = reqData.LocationNo,
- F_posidcur = reqData.LocationNo,
- F_orderType = (int)ETaskOrderType.EntryOrderTypeTray,
- };
- task.F_posidNext = task.F_posidTo;
- ctx.Insertable(task).ExecuteReturnEntity();
- return SysExCore.GetResSucc("空托盘入库任务生成成功");
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- public ResInfo TrayGroupEntry(ScanCodeRequest reqData, bool IsBonded = false)
- {
- using (var ctx = SysDbCore.GetDbCtx())
- {
- try
- {
- if (string.IsNullOrWhiteSpace(reqData?.LocationNo))
- throw SysExCore.ThrowFailException("参数不能为空");
- if (ctx.Queryable<WMS_TASK>().Any(c => c.F_posidFrom == reqData.LocationNo && c.F_taskStatus < (int)ETaskStatus.TaskFinish))
- return SysExCore.GetResSucc("请勿重复创建任务");
- if (!string.IsNullOrWhiteSpace(reqData.TrayNo) && !IsBonded)
- IsBonded = reqData.TrayNo.StartsWith("B");
- reqData.TrayNo = string.IsNullOrWhiteSpace(reqData.TrayNo) ? Guid.NewGuid().ToString() : reqData.TrayNo;//界面传入托盘码只为了区分是否保税,托盘组默认生成guid以便存库操作
- var point = ctx.Queryable<BASE_POINT>().First(p => p.F_no == reqData.LocationNo && p.F_status == (int)EPointSatus.Idle);
- if (point.F_type == (int)EPointType.YCK)//异常口处理逻辑
- {
- var curTask = ctx.Queryable<WMS_TASK>().Where(f => f.F_taskStatus < (int)ETaskStatus.TaskFinish && f.F_trayNo == reqData.TrayNo).First();
- if (curTask == null)
- throw SysExCore.ThrowFailException("当前异常任务找不到对应的入库任务!");
- ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
- {
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- F_posidFrom = reqData.LocationNo,
- F_posidcur = reqData.LocationNo,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_posidNext = "1036"
- }).Where(w => w.F_taskNo == curTask.F_taskNo).ExecuteCommand();
- ctx.CommitTran();
- return SysExCore.GetResSucc("异常口任务生成成功"); ;
- }
- if (point == null || (point.F_type != (int)EPointType.DPJ && point.F_type != (int)EPointType.CPAGV && point.F_type != (int)EPointType.BSDPJ))
- throw SysExCore.ThrowFailException("点位信息无效!");
- ctx.BeginTran();
- var task = new WMS_TASK
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_trayNo = reqData.TrayNo,
- F_isBonded = IsBonded,
- //F_posidNext = GetFreePointInfoByType((int)EPointType.RKDFPHWDW).F_no,
- F_priority = (int)EPriority.NotUrgent,
- F_taskStatus = (int)ETaskStatus.NotIssued,
- F_taskType = (int)ETaskComType.InStock,
- F_posidFrom = reqData.LocationNo,
- F_posidcur = reqData.LocationNo,
- F_orderType = (int)ETaskOrderType.EntryOrderTypeTrayGroup
- };
- //task.F_posidFrom = GetFreePointInfoByType(reqData.TrayNo.StartsWith("B") ? (int)EPointType.BSDPJ : (int)EPointType.DPJ).F_no;
- var entryorder = ctx.Insertable(new BILL_ENTRYORDER
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_isBonded = IsBonded,
- F_orderStatus = (int)EOrderState.New,
- F_orderType = (int)EEntryOrderType.EntryOrderTypeTray,
- F_no = SerialNumberProvider.Instance.OrderNumber("wms", "RK"),
- F_totalOrderLines = 0,
- F_trayNo = reqData.TrayNo,
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
- }).ExecuteReturnEntity();
- task.F_orderNo = entryorder.F_no;
- //添加空托盘库存
- List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
- lstInv.Add(new BILL_INVENTORY
- {
- F_addTime = DateTime.Now,
- F_addUserNo = LoginUser.UserNo,
- F_editTime = DateTime.Now,
- F_matNo = SysSetCore.GetSysSet().DefaultEmptyTrayGroupNo,
- F_matType = (int)EMatType.Tary,
- F_quantity = 1,
- F_trayNo = reqData.TrayNo,
- F_boxNo = Guid.NewGuid().ToString(),
- F_matName = SysSetCore.GetSysSet().DefaultEmptyTrayGroupName,
- F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
- });
- //更新库存
- UpdateInventory(lstInv, ctx);
- if (point.F_type == (int)EPointType.CPAGV)
- {
- var p = GetFreePointInfoByType((int)EPointType.SSXRK);
- task.F_EquipmentType = (int)EEquipmentType.AGV;
- task.F_posidNext = p.F_no;
- }
- else
- {
- var loc = ctx.Queryable<BASE_LOCATION>().OrderBy("F_layer ASC, F_line DESC,F_cell asc").First(f => f.F_status == (int)EWareCellState.Empty);
- if (loc == null)
- throw SysExCore.ThrowFailException($"没有可分配的货位!");
- ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
- {
- F_editTime = DateTime.Now,
- F_editUserNo = LoginUser.UserNo,
- F_status = (int)EWareCellState.In,
- F_isBonded = IsBonded,
- F_trayNo = reqData.TrayNo
- }).Where(it => it.F_no == loc.F_no).ExecuteCommand();
- task.F_EquipmentType = (int)EEquipmentType.Convey;
- task.F_posidNext = loc.F_no;
- task.F_posidTo = loc.F_no;
- }
- ctx.Insertable(task).ExecuteReturnEntity();
- ctx.CommitTran();
- return SysExCore.GetResSucc("空托盘组入库任务生成成功");
- }
- catch (Exception ex)
- {
- ctx.RollbackTran();
- throw ex;
- }
- }
- }
- }
- }
|