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
};
matInfoList.Add(matInfo);
}
DbHelp.db.Insertable(matInfoList).ExecuteCommand();
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 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;
}
}
}
}