You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
867 lines
42 KiB
867 lines
42 KiB
using Newtonsoft.Json.Linq;
|
|
using Newtonsoft.Json;
|
|
using NFine.Code;
|
|
using NFine.Data.Extensions;
|
|
using NFine.Domain._03_Entity.SRM;
|
|
using NFine.Repository;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Configuration;
|
|
using System.IO;
|
|
using System.Net;
|
|
using NFine.Application.WMS;
|
|
using NFine.Application.Models;
|
|
using System.Reflection;
|
|
using NFine.Application.Entity;
|
|
using NFine.Domain.Entity.SystemSecurity;
|
|
using System.Xml;
|
|
using System.Collections;
|
|
|
|
namespace NFine.Application.MFWMS
|
|
{
|
|
/// <summary>
|
|
/// HUB仓销售出库、销售退货
|
|
/// </summary>
|
|
public class ICSSSDApp : RepositoryFactory<ICSVendor>
|
|
{
|
|
public static DataTable Invmes = new DataTable();
|
|
/// <summary>
|
|
/// 销售发货 汇总查询
|
|
/// </summary>
|
|
/// <param name="queryJson"></param>
|
|
/// <param name="jqgridparam"></param>
|
|
/// <returns></returns>
|
|
public DataTable GetSDNBackApplyNeg(string queryJson, string Type, ref Pagination jqgridparam)
|
|
{
|
|
//站点信息
|
|
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
|
|
DataTable dt = new DataTable();
|
|
List<DbParameter> parameter = new List<DbParameter>();
|
|
var queryParam = queryJson.ToJObject();
|
|
object Figure = GetDecimalDigits();
|
|
#region [SQL]
|
|
string sql = "";
|
|
// 同步过来的销售发货 出库
|
|
if (Type == "001")
|
|
{
|
|
// AccomplishFlag 决定是否完成了审核
|
|
sql = @" select * from (
|
|
select distinct ROW_NUMBER() OVER(PARTITION BY a.SDNCode, a.MUSERName,a.MTIME,a.Status,a.Type,a.ArriveDate,d.ID order by a.MTIME desc) RowFalg
|
|
,a.SDNCode, a.MUSERName,a.MTIME,a.Status,a.Type ,b.WarehouseCode as WHCode,b.WarehouseName as WHName,a.ArriveDate
|
|
,case when ISNULL(d.ID,'') != '' then 1 else 0 end as AccomplishFlag
|
|
from ICSSDN a
|
|
join ICSWarehouse b on a.WHCode = b.WarehouseCode and a.WorkPoint = b.WorkPoint
|
|
join ICSInventory c on a.InvCode = c.InvCode and a.WorkPoint = b.WorkPoint
|
|
left join ICSSSD d on a.SDNCode = d.SDNCode and a.Sequence = d.SDNSequence and a.WorkPoint=d.WorkPoint
|
|
where a.Type = '1' ";
|
|
sql = string.Format(sql, Figure);
|
|
sql = string.Format(sql, DbHelper.GetErpIp(), DbHelper.GetErpName());
|
|
|
|
}
|
|
else
|
|
{
|
|
// AccomplishFlag 决定是否完成了审核
|
|
// 销售退货 入库
|
|
sql = @" select * from (
|
|
select distinct ROW_NUMBER() OVER(PARTITION BY a.SDNCode, a.MUSERName,a.MTIME,a.Status,a.Type,a.ArriveDate,d.ID order by a.MTIME desc) RowFalg
|
|
,a.SDNCode, a.MUSERName,a.MTIME,a.Status,a.Type ,b.WarehouseCode as WHCode,b.WarehouseName as WHName,a.ArriveDate
|
|
,case when ISNULL(d.ID,'') != '' then 1 else 0 end as AccomplishFlag
|
|
from ICSSDN a
|
|
join ICSWarehouse b on a.WHCode = b.WarehouseCode and a.WorkPoint = b.WorkPoint
|
|
join ICSInventory c on a.InvCode = c.InvCode and a.WorkPoint = b.WorkPoint
|
|
left join ICSSSD d on a.SDNCode = d.SDNCode and a.Sequence = d.SDNSequence and a.InvCode = d.InvCode and a.WorkPoint=d.WorkPoint
|
|
where a.Type = '2' ";
|
|
sql = string.Format(sql, Figure);
|
|
sql = string.Format(sql, DbHelper.GetErpIp(), DbHelper.GetErpName());
|
|
}
|
|
|
|
#endregion
|
|
if (!string.IsNullOrWhiteSpace(queryJson))
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(queryParam["POCode"].ToString()))
|
|
{
|
|
sql += " and a.SDNCode like '%" + queryParam["POCode"].ToString() + "%' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["InvCode"].ToString()))
|
|
{
|
|
sql += " and a.InvCode like '%" + queryParam["InvCode"].ToString() + "%' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["InvName"].ToString()))
|
|
{
|
|
sql += " and c.InvName like '%" + queryParam["InvName"].ToString() + "%' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["WHCode"].ToString()))
|
|
{
|
|
sql += " and b.WarehouseCode like '%" + queryParam["WHCode"].ToString() + "%' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["WHName"].ToString()))
|
|
{
|
|
sql += " and b.WarehouseName like '%" + queryParam["WHName"].ToString() + "%' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["FromTime"].ToString()))
|
|
{
|
|
sql += " and a.ArriveDate >= '" + queryParam["FromTime"].ToString() + "' ";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["ToTime"].ToString()))
|
|
{
|
|
sql += " and a.ArriveDate <= '" + queryParam["ToTime"].ToString() + "' ";
|
|
}
|
|
//if (!string.IsNullOrWhiteSpace(queryParam["BatchCode"].ToString()))
|
|
//{
|
|
// sql += " and f.BatchCode like '%" + queryParam["BatchCode"].ToString() + "%' ";
|
|
//}
|
|
if (!string.IsNullOrWhiteSpace(queryParam["AuditStatus"].ToString()))
|
|
{
|
|
var AuditStatus = queryParam["AuditStatus"].ToInt();
|
|
if (AuditStatus == 1)
|
|
{
|
|
//已审核
|
|
sql += " and ISNULL(d.ID,'') != '' ";
|
|
}
|
|
else if (AuditStatus == 2)
|
|
{
|
|
//未审核
|
|
sql += " and ISNULL(d.ID,'') = '' ";
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
if (Type == "001")
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(queryParam["SDNQtyFlag"].ToString()))
|
|
{
|
|
var SDNQtyFlag = queryParam["SDNQtyFlag"].ToInt();
|
|
if (SDNQtyFlag == 1)
|
|
{
|
|
//已审核
|
|
sql += " and a.SDNQuantity >= a.Quantity ";
|
|
}
|
|
else if (SDNQtyFlag == 2)
|
|
{
|
|
//未审核
|
|
sql += " and a.SDNQuantity < a.Quantity ";
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
if (NFine.Code.OperatorProvider.Provider.GetCurrent().RoleEnCode != "admin")
|
|
{
|
|
sql += " and a.WorkPoint='" + NFine.Code.OperatorProvider.Provider.GetCurrent().Location + "'";
|
|
}
|
|
sql += @" --GROUP BY a.SDNCode, a.MUSERName,a.MTIME,a.Status,a.Type,a.ArriveDate,d.ID
|
|
) t where RowFalg = 1";
|
|
return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
|
|
}
|
|
public object GetDecimalDigits()
|
|
{
|
|
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
|
|
try
|
|
{
|
|
string sql = string.Empty;
|
|
sql = @"select Figure from ICSConfiguration where Code='Figure001' and Enable='1' and WorkPoint='" + WorkPoint + "'";
|
|
object Figure = SqlHelper.ExecuteScalar(sql);
|
|
return Figure;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception(ex.Message.ToString());
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// HUB销售出库
|
|
/// </summary>
|
|
/// <param name="queryJson"></param>
|
|
/// <returns></returns>
|
|
public string AuditDelSDN(string keyValue)
|
|
{
|
|
string msg = string.Empty;
|
|
try
|
|
{
|
|
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location.TrimEnd(',');
|
|
string UserName = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
|
|
string UserCode = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
|
|
List<LOTStockModel> lOTStockModels = new List<LOTStockModel>();
|
|
var dateNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
var Code = keyValue.TrimEnd(',');
|
|
//单据先进行拣料
|
|
DataTable dateTable = GetICSMOPickMergeTemp(Code, "7");
|
|
if (dateTable == null)
|
|
{
|
|
msg = "库存数据为空,请先检查库存";
|
|
return msg;
|
|
}
|
|
DataRow[] dateRowsIsNull = dateTable?.Select($@"ISNULL(LotNo,'') = ''");
|
|
//是否条码匹配错误
|
|
if (dateRowsIsNull.Length > 0)
|
|
{
|
|
msg = "过滤空条码库存后库存数据为空,请先检查库存";
|
|
return msg;
|
|
}
|
|
DataRow[] dateRows = dateTable?.Select($@"LotNo <> '' And LotNo is not null");
|
|
|
|
//decimal ToltalCount = 0.0M;
|
|
string tablesql = $@" SELECT ID,SDNCode,Sequence,Quantity FROM ICSSDN WHERE SDNCode in({Code}) and Type = '1' and WorkPoint='{WorkPoint}' ";
|
|
var dt = SqlHelper.CmdExecuteDataTable(tablesql);
|
|
|
|
if (dateRows == null || dateRows.Length <= 0)
|
|
{
|
|
msg = "过滤空条码库存后库存数据为空,请先检查库存";
|
|
return msg;
|
|
}
|
|
else
|
|
{
|
|
string docCode = string.Empty;
|
|
string docCodeAfter = string.Empty;
|
|
LOTStockModel lOTStockModel = null;
|
|
|
|
// 使用 LINQ 根据 Code 字段对 DataRow[] 进行分组
|
|
var groups = dateRows.Cast<DataRow>().GroupBy(row => new
|
|
{
|
|
Code = row.Field<string>("Code"),
|
|
Sequence = row.Field<string>("Sequence"),
|
|
iQuantity = row.Field<string>("iQuantity")
|
|
});
|
|
//将捡料数据分组
|
|
foreach (var group in groups)
|
|
{
|
|
var firstRow = group.First();
|
|
var code = firstRow["Code"];
|
|
decimal count = 0.0M;
|
|
// 存储过程返回的条码 匹配到具体数据的ID
|
|
DataRow[] SDNSequenceRow = dt?.Select("SDNCode='" + firstRow["Code"].ToString() + "' and Sequence='" + firstRow["Sequence"].ToString() + "'");
|
|
if (SDNSequenceRow.Length <= 0)
|
|
{
|
|
msg = "条码未能匹配销售发货表!";
|
|
return msg;
|
|
}
|
|
//出库数量
|
|
decimal Qty = Convert.ToDecimal(SDNSequenceRow[0]["Quantity"]);
|
|
lOTStockModel = new LOTStockModel
|
|
{
|
|
TransID = SDNSequenceRow[0]["ID"].ToString(),
|
|
TransCode = firstRow["Code"].ToString(),
|
|
TransSequence = firstRow["Sequence"].ToString(),
|
|
TransType = "销售发货-销售发货单",
|
|
Amount = "0",
|
|
User = UserCode,
|
|
Quantity = SDNSequenceRow[0]["Quantity"].ToString(),
|
|
MTime = dateNow,
|
|
WorkPoint = WorkPoint,
|
|
detail = new List<LOTStockModelList>(),
|
|
};
|
|
|
|
foreach (var row in group)
|
|
{
|
|
count += row["QTY"].ToDecimal();
|
|
LOTStockModelList lOTStockModelList = new LOTStockModelList
|
|
{
|
|
CurrentQuantity = row["QTY"].ToString(),
|
|
LotNo = row["LotNo"].ToString(),
|
|
CurrentAmount = "0",
|
|
Sequence = row["Sequence"].ToString(),
|
|
WarehouseCode = row["WarehouseCode"].ToString(),
|
|
LocationCode = row["LocationCode"].ToString()
|
|
};
|
|
lOTStockModel.detail.Add(lOTStockModelList);
|
|
}
|
|
// 库存数量与出库审核数量对比
|
|
if (Qty > count)
|
|
{
|
|
msg = "出库单编码:" + firstRow["Code"].ToString() + ",库存数量不足。当前库存数量:" + count.ToString();
|
|
return msg;
|
|
}
|
|
//lOTStockModel.Quantity = count.ToString();
|
|
lOTStockModels.Add(lOTStockModel);
|
|
}
|
|
|
|
string Inputstr = JsonConvert.SerializeObject(lOTStockModels.Distinct());
|
|
|
|
string APIURL = ConfigurationManager.ConnectionStrings["APIURL"].ConnectionString + "LOTStockDown/Create";
|
|
string result = HttpPost(APIURL, Inputstr);
|
|
JObject Obj = (JObject)JsonConvert.DeserializeObject(result);//或者JObject jo = JObject.Parse(jsonText);
|
|
string MessAge = Obj["Message"].ToString();
|
|
string Success = Obj["Success"].ToString();
|
|
|
|
if (Success.ToUpper() == "FALSE")
|
|
{
|
|
msg = MessAge;
|
|
return msg;
|
|
}
|
|
//生成销售出库单
|
|
string SDNsql = $@"select a.SDNCode,a.Sequence as SDNSequence,a.Amount,a.WHCode,a.CusCode,a.CusName,a.ArriveDate,a.InvCode,a.ExtensionID,a.Quantity
|
|
from ICSSDN a where a.SDNCode in({Code}) and WorkPoint='{WorkPoint}' and a.Type = '1' ";
|
|
DataTable SDNdt = SqlHelper.CmdExecuteDataTable(SDNsql);
|
|
DataRow[] SDNRows = SDNdt?.Select($@"SDNCode <> '' And SDNCode is not null");
|
|
var ICSSSDList = new List<ICSSSD>();
|
|
var SDNgroups = SDNRows.Cast<DataRow>().GroupBy(row => new
|
|
{
|
|
Code = row.Field<string>("SDNCode"),
|
|
});
|
|
|
|
foreach (var SDNgroup in SDNgroups)
|
|
{
|
|
var SSDCode = GetOOCode(WorkPoint);
|
|
foreach (var SDNitem in SDNgroup)
|
|
{
|
|
var index = 1;
|
|
var entity = new ICSSSD
|
|
{
|
|
ID = Guid.NewGuid().ToString(),
|
|
SSDCode = SSDCode,
|
|
Quantity = Convert.ToDecimal(SDNitem["Quantity"]),
|
|
Amount = Convert.ToDecimal(SDNitem["Amount"]),
|
|
Status = "1",
|
|
InvCode = SDNitem["InvCode"].ToString(),
|
|
Sequence = index.ToString(),
|
|
SDNCode = SDNitem["SDNCode"].ToString(),
|
|
SDNSequence = SDNitem["SDNSequence"].ToString(),
|
|
CusCode = SDNitem["CusCode"].ToString(),
|
|
CusName = SDNitem["CusName"].ToString(),
|
|
Type = "1",
|
|
WHCode = SDNitem["WHCode"].ToString(),
|
|
ArriveDate = Convert.ToDateTime(SDNitem["ArriveDate"]),
|
|
CreateDateTime = Convert.ToDateTime(dateNow),
|
|
CreatePerson = UserCode,
|
|
SSDQuantity = 0,
|
|
SSDDetailID = "",
|
|
SSDID = "",
|
|
MTIME = Convert.ToDateTime(dateNow),
|
|
MUSER = UserCode,
|
|
MUSERName = UserName,
|
|
ExtensionID = SDNitem["ExtensionID"].ToString(),
|
|
WorkPoint = WorkPoint,
|
|
};
|
|
ICSSSDList.Add(entity);
|
|
}
|
|
}
|
|
var result1 = MsSqlData.Insert(ICSSSDList);
|
|
if (!result1)
|
|
{
|
|
msg = "销售出库表新增失败!";
|
|
return msg;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
msg = ex.Message;
|
|
|
|
}
|
|
return msg;
|
|
}
|
|
/// <summary>
|
|
/// HUB销售退货
|
|
/// </summary>
|
|
/// <param name="queryJson"></param>
|
|
/// <returns></returns>
|
|
public string AuditSalesReturnSDN(string keyValue, string WhCode, string LotCode)
|
|
{
|
|
//准备条码回滚
|
|
var lotNoArr = "";
|
|
|
|
string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
|
|
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
|
|
string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
|
|
string msg = "";
|
|
DateTime TimeNow = DateTime.Now;
|
|
string sqls = string.Empty;
|
|
string sql = string.Empty;
|
|
//根据退货单找到销售订单,找到对应出库单,根据出库单列表中最新的批次排序
|
|
//生成一条条码数据
|
|
try
|
|
{
|
|
keyValue = keyValue.TrimEnd(',');
|
|
//根据退货单找到销售订单 废弃
|
|
//取退货单上的批次
|
|
string SOList = $@"
|
|
select a.SDNCode,a.Sequence,a.InvCode,a.SOCode,a.SOSequence,a.Type,a.ExtensionID,e.BatchCode,a.Amount,a.Quantity,a.WHCode
|
|
from ICSSDN a
|
|
left join ICSExtension e on a.ExtensionID = e.ID and a.WorkPoint = e.WorkPoint
|
|
where a.SDNCode in ({keyValue}) and a.Type = '2' and a.WorkPoint='{WorkPoint}' ";
|
|
DataTable SOListdt = SqlHelper.CmdExecuteDataTable(SOList);
|
|
if (SOListdt.Rows.Count <= 0)
|
|
{
|
|
throw new Exception("未找到退货单!");
|
|
}
|
|
else
|
|
{
|
|
//判断退货单仓库和输入的仓库是否一致 yangtm 20251217
|
|
string mes = string.Empty;
|
|
foreach (DataRow dr1 in SOListdt.Rows)
|
|
{
|
|
if (dr1["WhCode"].ToString() != WhCode)
|
|
{
|
|
mes += "退货单" + dr1["WhCode"].ToString() + "行" + dr1["Sequence"].ToString() + "仓库" + dr1["WhCode"].ToString() + "和本次退货仓库" + WhCode + "不一致,请确认";
|
|
}
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(mes))
|
|
{
|
|
throw new Exception(mes);
|
|
}
|
|
|
|
|
|
List<LOTStockUpCreateIModel> models = new List<LOTStockUpCreateIModel>();
|
|
//找到对应出库单 若退货单上没有批次 则用出库单最新的批次
|
|
//根据单据号分组
|
|
//DataRow[] dateRows = SOListdt?.Select($@"SOCode <> '' And SOCode is not null");
|
|
|
|
//if (dateRows.Length <= 0)
|
|
//{
|
|
// throw new Exception("退货单未关联销售订单!");
|
|
//}
|
|
// 使用 LINQ 根据 界面选择的单据号 字段对 DataRow[] 进行分组 分组后 每
|
|
var groups = SOListdt.Rows.Cast<DataRow>().GroupBy(row => new
|
|
{
|
|
Code = row.Field<string>("SDNCode"),
|
|
});
|
|
|
|
foreach (var group in groups)
|
|
{
|
|
//model在循环内还是外 决定 API中请求ERP的次数
|
|
LOTStockUpCreateIModel model = new LOTStockUpCreateIModel
|
|
{
|
|
User = MUSER,
|
|
MTime = TimeNow.ToString("yyyy-MM-dd HH:mm:ss"),
|
|
WorkPoint = WorkPoint,
|
|
TransType = "销售退货-销售退货单",
|
|
detail = new List<LOTStockUpCreateIModelList>()
|
|
};
|
|
foreach (var item in group)
|
|
{
|
|
var ExtensionID = "";
|
|
string LotNo = "";
|
|
//判断 退货数据中有批次,就直接用
|
|
if (!string.IsNullOrEmpty(item["ExtensionID"].ToString()))
|
|
{
|
|
ExtensionID = item["ExtensionID"].ToString();
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("关联批次创建条码失败,未找到批次!");
|
|
//判断 退货没批次 找销售订单管理的出库表 最新的批次
|
|
//SOList = $@"
|
|
// -- 找同销售订单下的发货单、出库单 得到销售单的结果
|
|
//if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#tempDeliver'))
|
|
//begin
|
|
// drop table #tempDeliver
|
|
//end
|
|
//-- 退货临时表 关联发货表 为了结果集直接拿到退货表需要的批次
|
|
//select a.SDNCode,a.Sequence,a.InvCode,a.SOCode,a.SOSequence,a.Type,a.WorkPoint into #tempDeliver
|
|
//from ICSSDN a where a.SOCode = '{item["SOCode"].ToString()}' and a.SOSequence = '{item["SOSequence"].ToString()}' and a.InvCode = '{item["InvCode"].ToString()}' and Type = '2'
|
|
//-- 查询销售出库表 按批次、时间倒叙 找最后一个批次
|
|
//select TOP(1) ROW_NUMBER() OVER(PARTITION BY a.SOCode,a.SOSequence ORDER BY e.BatchCode,e.MTIME desc),
|
|
//a.SDNCode,a.Sequence,a.InvCode,a.SOCode,a.SOSequence,a.Type,e.BatchCode,e.MTIME,a.MTIME,e.ID as ExtensionID
|
|
//from ICSSDN a
|
|
//join #tempDeliver q on a.SOCode = q.SOCode and a.SOSequence = q.SOSequence and a.InvCode = q.InvCode and a.WorkPoint = q.WorkPoint
|
|
//Left join ICSSSD b on a.SDNCode = b.SDNCode and a.Sequence = b.SDNSequence and a.WorkPoint = b.WorkPoint
|
|
//left join ICSExtension e on b.ExtensionID = e.ID and b.WorkPoint = e.WorkPoint
|
|
//where a.Type = '1'
|
|
|
|
//if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#tempDeliver'))
|
|
//begin
|
|
// drop table #tempDeliver
|
|
//end ";
|
|
//DataTable SDNdt = SqlHelper.CmdExecuteDataTable(SOList);
|
|
//ExtensionID = string.IsNullOrEmpty(SDNdt.Rows[0]["ExtensionID"].ToString()) && SDNdt.Rows[0]["ExtensionID"].ToString() != "NULL" ? SDNdt.Rows[0]["ExtensionID"].ToString() : "";
|
|
}
|
|
//创建新的条码入库
|
|
var SDNCode = item["SDNCode"].ToString();
|
|
string Sequence = item["Sequence"].ToString();
|
|
var sqlLot = string.Format(@"SELECT A.LotNO AS LOTNO FROM ICSInventoryLot A WHERE A.LotNO LIKE '{0}%'", SDNCode);
|
|
var parentLot = Repository().FindTableBySql(sqlLot.ToString());
|
|
var drs = parentLot.Select("1 = 1", "LOTNO DESC");
|
|
if (drs.Length == 0)
|
|
{
|
|
LotNo = SDNCode + Sequence + "00001";
|
|
}
|
|
else
|
|
{
|
|
var OldLotNo = drs[0]["LOTNO"].ToString();
|
|
LotNo = SDNCode + Sequence + (Convert.ToInt64(OldLotNo.Substring(OldLotNo.Length - 5)) + 1).ToString().PadLeft(5, '0');
|
|
}
|
|
|
|
lotNoArr = string.IsNullOrEmpty(lotNoArr) ? "'" + LotNo + "'" : lotNoArr + "," + "'" + LotNo + "'";
|
|
|
|
sqls += @"INSERT INTO ICSInventoryLot(ID,LotNo,InvCode,ProductDate,ExpirationDate,Quantity,Amount,ExtensionID,Type,
|
|
PrintTimes,LastPrintUser,LastPrintTime,MUSER,MUSERName,MTIME,WorkPoint)
|
|
Values(NEWID(),'{0}','{1}',getdate(),'2999-12-31','{2}','{3}','{4}','100','','','','{5}','{6}',getdate(),'{7}')
|
|
";
|
|
|
|
sqls += @"INSERT INTO ICSInventoryLotDetail( LotNo,TransCode,TransSequence,MUSER,MUSERName,MTIME,WorkPoint)
|
|
Values('{0}','{8}','{9}','{5}','{6}',getdate(),'{7}')
|
|
";
|
|
//循环中不妨碍多次执行sql的替换 因为每次都只会替换{0}特殊字符 每次循环都只有一个{0}
|
|
sqls = string.Format(sqls, LotNo, item["InvCode"].ToString(), item["Quantity"].ToString(), item["Amount"].ToString(), ExtensionID, MUSER, MUSERNAME, WorkPoint, SDNCode, Sequence);
|
|
//完成数据准备
|
|
LOTStockUpCreateIModelList detail = new LOTStockUpCreateIModelList
|
|
{
|
|
LotNo = LotNo,
|
|
WarehouseCode = WhCode,
|
|
LocationCode = LotCode,
|
|
TransCode = item["SDNCode"].ToString(),
|
|
TransSequence = item["Sequence"].ToString(),
|
|
Quantity = item["Quantity"].ToString(),
|
|
InvCode = item["InvCode"].ToString()
|
|
};
|
|
model.detail.Add(detail);
|
|
}
|
|
//此时 每个SOListdt结果集的行 都会请求一次ERP 将new model的动作移动到循环外即可只请求一次
|
|
models.Add(model);
|
|
}
|
|
|
|
if (!String.IsNullOrEmpty(sqls))
|
|
{
|
|
SqlHelper.CmdExecuteNonQueryLi(sqls);
|
|
}
|
|
var input = models.Distinct().ToJson();
|
|
string APIURL = ConfigurationManager.ConnectionStrings["APIURL"].ConnectionString + "LOTStockUp/Create";
|
|
string result = HttpPost(APIURL, input);
|
|
Result res = result.ToObject<Result>();
|
|
if (!res.Success)
|
|
{
|
|
throw new Exception(res.Message);
|
|
}
|
|
//生成销售出库单
|
|
string SDNsql = $@"select a.SDNCode,a.Sequence as SDNSequence,a.Amount,a.WHCode,a.CusCode,a.CusName,a.ArriveDate,a.InvCode,a.ExtensionID,a.Quantity
|
|
from ICSSDN a where a.SDNCode in({keyValue}) and WorkPoint='{WorkPoint}' and a.Type = '2' ";
|
|
DataTable SDNToCreatedt = SqlHelper.CmdExecuteDataTable(SDNsql);
|
|
DataRow[] SDNRows = SDNToCreatedt?.Select($@"SDNCode <> '' And SDNCode is not null");
|
|
var ICSSSDList = new List<ICSSSD>();
|
|
var SDNgroups = SDNRows.Cast<DataRow>().GroupBy(row => new
|
|
{
|
|
Code = row.Field<string>("SDNCode"),
|
|
});
|
|
|
|
foreach (var SDNgroup in SDNgroups)
|
|
{
|
|
var SSDCode = GetOOCode(WorkPoint);
|
|
foreach (var SDNitem in SDNgroup)
|
|
{
|
|
var index = 1;
|
|
var entity = new ICSSSD
|
|
{
|
|
ID = Guid.NewGuid().ToString(),
|
|
SSDCode = SSDCode,
|
|
Quantity = Convert.ToDecimal(SDNitem["Quantity"]),
|
|
Amount = Convert.ToDecimal(SDNitem["Amount"]),
|
|
Status = "1",
|
|
InvCode = SDNitem["InvCode"].ToString(),
|
|
Sequence = index.ToString(),
|
|
SDNCode = SDNitem["SDNCode"].ToString(),
|
|
SDNSequence = SDNitem["SDNSequence"].ToString(),
|
|
CusCode = SDNitem["CusCode"].ToString(),
|
|
CusName = SDNitem["CusName"].ToString(),
|
|
Type = "2",
|
|
WHCode = SDNitem["WHCode"].ToString(),
|
|
ArriveDate = Convert.ToDateTime(SDNitem["ArriveDate"]),
|
|
CreateDateTime = TimeNow,
|
|
CreatePerson = MUSER,
|
|
SSDQuantity = 0,
|
|
SSDDetailID = "",
|
|
SSDID = "",
|
|
MTIME = TimeNow,
|
|
MUSER = MUSER,
|
|
MUSERName = MUSERNAME,
|
|
ExtensionID = SDNitem["ExtensionID"].ToString(),
|
|
WorkPoint = WorkPoint,
|
|
};
|
|
ICSSSDList.Add(entity);
|
|
}
|
|
}
|
|
var result1 = MsSqlData.Insert(ICSSSDList);
|
|
if (!result1)
|
|
{
|
|
msg = "销售出库表新增失败!";
|
|
return msg;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//回退
|
|
if (!string.IsNullOrEmpty(lotNoArr))
|
|
{
|
|
sqls = $@"
|
|
delete from ICSInventoryLot where LotNo in ({lotNoArr}) and WorkPoint = '{WorkPoint}'
|
|
delete from ICSInventoryLotDetail where LotNo in ({lotNoArr}) and WorkPoint = '{WorkPoint}'
|
|
delete from ICSSSD where SDNCode in ({keyValue}) and Type = 2 and WorkPoint = '{WorkPoint}' ";
|
|
SqlHelper.CmdExecuteNonQueryLi(sqls);
|
|
}
|
|
throw new Exception(ex.Message);
|
|
}
|
|
|
|
return msg;
|
|
}
|
|
/// <summary>
|
|
/// 创建自增单号
|
|
/// </summary>
|
|
/// <param name="WorkPoint"></param>
|
|
/// <returns></returns>
|
|
public string GetOOCode(string WorkPoint)
|
|
{
|
|
WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
|
|
string OOCode = string.Empty;
|
|
if (!string.IsNullOrEmpty(WorkPoint))
|
|
{
|
|
|
|
OOCode = GetSerialCode(WorkPoint, "ICSSSD", "SSDCode", "00", 8);
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(OOCode))
|
|
{
|
|
string sqlISHave = @"SELECT SSDCode FROM ICSSSD a
|
|
WHERE a.SSDCode = '{0}'";
|
|
sqlISHave = string.Format(sqlISHave, OOCode);
|
|
DataTable dtIsHave = SqlHelper.GetDataTableBySql(sqlISHave);
|
|
if (dtIsHave.Rows.Count > 0)
|
|
{
|
|
throw new Exception("单号已存在!");
|
|
}
|
|
}
|
|
return OOCode;
|
|
}
|
|
public string GetSerialCode(string workPointCode, string tbName, string colName, string Pre, int numLen)
|
|
{
|
|
string sql = "EXEC Addins_GetSerialCode '{0}','{1}','{2}','{3}',{4}";
|
|
sql = string.Format(sql, new object[] { workPointCode, tbName, colName, Pre, numLen });
|
|
return SqlHelper.ExecuteScalar(sql).ToString();
|
|
}
|
|
/// <summary>
|
|
/// 销售发货明细查询
|
|
/// </summary>
|
|
/// <param name="jqgridparam"></param>
|
|
/// <returns></returns>
|
|
public DataTable GetSDNApplyNegDetail(string SDNCode, ref Pagination jqgridparam)
|
|
{
|
|
DataTable dt = new DataTable();
|
|
//object Figure = GetDecimalDigits();
|
|
List<DbParameter> parameter = new List<DbParameter>();
|
|
string sql = @"SELECT a.ID,a.SDNCode,a.Sequence,a.SOSequence,a.SOCode,a.InvCode,a.Quantity,a.Amount,a.SDNQuantity,a.WHCode,e.WarehouseName as WHName,a.Type,a.CusCode,a.CusName,a.ArriveDate
|
|
,a.ExtensionID,a.MUSER,a.MUSERName,a.MTIME,a.WorkPoint,b.InvName,a.CreateDateTime,a.CreatePerson
|
|
,f.Colspan ,f.ProjectCode ,f.BatchCode ,f.Version ,f.Brand ,f.cFree1 ,f.cFree2 ,f.cFree3 ,f.cFree4
|
|
,f.cFree5 ,f.cFree6 ,f.cFree7 ,f.cFree8 ,f.cFree9 ,f.cFree10
|
|
,a.EATTRIBUTE1,a.EATTRIBUTE2,a.EATTRIBUTE3,a.EATTRIBUTE4,a.EATTRIBUTE5,a.EATTRIBUTE6,a.EATTRIBUTE7,a.EATTRIBUTE8,a.EATTRIBUTE9,a.EATTRIBUTE10
|
|
from ICSSDN a
|
|
left join ICSInventory b on a.InvCode = b.InvCode and a.WorkPoint = b.WorkPoint
|
|
left join ICSExtension f on a.ExtensionID=f.ID and a.WorkPoint=f.WorkPoint
|
|
left join ICSWarehouse e on a.WHCode = e.WarehouseCode and a.WorkPoint=e.WorkPoint
|
|
-- left join ICSSSD d on a.SDNCode = d.SDNCode and a.Sequence = d.SDNSequence and a.InvCode = d.InvCode and a.WorkPoint=d.WorkPoint
|
|
where a.SDNCode = '" + SDNCode + "' ";
|
|
//sql = string.Format(sql, Figure);
|
|
DataTable dttest = Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
|
|
return Repository().FindTablePageBySql(sql.ToString(), parameter.ToArray(), ref jqgridparam);
|
|
}
|
|
//拣料
|
|
public DataTable GetICSMOPickMergeTemp(string ID, string Type)
|
|
{
|
|
string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
|
|
string MUSERNAME = NFine.Code.OperatorProvider.Provider.GetCurrent().UserName;
|
|
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
|
|
ID = ID.Replace("'", "''");
|
|
ID = string.IsNullOrWhiteSpace(ID) ? "''" : ID.TrimEnd(',');
|
|
|
|
string Code = SqlHelper.GetItemsDetailEnabledMark("MtimeControl");
|
|
|
|
string sql = @"EXEC ICSPicking '{0}','{1}','0','{2}'";
|
|
sql = string.Format(sql, ID, Type, WorkPoint);
|
|
|
|
var dataset = Repository().FindDataSetBySql(sql);
|
|
if (dataset.Tables[0].Rows.Count == 0)
|
|
return null;
|
|
DataTable table = dataset.Tables[0];
|
|
try
|
|
{
|
|
DataRow[] dss = table.Select("LotNO=''");
|
|
foreach (var item in dss)
|
|
{
|
|
DataRow[] dsss = table.Select("Code='" + item["Code"].ToString() + "' and Sequence='" + item["Sequence"].ToString() + "' and LotNO <> '' ");
|
|
if (dsss != null && dsss.Length > 0)
|
|
{
|
|
table.Rows.Remove(item);
|
|
}
|
|
}
|
|
var result = ConvertCellToString(table);
|
|
if (Invmes.Rows.Count > 0)
|
|
{
|
|
result.Merge(Invmes, false);
|
|
}
|
|
var groupedData = from row in table.AsEnumerable()
|
|
group row by new
|
|
{
|
|
Code = row.Field<string>("Code"),
|
|
Sequence = row.Field<string>("Sequence")
|
|
} into g
|
|
select new
|
|
{
|
|
Code = g.Key.Code,
|
|
Sequence = g.Key.Sequence,
|
|
TotalQTY = g.Sum(x =>
|
|
{
|
|
return !x.IsNull("QTY") ? x.Field<decimal>("QTY") : 0;
|
|
}),
|
|
TotaliQuantity = g.First().IsNull("iQuantity") ? 0 : g.First().Field<decimal>("iQuantity"),
|
|
|
|
};
|
|
|
|
foreach (var item in groupedData)
|
|
{
|
|
if (item.TotalQTY != item.TotaliQuantity)
|
|
{
|
|
string msg = "单据号:" + item.Code + "行号:" + item.Sequence + "库存不足,请先检查库存";
|
|
throw new Exception(msg);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception(ex.Message);
|
|
}
|
|
}
|
|
public DataTable ConvertCellToString(DataTable data)
|
|
{
|
|
DataTable dtCloned = data.Clone();
|
|
foreach (DataColumn col in dtCloned.Columns)
|
|
{
|
|
col.DataType = typeof(string);
|
|
}
|
|
foreach (DataRow row in data.Rows)
|
|
{
|
|
DataRow newrow = dtCloned.NewRow();
|
|
foreach (DataColumn column in dtCloned.Columns)
|
|
{
|
|
newrow[column.ColumnName] = row[column.ColumnName].ToString();
|
|
|
|
}
|
|
dtCloned.Rows.Add(newrow);
|
|
}
|
|
return dtCloned;
|
|
}
|
|
//接口api解析
|
|
public static string HttpPost(string url, string body)
|
|
|
|
{
|
|
try
|
|
{
|
|
Encoding encoding = Encoding.UTF8;
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
|
|
request.Method = "POST";
|
|
request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
|
|
request.ContentType = "application/json; charset=utf-8";
|
|
|
|
byte[] buffer = encoding.GetBytes(body);
|
|
request.ContentLength = buffer.Length;
|
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
|
using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
|
|
{
|
|
return reader.ReadToEnd();
|
|
}
|
|
}
|
|
catch (WebException ex)
|
|
{
|
|
throw new Exception(ex.Message);
|
|
}
|
|
}
|
|
public void ClearTemp()
|
|
{
|
|
Invmes.Rows.Clear();
|
|
}
|
|
/// <summary>
|
|
/// 材料出库
|
|
/// </summary>
|
|
public class LOTStockModel
|
|
{
|
|
/// <summary>
|
|
/// 源头单据号
|
|
/// </summary>
|
|
public string TransCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 源头单据行号
|
|
/// </summary>
|
|
public string TransSequence { get; set; }
|
|
/// <summary>
|
|
/// 源头单据iD
|
|
/// </summary>
|
|
public string TransID { get; set; }
|
|
/// <summary>
|
|
/// 数量
|
|
/// </summary>
|
|
public string Quantity { get; set; }
|
|
/// <summary>
|
|
/// 辅计量数量
|
|
/// </summary>
|
|
public string Amount { get; set; }
|
|
/// <summary>
|
|
/// 操作类型
|
|
/// </summary>
|
|
public string TransType { get; set; }
|
|
/// <summary>
|
|
/// 操作人
|
|
/// </summary>
|
|
public string User { get; set; }
|
|
/// <summary>
|
|
/// 操作时间
|
|
/// </summary>
|
|
public string MTime { get; set; }
|
|
/// <summary>
|
|
/// 交接人--东辉
|
|
/// </summary>
|
|
public string Heir { get; set; }
|
|
//站点
|
|
public string WorkPoint { get; set; }
|
|
//快递单号
|
|
public string CourierCode { get; set; }
|
|
|
|
public List<LOTStockModelList> detail { get; set; }
|
|
|
|
}
|
|
public class LOTStockModelList
|
|
{
|
|
/// <summary>
|
|
/// 源头单据行号
|
|
/// </summary>
|
|
public string TransSequence { get; set; }
|
|
/// <summary>
|
|
/// 条码
|
|
/// </summary>
|
|
public string LotNo { get; set; }
|
|
/// <summary>
|
|
/// 数量
|
|
/// </summary>
|
|
public string CurrentQuantity { get; set; }
|
|
/// <summary>
|
|
/// 辅计量数量
|
|
/// </summary>
|
|
public string CurrentAmount { get; set; }
|
|
|
|
public string Sequence { get; set; }
|
|
|
|
/// <summary>
|
|
/// 仓库代码
|
|
/// </summary>
|
|
public string WarehouseCode { get; set; }
|
|
/// <summary>
|
|
/// 库位代码
|
|
/// </summary>
|
|
public string LocationCode { get; set; }
|
|
/// <summary>
|
|
/// LogID
|
|
/// </summary>
|
|
public string LogID { get; set; }
|
|
}
|
|
}
|
|
}
|