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, "", "