Commit 367f76f0 by 陶然

优化

parent 1bc98960
...@@ -29,12 +29,14 @@ namespace Com.Bocom.OpenApi ...@@ -29,12 +29,14 @@ namespace Com.Bocom.OpenApi
/// <summary> /// <summary>
/// MY_PRIVATE_KEY:RSA私钥,可以通过sdk包下面bin文件夹里面的工具生成一对公私钥 /// MY_PRIVATE_KEY:RSA私钥,可以通过sdk包下面bin文件夹里面的工具生成一对公私钥
/// </summary> /// </summary>
internal static string MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEu3hCLeQXcWmi+wXaaM0HSJkRxFb/lQl8GU69UiRmf0zI4Xh7/cPBXdm/CWS5SzzTRCQJh23/USxPuyB//wWHgkqUASj12B4mMdx+/KGFmgrAFCy4CBhE2+O4AaiKWuZ8Gpmv+NUseNhy/kyzdNrmqikffr1vM7q1emJ8Y9OihGIAB8toT6b9I/iL93yLUXNLe0ELIIJ1+mmr7j0GvAMZQKL2IrfJ4MCRqg0Ioj2Ql1ckrkmIjgMKZQ1ryzrzcllq5YeaOM8fM3gff9Ntn06N2fsbpZFnGzokNpZkBX8wsLwOHBLM25RxvMPWH9UwWBXkklNHe57PN9G7qtvMMOnPAgMBAAECggEAMeTNuhMDbwKfZOs+78Z2gStjTsM5wTYeIrAUbSVg//G3Gpc8RE32kJrpt259chTnxzjX3ubO+dqvX0U5F90onNZpbaHhrn/yHYO1xSrzF/waT96N/NpotUYDOc6J3RTysXTZl2yHO/EmC/v8neK8BZYQOeGdz48SAiaYxa1XpjZ0QAUX3rCjf9qjkTKux0TZTBk67PcIb+Gwqk4nRWhc0i3yXW4Xw8Z8UJeABgtsOZ16Nv95K7jA836sF+gf4chLGDl8J9Y7Ciz/FpJPksa6Ysoo6jMW9WkggGsNEOwTK6SfYWqIER+NozWG5F4jOlAmdc3zlteOdM3Z9kiYHdlsmQKBgQD78RpE3AEFIC6dgO5isbBeSRNZJUHOp/H49cJgwtk3DiDuN/hLh8Lw3priFiOSlioFRmv6VkQVRQJ38pCbXacc04d34joNy0zXVWFtaaZlureRz74tTbi9Dp1x123NIJ/i/jiJLBdrXfmkNaQpyzfsrIC1vrFpaA5RWKcooZrgzQKBgQDH5rUX9q6tcB/UE3zNfJsNE/yw1QFSAIzcKE3vxWifjbURdVJXpvNoXWkTivwxEbhBDpyAhtUngpN+Ac/3ZP88hY21v+AHmgq9/65z++Wbptg9JfPpGti7kA132D76OfaGca3C1kt1A4Kl+177P52Nx9uAWbANEw+02Dd147pFCwKBgAbzT9Y2e5C4opCVzf3LCSKQwYfkDzy0RWio3wPsXDG4og/wW1k6FZavjXZPRgv1OJOMrc3qM1ai4L6OYo7mtoWFEGeuRgu7YBNQt69dCsojrIzJPmXhjwcoMA/D8bOHAuIwQT8HiF3d6dUt5amBgbl1yNc6u4o85Kg52eK1EqDBAoGARmbZNpRZVpnbi8xFMvWEgemdIAYUjfXFpi/Hqv8iZrb4oypnkpkotoPXYtubEAkGlFr6AUX7Qgv5t/IZdS6ruXvruavW0baNu/aVUSHQ7q2nEHoSWfFrjTshkyiknWnWiej1Yl4oexB+bciG3gO8kFdn1d9AYoppCK7xcWJ/kpsCgYEA2se5A7Oa6JsWmpil+kRSyijoynEnC4IGVEIzboYcBxlyxfpHtwS2zOdXkhIpjd2cqg08BGFcSxot8CaxCOBcRJsI+N+3lok6VffaZDRjttr+NdY/qc7OCmVCx1lJlJ2+WL0Zitv1DV84WqUY2XpQOHvvcmGfuEXtyfkxD1rSJUE="; internal static string MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDiBmB20Ie083EwVgUsLX/wKcYq4zGmH4T2CcLRVBzOHSt2nzM2gEQoPRzonvt+HIh9R63NGaNBsTeQCzgvpSzVuEfNFoAoA/mF0DIxxvpeoRPpYvE3+QDeO8+q14bbJcuca1j5LFQY2am2W4ALYB29EQKDi6LWws0L8xamwvNcO7nIgEyqdsc6KDhwk50KBWT68QWL3aeJUAB05+xuoyFP+eZaQV8UfYRtLGw3n6KFnf1VAnUJMbYcExQS9uOvRoeCfWtww3JEDHaMz5eGjJl78EjJNXbMjTEfSxzV3eN+Zifvff+CaNnTWKSIbR6oFkkwQglgGT/szqH12/4CjrVxAgMBAAECggEACQkwOg/EHRvOXpxRwJ5hCvzgiz5h8b441o01WKEANc08u5VJutgN4X3v9ezFKRmC618+N4Da4flvuzZ3nJAB5tljJXPM08y04QCdwRevUrEl1qK5+f7eZgQGHVJYddJg/XPdLrjy87tf6YZm7A1/ottXOmMOs38+K0ggk7IfgIRff4OEyttip6Lh4cEvxCUJtMny2/dCM7/e6i6Kp+eeRSsGNJAn3KbkBuIC69pAO/AMKnUfUmB383kZ8cW8yF7qHRGlnd0648IDUaAxesz+DNAkoj6Pn0OnZgwZb3TisBffYcLAEWXfU4s8fkL43lS3o3Lb/FGBq5F0iNGKQ/hVcQKBgQD3KWotQ2IbqFhMwW+m860CnxtBjTyUZZ4K5pqic0FLXG55mYKz1/uDwtwwurQeVW7VGCDNhN24jk/H4dqIcfHTlTDu8eNejUoXySy49sFeUKo4BHtiPd4yAsI2GIv2al4ksmMAV1ghXbGdfcFsQ3711xUX4OyBBsyyt3UlND5lDwKBgQDqG3gxij0reEHlwmH0yOFjWk4tuaJtISXHPHlfPTY9cnDosH1bbRgEyo3PCxIzdh3zOs0oJvAZTyAt0P7LNF8DRN7J7fyI3oll1amZ30ibh7A7hw2JoYO+dOnhT6h7o5wxMrw8H+6lj5abziSNIsZsvJh6wwj8J8ELjYocqho9fwKBgD/fC/k2eJv9HRR4yIm0XvlWdIy0GvueZwEaJsvkTPNUp5f0+7nODsk2CgDtvq44FbQr0A5MT5/p5uQYkYjBKWUsIMEe8Ur16DfNXSlPWxksb1Cal+gDZPA3lki0fzbmtf11u+/Soou80rGIVfvMVXriYikRjwyo3S0yC6vZnGYxAoGBAKIr60QuJhex07xsvlzKt0+S5CtKuBju6HOvEckG50cDuvGGKSCnXwcapceyPKaHgVHX/vx8lMCDjqAOciKkIdlq4QZzJQhPWFDCBR4BjhOnmE50TM11pITQCqA5BVa4zN9L7Redaz0nTcaas7lNSLVUpDAOYXADvffZ0b3vnAPTAoGADzenP6VQRb9qxY+2af7zlbfLHRk35xBaInnZyrcmeaXs/0MssCAqLTqA27xGraJ7uvjrPEchXK4STl+UD2IxtEoRamopn3ZRzB1xpBVjWST85NUbOY+aHJOTwfEMVHH3wsiUucxdLq63UFo1RGtpfb6yftTnXqtPxGEIbYPyylE=";
//internal static string MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEu3hCLeQXcWmi+wXaaM0HSJkRxFb/lQl8GU69UiRmf0zI4Xh7/cPBXdm/CWS5SzzTRCQJh23/USxPuyB//wWHgkqUASj12B4mMdx+/KGFmgrAFCy4CBhE2+O4AaiKWuZ8Gpmv+NUseNhy/kyzdNrmqikffr1vM7q1emJ8Y9OihGIAB8toT6b9I/iL93yLUXNLe0ELIIJ1+mmr7j0GvAMZQKL2IrfJ4MCRqg0Ioj2Ql1ckrkmIjgMKZQ1ryzrzcllq5YeaOM8fM3gff9Ntn06N2fsbpZFnGzokNpZkBX8wsLwOHBLM25RxvMPWH9UwWBXkklNHe57PN9G7qtvMMOnPAgMBAAECggEAMeTNuhMDbwKfZOs+78Z2gStjTsM5wTYeIrAUbSVg//G3Gpc8RE32kJrpt259chTnxzjX3ubO+dqvX0U5F90onNZpbaHhrn/yHYO1xSrzF/waT96N/NpotUYDOc6J3RTysXTZl2yHO/EmC/v8neK8BZYQOeGdz48SAiaYxa1XpjZ0QAUX3rCjf9qjkTKux0TZTBk67PcIb+Gwqk4nRWhc0i3yXW4Xw8Z8UJeABgtsOZ16Nv95K7jA836sF+gf4chLGDl8J9Y7Ciz/FpJPksa6Ysoo6jMW9WkggGsNEOwTK6SfYWqIER+NozWG5F4jOlAmdc3zlteOdM3Z9kiYHdlsmQKBgQD78RpE3AEFIC6dgO5isbBeSRNZJUHOp/H49cJgwtk3DiDuN/hLh8Lw3priFiOSlioFRmv6VkQVRQJ38pCbXacc04d34joNy0zXVWFtaaZlureRz74tTbi9Dp1x123NIJ/i/jiJLBdrXfmkNaQpyzfsrIC1vrFpaA5RWKcooZrgzQKBgQDH5rUX9q6tcB/UE3zNfJsNE/yw1QFSAIzcKE3vxWifjbURdVJXpvNoXWkTivwxEbhBDpyAhtUngpN+Ac/3ZP88hY21v+AHmgq9/65z++Wbptg9JfPpGti7kA132D76OfaGca3C1kt1A4Kl+177P52Nx9uAWbANEw+02Dd147pFCwKBgAbzT9Y2e5C4opCVzf3LCSKQwYfkDzy0RWio3wPsXDG4og/wW1k6FZavjXZPRgv1OJOMrc3qM1ai4L6OYo7mtoWFEGeuRgu7YBNQt69dCsojrIzJPmXhjwcoMA/D8bOHAuIwQT8HiF3d6dUt5amBgbl1yNc6u4o85Kg52eK1EqDBAoGARmbZNpRZVpnbi8xFMvWEgemdIAYUjfXFpi/Hqv8iZrb4oypnkpkotoPXYtubEAkGlFr6AUX7Qgv5t/IZdS6ruXvruavW0baNu/aVUSHQ7q2nEHoSWfFrjTshkyiknWnWiej1Yl4oexB+bciG3gO8kFdn1d9AYoppCK7xcWJ/kpsCgYEA2se5A7Oa6JsWmpil+kRSyijoynEnC4IGVEIzboYcBxlyxfpHtwS2zOdXkhIpjd2cqg08BGFcSxot8CaxCOBcRJsI+N+3lok6VffaZDRjttr+NdY/qc7OCmVCx1lJlJ2+WL0Zitv1DV84WqUY2XpQOHvvcmGfuEXtyfkxD1rSJUE=";
internal static string QR_CODE_MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCER3xnjjYb4na9yf49wJIE/ykXuk9q4QKYJk/+LQuVUmf3HYUmVvngB2jwrMWr0x+Asg3XFyoctmZBDci3mgElQW6u1jNBUEUqbU+9oHT496D1g7KRVZZOWqaSZmFkPYf6Kr+uZgUtQEHeKiTuG3wIR2COSzuEsBvW8Q0RobHiCXXVmKpfpkB2cktwHzfu4sgTNrnvru5EDRFUMk72sMa5M9gasmY8XIVF711LWFreqVTKZPTuMTTIbZuVUd+vADWB7Y48IIEEsdIbbH8qwnTrEIvvWEJkhRYMpPvioLzqlepXZ8xNPD3Hu/SxHRRS+rQHiQvIpkqUK0JxOG+JpD8NAgMBAAECggEAczzrzjOARA6or3K3wQhwrVW1cOxon43i+rX13lNT0gR2ejwHcX04Nsl9zJ5XnvdQbIexsv6FO3pT3rypbfoGoXQ9fqcxA+dwOiP84hBVl0fzu6+98wsC5MPodYYntnI8cd6oGsDaJa/jMi64+Y6MIZI9NfmoolHiDwD1B7U8CNRAZR4XSTd22kmaF222cipgjpxrJozsJWSlwXsaw6ZEYsSraP76ZU1GiKZPKayLxQtTmHmqL/1SgVb2gBnW2FpTTdeanxjhnvE1Ikg28bfZPpA8c0jItjNpFvmyaf/3C2pKJBYKkAuyQSjMexS6anBX4G4LRfcDzrJzY12eHWrb6QKBgQC5iOg9JqxOmDCBN4I7hd3ax9bFPKQe7NO1Hs2cgyOCp3Ph/yK8/OIlGSBDHVlXPOpq80OwmOGU5AXJTBRpgDLC7gF9gphd9l+sIkHtQ5+mWld+jr7qFlW95y+H51PDk0nSg2GIkyID3t3G0NBooDM/XaXyndljBOQwMVpVBdqAWwKBgQC2hKwRCb2C6ZAssw8Cq5LWR2psFONbqAmA6aO9GgFKF0mBsyq0sstz/nE/XBURc+zOnYr72WFMMaoVkNPTxwqXNcHu4vbyepfBSWBDSJxndlMKXcld5+GZCyl9nUFLHGjYbNUsMgahaR5l9eNiMbHzKHdRNw7Trf2gLnvWlH/atwKBgHaP3pj1VbcD2js41ahj61obyktQbTC19rQPcyVJSC/+AjexaumKUJmUbOF2p9jvvH2L5v27NKyI6omwbHreyZF3tswV4HhrMMg3PBn61NLheHgPkEDW9QPd8KnQUd7xCIPWIUW9gEco7GBYoFW7ygP8PEfGR1zXi1qgrzEWBINxAoGBAIe3h6rzrzOVMVvLmbHGmt0zJXNQ5O7WuJpfIR4QJD1Pq50B+RN8j8Skwtj2Q8RCiyfoBdzX+32IwIxgsOKc8scVdiuIIVCU0Bst0KK3b3WPipf+vSlSr3H51tRNBqwvZ9bmtmyyljOX0r7GZFoz0bqZsH93jVLh4eImLneU3K1pAoGAMUCNCHIpMSd+d5ewR9VxXY1DjGHvIC98EdsjL0S7QcVrWb9mh6Br5G6zvlIJcMhIaQm3C1ETLaHG+K9XRrA+HcJo1ApeMT7MgBmIC+cG1aepZREDruNI3G8r4bDS6pHSDKk+Iu8shpEUurxZCzjBX2n5OeMJx+xDgYUq5H4Bn5I="; internal static string QR_CODE_MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCER3xnjjYb4na9yf49wJIE/ykXuk9q4QKYJk/+LQuVUmf3HYUmVvngB2jwrMWr0x+Asg3XFyoctmZBDci3mgElQW6u1jNBUEUqbU+9oHT496D1g7KRVZZOWqaSZmFkPYf6Kr+uZgUtQEHeKiTuG3wIR2COSzuEsBvW8Q0RobHiCXXVmKpfpkB2cktwHzfu4sgTNrnvru5EDRFUMk72sMa5M9gasmY8XIVF711LWFreqVTKZPTuMTTIbZuVUd+vADWB7Y48IIEEsdIbbH8qwnTrEIvvWEJkhRYMpPvioLzqlepXZ8xNPD3Hu/SxHRRS+rQHiQvIpkqUK0JxOG+JpD8NAgMBAAECggEAczzrzjOARA6or3K3wQhwrVW1cOxon43i+rX13lNT0gR2ejwHcX04Nsl9zJ5XnvdQbIexsv6FO3pT3rypbfoGoXQ9fqcxA+dwOiP84hBVl0fzu6+98wsC5MPodYYntnI8cd6oGsDaJa/jMi64+Y6MIZI9NfmoolHiDwD1B7U8CNRAZR4XSTd22kmaF222cipgjpxrJozsJWSlwXsaw6ZEYsSraP76ZU1GiKZPKayLxQtTmHmqL/1SgVb2gBnW2FpTTdeanxjhnvE1Ikg28bfZPpA8c0jItjNpFvmyaf/3C2pKJBYKkAuyQSjMexS6anBX4G4LRfcDzrJzY12eHWrb6QKBgQC5iOg9JqxOmDCBN4I7hd3ax9bFPKQe7NO1Hs2cgyOCp3Ph/yK8/OIlGSBDHVlXPOpq80OwmOGU5AXJTBRpgDLC7gF9gphd9l+sIkHtQ5+mWld+jr7qFlW95y+H51PDk0nSg2GIkyID3t3G0NBooDM/XaXyndljBOQwMVpVBdqAWwKBgQC2hKwRCb2C6ZAssw8Cq5LWR2psFONbqAmA6aO9GgFKF0mBsyq0sstz/nE/XBURc+zOnYr72WFMMaoVkNPTxwqXNcHu4vbyepfBSWBDSJxndlMKXcld5+GZCyl9nUFLHGjYbNUsMgahaR5l9eNiMbHzKHdRNw7Trf2gLnvWlH/atwKBgHaP3pj1VbcD2js41ahj61obyktQbTC19rQPcyVJSC/+AjexaumKUJmUbOF2p9jvvH2L5v27NKyI6omwbHreyZF3tswV4HhrMMg3PBn61NLheHgPkEDW9QPd8KnQUd7xCIPWIUW9gEco7GBYoFW7ygP8PEfGR1zXi1qgrzEWBINxAoGBAIe3h6rzrzOVMVvLmbHGmt0zJXNQ5O7WuJpfIR4QJD1Pq50B+RN8j8Skwtj2Q8RCiyfoBdzX+32IwIxgsOKc8scVdiuIIVCU0Bst0KK3b3WPipf+vSlSr3H51tRNBqwvZ9bmtmyyljOX0r7GZFoz0bqZsH93jVLh4eImLneU3K1pAoGAMUCNCHIpMSd+d5ewR9VxXY1DjGHvIC98EdsjL0S7QcVrWb9mh6Br5G6zvlIJcMhIaQm3C1ETLaHG+K9XRrA+HcJo1ApeMT7MgBmIC+cG1aepZREDruNI3G8r4bDS6pHSDKk+Iu8shpEUurxZCzjBX2n5OeMJx+xDgYUq5H4Bn5I=";
/// <summary> /// <summary>
/// APIGW_PUBLIC_KEY:网关公钥 /// APIGW_PUBLIC_KEY:网关公钥
/// </summary> /// </summary>
internal static string APIGW_PUBLIC_KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSJrF8T/5rKB4NnwMjIxUer+ELf1PQXO2GSdZ/fvuQCclOR9tBlNWL4jFOftebeL+bvMVOJ+JHm/aSes1AN8YNIDGiFUpF6aDkSCaLynDdjK/mQTWhSNa2fO0GGO+ywOBTdYUjVjVtzJ48bbyG3NSylf1EdnBWnMpFa8qpXJXR4ELpVpMkPDC+93HBAlxEgUjhcIJlP5VdKIiudsmhE2T07qtpIQSuE5hntXP6X6GKJReCk+yek2QJITvIBq3cHPw8KDsHHCs7MaR81KI3onJRWyqFtTfVYTiKsd9EcYSxv+Gx5MOF8B/P4iJCD8uzx0FrqoB3k5OYGcz4tXs+h+9wIDAQAB"; internal static string APIGW_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4gZgdtCHtPNxMFYFLC1/8CnGKuMxph+E9gnC0VQczh0rdp8zNoBEKD0c6J77fhyIfUetzRmjQbE3kAs4L6Us1bhHzRaAKAP5hdAyMcb6XqET6WLxN/kA3jvPqteG2yXLnGtY+SxUGNmptluAC2AdvRECg4ui1sLNC/MWpsLzXDu5yIBMqnbHOig4cJOdCgVk+vEFi92niVAAdOfsbqMhT/nmWkFfFH2EbSxsN5+ihZ39VQJ1CTG2HBMUEvbjr0aHgn1rcMNyRAx2jM+XhoyZe/BIyTV2zI0xH0sc1d3jfmYn733/gmjZ01ikiG0eqBZJMEIJYBk/7M6h9dv+Ao61cQIDAQAB";
//internal static string APIGW_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSJrF8T/5rKB4NnwMjIxUer+ELf1PQXO2GSdZ/fvuQCclOR9tBlNWL4jFOftebeL+bvMVOJ+JHm/aSes1AN8YNIDGiFUpF6aDkSCaLynDdjK/mQTWhSNa2fO0GGO+ywOBTdYUjVjVtzJ48bbyG3NSylf1EdnBWnMpFa8qpXJXR4ELpVpMkPDC+93HBAlxEgUjhcIJlP5VdKIiudsmhE2T07qtpIQSuE5hntXP6X6GKJReCk+yek2QJITvIBq3cHPw8KDsHHCs7MaR81KI3onJRWyqFtTfVYTiKsd9EcYSxv+Gx5MOF8B/P4iJCD8uzx0FrqoB3k5OYGcz4tXs+h+9wIDAQAB";
internal static string QR_CODE_APIGW_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSJrF8T/5rKB4NnwMjIxUer+ELf1PQXO2GSdZ/fvuQCclOR9tBlNWL4jFOftebeL+bvMVOJ+JHm/aSes1AN8YNIDGiFUpF6aDkSCaLynDdjK/mQTWhSNa2fO0GGO+ywOBTdYUjVjVtzJ48bbyG3NSylf1EdnBWnMpFa8qpXJXR4ELpVpMkPDC+93HBAlxEgUjhcIJlP5VdKIiudsmhE2T07qtpIQSuE5hntXP6X6GKJReCk+yek2QJITvIBq3cHPw8KDsHHCs7MaR81KI3onJRWyqFtTfVYTiKsd9EcYSxv+Gx5MOF8B/P4iJCD8uzx0FrqoB3k5OYGcz4tXs+h+9wIDAQAB"; internal static string QR_CODE_APIGW_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSJrF8T/5rKB4NnwMjIxUer+ELf1PQXO2GSdZ/fvuQCclOR9tBlNWL4jFOftebeL+bvMVOJ+JHm/aSes1AN8YNIDGiFUpF6aDkSCaLynDdjK/mQTWhSNa2fO0GGO+ywOBTdYUjVjVtzJ48bbyG3NSylf1EdnBWnMpFa8qpXJXR4ELpVpMkPDC+93HBAlxEgUjhcIJlP5VdKIiudsmhE2T07qtpIQSuE5hntXP6X6GKJReCk+yek2QJITvIBq3cHPw8KDsHHCs7MaR81KI3onJRWyqFtTfVYTiKsd9EcYSxv+Gx5MOF8B/P4iJCD8uzx0FrqoB3k5OYGcz4tXs+h+9wIDAQAB";
/// <summary> /// <summary>
......
using Com.Bocom.OpenApi.Utils; using Com.Bocom.OpenApi.Utils;
using Kivii; using Kivii;
using Kivii.Finances.Entities; using Kivii.Finances.Entities;
using Kivii.Finances;
using Kivii.Finances.Transforms;
using Kivii.Linq;
using Kivii.Text; using Kivii.Text;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using static Com.Bocom.OpenApi.AddContractOrderRequestV2.AddContractOrderRequestV2Biz; using static Com.Bocom.OpenApi.AddContractOrderRequestV2.AddContractOrderRequestV2Biz;
using static System.Net.Mime.MediaTypeNames;
using System.Reflection;
using System.Web.Caching;
namespace Com.Bocom.OpenApi namespace Com.Bocom.OpenApi
{ {
...@@ -75,7 +82,7 @@ namespace Com.Bocom.OpenApi ...@@ -75,7 +82,7 @@ namespace Com.Bocom.OpenApi
public static DelContractOrderResponseV1 RequestDelContractOrderResponseV1(Settlement settlement, out string err) public static DelContractOrderResponseV1 RequestDelContractOrderResponseV1(Settlement settlement, out string err)
{ {
if (settlement == null || settlement.Metadata.IsNullOrEmpty() || settlement.Metadata["BocomBillId"].IsNullOrEmpty()) if (settlement == null || settlement.Metadata.IsNullOrEmpty() || !settlement.Metadata.ContainsKey("BocomBillId"))
{ {
err = string.Empty; err = string.Empty;
return null; return null;
...@@ -110,5 +117,79 @@ namespace Com.Bocom.OpenApi ...@@ -110,5 +117,79 @@ namespace Com.Bocom.OpenApi
return null; return null;
} }
} }
/// <summary>
/// 智慧记账自动核销结算
/// </summary>
/// <param name="payments"></param>
/// <param name="settlement"></param>
/// <param name="payingMethod"></param>
/// <param name="conn"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static bool AutoPay(List<Payment> payments, Settlement settlement, List<PayingMethod> payingMethods, IDbConnection conn = null)
{
payments.ThrowIfNullOrEmpty("请传入付款信息!");
settlement.ThrowIfNull("请传入结算信息!");
if (payments.Exists(o => o.Type != PaymentType.Split)) throw new Exception("付款类型不支持!");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null)
{
conn = KiviiContext.GetOpenedDbConnection<Payment>();
}
var accountBiz = settlement.Currency.GetBizAccount();
var dynamicSplitPayments = new List<Payment>();
var allPays = new List<Pay>();
var allAccountDetails = new List<AccountDetail>();
foreach (var payingMethod in payingMethods)
{
var amount = payingMethod.Amount;
var payment = payments.FirstOrDefault(o => o.Kvid == payingMethod.Kvid);
(payment == null).ThrowIfTrue("未找到付款数据!");
if (payment.Amount - payment.AmountUsed < amount) amount = payment.Amount - payment.AmountUsed;
(payingMethod.Amount > 0 && payingMethod.Amount > payment.Amount - payment.AmountUsed).ThrowIfTrue($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
var settlements = new List<Settlement>();
settlements.Add(settlement);
var dynamicPayPayment = settlements.Paying(payment, accountBiz, out var pays, out var accountDetail, amount, payingMethod.Remark);
allPays.AddRange(pays);
dynamicSplitPayments.Add(dynamicPayPayment);
allAccountDetails.Add(accountDetail);
}
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
if (useTransaction) trans = conn.OpenTransaction();
try
{
foreach (var item in allPays)
{
conn.Insert(item);
}
foreach (var item in dynamicSplitPayments)
{
item.SerialNumber = item.GetSubSerialNumber(conn);
conn.Insert(item);//创建DynamicSplitPayment
}
allAccountDetails.ForEach(o => o.Insert(conn));//创建账户明细
foreach (var item in payments)
{
item.RecalculateAmountUsed(conn);
if (item.Type == PaymentType.Split) item.RecalculateAssignAmount(conn);
}
if (!settlement.OnlyProperties.IsNullOrEmpty()) conn.UpdateOnly(settlement);//更新了Paykvid和AmountPayment
trans?.Commit();
return true;
}
catch (Exception ex)
{
trans?.Rollback();
throw ex;
}
}
} }
} }
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
<Compile Include="Configs.cs" /> <Compile Include="Configs.cs" />
<Compile Include="Extension.cs" /> <Compile Include="Extension.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RestfulWriteOff.cs" />
<Compile Include="Sdk\BizContent.cs" /> <Compile Include="Sdk\BizContent.cs" />
<Compile Include="Sdk\BocomApiException.cs" /> <Compile Include="Sdk\BocomApiException.cs" />
<Compile Include="Sdk\BocomDecryptResponse.cs" /> <Compile Include="Sdk\BocomDecryptResponse.cs" />
...@@ -123,6 +124,7 @@ ...@@ -123,6 +124,7 @@
<Compile Include="Sdk\utils\TrustAllCertificatePolicy.cs" /> <Compile Include="Sdk\utils\TrustAllCertificatePolicy.cs" />
<Compile Include="Sdk\utils\WebUtils.cs" /> <Compile Include="Sdk\utils\WebUtils.cs" />
<Compile Include="Transforms\RestfulTest.cs" /> <Compile Include="Transforms\RestfulTest.cs" />
<Compile Include="WriteOffJob.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
......
using Com.Bocom.OpenApi.Utils;
using Com.Bocom.OpenApi;
using Kivii.Web;
using Kivii;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kivii.Linq;
namespace Njzj.Bocoms.Openapis.Transforms
{
public class WriteOffResultNotifyCallBack : RestfulExecution<WriteOffResultNotify>
{
public string biz_content { get; set; }
public string msg_id { get; set; }
public string timestamp { get; set; }
public string encrypt_key { get; set; }
public string sign { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------------------------------");
Console.WriteLine("---------------------------------------------------------------------------------------------------------------------------------------------");
var rtns = new RestfulExecutionResponse<WriteOffResultNotify>();
rtns.Results = new List<WriteOffResultNotify>();
if (biz_content.IsNullOrEmpty()) return rtns;
if (msg_id.IsNullOrEmpty()) return rtns;
if (timestamp.IsNullOrEmpty()) return rtns;
if (encrypt_key.IsNullOrEmpty()) return rtns;
if (sign.IsNullOrEmpty()) return rtns;
var dic = new Dictionary<string, string>();
dic.Add("biz_content", biz_content);
dic.Add("msg_id", msg_id);
dic.Add("timestamp", timestamp);
dic.Add("encrypt_key", encrypt_key);
dic.Add("sign", sign);
Console.WriteLine("------------------------------------WriteOffResultNotifyCallBack-----------------------------------------");
Console.WriteLine("------------------------------------Start-----------------------------------------");
try
{
var result = ApiUtils.ParseCommunicationJsonWithBocomSign(dic, "utf-8", Configs.MY_PRIVATE_KEY, Configs.APIGW_PUBLIC_KEY);
var conn = KiviiContext.GetOpenedDbConnection<WriteOffResultNotify>();
conn.InitEntityType<EntityLog<WriteOffResultNotify>>();
//var log = conn.Single<EntityLog<WriteOffResultNotify>>(o => true);
//if (log == null) return rtns;
result.BillId = result.biz_content.bill_id;
result.BizKvid = Guid.Parse(result.biz_content.cont_id);
conn.Insert(result);
var resp = "{\"rsp_code\":\"0\",\"biz_state\":\"S\",\"rsp_msg\":\"核销处理成功\"}";
//var rspBizContent = "{\"rsp_head\":{\"response_msg\":\"非白名单客户\",\"response_code\":\"CIPP0004MT0017\"},\"rsp_body\":{\"context_no\":\"P21201026566300000019\",\"account_exist_flag\":\"EF00\"}";
var rsp = ApiUtils.SignRspBizContent(resp, result.encrypt_key, Configs.MY_PRIVATE_KEY);
rtns.Results.Add(result);
return rsp;
}
catch (Exception ex)
{
throw ex;
}
finally
{
Console.WriteLine("------------------------------------WriteOffResultNotifyCallBack-----------------------------------------");
Console.WriteLine("------------------------------------End-----------------------------------------");
Console.WriteLine("-----------------------------------------------------------------------------------------------------");
Console.WriteLine("-----------------------------------------------------------------------------------------------------");
}
}
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class WriteOffResultNotifyQuery : RestfulQuery<WriteOffResultNotify>
{
}
}
...@@ -407,73 +407,6 @@ namespace Njzj.Bocoms.Openapis.Transforms ...@@ -407,73 +407,6 @@ namespace Njzj.Bocoms.Openapis.Transforms
} }
} }
public class WriteOffResultNotifyCallBack : RestfulExecution<WriteOffResultNotify>
{
public string biz_content { get; set; }
public string msg_id { get; set; }
public string timestamp { get; set; }
public string encrypt_key { get; set; }
public string sign { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
//var ori = "{\"biz_content\":\"j9nVLg7i45oHvnMC4l4JUoK0gERudB+iwD5r77jBlHiDQuIsch3jnl2K8Xhx19ugcpPrMwLcVTxsZLGjM1ueGeE+WpxDtXIvcAEpwPyNrSgOLChdq5iWcpXBNCahPPOu3zp9cjZse29g20cMmpexSMZgodT5D+66DU9LTi0CsbpsZg0HhEM2tLnDUhs+GnS8SoLbqUXFgyhZ8hdEirmJR6g+3OhN9GuZj2+Yy8U4cicBT8T1swWtSvvMnfBaCit8PgJsELy+NhvXOibSt8sB3rubIdB+8/MCzbxnwWLMn7xspx0trQmfviwiUKktdlkNwjqRYGNha8Z2544xdvhTHGEQGe/nr2bFgnVJdh8CmtpuuzaJBB8PCbjRlAhwCVJFNsCq4R+/SFGPU5TuaEDJy6Oqa7ALvywWekTEnDL+LmMZtxj07om3CRFER0FWBLjd\",\"msg_id\":\"c37170fb8e5b4d7b9374fae6b16334f9\",\"timestamp\":\"2020-10-26 15:11:54\",\"encrypt_key\":\"UgjDtW1VUP9pz4hMu9r7/dJ8ciQ3mEMRvdMpMlVLOWC9eF+otpUh2aN9nRQMn0KxXDnM7+ZTXmTDOwgsBsARqWt6R1i3xkFq5Hz8XvZAPpqMniR9AgNLzgWEscsAChjgAuhkmN6XVO3AKeqxGLo82NoDh5gGJ0yzVg2uS3hQRSLhiWkmY5f1nT5M4Hp3h1hPXL9e1bUBY/Zhs1IzWL2r7p5BAaQjUsCgt+CggKl8oa6zXfKiaTG9Z+l7tDa1lLqn5Hbkl83TMLEdebmzjv38X+lJCHO3lwvxKdaHr091nQUxXLH7p5hyoRBEieoyd5jpcwabB/ChTsKvHWiixjf1hw==\",\"sign\":\"EWqfUedqP2LdPFH7ekT6klCu5VqVEyWMIrOUyRLXhRIqC856qSVrq1LPNKIjpip53cT1J7V5GBCTv77HwXA7jcoYWIUK0GDIAYIDk5LcLOtXcVQKJ9aIqoUOS8NHIYSlx3wt41GoSsVZgWg8o4c5+qh2BxO1QkG/LrvsXSv5hBDssAztfWvwu2bcitSRPBFAuAyBs5ETLjcfSYFP7fPN9g1FG93McuvzPqJVHWEnKW4EfaLXDeI0FUNAgmH9xCcjYw7pbbxZTl3QdNrhSTOrBHnI0XZFNp9woF9YpyaSfKVCmtaL27M2RnLxyOnjffS9qSJP64xzpI9DRrsw0/EQAA==\"}";
//var MY_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCER3xnjjYb4na9yf49wJIE/ykXuk9q4QKYJk/+LQuVUmf3HYUmVvngB2jwrMWr0x+Asg3XFyoctmZBDci3mgElQW6u1jNBUEUqbU+9oHT496D1g7KRVZZOWqaSZmFkPYf6Kr+uZgUtQEHeKiTuG3wIR2COSzuEsBvW8Q0RobHiCXXVmKpfpkB2cktwHzfu4sgTNrnvru5EDRFUMk72sMa5M9gasmY8XIVF711LWFreqVTKZPTuMTTIbZuVUd+vADWB7Y48IIEEsdIbbH8qwnTrEIvvWEJkhRYMpPvioLzqlepXZ8xNPD3Hu/SxHRRS+rQHiQvIpkqUK0JxOG+JpD8NAgMBAAECggEAczzrzjOARA6or3K3wQhwrVW1cOxon43i+rX13lNT0gR2ejwHcX04Nsl9zJ5XnvdQbIexsv6FO3pT3rypbfoGoXQ9fqcxA+dwOiP84hBVl0fzu6+98wsC5MPodYYntnI8cd6oGsDaJa/jMi64+Y6MIZI9NfmoolHiDwD1B7U8CNRAZR4XSTd22kmaF222cipgjpxrJozsJWSlwXsaw6ZEYsSraP76ZU1GiKZPKayLxQtTmHmqL/1SgVb2gBnW2FpTTdeanxjhnvE1Ikg28bfZPpA8c0jItjNpFvmyaf/3C2pKJBYKkAuyQSjMexS6anBX4G4LRfcDzrJzY12eHWrb6QKBgQC5iOg9JqxOmDCBN4I7hd3ax9bFPKQe7NO1Hs2cgyOCp3Ph/yK8/OIlGSBDHVlXPOpq80OwmOGU5AXJTBRpgDLC7gF9gphd9l+sIkHtQ5+mWld+jr7qFlW95y+H51PDk0nSg2GIkyID3t3G0NBooDM/XaXyndljBOQwMVpVBdqAWwKBgQC2hKwRCb2C6ZAssw8Cq5LWR2psFONbqAmA6aO9GgFKF0mBsyq0sstz/nE/XBURc+zOnYr72WFMMaoVkNPTxwqXNcHu4vbyepfBSWBDSJxndlMKXcld5+GZCyl9nUFLHGjYbNUsMgahaR5l9eNiMbHzKHdRNw7Trf2gLnvWlH/atwKBgHaP3pj1VbcD2js41ahj61obyktQbTC19rQPcyVJSC/+AjexaumKUJmUbOF2p9jvvH2L5v27NKyI6omwbHreyZF3tswV4HhrMMg3PBn61NLheHgPkEDW9QPd8KnQUd7xCIPWIUW9gEco7GBYoFW7ygP8PEfGR1zXi1qgrzEWBINxAoGBAIe3h6rzrzOVMVvLmbHGmt0zJXNQ5O7WuJpfIR4QJD1Pq50B+RN8j8Skwtj2Q8RCiyfoBdzX+32IwIxgsOKc8scVdiuIIVCU0Bst0KK3b3WPipf+vSlSr3H51tRNBqwvZ9bmtmyyljOX0r7GZFoz0bqZsH93jVLh4eImLneU3K1pAoGAMUCNCHIpMSd+d5ewR9VxXY1DjGHvIC98EdsjL0S7QcVrWb9mh6Br5G6zvlIJcMhIaQm3C1ETLaHG+K9XRrA+HcJo1ApeMT7MgBmIC+cG1aepZREDruNI3G8r4bDS6pHSDKk+Iu8shpEUurxZCzjBX2n5OeMJx+xDgYUq5H4Bn5I=";
//var APIGW_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxSJrF8T/5rKB4NnwMjIxUer+ELf1PQXO2GSdZ/fvuQCclOR9tBlNWL4jFOftebeL+bvMVOJ+JHm/aSes1AN8YNIDGiFUpF6aDkSCaLynDdjK/mQTWhSNa2fO0GGO+ywOBTdYUjVjVtzJ48bbyG3NSylf1EdnBWnMpFa8qpXJXR4ELpVpMkPDC+93HBAlxEgUjhcIJlP5VdKIiudsmhE2T07qtpIQSuE5hntXP6X6GKJReCk+yek2QJITvIBq3cHPw8KDsHHCs7MaR81KI3onJRWyqFtTfVYTiKsd9EcYSxv+Gx5MOF8B/P4iJCD8uzx0FrqoB3k5OYGcz4tXs+h+9wIDAQAB";
//Console.WriteLine("---------------------------------------------------------------------------------------------------------------------------------------------");
//Console.WriteLine("---------------------------------------------------------------------------------------------------------------------------------------------");
var rtns = new RestfulExecutionResponse<WriteOffResultNotify>();
rtns.Results = new List<WriteOffResultNotify>();
if (biz_content.IsNullOrEmpty()) return rtns;
if (msg_id.IsNullOrEmpty()) return rtns;
if (timestamp.IsNullOrEmpty()) return rtns;
if (encrypt_key.IsNullOrEmpty()) return rtns;
if (sign.IsNullOrEmpty()) return rtns;
var dic = new Dictionary<string, string>();
dic.Add("biz_content", biz_content);
dic.Add("msg_id", msg_id);
dic.Add("timestamp", timestamp);
dic.Add("encrypt_key", encrypt_key);
dic.Add("sign", sign);
Console.WriteLine("------------------------------------WriteOffResultNotifyCallBack-----------------------------------------");
Console.WriteLine("------------------------------------Start-----------------------------------------");
try
{
var result = ApiUtils.ParseCommunicationJsonWithBocomSign(dic, "utf-8", Configs.MY_PRIVATE_KEY, Configs.APIGW_PUBLIC_KEY);
var conn = KiviiContext.GetOpenedDbConnection<WriteOffResultNotify>();
conn.InitEntityType<EntityLog<WriteOffResultNotify>>();
//var log = conn.Single<EntityLog<WriteOffResultNotify>>(o => true);
//if (log == null) return rtns;
result.BillId = result.biz_content.bill_id;
result.BizKvid= Guid.Parse(result.biz_content.cont_id);
conn.Insert(result);
var resp = "{\"rsp_code\":\"0\",\"biz_state\":\"S\",\"rsp_msg\":\"核销处理成功\"}";
//var rspBizContent = "{\"rsp_head\":{\"response_msg\":\"非白名单客户\",\"response_code\":\"CIPP0004MT0017\"},\"rsp_body\":{\"context_no\":\"P21201026566300000019\",\"account_exist_flag\":\"EF00\"}";
var rsp = ApiUtils.SignRspBizContent(resp, result.encrypt_key, Configs.MY_PRIVATE_KEY);
rtns.Results.Add(result);
return rsp;
}
catch (Exception ex)
{
throw ex;
}
finally
{
Console.WriteLine("------------------------------------WriteOffResultNotifyCallBack-----------------------------------------");
Console.WriteLine("------------------------------------End-----------------------------------------");
Console.WriteLine("-----------------------------------------------------------------------------------------------------");
Console.WriteLine("-----------------------------------------------------------------------------------------------------");
}
}
}
public class WriteOffResultNotifyCallBack2 : RestfulExecution<WriteOffResultNotify> public class WriteOffResultNotifyCallBack2 : RestfulExecution<WriteOffResultNotify>
{ {
public override object OnExecution(IRequest req, IResponse res) public override object OnExecution(IRequest req, IResponse res)
......
using Com.Bocom.OpenApi;
using Kivii;
using Kivii.Finances.Entities;
using Kivii.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Njzj.Bocoms.Openapis
{
public class WriteOffJob : IJob
{
public string Name => "智慧记账账单核销";
public string Description => "智慧记账账单自动核销";
public IJobContext TaskContext { get; set; }
public void Dispose()
{
}
public bool Execution()
{
#region 获取通知,且过滤哪些通知已经作废或者匹配不上的
var connE = KiviiContext.GetOpenedDbConnection<WriteOffResultNotify>();
var query = connE.From<WriteOffResultNotify>();
query.Where(o => o.Status != int.MaxValue);
var writeOffs = connE.Select(query);
if (writeOffs.IsNullOrEmpty())
{
TaskContext.Message = "暂无核销通知需处理!";
return true;
}
var bizKvids = writeOffs.ConvertAll(o => o.BizKvid);
if (bizKvids.IsNullOrEmpty())
{
var updateWriteOffs=connE.From<WriteOffResultNotify>();
updateWriteOffs = updateWriteOffs.Update(o => o.Status);
updateWriteOffs = updateWriteOffs.Where(o => Sql.In(o.BizKvid, bizKvids));
connE.UpdateOnly(new WriteOffResultNotify { Status = int.MaxValue }, updateWriteOffs);
TaskContext.Message = "暂无核销通知需处理!";
return true;
}
var connF = KiviiContext.GetOpenedDbConnection<Settlement>();
var settlements = connF.Select<Settlement>(o => Sql.In(o.Kvid, bizKvids));
if (settlements.IsNullOrEmpty())
{
var updateWriteOffs = connE.From<WriteOffResultNotify>();
updateWriteOffs = updateWriteOffs.Update(o => o.Status);
updateWriteOffs = updateWriteOffs.Where(o => Sql.In(o.BizKvid, bizKvids));
connE.UpdateOnly(new WriteOffResultNotify { Status = int.MaxValue }, updateWriteOffs);
TaskContext.Message = "暂无核销通知需处理!";
return true;
}
var preSettlements = settlements.Where(o => o.AmountPayment == 0).ToList();//需要进行匹配核销的结算
var notMatchBizKvids=new List<Guid>();
foreach (var kvid in bizKvids)
{
if (!preSettlements.Exists(o => o.Kvid == kvid)) notMatchBizKvids.Add(kvid);
}
if (!notMatchBizKvids.IsNullOrEmpty())
{
var updateWriteOffs = connE.From<WriteOffResultNotify>();
updateWriteOffs = updateWriteOffs.Update(o => o.Status);
updateWriteOffs = updateWriteOffs.Where(o => Sql.In(o.BizKvid, notMatchBizKvids));
connE.UpdateOnly(new WriteOffResultNotify { Status = int.MaxValue }, updateWriteOffs);
}
writeOffs.RemoveAll(o => Sql.In(o.BizKvid, notMatchBizKvids));
var matchWriteOffs = new List<WriteOffResultNotify>();
var payments = new List<Payment>();
foreach (var item in writeOffs)
{
if (item.biz_content.bill_wo_state != "03")
{
TaskContext.Message = $"Error:10001,[{item.BillId}]账单核销状态不是03-全额核销!";
continue;
}
bool matched = false;
foreach (var pay in item.biz_content.pay_detail_list)
{
var split = pay.vch_no.Split('-');
if (split.Length != 3)
{
TaskContext.Message = $"Error:10002,[{item.BillId}]vch_no号格式不符合Split规则!";
continue;
}
var serialNumber = split[1];
if (serialNumber.IsNullOrEmpty())
{
TaskContext.Message = $"Error:10003,[{item.BillId}]vch_no截取的流水号是空!";
continue;
}
var payment = connF.Single<Payment>(o => o.SerialNumber == serialNumber && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Bank);
if (payment == null)
{
TaskContext.Message = $"Error:20001,[{item.BillId}]未找到此流水号[{serialNumber}]的到账信息!";
continue;
}
payments.Add(payment);
matched = true;
}
if (matched) matchWriteOffs.Add(item);
}
if (matchWriteOffs.IsNullOrEmpty())
{
TaskContext.Message = $"{writeOffs.Count}条待处理通知,尚未匹配到流水信息!";
return true;
}
#endregion
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == connF)
{
//两个连接是同一个,缓存生效,不做任何操作
}
else if (connE.ConnectionString == connF.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connF.Close();
connF = connE;
}
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((connF is LinqConnection) && (connF as LinqConnection).Transaction == null)
{
tranF = connF.OpenTransaction();
}
#endregion
try
{
foreach (var settlement in preSettlements)
{
var writeOff = matchWriteOffs.FirstOrDefault(o => o.BizKvid == settlement.Kvid);
if (writeOff == null)
{
TaskContext.Message = $"Error:10004,[{settlement.Kvid}]未找到此账单通知信息!";
continue;
}
var currentPayments = new List<Payment>();
var payingMethods = new List<PayingMethod>();
foreach (var pay in writeOff.biz_content.pay_detail_list)
{
var splitSerial = pay.vch_no.Split('-');
if (splitSerial.Length != 3)
{
TaskContext.Message = $"Error:10005,[{writeOff.BillId}]vch_no号格式不符合Split规则!";
continue;
}
var serialNumber = splitSerial[1];
if (serialNumber.IsNullOrEmpty())
{
TaskContext.Message = $"Error:10006,[{writeOff.BillId}]vch_no截取的流水号是空!";
continue;
}
var payment = payments.FirstOrDefault(o => o.SerialNumber == serialNumber);
if (payment == null)
{
TaskContext.Message = $"Error:20002,[{writeOff.BillId}]未找到此流水号[{serialNumber}]的到账信息!";
continue;
}
var amountTotal = pay.jnl_write_off_amt.ToDecimal();
if (payment.Amount - payment.AmountUsed < amountTotal)
{
TaskContext.Message = $"Error:20003,流水[{payment.SerialNumber}]可用金额不足!";
continue;
}
//var splits = connF.Select<Payment>(o => o.RootKvid==payment.Kvid && o.OwnerKvid == settlement.OwnerKvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Split && o.Currency == settlement.Currency);
var splits = connF.Select<Payment>(o => o.RootKvid== payment.Kvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Split && o.Currency == settlement.Currency);
if (splits.IsNullOrEmpty())
{
TaskContext.Message = $"Error:20004,流水[{payment.SerialNumber}]暂未认领!";
continue;
}
foreach (var split in splits)
{
if (amountTotal <= 0) continue;
var amountSplit = split.Amount - split.AmountUsed;
if (amountSplit <= 0) continue;
if (amountSplit >= amountTotal)
{
var payingMethod = new PayingMethod();
payingMethod.Amount = amountTotal;
payingMethod.Type = PayType.Payment;
payingMethod.Kvid = split.Kvid;
payingMethod.Remark = $"智慧记账自动核销,核销订单号:{writeOff.BillId}";
payingMethods.Add(payingMethod);
currentPayments.Add(split);
amountTotal -= amountTotal;
}
else
{
var payingMethod = new PayingMethod();
payingMethod.Amount = amountSplit;
payingMethod.Type = PayType.Payment;
payingMethod.Kvid = split.Kvid;
payingMethod.Remark = $"智慧记账自动核销,核销订单号:{writeOff.BillId}";
payingMethods.Add(payingMethod);
currentPayments.Add(split);
amountTotal -= amountSplit;
}
}
}
if (!currentPayments.IsNullOrEmpty())
{
if (Extension.AutoPay(currentPayments, settlement, payingMethods, connF))
{
writeOff.Status = int.MaxValue;
writeOff.AddOnlyProperties(o => o.Status);
connE.UpdateOnly(writeOff);
}
}
}
tranE?.Commit();
tranF?.Commit();
}
catch (Exception ex)
{
tranE?.Rollback();
tranF?.Rollback();
throw ex;
}
return true;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment