using BBWY.Client.APIServices; using BBWY.Client.Extensions; using BBWY.Client.Models; using BBWY.Common.Models; using GalaSoft.MvvmLight.Command; using Microsoft.Win32; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace BBWY.Client.ViewModels { public class ProcurementAuditViewModel : BaseVM, IDenpendency { private GlobalContext globalContext; private AuditFile selectAuditFile; private bool isLoading; private bool isAudited; private bool isShowPayBillPanel; private bool onlyException; private PurchaseOrderService purchaseOrderService; private Department selectedDepartment; private DateTime startDate; private DateTime endDate; private Shop selectResultShop; private bool noMatchPurchaseOrder; private bool noChooseFundType; private string searchResultPurchaseOrder; public Department SelectedDepartment { get => selectedDepartment; set { if (Set(ref selectedDepartment, value)) { foreach (var s in value.ShopList) s.IsSelected = false; } } } public DateTime StartDate { get => startDate; set { Set(ref startDate, value); } } public DateTime EndDate { get => endDate; set { Set(ref endDate, value); } } public IList AuditFileList { get; set; } public IList AuditPayBillList { get; set; } public IList DepartmentList { get; set; } public IList ShowAuditPayBillList { get; set; } public AuditFile SelectAuditFile { get => selectAuditFile; set { if (Set(ref selectAuditFile, value)) SearchLocal(); } } public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } public bool IsAudited { get => isAudited; set { Set(ref isAudited, value); } } public bool IsShowPayBillPanel { get => isShowPayBillPanel; set { Set(ref isShowPayBillPanel, value); } } public bool OnlyException { get => onlyException; set { Set(ref onlyException, value); } } public ICommand AuditCommand { get; set; } public ICommand ClearAuditCommand { get; set; } public ICommand ImportAliPayBillCommand { get; set; } public ICommand Import1688PurchaseOrderCommand { get; set; } public ICommand ImportJDShopOrderCommand { get; set; } public ICommand SearchHistoryCommand { get; set; } public ICommand SearchLocalCommand { get; set; } public Shop SelectResultShop { get => selectResultShop; set { Set(ref selectResultShop, value); } } public bool NoMatchPurchaseOrder { get => noMatchPurchaseOrder; set { Set(ref noMatchPurchaseOrder, value); } } public bool NoChooseFundType { get => noChooseFundType; set { Set(ref noChooseFundType, value); } } public string SearchResultPurchaseOrder { get => searchResultPurchaseOrder; set { Set(ref searchResultPurchaseOrder, value); } } public ProcurementAuditViewModel(PurchaseOrderService purchaseOrderService, GlobalContext globalContext) { this.globalContext = globalContext; AuditFileList = new ObservableCollection(); AuditCommand = new RelayCommand(Audit); ClearAuditCommand = new RelayCommand(ClearAudit); ImportAliPayBillCommand = new RelayCommand(ImportAliPayBill); SearchHistoryCommand = new RelayCommand(SearchHistory); SearchLocalCommand = new RelayCommand(SearchLocal); this.purchaseOrderService = purchaseOrderService; DepartmentList = new ObservableCollection(); AuditFileList = new ObservableCollection(); AuditPayBillList = new List(); ShowAuditPayBillList = new ObservableCollection(); LoadDepartment(); StartDate = DateTime.Now.Date; EndDate = DateTime.Now.Date; } private void LoadDepartment() { foreach (var d in globalContext.User.DepartmentList) DepartmentList.Add(d); SelectedDepartment = DepartmentList[0]; } private void SearchHistory() { if (IsLoading) return; } private void Audit() { if (IsLoading) return; if (AuditPayBillList.Count() == 0 || !SelectedDepartment.ShopList.Any(s => s.IsSelected)) { MessageBox.Show("审核数据不全", "提示"); return; } var waitList = new List() { new ManualResetEvent(false) }; IsLoading = true; var shopList = SelectedDepartment.ShopList.Where(s => s.IsSelected).ToList(); var sDate = StartDate.AddDays(-5); var eDate = EndDate; Task.Factory.StartNew(() => { AuditByPayBill(waitList[0], shopList, sDate, eDate); //AuditByPurchaseOrder(waitList[1]); }).ContinueWith(t => { WaitHandle.WaitAll(waitList.ToArray(), -1); IsLoading = false; IsAudited = true; App.Current.Dispatcher.BeginInvoke((Action)delegate { SelectAuditFile = AuditFileList.FirstOrDefault(f => f.AuditFileType == AuditFileType.账单); }); }); } private void AuditByPayBill(EventWaitHandle ewh, IList shopList, DateTime startDate, DateTime endDate) { try { var auditPurchaseOrderResponse = purchaseOrderService.GetAuditPurchaseOrderList(shopList.Select(s => s.ShopId).ToList(), startDate, endDate); if (!auditPurchaseOrderResponse.Success) throw new Exception($"获取采购单失败,{auditPurchaseOrderResponse.Msg}"); //按日分组的pdd账单集合, key=日期 value=当日账单总额 var pddPayBillDayDictionary = new Dictionary(); foreach (var payBill in AuditPayBillList) { payBill.ErrorMessage = string.Empty; #region 按日累计拼多多账单金额 if (payBill.MerchantOrderNo.StartsWith("XP")) { if (!pddPayBillDayDictionary.TryGetValue(payBill.PayTime.Value.Date, out decimal pddTotalPurchaseAmount)) pddPayBillDayDictionary.Add(payBill.PayTime.Value.Date, 0); pddTotalPurchaseAmount += Math.Abs(payBill.ExpenditureAmount); pddPayBillDayDictionary[payBill.PayTime.Value.Date] = pddTotalPurchaseAmount; } #endregion #region 匹配采购单 var relationPurchaseOrder = auditPurchaseOrderResponse.Data.FirstOrDefault(p => p.PurchaseOrderId == payBill.MerchantOrderNo || p.MerchantOrderId == payBill.MerchantOrderNo); if (relationPurchaseOrder == null) { if (payBill.IncomeAmount > 0 && StartDate.Day == 1) { payBill.AuditCapitalType = AuditCapitalType.上月商品退款; continue; } if (payBill.IsSupportMerchantOrderNo) { //if (payBill.MerchantOrderNo.StartsWith("XP")) // payBill.AuditCapitalType = AuditCapitalType.商品采购; //else payBill.ErrorMessage = "未匹配采购单"; } else payBill.ErrorMessage = "未选资金类型"; continue; } payBill.RelationPurchaseOrderId = relationPurchaseOrder.PurchaseOrderId; payBill.RelationShopOrderId = relationPurchaseOrder.OrderId; payBill.BelongShopId = relationPurchaseOrder.ShopId; payBill.BelongShop = shopList.FirstOrDefault(s => s.ShopId == relationPurchaseOrder.ShopId)?.ShopName; if (payBill.IncomeAmount > 0) payBill.AuditCapitalType = AuditCapitalType.当月商品退款; else payBill.AuditCapitalType = AuditCapitalType.当月商品采购; #endregion } #region 按日比较拼多多账单金额和采购单金额 foreach (var key in pddPayBillDayDictionary) { var purchaseAmount = auditPurchaseOrderResponse.Data.Where(p => p.PurchaseTime.Value.Date == key.Key && p.PurchasePlatform == Platform.拼多多).Sum(p => p.PurchaseAmount); if (key.Value != purchaseAmount) { var currentDayPddPayBillList = AuditPayBillList.Where(p => p.PayTime.Value.Date == key.Key.Date && p.MerchantOrderNo.StartsWith("XP") && string.IsNullOrEmpty(p.RelationPurchaseOrderId)); foreach (var payBill in currentDayPddPayBillList) payBill.ErrorMessage = $"{key.Key:yyyy-MM-dd}账单金额与采购单不匹配"; } } #endregion } catch (Exception ex) { App.Current.Dispatcher.Invoke(() => MessageBox.Show(ex.Message, "账单匹配")); } finally { ewh.Set(); } } private void ClearAudit() { SelectAuditFile = null; AuditFileList.Clear(); AuditPayBillList.Clear(); //AuditPurchaseOrderList.Clear(); //AuditShopOrderList.Clear(); ShowAuditPayBillList.Clear(); //ShowAuditPurchaseOrderList.Clear(); //ShowAuditShopOrderList.Clear(); IsAudited = false; IsShowPayBillPanel = false; //IsShowPurchaseOrderPanel = false; //IsShowShopOrderPanel = false; OnlyException = false; SelectResultShop = null; } private (string ErrorMessage, string FileName, List Lines) ImportAuditFile(AuditFileType auditFileType) { var ofd = new OpenFileDialog() { Filter = "CSV Files (*.csv)|*.csv" }; if (ofd.ShowDialog() != true) return (string.Empty, string.Empty, null); var fileName = ofd.FileName.Substring(ofd.FileName.LastIndexOf("\\") + 1); var filePath = ofd.FileName; if (AuditFileList.Any(f => f.FileName == fileName)) return ("文件已存在", string.Empty, null); try { var lines = File.ReadAllLines(filePath, Encoding.GetEncoding("GB2312")).ToList(); AuditFileList.Add(new AuditFile() { FileName = fileName, AuditFileType = auditFileType }); return (string.Empty, fileName, lines); } catch (Exception ex) { return (ex.Message, string.Empty, null); } } /// /// 导入支付宝账单 /// private void ImportAliPayBill() { var importResult = ImportAuditFile(AuditFileType.账单); if (!string.IsNullOrEmpty(importResult.ErrorMessage)) { MessageBox.Show(importResult.ErrorMessage, "导入支付宝账单"); return; } if (importResult.Lines == null || importResult.Lines.Count == 0) return; //忽略前5行 /* #支付宝账务明细查询 #账号:[20883422054731100156] #起始日期:[2022年04月01日 00:00:00] 终止日期:[2022年05月01日 00:00:00] #-----------------------------------------账务明细列表---------------------------------------- 账务流水号 业务流水号 商户订单号 商品名称 发生时间 对方账号 收入金额(+元) 支出金额(-元) 账户余额(元) 交易渠道 业务类型 备注 */ for (var i = 0; i < 5; i++) importResult.Lines.RemoveAt(0); //忽略后4行 /* #-----------------------------------------账务明细列表结束------------------------------------ #支出合计:681笔,共-39623.27元 #收入合计:85笔,共43889.26元 #导出时间:[2022年05月01日 10:13:45] */ for (var i = 0; i < 4; i++) { importResult.Lines.RemoveAt(importResult.Lines.Count() - 1); } var payBillNo = ""; try { foreach (var line in importResult.Lines) { var array = line.CSVstrToArry(); var sourceMerchantOrderNo = array[2].FormatString(); var incomeAmount = decimal.Parse(array[6].FormatString()); var expenditureAmount = decimal.Parse(array[7].FormatString()); payBillNo = array[0].FormatString(); if (AuditPayBillList.Any(p => p.PayBillNo == payBillNo)) continue; var payBill = new AuditPayBill() { BelongFileName = importResult.FileName, PayBillNo = payBillNo, PayBillType = PayBillType.支付宝, SourceMerchantOrderNo = sourceMerchantOrderNo, ProductName = array[3].FormatString(), PayTime = DateTime.Parse(array[4].FormatString()), OppositeAccount = array[5].FormatString(), ExpenditureAmount = expenditureAmount, IncomeAmount = incomeAmount, Remark = array[11] }; payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo; if (payBill.MerchantOrderNo == null) payBill.MerchantOrderNo = ""; if (payBill.SourceMerchantOrderNo.StartsWith("T50060NP")) { payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo.Substring(8); payBill.IsSupportMerchantOrderNo = true; } if (payBill.SourceMerchantOrderNo.StartsWith("T200P")) { payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo.Substring(5); payBill.IsSupportMerchantOrderNo = true; } if (payBill.SourceMerchantOrderNo.StartsWith("XP")) { payBill.IsSupportMerchantOrderNo = true; } AuditPayBillList.Add(payBill); } } catch (Exception ex) { MessageBox.Show($"问题账单号{payBillNo} {ex.Message}", "导入支付宝账单"); } } /// /// 采购审计文件对象改变事件 /// private void SearchLocal() { if (SelectAuditFile == null) return; if (SelectAuditFile.AuditFileType == AuditFileType.账单) { IsShowPayBillPanel = true; ShowAuditPayBillList.Clear(); var where = AuditPayBillList.Where(b => b.BelongFileName == SelectAuditFile.FileName); if (OnlyException) where = where.Where(b => !string.IsNullOrEmpty(b.ErrorMessage)); if (NoMatchPurchaseOrder) where = where.Where(b => !string.IsNullOrEmpty(b.ErrorMessage) && b.ErrorMessage == "未匹配采购单"); if (NoChooseFundType) where = where.Where(b => !string.IsNullOrEmpty(b.ErrorMessage) && b.ErrorMessage == "未选资金类型"); if (SelectResultShop != null) where = where.Where(b => b.BelongShopId != null && b.BelongShopId.Value == SelectResultShop.ShopId); if (string.IsNullOrEmpty(SearchResultPurchaseOrder)) where = where.Where(b => b.RelationPurchaseOrderId == SearchResultPurchaseOrder); var list = where.ToList(); foreach (var b in list) ShowAuditPayBillList.Add(b); } } } }