using AllBase;
using AllBase.Extension;
using AllBase.Model.Result;
using AllBase.Model.Result.WXResult;
using NaiBa.Util.Extension;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TemuKJD.BaseForms;
using TemuKJD.Extension;
using Work;
using Work.Api;
using Work.BLL.Tools;
namespace TemuKJD.WXForms.ShopForms
{
///
/// 商户(OEM)提现管理:
/// 上半部分:账户统计(可提现总额 / 历史累计返利 / 历史累计提现) + 申请提现(上传收款二维码图片);
/// 下半部分:已申请的提现记录列表(DataGridView 绑定方式,参考 WXAdminOemWithdrawal)。
/// 接口约定(与后台 user/* 系列一致):
/// user/oem_withdrawal_summary → data: { withdrawable_amount(分), total_rebate(分), total_withdrawn(分) }
/// user/oem_withdrawal_apply → 参数 amount(分) / withdrawal_type / qrcode_base64
/// user/oem_withdrawals → 分页返回提现记录列表
///
public partial class WXShopOemWithdrawalForm : BaseForms.BaseGeneralForm
{
private BindingList dataList = new BindingList();
/// 收款二维码图片(base64)
private string qrCodeBase64 = "";
public WXShopOemWithdrawalForm()
{
InitializeComponent();
InitBindingDataGridView();
this.cmbType.SelectedIndex = 0;
}
#region 提现记录列表(DataGridView 绑定方式)
///
/// 初始化 DataGridView 绑定:列与模型字段绑定(参考 WXAdminOemWithdrawal.InitBindingDataGridView)
///
private void InitBindingDataGridView()
{
this.dgvWithdrawal.AutoGenerateColumns = false;
this.colNo.DataPropertyName = nameof(WXOemWithdrawalInfo.withdrawal_no);
this.colAmount.DataPropertyName = nameof(WXOemWithdrawalInfo.amount);
this.colType.DataPropertyName = nameof(WXOemWithdrawalInfo.withdrawal_type_string);
this.colAccount.DataPropertyName = nameof(WXOemWithdrawalInfo.account_no);
this.colStatus.DataPropertyName = nameof(WXOemWithdrawalInfo.status_string);
this.colApplyTime.DataPropertyName = nameof(WXOemWithdrawalInfo.created_at);
this.colAuditRemark.DataPropertyName = nameof(WXOemWithdrawalInfo.audit_remark);
this.colAuditTime.DataPropertyName = nameof(WXOemWithdrawalInfo.audit_time);
this.colPayTradeNo.DataPropertyName = nameof(WXOemWithdrawalInfo.pay_trade_no);
// 时间列格式化
this.colApplyTime.DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
this.colAuditTime.DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
// 金额列右对齐
this.colAmount.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
// 注册金额格式化事件(分→元)
this.dgvWithdrawal.CellFormatting += DgvWithdrawal_CellFormatting;
this.dgvWithdrawal.DataSource = dataList;
}
private void DgvWithdrawal_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// 金额列:将分转换为元
if (e.ColumnIndex == this.colAmount.Index && e.Value != null && e.Value != DBNull.Value)
{
if (long.TryParse(e.Value.ToString(), out long amountInFen))
{
e.Value = (amountInFen / 100m).ToString("F2");
e.FormattingApplied = true;
}
}
}
#endregion
#region 数据加载
private void WXShopOemWithdrawalForm_VisibleChanged(object sender, EventArgs e)
{
if (this.Visible && first)
{
first = false;
RefreshAll();
}
}
bool first = true;
///
/// 刷新账户统计 + 提现记录
///
private void RefreshAll()
{
LoadSummary();
GetWithdrawals(ucSplitPage1.CurrentPage);
}
///
/// 加载账户统计:可提现总额 / 历史累计返利 / 历史累计提现
///
public void LoadSummary()
{
this.btnRefreshBalance.Enabled = false;
Task.Run(() =>
{
try
{
var url = BaseClass.BuildObjString("user/oem_settle_flows");
var obj = UserLogin.GetSignPostData(new { });
string data = JsonHelper.SerializeObject(obj);
var html = GetHtml.PostUtf8(url, data);
var ret = JsonConvert.DeserializeObject>(html);
Invoke(new Action(() =>
{
if (ret.Code != 200)
{
BaseMsgForm.ShowError("刷新失败:" + ret.Msg);
return;
}
this.lblWithdrawable.Text = (ret.Data.available_balance / 100m).ToString("F2");
this.lblTotalRebate.Text = (ret.Data.total_rebate_amount / 100m).ToString("F2");
this.lblTotalWithdrawn.Text = (ret.Data.total_withdraw_amount / 100m).ToString("F2");
}));
}
finally
{
Invoke(new Action(() => this.btnRefreshBalance.Enabled = true));
}
});
}
///
/// 加载提现记录(分页)
///
public void GetWithdrawals(int page)
{
this.pbLoading.Visible = true;
this.dgvWithdrawal.Rows.Clear();
dataList.Clear();
int pageSize = this.ucSplitPage1.PageSize;
Task.Run(() =>
{
int pageCount;
decimal seconds;
List list = GetOemWithdrawals(out pageCount, out seconds, page, pageSize);
Invoke(new Action(() =>
{
this.ucSplitPage1.TotalPage = pageCount;
list.ForEach(a => dataList.Add(a));
this.pbLoading.Visible = false;
this.statusBar.lblTaskStatus.Text = "提现记录查询完毕";
#if DEBUG
this.statusBar.lblTaskStatus.Text += ",耗时:" + seconds;
#endif
}));
});
}
public List GetOemWithdrawals(out int pageCount, out decimal seconds, int page = 1, int pageSize = 200)
{
List list = new List();
pageCount = 1;
seconds = 0;
var url = BaseClass.BuildObjString("user/oem_withdrawals");
var obj = UserLogin.GetSignPostData(new
{
page = page,
page_size = pageSize
});
string data = JsonHelper.SerializeObject(obj);
var html = GetHtml.PostUtf8(url, data);
var ret = JsonConvert.DeserializeObject>(html);
if (ret.Code != 200)
{
Invoke(new Action(() =>
{
BaseMsgForm.ShowError("提现记录获取失败,请重试!" + ret.Msg);
}));
return list;
}
seconds = BaseRegex.GetDecimalJson(ref html, "seconds");
pageCount = Math.Ceiling(1.0 * ret.Total / pageSize).ParseToInt();
pageCount = Math.Max(pageCount, 1);
return ret.Data;
}
#endregion
#region 事件
/// 刷新可提现总额等账户统计
private void btnRefreshBalance_Click(object sender, EventArgs e)
{
LoadSummary();
}
/// 选择收款二维码图片
private void btnSelectImage_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.Filter = "图片文件 (*.jpeg;*.jpg;*.png;*.bmp)|*.jpeg;*.jpg;*.png;*.bmp|All files (*.*)|*.*";
if (openFileDialog.ShowDialog() != DialogResult.OK)
return;
try
{
using (Image imageSource = Image.FromFile(openFileDialog.FileName))
{
using (MemoryStream memoryStream = new MemoryStream())
{
// 统一转成 jpg 压缩后提交,避免原图过大
Image image = new Bitmap(imageSource);
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
image.Dispose();
byte[] imageBytes = memoryStream.ToArray();
qrCodeBase64 = Convert.ToBase64String(imageBytes);
}
this.pictureBoxQr.Image = new Bitmap(imageSource);
}
}
catch (Exception ex)
{
qrCodeBase64 = "";
this.pictureBoxQr.Image = Properties.Resources.nopic;
BaseMsgForm.ShowError("打开二维码图片失败 " + ex.Message);
}
}
/// 提交提现申请
private void btnSubmit_Click(object sender, EventArgs e)
{
decimal amountYuan = this.numAmount.Value;
if (amountYuan <= 0)
{
BaseMsgForm.ShowError("请输入提现金额!");
return;
}
if (string.IsNullOrEmpty(qrCodeBase64))
{
BaseMsgForm.ShowError("请先上传收款二维码图片!");
return;
}
if (BaseMsgForm.ShowConfirm("确定提交提现申请?提现金额:" + amountYuan.ToString("F2") + " 元", "提示").DialogResult != DialogResult.OK)
return;
this.btnSubmit.Enabled = false;
try
{
// 金额(元) → 分
long amountFen = (long)(amountYuan * 100m);
// 提现方式:1银行卡 2支付宝 3微信 4其他
int withdrawalType = GetWithdrawalType(this.cmbType.Text);
string data = "";
var obj = UserLogin.GetSignPostData(new
{
amount = amountFen,
withdrawal_type = withdrawalType,
account_no = qrCodeBase64,
});
data = JsonHelper.SerializeObject(obj);
//data.Append(UserLogin.GetSignaturex());
//data.Append("&amount=" + amountFen);
//data.Append("&withdrawal_type=" + withdrawalType);
//data.Append("&qrcode_base64=" + GetHtml.UrlEncodeUtf8(qrCodeBase64));
var url = BaseClass.BuildObjString("user/apply_oem_withdrawal");
string html = GetHtml.PostUtf8(url, data.ToString());
var ret = JsonConvert.DeserializeObject(html);
if (ret.Code != 200)
{
BaseMsgForm.ShowError("提现申请提交失败:" + ret.Msg);
return;
}
BaseMsgForm.ShowInfo("提现申请提交成功!");
// 提交成功后:清空输入、刷新统计与记录
this.numAmount.Value = 0;
this.qrCodeBase64 = "";
this.pictureBoxQr.Image = Properties.Resources.nopic;
RefreshAll();
}
catch (Exception ex)
{
BaseMsgForm.ShowError("提现申请提交异常:" + ex.Message);
}
finally
{
this.btnSubmit.Enabled = true;
}
}
///
/// 提现方式名称 → 类型值:1银行卡 2支付宝 3微信 4其他
///
private static int GetWithdrawalType(string typeName)
{
switch (typeName)
{
case "支付宝": return 2;
case "银行卡": return 1;
case "其他": return 4;
default: return 3; // 微信收款
}
}
private void ucSplitPage1_PageChange(object obj)
{
GetWithdrawals(ucSplitPage1.CurrentPage);
}
#endregion
}
class oemflowsStatistics
{
///
/// 当前可提现
///
public long available_balance { get; set; }
///
/// 历史累计返利
///
public long total_rebate_amount { get; set; }
///
/// 历史累计提现
///
public long total_withdraw_amount { get; set; }
}
}