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);
}
}
}
}