using Model.InterFaceModel;
|
using Model.ModelDto;
|
using Model.ModelDto.BllAsnDto;
|
using Model.ModelDto.SysDto;
|
using Model.ModelVm;
|
using Model.ModelVm.SysVm;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Threading.Tasks;
|
using WMS.BLL.LogServer;
|
using WMS.DAL;
|
using WMS.Entity.BllAsnEntity;
|
using WMS.Entity.BllSoEntity;
|
using WMS.Entity.Context;
|
using WMS.Entity.DataEntity;
|
using WMS.Entity.SysEntity;
|
using WMS.IBLL.IBllAsnServer;
|
|
namespace WMS.BLL.BllAsnServer
|
{
|
public class ArrivalNoticeServer : DbHelper<BllArrivalNotice>, IArrivalNoticeServer
|
{
|
#region 依赖注入
|
private static readonly SqlSugarScope Db = DataContext.Db;
|
|
private readonly object AsnLock = new object();
|
public ArrivalNoticeServer() : base(Db)
|
{
|
}
|
#endregion
|
|
#region 事件方法
|
public async Task<List<ArrivalNoticeDto>> GetArrivalNoticeList(ArrivalNoticeVm model, RefAsync<int> count)
|
{
|
var modelList = await Db.Queryable<BllArrivalNotice,BllArrivalNoticeDetail, SysUserInfor, SysUserInfor,
|
SysUserInfor>((tb1, tb2, tb3, tb4,tb5) => new JoinQueryInfos(
|
JoinType.Left, tb1.ASNNo == tb2.ASNNo,
|
JoinType.Left, tb1.CreateUser == tb3.Id,
|
JoinType.Left, tb1.UpdateUser == tb4.Id,
|
JoinType.Left, tb1.CheckUser == tb5.Id))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.ASNNo), tb1 => tb1.ASNNo.Contains(model.ASNNo))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), (tb1,tb2) => tb2.LotNo.Contains(model.LotNo))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.SkuNo), (tb1,tb2) => tb2.SkuNo.Contains(model.SkuNo))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.SkuName), (tb1,tb2) => tb2.SkuName.Contains(model.SkuName))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.CustomerName), tb1 => tb1.CustomerName.Contains(model.CustomerName))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.OrderCode), tb1 => tb1.OrderCode.Contains(model.OrderCode))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.Status), tb1 => tb1.Status == model.Status)
|
.WhereIF(!string.IsNullOrWhiteSpace(model.Type), tb1 => tb1.Type == model.Type)
|
.WhereIF(!string.IsNullOrWhiteSpace(model.StartTime), tb1 => tb1.CreateTime >= Convert.ToDateTime(model.StartTime))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.EndTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1))
|
.WhereIF(!string.IsNullOrWhiteSpace(model.CustomerName), tb1 => tb1.CustomerName.Contains(model.CustomerName))
|
.Where(tb1 => tb1.IsDel == "0")
|
.OrderByDescending(tb1 => tb1.ASNNo)
|
.Distinct()
|
.Select((tb1, tb2, tb3, tb4, tb5) => new ArrivalNoticeDto()
|
{
|
Id = tb1.Id,
|
ASNNo = tb1.ASNNo,
|
Type = tb1.Type,
|
Status = tb1.Status,
|
Origin = tb1.Origin,
|
CustomerNo = tb1.CustomerNo,
|
CustomerName = tb1.CustomerName,
|
LotNo = tb1.LotNo,
|
LotText = tb1.LotText,
|
CheckTime = ((DateTime)tb1.CheckTime).ToString("yyyy-MM-dd HH:mm:ss"),
|
CheckUserName = tb5.RealName,
|
SupplierLot = tb1.SupplierLot,
|
Demo = tb1.Demo,
|
OrderCode = tb1.OrderCode,
|
CompleteTime = tb1.CompleteTime,
|
CreateTime = tb1.CreateTime,
|
CreateUserName = tb3.RealName,
|
UserName=tb1.UserName,
|
UpdateTime = ((DateTime)tb1.UpdateTime).ToString("yyyy-MM-dd HH:mm:ss"),
|
UpdateUserName = tb4.RealName
|
|
}).ToPageListAsync(model.Page, model.Limit, count);
|
|
return modelList;
|
}
|
|
public async Task<List<ArrivalNoticeDetailDto>> GetArrivalNoticeDetailList(ArrivalNoticeDetailVm model, RefAsync<int> count)
|
{
|
var item = Expressionable.Create<BllArrivalNoticeDetail>()
|
.AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo == model.ASNNo)
|
.AndIF(true, it => it.IsDel == "0")
|
.ToExpression();//注意 这一句 不能少
|
|
var modelList = await Db.Queryable<BllArrivalNoticeDetail>().Where(item)
|
.LeftJoin<BllArrivalNotice>((tb1, tb2) => tb1.ASNNo == tb2.ASNNo)
|
.LeftJoin<SysUserInfor>((tb1, tb2,tb3) => tb1.CreateUser == tb3.Id)
|
.LeftJoin<SysUserInfor>((tb1,tb2,tb3,tb4) => tb1.UpdateUser == tb4.Id)
|
.LeftJoin<SysMaterials>((tb1, tb2, tb3, tb4,tb5) => tb1.SkuNo == tb5.SkuNo && tb5.IsDel == "0")
|
.LeftJoin<SysUnit>((tb1, tb2, tb3, tb4, tb5,tb6) => tb5.UnitNo == tb6.UnitNo && tb6.IsDel == "0")
|
.LeftJoin<SysPackag>((tb1, tb2, tb3, tb4, tb5, tb6,tb7) => tb1.PackagNo == tb7.PackagNo && tb7.IsDel == "0")
|
.Select((tb1, tb2, tb3, tb4, tb5,tb6, tb7) => new ArrivalNoticeDetailDto()
|
{
|
Id = tb1.Id,
|
ASNNo = tb1.ASNNo,
|
SkuNo = tb1.SkuNo,
|
SkuName = tb1.SkuName,
|
Standard = tb1.Standard,
|
LotNo = tb1.LotNo,
|
LotText = tb1.LotText,
|
Qty = tb1.Qty,
|
FactQty = tb1.FactQty,
|
CompleteQty = tb1.CompleteQty,
|
IsSampling = tb1.IsSampling,
|
InspectStatus = tb1.InspectStatus,
|
PackagNo = tb1.PackagNo,
|
PackagName = tb7.PackagName,
|
UnitName = tb6.UnitName,
|
IsBale = tb1.IsBale,
|
IsBelt = tb1.IsBelt,
|
SupplierLot = tb1.SupplierLot,
|
Status = tb1.Status,
|
AsnType = tb2.Type,
|
AsnStatus = tb2.Status,
|
IsPasteCode = tb5.IsPasteCode,
|
Lot1 = tb1.Lot1,
|
Lot2 = tb1.Lot2,
|
UDF1 = tb1.UDF1,
|
UDF2 = tb1.UDF2,
|
UDF3 = tb1.UDF3,
|
UDF4 = tb1.UDF4,
|
UDF5 = tb1.UDF5,
|
CompleteTime = tb1.CompleteTime,
|
CreateTime = tb1.CreateTime,
|
CreateUserName = tb3.RealName,
|
UpdateTime = ((DateTime)tb1.UpdateTime).ToString("yyyy-MM-dd HH:mm:ss"),
|
UpdateUserName = tb4.RealName
|
}).ToPageListAsync(model.Page, model.Limit, count);
|
|
return modelList;
|
}
|
|
//获取入库单明细剩余打印数量
|
public LabelPrintInfoDto GetAsnDetailQtyList(int id)
|
{
|
try
|
{
|
var detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == id);
|
if (detail == null)
|
{
|
throw new Exception("未查询到入库单明细");
|
}
|
var data = new LabelPrintInfoDto();
|
|
data.ProductionTime = string.IsNullOrEmpty(detail.Lot1) ? "" : Convert.ToDateTime(detail.Lot1).ToString("yyyy-MM-dd");
|
data.ExpirationTime = string.IsNullOrEmpty(detail.Lot2) ? "" : Convert.ToDateTime(detail.Lot2).ToString("yyyy-MM-dd");
|
data.SupplierLot = detail.SupplierLot;
|
var labelQty = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty + (m.SamplingQty == null? 0: m.SamplingQty));
|
if (labelQty == null)
|
{
|
labelQty = 0;
|
}
|
var qty = detail.Qty - labelQty;
|
if (qty<0)
|
{
|
qty = 0;
|
}
|
data.Qty = qty.ToString();
|
return data;
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
//获取物料信息(添加入库单明细使用)
|
public List<MaterialsDto> GetMaterialsList(GetMaterialsVm model)
|
{
|
try
|
{
|
string skuType = string.Empty;
|
int IsPack = 2; // 0:不贴 1:贴 2:不管
|
/** model.type (单据类型)
|
* 成品入库 0
|
* 采购入库 1
|
* 中间品不贴 2
|
* 退货入库 3
|
* 余料退回入库 4
|
*/
|
switch (model.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
|
{
|
case "0"://成品入库
|
skuType = "(2)";
|
break;
|
case "1"://采购入库
|
skuType = "(0,1,3)";
|
break;
|
case "2"://中间品入库
|
skuType = "(4)";
|
break;
|
case "3"://退货入库
|
skuType = "(2)";
|
break;
|
case "4"://车间余料退回入库
|
skuType = "(0,1,2,3)";
|
break;
|
default: //其它
|
skuType = "(0,1,2,3,4)";
|
break;
|
}
|
|
Expression<Func<SysMaterials, bool>> item = Expressionable.Create<SysMaterials>()
|
.AndIF(model.Type != "7", it => skuType.Contains(it.Type))
|
.AndIF(model.Type == "7", it => it.SkuNo == "100088")
|
.AndIF(IsPack != 2, it => it.IsPasteCode == IsPack.ToString())
|
.AndIF(true, it => it.IsDel == "0")
|
.And(it => it.SkuNo != "100099")
|
.AndIF(!string.IsNullOrWhiteSpace(model.SkuNo),
|
(it => it.SkuNo.Contains(model.SkuNo.Trim()) ||
|
it.SkuName.Contains(model.SkuNo.Trim()) ||
|
it.Standard.Contains(model.SkuNo.Trim())))
|
.ToExpression();//注意 这一句 不能少
|
|
var data = DataContext.Db.Queryable<SysMaterials>().Where(item)
|
.Includes(x => x.TypeInfo)
|
.Includes(x => x.EnvironmentInfo)
|
.Includes(x => x.UnitInfo)
|
.Includes(x => x.PackagInfo)
|
.ToList();
|
|
return data.Select(m => new MaterialsDto()
|
{
|
//Id = m.Id,
|
SkuNo = m.SkuNo,
|
SkuName = m.SkuName,
|
Standard = m.Standard,
|
AuditStatusNo = m.AuditStatusNo,
|
Type = m.Type,
|
TypeName = m.TypeInfo == null ? "" : m.TypeInfo.DictName,
|
IsControlled = m.IsControlled,
|
IsInspect = m.IsInspect,
|
Origin = m.Origin,
|
UnitNo = m.UnitNo,
|
UnitName = m.UnitInfo == null ? "" : m.UnitInfo.UnitName,
|
PackagNo = m.PackagNo,
|
PackagName = m.PackagInfo == null ? "" : m.PackagInfo.PackagName,
|
Environment = m.Environment,
|
EnvironmentName = m.EnvironmentInfo == null ? "" : m.EnvironmentInfo.DictName,
|
Weight = m.Weight,
|
Warranty = m.Warranty,
|
Price = m.Price,
|
Demo = m.Demo,
|
}).ToList();
|
}
|
catch (Exception e)
|
{
|
throw e;
|
}
|
}
|
|
//添加入库单据
|
public string AddArrivalNotice(ArrivalNoticeVm model)
|
{
|
string strMessage = "";
|
|
/** model.type (单据类型)
|
* 成品入库 0
|
* 采购入库 1
|
* 退货入库 3
|
* 余料退回入库 4
|
* 生产退料入库 8
|
*/
|
var TypeLot = "1, 5, 6, 7"; //批次可为空单据类型
|
|
try
|
{
|
if (model.Origin == "录入")
|
{
|
model.ASNNo = new Common().GetMaxNo("ASN");
|
}
|
else
|
{
|
if (string.IsNullOrEmpty(model.ASNNo))
|
{
|
throw new Exception("单据号不可为空!");
|
}
|
if (string.IsNullOrEmpty(model.Type))
|
{
|
throw new Exception("单据类型不可为空!");
|
}
|
}
|
|
lock (AsnLock)
|
{
|
// 总表实体赋值
|
BllArrivalNotice ASNModel = new BllArrivalNotice()
|
{
|
ASNNo = model.ASNNo,
|
Type = model.Type,
|
Origin = model.Origin,
|
CustomerNo = model.CustomerNo,
|
CustomerName = model.CustomerName,
|
Status = "0",
|
LotNo = model.LotNo,
|
LotText = model.LotText,
|
SupplierLot = model.SupplierLot,
|
CreateUser = (int)model.CreateUser
|
};
|
|
List<BllArrivalNoticeDetail> details = new List<BllArrivalNoticeDetail>();
|
var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
|
|
foreach (ArrivalNoticeDetailVm detailModel in model.AsnDetail)
|
{
|
if (string.IsNullOrEmpty(detailModel.SkuNo))
|
{
|
strMessage = "-1:物料编码不可为空;";
|
continue;
|
}
|
if (string.IsNullOrEmpty(detailModel.SkuName))
|
{
|
strMessage = "-1:物料名称不可为空;";
|
continue;
|
}
|
if (detailModel.Qty == null || detailModel.Qty <= 0)
|
{
|
strMessage = "-1:数量必须大于0;";
|
continue;
|
}
|
|
if ( model.Type == "5" || model.Type == "6" || model.Type == "7")
|
{
|
if (!string.IsNullOrWhiteSpace(detailModel.LotNo))
|
{
|
throw new Exception("当前单据类型不可输入批次,不可编辑!");
|
}
|
string toDayTime = DateTime.Now.ToString("yyyyMMdd");
|
//生成自有批次
|
if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo))
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList();
|
var maxLotNo = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo);
|
if (string.IsNullOrWhiteSpace(maxLotNo))
|
{
|
maxLotNo = toDayTime.Substring(2, 6) + "0001";
|
}
|
else
|
{
|
var lotStr = maxLotNo.Substring(0, 6);
|
var timeStr = toDayTime.Substring(2, 6);
|
if (lotStr == timeStr)
|
{
|
maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0');
|
}
|
else
|
{
|
maxLotNo = timeStr + "0001";
|
}
|
}
|
detailModel.LotNo = maxLotNo;
|
}
|
}
|
//if (model.Type == "0" || model.Type == "1" || model.Type == "2" || model.Type == "3" || model.Type == "4" && model.Type == "8")
|
//{
|
// if (string.IsNullOrWhiteSpace(detailModel.LotNo))
|
// {
|
// throw new Exception("当前单据类型批次不可为空!");
|
// }
|
//}
|
detailModel.BoxCodeStr = detailModel.LotNo;
|
if (string.IsNullOrWhiteSpace(detailModel.LotNo))
|
{
|
string toDayTime = DateTime.Now.ToString("yyyyMM");
|
var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") && m.CreateTime.ToString("yyyyMMdd") == DateTime.Now.ToString("yyyyMMdd")).Max(m => m.BoxCodeStr);
|
if(string.IsNullOrWhiteSpace(maxBoxCodeStr))
|
{
|
maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001";
|
}
|
else
|
{
|
maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString();
|
}
|
detailModel.BoxCodeStr = maxBoxCodeStr;
|
}
|
|
// 判断是否已存在当前明细
|
int com = Db.Queryable<BllArrivalNoticeDetail>()
|
.Where(m => m.ASNNo == model.ASNNo
|
&& m.SkuNo == detailModel.SkuNo
|
&& m.LotNo == detailModel.LotNo
|
&& m.Id != (int)detailModel.Id
|
&& m.IsDel == "0").ToList().Count();
|
if (com > 0)
|
{
|
strMessage = "-1:物料和批次号重复;";
|
continue;
|
}
|
if (detailModel.Price == null)
|
{
|
detailModel.Price = 0;
|
}
|
var sku = skuList.FirstOrDefault(m => m.SkuNo == detailModel.SkuNo);
|
if (sku == null)
|
{
|
throw new Exception("未查询出物料信息!");
|
}
|
string lot1 = detailModel.Lot1;
|
string lot2 = detailModel.Lot2;
|
if (sku.IsPasteCode == "0")
|
{
|
//不贴标物料 生产日期、有效期不能为空
|
DateTime lot12;
|
DateTime lot22;
|
if (!DateTime.TryParse(detailModel.Lot1, out lot12))
|
{
|
throw new Exception("非贴标物料生产日期转换失败");
|
}
|
if (!DateTime.TryParse(detailModel.Lot2, out lot22))
|
{
|
throw new Exception("非贴标物料过期日期转换失败");
|
}
|
lot1 = lot12.ToString();
|
lot2 = lot22.ToString();
|
}
|
if (string.IsNullOrWhiteSpace(detailModel.PackagNo))
|
{
|
throw new Exception("包装不能为空");
|
}
|
// 计算出总金额
|
detailModel.Money = detailModel.Price * detailModel.Qty;
|
BllArrivalNoticeDetail detail = new BllArrivalNoticeDetail()
|
{
|
ASNNo = model.ASNNo,
|
SkuNo = detailModel.SkuNo,
|
SkuName = detailModel.SkuName,
|
Standard = detailModel.Standard,
|
LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(),
|
LotText = detailModel.LotText,
|
Qty = (decimal)detailModel.Qty,
|
PackagNo = detailModel.PackagNo,
|
FactQty = 0, // 已组数量
|
CompleteQty = 0, // 完成数量
|
Price = detailModel.Price,
|
Money = detailModel.Money,
|
IsBale = detailModel.IsBale,
|
IsBelt = detailModel.IsBelt,
|
SupplierLot = detailModel.SupplierLot,
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
Lot1 = lot1, //生产日期
|
Lot2 = lot2, // 过期日期
|
BoxCodeStr = detailModel.BoxCodeStr,
|
UDF1 = detailModel.UDF1,
|
UDF2 = detailModel.UDF2,
|
UDF3 = detailModel.UDF3,
|
UDF4 = detailModel.UDF4,
|
UDF5 = detailModel.UDF5,
|
CreateUser = (int)model.CreateUser,
|
};
|
|
details.Add(detail);
|
}
|
|
// 判断是否存在被过滤掉的明细
|
if (details.Count <= 0)
|
{
|
return strMessage;
|
}
|
|
Db.Ado.BeginTran();
|
|
var rowCount = Db.Insertable(ASNModel).ExecuteCommand();
|
|
var rowDetailCount = 0;
|
if (details.Count > 0)
|
{
|
rowDetailCount = Db.Insertable(details).ExecuteCommand();
|
}
|
Db.Ado.CommitTran();
|
|
if (rowCount > 0 && rowDetailCount > 0)
|
{
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "添加", $"添加了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
|
return strMessage;
|
}
|
else
|
{
|
Db.Ado.RollbackTran();
|
return "-2:添加失败数据回滚!";
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
|
//编辑入库单据
|
public string EditArrivalNotice(ArrivalNoticeVm model)
|
{
|
string strMessage = "";
|
string sqlString = string.Empty;
|
string sqlDetailStr = string.Empty;
|
try
|
{
|
lock (AsnLock)
|
{
|
//判断是否为采购入库单据或车间余料退回入库
|
// 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 8 生产退料入库
|
//0、2、3、4 批次不能为空
|
//1、添加必须为空、编辑不可为空,不能更改
|
//5、6 批次可为空可不为空
|
//7 必须为空
|
var TypeLot = " 5, 6, 7"; //批次为生成批次单据类型
|
|
var asnInfo = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0");
|
if (asnInfo == null)
|
{
|
strMessage = "-1:单号不存在,或已删除!;";
|
return strMessage;
|
}
|
if (asnInfo.Status != "0")
|
{
|
strMessage = "-1:单据状态变更,不可编辑;";
|
return strMessage;
|
}
|
|
var dateTime = DateTime.Now;
|
// 编辑总单
|
asnInfo.CustomerNo = model.CustomerNo;
|
asnInfo.CustomerName = model.CustomerName;
|
asnInfo.LotNo = model.LotNo;
|
asnInfo.LotText = model.LotText;
|
asnInfo.UpdateTime = dateTime;
|
asnInfo.UpdateUser = model.CreateUser;
|
|
var detailModels = model.AsnDetail;
|
sqlDetailStr += $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and isDel = '0';";
|
//var dbDetailModels = DataContext.Db.Ado.SqlQuery<BllArrivalNoticeDetail>(sqlDetailStr);
|
var dbDetailModels = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList();
|
|
sqlDetailStr = string.Empty;
|
// 处理已删除的明细
|
foreach (BllArrivalNoticeDetail dbDetailModel in dbDetailModels)
|
{
|
if (detailModels.Count(it => it.Id == dbDetailModel.Id) == 0)
|
{
|
dbDetailModel.IsDel = "1";
|
dbDetailModel.UpdateTime = dateTime;
|
dbDetailModel.UpdateUser = model.CreateUser;
|
}
|
}
|
|
// 处理修改和添加的明细
|
string toDayTime = dateTime.ToString("yyyymmdd");
|
List<BllArrivalNoticeDetail> addDetails = new List<BllArrivalNoticeDetail>();
|
List<BllArrivalNoticeDetail> editDetails = new List<BllArrivalNoticeDetail>();
|
var maxLotNo = "";
|
foreach (ArrivalNoticeDetailVm detailModel in detailModels)
|
{
|
if (string.IsNullOrEmpty(detailModel.SkuNo))
|
{
|
strMessage = "-1:物料编码不可为空;";
|
return strMessage;
|
}
|
if (string.IsNullOrEmpty(detailModel.SkuName))
|
{
|
strMessage = "-1:物料名称不可为空;";
|
return strMessage;
|
}
|
if (detailModel.Qty == null || detailModel.Qty <= 0)
|
{
|
strMessage = "-1:数量必须大于0;";
|
return strMessage;
|
}
|
|
//if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4")
|
//{
|
// if (string.IsNullOrWhiteSpace(detailModel.LotNo))
|
// {
|
// throw new Exception("当前单据类型批次不可为空!");
|
// }
|
//}
|
|
if (TypeLot.Contains(model.Type))
|
{
|
if (string.IsNullOrWhiteSpace(detailModel.Lot1))
|
{
|
throw new Exception("生产日期不可为空!");
|
}
|
if (string.IsNullOrWhiteSpace(detailModel.Lot2))
|
{
|
throw new Exception("过期日期不可为空!");
|
}
|
}
|
|
// 判断是否已存在当前明细
|
var com = dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo
|
&& m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count();
|
if (com > 0)
|
{
|
strMessage = "-1:物料和批次号重复;";
|
return strMessage;
|
}
|
|
if (detailModel.Price == null)
|
{
|
detailModel.Price = 0;
|
}
|
//生成自有批次
|
if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo))
|
{
|
//var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList();
|
//if (string.IsNullOrWhiteSpace(maxLotNo))
|
//{
|
// maxLotNo = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo);
|
//}
|
//if (string.IsNullOrWhiteSpace(maxLotNo))
|
//{
|
// maxLotNo = toDayTime.Substring(2, 6) + "0001";
|
//}
|
//else
|
//{
|
// var lotStr = maxLotNo.Substring(0, 6);
|
// var timeStr = toDayTime.Substring(2, 6);
|
// if (lotStr == timeStr)
|
// {
|
// maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0');
|
// }
|
// else
|
// {
|
// maxLotNo = timeStr + "0001";
|
// }
|
//}
|
//detailModel.LotNo = maxLotNo;
|
var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") && m.CreateTime.ToString("yyyyMMdd") == DateTime.Now.ToString("yyyyMMdd")).Max(m => m.BoxCodeStr);
|
if (string.IsNullOrWhiteSpace(maxBoxCodeStr))
|
{
|
maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001";
|
}
|
else
|
{
|
maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString();
|
}
|
detailModel.BoxCodeStr = maxBoxCodeStr;
|
}
|
|
if (detailModel.Id == 0 || detailModel.Id == null)
|
{
|
//if (model.Type == "1")
|
//{
|
// strMessage = "-1:采购入库不可更改明细,只可编辑数量;";
|
// return strMessage;
|
//}
|
// 计算出总金额
|
detailModel.Money = detailModel.Price * detailModel.Qty;
|
|
BllArrivalNoticeDetail addModel = new BllArrivalNoticeDetail()
|
{
|
ASNNo = model.ASNNo,
|
SkuNo = detailModel.SkuNo,
|
SkuName = detailModel.SkuName,
|
Standard = detailModel.Standard,
|
LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(),
|
LotText = detailModel.LotText,
|
Qty = (decimal)detailModel.Qty,
|
PackagNo = detailModel.PackagNo,
|
Price = detailModel.Price,
|
Money = detailModel.Money,
|
FactQty = 0, // 已组数量
|
CompleteQty = 0, // 完成数量
|
IsBale = detailModel.IsBale,
|
IsBelt = detailModel.IsBelt,
|
SupplierLot = detailModel.SupplierLot,
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
Lot1 = detailModel.Lot1,
|
Lot2 = detailModel.Lot2,
|
BoxCodeStr = detailModel.BoxCodeStr,
|
UDF1 = detailModel.UDF1,
|
UDF2 = detailModel.UDF2,
|
UDF3 = detailModel.UDF3,
|
UDF4 = detailModel.UDF4,
|
UDF5 = detailModel.UDF5,
|
CreateUser=(int)model.CreateUser
|
};
|
addDetails.Add(addModel);
|
}
|
else
|
{
|
//判断是否更改
|
int rowNum = dbDetailModels
|
.Count(it => it.Id == detailModel.Id
|
&& it.Qty == detailModel.Qty
|
&& it.LotNo == detailModel.LotNo
|
&& it.LotText == detailModel.LotText
|
&& it.SupplierLot == detailModel.SupplierLot
|
&& it.IsBale == detailModel.IsBale
|
&& it.IsBelt == detailModel.IsBelt
|
&& it.Lot1 == detailModel.Lot1 // 生产日期
|
&& it.Lot2 == detailModel.Lot2 // 过期日期
|
&& it.UDF1 == detailModel.UDF1
|
&& it.UDF2 == detailModel.UDF2
|
&& it.UDF3 == detailModel.UDF3
|
&& it.UDF4 == detailModel.UDF4
|
&& it.UDF5 == detailModel.UDF5);
|
if (rowNum > 0)
|
{
|
continue;
|
}
|
|
var dbDetail = dbDetailModels.First(m => m.Id == detailModel.Id);
|
if (TypeLot.Contains(model.Type))
|
{
|
if (!string.IsNullOrWhiteSpace(dbDetail.LotNo))
|
{
|
if (dbDetail.LotNo != detailModel.LotNo)
|
{
|
strMessage = "-1:当前单据类型不可更改批次;";
|
continue;
|
}
|
}
|
|
}
|
// 计算出总金额
|
detailModel.Money = detailModel.Price * detailModel.Qty;
|
|
dbDetail.Qty = (decimal)detailModel.Qty;
|
dbDetail.LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim();
|
dbDetail.Money = detailModel.Money;
|
dbDetail.LotText = detailModel.LotText;
|
dbDetail.SupplierLot = detailModel.SupplierLot;
|
dbDetail.IsBale = detailModel.IsBale;
|
dbDetail.Lot1 = detailModel.Lot1;
|
dbDetail.Lot2 = detailModel.Lot2;
|
dbDetail.UDF1 = detailModel.UDF1;
|
dbDetail.UDF2 = detailModel.UDF2;
|
dbDetail.UDF3 = detailModel.UDF3;
|
dbDetail.UDF4 = detailModel.UDF4;
|
dbDetail.UDF5 = detailModel.UDF5;
|
dbDetail.UpdateTime = dateTime;
|
dbDetail.UpdateUser = model.CreateUser;
|
|
editDetails.Add(dbDetail);
|
}
|
}
|
|
Db.Ado.BeginTran();
|
|
Db.Updateable(dbDetailModels).ExecuteCommand();
|
int rowCount = Db.Updateable(asnInfo).ExecuteCommand();
|
var rowDetailCount = 1;
|
if (addDetails.Count > 0)
|
{
|
rowDetailCount = Db.Insertable(addDetails).ExecuteCommand();
|
}
|
if (editDetails.Count > 0)
|
{
|
rowDetailCount += Db.Updateable(editDetails).ExecuteCommand();
|
}
|
|
Db.Ado.CommitTran();
|
if (rowCount > 0 && rowDetailCount > 0)
|
{
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "编辑", $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
|
return strMessage;
|
}
|
else
|
{
|
Db.Ado.RollbackTran();
|
return "-2:添加失败数据回滚!";
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
}
|
//删除入库单
|
public string DelArrivalNotice(ArrivalNoticeVm model)
|
{
|
try
|
{
|
var asnModel = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Status == "0");
|
if (asnModel == null)
|
{
|
return "-1:入库单状态已变更,不可删除!";
|
|
}
|
if (asnModel.Origin != "录入" && asnModel.Origin != "采购单")
|
{
|
return "-1:上游系统下发的单据,不可删除;";
|
}
|
|
// 删除总单
|
var editDateTime = DateTime.Now;
|
asnModel.IsDel = "1";
|
asnModel.UpdateTime = editDateTime;
|
asnModel.UpdateUser = model.CreateUser;
|
|
// 删除明细单
|
var asnDetails = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == model.ASNNo && m.IsDel =="0").ToList();
|
foreach (BllArrivalNoticeDetail asnDetail in asnDetails)
|
{
|
asnDetail.IsDel = "1";
|
asnDetail.UpdateTime = editDateTime;
|
asnDetail.UpdateUser = model.CreateUser;
|
}
|
|
#region liudl Edit JC26物料不贴吗无需删除
|
//判断是否为采购入库单据或车间余料退回入库
|
// 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库
|
//int notdel = 0;
|
//if (model.Type == "1" || model.Type == "4")
|
//{
|
// //获取单据生成对应标签
|
// var list = Db.Queryable<BllBoxInfo>().Where(a => a.IsDel == "0" && a.Status == "0" && a.BindNo == null);
|
|
// //验证对应箱支信息是否存在
|
// if (list == null)
|
// {
|
// return "-1:已有箱码已绑定托盘或已入库,不可删除!";
|
// }
|
|
// // 删除对应箱支信息
|
// sqlString += $"UPDATE BllBoxInfo SET IsDel = '1',";
|
// sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
|
// sqlString += $"WHERE ASNNo = '{model.ASNNo}';";
|
// notdel = 1;
|
//}
|
#endregion
|
|
Db.Ado.BeginTran();
|
//int rowCount = Db.Ado.ExecuteCommand(sqlString);
|
int rowCount = Db.Updateable(asnModel).ExecuteCommand();
|
rowCount += Db.Updateable(asnDetails).ExecuteCommand();
|
|
Db.Ado.CommitTran();
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除", $"删除了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
|
return "";
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
//删除入库单明细
|
public string DelArrivalNoticeDetail(ArrivalNoticeDetailVm model)
|
{
|
string sqlString = string.Empty;
|
try
|
{
|
var asnModel = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Status == "0");
|
|
if (asnModel == null)
|
{
|
return "-1:入库单状态已变更,不可删除!";
|
|
}
|
if (asnModel.Origin != "录入" )//&& asnModel.Origin != "采购单"
|
{
|
return "-1:上游系统下发的单据,不可删除;";
|
|
}
|
|
var asnDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Id == model.Id);
|
if (asnDetail == null)
|
{
|
return "-1:明细状态已变更,不可删除!";
|
}
|
|
var detailModel = Db.Queryable<BllArrivalNoticeDetail>()
|
.Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Id != model.Id).ToList();
|
var editDateTime = DateTime.Now;
|
if (detailModel.Count <= 0)
|
{
|
asnModel.IsDel = "1";
|
asnModel.UpdateTime = editDateTime;
|
asnModel.UpdateUser = model.CreateUser;
|
}
|
else
|
{
|
asnModel.UpdateTime = editDateTime;
|
asnModel.UpdateUser = model.CreateUser;
|
}
|
|
asnDetail.IsDel = "1";
|
asnDetail.UpdateTime = editDateTime;
|
asnDetail.UpdateUser = model.CreateUser;
|
|
//生成的标签
|
var boxList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == asnDetail.Id && m.Origin == "WMS生成").ToList();
|
|
Db.Ado.BeginTran();
|
int rowCount = Db.Updateable(asnModel).ExecuteCommand();
|
rowCount += Db.Updateable(asnDetail).ExecuteCommand();
|
if (boxList.Count>0)
|
{
|
rowCount += Db.Deleteable(boxList).ExecuteCommand();
|
}
|
|
if (rowCount < 2)
|
{
|
Db.RollbackTran();
|
return "-1:删除失败!";
|
}
|
Db.Ado.CommitTran();
|
|
var detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.Id == model.Id);
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除",
|
$"删除了单据号为{model.ASNNo}、物料为{detail.SkuNo}、批次号为{detail.LotNo}的单据信息",
|
Convert.ToInt32(model.CreateUser));
|
|
return "";
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
}
|
|
//关闭入库单
|
public string CloseArrivalNotice(int id, int userId)
|
{
|
try
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && m.Id == id).ToList().FirstOrDefault();
|
if (notice == null)
|
{
|
throw new Exception("未查询到入库单据信息");
|
}
|
|
var palletBind = Db.Queryable<BllPalletBind>()
|
.Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo
|
&& m.Status != "2" && m.Status != "3").ToList();
|
|
if (palletBind != null && palletBind.Count > 0)
|
{
|
throw new Exception("存在未入库完成托盘信息,不允许关单");
|
}
|
var comTime = DateTime.Now;
|
|
// 总单关单
|
var asnModel = Db.Queryable<BllArrivalNotice>().First(m => m.Id == id);
|
if (asnModel != null)
|
{
|
asnModel.Status = "3";
|
asnModel.CompleteTime = comTime;
|
asnModel.UpdateTime = comTime;
|
asnModel.UpdateUser = userId;
|
}
|
// 将未完成的明细改为已完成
|
var asnDetails = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.Id == id && m.Status == "2").ToList();
|
foreach (BllArrivalNoticeDetail asnDetail in asnDetails)
|
{
|
asnDetail.Status = "2";
|
asnDetail.CompleteTime = comTime;
|
asnDetail.UpdateTime = comTime;
|
asnDetail.UpdateUser = userId;
|
}
|
|
Db.Ado.BeginTran();
|
int rowCount = Db.Updateable(asnModel).ExecuteCommand();
|
rowCount += Db.Updateable(asnDetails).ExecuteCommand();
|
|
if (rowCount <= 0)
|
{
|
Db.RollbackTran();
|
return "-1:关单失败!";
|
}
|
#region 采购计划,若是采购订单根据采购计划单自动生成入库单信息
|
if (notice.Type == "1" && !string.IsNullOrEmpty(notice.OrderCode))
|
{
|
// 获取采购总单信息
|
var planOrd = Db.Queryable<BllProcurePlanNotice>().First(it => it.OrderCode == notice.OrderCode && it.IsDel == "0");
|
//入库单明细
|
var noticeDetailList = Db.Queryable<BllArrivalNoticeDetail>()
|
.Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList();
|
foreach (var item in noticeDetailList)
|
{
|
//采购单明细
|
var planDetail = Db.Queryable<BllProcurePlanNoticeDetail>()
|
.First(it => it.ParentId == planOrd.Id && it.SkuNo == item.SkuNo && it.IsDel == "0");
|
planDetail.CompleteQty += item.CompleteQty;
|
if (planDetail.CompleteQty >= planDetail.Qty)
|
{
|
planDetail.Status = "2";
|
planDetail.CompleteTime = comTime;
|
}
|
else
|
{
|
planDetail.Status = "1";
|
}
|
Db.Updateable(planDetail).ExecuteCommand();
|
}
|
// 维护采购总单信息
|
var planDetailNum = Db.Queryable<BllProcurePlanNoticeDetail>().Count(m => m.IsDel == "0" && m.ParentId == planOrd.Id && m.Status != "2");
|
if (planDetailNum == 0)
|
{
|
planOrd.Status = "2";
|
planOrd.CompleteTime = comTime;
|
Db.Updateable(planOrd).ExecuteCommand();
|
}
|
else
|
{
|
if (planOrd.Status == "0")
|
{
|
planOrd.Status = "1";
|
Db.Updateable(planOrd).ExecuteCommand();
|
}
|
}
|
//采购单明细
|
var planDetailList = Db.Queryable<BllProcurePlanNoticeDetail>()
|
.Where(it => it.ParentId == planOrd.Id && it.IsDel == "0" && it.CompleteQty < it.Qty).ToList();
|
foreach (var item in planDetailList)
|
{
|
//判断有无正在执行的
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(it => it.OrderDetailCode == item.OrderDetailCode && it.IsDel == "0" && it.Status == "0");
|
if (noticeDetail != null)
|
{
|
continue;
|
}
|
// 获取物料详细信息
|
var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == item.SkuNo && it.IsDel == "0");
|
if (skuModel == null)
|
{
|
continue;
|
}
|
// 验证包装信息是否存在
|
var packagModel = Db.Queryable<SysPackag>().First(it => it.PackagNo == item.PackagNo && it.IsDel == "0");
|
if (packagModel == null)
|
{
|
continue;
|
}
|
// 入库总表信息
|
string asnNo = new Common().GetMaxNo("ASN");
|
var asnModel1 = new BllArrivalNotice()
|
{
|
ASNNo = asnNo,
|
Status = "0",//执行状态,0:等待执行
|
Type = "1",//单据类型,1:采购入库
|
Origin = "采购单",
|
CustomerNo = item.CustomerNo,
|
CustomerName = item.CustomerName,
|
OrderCode = planOrd.OrderCode,
|
CreateUser = 0
|
};
|
// 插入入库总表信息
|
Db.Insertable(asnModel1).ExecuteCommand();
|
//入库单明细
|
var arrDetailModel = new BllArrivalNoticeDetail()
|
{
|
ASNNo = asnNo,
|
SkuNo = skuModel.SkuNo,
|
SkuName = skuModel.SkuName,
|
Standard = skuModel.Standard,
|
LotNo = "",
|
LotText = "",
|
Qty = 0,
|
FactQty = 0,
|
CompleteQty = 0,
|
PackagNo = packagModel.PackagNo,
|
SupplierLot = "",
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
OrderDetailCode = item.OrderDetailCode,
|
CreateUser = 0
|
};
|
// 插入入库总表信息
|
Db.Insertable(arrDetailModel).ExecuteCommand();
|
}
|
}
|
#endregion
|
|
Db.Ado.CommitTran();
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "关单", $"关闭了单据号为{notice.ASNNo}的单据信息", userId);
|
return "";
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
//入库单撤销申请
|
public void CancelOrder(int id, string reason, int userId)
|
{
|
try
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.Id == id);
|
if (notice == null)
|
{
|
throw new Exception("未查询到入库单据信息");
|
}
|
if (notice.Status != "1" && notice.Status != "2")
|
{
|
throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销");
|
}
|
|
var bind = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList();
|
if (bind.Count == 0)
|
{
|
throw new Exception("未查询到入库单据的托盘绑定信息");
|
}
|
|
if (bind.Count(m => m.Status == "1") > 0)
|
{
|
throw new Exception("当前入库单据的托盘绑定信息有正在执行的,请稍后完成后再撤销");
|
}
|
|
var auditLog = Db.Queryable<BllAuditLog>().Where(m => m.IsDel == "0" && m.Status == "0");
|
var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo);
|
if (auditLog.Count(m => m.OrderNo == notice.ASNNo) > 0)
|
{
|
throw new Exception("当前入库单据已有撤销审核,请等待审核完成");
|
}
|
|
|
var startStatusName = "";
|
var endStatusName = "";
|
switch (notice.Status)
|
{
|
case "1":
|
startStatusName = "正在执行";
|
endStatusName = "等待执行";
|
break;
|
case "2":
|
startStatusName = "执行完成";
|
endStatusName = "正在执行";
|
break;
|
default:
|
throw new Exception("单据状态错误");
|
}
|
|
var palletStr = "";
|
var msgS = "";
|
var msgL = "";
|
foreach (var item in bind)
|
{
|
if (auditLog.Count(m => m.OrderNo == item.ASNNo && m.PalletNo.Contains(item.PalletNo)) > 0)
|
{
|
continue;
|
}
|
|
if (!palletStr.Contains(item.PalletNo))
|
{
|
palletStr += item.PalletNo + ";";
|
}
|
|
var info = boxInfo.First(m => m.BindNo == item.Id);
|
//获取托盘绑定对应单据
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(a => a.IsDel == "0" && a.Id == item.ASNDetailNo);
|
if (info != null)
|
{
|
if (!msgS.Contains(info.SkuNo))
|
{
|
msgS += info.SkuNo + ";";
|
}
|
|
if (!msgL.Contains(info.LotNo))
|
{
|
msgL += info.LotNo + ";";
|
|
}
|
}
|
else
|
{
|
if (!msgS.Contains(noticeDetail.SkuNo))
|
{
|
msgS += noticeDetail.SkuNo + ";";
|
}
|
|
if (!msgL.Contains(noticeDetail.LotNo))
|
{
|
msgL += noticeDetail.LotNo + ";";
|
|
}
|
}
|
|
}
|
var time = DateTime.Now;
|
var log = new BllAuditLog()
|
{
|
OrderNo = notice.ASNNo,
|
PalletNo = palletStr,
|
Msg = $"物料:{msgS} 批次:{msgL}",
|
Reason = reason,
|
Status = "0",
|
Opinion = "",
|
StartStatus = startStatusName,
|
EndStatus = endStatusName,
|
FunctionCode = "001",
|
|
IsDel = "0",
|
CreateUser = userId,
|
CreateTime = time
|
};
|
Db.Insertable(log).ExecuteCommand();
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "添加", $"添加了单据号为{notice.ASNNo}的单据撤销申请", userId);
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// 维护入库单备注信息
|
/// </summary>
|
/// <param name="id"></param>
|
/// <param name="demo"></param>
|
/// <param name="userId"></param>
|
public void EditNoticeDemo(int id, string demo, int userId)
|
{
|
try
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.Id == id);
|
if (notice == null)
|
{
|
throw new Exception("未查询到入库单据信息");
|
}
|
notice.Demo = demo + "".Trim();
|
notice.UpdateUser = userId;
|
notice.UpdateTime = DateTime.Now;
|
|
int i = Db.Updateable(notice).ExecuteCommand();
|
if (i > 0)
|
{
|
//添加操作日志
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "编辑", $"编辑了单据号为{notice.ASNNo}的备注信息", userId);
|
}
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
|
#endregion
|
|
#region 接口方法
|
/// <summary>
|
/// 创建入库单据(上游系统)
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public ErpModel CreateAsn(AsnInfo model)
|
{
|
try
|
{
|
var resultModel = new ErpModel() { Success = -1, Message = "" };
|
if (string.IsNullOrEmpty(model.AsnType))
|
{
|
resultModel.Message = "单据类型不可为空!";
|
return resultModel;
|
}
|
if (string.IsNullOrEmpty(model.Customer))
|
{
|
resultModel.Message = "客户不可为空!";
|
return resultModel;
|
}
|
if (string.IsNullOrEmpty(model.OrderCode))
|
{
|
resultModel.Message = "上游系统单号不可为空!";
|
return resultModel;
|
}
|
if (model.AsnDetails.Count <= 0)
|
{
|
resultModel.Message = "入库单明细不可为空!";
|
return resultModel;
|
}
|
|
// 根据客户编号获取客户名称
|
var CustomerModel = Db.Queryable<SysCustomer>().First(it => it.CustomerNo == model.Customer && it.IsDel == "0");
|
if (CustomerModel == null)
|
{
|
resultModel.Message = "客户编号不存在!";
|
return resultModel;
|
}
|
|
// 入库总表信息
|
string asnNo = new Common().GetMaxNo("ASN");
|
var asnModel = new BllArrivalNotice()
|
{
|
ASNNo = asnNo,
|
Status = "0",//等待执行
|
Type = model.AsnType,
|
Origin = string.IsNullOrEmpty(model.Origin) ? "ERP" : model.Origin,
|
CustomerNo = model.Customer,
|
CustomerName = CustomerModel.CustomerName,
|
OrderCode = model.OrderCode,
|
UserName = model.Username
|
};
|
|
// 入库明细表信息
|
List<BllArrivalNoticeDetail> detailModels = new List<BllArrivalNoticeDetail>();
|
foreach (AsnDetail asnDetailModel in model.AsnDetails)
|
{
|
if (string.IsNullOrEmpty(asnDetailModel.SkuNo))
|
{
|
resultModel.Message = "物料编码不可为空!";
|
return resultModel;
|
}
|
|
if (asnDetailModel.Qty <= 0)
|
{
|
resultModel.Message = "数量应为正整数!";
|
return resultModel;
|
}
|
if (string.IsNullOrEmpty(asnDetailModel.LotNo))
|
{
|
resultModel.Message = "批次号不可为空!";
|
return resultModel;
|
}
|
|
// 获取物料详细信息
|
var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == asnDetailModel.SkuNo && it.IsDel == "0");
|
if (skuModel == null)
|
{
|
resultModel.Message = "不存在当前物料信息!";
|
return resultModel;
|
}
|
|
// 验证包装信息是否存在
|
|
var detailModel = new BllArrivalNoticeDetail()
|
{
|
ASNNo = asnNo,
|
SkuNo = asnDetailModel.SkuNo,
|
SkuName = skuModel.SkuName,
|
Standard = skuModel.Standard,
|
LotNo = asnDetailModel.LotNo,
|
LotText = "",
|
Qty = (decimal)asnDetailModel.Qty,
|
FactQty=0,
|
CompleteQty=0,
|
PackagNo = skuModel.PackagNo,
|
SupplierLot = asnDetailModel.SupplierLot,
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
CreateUser = 0
|
};
|
|
detailModels.Add(detailModel);
|
}
|
|
Db.BeginTran();
|
// 插入入库单总表
|
Db.Insertable(asnModel).ExecuteCommand();
|
|
// 插入入库单明细表
|
Db.Insertable(detailModels).ExecuteCommand();
|
Db.CommitTran();
|
|
resultModel.Success = 0;
|
resultModel.Message = "成功";
|
return resultModel;
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
|
//订单回传上游系统
|
public bool FinishAsn(int id, string url, int userId)
|
{
|
try
|
{
|
Db.BeginTran();
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.Id == id && m.IsDel == "0");
|
if (notice == null)
|
{
|
throw new Exception("未查询到单据信息");
|
}
|
if (notice.Status != "3")
|
{
|
throw new Exception("复核失败,单据非关闭状态");
|
}
|
var detail = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList();
|
if (detail.Count == 0)
|
{
|
throw new Exception("未查询到单据明细信息");
|
}
|
if (userId == notice.UpdateUser)
|
{
|
throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
|
}
|
var list = new List<AsnDetail>();
|
foreach (var d in detail)
|
{
|
var item = new AsnDetail()
|
{
|
SkuNo = d.SkuNo,
|
LotNo = d.LotNo,
|
Qty = d.CompleteQty,
|
PackagNo = d.PackagNo,
|
SupplierLot = d.SupplierLot
|
};
|
list.Add(item);
|
}
|
var soInfo = new AsnInfo()
|
{
|
OrderCode = notice.OrderCode,
|
AsnDetails = list
|
};
|
|
#region 通过接口发送至erp
|
//系统对接后放开
|
/*var jsonData = JsonConvert.SerializeObject(soInfo);
|
|
var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP");
|
|
var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
|
if (obj.Success != 0)
|
{
|
throw new Exception("上传失败" + obj.Message);
|
}*/
|
#endregion
|
|
notice.Status = "4";
|
notice.CheckTime = DateTime.Now;
|
notice.CheckUser = userId;
|
Db.Updateable(notice).ExecuteCommand();
|
|
new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "复核", $"复核了单据号为{notice.ASNNo}的单据信息", userId);
|
Db.CommitTran();
|
return true;
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
//订单回传上游系统
|
public bool ByPdaFinish(string code, string url, int userId)
|
{
|
try
|
{
|
Db.BeginTran();
|
if (code.Substring(0,2) == "AS")
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == code && m.IsDel == "0");
|
if (notice == null)
|
{
|
throw new Exception("未查询到单据信息");
|
}
|
if (notice.Status != "3")
|
{
|
throw new Exception("复核失败,单据非关闭状态");
|
}
|
var detail = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList();
|
if (detail.Count == 0)
|
{
|
throw new Exception("未查询到单据明细信息");
|
}
|
if (userId == notice.UpdateUser)
|
{
|
throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
|
}
|
var list = new List<AsnDetail>();
|
foreach (var d in detail)
|
{
|
var item = new AsnDetail()
|
{
|
SkuNo = d.SkuNo,
|
LotNo = d.LotNo,
|
Qty = d.CompleteQty,
|
PackagNo = d.PackagNo,
|
SupplierLot = d.SupplierLot
|
};
|
list.Add(item);
|
}
|
var soInfo = new AsnInfo()
|
{
|
OrderCode = notice.OrderCode,
|
AsnDetails = list
|
};
|
|
#region 通过接口发送至erp
|
//系统对接后放开
|
/*var jsonData = JsonConvert.SerializeObject(soInfo);
|
|
var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP");
|
|
var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
|
if (obj.Success != 0)
|
{
|
throw new Exception("上传失败" + obj.Message);
|
}*/
|
#endregion
|
|
notice.Status = "4";
|
notice.CheckTime = DateTime.Now;
|
notice.CheckUser = userId;
|
Db.Updateable(notice).ExecuteCommand();
|
|
new OperationASNServer().AddLogOperationAsn("PDA模块", "复核单据", code, "复核", $"复核了单据号为{code}的单据信息", userId);
|
}
|
else if (code.Substring(0,2) == "SO")
|
{
|
var notice = Db.Queryable<BllExportNotice>().First(m => m.SONo == code && m.IsDel == "0");
|
if (notice == null)
|
{
|
throw new Exception("未查询到单据信息");
|
}
|
if (notice.Status != "5")
|
{
|
throw new Exception("复核失败,单据非关闭状态");
|
}
|
var detail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.SONo == notice.SONo && m.IsDel == "0").ToList();
|
if (detail.Count == 0)
|
{
|
throw new Exception("未查询到单据明细信息");
|
}
|
if (userId == notice.UpdateUser)
|
{
|
throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
|
}
|
var list = new List<SoDetail>();
|
foreach (var d in detail)
|
{
|
var item = new SoDetail()
|
{
|
SkuNo = d.SkuNo,
|
LotNo = d.LotNo,
|
Qty = (decimal)d.CompleteQty
|
};
|
list.Add(item);
|
}
|
var soInfo = new SoInfo()
|
{
|
OrderCode = notice.OrderCode,
|
SoDetails = list
|
};
|
#region 通过接口发送至erp
|
//系统对接后放开
|
/*var jsonData = JsonConvert.SerializeObject(soInfo);
|
|
var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP");
|
|
var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
|
if (obj.Success != 0)
|
{
|
throw new Exception("上传失败" + obj.Message);
|
}*/
|
#endregion
|
|
notice.Status = "6";
|
notice.CheckTime = DateTime.Now;
|
notice.CheckUser = userId;
|
Db.Updateable(notice).ExecuteCommand();
|
|
new OperationSOServer().AddLogOperationSo("PDA模块", "复核单据", code, "复核", $"复核了单据号为{code}的单据信息", userId);
|
}
|
Db.CommitTran();
|
|
return true;
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
#region 余料退回入库单
|
/// <summary>
|
/// 余料退回入库单据下发
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public ErpModel CreateAsnYuLiao(AsnYuLiaoModel model)
|
{
|
try
|
{
|
var resultModel = new ErpModel() { Success = -1, Message = "" };
|
if (string.IsNullOrEmpty(model.SONo))
|
{
|
resultModel.Message = "出库单号不可为空!";
|
return resultModel;
|
}
|
if (model.UseSkuList.Count <= 0)
|
{
|
resultModel.Message = "已消耗物料信息不可为空!";
|
return resultModel;
|
}
|
var _dateTime = DateTime.Now;
|
//开启事务
|
Db.BeginTran();
|
//出库单信息
|
var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == model.SONo);
|
if (notice == null)
|
{
|
resultModel.Message = "不存在出库单信息!";
|
return resultModel;
|
}
|
|
//拣货明细
|
var completeDetail = Db.Queryable<BllCompleteDetail>().Where(w => w.IsDel == "0" && w.SONo == model.SONo).ToList();
|
|
//入库总表信息
|
string asnNo = new Common().GetMaxNo("ASN");
|
var asnModel = new BllArrivalNotice()
|
{
|
ASNNo = asnNo,
|
Type = "4",//余料退回
|
Status = "2",//执行完成
|
Origin = "MES",
|
OrderCode = model.OrderCode,
|
CustomerNo = notice.CustomerNo,
|
CustomerName = notice.CustomerName
|
};
|
//插入入库单总表
|
Db.Insertable(asnModel).ExecuteCommand();
|
|
//剩余的拣货明细信息
|
var completeDetailYuList = new List<BllCompleteDetail>();
|
//退回托盘集合
|
var PalletNoList = model.UseSkuList.GroupBy(s => s.PalletNo).Select(s => s.Key).ToList();
|
foreach (var item in PalletNoList)
|
{
|
//退回托盘物料信息
|
var useSkuInfo = model.UseSkuList.First(w => w.PalletNo == item);
|
|
if (useSkuInfo.UseBoxList.Count > 0)
|
{
|
//拣货明细信息
|
var completeDetailList = completeDetail.Where(w => w.PalletNo == item).ToList();
|
foreach (var completeDetailModel in completeDetailList)
|
{
|
if (completeDetailModel.SkuNo != useSkuInfo.SkuNo)
|
{
|
resultModel.Message = "退回物料信息和领料物料信息不一致!";
|
return resultModel;
|
}
|
completeDetailModel.BoxNo2 = completeDetailModel.BoxNo2 == null ? "" : completeDetailModel.BoxNo2;
|
completeDetailModel.BoxNo3 = completeDetailModel.BoxNo3 == null ? "" : completeDetailModel.BoxNo3;
|
var boxModel = useSkuInfo.UseBoxList.FirstOrDefault(w => w.BoxNo == completeDetailModel.BoxNo && w.BoxNo2 == completeDetailModel.BoxNo2 && w.BoxNo3 == completeDetailModel.BoxNo3);
|
if (boxModel == null)
|
{
|
completeDetailYuList.Add(completeDetailModel);
|
}
|
else
|
{
|
if (completeDetailModel.CompleteQty - boxModel.Qty > 0)
|
{
|
completeDetailModel.CompleteQty -= boxModel.Qty;
|
completeDetailYuList.Add(completeDetailModel);
|
}
|
}
|
}
|
}
|
else
|
{
|
//拣货明细信息
|
var completeDetailInfo = completeDetail.First(w => w.PalletNo == item);
|
completeDetailInfo.CompleteQty = completeDetailInfo.CompleteQty - useSkuInfo.Qty;
|
if (completeDetailInfo.CompleteQty > 0)
|
{
|
completeDetailYuList.Add(completeDetailInfo);
|
}
|
}
|
}
|
//将剩余的拣货明细按照出库单明细id进行分组(相当于按照物料+批次分组)
|
var skuModelList = completeDetailYuList.GroupBy(g => g.SODetailNo).Select(s => s.Key).ToList();
|
foreach (var item in skuModelList)
|
{
|
var completeDetailYuModelList = completeDetailYuList.Where(w => w.SODetailNo == item).ToList();
|
decimal bindQty = (decimal)completeDetailYuModelList.Sum(s => s.CompleteQty);
|
//获取物料详细信息
|
var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == completeDetailYuModelList[0].SkuNo && it.IsDel == "0");
|
//获取包装信息
|
var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == skuModel.PackagNo);
|
var pNum = 0;//托盘物品数量
|
if (pack.L5Num.HasValue)
|
{
|
pNum = (int)pack.L5Num;
|
}
|
else if (pack.L4Num.HasValue)
|
{
|
pNum = (int)pack.L4Num;
|
}
|
else if (pack.L3Num.HasValue)
|
{
|
pNum = (int)pack.L3Num;
|
}
|
else if (pack.L2Num.HasValue)
|
{
|
pNum = (int)pack.L2Num;
|
}
|
else if (pack.L1Num.HasValue)
|
{
|
pNum = (int)pack.L1Num;
|
}
|
//入库单明细信息
|
var asnDetailModel = new BllArrivalNoticeDetail()
|
{
|
ASNNo = asnNo,
|
SkuNo = completeDetailYuModelList[0].SkuNo,
|
SkuName = completeDetailYuModelList[0].SkuName,
|
Standard = completeDetailYuModelList[0].Standard,
|
LotNo = completeDetailYuModelList[0].LotNo,
|
LotText = completeDetailYuModelList[0].LotText,
|
Qty = bindQty,
|
FactQty = bindQty,
|
CompleteQty = bindQty,
|
PackagNo = skuModel.PackagNo,
|
SupplierLot = completeDetailYuModelList[0].SupplierLot,
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
CreateUser = 0
|
};
|
// 插入入库单明细表
|
int asnDetailId = Db.Insertable(asnDetailModel).ExecuteReturnIdentity();
|
|
//绑定托盘信息
|
var bindPalletNoList = completeDetailYuModelList.GroupBy(s => s.PalletNo).Select(s => s.Key).ToList();
|
string hasLocatNoList = string.Empty;
|
foreach (var bindPalletNoItem in bindPalletNoList)
|
{
|
//托盘储位信息
|
var palletLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.PalletNo == bindPalletNoItem);
|
if (palletLocatInfo == null)
|
{
|
resultModel.Message = "托盘所在储位信息不存在!";
|
return resultModel;
|
}
|
palletLocatInfo.Status = "3";//出库中
|
//更新储位状态
|
Db.Updateable(palletLocatInfo).ExecuteCommand();
|
//获取目标储位地址
|
SysStorageLocat EndLocat = GetLocat(asnDetailModel.SkuNo, asnDetailModel.LotNo, bindPalletNoItem,hasLocatNoList);
|
if (EndLocat == null)
|
{
|
resultModel.Message = "未找到目标储位地址信息!";
|
return resultModel;
|
}
|
hasLocatNoList += $"{EndLocat.LocatNo},";
|
|
//插入托盘绑定信息
|
decimal bindPalletQty = (decimal)completeDetailYuList.Where(w => w.PalletNo == bindPalletNoItem).Sum(s => s.CompleteQty);
|
var bind = new BllPalletBind
|
{
|
ASNNo = asnNo,
|
ASNDetailNo = asnDetailId,
|
PalletNo = bindPalletNoItem,
|
PalletNo2 = "",
|
PalletNo3 = "",
|
Qty = bindPalletQty,
|
FullQty = pNum,
|
Status = "0",
|
Type = "0",
|
LotNo = asnDetailModel.LotNo,
|
LotText = asnDetailModel.LotText,
|
SupplierLot = asnDetailModel.SupplierLot,
|
BitPalletMark = "1",
|
IsBale = "0",
|
IsBelt = "0",
|
|
WareHouseNo= EndLocat.WareHouseNo,//所属仓库
|
LocatNo=EndLocat.LocatNo,//储位地址
|
|
CreateUser = 0
|
};
|
// 插入托盘绑定表
|
int bindId = Db.Insertable(bind).ExecuteReturnIdentity();
|
|
List<BllBoxInfo> boxInfoList = new List<BllBoxInfo>();
|
var palletCompleteDetailYuModelList = completeDetailYuModelList.Where(w => w.PalletNo == bindPalletNoItem).ToList();
|
foreach (var completeDetailYuItem in palletCompleteDetailYuModelList)
|
{
|
Expression<Func<BllBoxInfo, bool>> exp = Expressionable.Create<BllBoxInfo>()
|
.And(it => it.BoxNo== completeDetailYuItem.BoxNo)
|
.AndIF(!string.IsNullOrEmpty(completeDetailYuItem.BoxNo2), it => it.BoxNo2 == completeDetailYuItem.BoxNo2)
|
.AndIF(!string.IsNullOrEmpty(completeDetailYuItem.BoxNo3), it => it.BoxNo3 == completeDetailYuItem.BoxNo3)
|
.ToExpression();//注意 这一句 不能少
|
var boxinfo = Db.Queryable<BllBoxInfo>().Where(exp).OrderByDescending(o => o.CreateTime).First();
|
if (boxinfo != null)
|
{
|
//箱支明细
|
var labelModel = new BllBoxInfo()
|
{
|
ASNNo = asnNo,
|
ASNDetailNo = asnDetailId,
|
BoxNo = completeDetailYuItem.BoxNo,
|
BoxNo2 = completeDetailYuItem.BoxNo2,
|
BoxNo3 = completeDetailYuItem.BoxNo3,
|
Qty = (decimal)completeDetailYuItem.CompleteQty,
|
FullQty = boxinfo.FullQty,
|
Status = "2",//已入库
|
BindNo = bindId,
|
PalletNo = bindPalletNoItem,
|
SkuNo = completeDetailYuItem.SkuNo,
|
SkuName = completeDetailYuItem.SkuName,
|
LotNo = completeDetailYuItem.LotNo,
|
Standard = completeDetailYuItem.Standard,
|
PackageStandard = boxinfo.PackageStandard,
|
SupplierLot = completeDetailYuItem.SupplierLot,
|
InspectMark = boxinfo.InspectMark,
|
BitBoxMark = boxinfo.FullQty > completeDetailYuItem.CompleteQty ? "1" : "0",
|
InspectStatus = "0",
|
|
ProductionTime = boxinfo.ProductionTime,
|
StoreTime = boxinfo.StoreTime,
|
ExpirationTime = boxinfo.ExpirationTime,
|
|
Origin = "余料退回",
|
CreateUser = 0,
|
CreateTime = _dateTime,
|
};
|
boxInfoList.Add(labelModel);
|
}
|
}
|
//插入箱支明细表
|
Db.Insertable(boxInfoList).ExecuteCommand();
|
|
List<DataBoxInfo> dataBoxInfoList = new List<DataBoxInfo>();
|
//库存明细
|
var sd = new DataStockDetail()
|
{
|
LotNo = asnDetailModel.LotNo,
|
LotText = asnDetailModel.LotText,
|
SupplierLot = asnDetailModel.SupplierLot,
|
SkuNo = asnDetailModel.SkuNo,
|
SkuName = asnDetailModel.SkuName,
|
Standard = asnDetailModel.Standard,
|
Qty = bindPalletQty,
|
LockQty = 0,
|
FrozenQty = 0,
|
InspectQty = 0,
|
ASNNo = asnDetailModel.ASNNo,
|
ASNDetailNo = asnDetailId,
|
WareHouseNo = "",
|
RoadwayNo = "",
|
AreaNo = "",
|
LocatNo = "",
|
PalletNo = bindPalletNoItem,
|
PalletNo2 = "",
|
PalletNo3 = "",
|
PalletTags = "1",
|
CompleteTime = _dateTime,
|
ProductionTime = boxInfoList[0].ProductionTime,
|
ExpirationTime = boxInfoList[0].ExpirationTime,
|
Status = "0",
|
InspectMark = "0",
|
InspectStatus = "1",
|
BitPalletMark = "1",
|
PackagNo = asnDetailModel.PackagNo,
|
IsBale = asnDetailModel.IsBale,
|
IsBelt = asnDetailModel.IsBelt,
|
OwnerNo = asnModel.CustomerNo,
|
OwnerName = asnModel.CustomerName,
|
|
IsDel = "0",
|
CreateUser = 0,
|
CreateTime = _dateTime
|
};
|
//新增库存明细信息
|
var sdId = Db.Insertable(sd).ExecuteReturnIdentity();
|
foreach (var boxItem in boxInfoList)
|
{
|
//库存箱支明细
|
var box = new DataBoxInfo()
|
{
|
StockDetailId = sdId,
|
BindNo = bindId,
|
BoxNo = boxItem.BoxNo,
|
BoxNo2 = boxItem.BoxNo2,
|
BoxNo3 = boxItem.BoxNo3,
|
PalletNo = boxItem.PalletNo,
|
PalletNo2 = boxItem.PalletNo2,
|
PalletNo3 = boxItem.PalletNo3,
|
Qty = boxItem.Qty,
|
FullQty = boxItem.FullQty,
|
Status = "2",
|
LotNo = boxItem.LotNo,
|
LotText = boxItem.LotText,
|
SkuNo = boxItem.SkuNo,
|
SkuName = boxItem.SkuName,
|
Standard = boxItem.Standard,
|
ProductionTime = boxItem.ProductionTime,
|
SupplierLot = boxItem.SupplierLot,
|
InspectStatus = boxItem.InspectStatus,
|
InspectMark = boxItem.InspectMark,
|
BitBoxMark = boxItem.BitBoxMark,
|
|
CreateUser = 0,
|
CreateTime = _dateTime
|
};
|
dataBoxInfoList.Add(box);
|
}
|
//插入库存箱支明细表
|
Db.Insertable(dataBoxInfoList).ExecuteCommand();
|
}
|
//库存
|
var dataStock = Db.Queryable<DataStock>().First(m => m.IsDel == "0" && m.SkuNo == asnDetailModel.SkuNo && m.LotNo == asnDetailModel.LotNo);
|
if (dataStock != null)
|
{
|
dataStock.Qty += bindQty;
|
Db.Updateable(dataStock).ExecuteCommand();
|
}
|
else
|
{
|
var stock = new DataStock()
|
{
|
SkuNo = asnDetailModel.SkuNo,
|
SkuName = asnDetailModel.SkuName,
|
Standard = asnDetailModel.Standard,
|
LotNo = asnDetailModel.LotNo,
|
LotText = asnDetailModel.LotText,
|
Qty = bindQty,
|
LockQty = 0,
|
FrozenQty = 0,
|
IsSampling = "0",
|
IsDel = "0",
|
CreateUser = 0,
|
CreateTime = _dateTime,
|
OwnerNo = asnModel.CustomerNo,//货主编码
|
OwnerName = asnModel.CustomerName//货主名称
|
};
|
Db.Insertable(stock).ExecuteCommand();
|
}
|
}
|
|
#region 调度AGV代码
|
|
#endregion
|
|
//提交事务
|
Db.CommitTran();
|
|
resultModel.Success = 0;
|
resultModel.Message = "成功";
|
return resultModel;
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
private SysStorageLocat GetLocat(string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
|
{
|
try
|
{
|
var endLocat = new SysStorageLocat();//目标储位
|
//当然区域所有储位信息
|
var storageLocatList = Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02").ToList();
|
//同区域同批次物料的储位信息
|
List<string> locatList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.PalletNo != palletNo)
|
.OrderByDescending(o => o.LocatNo).Select(s => s.LocatNo).Distinct().ToList();
|
foreach (var item in locatList)
|
{
|
var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First();
|
|
var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.LocatNo != locatInfo.LocatNo && w.Row == locatInfo.Row && !hasLocatNoList.Contains(w.LocatNo))
|
.OrderByDescending(o => o.Column).First();
|
if (locatInfo2 != null)
|
{
|
endLocat = locatInfo2;
|
}
|
}
|
if (endLocat != null)
|
{
|
var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo))
|
.OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First();
|
|
if (locatInfo3 != null)
|
{
|
endLocat = locatInfo3;
|
}
|
}
|
return endLocat;
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
#endregion
|
#endregion
|
|
#region 数据归档
|
public List<ArrivalNoticeDto> GetArchivingArrivalNoticeList(ArrivalNoticeVm model, out int count)
|
{
|
string sqlString = string.Empty;
|
string sqlCount = string.Empty;
|
string sqlPub = string.Empty;
|
try
|
{
|
sqlCount += "SELECT DISTINCT COUNT(tb1.ID) FROM ArchivingArrivalNotice AS tb1 ";
|
sqlString += "SELECT DISTINCT tb1.*,tb3.RealName as CreateUserName,tb4.RealName as UpdateUserName,tb5.RealName as CheckUserName FROM ArchivingArrivalNotice AS tb1 ";
|
sqlPub += "LEFT JOIN ArchivingArrivalNoticeDetail AS tb2 ON tb1.ASNNo = tb2.ASNNo ";
|
sqlPub += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id ";
|
sqlPub += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id ";
|
sqlPub += "LEFT JOIN SysUserInfor AS tb5 ON tb1.CheckUser = tb5.Id ";
|
sqlPub += $"WHERE tb1.ASNNo LIKE '%{model.ASNNo}%' AND tb2.LotNo LIKE '%{model.LotNo}%' ";
|
sqlPub += $"AND tb2.SkuNo LIKE '%{model.SkuNo}%' AND tb2.SkuName LIKE '%{model.SkuName}%' ";
|
sqlPub += $"AND tb1.CustomerName LIKE '%{model.CustomerName}%' ";
|
if (!string.IsNullOrEmpty(model.Status))
|
{
|
sqlPub += $"AND tb1.Status = '{model.Status}' ";
|
}
|
if (!string.IsNullOrEmpty(model.Type))
|
{
|
if (model.Type == "3")
|
{
|
sqlPub += $"AND tb1.Type = '{model.Type}' ";
|
}
|
else
|
{
|
sqlPub += $"AND tb1.Type = '{model.Type}' AND tb1.Type != '3' ";
|
}
|
}
|
else
|
{
|
sqlPub += " AND tb1.Type != '3'";
|
|
}
|
if (!string.IsNullOrEmpty(model.StartTime))
|
{
|
sqlPub += $"AND tb1.CreateTime >= '{model.StartTime}' ";
|
}
|
if (!string.IsNullOrEmpty(model.EndTime))
|
{
|
sqlPub += $"AND tb1.CreateTime <= '{model.EndTime}' ";
|
}
|
sqlCount += sqlPub + "AND tb1.IsDel = '0' ";
|
sqlPub += "AND tb1.IsDel = '0' order by tb1.ASNNo desc ";
|
if (model.Page == 0)
|
{
|
model.Page = 1;
|
}
|
sqlString += sqlPub + $" offset {((model.Page - 1) * model.Limit)} rows fetch next {model.Limit} rows only;";
|
|
var com = new Common();
|
count = com.GetRowCount(sqlCount);
|
|
var modelList = Db.Ado.SqlQuery<ArrivalNoticeDto>(sqlString);
|
|
return modelList;
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
}
|
public List<ArrivalNoticeDetailDto> GetArchivingArrivalNoticeDetailList(ArrivalNoticeDetailVm model, out int count)
|
{
|
string sqlString = string.Empty;
|
string sqlCount = string.Empty;
|
int rowCount = 1;
|
try
|
{
|
if (model.Page == 0)
|
{
|
model.Page = 1;
|
}
|
sqlCount += $"SELECT COUNT(ID) FROM ArchivingArrivalNoticeDetail where ASNNo = '{model.ASNNo}' and isdel = '0';";
|
var com = new Common();
|
count = com.GetRowCount(sqlCount);
|
if (count != 0)
|
{
|
rowCount = count;
|
}
|
|
sqlString += "SELECT DISTINCT tb1.*,tb2.Type as AsnType,tb2.Status as AsnStatus,tb3.RealName as CreateUserName, ";
|
sqlString += "tb4.RealName as UpdateUserName,isnull(tb6.UnitName,tb5.UnitNo) as UnitName,tb7.PackagName ";
|
sqlString += "FROM ArchivingArrivalNoticeDetail AS tb1 ";
|
sqlString += "LEFT JOIN ArchivingArrivalNotice AS tb2 ON tb1.ASNNo = tb2.ASNNo ";
|
sqlString += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id ";
|
sqlString += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id ";
|
sqlString += "LEFT JOIN SysMaterials AS tb5 on tb1.SkuNo = tb5.SkuNo ";
|
sqlString += "LEFT JOIN SysUnit AS tb6 on tb5.UnitNo = tb6.UnitNo ";
|
sqlString += "LEFT JOIN SysPackag AS tb7 on tb1.PackagNo = tb7.PackagNo ";
|
sqlString += $"WHERE tb1.ASNNo = '{model.ASNNo}' AND tb1.IsDel = '0' order by tb1.SkuNo desc ";
|
sqlString += $"offset {((model.Page - 1) * model.Limit)} rows fetch next {rowCount} rows only;";
|
|
var modelList = Db.Ado.SqlQuery<ArrivalNoticeDetailDto>(sqlString);
|
|
return modelList;
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
}
|
|
#endregion
|
}
|
|
}
|