Commit 43195e67 authored by liudong1993's avatar liudong1993

教师奖金

parent 562bfaeb
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common
{
/// <summary>
/// 加密帮助类
/// </summary>
public class EncryptionHelper
{
#region 默认密钥定义
/// <summary>
/// 默认加密密钥
/// </summary>
public const string DefaultDESKey = @"12345678";
/// <summary>
/// 默认加密向量
/// </summary>
public const string DefaultDESIV = @"1234567812345678";
/// <summary>
/// 默认加密密钥
/// </summary>
public const string Default3DESKey = @"123456781234567812345678";
/// <summary>
/// 默认加密向量
/// </summary>
public const string Default3DESIV = @"1234567812345678";
/// <summary>
/// 获取密钥
/// </summary>
public const string DefaultAESKey = @"12345678123456781234567812345678";
/// <summary>
/// 获取向量
/// </summary>
public const string DefaultAESIV = @"1234567812345678";
/// <summary>
/// 默认加密密钥
/// </summary>
public const string DefaultRC2Key = @"1234567812345678";
/// <summary>
/// 默认加密向量
/// </summary>
public const string DefaultRC2IV = @"1234567812345678";
/// <summary>
/// 默认的RSA公钥
/// </summary>
public const string DefaultRSAPublicKey = @"<RSAKeyValue>xxx</RSAKeyValue>";
/// <summary>
/// 默认的RSA密钥
/// </summary>
public const string DefaultRSAPrivateKey = @"<RSAKeyValue>ccc</RSAKeyValue>";
#endregion
#region 对称加密算法
#region 3DES对称加密算法
/// <summary>
/// 使用指定的128字节的密钥对8字节数组进行3Des加密
/// </summary>
/// <param name="plainStr"></param>
/// <param name="key">密钥长度,可以为128(16字节),或是192(24字节)</param>
/// <param name="iv">加密向量长度64位以上(8个字节以上)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>已加密的字符串</returns>
public static string TripleDESEncrypt(string plainStr, string key = Default3DESKey, string iv = Default3DESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
string encrypt = null;
var tdsc = new TripleDESCryptoServiceProvider();
try
{
//加密模式,偏移
tdsc.Mode = mode;
tdsc.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, tdsc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
if (isBase64Code)
encrypt = Convert.ToBase64String(mStream.ToArray());
else
ToString(mStream.ToArray());
}
}
}
catch { }
tdsc.Clear();
return encrypt;
}
/// <summary>
/// 使用指定的128字节的密钥对8字节数组进行3Des解密
/// </summary>
/// <param name="encryptStr"></param>
/// <param name="key">密钥长度,可以为128(16字节),或是192(24字节)</param>
/// <param name="iv">加密向量长度64位以上(8个字节以上)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>已解密的字符串</returns>
public static string TripleDESDecrypt(string encryptStr, string key = Default3DESKey, string iv = Default3DESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray;
if (isBase64Code)
byteArray = Convert.FromBase64String(encryptStr);
else
byteArray = ToBytes(encryptStr);
string decrypt = null;
var tdsc = new TripleDESCryptoServiceProvider();
try
{
tdsc.Mode = mode;
tdsc.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, tdsc.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
tdsc.Clear();
return decrypt;
}
#endregion
#region DES对称加密算法
/// <summary>
/// DES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <param name="key">加密密钥长度64位(8字节)</param>
/// <param name="iv">加密向量长度64位以上(8个字节以上)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public static string DESEncrypt(string plainStr, string key = DefaultDESKey, string iv = DefaultDESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
string encrypt = null;
var des = new DESCryptoServiceProvider();
try
{
des.Mode = mode;
des.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
if (isBase64Code)
encrypt = Convert.ToBase64String(mStream.ToArray());
else
ToString(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return encrypt;
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <param name="key">加密密钥长度64位(8字节)</param>
/// <param name="iv">加密向量长度64位以上(8个字节以上)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public static string DESDecrypt(string encryptStr, string key = DefaultDESKey, string iv = DefaultDESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray;
if (isBase64Code)
byteArray = Convert.FromBase64String(encryptStr);
else
byteArray = ToBytes(encryptStr);
string decrypt = null;
var des = new DESCryptoServiceProvider();
try
{
des.Mode = mode;
des.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return decrypt;
}
#endregion
#region AES加密算法
/// <summary>
/// AES 加密
/// </summary>
/// <param name="str">明文(待加密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public static string AesEncrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str">明文(待解密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public static string AesDecrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public static string AESEncrypt(string plainStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
var encrypts = AESEncrypt(byteArray, key, iv, mode, padding);
if (isBase64Code)
return Convert.ToBase64String(encrypts);
else
return ToString(encrypts);
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainbytes">明文字节数组</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns></returns>
public static byte[] AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray = plainbytes;
byte[] encrypt = null;
var aes = Rijndael.Create();
try
{
aes.Padding = padding;
aes.Mode = mode;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
}
encrypt = mStream.ToArray();
}
}
catch
{
}
aes.Clear();
return encrypt;
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainbytes">明文字节数组</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public static string AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
var encrypts = AESEncrypt(plainbytes, key, iv, mode, padding);
if (isBase64Code)
return Convert.ToBase64String(encrypts);
else
return ToString(encrypts);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public static string AESDecrypt(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray;
if (isBase64Code)
byteArray = Convert.FromBase64String(encryptStr);
else
byteArray = ToBytes(encryptStr);
string decrypt = null;
var aes = Rijndael.Create();
try
{
aes.Mode = mode;
aes.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
aes.Clear();
return decrypt;
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public static byte[] AESDecryptToBytes(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray;
if (isBase64Code)
byteArray = Convert.FromBase64String(encryptStr);
else
byteArray = ToBytes(encryptStr);
byte[] decrypt = null;
var aes = Rijndael.Create();
try
{
aes.Mode = mode;
aes.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
}
decrypt = mStream.ToArray();
}
}
catch { }
aes.Clear();
return decrypt;
}
#endregion
#region RC2加密算法
/// <summary>
/// RC2加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>
/// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public static string RC2Encrypt(string plainStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
string encrypt = null;
var rc2 = new RC2CryptoServiceProvider();
try
{
rc2.Padding = padding;
rc2.Mode = mode;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, rc2.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
if (isBase64Code)
encrypt = Convert.ToBase64String(mStream.ToArray());
else
encrypt = ToString(mStream.ToArray());
}
}
}
catch { }
rc2.Clear();
return encrypt;
}
/// <summary>
/// RC2解密
/// </summary>
/// <param name="encryptStr">明文字符串</param>
/// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>
/// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public static string RC2Decrypt(string encryptStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
byte[] bKey = Encoding.UTF8.GetBytes(key);
byte[] bIV = Encoding.UTF8.GetBytes(iv);
byte[] byteArray;
if (isBase64Code)
byteArray = Convert.FromBase64String(encryptStr);
else
byteArray = ToBytes(encryptStr);
string decrypt = null;
var rc2 = new RC2CryptoServiceProvider();
try
{
rc2.Mode = mode;
rc2.Padding = padding;
using (var mStream = new MemoryStream())
{
using (var cStream = new CryptoStream(mStream, rc2.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
rc2.Clear();
return decrypt;
}
#endregion
#endregion
#region 哈稀算法
#region 获取哈稀散列值
/// <summary>
/// 使用md5计算散列
/// </summary>
/// <param name="source">要用MD5算散列的字节数据</param>
/// <returns>经过MD5算散列后的数据</returns>
public static byte[] Hash(byte[] source)
{
if ((source == null) || (source.Length == 0)) throw new ArgumentException("source is not valid");
var m = MD5.Create();
return m.ComputeHash(source);
}
/// <summary>
/// 对传入的明文密码进行Hash加密,密码不能为中文
/// </summary>
/// <param name="oriPassword">需要加密的明文密码</param>
/// <returns>经过Hash加密的密码</returns>
public static string HashPassword(string oriPassword)
{
if (string.IsNullOrEmpty(oriPassword))
throw new ArgumentException("oriPassword is valid");
var acii = new ASCIIEncoding();
var hashedBytes = Hash(acii.GetBytes(oriPassword));
return ToString(hashedBytes);
}
/// <summary>
/// 计算MD5
/// </summary>
/// <param name="data">要算MD5的字符串</param>
/// <param name="isBase64Code">是否是Base64编码</param>
/// <returns>MD5字符串</returns>
public static string HashMD5(string data, bool isBase64Code = false)
{
if (string.IsNullOrEmpty(data)) return "";
var md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(data);
bytes = md5.ComputeHash(bytes);
md5.Clear();
if (isBase64Code)
return Convert.ToBase64String(bytes);
else
return ToString(bytes);
}
/// <summary>
/// 生成16位的MD5散列值
/// </summary>
/// <param name="data">要算MD5的字符串</param>
/// <returns></returns>
public static string HashMD516(string data)
{
var md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(data);
return ToString(md5.ComputeHash(bytes)).Substring(8, 16);
}
/// <summary>
/// 对字符串进行SHA1散列
/// </summary>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HashSHA1(string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
/// <summary>
/// SHA256加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public static string HashSHA256(string data, bool isBase64 = false)
{
SHA256 s256 = new SHA256CryptoServiceProvider();
byte[] byte1 = Encoding.UTF8.GetBytes(data);
byte1 = s256.ComputeHash(byte1);
s256.Clear();
if (isBase64)
return Convert.ToBase64String(byte1);
else
return ToString(byte1);
}
/// <summary>
/// SHA384加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public static string HashSHA384(string data, bool isBase64 = false)
{
SHA384 s384 = new SHA384CryptoServiceProvider();
byte[] byte1 = Encoding.UTF8.GetBytes(data);
byte1 = s384.ComputeHash(byte1);
s384.Clear();
if (isBase64)
return Convert.ToBase64String(byte1);
else
return ToString(byte1);
}
/// <summary>
/// SHA512加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public static string HashSHA512(string data, bool isBase64 = false)
{
SHA512 s512 = new SHA512CryptoServiceProvider();
byte[] byte1 = Encoding.Default.GetBytes(data);
byte1 = s512.ComputeHash(byte1);
s512.Clear();
if (isBase64)
return Convert.ToBase64String(byte1);
else
return ToString(byte1);
}
#endregion
#region 带混淆字符串的散列
/// <summary>
/// 对字符串进行HmacMD5散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HmacMD5(string key, string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
var bkey = Encoding.UTF8.GetBytes(key);
var hmacSha1 = new HMACMD5(bkey);
StrRes = hmacSha1.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
/// <summary>
/// 对字符串进行HmacSHA1散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HmacSHA1(string key, string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
var bkey = Encoding.UTF8.GetBytes(key);
HMACSHA1 hmacSha1 = new HMACSHA1(bkey);
StrRes = hmacSha1.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
/// <summary>
/// 对字符串进行HmacSHA256散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HmacSHA256(string key, string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
var bkey = Encoding.UTF8.GetBytes(key);
var hmacSha1 = new HMACSHA256(bkey);
StrRes = hmacSha1.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
/// <summary>
/// 对字符串进行HmacSHA384散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HmacSHA384(string key, string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
var bkey = Encoding.UTF8.GetBytes(key);
var hmacSha1 = new HMACSHA384(bkey);
StrRes = hmacSha1.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
/// <summary>
/// 对字符串进行HmacSHA512散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public static string HmacSHA512(string key, string data, bool isBase64 = false)
{
var StrRes = Encoding.UTF8.GetBytes(data);
var bkey = Encoding.UTF8.GetBytes(key);
var hmacSha1 = new HMACSHA512(bkey);
StrRes = hmacSha1.ComputeHash(StrRes);
if (isBase64)
return Convert.ToBase64String(StrRes);
else
return ToString(StrRes);
}
#endregion
#endregion
#region 非对称加密算法
/// <summary>
/// RSA加密
/// </summary>
/// <param name="plaintData">明文</param>
/// <param name="publicKey">RSA公钥</param>
/// <param name="isBase64">输出数据是否用Base64编码</param>
/// <returns></returns>
public static string RSAEncrypt(string plaintData, string publicKey = DefaultRSAPublicKey, bool isBase64 = false)
{
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false);
if (isBase64)
return Convert.ToBase64String(cipherbytes);
else
return ToString(cipherbytes);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">密文</param>
/// <param name="privateKey">RSA私钥</param>
/// <param name="isBase64">密文数据是否用Base64编码</param>
/// <returns></returns>
public static string RSADecrypt(string encryptData, string privateKey = DefaultRSAPublicKey, bool isBase64 = false)
{
byte[] bData;
if (isBase64)
bData = Convert.FromBase64String(encryptData);
else
bData = ToBytes(encryptData);
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);
var cipherbytes = rsa.Decrypt(bData, false);
return Encoding.UTF8.GetString(cipherbytes);
}
/// <summary>
/// RSA加密
/// </summary>
/// <param name="plaintData">明文</param>
/// <param name="publicKey">RSA公钥</param>
/// <param name="isBase64">输出数据是否用Base64编码</param>
/// <returns></returns>
public static string RSAEncrypt(string plaintData, RSAParameters publicKey, bool isBase64 = false)
{
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(publicKey);
var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false);
if (isBase64)
return Convert.ToBase64String(cipherbytes);
else
return ToString(cipherbytes);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">密文</param>
/// <param name="privateKey">RSA私钥</param>
/// <param name="isBase64">密文数据是否用Base64编码</param>
/// <returns></returns>
public static string RSADecrypt(string encryptData, RSAParameters privateKey, bool isBase64 = false)
{
byte[] bData;
if (isBase64)
bData = Convert.FromBase64String(encryptData);
else
bData = ToBytes(encryptData);
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(privateKey);
var cipherbytes = rsa.Decrypt(bData, false);
return Encoding.UTF8.GetString(cipherbytes);
}
#endregion
/// <summary>
/// 转换字符流成字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private static string ToString(byte[] bytes)
{
var sb = new StringBuilder(64);
foreach (byte iByte in bytes) sb.AppendFormat("{0:x2}", iByte);
return sb.ToString();
}
/// <summary>
/// 转换成Byte数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] ToBytes(string hexString)
{
if (hexString == null) return null;
var data = new byte[hexString.Length / 2];
int h, l;
for (var i = 0; i < data.Length; i++)
{
h = (hexString[2 * i] > 57 ? hexString[2 * i] - 'A' + 10 : hexString[2 * i] - '0') << 4 & 0x000000F0;
l = (hexString[2 * i + 1] > 57 ? hexString[2 * i + 1] - 'A' + 10 : hexString[2 * i + 1] - '0') & 0x0000000F;
data[i] = (byte)(h | l);
}
return data;
}
/// <summary>
/// 解析手机号码
/// </summary>
/// <param name="encryptedDataStr"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string AES_decrypt(string encryptedDataStr, string key, string iv)
{
RijndaelManaged rijalg = new RijndaelManaged();
//-----------------
//设置 cipher 格式 AES-128-CBC
rijalg.KeySize = 128;
rijalg.Padding = PaddingMode.PKCS7;
rijalg.Mode = CipherMode.CBC;
rijalg.Key = Convert.FromBase64String(key);
rijalg.IV = Convert.FromBase64String(iv);
byte[] encryptedData = Convert.FromBase64String(encryptedDataStr);
//解密
ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
string result;
using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
result = srDecrypt.ReadToEnd();
}
}
}
return result;
}
}
}
\ No newline at end of file
...@@ -35,7 +35,7 @@ namespace Edu.Model.Entity.Course ...@@ -35,7 +35,7 @@ namespace Edu.Model.Entity.Course
/// <summary> /// <summary>
/// 财务单据id /// 财务单据id
/// </summary> /// </summary>
public int FinanceId { get; set; } public string FinanceId { get; set; }
/// <summary> /// <summary>
/// 状态 枚举 1待确认 2已确认 3取消 4生成中 /// 状态 枚举 1待确认 2已确认 3取消 4生成中
......
...@@ -16,5 +16,14 @@ namespace Edu.Model.ViewModel.Course ...@@ -16,5 +16,14 @@ namespace Edu.Model.ViewModel.Course
///【查询使用】 ///【查询使用】
/// </summary> /// </summary>
public string StartDate { get; set; } public string StartDate { get; set; }
/// <summary>
/// ids
/// </summary>
public string Q_ClassIds { get; set; }
/// <summary>
/// 签到统计
/// </summary>
public int CheckNum { get; set; }
} }
} }
...@@ -33,6 +33,16 @@ namespace Edu.Model.ViewModel.Course ...@@ -33,6 +33,16 @@ namespace Edu.Model.ViewModel.Course
/// </summary> /// </summary>
public string TeacherName { get; set; } public string TeacherName { get; set; }
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 班级类型
/// </summary>
public int ClassType { get; set; }
/// <summary> /// <summary>
/// 老师头像 /// 老师头像
/// </summary> /// </summary>
...@@ -47,5 +57,17 @@ namespace Edu.Model.ViewModel.Course ...@@ -47,5 +57,17 @@ namespace Edu.Model.ViewModel.Course
/// 班级对应的老师id /// 班级对应的老师id
/// </summary> /// </summary>
public int Teacher_Id { get; set; } public int Teacher_Id { get; set; }
/// <summary>
/// 教师ids
/// </summary>
public string Q_TeacherIds { get; set; }
/// <summary>
/// 上课开始时间
/// </summary>
public string StartTime { get; set; }
/// <summary>
/// 上课结束时间
/// </summary>
public string EndTime { get; set; }
} }
} }
...@@ -10,5 +10,9 @@ namespace Edu.Model.ViewModel.Course ...@@ -10,5 +10,9 @@ namespace Edu.Model.ViewModel.Course
/// </summary> /// </summary>
public class RB_Class_Type_ViewModel : RB_Class_Type public class RB_Class_Type_ViewModel : RB_Class_Type
{ {
/// <summary>
/// ids
/// </summary>
public string Q_CTypeIds { get; set; }
} }
} }
...@@ -17,5 +17,13 @@ namespace Edu.Model.ViewModel.Course ...@@ -17,5 +17,13 @@ namespace Edu.Model.ViewModel.Course
/// 教师名称 /// 教师名称
/// </summary> /// </summary>
public string TeacherName { get; set; } public string TeacherName { get; set; }
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 代课课时
/// </summary>
public int DCourseHour { get; set; }
} }
} }
\ No newline at end of file
using Edu.Cache.User; using Edu.Cache.User;
using Edu.Common;
using Edu.Common.API; using Edu.Common.API;
using Edu.Common.Enum; using Edu.Common.Enum;
using Edu.Common.Enum.Course; using Edu.Common.Enum.Course;
using Edu.Common.Plugin; using Edu.Common.Plugin;
using Edu.Model.CacheModel; using Edu.Model.CacheModel;
using Edu.Model.ViewModel.Course; using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.Finance;
using Edu.Model.ViewModel.Log; using Edu.Model.ViewModel.Log;
using Edu.Model.ViewModel.User; using Edu.Model.ViewModel.User;
using Edu.Repository.Course; using Edu.Repository.Course;
using Edu.Repository.Finance;
using Edu.Repository.Log; using Edu.Repository.Log;
using Edu.Repository.User; using Edu.Repository.User;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
...@@ -50,6 +54,34 @@ namespace Edu.Module.Course ...@@ -50,6 +54,34 @@ namespace Edu.Module.Course
/// 教师 /// 教师
/// </summary> /// </summary>
private readonly RB_TeacherRepository teacherRepository = new RB_TeacherRepository(); private readonly RB_TeacherRepository teacherRepository = new RB_TeacherRepository();
/// <summary>
/// 上课计划
/// </summary>
private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository();
/// <summary>
/// 上课时间
/// </summary>
private readonly RB_Class_TimeRepository class_TimeRepository = new RB_Class_TimeRepository();
/// <summary>
/// 班级基础配置
/// </summary>
private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();
/// <summary>
/// 班级类型
/// </summary>
private readonly RB_Class_TypeRepository class_TypeRepository = new RB_Class_TypeRepository();
/// <summary>
/// 签到
/// </summary>
private readonly RB_Class_CheckRepository class_CheckRepository = new RB_Class_CheckRepository();
/// <summary>
/// 班级
/// </summary>
private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
/// <summary>
/// 财务账户
/// </summary>
private readonly RB_ClientBankAccountRepository clientBankAccountRepository = new RB_ClientBankAccountRepository();
#region 教务配置 #region 教务配置
...@@ -305,6 +337,346 @@ namespace Edu.Module.Course ...@@ -305,6 +337,346 @@ namespace Edu.Module.Course
return list; return list;
} }
/// <summary>
/// 获取教师奖励明细列表
/// </summary>
/// <param name="dmodel"></param>
/// <returns></returns>
public List<RB_Teaching_BonusDetail_ViewModel> GetTeachingBonusDetailList(RB_Teaching_BonusDetail_ViewModel dmodel)
{
var list = teaching_BonusDetailRepository.GetTeachingBonusDetailList(dmodel);
return list;
}
/// <summary>
/// 获取教师奖励统计
/// </summary>
/// <param name="dmodel"></param>
/// <returns></returns>
public List<RB_Teaching_BonusDetail_ViewModel> GetTeachingBonusStatistics(RB_Teaching_BonusDetail_ViewModel dmodel)
{
var list = teaching_BonusDetailRepository.GetTeachingBonusStatistics(dmodel);
return list;
}
/// <summary>
/// 设置教师降临id
/// </summary>
/// <param name="bonusId"></param>
/// <param name="type"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public bool SetTeachingBonusState(int bonusId, int type, UserInfo userInfo)
{
var model = teaching_BonusRepository.GetEntity(bonusId);
if (model == null) { return false; }
string LogContent = "";
Dictionary<string, object> keyValues = new Dictionary<string, object>() {
{ nameof(RB_Teaching_Bonus_ViewModel.UpdateBy),userInfo.Id},
{ nameof(RB_Teaching_Bonus_ViewModel.UpdateTime),DateTime.Now}
};
if (type == 1)
{
LogContent = "教务奖励确认";
if (model.State != BonusStateEnum.Wait) {
return false;
}
keyValues.Add(nameof(RB_Teaching_Bonus_ViewModel.State), BonusStateEnum.Confirmed);
}
else if (type == 2)
{
LogContent = "教务奖励取消";
if (model.State != BonusStateEnum.Wait || model.State != BonusStateEnum.Confirmed)
{
return false;
}
keyValues.Add(nameof(RB_Teaching_Bonus_ViewModel.State), BonusStateEnum.Cancel);
}
else { return false; }
List<WhereHelper> wheres = new List<WhereHelper>() {
new WhereHelper(){
FiledName=nameof(RB_Teaching_Bonus_ViewModel.Id),
FiledValue=bonusId,
OperatorEnum=OperatorEnum.Equal
}
};
bool flag = teaching_BonusRepository.Update(keyValues, wheres);
if (flag) {
//记录日志
changeLogRepository.Insert(new Model.Entity.Log.RB_User_ChangeLog()
{
Id = 0,
Type = 1,
CreateBy = userInfo.Id,
CreateTime = DateTime.Now,
Group_Id = userInfo.Group_Id,
LogContent = LogContent,
School_Id = userInfo.School_Id,
SourceId = 0
});
}
return flag;
}
/// <summary>
/// 新增教师奖励
/// </summary>
/// <param name="dmodel"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public string SetTeachingBonusAdd(RB_Teaching_Bonus_ViewModel dmodel, UserInfo userInfo)
{
//验证当月教师是否已存在奖励
var tlist = teaching_BonusRepository.GetList(new RB_Teaching_Bonus_ViewModel() { Group_Id = userInfo.Group_Id, Month = Convert.ToDateTime(dmodel.Month).ToString("yyyyMM") });
if (tlist.Any()) {
string[] teacherArr = dmodel.TeacherIds.Split(',');
foreach (var item in tlist) {
foreach (var qitem in teacherArr) {
if (("," + item.TeacherIds + ",").Contains("," + qitem + ","))
{
return "教师" + UserReidsCache.GetUserLoginInfo(qitem).AccountName + "【" + qitem + "】" + "已存在当月奖励";
}
}
}
}
//基础配置
var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = userInfo.Group_Id });
if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return "未配置课时费基础设置"; }
#region 首先创建个主表数据
dmodel.State = BonusStateEnum.Create;
int bonusId = teaching_BonusRepository.Insert(dmodel);
#endregion
//查询当月 老师对应所有的课程
string StartTime = dmodel.Month + "-01";
string EndTime = Convert.ToDateTime(dmodel.Month + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
var plist = class_PlanRepository.GetClassPlanList_V2(new RB_Class_Plan_ViewModel() { Group_Id = userInfo.Group_Id, Q_TeacherIds = dmodel.TeacherIds, StartTime = StartTime, EndTime = EndTime });
//查询所有课程的上课时间
List<RB_Class_Time_ViewModel> timeList = new List<RB_Class_Time_ViewModel>();
List<RB_Class_Type_ViewModel> typeList = new List<RB_Class_Type_ViewModel>();
List<RB_Class_Check_ViewModel> checkList = new List<RB_Class_Check_ViewModel>();
//List<RB_Teacher_ViewModel> teacherList = new List<RB_Teacher_ViewModel>();
if (plist.Any()) {
string pids = string.Join(",", plist.Select(x => x.ClassPlanId));
timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { Group_Id = userInfo.Group_Id, QClassPlanIds = pids });
string classTypeIds = string.Join(",", plist.Select(x => x.ClassType).Distinct());
typeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = userInfo.Group_Id, Q_CTypeIds = classTypeIds });
//查询签到数据
string classIds = string.Join(",", plist.Select(x => x.ClassId).Distinct());
checkList = class_CheckRepository.GetClassCheckStatistics(new RB_Class_Check_ViewModel() { Group_Id = userInfo.Group_Id, Q_ClassIds = classIds, StartDate = StartTime, EndDate = EndTime });
//查询教师列表
//string teacherIds = string.Join(",", plist.Select(x => x.TeacherId).Distinct());
//teacherList = teacherRepository.GetTeacherListRepository(new RB_Teacher_ViewModel() { QTIds = teacherIds });
}
var trans = teaching_BonusDetailRepository.DbTransaction;
try
{
foreach (var item in plist)
{
//查询课时
var ctimelist = timeList.Where(x => x.ClassPlanId == item.ClassPlanId).ToList();
int minute = 0;
string nowTime = DateTime.Now.ToString("yyyy-MM-dd");
foreach (var qitem in ctimelist)
{
var ts = Convert.ToDateTime(nowTime + " " + qitem.EndTime) - Convert.ToDateTime(nowTime + " " + qitem.StartTime);
minute += ts.Minutes;
}
int ksNum = minute / configModel.BasicMinutes; // 未达到一课时时间 算不算一课时
//查询课单价
var typeModel = typeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();
//var teacherModel = teacherList.Where(x => x.TId == item.TeacherId).FirstOrDefault();
decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0);
//签到人数
var checkModel = checkList.Where(x => x.ClassId == item.ClassId && x.ClassDate == item.ClassDate).FirstOrDefault();
teaching_BonusDetailRepository.Insert(new Model.Entity.Course.RB_Teaching_BonusDetail()
{
BonusId = bonusId,
CheckInNum = checkModel?.CheckNum ?? 0,
ClassId = item.ClassId,
CourseHour = ksNum,
CreateBy = dmodel.CreateBy,
CreateTime = DateTime.Now,
Date = item.ClassDate,
Group_Id = dmodel.Group_Id,
Id = 0,
Money = ksNum * unitPrice,
School_Id = dmodel.School_Id,
Status = 0,
TeacherId = item.TeacherId,
Type = item.TeacherId == item.Teacher_Id ? 1 : 2,
UnitPrice = unitPrice,
UpdateBy = dmodel.UpdateBy,
UpdateTime = DateTime.Now
}, trans);
}
#region 更新状态为待确认
Dictionary<string, object> keyValues = new Dictionary<string, object>() {
{ nameof(RB_Teaching_Bonus_ViewModel.State), BonusStateEnum.Wait}
};
List<WhereHelper> wheres = new List<WhereHelper>() {
new WhereHelper(){
FiledName=nameof(RB_Teaching_Bonus_ViewModel.Id),
FiledValue=bonusId,
OperatorEnum=OperatorEnum.Equal
}
};
bool flag = teaching_BonusRepository.Update(keyValues, wheres, trans);
#endregion
if (flag) {
//记录日志
changeLogRepository.Insert(new Model.Entity.Log.RB_User_ChangeLog()
{
Id = 0,
Type = 1,
CreateBy = userInfo.Id,
CreateTime = DateTime.Now,
Group_Id = userInfo.Group_Id,
LogContent = "生成教师奖励【" + dmodel.Month + "】",
School_Id = userInfo.School_Id,
SourceId = 0
});
}
teaching_BonusDetailRepository.DBSession.Commit();
return "";
}
catch (Exception ex)
{
LogHelper.Write(ex, "SetTeachingBonusAdd");
teaching_BonusDetailRepository.DBSession.Rollback();
return "出错了,请联系管理员";
}
}
/// <summary>
/// 生成财务单据
/// </summary>
/// <param name="bonusId"></param>
/// <param name="userInfo"></param>
/// <returns></returns>
public string SetTeachingBonusFinance(int bonusId, int IsPublic, int CurrencyId, UserInfo userInfo)
{
var tmodel = teaching_BonusRepository.GetEntity(bonusId);
if (tmodel == null) { return "教师奖励不存在"; }
var list = teaching_BonusDetailRepository.GetTeachingBonusStatistics(new RB_Teaching_BonusDetail_ViewModel() { Group_Id = userInfo.Group_Id, BonusId = bonusId });
string msg = "";
//查询出所有需要发提成的人
List<int> EmpList = list.Select(x => x.TeacherId).Distinct().ToList();
//查询所有的账户信息 不存在的需要提示
var banklist = clientBankAccountRepository.GetList(new RB_ClientBankAccount_Extend() { RB_Group_Id = userInfo.Group_Id, Type = Common.Enum.Finance.ClientTypeEnum.Employee, ObjIdStr = string.Join(",", EmpList) });
foreach (var item in EmpList)
{
if (!banklist.Where(x => x.ObjID == item).Any())
{
msg += (UserReidsCache.GetUserLoginInfo(item)?.AccountName ?? "") + "未查询到员工银行账户信息;";
}
}
if (msg != "")
{
return msg + "请核实后再试!";
}
string Frids = "";
foreach (var item in EmpList)
{
var tlist = list.Where(x => x.TeacherId == item).ToList();
var teacherModel = teacherRepository.GetEntity(item);
#region 新增财务单据
//银行账户
var clientModel = banklist.Where(x => x.ObjID == item).FirstOrDefault();
var detailList = new List<object> { };
decimal TotalMoney = 0;
foreach (var qitem in tlist)
{
detailList.Add(new
{
CostTypeId = Config.ReadConfigKey("BonusCostTypeId"),
Number = (qitem.CourseHour + qitem.DCourseHour),
OriginalMoney = qitem.UnitPrice,
qitem.UnitPrice,
Remark = "带班" + qitem.CourseHour + "课时,代课" + qitem.DCourseHour + "课程"
});
TotalMoney += qitem.Money;
}
string Remark = tmodel.Month + "月," + teacherModel.TeacherName + "教师奖励";
var financeObj = new
{
CreateBy = userInfo.Id,
IsPublic,
ClientType = (int)Common.Enum.Finance.ClientTypeEnum.Employee,
ClientID = clientModel.ID,
CurrencyId,
WBMoney = TotalMoney,
PayDate = DateTime.Now.ToString("yyyy-MM-dd"),
RB_Branch_Id = teacherModel.School_Id,
TemplateId = Config.ReadConfigKey("TeachingBonusTemplete"),
OrderSource = 17,
OtherType = 26,
ReFinanceId = bonusId,
Remark,
detailList,
RB_Depart_Id = teacherModel.Dept_Id
};
string sign = EncryptionHelper.AesEncrypt(JsonHelper.Serialize(financeObj), Config.ReadConfigKey("FinanceKey"));
var resultInfo = new
{
msg = sign
};
string apiResult = HttpHelper.HttpPost(Config.ReadConfigKey("PaymentFinanceApi"), JsonHelper.Serialize(resultInfo), "");
JObject parmsJob = JObject.Parse(apiResult);
string resultCode = parmsJob.GetStringValue("resultCode");
int frid = parmsJob.GetInt("data", 0);
if (resultCode == "1" && frid > 0)
{
Frids += frid + ",";
}
else
{
string message = parmsJob.GetStringValue("message");
LogHelper.Write("SetTeachingBonusFinance:" + message);
msg += (teacherModel.TeacherName) + "创建财务单据失败;";
}
#endregion
}
if (Frids != "")
{
Dictionary<string, object> keyValues = new Dictionary<string, object>() {
{ nameof(RB_Teaching_Bonus_ViewModel.FinanceId),Frids[0..^1]}
};
List<WhereHelper> wheres = new List<WhereHelper>() {
new WhereHelper(){
FiledName=nameof(RB_Teaching_Bonus_ViewModel),
FiledValue=bonusId,
OperatorEnum=OperatorEnum.Equal
}
};
bool flag = teaching_BonusRepository.Update(keyValues, wheres);
if (flag)
{
//记录日志
changeLogRepository.Insert(new Model.Entity.Log.RB_User_ChangeLog()
{
Id = 0,
Type = 1,
CreateBy = userInfo.Id,
CreateTime = DateTime.Now,
Group_Id = userInfo.Group_Id,
LogContent = "生成教师奖励财务单据【" + tmodel.Id + "】",
School_Id = userInfo.School_Id,
SourceId = 0
});
}
}
return msg;
}
#endregion #endregion
} }
} }
...@@ -33,6 +33,10 @@ namespace Edu.Repository.Course ...@@ -33,6 +33,10 @@ namespace Edu.Repository.Course
{ {
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId);
} }
if (!string.IsNullOrEmpty(query.Q_ClassIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
}
if (!string.IsNullOrWhiteSpace(query.StartDate)) if (!string.IsNullOrWhiteSpace(query.StartDate))
{ {
builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.CreateTime), query.StartDate); builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.CreateTime), query.StartDate);
...@@ -45,5 +49,47 @@ namespace Edu.Repository.Course ...@@ -45,5 +49,47 @@ namespace Edu.Repository.Course
return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList();
} }
/// <summary>
/// 获取教室列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Check_ViewModel> GetClassCheckStatistics(RB_Class_Check_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@" SELECT A.ClassId,A.ClassDate,COUNT(0) AS CheckNum FROM RB_Class_Check AS A WHERE 1=1 AND `Status` =0 and CheckStatus =0 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id);
}
if (query.ClassId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId);
}
if (!string.IsNullOrEmpty(query.Q_ClassIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds);
}
if (!string.IsNullOrWhiteSpace(query.StartDate))
{
builder.AppendFormat(" AND A.{0} >='{1}' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate);
}
if (!string.IsNullOrWhiteSpace(query.EndDate))
{
builder.AppendFormat(" AND A.{0} <='{1} 23:59:59' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate);
}
}
builder.AppendFormat(" GROUP BY A.ClassId,A.ClassDate ");
return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList();
}
} }
} }
...@@ -122,6 +122,53 @@ WHERE c.ClassStyle =2 AND p.`Status`=0 and p.ClassId in({classIds}) GROUP BY p. ...@@ -122,6 +122,53 @@ WHERE c.ClassStyle =2 AND p.`Status`=0 and p.ClassId in({classIds}) GROUP BY p.
return list1; return list1;
} }
/// <summary>
/// 获取上课计划
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Class_Plan_ViewModel> GetClassPlanList_V2(RB_Class_Plan_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(@" SELECT a.*,c.Teacher_Id,c.ClassName,c.ClassType,T.TeacherName from rb_class_plan as a
left join rb_class c on a.ClassId = c.ClassId
LEFT JOIN rb_teacher AS T ON a.TeacherId=T.TId
where a.`Status`=0 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.Group_Id), query.Group_Id);
}
if (query.School_Id > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.School_Id), query.School_Id);
}
if (query.ClassId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.ClassId), query.ClassId);
}
if (query.TeacherId > 0)
{
builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Plan_ViewModel.TeacherId), query.TeacherId);
}
if (!string.IsNullOrEmpty(query.Q_TeacherIds))
{
builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Plan_ViewModel.TeacherId), query.Q_TeacherIds);
}
if (!string.IsNullOrEmpty(query.StartTime))
{
builder.AppendFormat(" AND A.{0} >='{1}' ", nameof(RB_Class_Plan_ViewModel.ClassDate), query.StartTime);
}
if (!string.IsNullOrEmpty(query.EndTime))
{
builder.AppendFormat(" AND A.{0} <='{1} 23:59:59' ", nameof(RB_Class_Plan_ViewModel.ClassDate), query.EndTime);
}
}
return Get<RB_Class_Plan_ViewModel>(builder.ToString()).ToList();
}
/// <summary> /// <summary>
......
...@@ -57,6 +57,10 @@ WHERE 1=1 ...@@ -57,6 +57,10 @@ WHERE 1=1
{ {
builder.AppendFormat(" AND {0}={1} ", nameof(RB_Class_Type_ViewModel.Group_Id), query.Group_Id); builder.AppendFormat(" AND {0}={1} ", nameof(RB_Class_Type_ViewModel.Group_Id), query.Group_Id);
} }
if (!string.IsNullOrEmpty(query.Q_CTypeIds))
{
builder.AppendFormat(" AND {0} in({1}) ", nameof(RB_Class_Type_ViewModel.CTypeId), query.Q_CTypeIds);
}
} }
return Get<RB_Class_Type_ViewModel>(builder.ToString()).ToList(); return Get<RB_Class_Type_ViewModel>(builder.ToString()).ToList();
} }
......
using Edu.Common.Enum; using Edu.Common.Enum;
using Edu.Model.Entity.Course; using Edu.Model.Entity.Course;
using Edu.Model.ViewModel.Course; using Edu.Model.ViewModel.Course;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
...@@ -99,5 +100,101 @@ namespace Edu.Repository.Course ...@@ -99,5 +100,101 @@ namespace Edu.Repository.Course
string sql = $@" select * from RB_Teaching_BonusDetail where {where} order by Id desc"; string sql = $@" select * from RB_Teaching_BonusDetail where {where} order by Id desc";
return GetPage<RB_Teaching_BonusDetail_ViewModel>(pageIndex, pageSize, out count, sql).ToList(); return GetPage<RB_Teaching_BonusDetail_ViewModel>(pageIndex, pageSize, out count, sql).ToList();
} }
/// <summary>
/// 获取列表
/// </summary>
/// <param name="demodel"></param>
/// <returns></returns>
public List<RB_Teaching_BonusDetail_ViewModel> GetTeachingBonusDetailList(RB_Teaching_BonusDetail_ViewModel demodel)
{
string where = $@" 1=1 and b.Status=0";
if (demodel.Group_Id > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.Group_Id)} ={demodel.Group_Id}";
}
if (demodel.School_Id > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.School_Id)} ={demodel.School_Id}";
}
if (demodel.BonusId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.BonusId)} ={demodel.BonusId}";
}
if (!string.IsNullOrEmpty(demodel.BonusIds))
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.BonusId)} in({demodel.BonusIds})";
}
if (demodel.TeacherId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.TeacherId)} ={demodel.TeacherId}";
}
if (demodel.ClassId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.ClassId)} ={demodel.ClassId}";
}
if (demodel.Type > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.Type)} ={demodel.Type}";
}
string sql = $@" select b.*,t.TeacherName,c.ClassName from RB_Teaching_BonusDetail b
left join rb_teacher t on b.TeacherId = t.TId
left join rb_class c on b.ClassId = c.ClassId
where {where} order by b.TeacherId asc,b.Date asc";
return Get<RB_Teaching_BonusDetail_ViewModel>(sql).ToList();
}
/// <summary>
/// 获取统计
/// </summary>
/// <param name="demodel"></param>
/// <returns></returns>
public List<RB_Teaching_BonusDetail_ViewModel> GetTeachingBonusStatistics(RB_Teaching_BonusDetail_ViewModel demodel)
{
string where = $@" 1=1 and b.Status=0";
if (demodel.Group_Id > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.Group_Id)} ={demodel.Group_Id}";
}
if (demodel.School_Id > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.School_Id)} ={demodel.School_Id}";
}
if (demodel.BonusId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.BonusId)} ={demodel.BonusId}";
}
if (!string.IsNullOrEmpty(demodel.BonusIds))
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.BonusId)} in({demodel.BonusIds})";
}
if (demodel.TeacherId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.TeacherId)} ={demodel.TeacherId}";
}
if (demodel.ClassId > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.ClassId)} ={demodel.ClassId}";
}
if (demodel.Type > 0)
{
where += $@" and b.{nameof(RB_Teaching_BonusDetail.Type)} ={demodel.Type}";
}
string sql = $@" select b.TeacherId,t.TeacherName,b.UnitPrice,
SUM(CASE WHEN b.Type =1 THEN b.CourseHour ELSE 0 END) AS CourseHour,
SUM(CASE WHEN b.Type =2 THEN b.CourseHour ELSE 0 END) AS DCourseHour,
SUM(b.Money) AS Money
from RB_Teaching_BonusDetail b
left join rb_teacher t on b.TeacherId = t.TId
where {where}
GROUP BY b.TeacherId,t.TeacherName,b.UnitPrice
";
return Get<RB_Teaching_BonusDetail_ViewModel>(sql).ToList();
}
} }
} }
...@@ -217,6 +217,7 @@ namespace Edu.WebApi.Controllers.Course ...@@ -217,6 +217,7 @@ namespace Edu.WebApi.Controllers.Course
x.Month, x.Month,
x.Money, x.Money,
x.FinanceId, x.FinanceId,
FrIdList = string.IsNullOrEmpty(x.FinanceId) ? new List<string>() : x.FinanceId.Split(',').ToList(),
x.State, x.State,
StateName = x.State.ToName(), StateName = x.State.ToName(),
x.UpdateBy, x.UpdateBy,
...@@ -233,6 +234,256 @@ namespace Edu.WebApi.Controllers.Course ...@@ -233,6 +234,256 @@ namespace Edu.WebApi.Controllers.Course
return ApiResult.Success("", pageModel); return ApiResult.Success("", pageModel);
} }
/// <summary>
/// 获取教师奖励明细
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetTeachingBonusDetailList()
{
var userInfo = base.UserInfo;
var dmodel = JsonHelper.DeserializeObject<RB_Teaching_BonusDetail_ViewModel>(RequestParm.Msg.ToString());
dmodel.Group_Id = userInfo.Group_Id;
if (dmodel.BonusId <= 0)
{
return ApiResult.ParamIsNull("请传递教师奖励id");
}
var list = teachingRewardsModule.GetTeachingBonusDetailList(dmodel);
var slit = teachingRewardsModule.GetTeachingBonusStatistics(dmodel);
return ApiResult.Success("", new
{
List = list.Select(x => new
{
x.Id,
Date = x.Date.ToString("yyyyMMdd"),
x.TeacherId,
x.TeacherName,
x.ClassId,
x.ClassName,
x.Type,
x.CourseHour,
x.UnitPrice,
x.CheckInNum,
x.Money
}),
Statistics = slit.Select(x => new
{
x.TeacherId,
x.TeacherName,
x.UnitPrice,
x.CourseHour,
x.DCourseHour,
x.Money
})
});
}
/// <summary>
/// 教师奖励明细Excel下载
/// </summary>
[HttpPost]
[Obsolete]
public FileContentResult GetTeachingBonusDetailToExcel()
{
var userInfo = base.UserInfo;
var dmodel = JsonHelper.DeserializeObject<RB_Teaching_BonusDetail_ViewModel>(RequestParm.Msg.ToString());
dmodel.Group_Id = userInfo.Group_Id;
string ExcelName = "教师奖励" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
List<ExcelDataSource> slist = new List<ExcelDataSource>();
if (dmodel.BonusId <= 0)
{
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
ExcelDataSource header = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(30) {
new ExcelColumn(value: "日期") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "老师") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "班级") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "类型") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "课时") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "课单价") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "签到人数") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER },
new ExcelColumn(value: "小计") { CellWidth = 15, HAlignmentEnum = HAlignmentEnum.CENTER, VAlignmentEnum = VAlignmentEnum.CENTER }
}
};
slist.Add(header);
try
{
var list = teachingRewardsModule.GetTeachingBonusDetailList(dmodel);
var slit = teachingRewardsModule.GetTeachingBonusStatistics(dmodel);
#region 组装数据
foreach (var item in list)
{
ExcelDataSource datarow = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(30) {
new ExcelColumn(value: item.Date.ToString("yyyyMMdd")){ },
new ExcelColumn(value: item.TeacherName){ },
new ExcelColumn(value: item.ClassName){ },
new ExcelColumn(value: item.Type==1?"带班":"代课"){ },
new ExcelColumn(value: item.CourseHour.ToString()){ },
new ExcelColumn(value: item.UnitPrice.ToString("#0.00")){ },
new ExcelColumn(value: item.CheckInNum.ToString()){ },
new ExcelColumn(value: item.Money.ToString("#0.00")){ },
}
};
slist.Add(datarow);
}
//统计
ExcelDataSource datarows = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(30) {
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
}
};
slist.Add(datarows);
datarows = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(30) {
new ExcelColumn(value: "老师"){ },
new ExcelColumn(value: "带班课时"){ },
new ExcelColumn(value: "代课课时"){ },
new ExcelColumn(value: "课时单价"){ },
new ExcelColumn(value: "合计"){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
}
};
slist.Add(datarows);
foreach (var item in slit)
{
datarows = new ExcelDataSource()
{
ExcelRows = new List<ExcelColumn>(30) {
new ExcelColumn(value: item.TeacherName){ },
new ExcelColumn(value: item.CourseHour.ToString()){ },
new ExcelColumn(value: item.DCourseHour.ToString()){ },
new ExcelColumn(value: item.UnitPrice.ToString("#0.00")){ },
new ExcelColumn(value: item.Money.ToString("#0.00")){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
new ExcelColumn(value: ""){ },
}
};
slist.Add(datarows);
}
#endregion
var byteData = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData, "application/octet-stream", ExcelName);
}
catch (Exception ex)
{
LogHelper.Write(ex, string.Format("GetTeachingBonusDetailToExcel: {0}", JsonHelper.Serialize(RequestParm)));
var byteData1 = ExcelTempLateHelper.ToExcelExtend(slist);
return File(byteData1, "application/octet-stream", ExcelName);
}
}
/// <summary>
/// 教师奖励状态设置
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetTeachingBonusState()
{
var userInfo = base.UserInfo;
JObject parms = JObject.Parse(RequestParm.Msg.ToString());
int BonusId = parms.GetInt("BonusId", 0);
int Type = parms.GetInt("Type", 0);//类型 1确认 2取消
if (BonusId <= 0)
{
return ApiResult.ParamIsNull("请传递教师奖励id");
}
bool flag = teachingRewardsModule.SetTeachingBonusState(BonusId, Type, userInfo);
if (flag)
{
return ApiResult.Success();
}
else {
return ApiResult.Failed();
}
}
/// <summary>
/// 新增教师奖励
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetTeachingBonusAdd()
{
var userInfo = base.UserInfo;
var dmodel = JsonHelper.DeserializeObject<RB_Teaching_Bonus_ViewModel>(RequestParm.Msg.ToString());
if (string.IsNullOrEmpty(dmodel.Month))
{
return ApiResult.ParamIsNull("请选择月份");
}
if (string.IsNullOrEmpty(dmodel.TeacherIds))
{
return ApiResult.ParamIsNull("请选择老师");
}
dmodel.Month = Convert.ToDateTime(dmodel.Month).ToString("yyyy-MM");
dmodel.Group_Id = userInfo.Group_Id;
dmodel.School_Id = userInfo.School_Id;
dmodel.UpdateBy = userInfo.Id;
dmodel.UpdateTime = DateTime.Now;
dmodel.CreateBy = userInfo.Id;
dmodel.CreateTime = DateTime.Now;
string msg = teachingRewardsModule.SetTeachingBonusAdd(dmodel, userInfo);
if (msg == "")
{
return ApiResult.Success();
}
else {
return ApiResult.Failed(msg);
}
}
/// <summary>
/// 教师奖金制单
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetTeachingBonusFinance()
{
var userInfo = base.UserInfo;
JObject parms = JObject.Parse(RequestParm.Msg.ToString());
int BonusId = parms.GetInt("BonusId", 0);
int IsPublic = parms.GetInt("IsPublic", 0);
int CurrencyId = parms.GetInt("CurrencyId", 0);
if (BonusId <= 0) {
return ApiResult.ParamIsNull();
}
if (CurrencyId <= 0) {
return ApiResult.ParamIsNull();
}
string msg = teachingRewardsModule.SetTeachingBonusFinance(BonusId, IsPublic, CurrencyId, userInfo);
if (msg == "")
{
return ApiResult.Success();
}
else {
return ApiResult.Failed(msg);
}
}
#endregion #endregion
} }
} }
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
"ErpViewFileSiteUrl": "http://imgfile.oytour.com", "ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017", "Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu", "MongoDBName": "Edu",
"FinanceKey": "FinanceMallInsertToERPViitto2020",
"PaymentFinanceApi": "http://192.168.2.16:8083/api/Mall/InsertFinanceBatchForMallOut",
"TeachingBonusTemplete": 134,
"BonusCostTypeId": 540,
"RabbitMqConfig": { "RabbitMqConfig": {
"HostName": "47.96.25.130", "HostName": "47.96.25.130",
"VirtualHost": "/", "VirtualHost": "/",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment