ZhiYeJianKang_PeiXun/Song.ServiceImpls/RechargeCom.cs
2025-02-20 15:41:53 +08:00

518 lines
22 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using WeiSha.Common;
using Song.Entities;
using WeiSha.Data;
using Song.ServiceInterfaces;
using System.Data.Common;
using System.Text.RegularExpressions;
using NPOI.HSSF.UserModel;
using System.Xml;
using NPOI.SS.UserModel;
using System.IO;
namespace Song.ServiceImpls
{
public class RechargeCom : IRecharge
{
#region
/// <summary>
/// 添加充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeSetAdd(RechargeSet entity)
{
entity.Rs_CrtTime = DateTime.Now;
Gateway.Default.Save<RechargeSet>(entity);
_RechargeCodeBuilds(entity, entity.Rs_Count);
}
/// <summary>
/// 修改充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeSetSave(RechargeSet entity)
{
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
Song.Entities.RechargeSet rs = tran.From<RechargeSet>().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst<RechargeSet>();
//如果新增了充值码
if (rs.Rs_Count < entity.Rs_Count) _RechargeCodeBuilds(entity, entity.Rs_Count - rs.Rs_Count);
//如果减少的充值码
if (rs.Rs_Count > entity.Rs_Count)
{
Song.Entities.RechargeCode[] rcs = tran.From<RechargeCode>().Where(RechargeCode._.Rs_ID == entity.Rs_ID && RechargeCode._.Rc_IsUsed == false).ToArray<RechargeCode>(rs.Rs_Count - entity.Rs_Count);
foreach (RechargeCode r in rcs)
tran.Delete<RechargeCode>(r);
}
tran.Update<RechargeCode>(new Field[] { RechargeCode._.Rc_Price, RechargeCode._.Rc_LimitStart, RechargeCode._.Rc_LimitEnd },
new object[] { entity.Rs_Price, entity.Rs_LimitStart, entity.Rs_LimitEnd },
RechargeCode._.Rs_ID == entity.Rs_ID && RechargeCode._.Rc_IsUsed == false);
tran.Save<RechargeSet>(entity);
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 删除充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeSetDelete(RechargeSet entity)
{
int used = RechargeCodeOfCount(entity.Org_ID, entity.Rs_ID, true, true);
if (used > 0) throw new Exception("当前设置项中涉及的充值码已经存在消费记录,不能删除!可以选择禁用。");
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
tran.Delete<RechargeSet>(entity);
tran.Delete<RechargeCode>(RechargeCode._.Rs_ID == entity.Rs_ID);
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 删除按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
public void RechargeSetDelete(int identify)
{
RechargeSet set = RechargeSetSingle(identify);
RechargeSetDelete(set);
}
/// <summary>
/// 获取单一实体对象按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
/// <returns></returns>
public RechargeSet RechargeSetSingle(int identify)
{
return Gateway.Default.From<RechargeSet>().Where(RechargeSet._.Rs_ID == identify).ToFirst<RechargeSet>();
}
/// <summary>
/// 获取所有设置项
/// </summary>
/// <param name="orgid">所在机构id</param>
/// <param name="isUse"></param>
/// <returns></returns>
public RechargeSet[] RechargeSetCount(int orgid, bool? isEnable, int count)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeSet._.Org_ID == orgid;
if (isEnable != null) wc &= RechargeSet._.Rs_IsEnable == isEnable;
return Gateway.Default.From<RechargeSet>().Where(wc).OrderBy(RechargeSet._.Rs_CrtTime.Desc).ToArray<RechargeSet>(count);
}
/// <summary>
/// 所有设置项数量
/// </summary>
/// <param name="orgid">机构id</param>
/// <returns></returns>
public int RechargeSetOfCount(int orgid, bool? isEnable)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeSet._.Org_ID == orgid;
if (isEnable != null) wc &= RechargeSet._.Rs_IsEnable == isEnable;
return Gateway.Default.Count<RechargeSet>(wc);
}
/// <summary>
/// 分页获取充值码设置项
/// </summary>
/// <param name="orgid"></param>
/// <param name="isUse"></param>
/// <param name="searTxt"></param>
/// <param name="size"></param>
/// <param name="index"></param>
/// <param name="countSum"></param>
/// <returns></returns>
public RechargeSet[] RechargeSetPager(int orgid, bool? isEnable, string searTxt, int size, int index, out int countSum)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeSet._.Org_ID == orgid;
if (isEnable != null) wc &= RechargeSet._.Rs_IsEnable == isEnable;
if (!string.IsNullOrWhiteSpace(searTxt))
{
WhereClip like = new WhereClip();
like &= RechargeSet._.Rs_Theme.Like("%" + searTxt + "%");
like |= RechargeSet._.Rs_Intro.Like("%" + searTxt + "%");
wc.And(like);
}
countSum = Gateway.Default.Count<RechargeSet>(wc);
return Gateway.Default.From<RechargeSet>()
.Where(wc).OrderBy(RechargeSet._.Rs_CrtTime.Desc).ToArray<RechargeSet>(size, (index - 1) * size);
}
#endregion
#region
/// <summary>
/// 添加充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeCodeAdd(RechargeCode entity)
{
entity.Rc_CrtTime = DateTime.Now;
Gateway.Default.Save<RechargeCode>(entity);
}
/// <summary>
/// 修改充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeCodeSave(RechargeCode entity)
{
Gateway.Default.Save<RechargeCode>(entity);
}
#region
/// <summary>
/// 生成充值码
/// </summary>
/// <param name="setEntity"></param>
private void _RechargeCodeBuilds(RechargeSet setEntity, int count)
{
for (int i = 0; i < count; i++)
{
Song.Entities.RechargeCode code = new RechargeCode();
//面额
code.Rc_Price = setEntity.Rs_Price;
//是否启用
code.Rc_IsEnable = true;
//创建时间
code.Rc_CrtTime = DateTime.Now;
//类型
code.Rc_Type = 0;
//设置项id
code.Rs_ID = setEntity.Rs_ID;
//机构id
code.Org_ID = setEntity.Org_ID;
//时间效
code.Rc_LimitStart = setEntity.Rs_LimitStart;
code.Rc_LimitEnd = setEntity.Rs_LimitEnd;
//卡值码与其密码
code.Rc_Code = _RechargeCodeBuildCoder(setEntity.Rs_Pw, i, setEntity.Rs_CodeLength);
code.Rc_Pw = _RechargeCodeBuildPw(i, setEntity.Rs_PwLength);
Gateway.Default.Save<RechargeCode>(code);
}
}
/// <summary>
/// 生成单个充值码
/// </summary>
/// <param name="pw">密钥</param>
/// <param name="factor">随机因子</param>
/// <param name="length">充值码的长度</param>
private string _RechargeCodeBuildCoder(string pw, int factor, int length)
{
//充值码基础值(来自时间)
string baseCode = DateTime.Now.ToString("yyMMddhhmmssfff");
System.Random rd = new System.Random(((int)DateTime.Now.Ticks) * factor);
int rdNumber = rd.Next(0, 1000);
baseCode += rdNumber.ToString("000");
//充值码加密值(来自密钥中随机字符)
if (string.IsNullOrWhiteSpace(pw))
pw = WeiSha.Common.Request.UniqueID();
string pwstr = "";
while (pwstr.Length < baseCode.Length)
{
System.Random rdpw = new System.Random(pwstr.Length * factor);
int tm = rd.Next(0, pw.Length - 1);
pwstr += pw.Substring(tm, 1);
}
//基础值与加密值运算
byte[] typeBase = System.Text.Encoding.Default.GetBytes(baseCode);
byte[] typePw = System.Text.Encoding.Default.GetBytes(pwstr);
string str = "";
for (int i = 0; i < typeBase.Length; i++)
{
typeBase[i] ^= typePw[i];
str += typeBase[i].ToString();
}
return str.Substring(str.Length - length);
}
/// <summary>
/// 生成充值卡密码
/// </summary>
/// <param name="factor">随机因子</param>
/// <param name="length">密码的长度</param>
/// <returns></returns>
private string _RechargeCodeBuildPw(int factor, int length)
{
System.Random rd = new System.Random(((int)DateTime.Now.Ticks) * factor);
string lenstr = "9";
while (lenstr.Length < length) lenstr += "9";
int max = Convert.ToInt32(lenstr);
int rdNumber = rd.Next(0, max);
return rdNumber.ToString(lenstr.Replace("9", "0"));
}
#endregion
/// <summary>
/// 删除充值码设置项
/// </summary>
/// <param name="entity">业务实体</param>
public void RechargeCodeDelete(RechargeCode entity)
{
Gateway.Default.Delete<RechargeCode>(RechargeCode._.Rc_ID == entity.Rc_ID);
}
/// <summary>
/// 删除按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
public void RechargeCodeDelete(int identify)
{
Gateway.Default.Delete<RechargeCode>(RechargeCode._.Rc_ID == identify);
}
/// <summary>
/// 获取单一实体对象按主键ID
/// </summary>
/// <param name="identify">实体的主键</param>
/// <returns></returns>
public RechargeCode RechargeCodeSingle(int identify)
{
return Gateway.Default.From<RechargeCode>().Where(RechargeCode._.Rc_ID == identify).ToFirst<RechargeCode>();
}
/// <summary>
/// 校验充值码是否存在,或过期
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public RechargeCode CouponCheckCode(string code)
{
code = Regex.Replace(code, @"[^\d-]", "", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
if (code.IndexOf("-") < 0) throw new Exception("该充值码不正确!");
//取密码与充值码
string pw = code.Substring(code.IndexOf("-") + 1);
code = code.Substring(0, code.IndexOf("-"));
//验证是否正确
WhereClip wc = new WhereClip();
Song.Entities.Organization org = Business.Do<IOrganization>().OrganCurrent();
wc &= RechargeCode._.Org_ID == org.Org_ID;
wc &= RechargeCode._.Rc_Code == code.Trim();
wc &= RechargeCode._.Rc_Pw == pw.Trim();
wc &= RechargeCode._.Rc_LimitStart < DateTime.Now;
wc &= RechargeCode._.Rc_LimitEnd > DateTime.Now;
RechargeCode single = Gateway.Default.From<RechargeCode>().Where(wc).ToFirst<RechargeCode>();
if (single == null) throw new Exception("该充值码不存在,或已经过期!");
if (single.Rc_IsUsed) throw new Exception("该充值码已经使用过!");
return single;
}
/// <summary>
/// 使用该充值码
/// </summary>
/// <param name="entity"></param>
public void CouponUseCode(RechargeCode entity)
{
//是否被禁用
Song.Entities.RechargeSet set = Gateway.Default.From<RechargeSet>().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst<RechargeSet>();
if (set == null || set.Rs_IsEnable == false) throw new Exception("该充值码已经被禁用");
//是否过期
if (!(DateTime.Now > entity.Rc_LimitStart && DateTime.Now < entity.Rc_LimitEnd.Date.AddDays(1)))
{
throw new Exception("该充值码已经过期");
}
//标注已经使用
entity.Rc_IsUsed = true;
entity.Rc_UsedTime = DateTime.Now;
//产生流水
CouponAccount ca = new CouponAccount();
ca.Ca_Value = entity.Rc_Price;
ca.Ac_ID = entity.Ac_ID;
ca.Ca_From = 2;
ca.Rc_Code = entity.Rc_Code + "-" + entity.Rc_Pw;
ca.Ca_Source = "充值码充值";
using (DbTrans tran = Gateway.Default.BeginTrans())
{
try
{
Business.Do<IAccounts>().CouponAdd(ca);
tran.Save<RechargeCode>(entity);
RechargeSet setEnity = tran.From<RechargeSet>().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst<RechargeSet>();
if (setEnity != null)
{
setEnity.Rs_UsedCount++;
tran.Save<RechargeSet>(setEnity);
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
finally
{
tran.Close();
}
}
}
/// <summary>
/// 获取所有设置项
/// </summary>
/// <param name="orgid">所在机构id</param>
/// <param name="orgid">机构id</param>
/// <param name="rsid">充码设置项的id</param>
/// <param name="isEnable">是否启用</param>
/// <param name="isUsed">是否已经使用</param>
/// <param name="isUse"></param>
/// <returns></returns>
public RechargeCode[] RechargeCodeCount(int orgid, int rsid, bool? isEnable, bool? isUsed, int count)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeCode._.Org_ID == orgid;
if (rsid > 0) wc &= RechargeCode._.Rs_ID == rsid;
if (isEnable != null) wc &= RechargeCode._.Rc_IsEnable == isEnable;
if (isUsed != null) wc &= RechargeCode._.Rc_IsUsed == isUsed;
return Gateway.Default.From<RechargeCode>().Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray<RechargeCode>(count);
}
/// <summary>
/// 所有设置项数量
/// </summary>
/// <param name="orgid">机构id</param>
/// <param name="orgid">机构id</param>
/// <param name="rsid">充码设置项的id</param>
/// <param name="isEnable">是否启用</param>
/// <param name="isUsed">是否已经使用</param>
/// <returns></returns>
public int RechargeCodeOfCount(int orgid, int rsid, bool? isEnable, bool? isUsed)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeCode._.Org_ID == orgid;
if (rsid > 0) wc &= RechargeCode._.Rs_ID == rsid;
if (isEnable != null) wc &= RechargeCode._.Rc_IsEnable == isEnable;
if (isUsed != null) wc &= RechargeCode._.Rc_IsUsed == isUsed;
return Gateway.Default.Count<RechargeCode>(wc);
}
/// <summary>
/// 导出Excel格式的充值码信息
/// </summary>
/// <param name="path">导出文件的路径(服务器端)</param>
/// <param name="orgid">机构id</param>
/// <param name="rsid">充值码设置项的id</param>
/// <returns></returns>
public string RechargeCode4Excel(string path, int orgid, int rsid)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
//xml配置文件
XmlDocument xmldoc = new XmlDocument();
string confing = WeiSha.Common.App.Get["ExcelInputConfig"].VirtualPath + "充值码.xml";
xmldoc.Load(WeiSha.Common.Server.MapPath(confing));
XmlNodeList nodes = xmldoc.GetElementsByTagName("item");
//创建工作簿对象
Song.Entities.RechargeSet rs = Gateway.Default.From<RechargeSet>().Where(RechargeSet._.Rs_ID == rsid).ToFirst<RechargeSet>();
ISheet sheet = hssfworkbook.CreateSheet(rs.Rs_Theme);
//sheet.DefaultColumnWidth = 30;
//创建数据行对象
IRow rowHead = sheet.CreateRow(0);
for (int i = 0; i < nodes.Count; i++)
rowHead.CreateCell(i).SetCellValue(nodes[i].Attributes["Column"].Value);
//生成数据行
ICellStyle style_size = hssfworkbook.CreateCellStyle();
style_size.WrapText = true;
WhereClip wc = RechargeCode._.Org_ID == orgid;
if (rsid >= 0) wc.And(RechargeCode._.Rs_ID == rsid);
RechargeCode[] rcodes = Gateway.Default.From<RechargeCode>().Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray<RechargeCode>();
for (int i = 0; i < rcodes.Length; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < nodes.Count; j++)
{
Type type = rcodes[i].GetType();
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(nodes[j].Attributes["Field"].Value); //获取指定名称的属性
object obj = propertyInfo.GetValue(rcodes[i], null);
if (obj != null)
{
string format = nodes[j].Attributes["Format"] != null ? nodes[j].Attributes["Format"].Value : "";
string datatype = nodes[j].Attributes["DataType"] != null ? nodes[j].Attributes["DataType"].Value : "";
string defvalue = nodes[j].Attributes["DefautValue"] != null ? nodes[j].Attributes["DefautValue"].Value : "";
string value = "";
switch (datatype)
{
case "date":
DateTime tm = Convert.ToDateTime(obj);
value = tm > DateTime.Now.AddYears(-100) ? tm.ToString(format) : "";
break;
default:
value = obj.ToString();
break;
}
if (defvalue.Trim() != "")
{
foreach (string s in defvalue.Split('|'))
{
string h = s.Substring(0, s.IndexOf("="));
string f = s.Substring(s.LastIndexOf("=") + 1);
if (value.ToLower() == h.ToLower()) value = f;
}
}
row.CreateCell(j).SetCellValue(value);
}
}
}
FileStream file = new FileStream(path, FileMode.Create);
hssfworkbook.Write(file);
file.Close();
return path;
}
/// <summary>
/// 分页获取充值码设置项
/// </summary>
/// <param name="orgid">机构id</param>
/// <param name="rsid">充码设置项的id</param>
/// <param name="isEnable">是否启用</param>
/// <param name="isUsed">是否已经使用</param>
/// <param name="size"></param>
/// <param name="index"></param>
/// <param name="countSum"></param>
/// <returns></returns>
public RechargeCode[] RechargeCodePager(int orgid, int rsid, bool? isEnable, bool? isUsed, int size, int index, out int countSum)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeCode._.Org_ID == orgid;
if (rsid > 0) wc &= RechargeCode._.Rs_ID == rsid;
if (isEnable != null) wc &= RechargeCode._.Rc_IsEnable == isEnable;
if (isUsed != null) wc &= RechargeCode._.Rc_IsUsed == isUsed;
countSum = Gateway.Default.Count<RechargeCode>(wc);
return Gateway.Default.From<RechargeCode>()
.Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray<RechargeCode>(size, (index - 1) * size);
}
public RechargeCode[] RechargeCodePager(int orgid, int rsid, string code, bool? isEnable, bool? isUsed, int size, int index, out int countSum)
{
WhereClip wc = new WhereClip();
if (orgid > 0) wc &= RechargeCode._.Org_ID == orgid;
if (rsid > 0) wc &= RechargeCode._.Rs_ID == rsid;
if (!string.IsNullOrWhiteSpace(code)) wc &= RechargeCode._.Rc_Code.Like("%" + code + "%");
if (isEnable != null) wc &= RechargeCode._.Rc_IsEnable == isEnable;
if (isUsed != null) wc &= RechargeCode._.Rc_IsUsed == isUsed;
countSum = Gateway.Default.Count<RechargeCode>(wc);
return Gateway.Default.From<RechargeCode>()
.Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray<RechargeCode>(size, (index - 1) * size);
}
#endregion
}
}