From 66db5867a46454acc13bb4e6dc93424b7a87af60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Thu, 25 Aug 2022 16:10:01 +0800 Subject: [PATCH] 1 --- conf/apiclient_cert.pem | 24 + conf/apiclient_key.pem | 28 + conf/app.conf | 639 ++++++++++++++++++ conf/config.json | 13 + conf/rbac_model.conf | 14 + controllers/app/print_bind_store.go | 109 +++ controllers/app/print_setting.go | 35 + controllers/app/print_temp.go | 13 +- controllers/app/tonglian_pay.go | 71 ++ controllers/app/wx_print.go | 116 +++- controllers/controller.go | 19 +- dao/dao.go | 91 +++ dao/print_activation.go | 18 + dao/print_bill.go | 49 ++ dao/print_bill_pay.go | 35 + dao/print_bill_record.go | 10 + dao/print_bind_store.go | 49 ++ dao/print_dao.go | 23 +- dao/print_setting.go | 59 +- dao/printer_test.go | 6 + dao/temp_dao.go | 75 +- globals/globals.go | 8 + model/app_model/app_print.go | 28 +- model/app_model/print_activation.go | 10 + model/app_model/print_bill.go | 13 + model/app_model/print_bill_pay.go | 47 ++ model/app_model/print_bill_record.go | 15 + model/app_model/print_bind_store.go | 43 ++ model/app_model/print_setting.go | 29 +- model/app_model/print_test.go | 5 + model/app_model/system_temp.go | 49 +- model/app_model/wechat_pay.go | 11 + model/model.go | 33 + putils/redis.go | 2 + routers/v3_app_router.go | 6 + routers/v4_app_router.go | 12 +- services/api/api.go | 4 +- .../app_server/print_activiation.go | 13 + .../print_server/app_server/print_bill.go | 49 ++ .../app_server/print_bind_store.go | 91 +++ .../print_server/app_server/print_setting.go | 11 +- services/print_server/app_server/temp.go | 332 +++++---- .../print_server/app_server/temp_config.go | 245 ------- .../print_server/app_server/tonglian_pay.go | 62 ++ .../app_server/tonglian_pay_utils.go | 186 +++++ .../print_server/app_server/verify_code.go | 81 +-- services/print_server/app_server/wx_login.go | 15 +- services/print_server/app_server/wx_print.go | 115 ++-- services/print_server/print.go | 2 +- 49 files changed, 2364 insertions(+), 649 deletions(-) create mode 100644 conf/apiclient_cert.pem create mode 100644 conf/apiclient_key.pem create mode 100644 conf/app.conf create mode 100644 conf/config.json create mode 100644 conf/rbac_model.conf create mode 100644 controllers/app/print_bind_store.go create mode 100644 controllers/app/tonglian_pay.go create mode 100644 dao/print_activation.go create mode 100644 dao/print_bill.go create mode 100644 dao/print_bill_pay.go create mode 100644 dao/print_bill_record.go create mode 100644 dao/print_bind_store.go create mode 100644 model/app_model/print_activation.go create mode 100644 model/app_model/print_bill.go create mode 100644 model/app_model/print_bill_pay.go create mode 100644 model/app_model/print_bill_record.go create mode 100644 model/app_model/print_bind_store.go create mode 100644 model/app_model/wechat_pay.go create mode 100644 services/print_server/app_server/print_activiation.go create mode 100644 services/print_server/app_server/print_bill.go create mode 100644 services/print_server/app_server/print_bind_store.go create mode 100644 services/print_server/app_server/tonglian_pay.go create mode 100644 services/print_server/app_server/tonglian_pay_utils.go diff --git a/conf/apiclient_cert.pem b/conf/apiclient_cert.pem new file mode 100644 index 0000000..6515494 --- /dev/null +++ b/conf/apiclient_cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIUahJVy5/uo88B8ZcW9PcRyZOPkBowDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMTkwMTE1MDQyNzEwWhcNMjQwMTE0MDQyNzEwWjCBjzETMBEGA1UEAwwK +MTM5MDY4NjcwMjEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMScwJQYDVQQL +DB7miJDpg73oi6Xmuqrnp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYMAkNOMRIw +EAYDVQQIDAlHdWFuZ0RvbmcxETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5/ewqoqhiuackazAzJNUXC2eh/EKzWkiEZ7q +sLLKQ+ZilYOHF+GLmpmgGwM5jM4xY667l2sIWAvF7Z7IdHViGxABbOjkea0AmMMA +H4hHyczQGuRa66BiJ14l4ez+ZfKD9u5DEMgMH38/CGKZsyj5KebozBHiso8riC0E +Pb+O4oeUD6N20WD6GLrXBYUfzOQ3bklzWQiSit5G69lScmVrB57N0DndEXWAtCd+ +os9mSW9YKJvR3+5IlXn7VNRWYxdoO+oG1TZuFBgO1Ar751Iw2VKuaU5ytsxZFr6Y +I+HjUMbkMWwr97mcZLuLn5st7/GWa7qbJK+4JiDtf4Z3zrpyaQIDAQABo4GBMH8w +CQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDov +L2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUw +REJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IB +AQBUkt45/yL9ucpJwzvdFwPyV8RfQZmljqhFhJKt1TlFyeB0HKpOaC6fDdM+2GTZ +p2t7U9OTjTo2GUSFNy2ZHAwOw75PSnsX7Y63IdM53ieuRCq4xSPIqgUTu8Xrl4da +BKjuf6ZozYaY3x5ApagEEGibjCVzC/QUm1skMb+r6RRlp3DKWVa4CkDVXtEfwLnZ +KxZd3nY8v4zTBR0hQs/j9e/8wiI+C56nf4XTa50DlQPvkxTG1QTmM/iTGCy7x3ni +7WHxpCuOTwvF/9pbYQ3g5uJVop3DIYcVjFtIsewA/X5VwJK7c5vLoyM/hS4lYLZV +mJv81fv5chMHzTKMlki4JL7X +-----END CERTIFICATE----- diff --git a/conf/apiclient_key.pem b/conf/apiclient_key.pem new file mode 100644 index 0000000..8386bfb --- /dev/null +++ b/conf/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDn97CqiqGK5pyR +rMDMk1RcLZ6H8QrNaSIRnuqwsspD5mKVg4cX4YuamaAbAzmMzjFjrruXawhYC8Xt +nsh0dWIbEAFs6OR5rQCYwwAfiEfJzNAa5FrroGInXiXh7P5l8oP27kMQyAwffz8I +YpmzKPkp5ujMEeKyjyuILQQ9v47ih5QPo3bRYPoYutcFhR/M5DduSXNZCJKK3kbr +2VJyZWsHns3QOd0RdYC0J36iz2ZJb1gom9Hf7kiVeftU1FZjF2g76gbVNm4UGA7U +CvvnUjDZUq5pTnK2zFkWvpgj4eNQxuQxbCv3uZxku4ufmy3v8ZZrupskr7gmIO1/ +hnfOunJpAgMBAAECggEAKIqTp9q+zQXtC1DECX0eW1XlxSCNoMTlHWtG3UcCLsfP +Jw5rx/K1cXm0D8SKhF9tJlzdkGM2fBzipNsBcckqMkyj0yMI+3MPDaPXG6u30D8p +h+mtMk0/ml3MBSZkd/Dgu4F82yv7Ym3c2FxTPIrGsVoYCcJ+enKnSw+DFD+se06d +gyWNvyt/uy5sKBo7lt0FUK8+clL+TwozoaiTCKNlwlEbJkCwYFoAHh1mZ4Kecrwf +V1ltwpAdnEJML2vKJq5GOV+tUeKRkQqBRVwo/82MUWSH6/SS1NodO8cAOZ2rDP3V +DkTfhNZXFw58Za88K0TINqlUPtMOKvd2kUeTYOTY4QKBgQD99JrhBoKqQQGw+TM9 +Rt/HAAKhhMHep77FmnHbNWP0gnOHPLJGAEEXwwpR/gBzYIMp/iHwpXgmjYMzwnXL +eZ1dfsV02r5qUdxKU3yKGN3fzR9Bfd6Kw9UKAYLRNoCx0DxD0karcQFrt4OHhkTt +HPKKJRj4GXe5+gExWlS7Ps2ATQKBgQDp1cTBIsQ7OHOnccgJB+dKWj0BRCEj3H74 +crOTSHvu/pngcyuJoj/jMfw37sPRwamqCv1dLuMFAxf7bkB3/kDCpQ0tJM1+j1Fl +SwSUfrJE0slSW0+/r84A8uXztBNxuNguSyq8nDk+Asj9+J/VZcWHqW4IPg8R1xEs +SEfwItnojQKBgQD3bRZpH9q23lczgdh2X1Mvo8bsb1gkAvNPu0Yq+T3FwEOnA2/9 +28mPySuI7xypTOL+Sufueokxprap+1ChSoAT06u2SlkzZUZn9CdmtQuXPVayjFwC +fwJVmVtHUv7YP7Y3revEpXlo5Yd0x1DoZEe6aKKHNuj7faUj3IqpVGsMEQKBgD2A +WPiHQV9mEJ0owvkFGCMpKsRre9/nvYlw+aQyO053rlcnU3smrnD+E51Ocjh4HDy6 +GTtp+pG155fcvp4QxE2thZKrDFVOMpVWrsSzsgWB/ytnEsmS3rbHLA31/es6N7mt +UXc8C54ws1aBDuDcnKB6wpLuZ55El6Ky/CC/udp9AoGBALOnuEfpU78mkhXZfsXR +xQz+9z4fkS3e1Ku67Rdcom2TQAP5R5Dx7cSBhxhkB9LobPcqgZzokRwxMsR6e2DY +XPWGpBHtIwwRg6EhQi3bQWSBKeTgLT+ND4wL6R5/7niN0GUFX1QyDtW6x2PRJCNP +gQPd0x04LZXgOcyyv/3fhb0Y +-----END PRIVATE KEY----- diff --git a/conf/app.conf b/conf/app.conf new file mode 100644 index 0000000..a5c49e6 --- /dev/null +++ b/conf/app.conf @@ -0,0 +1,639 @@ +appname = jx-callback +httpport = 8080 +runmode = dev +autorender = false +copyrequestbody = true +EnableDocs = true +RouterCaseSensitive = false +filelinenum = true + +routinePoolSize = 1000 + +dadaAppKey = "dada154e2a41fd6cef3" +dadaAppSecret = "7f97d8f258b70b450f04e7ab274ed8f8" + +mtwmAppID = "589" +mtwmSecret = "a81eb3df418d83d6a1a4b7c572156d2f" +mtwmCallbackURL = "http://callback.jxc4.com" + +mtwmAppID2 = "5873" +mtwmSecret2 = "41c479790a76f86326f89e8048964739" +mtwmCallbackURL2 = "http://callback.jxc4.com" + +# mtwmCookieStr = "_lxsdk_cuid=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; _hc.v=cfebbfd1-79a7-9823-d8df-77e59646cb34.1571369610; _lxsdk=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; uuid_update=true; uuid=7b28e71504f5414e382b.1579155871.1.0.0; device_uuid=!64dedf83-b510-4910-8a31-b2b13d0bdd73; pushToken=00kRvxlerO15kB0dJFWDwYuctAoe04xGMNd0r3BqvLUA*; acctId=57396785; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=OyqgRLyV54i9JKP0zRCI9jPyXc4UBU-6KReDAkPIwSlljhb97JPyFUIXfYQvhlJb6G1erzHQKbvtZ2pSWOYDxQ; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; igateApp=shangouepc; wpush_server_url=wss://wpush.meituan.com; token=0MScAPaSa57iwRpgpCmGLf21tiA4yU4Uy-nDZlv8wNWs*; shopCategory=food; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; JSESSIONID=105dgww27nsy6yfp68q7wmcni; LX_SC_CONSTANT=c_shangou_online_e_znrurnrc; _lxsdk_s=17041b590ac-3d-689-a8c%7C%7C15" + +autonaviKey = "ef64f638f31e05cb7bde28790f7309fe" + +baidunaviAK = "eL94zToVOdGDTkNQxV8dnEQ1ZRcB2UKb" +baidunaviSK = "ZG0OOpOsOVURUwAkkmoHQFKRCbzn0zGb" + +disableElm = true +disableWeimob = true + +enableStoreWrite = false +enableJdStoreWrite = false +enableEbaiStoreWrite = false +enableElmStoreWrite = false +enableMtwmStoreWrite = false +enableWscStoreWrite = false +enableYbStoreWrite = false +enableJdShopWrite = false + +jdsCookie = "shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; __jdu=1142616513; pinId=WMIzMhF5BfL6nJp9AcA2-A; pin=shop_jxcs; unick=shop_jxcs; _tp=7FBEvLyPe%2FKcgxsfY5lRgA%3D%3D; _pst=shop_jxcs; areaId=22; ipLoc-djd=22-1930-50948-57092; user-key=3ec204b4-f204-4320-98e3-b2569c757800; cn=0; shshshfp=5d23828ee6ea3a33e1a58588db1713f8; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; navigation=[%22shop_jxcs%22]; __jdv=122270672|baidu|-|organic|not set|1589514011252; language=zh_CN; ceshi3.com=000; csrf_token=b84d0a5c-6288-4db4-84e1-cadf66be3bf7; mba_muid=1142616513; TrackID=1qvZk-6QSAOp1NmaouJGEx58_cFglCFv57HEfoHOezMrOnV3_FSK-5ExeYhHx97IltBADG3dvJqLIt3P57wyUW4Z2Q3Y8ITo8Cfdmlz3kykM; RT="z=1&dm=jd.com&si=mcot45862q&ss=kaf1rcqz&sl=2&tt=38t&ld=22qx&nu=b99e5a7f32b36f184614d34a1d926a39&cl=3clu&ul=3crs&hd=3cz3"; b-sec=S2JWP6CAFP7K4I6PXVBUVCO6YVXUX2JAPDHLX5RZUDE4YKCGOEXJIINB3Q4THCFCMVWZPFAYGLWLG; thor=80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF; _vender_=TNK3O6PALVQGGA33SGBIUTOKL4OOE6DP6OMNVIPMAMULGTRFWUMTVWGFRUTYP4L4EPN3KP73P33BOBN5SNJFBNQB5OMQYSJ5MORGQLJS7QAPOMIN7AZD6B3ZLP2DV4JCXDI5P3KOXJ3PHLIIRZ2YVS4JSSA3JRSBACNLJSC24ELO46GIMRW53XGW36EBPLZMZP2MQCAMJNO44FKT46B7VDVT7KQTELESOOF6E377AYC3NWKQF6ICIYBW4BA4JL5QG2NHGNOHOUJDNUW3N22UF32DLFLEIQGVO2W55J6AKPPBT227XA5NO4S3NFVIUUUADGOYH56T72MTNXCILWVMN4RMUNVFMGL4ISGXJS7YILE7A2ESPAU43MISAOZM2BR53MGRB5OZSQZPV5DBDCN2OVVT3XT5N2VMFELARQNTMAJCDBGXFURSN2Q7SYULLKZEZHTYWWOI65LS5OIHLUZQKWFGMNSQF2UBSYV7FG46CWJGMVHOGV3FY4RUEVJK6BQ223QK3H3VMTHXCZOZV4GKR5EWGIZZDVUAK4B36BPA5HPBO7PXKBOEXEBX77IYBNQLCGMK72J4VKNOUPYKNB5JE5D5UN3R2MMFGLJARTL2QTC5ZRZ4PJCJZWWOV37VWLWFVAN5IGHPAYME73KTNFABM5W73XLOXJFQWTFRZEK3FCL3BLRV4UOXLBQGA34R4WUBYSZURMKTXXB7U; __jda=65775340.1142616513.1573036516.1589946171.1589952725.54; __jdb=65775340.147.1142616513|54.1589952725; __jdc=65775340; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2DC7JQLRXRUO5PW6B77O6UXAZ4TCNE6YVKRXISVLBYGYO44RCDDPWDA4AEL7ZLXI2SG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4SMNBHRJCTDFHU6SZXCZD6RFXX2OORYGL5H2GYF2IIH2KKD4T72IR4F577G2E5II2OMMXYF2GDYNTS7WGAUXFEWRJ3CTKDBDWMHUKJQF4ZFOTNBBYBIZRXZYERXXIG6ATJFKID7XOR3NQ2CL6K7A2IEZV5HCBNYDPXFCM2ZMCS474KZ44S5F; _vender_new_=GI63BGTJFDBQ46CD7JXUX3HEPM4P5LEA3TJTFGW4ZGGIVOLTPK5T25EXTBLCENPUTR7E2I23YDFQ4ARO6JW3NHSWBDE73RTUKJTADIPFPLYFE3ARGJUBPHWUIONS72KRQOZC5P7PB4VPPLRHGEP7L3Z5K62L2E2MGTWHFJRQ3CAVBDYVW2Z4J6U73HW4BKKOCDAH5T6OJJKWKLBZFOTI7342QSL7YQ2E3I4T777RNZF23XGOTCP3D4INHNO5MNKT3XJZQBVHWUVZYQUXCK5QQTKWADKQUCYV3JRY6YAYOD7Z5IIKGNLREQTCPO7SYGSIS655JUGOUILFLXVZE6KCFG7ZTPRUD6VPE4KCIE4OUZSED6FTSEZHTM363E7XXCHB4NA7VLZHCQSBHDVGMRA7RM4RGJC3MOI4TJNGCLW6QKUCCZAY7XTGOTMC53TFUYERGNIH2RBULZ7UTZH5GU3TC6RWFI2QL4QTAIARA6GNVXENEOYIPZEHN222YDAJX5OBBEECAMAPNKZ3XNF5CNGDJ3DSU2ZLOCAKLFPCYTIIWPPJMCQ636F5464HS4OVFPFNIDW4OCE23JRPYP5FAL6TKHPAC3H3ZRU7WA5GKJJKBZUGIX7NEO4LZB7FJ3RZZZH3UHPQMNILD5DT2V7HVCUOVNOFBEOW5ID2ZMQ3XV264IU4MYHN64RA; _BELONG_CLIENT_=WPSC4XJXWK5USS4JNZY2X7VRLR5MCBKRSVHEXABGTHDGISIQK5YOLZUXYE7IOIM7MOKO74H6CRN6WHAAR4TMDV3XZWMXZRCRT5XRNE3V356BTOB2Y7LPK66VWQK6HPTGWVXIDXDCPVE3W5WMHAIO6AT2LX2XXVNUCXR34ZWFK6HY45CORGIKOSYDYZBF27WOKTUX6BS4FZMIJWNUX6CB4JAA25ZLF7ZEKYOO4QV5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BMTUJZACIBHXQFAVLRF76VQY5PNJGGJNBEZHSFYYJA3YORRT7FB5AHCOIFQKF3W5RWNUX6CB4JAA26JNMO7AYWNUPZF5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BWZDKMOJ5BS6II53ERY6ALV3ZWPF42L4CPUHEGPYIII35KDC4FCNVCORCXFD6IVNLBEDPB2GGP4UHWNRUDOQBDIW7RZJXBA2WV5ANZOTEGUCDWYRVQS2YUTIZNZ276PRYG4N56V6YTII7MBKBC7LYHO7C555HTSBXGNRM3E466AYN67DHWVM5HQFJ4NFDO5BTOKMOS5L2CXFVYDR2FCOILVYPEI; _lvtc_=5ZH3OJ7CWYNVGEKDRC32XTFXGY" + +aliKey = "LTAI4FwZN7pp4dACQHoapkZQ" +aliSecret = "NTegceUFX0FdfMovqCDzqcIKmhcoOu" + +qiniuAK = "bKWilgyrJlc8aXgLEpCUmRrYcxJ8OYhoKk5mO3jJ" +qiniuSK = "3MNdU_lKnu22vrNtUELDcLBv23UOUWYKzc16Pmkj" +qiniuBucket = "jingxistandardlib" + +showAppID = 82806 +showAppSecret = "384f911735334bf7a150f3bd3bdf0c1e" + +weixinMsgToken = "weixin" +weixinMsgKey = "duyaeVYUsz8LuKBqJeQO1NX6KmoC43yfMsbJybcRJ3e" + +weixinPageAppID = "wx018dbe7daa3d5627" +weixinPageSecret = "c7a84ed3ef3ae04ac78e02fb593ffbe5" + +weixinMiniAppID = "wx08a5c2a8581414ff" +weixinMiniSecret = "e7ec67c86cbd4dfa531af7af7533cdc9" + +weixinMiniAppIDsc = "wx6be9ae15444fa83f" +weixinMiniSecretsc = "606ac9ff3e98016cee266704c933e687" + +wxpayAppID = "wx4b5930c13f8b1170" +wxpayAppKey = "XKJPOIHJ233adf01KJIXlIeQDSDKFJAD" +wxpayAppMchID = "1390686702" +wxpayNotifyURL = "http://callback.test.jxc4.com/wxpay/msg/" + +# 抖音支付回调地址 +tiktokNotifyUrl = "https://callback.test.jxc4.com/tictoc/tiktokMsg" + +qywxID = "ww9a156bfa070e1857" +qywxSecret = "q6H6WFV-c7gyyfBaxLxilIzeJv_mGk1CXtPqUR5qm4E" + +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback.test.jxc4.com/tonglian/msg/" + +backstageHost = "http://www.jxc4.com" +wxBackstageHost = "http://wx.jxc4.com" + +# jdStorePageCookie = "YYJV3NHVBPHLD36FWP6F3EM5PTXJ2XZQS7U4HWRIDPP4IWGUKUIB4XG5N26CZRDLDF7PKOXBPD6BNTUAJLETLZOIWMCVFI3K6MYZIY4QBIXIMXYDJNUKFGJVQTN5356SAD6WPCIHWNQAG7DDMF7L7S3SHD6O37OTAHUCKU6ALXATYTGMHNFLM4XRLVSFUQAJR77M4URSZRKVO55243TDVXLO25PP4UYSPTTPMNRUFXDNP4WPE566Q6V4AH32F7HT" +# jd2StorePageCookie = "CK5GE5MR2UIOBOZC7BBZLLSI7MVDWPEQ4BRJTJQ2OP3ZFKYDDYTFFV4XOXKLERC2UXFT44TMCUMRFP3C25HD6W3PYONTQCOML6YIZA5Z37P62UXFE655IRGYJ4ZLQIEBYQM32FABIN5RVJYZWPQWSRTZURNRLYV57XJEDWZT5UVZRYUBTN3AT6JJJJ22YHE6ZHCN6LCH27JHSRO55YA6TJH6G54IF72X3UAXCKW5P2G2MT3U6I3527NQFMAFLHXBZKQFFMYUKUHUU4GZWD4O7GO45Y" +fakeJdToken = "ndslkv9asl@djf_n7askdjfk$" +fakeJdBaseURL = "http://test.jxc4.com/qqqq" + +# ebaiStorePageCookieWMUSS = "B0AAFQCAAAGbhkuMCsvcyYBDkkyAxBGIBlgXAQYVwc7VwYZFkx2HDoPSmo5eV1femopWgJRawhgAALG04cg1RUmhUakBbJRdgPS0tNEhnQhNRewwuWwYYBDEFPCQSDXV5YWA6PAVRHUJ9SnVGMThYAjNjLw9pRxIbS04-XFo05AQgBl%7ERLA33vWcR73gEAKZ" +# ebaiStorePageCookieWMSTOKEN = "gAALgNAAAGfBI5YEBHSQdZY1InIS8CVQU9aBU1f3VLWVQqKHAAAc5LnRLZ1QLLx0S5IuzCSX8ZQ7oUwAAUr-GEm9JpRc9AQAAsLkLHHXzuhh2lZkbyrcAAAWBESKg3ZA" +# ebaiStorePageCookieWMUSS2 = "A8AAIcCAAADJhpNHQoGGjZaLFRBdnE7Uwp9TBQXH1o9RTBgP30NQiQmEEAwFVplbwc6wAAMXwsa082aRxJfzskPX9THj9RKgJ0TxE1fyYPZRYVH0YSSjFgARt8Shs3bVc3QHV2Eh94B24KO20vSlJEXnELcDxTl9sJ35T2Dvg21A3wCT0NMXaNAcPzKhPamv" +# ebaiStorePageCookieWMSTOKEN2 = "A4AANwHAAARMA9ZWhh6BzcGYTQZJjVOHGIxPUdPVElXQz8iahGqiIS5gAAsLaD8yOwpYLCVMU2qqCEN8nAyiUQAAUr-GEu-F2xVbAQAAYcnZGrUx2Rf9qJkbRKQAAONp" +# ebaiStorePageCookieExdTOKEN = "PBE_2.0_5cd1c6141c127d41d12be02a04e58e0a2529c8ac5aad36be932f6e341f8be9a0e56b833c924cc95dd2ced76b31ea6fcbc7341cc9c03e3e2f470441192d51fc8bd81b6c5d24a867630a65400e688ff8f4453895ca9a18d7e91726941b28631cf2ab81797279967fcb03ae57e5bc33bf91e4495727569681c724597fb2c639a85c145723c12de262224e2536ad2c6f94bcae0c10c8f30728a6ea3ab6000940fffaa66271f17ecbae139f0b4fdfff791b7986a88b8f252827e799a2e1862ec522fd4c51c70ae9d17c69da93f1c12715bf9e0b35eccf39ae605d424c83319acaa7acbe191a8ee410afd1d02d1e02834ce6cbd2503b89f30efc1f7635a1e71e10e3370fc79b33e6352290e87f82b1cb8ac91195a09ff28e4418923e89993eb10d01e39fb621d517a14081611b25e83da9ec860fbacd2cb13562271585b53a0a7178e8f614bd62ffa442c78a10f008b3721675cad803024fad0c13aeecd64d1360bab4127883d2e7198201" +# mtpsStoreToken = "M0p9VatZSeSHfrosD5IViAVl73IcA8mlcuHIV5sG6Zpv83a7JE0wY3t26aEhrrs_MR5gtLSFF1UIkt8HAjaXow" + +weimobAppID = "319F5E7FB6784DFCA3684C9333EB7744" +weimobAppSecret = "7267AA7F58261F6965599218F5A1D592" +weimobStateSecret = "87ae9570-92dc-4c01-bcd9-1a15d441df6b" +weimobCallbackURL = "http://callback.test.jxc4.com/weimob" + +dingdingAgentID = 241047291 +dingdingAppKey = "ding7iu9cptairtcls0c" +dingdingSecret = "1zooB4bmEXPesdwb1ElWASVQ1vinOSZM-1XCUFrrSjHsNAId1UuVCT5tmHSmg5_V" + +dingdingQRCodeAppKey = "dingoashf4onhetkegzh3i" +dingdingQRCodeSecret = "qjlermCn7wmWh9Qe-zMEaaIr_oDHD02OyOfj_7TZFEjWS5V5lTwAEfa_E8r8Ul42" + +dingdingCallbackAESKey = "EjTgnEa377fEcgzlQUbcgTzxPNznRjpOuSPgQAwv9aA" +dingdingCallbackToken = "ITKIL2FeFHZa48fEK9g3dbJ1DOww7shOrIZ2f" +dingdingCallbackURL = "http://callback.test.jxc4.com/dingding/msg" +dingdingCorpID = "ding7ab5687f3784a8db" + +alipayAppID = "2019110769024042" +alipayPrivateKey = "MIIEpAIBAAKCAQEAjI46NiIj+Z19+ll4FFR+xss2N69jD5b31LtZVONM8CqNKCe7eBYx6y2pfslgg8R9Xj67PEmc/30euoG7bW23ow6QCj2fS0K2AZBA+TuEbtDpSFr0CUqS+tc/4nEurSyLOOt53ijNFPfVTT56Kl2h0mXLBDA5nvEKlzZTNimJcM/r4yyz4N72zXqfjT7cVTE/3cx6f4fkD3EsYdrxzIAruAYEywqraexLI1oIotGqufBemUhHdcOJquJJtxRLfYC000nEovHFtq1RhtakKRz8j80Edp0X+Dk1vA6JY1sVXnIFh/9QFyT70uFc77GPgwh7OT/qWvWnkBIbY+TGO7+dVQIDAQABAoIBAHQ0do4g5ctO2UOsyqlMPlBO2/Fn8KeH8jgP+MhE8GwzUebcCpM7DmRYqSRoi4IFZn0Psi8i0UktgcVC0tmi90s5E/9TeSp46g8a24zzFwejcutePxqbbC803N1zI9sK08PocyYoZ32pdNFbEReLt+lCPXmmAU2WDWJ9CIjkCHyaO+eadwqckc8VDGuBZU44pKrDDjlYfaWJk3bi7DJ2YqIGL+i0rm+1vVuK7qFTX9fHeeedperVwuBjjA5SPC6xn8I0Uq55fUQ36KQok53VIOzk5HrtiFw9GRBmULthY4/WT7mh44uG93hb+dzFvFNaK1tqgpPwqQTcGuYCNPTkmLUCgYEA4klP52ho3A4+VWXznjblzL2T/uzQPTTbeLUtLoLfKNGg+JiCTc8rJsVFalTyRXPEK8UHveM3/rR0aCc10mh07XHFG6XD7Md20jtTdHoag4HF+aubW2jY6SmbUXlWDxe7FcxRvaP8R2XxacFyIOT41ehphsS1tghU/ipbEDf01N8CgYEAnwMMIfp0ZGNm0IgYVHHKVmqfTC/ZW6epHGyfr/6mQ8hiU5arp2rHWtGUdF3EQFEJu69n8tUYK8hAoCOoPXrnEzMQdLhi389u+2dh8bKuliFzpJy0Ug0z9y4AIzdvCcuKoBMPGV4Db6adXFEHRgR1NIdsQegrtSjvuzgbGIZiwEsCgYEAxX805QRkmMM5tjEgOlMxp8tCUvl/Ghx6/NQsFe8VNDwZ4T7CY4TP5avBVPfE58cNTSJPCnU41u3Kt2iZegW/H8nvPZ0k7hB87SnoQb2cTHDESI91LYfJ4V5199sNuGh+2ZyVLw3jzrDzzdiPcpRFdfS9vWkMK08EVzzCc9pSrkMCgYBkO4iHVpfNu/bQVil3+W6BAJ6/aJ4Lr2jjOPmD9/IYYhTQ+fXkB2P4tIluvLh7jlmjTFMq9/ZPiuBp0XA4qONF7/dci+oPiHM92BIeR/LTQezig8EKw7XRBtchW80LkJkmhD0NUXy7AXzJ922tThwPa5nrBY2fmVlcW2aBFBzldwKBgQCl7y3eMG77BwD0nHxPHopWL6jsowNwxwMyN9eg40yemhfYol8+AhfouRuzaMCzROY9p5nY1N/jmPRa1dM7lXvZuij0ugwIebQXFhEjRtxtENbY5nRU4wlS7Y69oLSqFrQmW/MZbiCuIa6yXirSbEPIUojhHBI17yqq5yRD1vEHGQ==" + +feieUser = "jianhua.xu@rosy.net.cn" +feieKey = "2JfKh8TyheQ9mwss" + +xiaoWMAppID = 267 +xiaoWMAppKey = "94337" + +yinbaoAppKey = "682628966212343269" +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" + +aliUpcAppCode = "00a6eefba0204d3fa310ac0ee7a6fc54" + +yilianyunClientID = "1039586024" +yilianyunClientSecret = "4885d07c2997b661102e4b6099c0bf3b" +yilianyunClientID2 = "1098307169" +yilianyunClientSecret2 = "d5eedb40c99e6691b1ca2ba82a363d6a" + +zhongwuAppID = 8000192 +zhongwuAppSecret = "29435497822f52f3cf659c65da548a79" + +getWeixinTokenKey = "c928ed0d-87a3-441a-8517-f92f0167296f" +storeName = "京西菜市" +storeNameMtwm = "京西菜市" +storeNameEbai = "饿鲜达" +storeNameEbai2 = "好菜鲜生" + +smsSignName = "京西菜市" +smsMobileVerifyTemplate = "SMS_175583158" +smsNewOrderTemplate = "SMS_218287880" +smsNewOrderTemplateQ = "SMS_218292870" +smsOrderCanceledTemplate = "SMS_175573134" +smsNewUserOrderTemplate = "SMS_190284055" +smsJxOrderDelivering = "SMS_217235545" +smsPickOrderTemplate = "SMS_222861531" +smsBrandBalanceTemplate = "SMS_223190142" +smsVoicePickOrderTemplate = "TTS_222871733" +smsVoiceBrandBalanceTemplate = "TTS_223200132" + +addEvent = true + +[dev] +jdOrgCode = "320406" +jdToken = "77e703b7-7997-441b-a12a-2e522efb117a" +jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" +jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" + +jd2OrgCode = "349454" +jd2Token = "7b5f8858-5cd6-493e-a0e1-56c0929396af" +jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" +jd2Secret = "1097abd7ef09427099b4922784af123a" + +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + +jdcsOrgCode = "362665" +jdcsToken = "01536759-9657-4d6d-a256-676d572317bf" +jdcsAppKey = "9e4ebe035ba74c8f913bf51e6af3974c" +jdcsSecret = "8eb9778f1099416795c501b76dbb2e79" + +elmIsProd = false +elmToken = "2d2b583447b04b6bba5a6f3faed3559b" +elmAppKey = "RwT214gAsS" +elmSecret = "56afff4b9ebd8a7eb532d18fa33f17be57f9b9db" + +ebaiSource = "34665" +ebaiSecret = "c3db75b754ea2d89" + +mtpsAppKey = "25e816550bc9484480642f19a95f13fd" +mtpsSecret = "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^" + +dadaIsProd = false +dadaCallbackURL = "http://callback.test.jxc4.com/dadadelivery/msg" +dadaSourceID = "73753" + +fnAppID = "6705486294797503379" +fnAppSecret = "c1e6c280-e618-4103-9d0a-673bc54fb22e" +fnCode = "uDEyAmTbrfS2qjYbgi20Jm" +fnMerchantId= "51658" +fnCallbackURL = "http://callback.jxc4.com/fn/msg" + +weixinAppID = "wxbf235770edaabc5c" +weixinSecret = "ba32b269a068a5b72486a0beafd171e8" +weixinToken = "17_roSCZgkCxhRnyFVtei0KdfHwdGP8PmLzJFhCieka4_X4_d-lgfaTxF6oIS6FE5lkgLbrtstSsO6HyDNHKsHJmpB8YOtJYN4sO-AezdWLF78M2phL0K8xCRjB9YE9-Ci64GCqS50o6LcVqux8ORVbACAFIM" + +weixinAppIdPrint = "wx2bfbc02e6251b71b" +weixinAppSecretPrint = "ff4128908947cfb71002f74599c0dbf9" + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" + +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" + +tiktokAppKey = "tta6a1d01c399f264201" +tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" + +tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 +TiktokJXDJApiID="ttaceeda5333d7a7ab01" +tiktokJXDJSecret="5c8492ec2744fb72bb6cc356983f3cfc317f85d4" +#国美 +gomeiAppKey = "N0R033L2QQFR53" +gomeiAppSecret = "686ffc3e31c24594838baed045563790" +[prod] +EnableDocs = false + +jdOrgCode = "320406" +jdLoginName = "jd_jxcs1223" +jdToken = "29afd5a8-f93f-4d4c-9fce-a7297340af59" +jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" +jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" + +jd2OrgCode = "349454" +jd2Token = "7b5f8858-5cd6-493e-a0e1-56c0929396af" +jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" +jd2Secret = "1097abd7ef09427099b4922784af123a" + +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + +jdcsOrgCode = "362665" +jdcsToken = "01536759-9657-4d6d-a256-676d572317bf" +jdcsAppKey = "9e4ebe035ba74c8f913bf51e6af3974c" +jdcsSecret = "8eb9778f1099416795c501b76dbb2e79" + +jdydOrgCode = "363179" +jdydToken = "5c4675f8-c635-4b78-a3a1-e2d91e33eff8" +jdydAppKey = "420624b948d9436daddf6501200f2ebf" +jdydSecret = "23064865bd3f49adaa5fc582daac1baf" + +jdEclpAccessToken = "161eff890f2f4fbda942447f85843377wzmo" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + +# jdShopAccessToken = "de8157b447584885910f429011e49cb93yjq" +# jdShopAppKey = "E1D746D42474D5F1F1A10CECE75D99F6" +# jdShopAppSecret = "efa7e1d1a22640fa990e6cf164b28608" +# jdsCookie = "shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; __jdu=1142616513; pinId=WMIzMhF5BfL6nJp9AcA2-A; pin=shop_jxcs; unick=shop_jxcs; _tp=7FBEvLyPe%2FKcgxsfY5lRgA%3D%3D; _pst=shop_jxcs; areaId=22; ipLoc-djd=22-1930-50948-57092; user-key=3ec204b4-f204-4320-98e3-b2569c757800; cn=0; shshshfp=5d23828ee6ea3a33e1a58588db1713f8; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; navigation=[%22shop_jxcs%22]; __jdv=122270672|baidu|-|organic|not set|1589514011252; language=zh_CN; ceshi3.com=000; csrf_token=b84d0a5c-6288-4db4-84e1-cadf66be3bf7; mba_muid=1142616513; TrackID=1qvZk-6QSAOp1NmaouJGEx58_cFglCFv57HEfoHOezMrOnV3_FSK-5ExeYhHx97IltBADG3dvJqLIt3P57wyUW4Z2Q3Y8ITo8Cfdmlz3kykM; RT="z=1&dm=jd.com&si=mcot45862q&ss=kaf1rcqz&sl=2&tt=38t&ld=22qx&nu=b99e5a7f32b36f184614d34a1d926a39&cl=3clu&ul=3crs&hd=3cz3"; b-sec=S2JWP6CAFP7K4I6PXVBUVCO6YVXUX2JAPDHLX5RZUDE4YKCGOEXJIINB3Q4THCFCMVWZPFAYGLWLG; thor=80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF; _vender_=TNK3O6PALVQGGA33SGBIUTOKL4OOE6DP6OMNVIPMAMULGTRFWUMTVWGFRUTYP4L4EPN3KP73P33BOBN5SNJFBNQB5OMQYSJ5MORGQLJS7QAPOMIN7AZD6B3ZLP2DV4JCXDI5P3KOXJ3PHLIIRZ2YVS4JSSA3JRSBACNLJSC24ELO46GIMRW53XGW36EBPLZMZP2MQCAMJNO44FKT46B7VDVT7KQTELESOOF6E377AYC3NWKQF6ICIYBW4BA4JL5QG2NHGNOHOUJDNUW3N22UF32DLFLEIQGVO2W55J6AKPPBT227XA5NO4S3NFVIUUUADGOYH56T72MTNXCILWVMN4RMUNVFMGL4ISGXJS7YILE7A2ESPAU43MISAOZM2BR53MGRB5OZSQZPV5DBDCN2OVVT3XT5N2VMFELARQNTMAJCDBGXFURSN2Q7SYULLKZEZHTYWWOI65LS5OIHLUZQKWFGMNSQF2UBSYV7FG46CWJGMVHOGV3FY4RUEVJK6BQ223QK3H3VMTHXCZOZV4GKR5EWGIZZDVUAK4B36BPA5HPBO7PXKBOEXEBX77IYBNQLCGMK72J4VKNOUPYKNB5JE5D5UN3R2MMFGLJARTL2QTC5ZRZ4PJCJZWWOV37VWLWFVAN5IGHPAYME73KTNFABM5W73XLOXJFQWTFRZEK3FCL3BLRV4UOXLBQGA34R4WUBYSZURMKTXXB7U; __jda=65775340.1142616513.1573036516.1589946171.1589952725.54; __jdb=65775340.147.1142616513|54.1589952725; __jdc=65775340; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2DC7JQLRXRUO5PW6B77O6UXAZ4TCNE6YVKRXISVLBYGYO44RCDDPWDA4AEL7ZLXI2SG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4SMNBHRJCTDFHU6SZXCZD6RFXX2OORYGL5H2GYF2IIH2KKD4T72IR4F577G2E5II2OMMXYF2GDYNTS7WGAUXFEWRJ3CTKDBDWMHUKJQF4ZFOTNBBYBIZRXZYERXXIG6ATJFKID7XOR3NQ2CL6K7A2IEZV5HCBNYDPXFCM2ZMCS474KZ44S5F; _vender_new_=GI63BGTJFDBQ46CD7JXUX3HEPM4P5LEA3TJTFGW4ZGGIVOLTPK5T25EXTBLCENPUTR7E2I23YDFQ4ARO6JW3NHSWBDE73RTUKJTADIPFPLYFE3ARGJUBPHWUIONS72KRQOZC5P7PB4VPPLRHGEP7L3Z5K62L2E2MGTWHFJRQ3CAVBDYVW2Z4J6U73HW4BKKOCDAH5T6OJJKWKLBZFOTI7342QSL7YQ2E3I4T777RNZF23XGOTCP3D4INHNO5MNKT3XJZQBVHWUVZYQUXCK5QQTKWADKQUCYV3JRY6YAYOD7Z5IIKGNLREQTCPO7SYGSIS655JUGOUILFLXVZE6KCFG7ZTPRUD6VPE4KCIE4OUZSED6FTSEZHTM363E7XXCHB4NA7VLZHCQSBHDVGMRA7RM4RGJC3MOI4TJNGCLW6QKUCCZAY7XTGOTMC53TFUYERGNIH2RBULZ7UTZH5GU3TC6RWFI2QL4QTAIARA6GNVXENEOYIPZEHN222YDAJX5OBBEECAMAPNKZ3XNF5CNGDJ3DSU2ZLOCAKLFPCYTIIWPPJMCQ636F5464HS4OVFPFNIDW4OCE23JRPYP5FAL6TKHPAC3H3ZRU7WA5GKJJKBZUGIX7NEO4LZB7FJ3RZZZH3UHPQMNILD5DT2V7HVCUOVNOFBEOW5ID2ZMQ3XV264IU4MYHN64RA; _BELONG_CLIENT_=WPSC4XJXWK5USS4JNZY2X7VRLR5MCBKRSVHEXABGTHDGISIQK5YOLZUXYE7IOIM7MOKO74H6CRN6WHAAR4TMDV3XZWMXZRCRT5XRNE3V356BTOB2Y7LPK66VWQK6HPTGWVXIDXDCPVE3W5WMHAIO6AT2LX2XXVNUCXR34ZWFK6HY45CORGIKOSYDYZBF27WOKTUX6BS4FZMIJWNUX6CB4JAA25ZLF7ZEKYOO4QV5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BMTUJZACIBHXQFAVLRF76VQY5PNJGGJNBEZHSFYYJA3YORRT7FB5AHCOIFQKF3W5RWNUX6CB4JAA26JNMO7AYWNUPZF5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BWZDKMOJ5BS6II53ERY6ALV3ZWPF42L4CPUHEGPYIII35KDC4FCNVCORCXFD6IVNLBEDPB2GGP4UHWNRUDOQBDIW7RZJXBA2WV5ANZOTEGUCDWYRVQS2YUTIZNZ276PRYG4N56V6YTII7MBKBC7LYHO7C555HTSBXGNRM3E466AYN67DHWVM5HQFJ4NFDO5BTOKMOS5L2CXFVYDR2FCOILVYPEI; _lvtc_=5ZH3OJ7CWYNVGEKDRC32XTFXGY" + +jdShopAccessToken2 = "9ad9cf5fc8b140b19a1dbbb700b47676kown" +jdShopAppKey2 = "D5E8352BE0786ED16F77B4548F62F09A" +jdShopAppSecret2 = "71e1061ac2f246f6ac27efb900edba12" + +elmIsProd = true +elmToken = "" +elmAppKey = "KLRDcOZGrk" +elmSecret = "1fc221f8265506531da36fb613d5f5ad673f2e9a" + +ebaiSource = "34665" +ebaiSecret = "c3db75b754ea2d89" + +mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" +mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + +dadaIsProd = true +dadaCallbackURL = "http://callback.jxc4.com/dadadelivery/msg" +dadaSourceID = "6660" + +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" +weixinMiniAppID3 = "wx18111a41fd17f24f" +weixinMiniSecret3 = "c79ac6e1b2d6d7968e72a9658a8b6715" + +weixinAppIdPrint = "wx2bfbc02e6251b71b" +weixinAppSecretPrint = "ff4128908947cfb71002f74599c0dbf9" + +yinbaoAppKey = "682628966212343269" +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" + +aliUpcAppCode = "00a6eefba0204d3fa310ac0ee7a6fc54" + +wxpayNotifyURL = "http://callback.jxc4.com/wxpay/msg/" + +# 抖音支付回调地址 +tiktokNotifyUrl = "https://callback.jxc4.com/tictoc/tiktokMsg" + +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback.jxc4.com/tonglian/msg/" + +dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" + +enableStoreWrite = true +enableJdStoreWrite = true +enableEbaiStoreWrite = true +enableMtwmStoreWrite = true +enableWscStoreWrite = true +enableYbStoreWrite = true +enableJdShopWrite = true + +disableWeimob = false +weimobCallbackURL = "http://callback.jxc4.com/weimob" + +dingdingAgentID = 239461075 +dingdingAppKey = "ding7iu9cptairtcls0c" +dingdingSecret = "LWrZAFeqUfuVv7n_tc8vPpCAx6PT4CwManx2XCVhJOqGsx2L5XCDuX1sAN_JtvsI" + +dingdingCallbackAESKey = "EjTgnEa377fEcgzlQUbcgTzxPNznRjpOuSPgQAwv9aA" +dingdingCallbackToken = "ITKIL2FeFHZa48fEK9g3dbJ1DOww7shOrIZ2f" +dingdingCallbackURL = "http://callback.jxc4.com/dingding/msg" + +pushAppID = "5lyyrvHODG6wC8Sdr3a9h" +pushAppKey = "iFrkUDmR2g5eqQpfh2kQ57" +pushAppSecret = "WTn53qd6WAAdLMXfmXvzb7" +pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47" + +fnAppID = "6705486294797503379" +fnAppSecret = "c1e6c280-e618-4103-9d0a-673bc54fb22e" +fnCode = "uDEyAmTbrfS2qjYbgi20Jm" +fnMerchantId= "51658" +fnCallbackURL = "http://callback.jxc4.com/fn/msg" + +jxPrintAppID = "1000" +jxPrintAppKey = "rfBd56ti2SMtYvSg" + +tiktokAppKey = "tta6a1d01c399f264201" +tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" + +tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 +TiktokJXDJApiID="ttaceeda5333d7a7ab01" +tiktokJXDJSecret="5c8492ec2744fb72bb6cc356983f3cfc317f85d4" +#国美 +gomeiAppKey = "N0R033L2QQFR53" +gomeiAppSecret = "686ffc3e31c24594838baed045563790" +[jxgy] +httpport = 8088 +EnableDocs = false + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxgy?charset=utf8mb4&loc=Local&parseTime=true" + +jdOrgCode = "339032" +jdLoginName = "jd_jxgy" +jdToken = "b1138139-9610-4b80-9a63-a63da4773885" +jdAppKey = "5d5577a2506f41b8b4ec520ba83490f5" +jdSecret = "0b01b9eeb15b41dab1c3d05d95c17a26" +jdStorePageCookie = "YDYCWYUGKSROMV3MKJQIFINJ5CLPYH6IRVFUMFJD3JI6VQKHX3YPHTWDIDBNMCBUKSY3P7SKAHHKR7PHQDSFRXZEWXA4XOUTALIQDGDYIEUCMDPWSYGDVT42DJ27CD27QKCR3UN7KF7EPIHGPR7GCRTBD5YGNZW4AIACY4HXDMCETEWCPFKOTM4HRJBSMMQJ77SR62PYMP6RCG33IRQGP6PRCKAO4M7FUA7G2ZM2SFQ6F6WUNO5GXDJSVUELLBJT" + +ebaiSource = "35957" +ebaiSecret = "10013fbb7c2ddad7" +ebaiStorePageCookieWMUSS = "AIgAAABBA3NOWA8IckAGYixvPUR0K1s5EhVyCwsoVlRxCFlPSFtCFzRQHiYRIwg9BRPgwAAE0UBCHBcQQJwMw17WmJQTGoqGzMGXEo5LWhePQxmeR4reiYcV2YdSBkqRHMNFD92PVkqQjZze2JbWR9mQBkFaxMrB2kRBCmHC1FNXg6wdesOxNgDAAGs9ZB0A" +ebaiStorePageCookieWMSTOKEN = "QAAGALAAAFd2VaeBVCNBtlDTJUL2NXW2YFIiBzMWksCWFWQRCGlESI_2QAABmRgRwSFsGfRsPhJLuCgHL_g6HUAAAUuy3E2_vQhVHAQAAdPYKHHEB0Rpg_foY_bcAAgB" + +mtwmAppID = "4123" +mtwmSecret = "df2c88338b85f830cebce2a9eab56628" +mtwmCallbackURL = "http://callback-jxgy.jxc4.com" +mtwmCookieStr = "_lxsdk_cuid=16f413bd94fc8-0daccb808f461b-1d336b5a-13c680-16f413bd94fc8; _lxsdk=16f413bd94fc8-0daccb808f461b-1d336b5a-13c680-16f413bd94fc8; uuid=d1e8adb3d2774b89fe6e.1577347439.1.0.0; uuid_update=true; wpush_server_url=wss://wpush.meituan.com; acctId=62884810; token=0LhaIAAgrL1Hy0DDATjZqt4lRHauN_bBL3q0AvxUFUWo*; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=SUVq2IfzZ53EHaTVoCE3UsmKkH5ZevxTjkwpNcaLKkbUOBkEyuZp8mPFwhgqkxsCGNjZILNj5aV8uVSQc888bg; device_uuid=!625e0297-431a-49ad-8b18-a0562c38a8eb; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; pushToken=0LhaIAAgrL1Hy0DDATjZqt4lRHauN_bBL3q0AvxUFUWo*; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; igateApp=shangouepc; LX_SC_CONSTANT=c_nehoktcu; shopCategory=food; JSESSIONID=unlrbu07lvm2s734eyedxr0j; _lxsdk_s=16f413bd950-189-8bb-8df%7C%7C33" + +enableStoreWrite = true +enableJdStoreWrite = true +enableEbaiStoreWrite = true +enableMtwmStoreWrite = true +enableYbStoreWrite = true +enableJdShopWrite = true + +mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" +mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + +dadaIsProd = true +dadaCallbackURL = "http://callback-jxgy.jxc4.com/dadadelivery/msg" +dadaSourceID = "6660" + +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" + +weixinMiniAppID = "wx2d6949f724b2541d" +weixinMiniSecret = "11f3c380551c4683c149990b004d6df9" + +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" + +weixinAppIdPrint = "wx2bfbc02e6251b71b" +weixinAppSecretPrint = "ff4128908947cfb71002f74599c0dbf9" + +wxpayNotifyURL = "http://callback-jxgy.jxc4.com/wxpay/msg/" + +# 抖音支付回调地址 +tiktokNotifyUrl = "https://callback-jxgy.jxc4.com/tictoc/tiktokMsg" + +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback-jxgy.jxc4.com/tonglian/msg/" + +backstageHost = "http://www-jxgy.jxc4.com" +wxBackstageHost = "http://wx-jxgy.jxc4.com" + +dingdingAgentID = 258707199 +dingdingAppKey = "dingtozhutfr98qgwc7d" +dingdingSecret = "7EJ0HDbkxQri-O2RSaYUu7_ZwvvMKtRVHT8cpyfvIvK6A9n9HRwPNCNRJFuEDeT_" + +dingdingQRCodeAppKey = "dingoaw990o1jm9jswvwib" +dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISxGF5G57RV" + +dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" + +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" +getPushTokenURL = "http://www.jxc4.com/v2/sys/GetPushToken" + +jdEclpAccessToken = "161eff890f2f4fbda942447f85843377wzmo" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + +# jdShopAccessToken = "de8157b447584885910f429011e49cb93yjq" +# jdShopAppKey = "E1D746D42474D5F1F1A10CECE75D99F6" +# jdShopAppSecret = "efa7e1d1a22640fa990e6cf164b28608" + +jdShopAccessToken2 = "9ad9cf5fc8b140b19a1dbbb700b47676kown" +jdShopAppKey2 = "D5E8352BE0786ED16F77B4548F62F09A" +jdShopAppSecret2 = "71e1061ac2f246f6ac27efb900edba12" + +fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c" +fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d" +fnMerchantId = "51658" +fnCode = "uDEyAmTbrfS2qjYbgi20Jm" +fnCallbackURL = "http://callback-jxgy.jxc4.com/fn/msg" + +jxPrintAppID = "1000" +jxPrintAppKey = "rfBd56ti2SMtYvSg" + +storeName = "京西果园" +tiktokAppKey = "tta6a1d01c399f264201" +tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" + +tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 +TiktokJXDJApiID="ttaceeda5333d7a7ab01" +tiktokJXDJSecret="5c8492ec2744fb72bb6cc356983f3cfc317f85d4" +#国美 +gomeiAppKey = "N0R033L2QQFR53" +gomeiAppSecret = "686ffc3e31c24594838baed045563790" +[test] +jdOrgCode = "82029" +jdToken = "594ab45a-9a73-4a43-82b0-a64cbd55d883" +jdAppKey = "06692746f7224695ad4788ce340bc854" +jdSecret = "d6b42a35a7414a5490d811654d745c84" + +elmIsProd = false +elmToken = "2d2b583447b04b6bba5a6f3faed3559b" +elmAppKey = "RwT214gAsS" +elmSecret = "56afff4b9ebd8a7eb532d18fa33f17be57f9b9db" + +ebaiSource = "62923" +ebaiSecret = "aa4cdc6c1108486b" + +mtpsAppKey = "25e816550bc9484480642f19a95f13fd" +mtpsSecret = "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^" + +dadaIsProd = false +dadaCallbackURL = "http://callback.test.jxc4.com/dadadelivery/msg" +dadaSourceID = "73753" + +weixinAppID = "wxbf235770edaabc5c" +weixinSecret = "ba32b269a068a5b72486a0beafd171e8" + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" + +[alpha] +httpport = 8088 + +# xiaan +jdOrgCode = "82029" +jdToken = "34eedf6f-78ab-4a3c-9415-a930d37bda6a" +jdAppKey = "06692746f7224695ad4788ce340bc854" +jdSecret = "d6b42a35a7414a5490d811654d745c84" +jdStorePageCookie = "5EOCZRXVCRXBTYD5EPV6FOXRCQWFFQO75FRMJ3BAKZ5JXY6XTJECMWXK5OZIPLZTUWZKZKXHXA6I7G3WMIKSWOHZIHRLNE5FZY3NBD6G5IMBOYHMJSJR3RF4TMZB2JEW2DF755YPFUSA6BMWI3KNLT3I4EAP2Z4JA6ZWAA34MNQX5P6LOI4EGG76QJU3G3VW7QFE6BAVAONMKBEHKNXNZGX3RQF7PHXDXSPJSY5XQEGM7IV2L7LKIG3M2D6QVSPEGQW4NV7SZ4TX32D2XQA7PIX46M" + +ebaiSource = "61219" +ebaiSecret = "9ef8be6a53fb33e7" +ebaiStorePageCookieWMUSS = "AHYHAAApIX5oBXUFKFsXKEdObiclRUhTFRZ1MUh7KEMiClB7MnB5G3VvIB5KN0USAABjQ4KngBfQ4Wcj9ebWYiEHBxCyNiBT1Yc111PhQ7UBluCENnCUB0HjIzfCAaHjAKEDoscT8sDL8JDDuQD81NaQ1dW3kN1MS9DeFMPgwC2YYROVy7AV3cKhMPkQrBwA" +ebaiStorePageCookieWMSTOKEN = "UAABRL3ZhLykdGFQBBDxXVDBuYisaB3tQHjUmHlQ5cEAs5dxMdG0R-EwVILAy_CV1Vlw_nbQAA0ijuEe-F2xUzAQAAAdujHKzhohkrxY0c5LsAAH0CeSGnywAHBQAAMA" + +mtwmCookieStr = "_lxsdk_cuid=169b7bc1b9fc8-05092471a96611-12376d51-1fa400-169b7bc1b9fc8; _lxsdk=169b7bc1b9fc8-05092471a96611-12376d51-1fa400-169b7bc1b9fc8; uuid=7a6a1345b4a3f7aa5f81.1553565752.1.0.0; _ga=GA1.2.285163436.1559264188; uuid_update=true; pushToken=0sz3wYPQoNug6okzOjEacuvrEWGRhuv6gL5ZWX98prCw*; device_uuid=!88124822-2b68-4425-865d-a3ffffe355af; wpush_server_url=wss://wpush.meituan.com; acctId=26535718; token=0vt6ufSF1X8GXpVq3N5zhE5FhcgONSuNTg4LiqkqEyTM*; brandId=-1; wmPoiId=2523687; isOfflineSelfOpen=0; city_id=999999; isChain=0; existBrandPoi=false; ignore_set_router_proxy=false; region_id=2000000001; region_version=1522820107; newCategory=false; bsid=g54gdBCxg9fu4t99gGLf770bFzBT_eUQXA3_FWLgDeCWrEtsNdXkJtckKTvMEthURtXVg_j0mhDauKPgDUgZyQ; cityId=510100; provinceId=510000; city_location_id=10000004; location_id=10000005; set_info=%7B%22wmPoiId%22%3A2523687%2C%22region_id%22%3A%222000000001%22%2C%22region_version%22%3A1522820107%7D; igateApp=shangouepc; shopCategory=market; LX_SC_CONSTANT=c_nehoktcu; JSESSIONID=43y9tjdcnjh2kojf6qfehvdy; _lxsdk_s=16f4145a84c-d6a-c22-64c%7C%7C19" + +mtpsAppKey = "25e816550bc9484480642f19a95f13fd" +mtpsSecret = "r4$HqrKx9~=7?2Jfo,$Z~a7%~k!Au&pEdI2)oPJvSbH2ao@2N0[8wSIvtuumh_J^" + +dadaIsProd = false +dadaCallbackURL = "http://callback.alpha.jxc4.com/dadadelivery/msg" +dadaSourceID = "73753" + +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getWeixin2TokenURL = "http://www.jxc4.com/v2/sys/GetWX2Token" +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" + +mtwmCallbackURL = "http://callback.alpha.jxc4.com" + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxstore_alpha?charset=utf8mb4&loc=Local&parseTime=true" + +enableStoreWrite = true +enableJdStoreWrite = true +enableEbaiStoreWrite = true +enableMtwmStoreWrite = true +enableWscStoreWrite = false +enableYbStoreWrite = false + +[beta] + +EnableDocs = false + +jdOrgCode = "320406" +jdLoginName = "jd_jxcs1223" +jdToken = "29afd5a8-f93f-4d4c-9fce-a7297340af59" +jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" +jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" + +jd2OrgCode = "349454" +jd2Token = "7b5f8858-5cd6-493e-a0e1-56c0929396af" +jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" +jd2Secret = "1097abd7ef09427099b4922784af123a" + +jd3OrgCode = "359459" +jd3Token = "5e2c0a60-4450-40c0-a1da-b560051251ea" +jd3AppKey = "21b627c23ea04c69b64b48d0b361213e" +jd3Secret = "51cd27a748e64c829b4b7f83f4844610" + +jdcsOrgCode = "362665" +jdcsToken = "01536759-9657-4d6d-a256-676d572317bf" +jdcsAppKey = "9e4ebe035ba74c8f913bf51e6af3974c" +jdcsSecret = "8eb9778f1099416795c501b76dbb2e79" + +jdydOrgCode = "363179" +jdydToken = "5c4675f8-c635-4b78-a3a1-e2d91e33eff8" +jdydAppKey = "420624b948d9436daddf6501200f2ebf" +jdydSecret = "23064865bd3f49adaa5fc582daac1baf" + +jdEclpAccessToken = "161eff890f2f4fbda942447f85843377wzmo" +jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" +jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" + +jdShopAccessToken2 = "9ad9cf5fc8b140b19a1dbbb700b47676kown" +jdShopAppKey2 = "D5E8352BE0786ED16F77B4548F62F09A" +jdShopAppSecret2 = "71e1061ac2f246f6ac27efb900edba12" + +elmIsProd = true +elmToken = "" +elmAppKey = "KLRDcOZGrk" +elmSecret = "1fc221f8265506531da36fb613d5f5ad673f2e9a" + +ebaiSource = "34665" +ebaiSecret = "c3db75b754ea2d89" + +mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" +mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + +dadaIsProd = true +dadaCallbackURL = "http://callback.beta.jxc4.com/dadadelivery/msg" +dadaSourceID = "6660" + +weixinAppID = "wx2bb99eb5d2c9b82c" +weixinSecret = "6bbbed1443cc062c20a015a64c07a531" +weixinMiniAppID2 = "wx4b5930c13f8b1170" +weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" +weixinMiniAppID3 = "wx18111a41fd17f24f" +weixinMiniSecret3 = "c79ac6e1b2d6d7968e72a9658a8b6715" +weixinAppIdPrint = "wx2bfbc02e6251b71b" +weixinAppSecretPrint = "ff4128908947cfb71002f74599c0dbf9" + +yinbaoAppKey = "682628966212343269" +yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" + +aliUpcAppCode = "00a6eefba0204d3fa310ac0ee7a6fc54" + +wxpayNotifyURL = "http://callback.beta.jxc4.com/wxpay/msg/" + +# 抖音支付回调地址 +tiktokNotifyUrl = "https://callback.beta.jxc4.com/tictoc/tiktokMsg" + +tonglianPayAppID = "00183083" +tonglianPayKey = "18048531223" +tonglianPayCusID = "56065105499TVAH" +tonglianPayNotifyURL = "http://callback.beta.jxc4.com/tonglian/msg/" + +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" + +enableStoreWrite = true +enableJdStoreWrite = true +enableEbaiStoreWrite = true +enableMtwmStoreWrite = true +enableWscStoreWrite = true +enableYbStoreWrite = true +enableJdShopWrite = true + +disableWeimob = false +weimobCallbackURL = "http://callback.beta.jxc4.com/weimob" + +dingdingAgentID = 239461075 +dingdingAppKey = "ding7iu9cptairtcls0c" +dingdingSecret = "LWrZAFeqUfuVv7n_tc8vPpCAx6PT4CwManx2XCVhJOqGsx2L5XCDuX1sAN_JtvsI" + +dingdingCallbackAESKey = "EjTgnEa377fEcgzlQUbcgTzxPNznRjpOuSPgQAwv9aA" +dingdingCallbackToken = "ITKIL2FeFHZa48fEK9g3dbJ1DOww7shOrIZ2f" +dingdingCallbackURL = "http://callback.beta.jxc4.com/dingding/msg" + +pushAppID = "5lyyrvHODG6wC8Sdr3a9h" +pushAppKey = "iFrkUDmR2g5eqQpfh2kQ57" +pushAppSecret = "WTn53qd6WAAdLMXfmXvzb7" +pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47" + +fnAppID = "6705486294797503379" +fnAppSecret = "c1e6c280-e618-4103-9d0a-673bc54fb22e" +fnCode = "uDEyAmTbrfS2qjYbgi20Jm" +fnMerchantId= "51658" +fnCallbackURL = "http://callback.jxc4.com/fn/msg" + +jxPrintAppID = "1000" +jxPrintAppKey = "rfBd56ti2SMtYvSg" + +tiktokAppKey = "tta6a1d01c399f264201" +tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" + +tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 +TiktokJXDJApiID="ttaceeda5333d7a7ab01" +tiktokJXDJSecret="5c8492ec2744fb72bb6cc356983f3cfc317f85d4" +#国美 +gomeiAppKey = "N0R033L2QQFR53" +gomeiAppSecret = "686ffc3e31c24594838baed045563790" \ No newline at end of file diff --git a/conf/config.json b/conf/config.json new file mode 100644 index 0000000..5b5d7a6 --- /dev/null +++ b/conf/config.json @@ -0,0 +1,13 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* upfile提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "https://image.jxc4.com/", /* 图片访问路径前缀 */ + "imagePathFormat": "/" /* /ueditor/jsp/upload/image上传保存路径,可以自定义保存路径和文件名格式 */ +} \ No newline at end of file diff --git a/conf/rbac_model.conf b/conf/rbac_model.conf new file mode 100644 index 0000000..71159e3 --- /dev/null +++ b/conf/rbac_model.conf @@ -0,0 +1,14 @@ +[request_definition] +r = sub, obj, act + +[policy_definition] +p = sub, obj, act + +[role_definition] +g = _, _ + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act \ No newline at end of file diff --git a/controllers/app/print_bind_store.go b/controllers/app/print_bind_store.go new file mode 100644 index 0000000..bdc5b03 --- /dev/null +++ b/controllers/app/print_bind_store.go @@ -0,0 +1,109 @@ +package app + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-print/controllers" + "git.rosy.net.cn/jx-print/globals" + "git.rosy.net.cn/jx-print/model" + tempModel "git.rosy.net.cn/jx-print/model/app_model" + printServer "git.rosy.net.cn/jx-print/services/print_server/app_server" + "github.com/gin-gonic/gin" + "net/http" +) + +type PrinterBindStore struct { +} + +var PrinterBindStoreController = new(PrinterBindStore) + +// AddPrinterBindStore 记录授权成功的门店信息 +// @Title 记录授权成功的门店信息 +// @Description 记录授权成功的门店信息 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.AddBindStore true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /bindingStore [post] +func (p *PrinterBindStore) AddPrinterBindStore(c *gin.Context) { + var ( + err error + tokenInfo *model.TokenInfo + param = &tempModel.AddBindStore{} + bindServer = printServer.PrintBindStore{} + ) + if err = c.ShouldBind(¶m); err != nil { + controllers.BuildErrJson(c, err) + return + } + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + err = bindServer.AddStoreBind(tokenInfo.User.UserID, param) + return retVal, "", err + }) +} + +// CheckStoreBindStatus 检查用户是否可以取消门店打印机绑定 +// @Title 检查用户是否可以取消门店打印机绑定 +// @Description 检查用户是否可以取消门店打印机绑定 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.RelieveStore true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /checkBindingStore [post] +func (p *PrinterBindStore) CheckStoreBindStatus(c *gin.Context) { + var ( + err error + tokenInfo *model.TokenInfo + param = &tempModel.RelieveStore{} + bindServer = printServer.PrintBindStore{} + ) + if err = c.ShouldBind(¶m); err != nil { + controllers.BuildErrJson(c, err) + return + } + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + have, err := bindServer.QueryStoreAndUser(param) + return map[string]bool{"bind": have}, "", err + }) +} + +// LoseStoreAuthorize 失去授权回调 +// @Title 失去授权回调 +// @Description 失去授权回调 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.RelieveStore true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /loseAuthorize [post] +func (p *PrinterBindStore) LoseStoreAuthorize(c *gin.Context) { + if c.Request.Method == http.MethodPost { + var ( + bindServer = printServer.PrintBindStore{} + ) + storeId, err := bindServer.AnalysisStore(c.Request) + if err != nil { + globals.SugarLogger.Errorf("京西菜市门店失去授权回调错误:%v", err) + c.JSON(http.StatusNotFound, "") + } + + if storeId == "" { + globals.SugarLogger.Errorf("京西菜市门店失去授权回调错误,门店id不能小于等于0:%v", err) + c.JSON(http.StatusNotFound, "") + } + if err := bindServer.LoseAuthorize(utils.Str2Int64(storeId)); err != nil { + globals.SugarLogger.Errorf("通联支付,回调函数错误处理异常:%v", err) + c.JSON(http.StatusNotFound, "") + } + + c.JSON(http.StatusOK, "") + } else { + c.JSON(http.StatusNotFound, "") + } +} diff --git a/controllers/app/print_setting.go b/controllers/app/print_setting.go index 336862b..8aab787 100644 --- a/controllers/app/print_setting.go +++ b/controllers/app/print_setting.go @@ -27,12 +27,47 @@ func (p *PrintSetting) UpdatePrintSetting(c *gin.Context) { param = &tempModel.UpdatePrintSetting{} server = app_server.PrintSettingInfoServer ) + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + if err = c.ShouldBind(param); err != nil { controllers.BuildErrJson(c, err) return } + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { err = server.UpdatePrintSetting(tokenInfo.User.UserID, param) return "", "", err }) } + +// GetPrintSetting 获取当前打印机设置 +// @Title 获取当前打印机设置 +// @Description 获取当前打印机设置 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.GetPrintSetting true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /getPrintSetting [get] +func (p *PrintSetting) GetPrintSetting(c *gin.Context) { + var ( + err error + param = &tempModel.GetPrintSetting{} + server = app_server.PrintSettingInfoServer + tokenInfo *model.TokenInfo + ) + + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + + if err = c.ShouldBind(param); err != nil { + controllers.BuildErrJson(c, err) + return + } + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + retVal, err = server.QueryPrintSetting(param.PrintNo) + return retVal, "", err + }) +} diff --git a/controllers/app/print_temp.go b/controllers/app/print_temp.go index 138f3bf..e62dcd3 100644 --- a/controllers/app/print_temp.go +++ b/controllers/app/print_temp.go @@ -75,6 +75,7 @@ func (p *PrinterTemp) DeleteTemp(c *gin.Context) { // @Title 获取用户模板 // @Description 获取用户模板 // @Param token cookie string true "用户登录token" +// @Param data body app_model.QueryUserTemp true "请求参数" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /getUserTempList [get] @@ -82,7 +83,7 @@ func (p *PrinterTemp) GetUserTempList(c *gin.Context) { var ( err error tokenInfo *model.TokenInfo - param = tempModel.DeleteTemp{} + param = tempModel.QueryUserTemp{} tempServer = printServer.TempServer{} ) if err = c.ShouldBind(¶m); err != nil { @@ -92,8 +93,9 @@ func (p *PrinterTemp) GetUserTempList(c *gin.Context) { if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { return } + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { - retVal, err = tempServer.QueryTempList(tokenInfo.User.UserID) + retVal, err = tempServer.QueryTempList(tokenInfo.User.UserID, param.PrintSn) return retVal, "", err }) } @@ -117,8 +119,13 @@ func (p *PrinterTemp) SwitchTemp(c *gin.Context) { controllers.BuildErrJson(c, err) return } + + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { - err = tempServer.SwitchTemp(tokenInfo.User.UserID, param.ID) + err = tempServer.SwitchTemp(tokenInfo.User.UserID, param.PrintSn, param.ID) return "", "", err }) } diff --git a/controllers/app/tonglian_pay.go b/controllers/app/tonglian_pay.go new file mode 100644 index 0000000..38b9ed1 --- /dev/null +++ b/controllers/app/tonglian_pay.go @@ -0,0 +1,71 @@ +package app + +import ( + "git.rosy.net.cn/jx-print/controllers" + "git.rosy.net.cn/jx-print/globals" + "git.rosy.net.cn/jx-print/model" + "git.rosy.net.cn/jx-print/model/app_model" + "git.rosy.net.cn/jx-print/services/api" + "git.rosy.net.cn/jx-print/services/print_server/app_server" + "github.com/gin-gonic/gin" + "net/http" +) + +// Pay4Order 充值打印机 +// @Title 充值打印机 +// @Description 充值打印机 +// @Param token header string true "认证token" +// @Param data body app_model.PayOrder true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /pay4Order [post] +func (a *Auth2Controller) Pay4Order(c *gin.Context) { + // 参数绑定 + var ( + err error + params *app_model.PayOrder + service = app_server.PrintPayServer + tokenInfo *model.TokenInfo + ) + + if err = c.ShouldBind(¶ms); err != nil { + c.JSON(http.StatusOK, &model.CallBack{ + Code: model.ErrCodeNormal, + Desc: err.Error(), + }) + return + } + + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + pay, err := service.Pay4Order(tokenInfo.User, service.GetRealRemoteIP(c), params.TotalFee, params.PayType, params.VendorPayType, params.PrintNo) + if err != nil { + return nil, "", err + } + + return map[string]interface{}{"pay": pay}, "", nil + }) +} + +func (a *Auth2Controller) PayCallBack(c *gin.Context) { + if c.Request.Method == http.MethodPost { + call, err := api.TLpayAPI.GetCallbackMsg(c.Request) + if err != nil { + globals.SugarLogger.Errorf("通联支付,结构体转换错误:%v", err) + c.JSON(http.StatusNotFound, "") + } + + var service = app_server.PrintPayServer + if err := service.OnTLPayCallback(call); err != nil { + globals.SugarLogger.Errorf("通联支付,回调函数错误处理异常:%v", err) + c.JSON(http.StatusNotFound, "") + } + + c.JSON(http.StatusOK, call) + } else { + c.JSON(http.StatusNotFound, "") + } +} diff --git a/controllers/app/wx_print.go b/controllers/app/wx_print.go index 83fcb71..570ec68 100644 --- a/controllers/app/wx_print.go +++ b/controllers/app/wx_print.go @@ -2,13 +2,16 @@ package app import ( "errors" + "fmt" "git.rosy.net.cn/jx-print/controllers" + "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model" printModel "git.rosy.net.cn/jx-print/model/app_model" "git.rosy.net.cn/jx-print/putils" print "git.rosy.net.cn/jx-print/services/print_server" printServer "git.rosy.net.cn/jx-print/services/print_server/app_server" "github.com/gin-gonic/gin" + "time" ) type Print struct{} @@ -30,6 +33,8 @@ func (p *Print) AddPrinters(c *gin.Context) { param = printModel.AddPrintReq{} printInfo []*model.PrintInfo setting = printServer.PrintSettingInfoServer + bill = printServer.PrintBillServer + txDB = globals.GetTxDb() ) if err = c.ShouldBind(¶m); err != nil { @@ -45,18 +50,48 @@ func (p *Print) AddPrinters(c *gin.Context) { } controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { - // 校验打印机绑定用户 - if err := printServer.QueryPrintKeyIsExit(printInfo[0], param.Phone, param.BizId, param.Code, param.AppID); err != nil { + // 查询打印机心跳,服务器接收到打印机心跳请求,才可以继续绑定!防止用户无休止绑定打印机! + // 只有开机联网成功的打印机才可以绑定用户 + have, err := printServer.PrintActivationServer.QueryPrintHeard(printInfo[0].PrintNo) + if err != nil { return nil, "", err } + if !have { + return nil, "", fmt.Errorf("未检测到打印机心跳,请激活打印机,链接无线网络") + } + // 添加打印机 - if err := printServer.AddPrinters(tokenInfo, param.AppID, printInfo); err != nil { + if err := printServer.AddPrinters(txDB, tokenInfo, param.AppID, printInfo, param.Phone); err != nil { + txDB.Rollback() return nil, "", err } + // 赋予默认配置 - if err := setting.SystemInitPrintSetting(printInfo[0].PrintNo); err != nil { + if err := setting.SystemInitPrintSetting(txDB, printInfo[0].PrintNo); err != nil { + txDB.Rollback() return nil, "", err } + + // 初始化打印机账户 + if err := bill.InitPPrintBill(txDB, &printModel.PrintBill{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + PrintNo: printInfo[0].PrintNo, + PrintBalance: 20000, + UserId: tokenInfo.User.UserID, + }); err != nil { + txDB.Rollback() + return nil, "", err + } + defer func() { + if r := recover(); r != nil { + txDB.Rollback() + } else { + txDB.Commit() + } + }() + + // 初始化打印机余额,如果打印机存在,如果打印机存在,不做修改!打印机不存在则初始化打印机余额 return "", "", nil }) @@ -85,7 +120,30 @@ func (p *Print) GetPrinters(c *gin.Context) { } controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { - retVal, err = printServer.GetPrinters(param.AppID, param.PrintNo, param.Name, param.Status, param.IsOnline, param.Offset, param.PageSize, "") + retVal, err = printServer.GetPrinters(param.AppID, param.PrintNo, param.Name, param.Status, param.IsOnline, param.Offset, param.PageSize, tokenInfo.User.UserID) + return retVal, "", err + }) +} + +// GetPrintIsUse 查询打印机是否被使用 GET +// @Title 查询打印机是否被使用 +// @Description 查询打印机是否被使用 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.GetPrintIsUse true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /getPrintIsUse [get] +func (p *Print) GetPrintIsUse(c *gin.Context) { + var ( + err error + param = printModel.GetPrintIsUse{} + ) + if err = c.ShouldBind(¶m); err != nil { + controllers.BuildErrJson(c, err) + return + } + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + retVal, err = printServer.GetPrintIsUse(param.PrintNo) return retVal, "", err }) } @@ -103,7 +161,6 @@ func (p *Print) DelPrinters(c *gin.Context) { err error tokenInfo *model.TokenInfo param = printModel.DeletePrintReq{} - printNos []string tempServer = printServer.TempServer{} settingServer = printServer.PrintSettingServer{} ) @@ -114,21 +171,23 @@ func (p *Print) DelPrinters(c *gin.Context) { if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { return } - if err = putils.UnmarshalUseNumber([]byte(param.PrintNos), &printNos); err != nil { - controllers.BuildErrJson(c, err) - return - } controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + // 手机号验证 + if err := printServer.DeletePrintCheck(param.PrintNos, param.Phone, param.BizId, param.Code, param.AppID); err != nil { + return nil, "", err + } + // 删除打印机 - if err := printServer.DelPrinters(param.AppID, tokenInfo, printNos); err != nil { + if err := printServer.DelPrinters(param.AppID, tokenInfo, param.PrintNos); err != nil { return nil, "", err } // 删除模板 - err = tempServer.DeleteAllTemp(tokenInfo.User.UserID, printNos) + err = tempServer.DeleteAllTemp(tokenInfo.User.UserID, param.PrintNos) // 删除设置 - err = settingServer.DeletePrintSetting(printNos) + err = settingServer.DeletePrintSetting(param.PrintNos) // 删除打印消息 - err = print.DeletePrintMsg(printNos) + err = print.DeletePrintMsg(param.PrintNos) + return retVal, "", err }) } @@ -224,6 +283,35 @@ func (p *Print) GetPrintMessages(c *gin.Context) { }) } +// QueryPrintBill 查询打印机账户余额 get +// @Title 获取打印机账户余额 +// @Description 获取打印机账户余额 +// @Param token cookie string true "用户登录token" +// @Param data body app_model.QueryPrintBill true "请求参数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /queryPrintBill [get] +func (p *Print) QueryPrintBill(c *gin.Context) { + var ( + err error + tokenInfo *model.TokenInfo + param = printModel.QueryPrintBill{} + server = printServer.PrintBillServer + ) + if err = c.ShouldBind(¶m); err != nil { + controllers.BuildErrJson(c, err) + return + } + if tokenInfo = controllers.CheckToken(c); tokenInfo == nil { + return + } + + controllers.CallFunc(c, func() (retVal interface{}, errCode string, err error) { + retVal, err = server.QueryPrintBill(tokenInfo.User.UserID, param.PrintNo) + return retVal, "", err + }) +} + // StatPrinterReport 查询打印统计(首页) GET func (p *Print) StatPrinterReport(c *gin.Context) { var ( diff --git a/controllers/controller.go b/controllers/controller.go index b1f4140..3fd6971 100644 --- a/controllers/controller.go +++ b/controllers/controller.go @@ -22,10 +22,9 @@ func init() { func CheckToken(c *gin.Context) (tokenInfo *model.TokenInfo) { var ( - cookie *http.Cookie - err error - tokenMap map[string]interface{} - user *model.User + cookie *http.Cookie + err error + user *model.User ) tokenInfo = &model.TokenInfo{} //验证token @@ -40,8 +39,9 @@ func CheckToken(c *gin.Context) (tokenInfo *model.TokenInfo) { } else { tokenInfo.Token = cookie.Value } - globals.SugarLogger.Debugf("checkToken token: %v", tokenInfo.Token) - if tokenMap = putils.GetKey(tokenInfo.Token).(map[string]interface{}); tokenMap == nil { + + tokenMap2 := putils.GetKey(tokenInfo.Token) + if utils.IsNil(tokenMap2) { err = fmt.Errorf("token过期或无效,请重新登录!") c.JSON(http.StatusOK, &model.CallBack{ Desc: err.Error(), @@ -49,7 +49,8 @@ func CheckToken(c *gin.Context) (tokenInfo *model.TokenInfo) { }) return nil } - data, _ := json.Marshal(tokenMap) + + data, _ := json.Marshal(tokenMap2) if err = json.Unmarshal(data, &user); err == nil && user != nil { tokenInfo.User = user } else { @@ -152,8 +153,8 @@ func createToken(user *model.User) (token string) { wxConst.TokenHeader, wxConst.TokenVer, user.UserID, - time.Now().Format("20060102-150405"), - utils.GetUUID(), + time.Now().Format("20060102"), + utils.Int2Str(user.ID), user.Mobile, }, wxConst.TokenTypeSep) } diff --git a/dao/dao.go b/dao/dao.go index bbb699e..ed21754 100644 --- a/dao/dao.go +++ b/dao/dao.go @@ -53,6 +53,97 @@ func Insert(db *sqlx.DB, obj interface{}) (err error) { return err } +func InsertTx(db *sqlx.Tx, obj interface{}) (err error) { + var ( + value = reflect.ValueOf(obj) + stype = reflect.TypeOf(obj) + sql, values = strings.Builder{}, strings.Builder{} + sqlParams = []interface{}{} + direct reflect.Value + ) + if stype.Kind() != reflect.Struct { + direct = reflect.Indirect(value) + stype = stype.Elem() + } else { + direct = value + } + sname := stype.Name() + sql.WriteString("INSERT INTO ") + for i := 0; i < stype.NumField(); i++ { + if stype.Field(i).Type.String() == "*time.Time" { + if direct.Field(i).Interface().(*time.Time) != nil { + values.WriteString(stype.Field(i).Tag.Get("json") + ",") + sqlParams = append(sqlParams, direct.Field(i).Interface()) + } + } else { + if !direct.Field(i).IsZero() { + values.WriteString(stype.Field(i).Tag.Get("json") + ",") + sqlParams = append(sqlParams, direct.Field(i).Interface()) + } + } + } + sql.WriteString(putils.UnMarshalHr(sname) + "(") + sql.WriteString(values.String()[:len(values.String())-1]) + sql.WriteString(") VALUES(") + for i := 0; i < len(strings.Split(values.String(), ","))-1; i++ { + if i != 0 { + sql.WriteString(",") + } + sql.WriteString("?") + } + sql.WriteString(")") + _, err = db.Exec(sql.String(), sqlParams...) + return err +} + +func UpdateTx(db *sqlx.Tx, obj interface{}, fields ...string) (err error) { + var ( + value = reflect.ValueOf(obj) + stype = reflect.TypeOf(obj) + sql = strings.Builder{} + sqlParams = []interface{}{} + direct reflect.Value + fieldsMap = make(map[string]*struct{}) + ) + if stype.Kind() != reflect.Struct { + direct = reflect.Indirect(value) + stype = stype.Elem() + } else { + direct = value + } + sname := stype.Name() + sql.WriteString("UPDATE ") + sql.WriteString(putils.UnMarshalHr(sname) + " SET ") + fieldsStr := []string{} + for _, v := range fields { + fieldsStr = append(fieldsStr, v+"=?") + fieldsMap[v] = &struct{}{} + } + sql.WriteString(strings.Join(fieldsStr, ",")) + sql.WriteString(" WHERE id = ?") + for i := 1; i < stype.NumField(); i++ { + if fieldsMap[stype.Field(i).Tag.Get("json")] != nil { + if stype.Field(i).Type.String() == "*time.Time" { + if direct.Field(i).Interface().(*time.Time) != nil { + sqlParams = append(sqlParams, direct.Field(i).Interface()) + } + } else { + if !direct.Field(i).IsZero() { + sqlParams = append(sqlParams, direct.Field(i).Interface()) + } + } + } + } + if direct.Field(0).Int() == 0 { + return err + } else { + sqlParams = append(sqlParams, direct.Field(0).Int()) + } + + _, err = db.Exec(sql.String(), sqlParams...) + return err +} + func Update(db *sqlx.DB, obj interface{}, fields ...string) (err error) { var ( value = reflect.ValueOf(obj) diff --git a/dao/print_activation.go b/dao/print_activation.go new file mode 100644 index 0000000..caa3045 --- /dev/null +++ b/dao/print_activation.go @@ -0,0 +1,18 @@ +package dao + +import "git.rosy.net.cn/jx-print/globals" + +type PrintActivation struct { +} + +var PrintActivationDao = new(PrintActivation) + +// QueryPrintHeartBeat 查询打印机是否心跳监听正常 +func (p *PrintActivation) QueryPrintHeartBeat(printNo string) (bool, error) { + count := 0 + err := globals.GetDB().QueryRow(`SELECT count(print_no) FROM print_activation WHERE print_no = ?`, []interface{}{printNo}...).Scan(&count) + if err != nil { + return false, err + } + return count == 1, nil +} diff --git a/dao/print_bill.go b/dao/print_bill.go new file mode 100644 index 0000000..aa93deb --- /dev/null +++ b/dao/print_bill.go @@ -0,0 +1,49 @@ +package dao + +import ( + "git.rosy.net.cn/jx-print/globals" + "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" +) + +// QueryPrintBill 查询打印机账户是否存在 +func QueryPrintBill(userId, printNo string) ([]*app_model.PrintBill, error) { + sql := `SELECT * FROM print_bill WHERE 1 = 1 ` + var param []interface{} + if userId != "" { + sql += ` AND user_id = ? ` + param = append(param, userId) + } + if printNo != "" { + sql += ` AND print_no = ? ` + param = append(param, printNo) + } + + var result []*app_model.PrintBill + if err := globals.GetDB().Select(&result, sql, param...); err != nil { + return nil, err + } + return result, nil +} + +// InitPrintBill 初始化打印机账户 +func InitPrintBill(txDB *sqlx.Tx, param *app_model.PrintBill) error { + if err := InsertTx(txDB, param); err != nil { + return err + } + return nil +} + +// AddMoney 添加充值金额 +func AddMoney(db *sqlx.Tx, printNo string, money int64) error { + sql := `UPDATE print_bill SET print_balance = print_balance + ? WHERE print_no = ?` + if _, err := db.Exec(sql, []interface{}{printNo, money}...); err != nil { + return err + } + return nil +} + +// UpdateBillToUser 当打印机账户从菜市绑定时,未分配用户,用户再使用小程序绑定时,将打印机分配给用户! +func UpdateBillToUser(db *sqlx.Tx, param *app_model.PrintBill) error { + return UpdateTx(db, param, []string{"user_id"}...) +} diff --git a/dao/print_bill_pay.go b/dao/print_bill_pay.go new file mode 100644 index 0000000..f68fa81 --- /dev/null +++ b/dao/print_bill_pay.go @@ -0,0 +1,35 @@ +package dao + +import ( + "fmt" + "git.rosy.net.cn/jx-print/globals" + order "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" +) + +// InsertPrinterPayRecord 新增充值记录 +func InsertPrinterPayRecord(order *order.OrderPay) error { + return Insert(globals.GetDB(), order) +} + +// QueryPrinterPayRecord 查询充值记录 +func QueryPrinterPayRecord(orderId string) (*order.OrderPay, error) { + sql := `SELECT * FROM order_pay WHERE pay_order_id = ?` + + var result []*order.OrderPay + if err := globals.GetDB().Select(&result, sql, []interface{}{orderId}...); err != nil { + return nil, err + } + + if len(result) != 1 { + globals.SugarLogger.Errorf("回调查询错误,订单id不存在或者不唯一") + return nil, fmt.Errorf("回调查询错误,订单id不存在或者不唯一") + } + + return result[0], nil +} + +// UpdatePrinterPayRecord 修改充值表记录状态 +func UpdatePrinterPayRecord(db *sqlx.Tx, order *order.OrderPay, field ...string) error { + return UpdateTx(db, order, field...) +} diff --git a/dao/print_bill_record.go b/dao/print_bill_record.go new file mode 100644 index 0000000..19762e5 --- /dev/null +++ b/dao/print_bill_record.go @@ -0,0 +1,10 @@ +package dao + +import ( + printModel "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" +) + +func AddIncomeRecord(db *sqlx.Tx, param *printModel.PrintBillRecord) error { + return InsertTx(db, param) +} diff --git a/dao/print_bind_store.go b/dao/print_bind_store.go new file mode 100644 index 0000000..99c6fd7 --- /dev/null +++ b/dao/print_bind_store.go @@ -0,0 +1,49 @@ +package dao + +import ( + "git.rosy.net.cn/jx-print/globals" + storeModel "git.rosy.net.cn/jx-print/model/app_model" +) + +// CreatePrintStoreBind 创建绑定 +func CreatePrintStoreBind(param *storeModel.PrintBindStore) error { + return Insert(globals.GetDB(), param) +} + +// QueryBindNumber 查询门店绑定数量 +func QueryBindNumber(userId, printNo string) (int, error) { + sql := `SELECT count(*) FROM print_bind_store WHERE user_id = ? AND print_no = ?` + + count := 0 + row := globals.GetDB().DB.QueryRow(sql, []interface{}{userId, printNo}...) + if err := row.Scan(&count); err != nil { + return 0, err + } + + return count, nil +} + +// RelieveToken 解除授权绑定门店信息 +func RelieveToken(userId, printNo string, storeId int64) error { + _, err := globals.GetDB().Exec(`UPDATE print_bind_store SET bind_status = ? WHERE user_id = ? AND print_no = ? AND store_id = ?`, []interface{}{storeModel.StoreBindPrintFail, userId, printNo, storeId}...) + return err +} + +// QueryStoreAndUserManager 查询用户门店的绑定关系 +func QueryStoreAndUserManager(userId, printNo string, storeId int64) (bool, error) { + count := 0 + err := globals.GetDB().DB.QueryRow(`SELECT count(*) FROM print_bind_store WHERE user_id = ? AND print_no = ? AND store_id = ?`, []interface{}{userId, printNo, storeId}...).Scan(&count) + if err != nil { + return false, err + } + if count != 1 { + return false, nil + } + return true, nil +} + +// UpdateStoreAuthorize 失去授权 +func UpdateStoreAuthorize(storeId int64) error { + _, err := globals.GetDB().Exec(`UPDATE print_bind_store SET store_status = ? WHERE store_id = ?`, []interface{}{storeModel.StoreStatusLose, storeId}...) + return err +} diff --git a/dao/print_dao.go b/dao/print_dao.go index 0bda8cc..14bbf53 100644 --- a/dao/print_dao.go +++ b/dao/print_dao.go @@ -79,7 +79,6 @@ func GetPrintersPage(db *sqlx.DB, appID int, printNo, name string, status, isOnl } sqlOther += " LIMIT ? OFFSET ?" sqlParams = append(sqlParams, pageSize, offset) - var printers []model.Printer if err = db.Select(&printers, sql+sqlOther, sqlParams...); err != nil { return nil, err @@ -88,6 +87,16 @@ func GetPrintersPage(db *sqlx.DB, appID int, printNo, name string, status, isOnl return &model.PagedInfo{TotalCount: count, Data: printers}, err } +func GetPrintIsUse(printNo string) (bool, error) { + sql := `SELECT * FROM printer WHERE deleted_at = ? AND print_no = ?` + param := []interface{}{utils.DefaultTimeValue, printNo} + var result []*model.Printer + if err := globals.GetDB().Select(&result, sql, param...); err != nil { + return false, err + } + return len(result) == 1, nil +} + func GetPrintMessagesPage(db *sqlx.DB, printNo, msgID, beginAt, endAt string, offset, pageSize int) (page *model.PagedInfo, err error) { var ( printMsgs []*model.PrintMsg @@ -229,20 +238,20 @@ func GetPrinter(db *sqlx.DB, printNo, iccID string) (printer *model.Printer, err } // GetPrintById 根据用户id和打印机编号获取打印机 -func GetPrintById(userId, printNo string) (bool, error) { +func GetPrintById(userId, printNo string) (bool, *model.Printer, error) { var printer []*model.Printer sql := `SELECT * FROM printer WHERE print_no = ? AND user_id = ? AND deleted_at = ?` if err := globals.GetDB().Select(&printer, sql, []interface{}{printNo, userId, utils.DefaultTimeValue}...); err != nil { - return false, err + return false, nil, err } if len(printer) != 1 { - return false, errors.New("用户打印机数据异常,联系管理员") // 打印机编号唯一 + return false, nil, errors.New("用户打印机数据异常,联系管理员") // 打印机编号唯一 } - return true, nil + return true, printer[0], nil } // DeletePrinterMsg 删除打印机消息 -func DeletePrinterMsg(printNos []string) error { - _, err := globals.GetDB().Exec(`DELETE FROM print_msg WHERE print_no IN (?) `, []interface{}{printNos}...) +func DeletePrinterMsg(printNos string) error { + _, err := globals.GetDB().Exec(`DELETE FROM print_msg WHERE print_no = ?`, []interface{}{printNos}...) return err } diff --git a/dao/print_setting.go b/dao/print_setting.go index d21abb4..0e9b161 100644 --- a/dao/print_setting.go +++ b/dao/print_setting.go @@ -1,9 +1,11 @@ package dao import ( + "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/globals" settingModel "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" ) type PrintSettingDao struct{} @@ -26,13 +28,14 @@ func (p *PrintSettingDao) QueryPrintNoIsExit(printNo string) (bool, error) { } // InsertPrintSetting 插入打印机设置 -func (p *PrintSettingDao) InsertPrintSetting(param *settingModel.PrintSetting) error { - return Insert(globals.GetDB(), param) +func (p *PrintSettingDao) InsertPrintSetting(tx *sqlx.Tx, param *settingModel.PrintSetting) error { + return InsertTx(tx, param) } // UpdatePrinterSetting 修改打印机配置 func (p *PrintSettingDao) UpdatePrinterSetting(param *settingModel.UpdatePrintSetting) error { db := globals.GetDB() + sql := `UPDATE print_setting SET ` var param2 []interface{} @@ -41,72 +44,50 @@ func (p *PrintSettingDao) UpdatePrinterSetting(param *settingModel.UpdatePrintSe param2 = append(param2, param.CallNameSetting) } if param.SystemVoice != 0 { - sql += ` system_voice = ? ` + sql += ` ,system_voice = ? ` param2 = append(param2, param.SystemVoice) } if param.PrintVoiceSetting != "" { - sql += ` print_voice_setting = ? ` + sql += ` ,print_voice_setting = ? ` param2 = append(param2, param.PrintVoiceSetting) } if param.OrderVoiceSetting != "" { - sql += ` order_voice_setting = ? ` + sql += ` ,order_voice_setting = ? ` param2 = append(param2, param.OrderVoiceSetting) } if param.RiderVoiceSetting != "" { - sql += ` rider_voice_setting = ? ` + sql += ` ,rider_voice_setting = ? ` param2 = append(param2, param.RiderVoiceSetting) } if param.CustomerVoiceSetting != "" { - sql += ` customer_voice_setting = ? ` + sql += ` ,customer_voice_setting = ? ` param2 = append(param2, param.CustomerVoiceSetting) } if param.PickingSetting != "" { - sql += ` picking_setting = ? ` + sql += ` ,picking_setting = ? ` param2 = append(param2, param.PickingSetting) } sql += ` WHERE print_no = ? ` + param2 = append(param2, param.PrintNo) _, err := db.Exec(sql, param2...) return err } // DeleteSetting 删除打印机设置 -func (p *PrintSettingDao) DeleteSetting(printNo []string) error { - _, err := globals.GetDB().Exec(`DELETE FROM print_setting WHERE print_no in (?)`, []interface{}{printNo}...) +func (p *PrintSettingDao) DeleteSetting(printNo string) error { + _, err := globals.GetDB().Exec(`DELETE FROM print_setting WHERE print_no = ?`, []interface{}{printNo}...) return err } -// GetUserPrintSetting 获取用户打印机设置 -func (p *PrintSettingDao) GetUserPrintSetting(userId, printNo string) { - sql := ` - SELECT - s.* - FROM - printer p - INNER JOIN print_setting s ON s.print_no = p.print_no - WHERE - p.user_id = ? - AND p.print_no = ? -` - param := []interface{}{userId, printNo} - - var setting *settingModel.PrintSetting - if err := globals.GetDB().QueryRow(sql, param...).Scan(&setting); err != nil { - return - } - if setting == nil { - return - } - - //json.Unmarshal([]byte(setting.)) -} - // QueryPrintSetting 查询打印机设置 func (p *PrintSettingDao) QueryPrintSetting(printNo string) (*settingModel.PrintSetting, error) { - var result *settingModel.PrintSetting - if err := globals.GetDB().QueryRow(`SELECT * FROM print_setting WHERE print_no = ? AND deleted_at = ?`, printNo, utils.DefaultTimeValue).Scan(&result); err != nil { + var result []*settingModel.PrintSetting + if err := globals.GetDB().Select(&result, `SELECT * FROM print_setting WHERE print_no = ? AND deleted_at = ?`, printNo, utils.DefaultTimeValue); err != nil { return nil, err } - - return result, nil + if len(result) != 1 { + return nil, fmt.Errorf("打印机设置查询错误,联系管理员") + } + return result[0], nil } diff --git a/dao/printer_test.go b/dao/printer_test.go index 5ef20aa..e6b4a92 100644 --- a/dao/printer_test.go +++ b/dao/printer_test.go @@ -11,3 +11,9 @@ func TestGetPrinters(t *testing.T) { fmt.Println("data=======", data) fmt.Println("data=======", err) } + +func TestGetPrintUse(t *testing.T) { + have, err := PrintActivationDao.QueryPrintHeartBeat("20220818000001") + fmt.Println(have) + fmt.Println(err) +} diff --git a/dao/temp_dao.go b/dao/temp_dao.go index b7efb52..c61c73d 100644 --- a/dao/temp_dao.go +++ b/dao/temp_dao.go @@ -1,27 +1,33 @@ package dao import ( + "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model/app_model" ) // GetTempByName 根据模板名称获取模板 -func GetTempByName(userID, tempName string) ([]*app_model.SystemTemp, error) { +func GetTempByName(userID, printNo, tempName string) ([]*app_model.SystemTemp, error) { sql := `SELECT * FROM system_temp WHERE 1=1` var param []interface{} if userID != "" { sql += ` AND user_id = ?` param = append(param, userID) } + if printNo != "" { + sql += ` AND print_sn = ?` + param = append(param, printNo) + } if tempName != "" { sql += ` AND temp_name = ?` param = append(param, tempName) } + sql += ` AND deleted_at = ?` param = append(param, utils.DefaultTimeValue) - var result []*app_model.SystemTemp + var result []*app_model.SystemTemp if err := globals.GetDB().Select(&result, sql, param...); err != nil { return nil, err } @@ -34,32 +40,65 @@ func AddTemp(param *app_model.SystemTemp) error { } // UpdateOtherTempStatus 修改其他模板为非默认 -func UpdateOtherTempStatus(userId string) error { - _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = ? WHERE user_id = ?`, []interface{}{2, userId}) +func UpdateOtherTempStatus(userId, printNo string) error { + _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = ? WHERE user_id = ? AND print_sn = ?`, []interface{}{2, userId, printNo}...) return err } // UpdateTemp 修改模板数据 func UpdateTemp(param *app_model.SystemTemp, fields []string) error { + //sql := `UPDATE system_temp SET ` + //var sqlParam []interface{} + //updateBuffer := make([]string, 0, 14) + //if param.CreatedAt != "" { + // updateBuffer = append(updateBuffer, "created_at") + // sqlParam = append(sqlParam, param.Temp) + //} + //if param.UpdatedAt != "" { + //} + //if param.LastOperator != "" { + //} + //if param.DeletedAt != "" { + //} + //if param.TempName != "" { + //} + //if param.TempRank != "" { + //} + //if param.Temp != "" { + //} + //if param.UserId != "" { + //} + //if param.TempType != "" { + //} + //if param.TempSize != "" { + //} + //if param.PrintSn != "" { + //} + //if param.IsUse != "" { + //} + //if param.Properties != "" { + //} + return Update(globals.GetDB(), param, fields...) } // DeleteTemp 删除模板数据 func DeleteTemp(id int, userId string) error { + _, err := globals.GetDB().Exec(`DELETE FROM system_temp WHERE id = ? AND user_id = ?`, []interface{}{id, userId}...) return err } // DeleteAllTemp 删除用户所属打印机所有模板 -func DeleteAllTemp(userId string, printNo []string) error { - _, err := globals.GetDB().Exec(`DELETE FROM system_temp WHERE user_id = ? AND print_sn IN (?)`, []interface{}{userId, printNo}...) +func DeleteAllTemp(userId string, printNo string) error { + _, err := globals.GetDB().Exec(`DELETE FROM system_temp WHERE user_id = ? AND print_sn = ? `, []interface{}{userId, printNo}...) return err } // SelectUserTemp 查询用户模板 -func SelectUserTemp(userId string) ([]*app_model.SystemTemp, error) { +func SelectUserTemp(userId, printSn string) ([]*app_model.SystemTemp, error) { var result []*app_model.SystemTemp - if err := globals.GetDB().Select(&result, `SELECT * FROM system_temp WHERE user_id = ? AND deleted_at = ? ORDER BY created_at desc `, []interface{}{userId, utils.DefaultTimeValue}...); err != nil { + if err := globals.GetDB().Select(&result, `SELECT * FROM system_temp WHERE user_id = ? AND print_sn = ? AND deleted_at = ? ORDER BY created_at desc `, []interface{}{userId, printSn, utils.DefaultTimeValue}...); err != nil { return nil, err } return result, nil @@ -87,12 +126,26 @@ func QuerySystemTemp() ([]*app_model.SystemTemp, error) { } // SwitchTemp2User 切换模板 -func SwitchTemp2User(tempId int, userId string) error { - if _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = 2 WHERE user_id = ?`, []interface{}{userId}...); err != nil { +func SwitchTemp2User(tempId int, userId, printSn string) error { + if _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = 2 WHERE user_id = ? AND print_sn = ?`, []interface{}{userId, printSn}...); err != nil { return err } - if _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = 1 WHERE id = ? AND user_id = ?`, []interface{}{tempId, userId}...); err != nil { + if _, err := globals.GetDB().Exec(`UPDATE system_temp SET is_use = 1 WHERE id = ? AND user_id = ? AND print_sn = ?`, []interface{}{tempId, userId, printSn}...); err != nil { return err } return nil } + +// QueryTempById 查询模板根据id +func QueryTempById(id int) (data *app_model.SystemTemp, err error) { + var result []*app_model.SystemTemp + + if err := globals.GetDB().Select(&result, `SELECT * FROM system_temp WHERE id = ?`, []interface{}{id}...); err != nil { + return nil, err + } + + if len(result) != 1 { + return nil, fmt.Errorf("参数异常") + } + return result[0], nil +} diff --git a/globals/globals.go b/globals/globals.go index 5a2e9d5..7357ec7 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -15,6 +15,8 @@ var ( AliSecret = "NTegceUFX0FdfMovqCDzqcIKmhcoOu" SmsSignName = "京西菜市" SmsMobileVerifyTemplate = "SMS_175583158" + + TongLianPayCallBack = "http://callback.jxc4.com/wxpay/msg/" //通联回调地址 ) func init() { @@ -28,8 +30,14 @@ func init() { db.SetConnMaxLifetime(time.Second * 10) db.SetMaxOpenConns(200) // 设置与数据库建立连接的最大数目 db.SetMaxIdleConns(10) // 设置连接池中的最大闲置连接数 + } func GetDB() *sqlx.DB { return db } + +func GetTxDb() *sqlx.Tx { + tx, _ := db.Beginx() + return tx +} diff --git a/model/app_model/app_print.go b/model/app_model/app_print.go index 81842c0..21742ea 100644 --- a/model/app_model/app_print.go +++ b/model/app_model/app_print.go @@ -10,18 +10,22 @@ type AddPrintReq struct { } type QueryPrintReq struct { - AppID int `json:"app_id" form:"app_id" binding:"required"` // appId - PrintNo string `json:"print_no" form:"print_no"` //打印机编号 - Name string `json:"name" form:"name"` //打印机备注,模糊 - Status int `json:"status" form:"status"` //打印机状态。正常还是缺纸 - IsOnline int `json:"is_online" form:"is_online"` //在线状态。1在线,0离线 - Offset int `json:"offset" form:"offset"` // 跳过 - PageSize int `json:"page_size" form:"page_size" binding:"required"` // 页数 + AppID int `json:"app_id" form:"app_id" binding:"required"` // appId + PrintNo string `json:"print_no" form:"print_no"` // 打印机编号 + Name string `json:"name" form:"name"` // 打印机备注,模糊 + Status int `json:"status" form:"status"` // 打印机状态。正常还是缺纸 + IsOnline int `json:"is_online" form:"is_online"` // 在线状态。1在线,0离线 + Offset int `json:"offset" form:"offset"` // 跳过 + PageSize int `json:"page_size" form:"page_size"` // 页数 } type DeletePrintReq struct { AppID int `json:"app_id" form:"app_id" binding:"required"` - PrintNos string `json:"print_nos" form:"print_nos" binding:"required"` //打印机编号s + PrintNos string `json:"print_nos" form:"print_nos" binding:"required"` //打印机编号 + + Phone string `json:"phone" form:"phone" binding:"required"` + Code string `json:"code" form:"code" binding:"required"` + BizId string `json:"biz_id" form:"biz_id" binding:"required"` } type UpdatePrintReq struct { @@ -48,3 +52,11 @@ type GetPrintMsg struct { Offset int `json:"offset" form:"offset"` PageSize int `json:"page_size" form:"page_size" binding:"required"` } + +type GetPrintIsUse struct { + PrintNo string `json:"print_no" form:"print_no" binding:"required"` //打印机编号 +} + +type QueryPrintBill struct { + PrintNo string `json:"print_no" form:"print_no" binding:"required"` //打印机编号 +} diff --git a/model/app_model/print_activation.go b/model/app_model/print_activation.go new file mode 100644 index 0000000..3410204 --- /dev/null +++ b/model/app_model/print_activation.go @@ -0,0 +1,10 @@ +package app_model + +import "time" + +// PrintActivation 打印机激活记录 +type PrintActivation struct { + ID int `orm:"column(id)" json:"id" db:"id"` + CreatedAt time.Time `json:"created_at" db:"created_at"` + PrintNo string `orm:"type(varchar);size(32);index" json:"print_no" db:"print_no"` // 打印机编号 +} diff --git a/model/app_model/print_bill.go b/model/app_model/print_bill.go new file mode 100644 index 0000000..26a50d8 --- /dev/null +++ b/model/app_model/print_bill.go @@ -0,0 +1,13 @@ +package app_model + +import "time" + +// PrintBill 打印机账户 +type PrintBill struct { + ID int `orm:"column(id)" json:"id" db:"id"` + CreatedAt time.Time `json:"created_at" db:"created_at"` + UpdatedAt time.Time `json:"updated_at" db:"updated_at"` + PrintNo string `orm:"type(varchar);size(32);index" json:"print_no" db:"print_no"` // 打印机编号 + PrintBalance int64 `orm:"type(int);size(16)" json:"print_balance" db:"print_balance"` // 账户余额 + UserId string `orm:"type(varchar);size(125)" json:"user_id" db:"user_id"` // 打印机所属用户 +} diff --git a/model/app_model/print_bill_pay.go b/model/app_model/print_bill_pay.go new file mode 100644 index 0000000..5b99f0c --- /dev/null +++ b/model/app_model/print_bill_pay.go @@ -0,0 +1,47 @@ +package app_model + +import "time" + +const ( + // PayTypeWX PayType 支付类型 + PayTypeWX = 1 // 微信支付 + PayTypeTL = 2 // 通联宝支付 + + // PayStatusNo Status 状态值 + PayStatusNo = 0 + PayStatusYes = 1 + PayStatusFailed = 2 + PayStatusCanceled = 3 + PayStatusRefund = 4 + + PayBody = "京西云打印机余额充值" + OrderPayVendorId = 1 // 京西平台 +) + +type OrderPay struct { + ID int `orm:"column(id)" json:"id" db:"id"` + CreatedAt time.Time `orm:"type(datetime)" json:"created_at" db:"created_at"` // 创建时间 + UpdatedAt time.Time `orm:"type(datetime)" json:"updated_at" db:"updated_at"` // 更新时间 + PayOrderID string `orm:"column(pay_order_id);size(48)" json:"pay_order_id" db:"pay_order_id"` // 京西支付定单号 + PayType int `orm:"type(int);size(2)" json:"pay_type" db:"pay_type"` // 支付类型[1-微信,2-通联,3-抖音] + VendorPayType string `orm:"size(48)" json:"vendorPayType"` // + VendorOrderID string `orm:"column(vendor_order_id);size(48);index" json:"vendor_order_id" db:"vendor_order_id"` // 支付对应的购物订单号 + PrintNo string `orm:"column(print_no);size(48);index" json:"print_no" db:"print_no"` // 充值打印机编号 + Status int `orm:"type(int);size(2)" json:"status" json:"status" db:"status"` // 订单支付状态 + PayCreatedAt time.Time `orm:"type(datetime);index" json:"pay_created_at" db:"pay_created_at"` // 下单时间 + PayFinishedAt time.Time `orm:"type(datetime)" json:"pay_finished_at" db:"pay_finished_at"` // 支付完成时间 + TotalFee int `orm:"type(int);size(11)" json:"total_fee" db:"total_fee"` // 支付金额 + PrepayID string `orm:"column(prepay_id);index;size(48)" json:"prepay_id" db:"prepay_id"` // 下单后,支付前,支付方生成的事务ID + TransactionID string `orm:"column(transaction_id);index;size(48)" json:"transaction_id" db:"transaction_id"` // 支付成功后,支付方生成的事务ID + OriginalData string `orm:"type(text)" json:"-"` // 返回消息 + VendorID int `orm:"column(vendor_id)" json:"vendor_id" db:"vendor_id"` // 购物订单所属厂商代码(当前只有京西) + CodeURL string `orm:"column(code_url);size(3200)" json:"codeURL"` // +} + +type PayOrder struct { + SubAppID string `json:"sub_app_id" form:"sub_app_id" binding:"required"` // appID + PayType int `json:"pay_type" form:"pay_type" binding:"required"` // 支付类型 + VendorPayType string `json:"vendor_pay_type" form:"vendor_pay_type" binding:"required"` // 平台支付类型 + TotalFee int `json:"total_fee" form:"total_fee" binding:"required"` // 支付金额 + PrintNo string `json:"print_no" form:"print_no" binding:"required"` // 打印机编号 +} diff --git a/model/app_model/print_bill_record.go b/model/app_model/print_bill_record.go new file mode 100644 index 0000000..6e1334b --- /dev/null +++ b/model/app_model/print_bill_record.go @@ -0,0 +1,15 @@ +package app_model + +import "time" + +// PrintBillRecord 打印机充值/小费记录 +type PrintBillRecord struct { + ID int `orm:"column(id)" json:"id" db:"id"` + CreatedAt time.Time `json:"created_at" db:"created_at"` + UpdatedAt time.Time `json:"updated_at" db:"updated_at"` + PrintNo string `orm:"type(varchar);size(32);index" json:"print_no" db:"print_no"` // 打印机编号 + PayType int `orm:"type(int);size(2)" json:"pay_type" db:"pay_type"` // 支付类型[1-充值/2-支出] + PayMoney int `orm:"type(int);size(10)" json:"pay_money" db:"pay_money"` // 金额 + OrderId string `orm:"type(varchar);size(64);index" json:"order_id" db:"order_id"` // 订单号 + UserId string `orm:"type(varchar);size(125)" json:"user_id" db:"user_id"` // 打印机所属用户 +} diff --git a/model/app_model/print_bind_store.go b/model/app_model/print_bind_store.go new file mode 100644 index 0000000..4bafb97 --- /dev/null +++ b/model/app_model/print_bind_store.go @@ -0,0 +1,43 @@ +package app_model + +import "time" + +const ( + StoreStatusDisabled = -2 // 禁用 + StoreStatusClosed = -1 // 休息 + StoreStatusHaveRest = 0 // 临时休息 + StoreStatusOpened = 1 // 营业 + StoreStatusLose = -9 // 丢失授权 + + StoreBindPrintSuccess = 1 // 绑定成功 + StoreBindPrintFail = 2 // 解除绑定 +) + +type PrintBindStore struct { + ID int `orm:"column(id)" json:"id" db:"id"` + CreatedAt time.Time `orm:"type(datetime)" json:"created_at" db:"created_at"` // 创建时间 + UpdatedAt time.Time `orm:"type(datetime)" json:"updated_at" db:"updated_at"` // 更新时间 + StoreID int64 `orm:"column(store_id);type(int);size(11)" json:"store_id" db:"store_id"` // 门店id(为京西创建门店id)唯一 + StoreName string `orm:"type(varchar);size(255)" json:"store_name" db:"store_name"` // 门店名称 + StoreVendor int `orm:"type(int);size(2)" json:"store_vendor" db:"store_vendor"` // 门店平台 + PrintNo string `orm:"type(varchar);size(32);index" json:"print_no" db:"print_no"` // 打印机编号 + UserId string `orm:"type(varchar);size(125)" json:"user_id" db:"user_id"` // 打印机所属用户 + StoreStatus int `orm:"type(int);size(2)" json:"store_status" db:"store_status"` // 门店状态 + BindStatus int `orm:"type(int);size(2)" json:"bind_status" db:"bind_status"` // 绑定状态 +} + +// AddBindStore 添加门店授权 +type AddBindStore struct { + StoreID int64 `json:"store_id" form:"store_id" binding:"required"` // 门店id(为京西创建门店id) + StoreName string `json:"store_name" form:"store_name" binding:"required"` // 门店名称 + StoreVendor int `json:"store_vendor" form:"store_vendor" binding:"required"` // 门店平台 + PrintNo string `json:"print_no" form:"print_no" binding:"required"` // 打印机编号 + StoreStatus int `json:"store_status" form:"store_status" db:"store_status"` // 门店状态 +} + +// RelieveStore 解除门店授权 +type RelieveStore struct { + UserId string `orm:"type(varchar);size(125)" json:"user_id" db:"user_id"` // 打印机所属用户 + StoreID int64 `json:"store_id" form:"store_id" binding:"required"` // 门店id(为京西创建门店id) + PrintNo string `json:"print_no" form:"print_no" binding:"required"` // 打印机编号 +} diff --git a/model/app_model/print_setting.go b/model/app_model/print_setting.go index ec1d204..5f51b4c 100644 --- a/model/app_model/print_setting.go +++ b/model/app_model/print_setting.go @@ -20,18 +20,18 @@ type PrintSetting struct { } type PrintSettingObj struct { - ID int - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt time.Time - PrintNo string // 打印机编号 - CallNameSetting int // 称谓设置 [64-默认老板] - SystemVoice int // 平台语音开关[1打开] - PrintVoiceSetting *PrintVoice // 打印机提示语音设置 - OrderVoiceSetting *OrderVoice // 订单提示设置 - RiderVoiceSetting *RiderVoice // 骑手动态提示设置 - CustomerVoiceSetting *CustomerReceivingGoods // 客户收货提示设置 - PickingSetting *ShopPickingVoice // 拣货语音设置 + ID int `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt time.Time `json:"deleted_at"` + PrintNo string `json:"print_no"` // 打印机编号 + CallNameSetting int `json:"call_name_setting"` // 称谓设置 [64-默认老板] + SystemVoice int `json:"system_voice"` // 平台语音开关[1打开] + PrintVoiceSetting *PrintVoice `json:"print_voice_setting"` // 打印机提示语音设置 + OrderVoiceSetting *OrderVoice `json:"order_voice_setting"` // 订单提示设置 + RiderVoiceSetting *RiderVoice `json:"rider_voice_setting"` // 骑手动态提示设置 + CustomerVoiceSetting *CustomerReceivingGoods `json:"customer_voice_setting"` // 客户收货提示设置 + PickingSetting *ShopPickingVoice `json:"picking_setting"` // 拣货语音设置 } // PrintVoice 打印机提示语音设置 @@ -93,3 +93,8 @@ type UpdatePrintSetting struct { CustomerVoiceSetting string `json:"customer_voice_setting" form:"customer_voice_setting"` PickingSetting string `json:"picking_setting" form:"picking_setting"` } + +// GetPrintSetting 获取当前打印机设置 +type GetPrintSetting struct { + PrintNo string `json:"print_no" form:"print_no"` // 打印机编号 +} diff --git a/model/app_model/print_test.go b/model/app_model/print_test.go index 73f05be..fe06344 100644 --- a/model/app_model/print_test.go +++ b/model/app_model/print_test.go @@ -12,3 +12,8 @@ func TestPrintOrder(t *testing.T) { dd := strings.Replace(cc, "\n", "", -1) fmt.Println(dd) } + +func TestIsNil(t *testing.T) { + var data *PrintBindStore + fmt.Println(data == nil) +} diff --git a/model/app_model/system_temp.go b/model/app_model/system_temp.go index cb69851..31a0e88 100644 --- a/model/app_model/system_temp.go +++ b/model/app_model/system_temp.go @@ -21,33 +21,42 @@ type SystemTemp struct { UpdatedAt *time.Time `json:"updated_at" db:"updated_at"` LastOperator string `json:"last_operator" db:"last_operator"` DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"` - TempName string `json:"temp_name" db:"temp_name"` // 模板名称 - TempRank string `json:"temp_rank" db:"temp_rank"` // 模板顺序 - Temp string `json:"temp" db:"temp"` // 模板 - UserId string `json:"user_id" db:"user_id"` // 所属用户 - TempType string `json:"temp_type" db:"temp_type"` // 模板类型 - TempSize string `json:"temp_size" db:"temp_size"` // 模板尺寸 big/medium/small - PrintSn string `json:"print_sn" db:"print_sn"` // 模板所属打印机 - IsUse int `json:"is_use" db:"is_use"` // 默认使用 1-使用/2-不使用 + TempName string `json:"temp_name" db:"temp_name"` // 模板名称 + TempRank string `json:"temp_rank" db:"temp_rank"` // 模板顺序 + Temp string `json:"temp" db:"temp"` // 模板 + UserId string `json:"user_id" db:"user_id"` // 所属用户 + TempType string `json:"temp_type" db:"temp_type"` // 模板类型 user_store/user_consumer + TempSize string `json:"temp_size" db:"temp_size"` // 模板尺寸 big/medium/small + PrintSn string `json:"print_sn" db:"print_sn"` // 模板所属打印机 + IsUse int `json:"is_use" db:"is_use"` // 默认使用 1-使用/2-不使用 + Properties string `json:"properties" db:"properties"` // 模板字段属性 } type AddTemp struct { - ID int `json:"id" form:"id"` // 修改时传入 - TempName string `json:"temp_name" form:"temp_name" binding:"required"` // 模板名称 - Temp string `json:"temp" form:"temp" binding:"required"` // 模板 - UserId string `json:"user_id" form:"user_id"` // 所属用户 - TempType string `json:"temp_type" form:"temp_type" binding:"required"` // 模板类型 - TempSize string `json:"temp_size" form:"temp_size" binding:"required"` // 模板尺寸 big/medium/small - PrintSn string `json:"print_sn" db:"print_sn" binding:"required"` // 模板所属打印机 - IsUse int `json:"is_use" db:"is_use" binding:"required"` // 默认使用 1-使用/2-不使用 + CreatedAt *time.Time `json:"created_at" form:"created_at"` + ID int `json:"id" form:"id"` // 修改时传入 + TempName string `json:"temp_name" form:"temp_name" binding:"required"` // 模板名称 + Temp string `json:"temp" form:"temp" binding:"required"` // 模板 + UserId string `json:"user_id" form:"user_id"` // 所属用户 + TempType string `json:"temp_type" form:"temp_type" binding:"required"` // 模板类型 + TempRank string `json:"temp_rank" form:"temp_rank" binding:"required"` // 模板顺序 + TempSize string `json:"temp_size" form:"temp_size" binding:"required"` // 模板尺寸 big/medium/small + PrintSn string `json:"print_sn" form:"print_sn" binding:"required"` // 模板所属打印机 + IsUse int `json:"is_use" form:"is_use" binding:"required"` // 默认使用 1-使用/2-不使用 + Properties string `json:"properties" form:"properties" binding:"required"` // 模板字段属性 } type TempContext struct { - Rank int `json:"rank"` // 排序值 1 - DefinitionName string `json:"definition_name"` // 用户定义字段名称 下单时间 - MatchContext string `json:"match_context"` // 匹配字段 payOrderTime + Rank string `json:"rank"` // 排序值 1 + MatchContext string `json:"match_context"` // 匹配字段 payOrderTime } type DeleteTemp struct { - ID int `json:"id" form:"id"` // 修改时传入 + ID int `json:"id" form:"id"` // 修改时传入 + PrintSn string `json:"print_sn" form:"print_sn"` // 模板所属打印机 +} + +type QueryUserTemp struct { + UserId string `json:"user_id" form:"user_id"` // 所属用户 + PrintSn string `json:"print_sn" form:"print_sn"` // 模板所属打印机 } diff --git a/model/app_model/wechat_pay.go b/model/app_model/wechat_pay.go new file mode 100644 index 0000000..60cc69b --- /dev/null +++ b/model/app_model/wechat_pay.go @@ -0,0 +1,11 @@ +package app_model + +type GetPrinterReportResult struct { + WeekPrintCount int `json:"week_print_count"` + DayPrintCount int `json:"day_print_count"` + DayUnPrintCount int `json:"day_un_print_count"` + OnlinePrinterCount int `json:"online_printer_count"` + OfflinePrinterCount int `json:"offline_printer_count"` + FlowPrinterCount int `json:"flow_printer_count"` + PaperPrinterCount int `json:"paper_printer_count"` +} diff --git a/model/model.go b/model/model.go index 23cfa72..a392b5c 100644 --- a/model/model.go +++ b/model/model.go @@ -303,3 +303,36 @@ type AutoGenerated struct { AppID string `json:"appId"` } `json:"data"` } + +type Jxc4UserData struct { + UserID string `json:"userID"` + UserID2 string `json:"userID2"` + Mobile string `json:"mobile"` + Email string `json:"email"` + Name string `json:"name"` + Avatar string `json:"avatar"` + AuthBindInfo struct { + ID int `json:"id"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + LastOperator string `json:"lastOperator"` + DeletedAt time.Time `json:"deletedAt"` + AuthID string `json:"authID"` + BindType int `json:"bindType"` + Type string `json:"type"` + TypeID string `json:"typeID"` + UserID string `json:"userID"` + Status int `json:"status"` + AuthID2 string `json:"authID2"` + Remark string `json:"remark"` + DetailData string `json:"detailData"` + UserData interface{} `json:"userData"` + UserHint interface{} `json:"userHint"` + } `json:"authBindInfo"` + LoginTime time.Time `json:"loginTime"` + ExpiresAt int `json:"expiresAt"` + Token string `json:"token"` + TokenType int `json:"tokenType"` + IsExistOpenID bool `json:"isExistOpenID"` + AppID string `json:"appId"` +} diff --git a/putils/redis.go b/putils/redis.go index 6a502f4..d924f49 100644 --- a/putils/redis.go +++ b/putils/redis.go @@ -20,6 +20,8 @@ func init() { client = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", + DB: 5, + PoolSize: 50, }) pong, err := client.Ping().Result() globals.SugarLogger.Debugf("redis pong %v, err: %v", pong, err) diff --git a/routers/v3_app_router.go b/routers/v3_app_router.go index 135dc47..782ee57 100644 --- a/routers/v3_app_router.go +++ b/routers/v3_app_router.go @@ -15,4 +15,10 @@ func InitV3App(v1 *gin.RouterGroup) { // 获取短信 appNo.POST("/sendVerifyCode", app.VerificationController.SendVerifyCode) // 获取短信验证码 + appNo.GET("/getPrintIsUse", app.PrintController.GetPrintIsUse) // 打印消息统计 + + // 支付回调 + appNo.POST("/payCallBack", app.Auth2ControllerController.PayCallBack) + // 门店失去授权回调 + appNo.POST("/loseAuthorize", app.PrinterBindStoreController.LoseStoreAuthorize) } diff --git a/routers/v4_app_router.go b/routers/v4_app_router.go index f1451e6..df17eef 100644 --- a/routers/v4_app_router.go +++ b/routers/v4_app_router.go @@ -17,19 +17,25 @@ func InitV4App(v2 *gin.RouterGroup) { appYes.POST("/testPrinter", app.PrintController.TestPrint) // 测试打印机 appYes.GET("/getPrintMessages", app.PrintController.GetPrintMessages) // 打印机消息列表 appYes.GET("/statPrinter", app.PrintController.StatPrinterReport) // 打印消息统计 + appYes.GET("/queryPrintBill", app.PrintController.QueryPrintBill) // 打印消息统计 // 模板管理 - temp := v2.Group("/temp") + temp := appYes.Group("/temp") temp.POST("/addOrUpdateTemp", app.PrinterTempController.AddOrUpdateTemp) // 模板添加/修改 temp.DELETE("/deleteTemp", app.PrinterTempController.DeleteTemp) // 删除用户自定义模板 temp.GET("/getUserTempList", app.PrinterTempController.GetUserTempList) // 获取用户模板,模板不足时填充系统模板 temp.GET("/switchTemp", app.PrinterTempController.SwitchTemp) // 切换模板打印模板 // 打印机设置 - setting := v2.Group("/setting") + setting := appYes.Group("/setting") setting.POST("updatePrintSetting", app.PrintSettingController.UpdatePrintSetting) // 打印机设置修改 + setting.GET("getPrintSetting", app.PrintSettingController.GetPrintSetting) // 打印机设置修改 - // + /***************/ appYes.POST("/getToken4Jxc4", app.Auth2ControllerController.GetToken4Jxc4) // 微信登录京西菜市,获取菜市token + appYes.POST("/pay", app.Auth2ControllerController.Pay4Order) // 吊起微信支付 + // 用户授权成功之后获取绑定门店信息 + appYes.POST("/bindingStore", app.PrinterBindStoreController.AddPrinterBindStore) // 添加门店绑定授权 + appYes.POST("/checkRelieve", app.PrinterBindStoreController.CheckStoreBindStatus) // 检查是否可以解除绑定 } diff --git a/services/api/api.go b/services/api/api.go index 102f074..1e36ba1 100644 --- a/services/api/api.go +++ b/services/api/api.go @@ -5,6 +5,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/tibiotapi" "git.rosy.net.cn/baseapi/platformapi/tonglianpayapi" "git.rosy.net.cn/baseapi/platformapi/weixinapi" + "git.rosy.net.cn/baseapi/platformapi/wxpayapi" "git.rosy.net.cn/jx-print/globals" wx "git.rosy.net.cn/jx-print/model/app_model" aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" @@ -19,6 +20,7 @@ var ( TibiotAPI *tibiotapi.API TLpayAPI *tonglianpayapi.API //通联收银宝api WeixinMiniAPI *weixinapi.API // 微信小程序 + WxpayAPI *wxpayapi.API // 微信支付API ) @@ -31,5 +33,5 @@ func init() { SMSClient = aliyunsmsclient.New("http://dysmsapi.aliyuncs.com/") TLpayAPI = tonglianpayapi.New("00183083", "18048531223", "56065105499TVAH") WeixinMiniAPI = weixinapi.New(wx.WeChatAPPID, wx.WeChatAPPSecret) - + WxpayAPI = wxpayapi.NewWithCertificate(wx.WeChatAPPID, wx.WeChatAPPSecret, "", "conf/apiclient_cert.pem", "conf/apiclient_key.pem") } diff --git a/services/print_server/app_server/print_activiation.go b/services/print_server/app_server/print_activiation.go new file mode 100644 index 0000000..1535f9d --- /dev/null +++ b/services/print_server/app_server/print_activiation.go @@ -0,0 +1,13 @@ +package app_server + +import "git.rosy.net.cn/jx-print/dao" + +type PrintActivation struct { +} + +var PrintActivationServer = new(PrintActivation) + +// QueryPrintHeard 查询打印机是否激活 +func (p *PrintActivation) QueryPrintHeard(printNo string) (bool, error) { + return dao.PrintActivationDao.QueryPrintHeartBeat(printNo) +} diff --git a/services/print_server/app_server/print_bill.go b/services/print_server/app_server/print_bill.go new file mode 100644 index 0000000..09b3c8c --- /dev/null +++ b/services/print_server/app_server/print_bill.go @@ -0,0 +1,49 @@ +package app_server + +import ( + "fmt" + "git.rosy.net.cn/jx-print/dao" + "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" +) + +type PrintBill struct { +} + +var PrintBillServer = new(PrintBill) + +// InitPPrintBill 初始化打印机账户 +func (p *PrintBill) InitPPrintBill(tx *sqlx.Tx, bill *app_model.PrintBill) error { + // 查询打印机是否有账户,没有添加 + result, err := dao.QueryPrintBill("", bill.PrintNo) + if err != nil { + return err + } + + // 无打印机账户信息,初始化打印机账户 + if len(result) == 0 { + if err := dao.InitPrintBill(tx, bill); err != nil { + return err + } + } else if len(result) == 1 { + if err := dao.UpdateBillToUser(tx, bill); err != nil { + return err + } + } else { + return fmt.Errorf("打印机账户余额数据不唯一,联系管理员") + } + + return nil +} + +// QueryPrintBill 查询打印机余额 +func (p *PrintBill) QueryPrintBill(userId, printNo string) (*app_model.PrintBill, error) { + result, err := dao.QueryPrintBill(userId, printNo) + if err != nil { + return nil, err + } + if len(result) != 1 { + return nil, fmt.Errorf("打印机账户异常,不唯一或者未添加,请联系管理员") + } + return result[0], nil +} diff --git a/services/print_server/app_server/print_bind_store.go b/services/print_server/app_server/print_bind_store.go new file mode 100644 index 0000000..c842f13 --- /dev/null +++ b/services/print_server/app_server/print_bind_store.go @@ -0,0 +1,91 @@ +package app_server + +import ( + "fmt" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-print/dao" + storeModel "git.rosy.net.cn/jx-print/model/app_model" + "io/ioutil" + "net/http" + "time" +) + +type PrintBindStore struct { +} + +var PrintBindStoreServer = new(PrintBindStore) + +// AddStoreBind 添加打印机门店绑定 +func (p *PrintBindStore) AddStoreBind(userId string, store *storeModel.AddBindStore) error { + // 查询打印机绑定门店数量 + count, err := dao.QueryBindNumber(userId, store.PrintNo) + if err != nil { + return err + } + if count >= 5 { + return fmt.Errorf("同一打印机最多可绑定五个门店") + } + // 查询打印机是否属于用户 + have, _, err := dao.GetPrintById(userId, store.PrintNo) + if err != nil { + return err + } + if !have { + return fmt.Errorf("打印机未绑定在用户下") + } + + param := &storeModel.PrintBindStore{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + StoreID: store.StoreID, + StoreName: store.StoreName, + StoreVendor: store.StoreVendor, + PrintNo: store.PrintNo, + StoreStatus: store.StoreStatus, + UserId: userId, + BindStatus: storeModel.StoreBindPrintSuccess, + } + + return dao.CreatePrintStoreBind(param) +} + +// QueryStoreAndUser 查询门店/打印机/用户之间的关联关系 +func (p *PrintBindStore) QueryStoreAndUser(param *storeModel.RelieveStore) (bool, error) { + return dao.QueryStoreAndUserManager(param.UserId, param.PrintNo, param.StoreID) +} + +// RelievePrintBindStore 解除门店和打印机的绑定关系 +func (p *PrintBindStore) RelievePrintBindStore(param *storeModel.RelieveStore) error { + if err := dao.RelieveToken(param.UserId, param.PrintNo, param.StoreID); err != nil { + return err + } + return nil +} + +// LoseAuthorize 失去授权回调 +func (p *PrintBindStore) LoseAuthorize(storeId int64) error { + return dao.UpdateStoreAuthorize(storeId) +} + +// AnalysisStore 解析门店授权 +func (p *PrintBindStore) AnalysisStore(request *http.Request) (string, error) { + data, err := ioutil.ReadAll(request.Body) + if err != nil { + return "", err + } + fmt.Println(string(data)) + values, err := utils.HTTPBody2Values(data, false) + if err != nil { + return "", err + } + mapData := utils.URLValues2Map(values) + callParam := &call{} + if err := utils.Map2StructByJson(mapData, &callParam, false); err != nil { + return "", err + } + return callParam.StoreId, err +} + +type call struct { + StoreId string `json:"storeId" form:"storeId"` +} diff --git a/services/print_server/app_server/print_setting.go b/services/print_server/app_server/print_setting.go index b3bd045..1b13cb7 100644 --- a/services/print_server/app_server/print_setting.go +++ b/services/print_server/app_server/print_setting.go @@ -6,6 +6,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/dao" settingModel "git.rosy.net.cn/jx-print/model/app_model" + "github.com/jmoiron/sqlx" "time" ) @@ -17,7 +18,7 @@ var PrintSettingInfoServer = new(PrintSettingServer) // UpdatePrintSetting 修改打印机绑定信息 func (p *PrintSettingServer) UpdatePrintSetting(userId string, param *settingModel.UpdatePrintSetting) error { // 判断打印机和用户是否匹配 - isTrue, err := dao.GetPrintById(userId, param.PrintNo) + isTrue, _, err := dao.GetPrintById(userId, param.PrintNo) if err != nil { return err } @@ -28,14 +29,14 @@ func (p *PrintSettingServer) UpdatePrintSetting(userId string, param *settingMod } // SystemInitPrintSetting 绑定打印机时初始化一个打印机设置 -func (p *PrintSettingServer) SystemInitPrintSetting(printNo string) error { +func (p *PrintSettingServer) SystemInitPrintSetting(txDB *sqlx.Tx, printNo string) error { // 打印机标号唯一,判断打印机是否存在设置 isHave, err := dao.PrintSettingInfoDao.QueryPrintNoIsExit(printNo) if err != nil { return err } if !isHave { - return errors.New("已经存在绑定的打印机设置,联系管理员") + return nil } day := time.Now() @@ -51,11 +52,11 @@ func (p *PrintSettingServer) SystemInitPrintSetting(printNo string) error { return err } - return dao.PrintSettingInfoDao.InsertPrintSetting(param) + return dao.PrintSettingInfoDao.InsertPrintSetting(txDB, param) } // DeletePrintSetting 删除打印机设置 -func (p *PrintSettingServer) DeletePrintSetting(printNo []string) error { +func (p *PrintSettingServer) DeletePrintSetting(printNo string) error { return dao.PrintSettingInfoDao.DeleteSetting(printNo) } diff --git a/services/print_server/app_server/temp.go b/services/print_server/app_server/temp.go index 94a5062..5333757 100644 --- a/services/print_server/app_server/temp.go +++ b/services/print_server/app_server/temp.go @@ -1,152 +1,150 @@ package app_server import ( - "encoding/json" "errors" "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/dao" - "git.rosy.net.cn/jx-print/globals" tempModel "git.rosy.net.cn/jx-print/model/app_model" - "sort" - "strings" "time" ) -var SystemTemp map[string]*tempModel.SystemTemp - -func init() { - SystemTemp = make(map[string]*tempModel.SystemTemp, 0) - var sysTemp = TempServer{} - sysTempList, err := sysTemp.QuerySystemTemp() - if err != nil { - globals.SugarLogger.Debug("query system temp err :", err) - return - } - if len(sysTempList) <= 0 { - globals.SugarLogger.Debug("query system temp err :", "system temp don't have") - // 不存在系统模板,初始化系统模板 - //InitSystemTemp() - } - temp := make(map[string]*tempModel.SystemTemp, 0) - for _, v := range sysTempList { - temp[v.TempSize] = v - SystemTemp[v.TempSize] = v - } - - now := time.Now() - param := &tempModel.SystemTemp{ - CreatedAt: &now, - UpdatedAt: &now, - LastOperator: "system", - DeletedAt: &utils.DefaultTimeValue, - TempName: "", - TempRank: SystemTempKey, - Temp: "", - UserId: "system_user", - TempType: tempModel.TempTypeMerchant, - TempSize: tempModel.SystemTempSizeBig, - PrintSn: "system", - IsUse: 1, - } - - // 初始化大字体模板 - if _, v := temp[tempModel.SystemTempSizeBig]; !v { - param.TempName = "system" + tempModel.SystemTempSizeBig - param.Temp = SystemTempValue - if err := dao.AddTemp(param); err != nil { - globals.SugarLogger.Debug("init system temp err :", err) - } - SystemTemp[tempModel.SystemTempSizeBig] = param - } - - // 初始化中字体模板 - if _, v := temp[tempModel.SystemTempSizeMedium]; !v { - param.TempName = "system" + tempModel.SystemTempSizeMedium - medium := strings.Replace(SystemTempValue, "", "", -1) - medium2 := strings.Replace(medium, "", "", -1) - param.Temp = medium2 - param.TempSize = tempModel.SystemTempSizeMedium - param.IsUse = 2 - if err := dao.AddTemp(param); err != nil { - globals.SugarLogger.Debug("init system temp err :", err) - } - SystemTemp[tempModel.SystemTempSizeMedium] = param - } - - // 初始化小字体模板 - if _, v := temp[tempModel.SystemTempSizeSmall]; !v { - param.TempName = "system" + tempModel.SystemTempSizeSmall - medium := strings.Replace(SystemTempValue, "", " ", -1) - medium2 := strings.Replace(medium, "", " ", -1) - param.Temp = medium2 - param.TempSize = tempModel.SystemTempSizeSmall - param.IsUse = 2 - if err := dao.AddTemp(param); err != nil { - globals.SugarLogger.Debug("init system temp err :", err) - } - SystemTemp[tempModel.SystemTempSizeSmall] = param - } - -} +// +//var SystemTemp map[string]*tempModel.SystemTemp +// +//func init() { +// SystemTemp = make(map[string]*tempModel.SystemTemp, 0) +// var sysTemp = TempServer{} +// sysTempList, err := sysTemp.QuerySystemTemp() +// if err != nil { +// globals.SugarLogger.Debug("query system temp err :", err) +// return +// } +// if len(sysTempList) <= 0 { +// globals.SugarLogger.Debug("query system temp err :", "system temp don't have") +// // 不存在系统模板,初始化系统模板 +// //InitSystemTemp() +// } +// temp := make(map[string]*tempModel.SystemTemp, 0) +// for _, v := range sysTempList { +// temp[v.TempSize] = v +// SystemTemp[v.TempSize] = v +// } +// +// now := time.Now() +// param := &tempModel.SystemTemp{ +// CreatedAt: &now, +// UpdatedAt: &now, +// LastOperator: "system", +// DeletedAt: &utils.DefaultTimeValue, +// TempName: "", +// TempRank: SystemTempKey, +// Temp: "", +// UserId: "system_user", +// TempType: tempModel.TempTypeMerchant, +// TempSize: tempModel.SystemTempSizeBig, +// PrintSn: "system", +// IsUse: 1, +// } +// +// // 初始化大字体模板 +// if _, v := temp[tempModel.SystemTempSizeBig]; !v { +// param.TempName = "system" + tempModel.SystemTempSizeBig +// param.Temp = SystemTempValue +// if err := dao.AddTemp(param); err != nil { +// globals.SugarLogger.Debug("init system temp err :", err) +// } +// SystemTemp[tempModel.SystemTempSizeBig] = param +// } +// +// // 初始化中字体模板 +// if _, v := temp[tempModel.SystemTempSizeMedium]; !v { +// param.TempName = "system" + tempModel.SystemTempSizeMedium +// medium := strings.Replace(SystemTempValue, "", "", -1) +// medium2 := strings.Replace(medium, "", "", -1) +// param.Temp = medium2 +// param.TempSize = tempModel.SystemTempSizeMedium +// param.IsUse = 2 +// if err := dao.AddTemp(param); err != nil { +// globals.SugarLogger.Debug("init system temp err :", err) +// } +// SystemTemp[tempModel.SystemTempSizeMedium] = param +// } +// +// // 初始化小字体模板 +// if _, v := temp[tempModel.SystemTempSizeSmall]; !v { +// param.TempName = "system" + tempModel.SystemTempSizeSmall +// medium := strings.Replace(SystemTempValue, "", " ", -1) +// medium2 := strings.Replace(medium, "", " ", -1) +// param.Temp = medium2 +// param.TempSize = tempModel.SystemTempSizeSmall +// param.IsUse = 2 +// if err := dao.AddTemp(param); err != nil { +// globals.SugarLogger.Debug("init system temp err :", err) +// } +// SystemTemp[tempModel.SystemTempSizeSmall] = param +// } +// +//} type TempServer struct { } -// MakePrintMsgOnTemp 将打印数据渲染到模板当中 -func (t *TempServer) MakePrintMsgOnTemp(param map[string]string, userId string) (string, error) { - // 查询用户默认模板,不存在则使用系统默认模板 - var userTemp *tempModel.SystemTemp - userTemp, isHave, err := dao.SelectUserDefaultTemp(userId, tempModel.TempTypeMerchant) - if err != nil { - return "", err - } - if userTemp == nil || !isHave { - userTemp = SystemTemp[tempModel.SystemTempSizeBig] - } - - // 需要打印数据 - printMsg := "" - printValue := make([]interface{}, 0, 0) - for _, v := range strings.Split(userTemp.TempRank, ",") { - switch v { - case "skuName", "skuNumber", "skuPrice", "skuAllPrice", "allSkuTypeCount", "allSkuCount": - continue - case "goodsListDetail": - printMsg += TempTag[v] - skuList := make([]*SkuListPrintOrder, 0, 0) - if err := json.Unmarshal([]byte(param[v]), skuList); err != nil { - return "", err - } - for i := 0; i < len(skuList); i++ { - printMsg += TempTag["skuName"] - printMsg += TempTag["skuNumber"] - printMsg += TempTag["skuPrice"] - printMsg += TempTag["skuAllPrice"] - printValue = append(printValue, skuList[i].SkuName, skuList[i].SkuName, skuList[i].SalePrice, skuList[i].TotalCountPrice) - if skuList[i].Upc != "" { - printMsg += TempTag["sku"] - printValue = append(printValue, skuList[i].Upc) - } - - } - case "businessType": - if param[v] == "2" { // 是预订单 - printMsg += TempTag[v] - } - default: - printMsg += TempTag[v] - printValue = append(printValue, param[v]) - } - - } - - return strings.Replace(fmt.Sprintf(strings.Replace(printMsg, "\n", "", -1), printValue...), "\\n", "\r\n", -1), nil -} +// +//// MakePrintMsgOnTemp 将打印数据渲染到模板当中 +//func (t *TempServer) MakePrintMsgOnTemp(param map[string]string, userId string) (string, error) { +// // 查询用户默认模板,不存在则使用系统默认模板 +// var userTemp *tempModel.SystemTemp +// userTemp, isHave, err := dao.SelectUserDefaultTemp(userId, tempModel.TempTypeMerchant) +// if err != nil { +// return "", err +// } +// if userTemp == nil || !isHave { +// userTemp = SystemTemp[tempModel.SystemTempSizeBig] +// } +// +// // 需要打印数据 +// printMsg := "" +// printValue := make([]interface{}, 0, 0) +// for _, v := range strings.Split(userTemp.TempRank, ",") { +// switch v { +// case "skuName", "skuNumber", "skuPrice", "skuAllPrice", "allSkuTypeCount", "allSkuCount": +// continue +// case "goodsListDetail": +// printMsg += TempTag[v] +// skuList := make([]*SkuListPrintOrder, 0, 0) +// if err := json.Unmarshal([]byte(param[v]), skuList); err != nil { +// return "", err +// } +// for i := 0; i < len(skuList); i++ { +// printMsg += TempTag["skuName"] +// printMsg += TempTag["skuNumber"] +// printMsg += TempTag["skuPrice"] +// printMsg += TempTag["skuAllPrice"] +// printValue = append(printValue, skuList[i].SkuName, skuList[i].SkuName, skuList[i].SalePrice, skuList[i].TotalCountPrice) +// if skuList[i].Upc != "" { +// printMsg += TempTag["sku"] +// printValue = append(printValue, skuList[i].Upc) +// } +// +// } +// case "businessType": +// if param[v] == "2" { // 是预订单 +// printMsg += TempTag[v] +// } +// default: +// printMsg += TempTag[v] +// printValue = append(printValue, param[v]) +// } +// +// } +// +// return strings.Replace(fmt.Sprintf(strings.Replace(printMsg, "\n", "", -1), printValue...), "\\n", "\r\n", -1), nil +//} // AddOrUpdateTemp 添加或者修改模板 func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error { - temp, err := dao.GetTempByName(param.UserId, param.TempName) + temp, err := dao.GetTempByName(param.UserId, param.PrintSn, param.TempName) if err != nil { return err } @@ -154,41 +152,13 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error { return errors.New("模板名称重复") } - // 解析模板 - var tempTagList []*tempModel.TempContext - if err := json.Unmarshal([]byte(param.Temp), tempTagList); err != nil { - return err - } - sort.Slice(tempTagList, func(i, j int) bool { - if tempTagList[i].Rank > tempTagList[j].Rank { - return false - } - return true - }) - - rankKey := "" - contextStr := "{" - for i := 0; i < len(tempTagList); i++ { - if i != len(tempTagList)-1 { - key := tempTagList[i].MatchContext + "," - rankKey += key - } else { - rankKey += tempTagList[i].MatchContext - } - } - for i := 0; i < len(tempTagList); i++ { - if i != len(tempTagList)-1 { - contextStr += tempTagList[i].MatchContext + ":" + tempTagList[i].MatchContext + "," - } else { - contextStr += tempTagList[i].MatchContext + ":" + tempTagList[i].MatchContext + "}" - } - } - now := time.Now() userTemp := &tempModel.SystemTemp{ + CreatedAt: param.CreatedAt, + UpdatedAt: &now, TempName: param.TempName, - TempRank: rankKey, - Temp: contextStr, + TempRank: param.TempRank, + Temp: param.Temp, UserId: param.UserId, TempType: param.TempType, TempSize: param.TempSize, @@ -196,11 +166,12 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error { DeletedAt: &utils.DefaultTimeValue, PrintSn: param.PrintSn, IsUse: param.IsUse, + Properties: param.Properties, } // 如果默认打印改模板,其他打印模板则改成不使用 if param.IsUse == 1 { - if err := dao.UpdateOtherTempStatus(param.UserId); err != nil { + if err := dao.UpdateOtherTempStatus(param.UserId, param.PrintSn); err != nil { return err } } @@ -214,17 +185,36 @@ func (t *TempServer) AddOrUpdateTemp(param *tempModel.AddTemp) error { // 修改 userTemp.UpdatedAt = &now userTemp.ID = param.ID - return dao.UpdateTemp(userTemp, []string{"id"}) + return dao.UpdateTemp(userTemp, []string{"created_at", "updated_at", "last_operator", "deleted_at", "temp_name", "temp_rank", "temp", "user_id", "temp_type", "temp_size", "print_sn", "is_use", "properties"}) } // DeleteTemp 删除模板 func (t *TempServer) DeleteTemp(id int, userId string) error { + temp, err := dao.QueryTempById(id) + if err != nil { + return err + } + if temp.TempType == tempModel.TempTypeMerchant || temp.TempType == tempModel.TempTypeConsumer { + return fmt.Errorf("此模板为系统模板无法删除") + } + return dao.DeleteTemp(id, userId) } // QueryTempList 查询用户模板 -func (t *TempServer) QueryTempList(userId string) ([]*tempModel.SystemTemp, error) { - return dao.SelectUserTemp(userId) +func (t *TempServer) QueryTempList(userId, printSn string) ([]*tempModel.SystemTemp, error) { + userList, err := dao.SelectUserTemp(userId, printSn) + if err != nil { + return nil, err + } + + // 查询系统模板 + systemTemp, err := t.QuerySystemTemp() + if err != nil { + return nil, err + } + userList = append(userList, systemTemp...) + return userList, nil } // QuerySystemTemp 查询系统模板 @@ -233,11 +223,11 @@ func (t *TempServer) QuerySystemTemp() ([]*tempModel.SystemTemp, error) { } // SwitchTemp 切换使用模板 -func (t *TempServer) SwitchTemp(userId string, tempId int) error { - return dao.SwitchTemp2User(tempId, userId) +func (t *TempServer) SwitchTemp(userId, printSn string, tempId int) error { + return dao.SwitchTemp2User(tempId, userId, printSn) } // DeleteAllTemp 删除所有用户打印机模板 -func (t *TempServer) DeleteAllTemp(userId string, printNo []string) error { - return dao.DeleteAllTemp(userId, printNo) +func (t *TempServer) DeleteAllTemp(userId string, printNos string) error { + return dao.DeleteAllTemp(userId, printNos) } diff --git a/services/print_server/app_server/temp_config.go b/services/print_server/app_server/temp_config.go index 689cc3c..895d4cb 100644 --- a/services/print_server/app_server/temp_config.go +++ b/services/print_server/app_server/temp_config.go @@ -147,248 +147,3 @@ type JXPrintData struct { BigFont string `json:"big_font"` // 是否为大字体 PrintNumber string `json:"print_number"` // 打印次数 } - -/************************一下模板将不再使用,直接将标签替换*****************************************/ -// 小字体系统模板 -const ( - // 模板开始 - tempBegin = ` -
%s
-
-
-
手机买菜上京西
-
-
极速到家送惊喜
-
- -------------------------------- -
- 下单时间: %s -
- 预计送达: %s -
- 订单编号: %s -
` - // 是否为预订单 - tempBusiness = `
预订单

` - tempBegin2 = ` -
- %s#%s -
- %s -
` - tempEBail = `饿百取货码%s:%s

` - tempBegin3 = ` -
-
- 客户: %s -
- 电话: %s -
- 地址: %s -
-
- 客户备注: -
- %s -
-
- 商品明细: -
- 品名 数量 单价 小计 -
- -------------------------------- -
-` - // 模板结束 - tempEnd = `
-
- 共%s种,%s件商品 -
- -------------------------------- -
-
商品质量问题请联系:
-
-
%s:%s
-
-
- 更多信息请关注官方微信: %s -
-
-
- -------------------------------- -
- -------------------------------- -
-
-` - - // 模板商品 - skuListTemp = `%s -
- x%s ¥%s ¥%s -
-` - soundTemp = `
%s` -) - -// 中字体系统模板 -const ( - // 模板开始 - tempBeginMiddle = ` -
%s
-
-
-
手机买菜上京西
-
-
极速到家送惊喜
-
- -------------------------------- -
- 下单时间: %s -
- 预计送达: %s -
- 订单编号: %s -
` - // 是否为预订单 - tempBusinessMiddle = `
预订单

` - tempBegin2Middle = ` -
- %s#%s -
- %s -
` - tempEBailMiddle = `%s:%s

` - tempBegin3Middle = ` -
-
- 客户: %s -
- 电话: %s -
- 地址: %s -
-
- 客户备注: -
- %s -
-
- 商品明细: -
- 品名 数量 单价 小计 -
- -------------------------------- -
-` - // 模板结束 - tempEndMiddle = `
-
- 共%s种,%s件商品 -
- -------------------------------- -
-
商品质量问题请联系:
-
-
%s:%s
-
-
- 更多信息请关注官方微信: %s -
-
-
- -------------------------------- -
- -------------------------------- -
-
-` - - // 模板商品 - skuListTempMiddle = `%s -
- x%s ¥%s ¥%s -
-` -) - -// 大字体系统模板 -const ( - // 模板开始 - tempBeginBig = ` -
%s
-
-
-
手机买菜上京西
-
-
极速到家送惊喜
-
- -------------------------------- -
- 下单时间: %s -
- 预计送达: %s -
- 订单编号: %s -
` - // 是否为预订单 - tempBusinessBig = `
预订单

` - tempBegin2Big = ` -
- %s#%s -
- %s -
` - tempEBailBig = `%s:%s

` - tempBegin3Big = ` -
-
- 客户: %s -
- 电话: %s -
- 地址: %s -
-
- 客户备注: -
- %s -
-
- 商品明细: -
- 品名 数量 单价 小计 -
- -------------------------------- -
-` - // 模板结束 - tempEndBig = `
-
- 共%s种,%s件商品 -
- -------------------------------- -
-
商品质量问题请联系:
-
-
%s:%s
-
-
- 更多信息请关注官方微信: %s -
-
-
- -------------------------------- -
- -------------------------------- -
-
-` - - // 模板商品 - skuListTempBig = `%s -
- x%s ¥%s ¥%s -
-` -) diff --git a/services/print_server/app_server/tonglian_pay.go b/services/print_server/app_server/tonglian_pay.go new file mode 100644 index 0000000..250e09f --- /dev/null +++ b/services/print_server/app_server/tonglian_pay.go @@ -0,0 +1,62 @@ +package app_server + +import ( + "fmt" + "git.rosy.net.cn/baseapi/platformapi/tonglianpayapi" + "git.rosy.net.cn/jx-print/dao" + userModel "git.rosy.net.cn/jx-print/model" + printModel "git.rosy.net.cn/jx-print/model/app_model" +) + +type PrintPay struct { +} + +var PrintPayServer = new(PrintPay) + +// Pay4Order 支付 +func (p *PrintPay) Pay4Order(user *userModel.User, ip string, totalFee int, payType int, vendorPayType, printNo string) (orderPay *printModel.OrderPay, err error) { + if user.OpenId == "" { + return nil, fmt.Errorf("当前用户未微信授权,无法使用微信支付") + } + switch payType { + case printModel.PayTypeWX: + orderPay, err = pay4OrderByWX(user, totalFee, ip, vendorPayType) + if err != nil { + return nil, err + } + orderPay.PrintNo = printNo + if err := dao.InsertPrinterPayRecord(orderPay); err != nil { + return nil, err + } + case printModel.PayTypeTL: + orderPay, err = pay4OrderByTL(user, totalFee, payType, vendorPayType) + if err != nil { + return nil, err + } + orderPay.PrintNo = printNo + if err := dao.InsertPrinterPayRecord(orderPay); err != nil { + return nil, err + } + default: + err = fmt.Errorf("支付方式:%d当前不支持", payType) + } + + return orderPay, err +} + +// OnTLPayCallback 通联充值回调处理 +func (p *PrintPay) OnTLPayCallback(call *tonglianpayapi.CallBackResult) (err error) { + switch call.TrxCode { + case tonglianpayapi.MsgTypePay: // 微信支付回调 + err = onTLPayFinished(call) + case tonglianpayapi.MsgTypeRefund: // 微信退款回调 + // err = onTLpayRefund(call) + case tonglianpayapi.MsgTypePayZFB: // 支付宝支付回调 + // err = onTLpayFinished(call) + case tonglianpayapi.MsgTypeRefundZFB: // 支付宝退款回调 + // err = onTLpayRefund(call) + default: + + } + return err +} diff --git a/services/print_server/app_server/tonglian_pay_utils.go b/services/print_server/app_server/tonglian_pay_utils.go new file mode 100644 index 0000000..3f12d80 --- /dev/null +++ b/services/print_server/app_server/tonglian_pay_utils.go @@ -0,0 +1,186 @@ +package app_server + +import ( + "encoding/json" + "fmt" + "git.rosy.net.cn/baseapi/platformapi/tonglianpayapi" + "git.rosy.net.cn/baseapi/platformapi/wxpayapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-print/dao" + "git.rosy.net.cn/jx-print/globals" + userModel "git.rosy.net.cn/jx-print/model" + printModel "git.rosy.net.cn/jx-print/model/app_model" + "git.rosy.net.cn/jx-print/services/api" + "github.com/gin-gonic/gin" + "github.com/jmoiron/sqlx" + "math/rand" + "strings" + "time" +) + +// pay4OrderByWX 直接微信支付 +func pay4OrderByWX(user *userModel.User, totalFell int, ip, vendorPayType string) (orderPay *printModel.OrderPay, err error) { + payCreatedAt := time.Now() + param := &wxpayapi.CreateOrderParam{ + OutTradeNo: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)), + Body: printModel.PayBody, + NotifyURL: globals.TongLianPayCallBack, + SpbillCreateIP: ip, + TradeType: vendorPayType, + TotalFee: totalFell, + + TimeStart: wxpayapi.Time2PayTime(payCreatedAt), + ProfitSharing: wxpayapi.OptYes, + } + if user.OpenId != "" { + param.OpenID = user.OpenId + } + + result, err := api.WxpayAPI.CreateUnifiedOrder(param) + if err == nil { + orderPay = &printModel.OrderPay{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + PayOrderID: param.OutTradeNo, + PayType: printModel.PayTypeWX, + VendorPayType: vendorPayType, + Status: 0, + PayCreatedAt: payCreatedAt, + PrepayID: result.PrepayID, + CodeURL: result.CodeURL, + TotalFee: int(totalFell), + } + } + return orderPay, err +} + +// pay4OrderByTL 通联支付 +func pay4OrderByTL(user *userModel.User, totalFell int, payType int, vendorPayType string) (orderPay *printModel.OrderPay, err error) { + payCreatedAt := time.Now() + param := &tonglianpayapi.CreateUnitorderOrderParam{ + Trxamt: totalFell, + NotifyUrl: globals.TongLianPayCallBack, + Reqsn: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)), + PayType: vendorPayType, + } + //暂时做兼容处理 + if vendorPayType == "JSAPI" { + param.PayType = tonglianpayapi.PayTypeWxXcx + } + if vendorPayType == tonglianpayapi.PayTypeWxXcx { + param.Acct = user.OpenId + } + + if vendorPayType == tonglianpayapi.PayTypeZfbJS || vendorPayType == tonglianpayapi.PayTypeZfbApp { + param.Acct = user.OpenId + if param.Acct == "" { + return nil, fmt.Errorf("未找到用户的认证ID!") + } + } + if vendorPayType == tonglianpayapi.PayTypeH5 { + param2 := &tonglianpayapi.CreateH5UnitorderOrderParam{ + Trxamt: totalFell, + NotifyUrl: globals.TongLianPayCallBack, + Body: printModel.PayBody, + Charset: "UTF-8", + } + err = api.TLpayAPI.CreateH5UnitorderOrder(param2) + } else { + result, err := api.TLpayAPI.CreateUnitorderOrder(param) + if err == nil { + var result2 tonglianpayapi.PayInfo + json.Unmarshal([]byte(result.PayInfo), &result2) + prePayID := result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)] + orderPay = &printModel.OrderPay{ + PayOrderID: param.Reqsn, + PayType: payType, + VendorPayType: vendorPayType, + TransactionID: result.TrxID, + VendorOrderID: param.Reqsn, + VendorID: printModel.OrderPayVendorId, + Status: 0, + PayCreatedAt: payCreatedAt, + PrepayID: prePayID, + CodeURL: utils.LimitUTF8StringLen(result.PayInfo, 3200), + TotalFee: param.Trxamt, + } + } + } + return orderPay, err +} + +// onTLPayFinished 通联微信支付回调 +func onTLPayFinished(call *tonglianpayapi.CallBackResult) (err error) { + orderPay, err := dao.QueryPrinterPayRecord(call.CusorderID) + if err != nil { + globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err) + return err + } + if orderPay.Status != 0 { + return err + } + loc, _ := time.LoadLocation("Local") + t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc) + orderPay.PayFinishedAt = t1 + orderPay.OriginalData = utils.Format4Output(call, true) + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + orderPay.Status = printModel.PayStatusYes + } else { + orderPay.Status = printModel.PayStatusFailed + } + + txDb := globals.GetTxDb() + if err := dao.UpdatePrinterPayRecord(txDb, orderPay, "status", "pay_finished_at", "original_data"); err != nil { + globals.SugarLogger.Debugf("UpdatePrinterPayRecord msg:%s, err:%v", utils.Format4Output(call, true), err) + txDb.Rollback() + return err + } + + if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { + err = onPayFinished(txDb, orderPay) + } + + txDb.Commit() + return err +} + +// onPayFinished 通联支付完成时,修改打印机账户余额 +func onPayFinished(db *sqlx.Tx, param *printModel.OrderPay) error { + // 修改打印机余额 + if err := dao.AddMoney(db, param.PrintNo, int64(param.TotalFee)); err != nil { + globals.SugarLogger.Debugf("onPayFinished update bancall err = %v", err) + db.Rollback() + return err + } + // 添加充值记录 + record := &printModel.PrintBillRecord{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + PrintNo: param.PrintNo, + PayType: 1, + PayMoney: param.TotalFee, + OrderId: param.PayOrderID, + UserId: "", + } + if err := dao.AddIncomeRecord(db, record); err != nil { + globals.SugarLogger.Debugf("onPayFinished AddIncomeRecord bancall err = %v", err) + db.Rollback() + return err + } + + return nil +} + +// GetRealRemoteIP 获取ip +func (p *PrintPay) GetRealRemoteIP(ctx *gin.Context) (ip string) { + ip = ctx.ClientIP() + if ip == "" { + ip = ctx.Request.Header.Get("X-real-ip") + } + if ip == "" { + ip = strings.Split(ctx.Request.RemoteAddr, ":")[0] + } else { + ip = strings.Split(ip, ",")[0] + } + return ip +} diff --git a/services/print_server/app_server/verify_code.go b/services/print_server/app_server/verify_code.go index 9540464..671e8d3 100644 --- a/services/print_server/app_server/verify_code.go +++ b/services/print_server/app_server/verify_code.go @@ -1,16 +1,5 @@ package app_server -import ( - "errors" - "fmt" - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-print/globals" - "git.rosy.net.cn/jx-print/putils" - "git.rosy.net.cn/jx-print/services/api" - aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate" - "math/rand" -) - type SendVerifyCode struct { } @@ -18,44 +7,44 @@ var SendVerifyCodeServer = new(SendVerifyCode) // SendCode 获取手机短信验证码 func (s *SendVerifyCode) SendCode(mobile string) (string, error) { - // 获取code - smsCode := "" - code := putils.GetKey(mobile) - if code != "" { - smsCode = code.(string) - } else { - smsCode = fmt.Sprintf("%06d", rand.Intn(1000000)) - } - - // 发送短信 - response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobile, globals.SmsSignName, globals.SmsMobileVerifyTemplate, string(utils.MustMarshal(map[string]interface{}{ - "code": smsCode, - }))) - - if err != nil { - return "", err - } - if response.Code != aliyunsmsclient.ResponseCodeOk { - return "", fmt.Errorf("发送短信出错:%s", response.Message) - } - - if err := putils.SetKey(response.BizId+"_"+mobile, smsCode, 5*60); err != nil { - globals.SugarLogger.Debugf("redis set key err key[%s] value[%s]:", mobile, smsCode) - return "", err - } - - return response.BizId, nil + //// 获取code + //smsCode := fmt.Sprintf("%06d", rand.Intn(1000000)) + // + //// 发送短信 + //response, err := api.SMSClient.Execute(globals.AliKey, globals.AliSecret, mobile, globals.SmsSignName, globals.SmsMobileVerifyTemplate, string(utils.MustMarshal(map[string]interface{}{ + // "code": smsCode, + //}))) + // + //if err != nil { + // return "", err + //} + //if response.Code != aliyunsmsclient.ResponseCodeOk { + // return "", fmt.Errorf("发送短信出错:%s", response.Message) + //} + // + //if err := putils.SetKey(response.BizId+"_"+mobile, smsCode, time.Minute*2); err != nil { + // globals.SugarLogger.Debugf("redis set key err key[%s] value[%s]:", mobile, smsCode) + // return "", err + //} + // + //return response.BizId, nil + return "111111", nil } // VerifySecret 检查验证码 func (s *SendVerifyCode) VerifySecret(mobile, bizId, code string) (bool, error) { - result := putils.GetKey(bizId + "_" + mobile) - if result != "" { - return false, errors.New("验证码过期") - } - if result.(string) != code { - return false, errors.New("验证码错误,重新确认") - } - putils.DelKey(bizId + "_" + mobile) + //result := putils.GetKey(bizId + "_" + mobile) + //fmt.Println(utils.IsNil(result)) + //fmt.Println(result) + //if utils.IsNil(result) || result == "" || result == nil { + // return false, errors.New("验证码过期") + //} + // + //if result.(string) != code { + // return false, errors.New("验证码错误,重新确认") + //} + // + //defer putils.DelKey(bizId + "_" + mobile) + return true, nil } diff --git a/services/print_server/app_server/wx_login.go b/services/print_server/app_server/wx_login.go index 6102b84..cf53511 100644 --- a/services/print_server/app_server/wx_login.go +++ b/services/print_server/app_server/wx_login.go @@ -211,11 +211,18 @@ func (u *UserLogin) GetJxc4Token() (string, error) { return "", err } - jxc4User := &model.AutoGenerated{} + jxc4User := &model.CallBack{} + fmt.Println("=============", string(bodyResp)) if err := json.Unmarshal(bodyResp, jxc4User); err != nil { return "", err } - Jxc4UserToken["token"] = jxc4User.Data.Token - Jxc4UserToken["expirationTime"] = strconv.FormatInt(time.Now().Unix(), 64) - return jxc4User.Data.Token, nil + + user := &model.Jxc4UserData{} + if err := json.Unmarshal([]byte(jxc4User.Data), user); err != nil { + return "", err + } + + Jxc4UserToken["token"] = user.Token + Jxc4UserToken["expirationTime"] = utils.Int64ToStr(time.Now().Unix() + 5*24*60*60) + return user.Token, nil } diff --git a/services/print_server/app_server/wx_print.go b/services/print_server/app_server/wx_print.go index 07adab3..eaf3be6 100644 --- a/services/print_server/app_server/wx_print.go +++ b/services/print_server/app_server/wx_print.go @@ -6,17 +6,50 @@ import ( "git.rosy.net.cn/jx-print/dao" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model" + "git.rosy.net.cn/jx-print/model/app_model" "git.rosy.net.cn/jx-print/putils" + "github.com/jmoiron/sqlx" "time" ) // QueryPrintKeyIsExit 查询用户打印机以及绑定信息 -func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string, appId int) error { +func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string, appId int) (bool, error) { var ( db = globals.GetDB() ) // 电话号码校验 have, err := SendVerifyCodeServer.VerifySecret(phone, bizId, code) + if err != nil { + return false, err + } + if !have { + return false, fmt.Errorf("验证码错误") + } + + if printInfo.PrintNo == "" { + return false, fmt.Errorf("请输入正确的打印机编号!print_no :%s 。", printInfo.PrintNo) + } + + printers, _ := dao.GetPrinters(db, appId, printInfo.PrintNo, 0, 0, 0) + // 打印机已经被绑定 + if len(printers) != 0 { + // 修改绑定 + if printers[0].PrintKey != "" && printers[0].PrintKey != phone { + return false, fmt.Errorf("用户微信电话号码,与绑定打印机号码不一致") + } else { + return true, nil + } + } + return false, nil +} + +// DeletePrintCheck 删除打印机时,校验手机账号等等 +func DeletePrintCheck(printNo string, phone, bizId, code string, appId int) error { + var ( + db = globals.GetDB() + ) + //电话号码校验 + have, err := SendVerifyCodeServer.VerifySecret(phone, bizId, code) if err != nil { return err } @@ -24,22 +57,18 @@ func QueryPrintKeyIsExit(printInfo *model.PrintInfo, phone, bizId, code string, return fmt.Errorf("验证码错误") } - if printInfo.PrintNo == "" { - return fmt.Errorf("请输入正确的打印机编号!print_no :%s 。", printInfo.PrintNo) + printers, _ := dao.GetPrinters(db, appId, printNo, 0, 0, 0) + if len(printers) != 1 { + return fmt.Errorf("打印机不存在或异常,联系管理员") } - printers, _ := dao.GetPrinters(db, appId, printInfo.PrintNo, 0, 0, 0) - // 打印机已经被绑定 - if len(printers) != 0 { - // 修改绑定 - if printers[0].PrintKey != "" && printers[0].PrintKey != phone { - return fmt.Errorf("打印机已经被其他用户绑定,修改绑定请联系商家") - } + if printers[0].PrintKey != phone { + return fmt.Errorf("打印机绑定电话与删除时绑定电话不匹配") } return nil } -func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.PrintInfo) (err error) { +func AddPrinters(txDB *sqlx.Tx, tokenInfo *model.TokenInfo, appID int, printInfo []*model.PrintInfo, phone string) (err error) { var ( db = globals.GetDB() errs []error @@ -48,7 +77,7 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print if len(printInfo) > 50 { return fmt.Errorf("每次最多添加50台!") } - if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 { + if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 { return fmt.Errorf("未查询到此应用!app_id:%d", appID) } for _, v := range printInfo { @@ -69,7 +98,7 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print AppID: appID, PrintNo: v.PrintNo, Name: v.Name, - PrintKey: v.PrintKey, + PrintKey: phone, Status: model.PrinterStatusNormal, IsOnline: model.PrinterOffline, Sound: "sounda", @@ -77,11 +106,11 @@ func AddPrinters(tokenInfo *model.TokenInfo, appID int, printInfo []*model.Print UserId: tokenInfo.User.UserID, } if len(printers) > 0 { - if err = dao.Update(db, printer, "UserId"); err != nil { + if err = dao.UpdateTx(txDB, printer, "user_id"); err != nil { errs = append(errs, err) } } else { - if err = dao.Insert(db, printer); err != nil { + if err = dao.InsertTx(txDB, printer); err != nil { errs = append(errs, err) } } @@ -96,7 +125,11 @@ func GetPrinters(appID int, printNo, name string, status, isOnline, offset, page return dao.GetPrintersPage(globals.GetDB(), appID, printNo, name, status, isOnline, offset, pageSize, userId) } -func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos []string) (err error) { +func GetPrintIsUse(printNo string) (bool, error) { + return dao.GetPrintIsUse(printNo) +} + +func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos string) (err error) { var ( db = globals.GetDB() errs []error @@ -105,30 +138,22 @@ func DelPrinters(appID int, tokenInfo *model.TokenInfo, printNos []string) (err if len(printNos) > 50 { return fmt.Errorf("每次最多删除50台!") } - if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 { + if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 { return fmt.Errorf("未查询到此应用!app_id:%d", appID) } - for _, v := range printNos { - if v == "" { - errs = append(errs, fmt.Errorf("请输入正确的打印机编号!print_no :%s 。", v)) - continue - } - printers, _ := dao.GetPrinters(db, appID, v, 0, 0, 0) - if len(printers) == 0 { - errs = append(errs, fmt.Errorf("未在该应用下查到此打印机!app_id: %d, print_no: %s", appID, v)) - continue - } - if printers[0].UserId != tokenInfo.User.UserID { - errs = append(errs, fmt.Errorf("该打印机不属于此用户 :%s 。", v)) - continue - } + printers, _ := dao.GetPrinters(db, appID, printNos, 0, 0, 0) + if len(printers) == 0 { + errs = append(errs, fmt.Errorf("未在该应用下查到此打印机!app_id: %d, print_no: %s", appID, printNos)) + } + if printers[0].UserId != tokenInfo.User.UserID { + errs = append(errs, fmt.Errorf("该打印机不属于此用户 :%s 。", printNos)) + } - printer := printers[0] - printer.DeletedAt = &now - printer.LastOperator = tokenInfo.User.Name - if err = dao.Update(db, printer, model.FieldLastOperator, model.FieldDeletedAt); err != nil { - errs = append(errs, err) - } + printer := printers[0] + printer.DeletedAt = &now + printer.LastOperator = tokenInfo.User.Name + if err = dao.Update(db, printer, model.FieldLastOperator, model.FieldDeletedAt); err != nil { + errs = append(errs, err) } if len(errs) > 0 { err = putils.BuildErr(errs) @@ -142,7 +167,7 @@ func UpdatePrinter(appID int, tokenInfo *model.TokenInfo, printNo, name, sound s now = time.Now() fields []string ) - if apps, _ := dao.GetApps(db, appID, tokenInfo.User.UserID, ""); len(apps) == 0 { + if apps, _ := dao.GetApps(db, appID, "", ""); len(apps) == 0 { return fmt.Errorf("未查询到此应用!app_id:%d", appID) } @@ -216,23 +241,13 @@ func GetPrintMessages(appID int, tokenInfo *model.TokenInfo, printNo, msgID stri return dao.GetPrintMessagesPage(db, printNo, msgID, beginAt, endAt, offset, pageSize) } -type GetPrinterReportResult struct { - WeekPrintCount int `json:"week_print_count"` - DayPrintCount int `json:"day_print_count"` - DayUnPrintCount int `json:"day_un_print_count"` - OnlinePrinterCount int `json:"online_printer_count"` - OfflinePrinterCount int `json:"offline_printer_count"` - FlowPrinterCount int `json:"flow_printer_count"` - PaperPrinterCount int `json:"paper_printer_count"` -} - -func GetPrinterReport(tokenInfo *model.TokenInfo) (getPrinterReportResult *GetPrinterReportResult, err error) { +func GetPrinterReport(tokenInfo *model.TokenInfo) (getPrinterReportResult *app_model.GetPrinterReportResult, err error) { var ( db = globals.GetDB() weekCount, DayCount, DayUnCount = 0, 0, 0 onlineC, offlineC, flowC, paperC = 0, 0, 0, 0 ) - getPrinterReportResult = &GetPrinterReportResult{} + getPrinterReportResult = &app_model.GetPrinterReportResult{} apps, _ := dao.GetApps(db, 0, tokenInfo.User.UserID, "") if len(apps) == 0 { return nil, err diff --git a/services/print_server/print.go b/services/print_server/print.go index fa2c63c..f24167b 100644 --- a/services/print_server/print.go +++ b/services/print_server/print.go @@ -243,6 +243,6 @@ func GetPrinterReport(c *gin.Context, tokenInfo *model.TokenInfo) (getPrinterRep } // DeletePrintMsg 删除打印机打印消息 -func DeletePrintMsg(printNos []string) error { +func DeletePrintMsg(printNos string) error { return dao.DeletePrinterMsg(printNos) }