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 充值码设置管理 /// /// 添加充值码设置项 /// /// 业务实体 public void RechargeSetAdd(RechargeSet entity) { entity.Rs_CrtTime = DateTime.Now; Gateway.Default.Save(entity); _RechargeCodeBuilds(entity, entity.Rs_Count); } /// /// 修改充值码设置项 /// /// 业务实体 public void RechargeSetSave(RechargeSet entity) { using (DbTrans tran = Gateway.Default.BeginTrans()) { try { Song.Entities.RechargeSet rs = tran.From().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst(); //如果新增了充值码 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().Where(RechargeCode._.Rs_ID == entity.Rs_ID && RechargeCode._.Rc_IsUsed == false).ToArray(rs.Rs_Count - entity.Rs_Count); foreach (RechargeCode r in rcs) tran.Delete(r); } tran.Update(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(entity); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } finally { tran.Close(); } } } /// /// 删除充值码设置项 /// /// 业务实体 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(entity); tran.Delete(RechargeCode._.Rs_ID == entity.Rs_ID); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } finally { tran.Close(); } } } /// /// 删除,按主键ID; /// /// 实体的主键 public void RechargeSetDelete(int identify) { RechargeSet set = RechargeSetSingle(identify); RechargeSetDelete(set); } /// /// 获取单一实体对象,按主键ID; /// /// 实体的主键 /// public RechargeSet RechargeSetSingle(int identify) { return Gateway.Default.From().Where(RechargeSet._.Rs_ID == identify).ToFirst(); } /// /// 获取所有设置项 /// /// 所在机构id /// /// 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().Where(wc).OrderBy(RechargeSet._.Rs_CrtTime.Desc).ToArray(count); } /// /// 所有设置项数量 /// /// 机构id /// 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(wc); } /// /// 分页获取充值码设置项 /// /// /// /// /// /// /// /// 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(wc); return Gateway.Default.From() .Where(wc).OrderBy(RechargeSet._.Rs_CrtTime.Desc).ToArray(size, (index - 1) * size); } #endregion #region 充值码管理 /// /// 添加充值码设置项 /// /// 业务实体 public void RechargeCodeAdd(RechargeCode entity) { entity.Rc_CrtTime = DateTime.Now; Gateway.Default.Save(entity); } /// /// 修改充值码设置项 /// /// 业务实体 public void RechargeCodeSave(RechargeCode entity) { Gateway.Default.Save(entity); } #region 充值码生成 /// /// 生成充值码 /// /// 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(code); } } /// /// 生成单个充值码 /// /// 密钥 /// 随机因子 /// 充值码的长度 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); } /// /// 生成充值卡密码 /// /// 随机因子 /// 密码的长度 /// 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 /// /// 删除充值码设置项 /// /// 业务实体 public void RechargeCodeDelete(RechargeCode entity) { Gateway.Default.Delete(RechargeCode._.Rc_ID == entity.Rc_ID); } /// /// 删除,按主键ID; /// /// 实体的主键 public void RechargeCodeDelete(int identify) { Gateway.Default.Delete(RechargeCode._.Rc_ID == identify); } /// /// 获取单一实体对象,按主键ID; /// /// 实体的主键 /// public RechargeCode RechargeCodeSingle(int identify) { return Gateway.Default.From().Where(RechargeCode._.Rc_ID == identify).ToFirst(); } /// /// 校验充值码是否存在,或过期 /// /// /// 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().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().Where(wc).ToFirst(); if (single == null) throw new Exception("该充值码不存在,或已经过期!"); if (single.Rc_IsUsed) throw new Exception("该充值码已经使用过!"); return single; } /// /// 使用该充值码 /// /// public void CouponUseCode(RechargeCode entity) { //是否被禁用 Song.Entities.RechargeSet set = Gateway.Default.From().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst(); 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().CouponAdd(ca); tran.Save(entity); RechargeSet setEnity = tran.From().Where(RechargeSet._.Rs_ID == entity.Rs_ID).ToFirst(); if (setEnity != null) { setEnity.Rs_UsedCount++; tran.Save(setEnity); } tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } finally { tran.Close(); } } } /// /// 获取所有设置项 /// /// 所在机构id /// 机构id /// 充码设置项的id /// 是否启用 /// 是否已经使用 /// /// 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().Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray(count); } /// /// 所有设置项数量 /// /// 机构id /// 机构id /// 充码设置项的id /// 是否启用 /// 是否已经使用 /// 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(wc); } /// /// 导出Excel格式的充值码信息 /// /// 导出文件的路径(服务器端) /// 机构id /// 充值码设置项的id /// 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().Where(RechargeSet._.Rs_ID == rsid).ToFirst(); 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().Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray(); 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; } /// /// 分页获取充值码设置项 /// /// 机构id /// 充码设置项的id /// 是否启用 /// 是否已经使用 /// /// /// /// 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(wc); return Gateway.Default.From() .Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray(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(wc); return Gateway.Default.From() .Where(wc).OrderBy(RechargeCode._.Rc_CrtTime.Desc).ToArray(size, (index - 1) * size); } #endregion } }