using SqlSugar;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TouchSocket.Core;
using WCS.BLL.DbModels;
using WCS.BLL.Services.IService;
using WCS.DAL;
using WCS.DAL.Db;
using WCS.Model;
using WCS.Model.ApiModel;
using WCS.Model.ApiModel.MatBaseInfo;
using WCS.Model.ApiModel.User;
namespace WCS.BLL.Services.Service
{
///
/// 需要生成序列号保证不重复的方法
///
public class GenerateService : IGenerateService
{
public static object matFlag = new object();
public static object stockTakingFlag = new object();
public async Task>> generateMatInfo(GenerateMatInfoRequest request)
{
//校验是否被禁用
var matBaseInfo = await DbHelp.db.Queryable()
.Where(t => t.Id == request.MatBaseInfo.Id)
.FirstAsync();
if (matBaseInfo == null)
{
return new ResponseCommon>()
{
Code = 201,
Message = $"生成失败:该物料基础信息不存在",
Data = null
};
}
else if (matBaseInfo.IsEnable == false)
{
return new ResponseCommon>()
{
Code = 201,
Message = $"生成失败:该物料已被禁用",
Data = null
};
}
//生成条码
lock (matFlag)
{
try
{
DbHelp.db.BeginTran();
var startNumber = ++matBaseInfo.SerialNumber;
var matInfoList = new List();
for (var i = 0; i < request.TotalCount; i++)
{
var matInfo = new MatInfo()
{
MatSn = GetMatSn(matBaseInfo, startNumber + i),
MatCode = matBaseInfo.MatCode,
MatName = matBaseInfo.MatName,
MatBatch = request.MatBatch,
MatSpec = matBaseInfo.MatSpec,
MatUnit = matBaseInfo.MatUnit,
MatSupplier = matBaseInfo.MatSupplier,
MatCustomer = matBaseInfo.MatCustomer,
MatQty = request.MatQty,
ModifyUser = request.UserName
};
matInfo.Id = DbHelp.db.Insertable(matInfo).ExecuteReturnIdentity();
matInfoList.Add(matInfo);
}
matBaseInfo.SerialNumber = startNumber + request.TotalCount;
DbHelp.db.Updateable(matBaseInfo).ExecuteCommand();
DbHelp.db.CommitTran();
return new ResponseCommon>()
{
Code = 200,
Message = "success",
Data = matInfoList
};
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
return new ResponseCommon>()
{
Code = 201,
Message = $"生成失败:{ex.Message}",
Data = null
};
}
}
}
private string GetMatSn(MatBaseInfo matBaseInfo, int serialNumber)
{
var gongshi = "=A1&\"-\"&A2&A3";
Dictionary keyValuePairs = new Dictionary();
keyValuePairs.Add("A1", matBaseInfo.MatCode);
keyValuePairs.Add("A2", string.IsNullOrEmpty(matBaseInfo.MatBatch) ? "" : matBaseInfo.MatBatch);
keyValuePairs.Add("A3", serialNumber.ToString().PadLeft(6, '0'));
var matSn = PnHelp.Jx(gongshi, keyValuePairs);
return matSn;
}
public async Task generateStockTakingNumber()
{
lock (stockTakingFlag)
{
var serialNumber = GetSerialNumber(DocumentTypeEnum.盘点单据);
return "PD" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
}
}
public async Task generateOutOrderNumber()
{
lock (stockTakingFlag)
{
var serialNumber = GetSerialNumber(DocumentTypeEnum.出库单据);
return "CK" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
}
}
public async Task generateMXPDOutOrderNumber()
{
lock (stockTakingFlag)
{
var serialNumber = GetSerialNumber(DocumentTypeEnum.出库单据);
return "PDOUT" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
}
}
public int GetSerialNumber(DocumentTypeEnum documentType)
{
var documentSerialNumber = DbHelp.db.Queryable()
.Where(t => t.DocumentType == documentType)
.First();
if (documentSerialNumber != null)
{
//如果日期不是当天
if (documentSerialNumber.UpdateDate.Date != DateTime.Now.Date)
{
documentSerialNumber.CurrentSerialNumber = 0;
documentSerialNumber.UpdateDate = DateTime.Now;
}
var serialNumber = ++documentSerialNumber.CurrentSerialNumber;
DbHelp.db.Updateable(documentSerialNumber).ExecuteCommand();
return serialNumber;
}
else
{
return 0;
}
}
public async Task JinChuanGenerateMatInfo(JinChuanGenerateMatInfoRequest request)
{
try
{
//第一步 查询
var matBaseInfo = await DbHelp.db.Queryable().Where(t => t.MatCode == request.MatCode).FirstAsync();
if (matBaseInfo != null)
{
return new ResponseBase()
{
Code = 200,
Message = "Success",
Data = matBaseInfo
};
}
else
{
//不存在 则先创建
matBaseInfo = new MatBaseInfo()
{
MatCode = request.MatCode,
MatName = string.Empty,
};
matBaseInfo.Id = DbHelp.db.Insertable(matBaseInfo).ExecuteReturnIdentity();
return new ResponseBase()
{
Code = 200,
Message = "Success",
Data = matBaseInfo
};
}
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = ex.Message,
Data = null
};
}
}
public async Task JinChuanCommitMatInfo(JinChuanCommitMatInfoRequest request)
{
try
{
//
if (request.TotalPan <= 0 && request.TotalPan >= 500)
{
return new ResponseBase()
{
Code = 201,
Message = "操作失败:物料盘数请输入1-500",
Data = null
};
}
//第二步 查询基础物料
var matBaseInfo = await DbHelp.db.Queryable().Where(t => t.Id == request.MatId).FirstAsync();
if (matBaseInfo != null)
{
//存在此物料的情况下 判断当前的数量
if (request.CurrentSerilNumber != matBaseInfo.SerialNumber + 1)
{
return new ResponseBase()
{
Code = 201,
Message = "操作失败:当前物料流水号冲突!请重新扫码!",
Data = null
};
}
//流水号不冲突
else
{
var matInfoList = new List();
try
{
DbHelp.db.BeginTran();
for (int i = 0; i < request.TotalPan; i++)
{
//保存matBaseInfo
matBaseInfo.SerialNumber++;
//保存条码信息
var matInfo = new MatInfo()
{
MatSn = request.CurrentMatSn[i],
MatCode = matBaseInfo.MatCode,
MatName = matBaseInfo.MatName,
MatBatch = request.MatBatch,
MatSpec = matBaseInfo.MatSpec,
MatUnit = matBaseInfo.MatUnit,
MatSupplier = matBaseInfo.MatSupplier,
MatCustomer = matBaseInfo.MatCustomer,
MatQty = request.MatQty,
ModifyUser = request.UserName
};
matInfo.Id = DbHelp.db.Insertable(matInfo).ExecuteReturnIdentity();
matInfoList.Add(matInfo);
}
//await DbHelp.db.Insertable(matInfoList).ExecuteCommandAsync();
await DbHelp.db.Updateable(matBaseInfo).ExecuteCommandAsync();
DbHelp.db.CommitTran();
}
catch (Exception ex)
{
DbHelp.db.RollbackTran();
return new ResponseBase> ()
{
Code = 300,
Message = $"失败:{ex.Message}",
Data = matInfoList
};
}
return new ResponseBase>()
{
Code = 200,
Message = "Success",
Data = matInfoList
};
}
}
else
{
return new ResponseBase()
{
Code = 201,
Message = "操作失败:不存在此物料,请重试!",
Data = null
};
}
}
catch (Exception ex)
{
return new ResponseBase()
{
Code = 300,
Message = ex.Message,
Data = null
};
}
}
}
}