using Dapper; using Estsh.Core.Base; using Estsh.Core.Model.EnumUtil; using Estsh.Core.Models; using Estsh.Core.Services; using Estsh.Core.Wms.IRepositories; using Estsh.Core.Wms.IServices; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Estsh.Core.Wms.Services { /// /// 委外发运 /// public class OutSourceDeliveryService : BaseService, IOutSourceDeliveryService { private readonly IOutSourceDeliveryRepository repository; public OutSourceDeliveryService(IOutSourceDeliveryRepository _repository) : base(_repository) { repository = _repository; } public SetObjectDetail GetOutSourceDeliveryOrderList(string orderNo) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 List wmsMoves = repository.GetOutSourceDeliveryOrderList(orderNo); if (wmsMoves.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "成功"; rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s); } else { rfInfo.type = "FAIL"; rfInfo.message = "未查询到数据,请检查!"; } return rfInfo; } public SetObjectDetail GetOutSourceDeliveryOrderListByOrderNo(string orderNo) { SetObjectDetail rfInfo = new SetObjectDetail(); List wmsMoves = repository.GetOutSourceDeliveryOrderListByOrderNo(orderNo); if (wmsMoves.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "成功"; rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s); } else { rfInfo.type = "FAIL"; rfInfo.message = "未查询到数据,请检查!"; } return rfInfo; } public SetObjectDetail CheckStockByCartonAlocate(string cartonNo, string orderNo, string isGroup, string loginId) { SetObjectDetail rfInfo = new SetObjectDetail(); List sysStocks = repository.GetStockInfoByCartonNo(cartonNo); if (sysStocks.Count == 0) { //提示 [M0090105]:该条码不可用,请检查! rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:该条码不存在,请检查!"; return rfInfo; } else if (sysStocks[0].Enabled != "Y") { //提示 [M0090105]:箱条码已冻结,无法操作! rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码已冻结,无法操作!"; return rfInfo; } else if (sysStocks[0].Status != (int)WmsEnumUtil.StockStatus.BATCHED) { //提示 [M0090105]:该条码未配料,请检查!"; rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:该条码是["+ sysStocks[0].StockStatus + "],请检查!"; return rfInfo; } List WmsOutstocks = repository.GetOutStockByOrderNo(orderNo); if (WmsOutstocks.Count == 0) { rfInfo.type = "FAIL"; rfInfo.message = "[" + orderNo + "]:该订单是未创建或已关闭状态,请检查!"; return rfInfo; } if (isGroup == "1") { if (!string.IsNullOrEmpty(sysStocks[0].GroupNo) || sysStocks[0].GroupNo == "NULL") { sysStocks = repository.GetStockByGroupNo(sysStocks[0].GroupNo); } } List sysLocatesOut = repository.GetLocateForOutLocate(); List sqlStrings = new List(); List parameterList = new List(); StringBuilder stringBuilder = new StringBuilder(); foreach (var stock in sysStocks) { List WmsOutstockDetails = repository.GetOutStockDetailByOrderPartNo(orderNo, stock.PartNo); if (WmsOutstockDetails.Count == 0) { rfInfo.type = "FAIL"; rfInfo.message = "[" + stock.CartonNo + "]:该条码零件号不在订单内!"; return rfInfo; } List moveSnCreates = repository.GetOutStockSnByOrder(orderNo); if (moveSnCreates.Count > 0) { List wmsOutStockSns = repository.GetOutStockSnByOrderCartonNo(orderNo, stock.CartonNo); if (wmsOutStockSns.Count == 0) { rfInfo.type = "FAIL"; rfInfo.message = "订单中不包含此包装条码,不允许此操作!"; return rfInfo; } } foreach (var outStockDetail in WmsOutstockDetails) { int remainNum = Convert.ToInt32(outStockDetail.Qty - outStockDetail.OutQty);//余数 if (stock.Qty == remainNum) { if (WmsOutstocks[0].OrderStatus != (int)WmsEnumUtil.MoveOrderDetailStatus.BATCHING)//修改为处理中状态 { stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE wms_outstock SET order_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.BATCHING + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no='" + orderNo + "';"); sqlStrings.Add(stringBuilder.ToString()); } stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE wms_outstock_detail SET out_qty+=" + stock.Qty + ",item_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.COMPLETED + " ,update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE ruid='" + outStockDetail.Ruid + "';"); sqlStrings.Add(stringBuilder.ToString()); stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE sys_stock SET status=" + (int)WmsEnumUtil.StockStatus.SHIPPED + ",locate_id=" + sysLocatesOut[0].LocateId + ",locate_name='" + sysLocatesOut[0].LocateName + "',zone_id=" + sysLocatesOut[0].ZoneId + ",zone_name='" + sysLocatesOut[0].ZoneName + "',warehouse_id=" + sysLocatesOut[0].WarehouseId + ",warehouse_name='" + sysLocatesOut[0].WarehouseName + "',update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE carton_no='" + stock.CartonNo + "';"); sqlStrings.Add(stringBuilder.ToString()); stringBuilder = new StringBuilder(); //更新单据条码表 stringBuilder.Append("UPDATE dbo.wms_outstock_sn "); stringBuilder.Append("SET status = " + (int)WmsEnumUtil.MoveOrderSnStatus.SHIPPED + ", "); stringBuilder.Append(" update_userid = " + loginId + ", "); stringBuilder.Append(" update_time = CONVERT(VARCHAR(20),GETDATE(),21) "); stringBuilder.Append("WHERE order_no = '" + orderNo + "' "); stringBuilder.Append(" AND carton_no = '" + stock.CartonNo + "'; "); sqlStrings.Add(stringBuilder.ToString()); break; } else if (stock.Qty > remainNum) { rfInfo.type = "FAIL"; rfInfo.message = "[" + stock.CartonNo + "]:该条码库存大于订单需求数量!"; return rfInfo; } else if (stock.Qty < remainNum) { //处理中 if (WmsOutstocks[0].OrderStatus != (int)WmsEnumUtil.MoveOrderDetailStatus.BATCHING)//修改为处理中状态 { stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE wms_outstock SET order_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.BATCHING + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no='" + orderNo + "';"); sqlStrings.Add(stringBuilder.ToString()); } stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE wms_outstock_detail SET out_qty+=" + stock.Qty + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE ruid='" + outStockDetail.Ruid + "';"); sqlStrings.Add(stringBuilder.ToString()); stringBuilder = new StringBuilder(); stringBuilder.Append("UPDATE sys_stock SET status=" + (int)WmsEnumUtil.StockStatus.SHIPPED + ",locate_id=" + sysLocatesOut[0].LocateId + ",locate_name='" + sysLocatesOut[0].LocateName + "',zone_id=" + sysLocatesOut[0].ZoneId + ",zone_name='" + sysLocatesOut[0].ZoneName + "',warehouse_id=" + sysLocatesOut[0].WarehouseId + ",warehouse_name='" + sysLocatesOut[0].WarehouseName + "',update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE carton_no='" + stock.CartonNo + "';"); sqlStrings.Add(stringBuilder.ToString()); stringBuilder = new StringBuilder(); //更新单据条码表 stringBuilder.Append("UPDATE dbo.wms_outstock_sn "); stringBuilder.Append("SET status = " + (int)WmsEnumUtil.MoveOrderSnStatus.SHIPPED + ", "); stringBuilder.Append(" update_userid = " + loginId + ", "); stringBuilder.Append(" update_time = CONVERT(VARCHAR(20),GETDATE(),21) "); stringBuilder.Append("WHERE order_no = '" + orderNo + "' "); stringBuilder.Append(" AND carton_no = '" + stock.CartonNo + "'; "); sqlStrings.Add(stringBuilder.ToString()); break; } } stringBuilder = new StringBuilder(); stringBuilder.Append("INSERT INTO dbo.sys_stock_trans "); stringBuilder.Append("( "); stringBuilder.Append(" trans_code, "); stringBuilder.Append(" carton_no, "); stringBuilder.Append(" part_id, "); stringBuilder.Append(" part_no, "); stringBuilder.Append(" part_spec, "); stringBuilder.Append(" src_locate_id, "); stringBuilder.Append(" src_locate_name, "); stringBuilder.Append(" dest_locate_id, "); stringBuilder.Append(" dest_locate_name, "); stringBuilder.Append(" old_qty, "); stringBuilder.Append(" new_qty, "); stringBuilder.Append(" trans_qty, "); stringBuilder.Append(" old_status, "); stringBuilder.Append(" new_status, "); stringBuilder.Append(" unit, "); stringBuilder.Append(" factory_id, "); stringBuilder.Append(" factory_code, "); stringBuilder.Append(" src_erp_warehouse, "); stringBuilder.Append(" dest_erp_warehouse, "); stringBuilder.Append(" src_warehouse_id, "); stringBuilder.Append(" src_warehouse_name, "); stringBuilder.Append(" dest_warehouse_id, "); stringBuilder.Append(" dest_warehouse_name, "); stringBuilder.Append(" src_zone_id, "); stringBuilder.Append(" src_zone_name, "); stringBuilder.Append(" dest_zone_id, "); stringBuilder.Append(" dest_zone_name, "); stringBuilder.Append(" enabled, "); stringBuilder.Append(" create_userid, "); stringBuilder.Append(" create_time, "); stringBuilder.Append(" update_userid, "); stringBuilder.Append(" update_time, "); stringBuilder.Append(" guid ,ref_order_no"); stringBuilder.Append(") "); stringBuilder.Append("VALUES "); stringBuilder.Append("( '" + (int)WmsEnumUtil.TransType.OUTWARD_SHIPMENT + "', ");//委外发运 stringBuilder.Append(" '" + stock.CartonNo + "', "); stringBuilder.Append(" " + stock.PartId + ", "); stringBuilder.Append(" '" + stock.PartNo + "', "); stringBuilder.Append(" N'" + stock.PartSpec + "', "); stringBuilder.Append(" " + stock.LocateId + ", ");//源库位 stringBuilder.Append(" '" + stock.LocateName + "', "); stringBuilder.Append(" " + sysLocatesOut[0].LocateId + ", ");//目标库位 stringBuilder.Append(" '" + sysLocatesOut[0].LocateName + "', "); stringBuilder.Append(" " + stock.Qty + ","); stringBuilder.Append(" " + stock.Qty + ","); stringBuilder.Append(" " + stock.Qty + ","); stringBuilder.Append(" '" + stock.Status + "', "); stringBuilder.Append(" '" + (int)WmsEnumUtil.StockStatus.SHIPPED + "', ");//已发运 stringBuilder.Append(" '" + stock.Unit + "', "); stringBuilder.Append(" " + stock.FactoryId + ", "); stringBuilder.Append(" '" + stock.FactoryCode + "',"); stringBuilder.Append(" '" + stock.ErpWarehouse + "',"); stringBuilder.Append(" '" + stock.ErpWarehouse + "', "); stringBuilder.Append(" " + stock.WarehouseId + ", "); stringBuilder.Append(" '" + stock.WarehouseName + "', "); stringBuilder.Append(" " + sysLocatesOut[0].WarehouseId + ", "); stringBuilder.Append(" '" + sysLocatesOut[0].WarehouseName + "', "); stringBuilder.Append(" " + stock.ZoneId + ", "); stringBuilder.Append(" '" + stock.ZoneName + "', "); stringBuilder.Append(" " + sysLocatesOut[0].ZoneId + ", "); stringBuilder.Append(" '" + sysLocatesOut[0].ZoneName + "', "); stringBuilder.Append(" 'Y', "); stringBuilder.Append(" " + loginId + ", "); stringBuilder.Append(" CONVERT(VARCHAR(20),GETDATE(),21), "); stringBuilder.Append(" " + loginId + ", "); stringBuilder.Append(" CONVERT(VARCHAR(20),GETDATE(),21), "); stringBuilder.Append(" NEWID(), "); stringBuilder.Append(" '" + orderNo + "'"); stringBuilder.Append(" ) ; "); sqlStrings.Add(stringBuilder.ToString()); } int updateNum = repository.SQLTransaction(sqlStrings, parameterList); if (updateNum > 0) { List outstockDetailsProcessing = repository.GetOutstockDetailProcessing(orderNo); if (outstockDetailsProcessing.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "操作成功!请继续扫描箱条码"; rfInfo.wmsObjectDetail = outstockDetailsProcessing.ConvertAll(s => (object)s); return rfInfo; } int updateStatus = 1; sqlStrings = new List(); parameterList = new List(); StringBuilder SqlStringBuilder = new StringBuilder(1024); DynamicParameters parameters = new DynamicParameters(); List wmsOutstockDetails = repository.GetFinishOutStockDetailByOrderNo(orderNo); if (wmsOutstockDetails.Count > 0) { SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("INSERT INTO dbo.WMS_MOVR(ZINSTNO,ZEILE,WERKS,LGORT,UMLGO,LIFNR,MATNR,ERFMG "); SqlStringBuilder.Append(" ,ERFME,ACTION,ZPOST,ZTIME,SID,RECTIM,SYNFLG "); SqlStringBuilder.Append(" ,GUID) "); SqlStringBuilder.Append(" VALUES(@ZINSTNO,@ZEILE,@WERKS,@LGORT,@UMLGO,@LIFNR,@MATNR,@ERFMG,@ERFME "); SqlStringBuilder.Append(" ,@ACTION,@ZPOST,@ZTIME,@SID,@RECTIM,@SYNFLG "); SqlStringBuilder.Append(" ,@GUID) "); int rows = 0; string sid = Guid.NewGuid().ToString().Replace("-", ""); foreach (var outStockDetail in wmsOutstockDetails) { SysPart sysPart = repository.GetPartNOInfoByPartNo(outStockDetail.PartNo); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@ZINSTNO", outStockDetail.OrderNo);//委外发运 parameters.Add("@ZEILE", outStockDetail.ItemNo);//行号 parameters.Add("@WERKS", outStockDetail.FactoryCode);//工厂 parameters.Add("@LGORT", outStockDetail.SrcErpWarehouse);//发出库存地点 parameters.Add("@UMLGO", "");//接收库存地点 parameters.Add("@LIFNR", outStockDetail.VendorCode);//供应商代码 parameters.Add("@MATNR", outStockDetail.PartNo);//物料编码 parameters.Add("@ERFMG", outStockDetail.OutQty);//转储数量 if (sysPart == null) { parameters.Add("@ERFME", "");//计量单位 } else { parameters.Add("@ERFME", sysPart.Unit);//计量单位 } parameters.Add("@ACTION", "M04"); //M04:委外发运 parameters.Add("@ZPOST", DateTime.Now.ToString("yyyyMMdd"));//交易日期 parameters.Add("@ZTIME", DateTime.Now.ToString("HHmmss"));//交易时间 parameters.Add("@SID", sid); parameters.Add("@RECTIM", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); parameters.Add("@SYNFLG", "N"); parameters.Add("@GUID", Guid.NewGuid().ToString()); parameterList.Add(parameters); } SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock SET order_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.COMPLETED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock_detail SET item_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.COMPLETED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock_sn SET status=" + (int)WmsEnumUtil.MoveOrderSnStatus.PROCESSED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); updateStatus = repository.SQLTransaction(sqlStrings, parameterList); } if (updateStatus > 0) { rfInfo.type = "PASS"; rfInfo.message = "订单操作完成!"; } else { rfInfo.type = "FAIL"; rfInfo.message = "订单操作失败!请检查"; } } else { //提示 操作失败! rfInfo.type = "FAIL"; rfInfo.message = "操作失败,请检查!"; } return rfInfo; } public SetObjectDetail SetOutSourceDeliveryOrderNoSubmit(string orderNo, string loginId) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 List sqlStrings = new List(); List parameterList = new List(); DynamicParameters parameters = new DynamicParameters(); StringBuilder SqlStringBuilder = new StringBuilder(1024); int updateStatus = 1; WmsOutstockDetail wmsOutstocks = repository.GetOutStockDetailQtySumByOrder(orderNo); if (wmsOutstocks.PickQty <= wmsOutstocks.OutQty) { List wmsOutstockDetails = repository.GetFinishOutStockDetailByOrderNo(orderNo); if (wmsOutstockDetails.Count > 0) { SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("INSERT INTO dbo.WMS_MOVR(ZINSTNO,ZEILE,WERKS,LGORT,UMLGO,LIFNR,MATNR,ERFMG "); SqlStringBuilder.Append(" ,ERFME,ACTION,ZPOST,ZTIME,SID,RECTIM,SYNFLG "); SqlStringBuilder.Append(" ,GUID) "); SqlStringBuilder.Append(" VALUES(@ZINSTNO,@ZEILE,@WERKS,@LGORT,@UMLGO,@LIFNR,@MATNR,@ERFMG,@ERFME "); SqlStringBuilder.Append(" ,@ACTION,@ZPOST,@ZTIME,@SID,@RECTIM,@SYNFLG "); SqlStringBuilder.Append(" ,@GUID) "); int rows = 0; string sid = Guid.NewGuid().ToString().Replace("-", ""); foreach (var outStockDetail in wmsOutstockDetails) { SysPart sysPart = repository.GetPartNOInfoByPartNo(outStockDetail.PartNo); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@ZINSTNO", outStockDetail.OrderNo);//委外发运 parameters.Add("@ZEILE", outStockDetail.ItemNo);//行号 parameters.Add("@WERKS", outStockDetail.FactoryCode);//工厂 parameters.Add("@LGORT", outStockDetail.SrcErpWarehouse);//发出库存地点 parameters.Add("@UMLGO", "");//接收库存地点 parameters.Add("@LIFNR", outStockDetail.VendorCode);//供应商代码 parameters.Add("@MATNR", outStockDetail.PartNo);//物料编码 parameters.Add("@ERFMG", outStockDetail.OutQty);//转储数量 if (sysPart == null) { parameters.Add("@ERFME", "");//计量单位 } else { parameters.Add("@ERFME", sysPart.Unit);//计量单位 } parameters.Add("@ACTION", "M04"); //M04:委外发运 parameters.Add("@ZPOST", DateTime.Now.ToString("yyyyMMdd"));//交易日期 parameters.Add("@ZTIME", DateTime.Now.ToString("HHmmss"));//交易时间 parameters.Add("@SID", sid); parameters.Add("@RECTIM", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); parameters.Add("@SYNFLG", "N"); parameters.Add("@GUID", Guid.NewGuid().ToString()); parameterList.Add(parameters); } SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock SET order_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.COMPLETED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock_detail SET item_status=" + (int)WmsEnumUtil.MoveOrderDetailStatus.COMPLETED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); SqlStringBuilder = new StringBuilder(1024); SqlStringBuilder.Append("UPDATE wms_outstock_sn SET status=" + (int)WmsEnumUtil.MoveOrderSnStatus.PROCESSED + ",update_userid=" + loginId + ",update_time=CONVERT(VARCHAR(20),GETDATE(),21) WHERE order_no=@orderNo;"); sqlStrings.Add(SqlStringBuilder.ToString()); parameters = new DynamicParameters(); parameters.Add("@orderNo", orderNo); parameterList.Add(parameters); updateStatus = repository.SQLTransaction(sqlStrings, parameterList); } if (updateStatus > 0) { rfInfo.type = "PASS"; rfInfo.message = "[" + orderNo + "]订单已提交,请重新选择订单"; } else { rfInfo.type = "FAIL"; rfInfo.message = "未查询到数据,请检查!"; } } else { rfInfo.type = "FAIL"; rfInfo.message = "[" + orderNo + "]该订单配料数未完全发运,请检查!"; } return rfInfo; } } }