From 7d612f4032de9830c5a2ee549d134c2581c6e674 Mon Sep 17 00:00:00 2001
From: shanji <18996038927@163.com>
Date: Fri, 27 May 2022 18:26:08 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E5=AE=A1=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 BBWY.Client/Models/Enums.cs                   |  7 +++
 .../FinancialTerminal/PayBills/AliPayBill.cs  | 15 +++++
 .../FinancialTerminal/PayBills/PayBill.cs     | 61 +++++++++++++++++++
 .../FinancialTerminal/PayBills/WXPayBill.cs   | 10 +++
 .../ProcurementAuditViewModel.cs              | 11 ++++
 BBWY.Client/ViewModels/MainViewModel.cs       |  9 +++
 .../FinancialTerminal/ProcurementAudit.xaml   | 14 +++++
 .../ProcurementAudit.xaml.cs                  | 26 ++++++++
 8 files changed, 153 insertions(+)
 create mode 100644 BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
 create mode 100644 BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs
 create mode 100644 BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
 create mode 100644 BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
 create mode 100644 BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
 create mode 100644 BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml.cs

diff --git a/BBWY.Client/Models/Enums.cs b/BBWY.Client/Models/Enums.cs
index 3790cc9d..ca3fa77a 100644
--- a/BBWY.Client/Models/Enums.cs
+++ b/BBWY.Client/Models/Enums.cs
@@ -99,4 +99,11 @@
         在线采购 = 0,
         关联订单 = 1
     }
+
+    public enum PayBillType
+    {
+        AliPay = 0,
+        WeiXin = 1,
+        BankCard = 2
+    }
 }
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs b/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
new file mode 100644
index 00000000..a3212a8c
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
@@ -0,0 +1,15 @@
+namespace BBWY.Client.Models
+{
+    public class AliPayBill : PayBill
+    {
+        public AliPayBill()
+        {
+            PayBillType = PayBillType.AliPay;
+        }
+
+        public override string GetMerchantOrderNo()
+        {
+            return base.GetMerchantOrderNo();
+        }
+    }
+}
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs b/BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs
new file mode 100644
index 00000000..7d75de9a
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs
@@ -0,0 +1,61 @@
+using System;
+
+namespace BBWY.Client.Models
+{
+    public class PayBill
+    {
+        /// <summary>
+        /// 账单流水号
+        /// </summary>
+        public string PayBillNo { get; set; }
+
+        /// <summary>
+        /// 支付时间
+        /// </summary>
+        public DateTime? PayTime { get; set; }
+
+        /// <summary>
+        /// 账单类型
+        /// </summary>
+        public PayBillType PayBillType { get; set; }
+
+        /// <summary>
+        /// 商家订单号
+        /// </summary>
+        public string MerchantOrderNo { get; set; }
+
+        /// <summary>
+        /// 商品名称
+        /// </summary>
+        public string ProductName { get; set; }
+
+        /// <summary>
+        /// 对方账户
+        /// </summary>
+        public string OppositeAccount { get; set; }
+
+        /// <summary>
+        /// 支出金额
+        /// </summary>
+        public decimal ExpenditureAmount { get; set; }
+
+        /// <summary>
+        /// 归属店铺
+        /// </summary>
+        public string BelongShop { get; set; }
+
+        /// <summary>
+        /// 错误信息
+        /// </summary>
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 提取商家订单号
+        /// </summary>
+        /// <returns></returns>
+        public virtual string GetMerchantOrderNo()
+        {
+            return MerchantOrderNo;
+        }
+    }
+}
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs b/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
new file mode 100644
index 00000000..3050541d
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
@@ -0,0 +1,10 @@
+namespace BBWY.Client.Models
+{
+    public class WXPayBill : PayBill
+    {
+        public WXPayBill()
+        {
+            PayBillType = PayBillType.WeiXin;
+        }
+    }
+}
diff --git a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
new file mode 100644
index 00000000..3bab6155
--- /dev/null
+++ b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BBWY.Client.ViewModels
+{
+    public class ProcurementAuditViewModel : BaseVM
+    {
+
+    }
+}
diff --git a/BBWY.Client/ViewModels/MainViewModel.cs b/BBWY.Client/ViewModels/MainViewModel.cs
index 6042e405..d69f0a91 100644
--- a/BBWY.Client/ViewModels/MainViewModel.cs
+++ b/BBWY.Client/ViewModels/MainViewModel.cs
@@ -110,6 +110,15 @@ namespace BBWY.Client.ViewModels
                         new MenuModel(){ Name="店铺设置",Url="/Views/Setting/ShopSetting.xaml" },
                         new MenuModel(){ Name="团队配置",Url="/Views/Setting/TeamSetting.xaml" }
                     }
+                },
+                new MenuModel()
+                {
+                    Name="财务端",ChildList=new List<MenuModel>()
+                    {
+                         new MenuModel(){ Name="采购审计",Url="/Views/FinancialTerminal/ProcurementAudit.xaml" }
+                         //new MenuModel(){ Name="补单审计",Url="/Views/FinancialTerminal/ShopSetting.xaml" },
+                         //new MenuModel(){ Name="利润表",Url="/Views/FinancialTerminal/ShopSetting.xaml" }
+                    }
                 }
             };
             Task.Factory.StartNew(Login);
diff --git a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
new file mode 100644
index 00000000..98db0710
--- /dev/null
+++ b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
@@ -0,0 +1,14 @@
+<Page x:Class="BBWY.Client.Views.FinancialTerminal.ProcurementAudit"
+      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+      xmlns:local="clr-namespace:BBWY.Client.Views.FinancialTerminal"
+      mc:Ignorable="d" 
+      d:DesignHeight="450" d:DesignWidth="800"
+      Title="ProcurementAudit">
+
+    <Grid>
+        
+    </Grid>
+</Page>
diff --git a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml.cs b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml.cs
new file mode 100644
index 00000000..67eaed14
--- /dev/null
+++ b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace BBWY.Client.Views.FinancialTerminal
+{
+    /// <summary>
+    /// ProcurementAudit.xaml 的交互逻辑
+    /// </summary>
+    public partial class ProcurementAudit : Page
+    {
+        public ProcurementAudit()
+        {
+            InitializeComponent();
+        }
+    }
+}

From 5aaffec7d4bf9d97988cd8ea7c0718ce3bd68259 Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sat, 28 May 2022 16:01:55 +0800
Subject: [PATCH 2/6] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E5=AE=A1=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 BBWY.Client/App.xaml.cs                       |   2 +
 BBWY.Client/BBWY.Client.csproj                |   8 +-
 .../Extensions/ProcurementAuditExtension.cs   |  77 +++++
 BBWY.Client/Models/Enums.cs                   |   7 +
 .../FinancialTerminal/PayBills/AliPayBill.cs  |  15 -
 .../FinancialTerminal/PayBills/WXPayBill.cs   |  10 -
 .../ProcurementAudit/AuditFile.cs             |   9 +
 .../AuditPayBill.cs}                          |  27 +-
 .../ProcurementAudit/AuditPurchaseOrder.cs    |  73 +++++
 .../ProcurementAudit/AuditShopOrder.cs        |  70 +++++
 .../ProcurementAuditViewModel.cs              | 284 +++++++++++++++++-
 BBWY.Client/ViewModels/ViewModelLocator.cs    |   9 +
 .../FinancialTerminal/ProcurementAudit.xaml   | 104 ++++++-
 BBWY.Client/Views/Ware/WareManager.xaml       |   2 +-
 BBWY.Client/Views/Ware/WareStock.xaml         |   2 +-
 .../PlatformSDK/_1688Business.cs              |   4 +-
 16 files changed, 654 insertions(+), 49 deletions(-)
 create mode 100644 BBWY.Client/Extensions/ProcurementAuditExtension.cs
 delete mode 100644 BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
 delete mode 100644 BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
 create mode 100644 BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditFile.cs
 rename BBWY.Client/Models/FinancialTerminal/{PayBills/PayBill.cs => ProcurementAudit/AuditPayBill.cs} (71%)
 create mode 100644 BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPurchaseOrder.cs
 create mode 100644 BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs

diff --git a/BBWY.Client/App.xaml.cs b/BBWY.Client/App.xaml.cs
index 00b3bee1..0949e230 100644
--- a/BBWY.Client/App.xaml.cs
+++ b/BBWY.Client/App.xaml.cs
@@ -10,6 +10,7 @@ using System.IO;
 using System.IO.MemoryMappedFiles;
 using System.Linq;
 using System.Reflection;
+using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
 
@@ -25,6 +26,7 @@ namespace BBWY.Client
 
         protected override void OnStartup(StartupEventArgs e)
         {
+            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
             var gl = new GlobalContext();
             string userToken = string.Empty;
 #if DEBUG
diff --git a/BBWY.Client/BBWY.Client.csproj b/BBWY.Client/BBWY.Client.csproj
index cfa2c1b6..8c701914 100644
--- a/BBWY.Client/BBWY.Client.csproj
+++ b/BBWY.Client/BBWY.Client.csproj
@@ -15,13 +15,6 @@
     <PlatformTarget>x64</PlatformTarget>
   </PropertyGroup>
 
-  <ItemGroup>
-    <Compile Remove="Extensions\**" />
-    <EmbeddedResource Remove="Extensions\**" />
-    <None Remove="Extensions\**" />
-    <Page Remove="Extensions\**" />
-  </ItemGroup>
-
   <ItemGroup>
     <None Remove="BBWYAppSettings.json" />
     <None Remove="Resources\Images\defaultItem.png" />
@@ -45,6 +38,7 @@
     <PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
     <PackageReference Include="NLog" Version="4.7.12" />
+    <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/BBWY.Client/Extensions/ProcurementAuditExtension.cs b/BBWY.Client/Extensions/ProcurementAuditExtension.cs
new file mode 100644
index 00000000..0b28597f
--- /dev/null
+++ b/BBWY.Client/Extensions/ProcurementAuditExtension.cs
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+
+namespace BBWY.Client.Extensions
+{
+    public static class ProcurementAuditExtension
+    {
+        /// <summary>
+        /// 跳过引号中的逗号,进行逗号分隔(字段内容中的逗号不参与分隔)
+        /// </summary>
+        /// <param name="strLine"></param>
+        /// <returns></returns>
+        public static string[] CSVstrToArry(this string splitStr)
+        {
+            var newstr = string.Empty;
+            List<string> sList = new List<string>();
+
+            bool isSplice = false;
+            string[] array = splitStr.Split(new char[] { ',' });
+            foreach (var str in array)
+            {
+                if (!string.IsNullOrEmpty(str) && str.IndexOf('"') > -1)
+                {
+                    var firstchar = str.Substring(0, 1);
+                    var lastchar = string.Empty;
+                    if (str.Length > 0)
+                    {
+                        lastchar = str.Substring(str.Length - 1, 1);
+                    }
+                    if (firstchar.Equals("\"") && !lastchar.Equals("\""))
+                    {
+                        isSplice = true;
+                    }
+                    if (lastchar.Equals("\""))
+                    {
+                        if (!isSplice)
+                            newstr += str;
+                        else
+                            newstr = newstr + "," + str;
+
+                        isSplice = false;
+                    }
+                }
+                else
+                {
+                    if (string.IsNullOrEmpty(newstr))
+                        newstr += str;
+                }
+
+                if (isSplice)
+                {
+                    //添加因拆分时丢失的逗号
+                    if (string.IsNullOrEmpty(newstr))
+                        newstr += str;
+                    else
+                        newstr = newstr + "," + str;
+                }
+                else
+                {
+                    sList.Add(newstr.Replace("\"", "").Trim());//去除字符中的双引号和首尾空格
+                    newstr = string.Empty;
+                }
+            }
+            return sList.ToArray();
+        }
+
+        public static string FormatString(this string str)
+        {
+            //if (str.Contains(","))
+            //    str = str.Replace(",", string.Empty);
+            if (str.Contains("\""))
+                str = str.Replace("\"", string.Empty);
+            if (str.Contains("\t"))
+                str = str.Replace("\t", string.Empty);
+            return str.Trim();
+        }
+    }
+}
diff --git a/BBWY.Client/Models/Enums.cs b/BBWY.Client/Models/Enums.cs
index ca3fa77a..bf867902 100644
--- a/BBWY.Client/Models/Enums.cs
+++ b/BBWY.Client/Models/Enums.cs
@@ -106,4 +106,11 @@
         WeiXin = 1,
         BankCard = 2
     }
+
+    public enum AuditFileType
+    {
+        账单 = 0,
+        采购单 = 1,
+        销售订单 = 2
+    }
 }
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs b/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
deleted file mode 100644
index a3212a8c..00000000
--- a/BBWY.Client/Models/FinancialTerminal/PayBills/AliPayBill.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace BBWY.Client.Models
-{
-    public class AliPayBill : PayBill
-    {
-        public AliPayBill()
-        {
-            PayBillType = PayBillType.AliPay;
-        }
-
-        public override string GetMerchantOrderNo()
-        {
-            return base.GetMerchantOrderNo();
-        }
-    }
-}
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs b/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
deleted file mode 100644
index 3050541d..00000000
--- a/BBWY.Client/Models/FinancialTerminal/PayBills/WXPayBill.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace BBWY.Client.Models
-{
-    public class WXPayBill : PayBill
-    {
-        public WXPayBill()
-        {
-            PayBillType = PayBillType.WeiXin;
-        }
-    }
-}
diff --git a/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditFile.cs b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditFile.cs
new file mode 100644
index 00000000..95f41b76
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditFile.cs
@@ -0,0 +1,9 @@
+namespace BBWY.Client.Models
+{
+    public class AuditFile
+    {
+        public string FileName { get; set; }
+
+        public AuditFileType AuditFileType { get; set; }
+    }
+}
diff --git a/BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPayBill.cs
similarity index 71%
rename from BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs
rename to BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPayBill.cs
index 7d75de9a..4bba9fce 100644
--- a/BBWY.Client/Models/FinancialTerminal/PayBills/PayBill.cs
+++ b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPayBill.cs
@@ -2,7 +2,7 @@
 
 namespace BBWY.Client.Models
 {
-    public class PayBill
+    public class AuditPayBill
     {
         /// <summary>
         /// 账单流水号
@@ -22,6 +22,11 @@ namespace BBWY.Client.Models
         /// <summary>
         /// 商家订单号
         /// </summary>
+        public string SourceMerchantOrderNo { get; set; }
+
+        /// <summary>
+        /// 商家订单号(去掉账单添加的格式)
+        /// </summary>
         public string MerchantOrderNo { get; set; }
 
         /// <summary>
@@ -44,18 +49,22 @@ namespace BBWY.Client.Models
         /// </summary>
         public string BelongShop { get; set; }
 
+        public string BelongFileName { get; set; }
+
         /// <summary>
-        /// 错误信息
+        /// 关联的采购单号
         /// </summary>
-        public string ErrorMessage { get; set; }
+        public string RelationPurchaseOrderId { get; set; }
 
         /// <summary>
-        /// 提取商家订单号
+        /// 关联的店铺订单
         /// </summary>
-        /// <returns></returns>
-        public virtual string GetMerchantOrderNo()
-        {
-            return MerchantOrderNo;
-        }
+        public string RelationShopOrderId { get; set; }
+
+        /// <summary>
+        /// 错误信息
+        /// </summary>
+        public string ErrorMessage { get; set; }
+
     }
 }
diff --git a/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPurchaseOrder.cs b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPurchaseOrder.cs
new file mode 100644
index 00000000..b095f269
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditPurchaseOrder.cs
@@ -0,0 +1,73 @@
+using System;
+
+namespace BBWY.Client.Models
+{
+    public class AuditPurchaseOrder
+    {
+        public string PurchaseOrderId { get; set; }
+
+        /// <summary>
+        /// 采购平台
+        /// </summary>
+        public Platform Platform { get; set; } 
+
+        public DateTime CreateTime { get; set; }
+
+        public DateTime? PayTime { get; set; }
+
+        /// <summary>
+        /// 采购数量
+        /// </summary>
+        public int Quantity { get; set; }
+
+        /// <summary>
+        /// 货款
+        /// </summary>
+        public decimal ProductAmount { get; set; }
+
+        /// <summary>
+        /// 运费
+        /// </summary>
+        public decimal Freight { get; set; }
+
+        /// <summary>
+        /// 实付
+        /// </summary>
+        public decimal PayAmount { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 收货地址
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
+        /// 收货人
+        /// </summary>
+        public string ContactName { get; set; }
+
+        /// <summary>
+        /// 归属店铺
+        /// </summary>
+        public string BelongShop { get; set; }
+
+        public string BelongFileName { get; set; }
+
+        /// <summary>
+        /// 关联账单Id
+        /// </summary>
+        public string RelationPayBillNo { get; set; }
+
+        /// <summary>
+        /// 关联的店铺订单
+        /// </summary>
+        public string RelationShopOrderId { get; set; }
+
+
+        public string ErrorMessage { get; set; }
+    }
+}
diff --git a/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs
new file mode 100644
index 00000000..47698d71
--- /dev/null
+++ b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BBWY.Client.Models
+{
+    public class AuditShopOrder
+    {
+        public string OrderId { get; set; }
+
+        public Platform Platform { get; set; }
+
+        /// <summary>
+        /// 产品名称
+        /// </summary>
+        public string ProductName { get; set; }
+
+        /// <summary>
+        /// 销售数量
+        /// </summary>
+        public int Quantity { get; set; }
+
+        /// <summary>
+        /// 实付
+        /// </summary>
+        public decimal PayAmount { get; set; }
+
+        /// <summary>
+        /// 下单时间
+        /// </summary>
+        public DateTime CreateTime { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 收货地址
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
+        /// 收货人
+        /// </summary>
+        public string ContactName { get; set; }
+
+        /// <summary>
+        /// 关联的采购单号
+        /// </summary>
+        public string RelationPurchaseOrderId { get; set; }
+
+        /// <summary>
+        /// 关联账单Id
+        /// </summary>
+        public string RelationPayBillNo { get; set; }
+
+        /// <summary>
+        /// 归属店铺
+        /// </summary>
+        public string BelongShop { get; set; }
+
+        public string BelongFileName { get; set; }
+
+        /// <summary>
+        /// 错误信息
+        /// </summary>
+        public string ErrorMessage { get; set; }
+    }
+}
diff --git a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
index 3bab6155..6f86e9a0 100644
--- a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
+++ b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
@@ -1,11 +1,291 @@
-using System;
+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.IO;
+using System.Linq;
 using System.Text;
+using System.Windows;
+using System.Windows.Input;
 
 namespace BBWY.Client.ViewModels
 {
-    public class ProcurementAuditViewModel : BaseVM
+    public class ProcurementAuditViewModel : BaseVM, IDenpendency
     {
+        private AuditFile selectAuditFile;
 
+        public IList<AuditFile> AuditFileList { get; set; }
+
+        public IList<AuditPayBill> AuditPayBillList { get; set; }
+
+        public IList<AuditPurchaseOrder> AuditPurchaseOrderList { get; set; }
+
+        public IList<AuditShopOrder> AuditShopOrderList { get; set; }
+
+        public IList<AuditPayBill> ShowAuditPayBillList { get; set; }
+
+        public IList<AuditPurchaseOrder> ShowAuditPurchaseOrderList { get; set; }
+
+        public IList<AuditShopOrder> ShowAuditShopOrderList { get; set; }
+
+        public AuditFile SelectAuditFile { get => selectAuditFile; set { Set(ref selectAuditFile, 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 ProcurementAuditViewModel()
+        {
+            AuditFileList = new ObservableCollection<AuditFile>();
+            AuditCommand = new RelayCommand(Audit);
+            ClearAuditCommand = new RelayCommand(ClearAudit);
+            ImportAliPayBillCommand = new RelayCommand(ImportAliPayBill);
+
+
+            Import1688PurchaseOrderCommand = new RelayCommand(Import1688PurchaseOrder);
+
+
+            ImportJDShopOrderCommand = new RelayCommand(ImportJDShopOrder);
+
+            AuditFileList = new ObservableCollection<AuditFile>();
+            AuditPayBillList = new ObservableCollection<AuditPayBill>();
+            AuditPurchaseOrderList = new ObservableCollection<AuditPurchaseOrder>();
+            AuditShopOrderList = new ObservableCollection<AuditShopOrder>();
+            ShowAuditPayBillList = new ObservableCollection<AuditPayBill>();
+            ShowAuditPurchaseOrderList = new ObservableCollection<AuditPurchaseOrder>();
+            ShowAuditShopOrderList = new ObservableCollection<AuditShopOrder>();
+
+            //AuditFileList.Add(new AuditFile() { FileName = "支付宝账单20220527.csv", AuditFileType = AuditFileType.账单 });
+            //AuditFileList.Add(new AuditFile() { FileName = "1688采购单20220527.csv", AuditFileType = AuditFileType.采购单 });
+            //AuditFileList.Add(new AuditFile() { FileName = "支付宝账单20220527.csv", AuditFileType = AuditFileType.销售订单 });
+
+        }
+
+        private void Audit()
+        {
+            if (AuditPayBillList.Count() == 0 ||
+                AuditPurchaseOrderList.Count() == 0 ||
+                AuditShopOrderList.Count() == 0)
+            {
+                MessageBox.Show("审核数据不全", "提示");
+                return;
+            }
+
+            AuditByPayBill();
+            AuditByPurchaseOrder();
+        }
+
+        private void AuditByPayBill()
+        {
+
+        }
+
+        private void AuditByPurchaseOrder()
+        {
+
+        }
+
+        private void ClearAudit()
+        {
+            SelectAuditFile = null;
+            AuditFileList.Clear();
+            AuditPayBillList.Clear();
+            AuditPurchaseOrderList.Clear();
+            AuditShopOrderList.Clear();
+            ShowAuditPayBillList.Clear();
+            ShowAuditPurchaseOrderList.Clear();
+            ShowAuditShopOrderList.Clear();
+        }
+
+        private (string ErrorMessage, string FileName, IList<string> 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);
+            }
+        }
+
+        /// <summary>
+        /// 导入支付宝账单
+        /// </summary>
+        private void ImportAliPayBill()
+        {
+            var importResult = ImportAuditFile(AuditFileType.账单);
+            if (!string.IsNullOrEmpty(importResult.ErrorMessage))
+            {
+                MessageBox.Show(importResult.ErrorMessage, "导入支付宝账单");
+                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();
+                    payBillNo = array[0].Replace("\"", string.Empty).Replace("\t", string.Empty).Trim();
+                    if (AuditPayBillList.Any(p => p.PayBillNo == payBillNo))
+                        continue;
+                    var payBill = new AuditPayBill()
+                    {
+                        BelongFileName = importResult.FileName,
+                        PayBillNo = payBillNo,
+                        PayBillType = PayBillType.AliPay,
+                        SourceMerchantOrderNo = array[2].FormatString(),
+                        ProductName = array[3].FormatString(),
+                        PayTime = DateTime.Parse(array[4].FormatString()),
+                        OppositeAccount = array[5].FormatString(),
+                        ExpenditureAmount = decimal.Parse(array[7].FormatString())
+                    };
+                    payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo;
+                    if (payBill.SourceMerchantOrderNo.StartsWith("T50060NP"))
+                        payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo.Substring(8);
+                    AuditPayBillList.Add(payBill);
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show($"问题账单号{payBillNo} {ex.Message}", "导入支付宝账单");
+            }
+        }
+
+        /// <summary>
+        /// 导入1688采购单
+        /// </summary>
+        private void Import1688PurchaseOrder()
+        {
+            var importResult = ImportAuditFile(AuditFileType.采购单);
+            if (!string.IsNullOrEmpty(importResult.ErrorMessage))
+            {
+                MessageBox.Show(importResult.ErrorMessage, "导入1688采购单");
+                return;
+            }
+
+            //去掉列名
+            importResult.Lines.RemoveAt(0);
+
+            var purchaseOrderId = "";
+            try
+            {
+                foreach (var line in importResult.Lines)
+                {
+                    var array = line.CSVstrToArry();
+                    purchaseOrderId = array[0].FormatString();
+                    if (string.IsNullOrEmpty(purchaseOrderId) || AuditPurchaseOrderList.Any(p => p.PurchaseOrderId == purchaseOrderId))
+                        continue;
+                    var purchaseOrder = new AuditPurchaseOrder()
+                    {
+                        PurchaseOrderId = purchaseOrderId,
+                        Platform = Platform.阿里巴巴,
+                        BelongFileName = importResult.FileName,
+                        ProductAmount = decimal.Parse(array[5].FormatString()),
+                        Freight = decimal.Parse(array[6].FormatString()),
+                        PayAmount = decimal.Parse(array[8].FormatString()),
+                        CreateTime = DateTime.Parse(array[10].FormatString()),
+                        ContactName = array[13].FormatString(),
+                        Address = array[14].FormatString(),
+                        Phone = array[17].FormatString(),
+                        Quantity = int.Parse(array[20].FormatString())
+                    };
+                    if (!string.IsNullOrEmpty(array[11]))
+                        purchaseOrder.PayTime = DateTime.Parse(array[11].FormatString());
+                    AuditPurchaseOrderList.Add(purchaseOrder);
+                }
+                Console.WriteLine(AuditPurchaseOrderList.Count());
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show($"问题采购单号{purchaseOrderId} {ex.Message}", "导入1688采购单");
+            }
+
+        }
+
+        /// <summary>
+        /// 导入京东销售订单
+        /// </summary>
+        private void ImportJDShopOrder()
+        {
+            var importResult = ImportAuditFile(AuditFileType.销售订单);
+            if (!string.IsNullOrEmpty(importResult.ErrorMessage))
+            {
+                MessageBox.Show(importResult.ErrorMessage, "导入京东销售订单");
+                return;
+            }
+
+            //去掉列名
+            importResult.Lines.RemoveAt(0);
+            var orderId = "";
+            try
+            {
+                foreach (var line in importResult.Lines)
+                {
+                    var array = line.CSVstrToArry();
+                    orderId = array[0].FormatString();
+                    if (string.IsNullOrEmpty(orderId) || AuditShopOrderList.Any(p => p.OrderId == orderId))
+                        continue;
+                    var order = new AuditShopOrder()
+                    {
+                        OrderId = orderId,
+
+                    };
+                    AuditShopOrderList.Add(order);
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show($"问题销售订单号{orderId} {ex.Message}", "导入京东销售订单");
+            }
+        }
     }
 }
diff --git a/BBWY.Client/ViewModels/ViewModelLocator.cs b/BBWY.Client/ViewModels/ViewModelLocator.cs
index 5daff652..83cd48e3 100644
--- a/BBWY.Client/ViewModels/ViewModelLocator.cs
+++ b/BBWY.Client/ViewModels/ViewModelLocator.cs
@@ -97,5 +97,14 @@ namespace BBWY.Client.ViewModels
                 return s.ServiceProvider.GetRequiredService<ShopSettingViewModel>();
             }
         }
+
+        public ProcurementAuditViewModel ProcurementAudit
+        {
+            get
+            {
+                using var s = sp.CreateScope();
+                return s.ServiceProvider.GetRequiredService<ProcurementAuditViewModel>();
+            }
+        }
     }
 }
diff --git a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
index 98db0710..0f479982 100644
--- a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
+++ b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
@@ -5,10 +5,108 @@
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:local="clr-namespace:BBWY.Client.Views.FinancialTerminal"
       mc:Ignorable="d" 
+       xmlns:c="clr-namespace:BBWY.Controls;assembly=BBWY.Controls"
       d:DesignHeight="450" d:DesignWidth="800"
-      Title="ProcurementAudit">
-
+      Title="ProcurementAudit"
+      DataContext="{Binding ProcurementAudit,Source={StaticResource Locator}}">
     <Grid>
-        
+        <c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999"/>
+        <Grid Margin="5,0">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="40"/>
+                <RowDefinition Height="5"/>
+                <RowDefinition Height="auto"/>
+                <RowDefinition Height="5"/>
+                <RowDefinition Height="30"/>
+                <RowDefinition Height="5"/>
+                <RowDefinition/>
+            </Grid.RowDefinitions>
+            <Border Background="{StaticResource Border.Background}" Padding="5,0">
+                <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
+                    <ComboBox Width="100" IsEnabled="false"/>
+                    <ComboBox Width="100" IsEnabled="false" Margin="5,0,0,0"/>
+                    <DatePicker Width="100" IsEnabled="false" Height="30" Margin="5,0,0,0"/>
+                    <DatePicker Width="100" IsEnabled="false" Height="30" Margin="5,0,0,0"/>
+                    <c:BButton Content="执行" Margin="5,0,0,0" Padding="10,0" Command="{Binding AuditCommand}"/>
+                    <c:BButton Content="清空" Margin="5,0,0,0" Padding="10,0" Command="{Binding ClearAuditCommand}"/>
+                </StackPanel>
+            </Border>
+
+            <Grid Grid.Row="2">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"/>
+                    <RowDefinition Height="40"/>
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                    <ColumnDefinition/>
+                </Grid.ColumnDefinitions>
+                <TextBlock Text="支付数据"/>
+                <TextBlock Text="采购数据" Grid.Column="1"/>
+                <TextBlock Text="销售数据" Grid.Column="2"/>
+
+                <Border Background="{StaticResource Border.Background}" Grid.Row="1" Margin="0,0,5,0">
+                    <StackPanel Orientation="Horizontal">
+                        <c:BButton Content="导入支付宝账单" Padding="10,0" Margin="5,0,0,0" Command="{Binding ImportAliPayBillCommand}"/>
+                        <c:BButton Content="导入微信账单" Padding="10,0" Margin="5,0,0,0" 
+                                   IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
+                    </StackPanel>
+                </Border>
+
+                <Border Background="{StaticResource Border.Background}" Grid.Row="1" Grid.Column="1" Margin="0,0,5,0">
+                    <StackPanel Orientation="Horizontal">
+                        <c:BButton Content="导入1688采购单" Padding="10,0" Margin="5,0,0,0" Command="{Binding Import1688PurchaseOrderCommand}"/>
+                        <c:BButton Content="导入淘宝采购单" Padding="10,0" Margin="5,0,0,0" 
+                                   IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
+                        <c:BButton Content="导入拼多多采购单" Padding="10,0" Margin="5,0,0,0" 
+                                   IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
+                    </StackPanel>
+                </Border>
+
+                <Border Background="{StaticResource Border.Background}" Grid.Row="1" Grid.Column="2">
+                    <StackPanel Orientation="Horizontal">
+                        <c:BButton Content="后台出单表(京东)" Padding="10,0" Margin="5,0,0,0" Command="{Binding ImportJDShopOrderCommand}"/>
+                        <c:BButton Content="后台出单表(淘宝)" Padding="10,0" Margin="5,0,0,0" 
+                                   IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
+                        <c:BButton Content="后台出单表(拼多多)" Padding="10,0" Margin="5,0,0,0" 
+                                   IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
+                    </StackPanel>
+                </Border>
+                
+                
+            </Grid>
+
+            <ListBox ItemsSource="{Binding AuditFileList}"
+                     SelectedItem="{Binding SelectAuditFile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+                     ItemContainerStyle="{StaticResource NoBgListBoxItemStyle}"
+                     Grid.Row="4">
+                <ListBox.ItemsPanel>
+                    <ItemsPanelTemplate>
+                        <StackPanel Orientation="Horizontal"/>
+                    </ItemsPanelTemplate>
+                </ListBox.ItemsPanel>
+                <ListBox.ItemTemplate>
+                    <DataTemplate>
+                        <Border BorderThickness="1" 
+                                BorderBrush="{StaticResource Border.Brush}"
+                                Height="30"
+                                Padding="5,0"
+                                Margin="0,0,-1,0">
+                            <TextBlock x:Name="txtFileName" Text="{Binding FileName}"
+                                       VerticalAlignment="Center"/>
+                        </Border>
+                        <DataTemplate.Triggers>
+                            <DataTrigger Binding="{Binding IsSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}}"
+                                         Value="True">
+                                <DataTrigger.Setters>
+                                    <Setter TargetName="txtFileName" Property="Foreground" Value="{StaticResource Text.Link.Color }"/>
+                                </DataTrigger.Setters>
+                            </DataTrigger>
+                        </DataTemplate.Triggers>
+                    </DataTemplate>
+                </ListBox.ItemTemplate>
+            </ListBox>
+        </Grid>
     </Grid>
 </Page>
diff --git a/BBWY.Client/Views/Ware/WareManager.xaml b/BBWY.Client/Views/Ware/WareManager.xaml
index e8397011..5f2abc06 100644
--- a/BBWY.Client/Views/Ware/WareManager.xaml
+++ b/BBWY.Client/Views/Ware/WareManager.xaml
@@ -23,7 +23,7 @@
         <c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999"/>
         <Grid Margin="5,0">
             <Grid.RowDefinitions>
-                <RowDefinition Height="50"/>
+                <RowDefinition Height="40"/>
                 <RowDefinition Height="5"/>
                 <RowDefinition Height="30"/>
                 <RowDefinition/>
diff --git a/BBWY.Client/Views/Ware/WareStock.xaml b/BBWY.Client/Views/Ware/WareStock.xaml
index d2c491f3..bebeb534 100644
--- a/BBWY.Client/Views/Ware/WareStock.xaml
+++ b/BBWY.Client/Views/Ware/WareStock.xaml
@@ -162,7 +162,7 @@
         <c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999"/>
         <Grid Margin="5,0">
             <Grid.RowDefinitions>
-                <RowDefinition Height="50"/>
+                <RowDefinition Height="40"/>
                 <RowDefinition Height="5"/>
                 <RowDefinition Height="30"/>
                 <RowDefinition/>
diff --git a/BBWY.Server.Business/PlatformSDK/_1688Business.cs b/BBWY.Server.Business/PlatformSDK/_1688Business.cs
index 733b1299..d0db87ee 100644
--- a/BBWY.Server.Business/PlatformSDK/_1688Business.cs
+++ b/BBWY.Server.Business/PlatformSDK/_1688Business.cs
@@ -79,7 +79,7 @@ namespace BBWY.Server.Business
 
         public override PreviewOrderResponse PreviewOrder(PreviewOrderReuqest previewOrderReuqest)
         {
-            logger.Info($"PreviewOrder {JsonConvert.SerializeObject(previewOrderReuqest)}");
+            //logger.Info($"PreviewOrder {JsonConvert.SerializeObject(previewOrderReuqest)}");
 
             var client = GetSyncAPIClient(previewOrderReuqest.AppKey, previewOrderReuqest.AppSecret);
             RequestPolicy reqPolicy = new RequestPolicy();
@@ -130,6 +130,8 @@ namespace BBWY.Server.Business
             if (result.Value<bool>("success") != true)
                 throw new BusinessException(result.Value<string>("errorMsg")) { Code = 0 };
 
+            logger.Info($"PreviewOrder Request:{JsonConvert.SerializeObject(previewOrderReuqest)} Response:{result}");
+
             var orderPreviewResuslt = (JArray)result["orderPreviewResuslt"];
             List<JToken> intersectTradeModeList = new List<JToken>();
 

From 9786d950e7f225aadff141da766585d979ab3a57 Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sun, 29 May 2022 05:55:37 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=AE=A1=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ProcurementAudit/AuditShopOrder.cs        |  10 +
 BBWY.Client/Resources/Themes/Generic.xaml     |   3 +
 .../ProcurementAuditViewModel.cs              | 278 ++++++++++++++++--
 .../FinancialTerminal/ProcurementAudit.xaml   |  64 +++-
 4 files changed, 332 insertions(+), 23 deletions(-)

diff --git a/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs
index 47698d71..9f561f8d 100644
--- a/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs
+++ b/BBWY.Client/Models/FinancialTerminal/ProcurementAudit/AuditShopOrder.cs
@@ -30,6 +30,11 @@ namespace BBWY.Client.Models
         /// </summary>
         public DateTime CreateTime { get; set; }
 
+        /// <summary>
+        /// 支付时间
+        /// </summary>
+        public DateTime? PayTime { get; set; }
+
         /// <summary>
         /// 联系电话
         /// </summary>
@@ -44,6 +49,11 @@ namespace BBWY.Client.Models
         /// 收货人
         /// </summary>
         public string ContactName { get; set; }
+        
+        /// <summary>
+        /// 商家备注
+        /// </summary>
+        public string VenderRemark { get; set; }
 
         /// <summary>
         /// 关联的采购单号
diff --git a/BBWY.Client/Resources/Themes/Generic.xaml b/BBWY.Client/Resources/Themes/Generic.xaml
index 7853ca8f..f75c12c2 100644
--- a/BBWY.Client/Resources/Themes/Generic.xaml
+++ b/BBWY.Client/Resources/Themes/Generic.xaml
@@ -279,6 +279,9 @@
         <Setter Property="HorizontalAlignment" Value="Center"/>
         <Setter Property="VerticalAlignment" Value="Center"/>
     </Style>
+    <Style x:Key="verticalCenterTextBlock" TargetType="TextBlock">
+        <Setter Property="VerticalAlignment" Value="Center"/>
+    </Style>
 
     <Style TargetType="DataGrid">
         <Setter Property="AutoGenerateColumns" Value="False"/>
diff --git a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
index 6f86e9a0..37cb7202 100644
--- a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
+++ b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
@@ -9,6 +9,8 @@ using System.Collections.ObjectModel;
 using System.IO;
 using System.Linq;
 using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Input;
 
@@ -17,6 +19,12 @@ namespace BBWY.Client.ViewModels
     public class ProcurementAuditViewModel : BaseVM, IDenpendency
     {
         private AuditFile selectAuditFile;
+        private bool isLoading;
+        private bool isAudited;
+        private bool isShowPayBillPanel;
+        private bool isShowPurchaseOrderPanel;
+        private bool isShowShopOrderPanel;
+        private bool onlyException;
 
         public IList<AuditFile> AuditFileList { get; set; }
 
@@ -32,7 +40,69 @@ namespace BBWY.Client.ViewModels
 
         public IList<AuditShopOrder> ShowAuditShopOrderList { get; set; }
 
-        public AuditFile SelectAuditFile { get => selectAuditFile; set { Set(ref selectAuditFile, value); } }
+        public AuditFile SelectAuditFile
+        {
+            get => selectAuditFile; set
+            {
+                if (Set(ref selectAuditFile, value))
+                    OnSelectAuditFileChanged();
+            }
+        }
+
+        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
+            {
+                if (Set(ref isShowPayBillPanel, value))
+                {
+                    if (value)
+                    {
+                        IsShowPurchaseOrderPanel = false;
+                        IsShowShopOrderPanel = false;
+                    }
+                }
+            }
+        }
+        public bool IsShowPurchaseOrderPanel
+        {
+            get => isShowPurchaseOrderPanel; set
+            {
+                if (Set(ref isShowPurchaseOrderPanel, value))
+                {
+                    if (value)
+                    {
+                        IsShowPayBillPanel = false;
+                        IsShowShopOrderPanel = false;
+                    }
+                }
+            }
+        }
+        public bool IsShowShopOrderPanel
+        {
+            get => isShowShopOrderPanel; set
+            {
+                if (Set(ref isShowShopOrderPanel, value))
+                {
+                    if (value)
+                    {
+                        IsShowPayBillPanel = false;
+                        IsShowPurchaseOrderPanel = false;
+                    }
+                }
+            }
+        }
+
+        public bool OnlyException
+        {
+            get => onlyException; set
+            {
+                if (Set(ref onlyException, value))
+                    OnOnlyExceptionChanged();
+            }
+        }
 
         public ICommand AuditCommand { get; set; }
 
@@ -40,16 +110,10 @@ namespace BBWY.Client.ViewModels
 
         public ICommand ImportAliPayBillCommand { get; set; }
 
-
-
         public ICommand Import1688PurchaseOrderCommand { get; set; }
 
-
-
         public ICommand ImportJDShopOrderCommand { get; set; }
 
-
-
         public ProcurementAuditViewModel()
         {
             AuditFileList = new ObservableCollection<AuditFile>();
@@ -64,9 +128,9 @@ namespace BBWY.Client.ViewModels
             ImportJDShopOrderCommand = new RelayCommand(ImportJDShopOrder);
 
             AuditFileList = new ObservableCollection<AuditFile>();
-            AuditPayBillList = new ObservableCollection<AuditPayBill>();
-            AuditPurchaseOrderList = new ObservableCollection<AuditPurchaseOrder>();
-            AuditShopOrderList = new ObservableCollection<AuditShopOrder>();
+            AuditPayBillList = new List<AuditPayBill>();
+            AuditPurchaseOrderList = new List<AuditPurchaseOrder>();
+            AuditShopOrderList = new List<AuditShopOrder>();
             ShowAuditPayBillList = new ObservableCollection<AuditPayBill>();
             ShowAuditPurchaseOrderList = new ObservableCollection<AuditPurchaseOrder>();
             ShowAuditShopOrderList = new ObservableCollection<AuditShopOrder>();
@@ -79,6 +143,8 @@ namespace BBWY.Client.ViewModels
 
         private void Audit()
         {
+            if (IsLoading)
+                return;
             if (AuditPayBillList.Count() == 0 ||
                 AuditPurchaseOrderList.Count() == 0 ||
                 AuditShopOrderList.Count() == 0)
@@ -87,18 +153,124 @@ namespace BBWY.Client.ViewModels
                 return;
             }
 
-            AuditByPayBill();
-            AuditByPurchaseOrder();
-        }
+            var waitList = new List<EventWaitHandle>()
+            {
+                new ManualResetEvent(false),
+                new ManualResetEvent(false)
+            };
+            IsLoading = true;
+            Task.Factory.StartNew(() =>
+            {
+                AuditByPayBill(waitList[0]);
+                AuditByPurchaseOrder(waitList[1]);
+            }).ContinueWith(t =>
+            {
+                WaitHandle.WaitAll(waitList.ToArray(), -1);
+                IsLoading = false;
+                IsAudited = true;
 
-        private void AuditByPayBill()
-        {
+                App.Current.Dispatcher.BeginInvoke((Action)delegate
+                {
+                    SelectAuditFile = AuditFileList.FirstOrDefault(f => f.AuditFileType == AuditFileType.账单);
+                });
+            });
 
         }
 
-        private void AuditByPurchaseOrder()
+        private void AuditByPayBill(EventWaitHandle ewh)
         {
+            try
+            {
+                foreach (var payBill in AuditPayBillList)
+                {
+                    #region 匹配采购单
+                    var relationPurchaseOrder = AuditPurchaseOrderList.FirstOrDefault(p => p.PurchaseOrderId == payBill.MerchantOrderNo);
+                    if (relationPurchaseOrder == null)
+                    {
+                        //未通过商户订单号找到采购单,则通过账单金额和日期匹配
+                        relationPurchaseOrder = AuditPurchaseOrderList.FirstOrDefault(p => p.PayAmount == payBill.ExpenditureAmount &&
+                                                                                           p.PayTime != null && payBill.PayTime != null &&
+                                                                                           Math.Abs((payBill.PayTime.Value - p.PayTime.Value).TotalSeconds) <= 60);
+                    }
+                    if (relationPurchaseOrder == null)
+                    {
+                        payBill.ErrorMessage = "未匹配采购单";
+                        continue;
+                    }
+                    payBill.RelationPurchaseOrderId = relationPurchaseOrder.PurchaseOrderId;
+                    #endregion
+
+                    #region 匹配销售订单
+                    var relationShopOrder = AuditShopOrderList.FirstOrDefault(o => (!string.IsNullOrEmpty(o.VenderRemark) && o.VenderRemark.Contains(relationPurchaseOrder.PurchaseOrderId)) ||
+                                                                                   (o.Phone == relationPurchaseOrder.Phone &&
+                                                                                    o.ContactName == relationPurchaseOrder.ContactName &&
+                                                                                    o.PayTime != null && relationPurchaseOrder.PayTime != null &&
+                                                                                   (relationPurchaseOrder.PayTime.Value - o.PayTime.Value).TotalDays <= 2));
+                    if (relationShopOrder == null)
+                    {
+                        payBill.ErrorMessage = "未匹配销售订单";
+                        continue;
+                    }
+                    payBill.RelationShopOrderId = relationShopOrder.OrderId;
+                    #endregion
+                }
+            }
+            catch (Exception ex)
+            {
+                App.Current.Dispatcher.Invoke(() => MessageBox.Show(ex.Message, "账单匹配"));
+            }
+            finally
+            {
+                ewh.Set();
+            }
+        }
 
+        private void AuditByPurchaseOrder(EventWaitHandle ewh)
+        {
+            try
+            {
+                foreach (var purchaseOrder in AuditPurchaseOrderList)
+                {
+                    #region 匹配账单
+                    var relationPayBill = AuditPayBillList.FirstOrDefault(b => b.MerchantOrderNo == purchaseOrder.PurchaseOrderId);
+                    if (relationPayBill == null)
+                    {
+                        //未通过商户订单号找到采购单,则通过账单金额和日期匹配
+                        relationPayBill = AuditPayBillList.FirstOrDefault(b => purchaseOrder.PayAmount == b.ExpenditureAmount &&
+                                                                               purchaseOrder.PayTime != null && b.PayTime != null &&
+                                                                               Math.Abs((b.PayTime.Value - purchaseOrder.PayTime.Value).TotalSeconds) <= 60);
+                    }
+                    if (relationPayBill == null)
+                    {
+                        purchaseOrder.ErrorMessage = "未匹配支付账单";
+                        continue;
+                    }
+                    purchaseOrder.RelationPayBillNo = relationPayBill.PayBillNo;
+                    #endregion
+
+                    #region 匹配销售单
+                    var relationShopOrder = AuditShopOrderList.FirstOrDefault(o => (!string.IsNullOrEmpty(o.VenderRemark) && o.VenderRemark.Contains(purchaseOrder.PurchaseOrderId)) ||
+                                                                                  (o.Phone == purchaseOrder.Phone &&
+                                                                                   o.ContactName == purchaseOrder.ContactName &&
+                                                                                   o.PayTime != null && purchaseOrder.PayTime != null &&
+                                                                                  (purchaseOrder.PayTime.Value - o.PayTime.Value).TotalDays <= 2));
+                    if (relationShopOrder == null)
+                    {
+                        purchaseOrder.ErrorMessage = "未匹配销售订单";
+                        continue;
+                    }
+                    purchaseOrder.RelationShopOrderId = relationShopOrder.OrderId;
+                    #endregion
+                }
+            }
+            catch (Exception ex)
+            {
+                App.Current.Dispatcher.Invoke(() => MessageBox.Show(ex.Message, "采购单匹配"));
+            }
+            finally
+            {
+                ewh.Set();
+            }
         }
 
         private void ClearAudit()
@@ -111,6 +283,11 @@ namespace BBWY.Client.ViewModels
             ShowAuditPayBillList.Clear();
             ShowAuditPurchaseOrderList.Clear();
             ShowAuditShopOrderList.Clear();
+            IsAudited = false;
+            IsShowPayBillPanel = false;
+            IsShowPurchaseOrderPanel = false;
+            IsShowShopOrderPanel = false;
+            OnlyException = false;
         }
 
         private (string ErrorMessage, string FileName, IList<string> Lines) ImportAuditFile(AuditFileType auditFileType)
@@ -145,6 +322,8 @@ namespace BBWY.Client.ViewModels
                 MessageBox.Show(importResult.ErrorMessage, "导入支付宝账单");
                 return;
             }
+            if (importResult.Lines == null || importResult.Lines.Count() == 0)
+                return;
             //忽略前5行
             /*
             #支付宝账务明细查询											
@@ -174,7 +353,10 @@ namespace BBWY.Client.ViewModels
                 foreach (var line in importResult.Lines)
                 {
                     var array = line.CSVstrToArry();
-                    payBillNo = array[0].Replace("\"", string.Empty).Replace("\t", string.Empty).Trim();
+                    var expenditureAmount = decimal.Parse(array[7].FormatString());
+                    if (expenditureAmount == 0)  //支出为0的账单不参与审计
+                        continue;
+                    payBillNo = array[0].FormatString();
                     if (AuditPayBillList.Any(p => p.PayBillNo == payBillNo))
                         continue;
                     var payBill = new AuditPayBill()
@@ -186,7 +368,7 @@ namespace BBWY.Client.ViewModels
                         ProductName = array[3].FormatString(),
                         PayTime = DateTime.Parse(array[4].FormatString()),
                         OppositeAccount = array[5].FormatString(),
-                        ExpenditureAmount = decimal.Parse(array[7].FormatString())
+                        ExpenditureAmount = Math.Abs(expenditureAmount)
                     };
                     payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo;
                     if (payBill.SourceMerchantOrderNo.StartsWith("T50060NP"))
@@ -211,6 +393,8 @@ namespace BBWY.Client.ViewModels
                 MessageBox.Show(importResult.ErrorMessage, "导入1688采购单");
                 return;
             }
+            if (importResult.Lines == null || importResult.Lines.Count() == 0)
+                return;
 
             //去掉列名
             importResult.Lines.RemoveAt(0);
@@ -262,6 +446,8 @@ namespace BBWY.Client.ViewModels
                 MessageBox.Show(importResult.ErrorMessage, "导入京东销售订单");
                 return;
             }
+            if (importResult.Lines == null || importResult.Lines.Count() == 0)
+                return;
 
             //去掉列名
             importResult.Lines.RemoveAt(0);
@@ -277,9 +463,20 @@ namespace BBWY.Client.ViewModels
                     var order = new AuditShopOrder()
                     {
                         OrderId = orderId,
-
+                        Platform = Platform.京东,
+                        BelongFileName = importResult.FileName,
+                        Quantity = int.Parse(array[3].FormatString()),
+                        CreateTime = DateTime.Parse(array[5].FormatString()),
+                        PayAmount = decimal.Parse(array[10].FormatString()),
+                        ContactName = array[14].FormatString(),
+                        Address = array[15].FormatString(),
+                        Phone = array[16].FormatString(),
+                        ProductName = array[2].FormatString(),
+                        VenderRemark = array[27].FormatString()
                     };
                     AuditShopOrderList.Add(order);
+                    if (!string.IsNullOrEmpty(array[30]))
+                        order.PayTime = DateTime.Parse(array[30].FormatString());
                 }
             }
             catch (Exception ex)
@@ -287,5 +484,48 @@ namespace BBWY.Client.ViewModels
                 MessageBox.Show($"问题销售订单号{orderId} {ex.Message}", "导入京东销售订单");
             }
         }
+
+        /// <summary>
+        /// 采购审计文件对象改变事件
+        /// </summary>
+        private void OnSelectAuditFileChanged()
+        {
+            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));
+                var list = where.ToList();
+                foreach (var b in list)
+                    ShowAuditPayBillList.Add(b);
+            }
+            else if (SelectAuditFile.AuditFileType == AuditFileType.采购单)
+            {
+                IsShowPurchaseOrderPanel = true;
+                ShowAuditPurchaseOrderList.Clear();
+                var where = AuditPurchaseOrderList.Where(p => p.BelongFileName == SelectAuditFile.FileName);
+                if (OnlyException)
+                    where = where.Where(p => !string.IsNullOrEmpty(p.ErrorMessage));
+                var list = where.ToList();
+                foreach (var p in list)
+                    ShowAuditPurchaseOrderList.Add(p);
+            }
+            else if (SelectAuditFile.AuditFileType == AuditFileType.销售订单)
+            {
+
+            }
+        }
+
+        private void OnOnlyExceptionChanged()
+        {
+            if (SelectAuditFile == null || AuditFileList.Count() == 0)
+                return;
+            SelectAuditFile = null;
+            SelectAuditFile = AuditFileList.FirstOrDefault(f => f.AuditFileType == AuditFileType.账单);
+        }
     }
 }
diff --git a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
index 0f479982..ae0914a9 100644
--- a/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
+++ b/BBWY.Client/Views/FinancialTerminal/ProcurementAudit.xaml
@@ -19,6 +19,7 @@
                 <RowDefinition Height="5"/>
                 <RowDefinition Height="30"/>
                 <RowDefinition Height="5"/>
+                <RowDefinition Height="auto"/>
                 <RowDefinition/>
             </Grid.RowDefinitions>
             <Border Background="{StaticResource Border.Background}" Padding="5,0">
@@ -73,14 +74,21 @@
                                    IsEnabled="False" DisableText="{Binding Content,RelativeSource={RelativeSource Mode=Self}}"/>
                     </StackPanel>
                 </Border>
-                
-                
             </Grid>
 
             <ListBox ItemsSource="{Binding AuditFileList}"
                      SelectedItem="{Binding SelectAuditFile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
-                     ItemContainerStyle="{StaticResource NoBgListBoxItemStyle}"
-                     Grid.Row="4">
+                     Grid.Row="4"
+                     IsEnabled="{Binding IsAudited,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}">
+                <ListBox.ItemContainerStyle>
+                    <Style TargetType="ListBoxItem" BasedOn="{StaticResource NoBgListBoxItemStyle}">
+                        <Style.Triggers>
+                            <DataTrigger Binding="{Binding AuditFileType}" Value="销售订单">
+                                <Setter Property="IsEnabled" Value="False"/>
+                            </DataTrigger>
+                        </Style.Triggers>
+                    </Style>
+                </ListBox.ItemContainerStyle>
                 <ListBox.ItemsPanel>
                     <ItemsPanelTemplate>
                         <StackPanel Orientation="Horizontal"/>
@@ -107,6 +115,54 @@
                     </DataTemplate>
                 </ListBox.ItemTemplate>
             </ListBox>
+
+            <CheckBox Content="仅显示异常" Grid.Row="6"
+                      IsChecked="{Binding OnlyException,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+                      FocusVisualStyle="{x:Null}"/>
+            <DataGrid ItemsSource="{Binding ShowAuditPayBillList}"
+                      Grid.Row="7"
+                      Visibility="{Binding IsShowPayBillPanel,Converter={StaticResource objConverter},ConverterParameter=true:Visible:Collapsed}">
+                <DataGrid.Columns>
+                    <DataGridTextColumn Header="账单流水号" Width="145" Binding="{Binding PayBillNo}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="账单平台" Width="60" Binding="{Binding PayBillType}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="支付时间" Width="130" Binding="{Binding PayTime,StringFormat=yyyy-MM-dd HH:mm:ss}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="对方账号" Width="100" Binding="{Binding OppositeAccount}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="支出金额" Width="60" Binding="{Binding ExpenditureAmount}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="商户订单号" Width="200" Binding="{Binding SourceMerchantOrderNo}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="归属店铺" Width="100" Binding="{Binding BelongShop}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="关联采购单" Width="140" Binding="{Binding RelationPurchaseOrderId}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="关联销售单" Width="140" Binding="{Binding RelationShopOrderId}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="异常内容" Width="*" Binding="{Binding ErrorMessage}" Foreground="Red" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                </DataGrid.Columns>
+            </DataGrid>
+
+            <DataGrid ItemsSource="{Binding ShowAuditPurchaseOrderList}"
+                      Grid.Row="7"
+                      Visibility="{Binding IsShowPurchaseOrderPanel,Converter={StaticResource objConverter},ConverterParameter=true:Visible:Collapsed}">
+                <DataGrid.Columns>
+                    <DataGridTextColumn Header="采购单号" Width="145" Binding="{Binding PurchaseOrderId}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="采购平台" Width="60" Binding="{Binding Platform}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="创建时间" Width="130" Binding="{Binding CreateTime,StringFormat=yyyy-MM-dd HH:mm:ss}" 
+                                        ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="付款时间" Width="130" Binding="{Binding CreateTime,StringFormat=yyyy-MM-dd HH:mm:ss}"
+                                        ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="货品总价" Width="60" Binding="{Binding ProductAmount}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="运费" Width="60" Binding="{Binding Freight}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="联系人" Width="60" Binding="{Binding ContactName}" ElementStyle="{StaticResource middleTextBlock}"/>
+                    <DataGridTextColumn Header="手机号" Width="90" Binding="{Binding Phone}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="收货地址" Width="150" Binding="{Binding Address}"/>
+                    <DataGridTextColumn Header="归属店铺" Width="100" Binding="{Binding BelongShop}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="关联账单" Width="140" Binding="{Binding RelationPayBillNo}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="关联销售单" Width="140" Binding="{Binding RelationShopOrderId}" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                    <DataGridTextColumn Header="异常内容" Width="*" Binding="{Binding ErrorMessage}" Foreground="Red" ElementStyle="{StaticResource verticalCenterTextBlock}"/>
+                </DataGrid.Columns>
+            </DataGrid>
+
+            <DataGrid ItemsSource="{Binding ShowAuditShopOrderList}"
+                      Grid.Row="7"
+                      Visibility="{Binding IsShowShopOrderPanel,Converter={StaticResource objConverter},ConverterParameter=true:Visible:Collapsed}">
+
+            </DataGrid>
         </Grid>
     </Grid>
 </Page>

From a8fd3c75512541df7a79be1058438da628e1c99f Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sun, 29 May 2022 07:03:04 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E5=AE=A1=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
index 37cb7202..889a52a3 100644
--- a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
+++ b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
@@ -524,8 +524,10 @@ namespace BBWY.Client.ViewModels
         {
             if (SelectAuditFile == null || AuditFileList.Count() == 0)
                 return;
+            var f = SelectAuditFile;
             SelectAuditFile = null;
-            SelectAuditFile = AuditFileList.FirstOrDefault(f => f.AuditFileType == AuditFileType.账单);
+            SelectAuditFile = f;
+            //SelectAuditFile = AuditFileList.FirstOrDefault(f => f.AuditFileType == AuditFileType.账单);
         }
     }
 }

From 241ad03f51d8299b681d40c3d453f9e268e90db5 Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sun, 29 May 2022 17:40:00 +0800
Subject: [PATCH 5/6] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=AE=A1=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../FinancialTerminal/ProcurementAuditViewModel.cs         | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
index 889a52a3..089cbd38 100644
--- a/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
+++ b/BBWY.Client/ViewModels/FinancialTerminal/ProcurementAuditViewModel.cs
@@ -353,6 +353,10 @@ namespace BBWY.Client.ViewModels
                 foreach (var line in importResult.Lines)
                 {
                     var array = line.CSVstrToArry();
+                    var sourceMerchantOrderNo = array[2].FormatString();
+                    if (!string.IsNullOrEmpty(sourceMerchantOrderNo) && sourceMerchantOrderNo.StartsWith("XP"))
+                        continue; //暂时不支持此类商户单号
+
                     var expenditureAmount = decimal.Parse(array[7].FormatString());
                     if (expenditureAmount == 0)  //支出为0的账单不参与审计
                         continue;
@@ -364,7 +368,7 @@ namespace BBWY.Client.ViewModels
                         BelongFileName = importResult.FileName,
                         PayBillNo = payBillNo,
                         PayBillType = PayBillType.AliPay,
-                        SourceMerchantOrderNo = array[2].FormatString(),
+                        SourceMerchantOrderNo = sourceMerchantOrderNo,
                         ProductName = array[3].FormatString(),
                         PayTime = DateTime.Parse(array[4].FormatString()),
                         OppositeAccount = array[5].FormatString(),
@@ -373,6 +377,7 @@ namespace BBWY.Client.ViewModels
                     payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo;
                     if (payBill.SourceMerchantOrderNo.StartsWith("T50060NP"))
                         payBill.MerchantOrderNo = payBill.SourceMerchantOrderNo.Substring(8);
+
                     AuditPayBillList.Add(payBill);
                 }
             }

From 096b195950c4401a062a3f7ec10f52714481b3ae Mon Sep 17 00:00:00 2001
From: shanj <18996038927@163.com>
Date: Sun, 29 May 2022 20:47:59 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E7=AB=AF=E6=9D=A1?=
 =?UTF-8?q?=E4=BB=B6=E9=AA=8C=E8=AF=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 BBWY.Client/ViewModels/MainViewModel.cs       |  9 +-
 BBWY.Client/Views/MainWindow.xaml             |  2 +-
 BBWY.Server.Business/Order/OrderBusiness.cs   |  2 +-
 .../PlatformSDK/LogisticsCompanyConverter.cs  | 83 +++++++++++++++++++
 .../PurchaseOrder/PurchaseOrderBusiness.cs    | 61 +++++++-------
 5 files changed, 124 insertions(+), 33 deletions(-)
 create mode 100644 BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs

diff --git a/BBWY.Client/ViewModels/MainViewModel.cs b/BBWY.Client/ViewModels/MainViewModel.cs
index d69f0a91..ce436eae 100644
--- a/BBWY.Client/ViewModels/MainViewModel.cs
+++ b/BBWY.Client/ViewModels/MainViewModel.cs
@@ -10,6 +10,7 @@ using Microsoft.Web.WebView2.Core;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
+using System.Linq;
 using System.Net.Http;
 using System.Threading;
 using System.Threading.Tasks;
@@ -85,7 +86,7 @@ namespace BBWY.Client.ViewModels
             ChooseShopCommand = new RelayCommand<Shop>((s) => ChooseShop(s));
             this.GlobalContext = globalContext;
             ShopList = new ObservableCollection<Shop>();
-            MenuList = new List<MenuModel>()
+            MenuList = new ObservableCollection<MenuModel>()
             {
                 new MenuModel()
                 {
@@ -147,6 +148,10 @@ namespace BBWY.Client.ViewModels
                     throw new Exception($"获取磨刀石用户信息失败 {mdsUserResponse.Msg}");
 
                 GlobalContext.User = mdsUserResponse.Data.Map<User>();
+#if RELEASE
+                if (GlobalContext.User.TeamName != "财务部")
+                    App.Current.Dispatcher.Invoke(() => MenuList.RemoveAt(MenuList.Count() - 1));
+#endif
 
                 //请求用户信息接口
                 //GlobalContext.User = new User()
@@ -272,6 +277,6 @@ namespace BBWY.Client.ViewModels
         {
             Wb2DownloadProgress = e.ProgressPercentage;
         }
-        #endregion
+#endregion
     }
 }
diff --git a/BBWY.Client/Views/MainWindow.xaml b/BBWY.Client/Views/MainWindow.xaml
index 5b40ec27..6e3fb1f5 100644
--- a/BBWY.Client/Views/MainWindow.xaml
+++ b/BBWY.Client/Views/MainWindow.xaml
@@ -26,7 +26,7 @@
                 <!--<TextBlock Text="{Binding GlobalContext.User.TeamName}" Margin="5,0,0,0"/>
                 <TextBlock Text="{Binding GlobalContext.User.Shop.Platform}" Margin="5,0,0,0"/>-->
                 <TextBlock Text="{Binding GlobalContext.User.Shop.Name}"  Margin="5,0,0,0"/>
-                <TextBlock Text="v10013" Margin="5,0,0,0"/>
+                <TextBlock Text="v10015" Margin="5,0,0,0"/>
             </StackPanel>
         </Border>
         <Grid Grid.Row="1">
diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs
index b5d2fe24..d3b4dbbc 100644
--- a/BBWY.Server.Business/Order/OrderBusiness.cs
+++ b/BBWY.Server.Business/Order/OrderBusiness.cs
@@ -887,7 +887,7 @@ namespace BBWY.Server.Business
                     PageSize = 100,
                     Platform = shop.Platform,
                     JDColType = string.IsNullOrEmpty(shop.VenderType) ? "0" : shop.VenderType,
-                    SaveResponseLog = true,
+                    SaveResponseLog = false,
                     OrderId = orderId
                 }, null, HttpMethod.Post);
                 if (orderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
diff --git a/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs b/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs
new file mode 100644
index 00000000..9d47c321
--- /dev/null
+++ b/BBWY.Server.Business/PlatformSDK/LogisticsCompanyConverter.cs
@@ -0,0 +1,83 @@
+using BBWY.Common.Models;
+using BBWY.Server.Model;
+using BBWY.Server.Model.Dto;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BBWY.Server.Business
+{
+    public class LogisticsCompanyConverter : IDenpendency
+    {
+        private IDictionary<string, IList<LogisticsCompanyRelationship>> converterDictionary;
+
+        public LogisticsCompanyConverter()
+        {
+            converterDictionary = new Dictionary<string, IList<LogisticsCompanyRelationship>>();
+            converterDictionary.Add($"{Enums.Platform.阿里巴巴}_{Enums.Platform.京东}", new List<LogisticsCompanyRelationship>()
+            {
+                new LogisticsCompanyRelationship(){SourceName="中通快递(ZTO)",TargetName="中通速递"},
+                new LogisticsCompanyRelationship(){SourceName="圆通速递(YTO)",TargetName="圆通快递"},
+                new LogisticsCompanyRelationship(){SourceName="邮政国内小包",TargetName="邮政快递包裹"},
+                new LogisticsCompanyRelationship(){SourceName="韵达快递",TargetName="韵达快递"},
+                new LogisticsCompanyRelationship(){SourceName="申通快递(STO)",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="顺丰速运",TargetName="顺丰快递"},
+                new LogisticsCompanyRelationship(){SourceName="百世快递",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="其他",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="德邦",TargetName="德邦物流"},
+                new LogisticsCompanyRelationship(){SourceName="EMS",TargetName="邮政快递包裹"},
+                new LogisticsCompanyRelationship(){SourceName="德邦快递",TargetName="德邦快运"},
+                new LogisticsCompanyRelationship(){SourceName="其它",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="极兔速递",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="中通快运",TargetName="中通快运"},
+                new LogisticsCompanyRelationship(){SourceName="龙邦速递",TargetName="龙邦快递"},
+                new LogisticsCompanyRelationship(){SourceName="安能物流",TargetName="安能物流"},
+                new LogisticsCompanyRelationship(){SourceName="德坤物流",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="顺丰快运",TargetName="顺丰快递"},
+                new LogisticsCompanyRelationship(){SourceName="壹米滴答",TargetName="壹米滴答"},
+                new LogisticsCompanyRelationship(){SourceName="优速快递",TargetName="优速快递"},
+                new LogisticsCompanyRelationship(){SourceName="京广速递",TargetName="厂家自送"},
+                new LogisticsCompanyRelationship(){SourceName="丰网速运",TargetName="丰网速运"},
+                new LogisticsCompanyRelationship(){SourceName="顺心捷达",TargetName="顺心捷达"},
+                new LogisticsCompanyRelationship(){SourceName="快捷快递",TargetName="快捷速递"},
+                new LogisticsCompanyRelationship(){SourceName="极兔快递(原百世快递)",TargetName="厂家自送"}
+            });
+        }
+
+        /// <summary>
+        /// 翻译各平台之间的物流公司
+        /// </summary>
+        /// <param name="sourceName"></param>
+        /// <param name="sourcePlatform"></param>
+        /// <param name="targetPlatform"></param>
+        /// <param name="targetPlatformUserLogisticsCompanyList">用户支持的目标平台物流公司</param>
+        /// <returns>目标平台的物流公司Id</returns>
+        public string Converter(string sourceName,
+                                Enums.Platform sourcePlatform,
+                                Enums.Platform targetPlatform,
+                                IList<LogisticsResponse> targetPlatformUserLogisticsCompanyList)
+        {
+            var key = $"{sourcePlatform}_{targetPlatform}";
+            if (!converterDictionary.TryGetValue(key, out IList<LogisticsCompanyRelationship> companyRelationShips))
+                throw new BusinessException($"不支持{sourcePlatform}与{targetPlatform}的物流公司翻译");
+
+            var targetShip = companyRelationShips.FirstOrDefault(l => l.SourceName == sourceName);
+            if (targetShip == null)
+                throw new BusinessException($"sourcePlatform:{sourcePlatform},targetPlatform:{targetPlatform},未找到{sourcePlatform}的物流公司{sourceName}");
+
+            var logisiticsCompany = targetPlatformUserLogisticsCompanyList.FirstOrDefault(c => c.Name.Equals(targetShip.TargetName));
+            if (logisiticsCompany == null)
+                throw new BusinessException($"sourcePlatform:{sourcePlatform},targetPlatform:{targetPlatform},targetShip:{targetShip.TargetName},在用户支持的物流公司中不存在");
+
+            return logisiticsCompany.Id;
+        }
+    }
+
+    public class LogisticsCompanyRelationship
+    {
+        public string SourceName { get; set; }
+
+        public string TargetName { get; set; }
+    }
+}
diff --git a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
index a309612b..585e1e8b 100644
--- a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
+++ b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
@@ -25,8 +25,8 @@ namespace BBWY.Server.Business
         private OrderBusiness orderBusiness;
         private MDSBusiness mdsBusiness;
         private VenderBusiness venderBusiness;
-
-        private IDictionary<Enums.Platform, string> deliverySelfDic;
+        private LogisticsCompanyConverter logisticsCompanyConverter;
+        //private IDictionary<Enums.Platform, string> deliverySelfDic;
 
         public PurchaseOrderBusiness(IFreeSql fsql,
                                      NLog.ILogger logger,
@@ -35,18 +35,19 @@ namespace BBWY.Server.Business
                                      TaskSchedulerManager taskSchedulerManager,
                                      OrderBusiness orderBusiness,
                                      MDSBusiness mdsBusiness,
-                                     VenderBusiness venderBusiness) : base(fsql, logger, idGenerator)
+                                     VenderBusiness venderBusiness,
+                                     LogisticsCompanyConverter logisticsCompanyConverter) : base(fsql, logger, idGenerator)
         {
             this.platformSDKBusinessList = platformSDKBusinessList;
             this.taskSchedulerManager = taskSchedulerManager;
             this.orderBusiness = orderBusiness;
             this.mdsBusiness = mdsBusiness;
             this.venderBusiness = venderBusiness;
-
-            deliverySelfDic = new Dictionary<Enums.Platform, string>()
-            {
-                {Enums.Platform.京东 , "1274"} //厂家自送
-            };
+            this.logisticsCompanyConverter = logisticsCompanyConverter;
+            //deliverySelfDic = new Dictionary<Enums.Platform, string>()
+            //{
+            //    {Enums.Platform.京东 , "1274"} //厂家自送
+            //};
         }
 
         public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest)
@@ -507,8 +508,9 @@ namespace BBWY.Server.Business
                 #endregion
 
                 #region 物流公司翻译
-                currentProgress = "将采购单的物流公司翻译为店铺平台的物流公司";
-                logisticsCompanyId = ConvertLogisticsCompanyId(wayBillNoResponse.LogisticsCompanyName, logisticsCompanyList, shop.Platform);
+                currentProgress = "物流公司翻译";
+                //logisticsCompanyId = ConvertLogisticsCompanyId(wayBillNoResponse.LogisticsCompanyName, logisticsCompanyList, shop.Platform);
+                logisticsCompanyId = logisticsCompanyConverter.Converter(wayBillNoResponse.LogisticsCompanyName, callbackPlatform, shop.Platform, logisticsCompanyList);
                 #endregion
 
                 #region 店铺平台订单出库
@@ -533,25 +535,26 @@ namespace BBWY.Server.Business
             }
         }
 
-        /// <summary>
-        /// 物流公司翻译, 将发货平台的物流公司翻译为店铺平台的物流公司
-        /// </summary>
-        /// <param name="sourceLogisticsCompanyName"></param>
-        /// <param name="targetLogisticsList"></param>
-        /// <param name="tagetLogisticsPlatform"></param>
-        /// <returns></returns>
-        private string ConvertLogisticsCompanyId(string sourceLogisticsCompanyName, IList<LogisticsResponse> targetLogisticsList, Enums.Platform tagetLogisticsPlatform)
-        {
-            var match = Regex.Match(sourceLogisticsCompanyName, "(中通|圆通|申通|顺丰|韵达|邮政快递包裹|平邮|EMS|德邦|百世|天天|优速)");
-            if (match.Success)
-            {
-                var sname = match.Groups[1].Value;
-                var targetLogistics = targetLogisticsList.FirstOrDefault(t => t.Name.Contains(sname));
-                if (targetLogistics != null)
-                    return targetLogistics.Id;
-            }
-            return deliverySelfDic[tagetLogisticsPlatform];
-        }
+        ///// <summary>
+        ///// 物流公司翻译, 将发货平台的物流公司翻译为店铺平台的物流公司
+        ///// </summary>
+        ///// <param name="sourceLogisticsCompanyName"></param>
+        ///// <param name="targetLogisticsList"></param>
+        ///// <param name="tagetLogisticsPlatform"></param>
+        ///// <returns></returns>
+        //private string ConvertLogisticsCompanyId(string sourceLogisticsCompanyName, IList<LogisticsResponse> targetLogisticsList, Enums.Platform tagetLogisticsPlatform)
+        //{
+        //    var match = Regex.Match(sourceLogisticsCompanyName, "(中通|圆通|申通|顺丰|韵达|邮政快递包裹|平邮|EMS|德邦|百世|天天|优速)");
+        //    if (match.Success)
+        //    {
+        //        var sname = match.Groups[1].Value;
+        //        var targetLogistics = targetLogisticsList.FirstOrDefault(t => t.Name.Contains(sname));
+        //        if (targetLogistics != null)
+        //            return targetLogistics.Id;
+        //    }
+        //    return deliverySelfDic[tagetLogisticsPlatform];
+        //}
+
 
         /// <summary>
         /// 采购平台改价回调