using CommonUtil; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using DbAccess; using System.Data; using CommonUtil; using CommonUtil.Web; using System.Collections; using System.Collections.Generic; using Operater.DTO.Tk; using Operater.DAL; using Operater.DbModel; using NPOI.SS.UserModel; using Snowflake.Core; using SqlSugar; using System; using System.Linq.Expressions; using Newtonsoft.Json; using System.Net.Http.Headers; using System.Net.Http; using System.Security.Policy; using System.Threading.Tasks; using System.IO; using System.Net; using DkSdkCore.Response; using System.Drawing.Imaging; using System.Drawing; using QRCoder; using NPOI.SS.Formula.Functions; using CommonUtil.Security; using CommonUtil.Top; using CommonUtil.Db; using System.Text; namespace Api.Operater.Controllers { [Route(TopConstants.API_ROUTE)] public class TkUserinfoController : BaseController { /// /// 获取微信openid /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(string))] public IActionResult GetWxOpenid([FromBody] GetOpenidRequest request) { //获取access_token string access_token =string.Empty; MySqlHelper dbmain=new MySqlHelper(); DataTable dt = dbmain.ExecuteDataTable("select fx_wx_token from appset"); if (dt != null && dt.Rows.Count > 0) { access_token = dt.Rows[0]["fx_wx_token"].ToString(); string url = $"https://api.weixin.qq.com/wxa/getpluginopenpid?access_token={access_token}"; WebUtil util = new WebUtil(); Dictionary dic = new Dictionary(); dic.Add("code", request.code); var result = Newtonsoft.Json.JsonConvert.DeserializeObject(PostJson(url, dic)); if (result.errcode != "0") { return Error(result.errmsg); } return Success(result.openpid); } else { return Error("获取access_token失败"); } } /// /// 获取微信手机号 /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(string))] public IActionResult GetWxUserPhone([FromBody] GetOpenidRequest request) { //获取access_token string access_token = string.Empty; MySqlHelper dbmain = new MySqlHelper(); DataTable dt = dbmain.ExecuteDataTable("select fx_wx_token from appset"); if (dt != null && dt.Rows.Count > 0) { access_token = dt.Rows[0]["fx_wx_token"].ToString(); string url = $"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}"; WebUtil util = new WebUtil(); Dictionary dic = new Dictionary(); dic.Add("code", request.code); var result = Newtonsoft.Json.JsonConvert.DeserializeObject(PostJson(url, dic)); if (result.errcode != "0") { return Error(result.errmsg); } return Success(result.phone_info.phoneNumber); } else { return Error("获取access_token失败"); } } /// /// 注册会员 /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(TkUserinfo))] public IActionResult AddTkUserinfo([FromBody]AddUserinfoRequest request) { long parentid = 0; //检测是否有邀请码 if (!string.IsNullOrEmpty(request.Invite_code)) { //邀请码不为空,则绑定父级 //根据邀请码查询父级ID var whereexpress= Expressionable.Create() .And(t => t.Invitecode == request.Invite_code) .ToExpression(); var parentuser=new TkUserinfoDAL().GetSingle(whereexpress); if (parentuser != null && parentuser.Id > 0) { parentid=parentuser.Id; } } //根据手机号验证该会员是否存在 var whereexpress1 = Expressionable.Create() .And(t => t.mobile == request.mobile) .ToExpression(); var userinfo = new TkUserinfoDAL().GetSingle(whereexpress1); if (userinfo != null && userinfo.Id > 0) { return Error("该手机号已注册"); } //生成会员ID var worker = new IdWorker(1, 1); long memberid=worker.NextId(); //生成邀请码 string invitecode =SecurityUtil.createInvitecode(memberid); //验证邀请码是否重复 while (true) { var whereexpress2 = Expressionable.Create() .And(t => t.Invitecode == invitecode) .ToExpression(); var userinfo2 = new TkUserinfoDAL().GetSingle(whereexpress2); if (userinfo2 != null && userinfo2.Id > 0) { //重复重新生成邀请码 invitecode = SecurityUtil.createInvitecode(memberid); } else { break; } } TkUserinfo adduserinfo = new TkUserinfo() { Id =memberid, mobile= request.mobile, openid= request.openid, unionid= request.unionid, grade= 1, parentid=parentid, createtime=DateTime.Now, lastvisittime=DateTime.Now, is_black=0, balance=0, Invitecode= invitecode }; //添加会员 var result = new TkUserinfoDAL().Insert(adduserinfo); if (result) { return Success(adduserinfo); } else { return Error("注册失败!"); } } /// /// 查询会员信息 /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(TkUserinfo))] public IActionResult GetTkUserinfo([FromBody]GetUserinfoRequest request) { //根据手机号验证该会员是否存在 var whereexpress1 = Expressionable.Create() .And(t => t.mobile == request.mobile).Or(t=>t.openid==request.openid) .ToExpression(); var userinfo = new TkUserinfoDAL().GetSingle(whereexpress1); if (userinfo != null && userinfo.Id > 0) { return Success(userinfo); } else { return Error("未查到会员信息"); } } /// /// 修改会员信息 /// [HttpPost] [ProducesDefaultResponseType(typeof(bool))] public IActionResult EdiTkUserinfo([FromBody] EdiUserinfoRequest request) { //根据手机号验证该会员是否存在 var whereexpress1 = Expressionable.Create() .And(t => t.openid == request.openid) .ToExpression(); var userinfo = new TkUserinfoDAL().GetSingle(whereexpress1); if (userinfo != null && userinfo.Id > 0) { if (request.mobile.IsNullOrEmpty()) { userinfo.mobile = request.mobile; } userinfo.lastvisittime = DateTime.Now; var result = new TkUserinfoDAL().Update(userinfo, u => new {u.mobile,u.lastvisittime },u=>u.Id==userinfo.Id); return Success(result); } else { return Error("未查到会员信息"); } } /// /// 获取团队成员 /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(GetTeamUserInfoResponse))] public IActionResult GetTeamUserInfo([FromBody]GetTeamUserInfoRequest request) { //查询团队成员的团队成员 var whereexpress1 = Expressionable.Create() .And(t => t.parentid == request.Id) .ToExpression(); List childids= new List(); var userinfo = new TkUserinfoDAL().ListGet(whereexpress1); List teamuserlist = new List(); foreach (var item in userinfo) { TeamUserInfo team = new TeamUserInfo(); team.Id = item.Id; team.mobile=item.mobile; childids.Add(item.Id); teamuserlist.Add(team); } if (teamuserlist.Count > 0) { //查询团队成员的团队成员 var whereexpress2 = Expressionable.Create() .And(t => childids.Contains(t.parentid.Value)) .ToExpression(); var userinfo2 = new TkUserinfoDAL().ListGet(whereexpress2); foreach (var item in userinfo2) { TeamUserInfo team = new TeamUserInfo(); team.Id = item.Id; team.mobile = item.mobile; teamuserlist.Add(team); } return Success(teamuserlist); } GetTeamUserInfoResponse response = new GetTeamUserInfoResponse(); response.Id = request.Id; response.children= teamuserlist; return Success(response); } /// /// 分页获取账单明细并返回支出、收入总金额 /// /// /// [HttpPost] [ProducesDefaultResponseType(typeof(GetTkBillRecordResponse))] public IActionResult GetBillList([FromBody] GetTkBillRecordRequest request) { //分页按时间查询账单明细 var whereexpress = Expressionable.Create() .And(t => t.memberid == request.Id) .AndIF(!request.stime.IsNull() && request.stime > DateTime.Parse("1900-01-01 00:00:00"), t=>t.createtime>=request.stime) .AndIF(!request.etime.IsNull() && request.etime > DateTime.Parse("1900-01-01 00:00:00"), t=> t.createtime <= request.etime) .AndIF(request.stype > 0, t => t.stype == request.stype) .ToExpression(); int totalcount = 0; var billlist = new BillRecordDAL().ListPageGet(whereexpress, t=>t.createtime, DbEnum.OrderType.Desc,request.PageNo,request.PageSize,ref totalcount); GetTkBillRecordResponse getTkBillRecord = new GetTkBillRecordResponse(); if (billlist.Count > 0) { getTkBillRecord.billRecords = billlist; //查询收入总金额 var whereexpress1 = Expressionable.Create() .And(t => t.memberid == request.Id) .AndIF(!request.stime.IsNull() && request.stime > DateTime.Parse("1900-01-01 00:00:00"), t => t.createtime >= request.stime) .AndIF(!request.etime.IsNull() && request.etime > DateTime.Parse("1900-01-01 00:00:00"), t => t.createtime <= request.etime) .And(t => t.stype == 0||t.stype==1) .ToExpression(); decimal incomeamount=new BillRecordDAL().Sum(whereexpress1,t => t.amount).ToDecimal(); getTkBillRecord.incomeamount = incomeamount; //查询收入总金额 var whereexpress2 = Expressionable.Create() .And(t => t.memberid == request.Id) .AndIF(!request.stime.IsNull() && request.stime > DateTime.Parse("1900-01-01 00:00:00"), t => t.createtime >= request.stime) .AndIF(!request.etime.IsNull() && request.etime > DateTime.Parse("1900-01-01 00:00:00"), t => t.createtime <= request.etime) .And(t => t.stype == 2) .ToExpression(); var payamount = new BillRecordDAL().Sum(whereexpress2, t => t.amount).ToDecimal(); getTkBillRecord.expenditure = payamount; } return Success(getTkBillRecord); } /// /// 生成海报二维码 /// /// /// [HttpPost] public IActionResult CreateQrCode([FromBody] CreateQrCodeRequest request) { //获取access_token string access_token = string.Empty; MySqlHelper dbmain = new MySqlHelper(); DataTable dt = dbmain.ExecuteDataTable("select fx_wx_token from appset"); if (dt != null && dt.Rows.Count > 0) { access_token = dt.Rows[0]["fx_wx_token"].ToString(); string url = $"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={access_token}"; WebUtil util = new WebUtil(); Dictionary dic = new Dictionary(); dic.Add("scene", $"invite_code={request.invite_code}"); // var result = Newtonsoft.Json.JsonConvert.DeserializeObject(PostJson(url, dic)); var result = Post4Download(url, dic); //if (result.errcode != "0") //{ // return Error(result.errmsg); //} byte[] imagebytes =result.Item3; Bitmap qrCodeImage = new Bitmap(new MemoryStream(imagebytes)); int x = 430; int y = 1513; int width = 361; int height = 365; string posterPath = Path.Combine("", @"D:\poster.png"); // 替换为你的实际海报的绝对路径 // 在海报中绘制二维码 using (var posterImage = new Bitmap(posterPath)) using (var graphics = Graphics.FromImage(posterImage)) { // 将二维码绘制在指定区域 RectangleF qrCodeArea = new RectangleF(x, y, width, height); graphics.DrawImage(qrCodeImage, qrCodeArea); // 将绘制后的海报保存为内存流 using (var memoryStream = new MemoryStream()) { posterImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png); // 将内存流转换为字节数组 byte[] imageBytes = memoryStream.ToArray(); // 返回图像给前端 return File(imageBytes, "image/png"); } } } else { return Error("获取access_token失败"); } } /// /// PostJson请求 /// /// /// /// public static string PostJson(string url, object postObj) { var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; var postData = Newtonsoft.Json.JsonConvert.SerializeObject(postObj); using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { streamWriter.Write(postData); streamWriter.Flush(); streamWriter.Close(); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); return result; } } public static Tuple Post4Download(string postUrl, object dataObj) { try { var json = JsonConvert.SerializeObject(dataObj, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }); var byteArray = Encoding.UTF8.GetBytes(json); var request = (HttpWebRequest)WebRequest.Create(postUrl); request.Method = "POST"; request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version11; request.Timeout = -1; request.ReadWriteTimeout = -1; request.ContentType = "application/json;charset=utf-8"; request.ContentLength = byteArray.Length; request.ServicePoint.Expect100Continue = false; using (var stream = request.GetRequestStream()) { stream.Write(byteArray, 0, byteArray.Length); stream.Flush(); } //接收返回信息 var message = ""; byte[] buf = null; using (var response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode == HttpStatusCode.OK) { buf = new byte[response.ContentLength]; var responseStream = response.GetResponseStream(); if (responseStream != null) { var offset = 0; do { var count = responseStream.Read(buf, offset, buf.Length - offset); offset += count; } while (offset < buf.Length); } else { message = "fail, responseStream is null."; } } else { message = $"fail, response.StatusCode is {response.StatusCode}."; } } request.Abort(); return new Tuple(!message.StartsWith("fail, "), message, buf); } catch (Exception ex) { return new Tuple(false, $"fail, {ex.Message}", null); } } } }