commit b6b525e82741bae1ac8c5beeaa6bf416a75a23d6 Author: lewis492772550 <492772550@qq.com> Date: Tue Jun 7 09:55:41 2022 +0800 初始化提交 diff --git a/cnop.properties b/cnop.properties new file mode 100644 index 0000000..e69de29 diff --git a/config_all.ini b/config_all.ini new file mode 100644 index 0000000..965f47b --- /dev/null +++ b/config_all.ini @@ -0,0 +1,123 @@ +[globe] +plats=025 +;005,006,011,014,017,020,021 +;001,002,003,004,005,006,009,010,014,015,017,018,019 +[002] +api_url=http://gw.api.taobao.com/router/rest +tmc_url=ws://mc.api.taobao.com + +[004] +api_url=http://192.168.1.180:8020/ + +[006] +;api_url=http://gw.gome.com.cn/router +api_url=http://192.168.1.180:8020/ + +[005] +;api_url=http://api.open.dangdang.com/openapi/rest +api_url=http://192.168.1.180:8020/ + +[003] +api_url=https://api.jd.com/routerjson +agent_api_ip=http://114.67.230.107:30003 + +[009] +api_url=http://open.feiniu.com/call.do? + +;[010] +api_url=116.62.209.78 + +[011] +api_url=http://192.168.1.180:8020/ + +[014] +;api_url=http://gw-api.pinduoduo.com/api/router +api_url=http://192.168.1.179:8020/ + +[015] +api_url=https://gw.vipapis.com + +[017] +;api_url=https://dopen.weimob.com +api_url=http://192.168.1.180:8020/ + +[018] +api_url=https://openapi.jk.cn/api/v1 + +[019] +api_url=http://gw.api.miyabaobei.com/openapi/app + +[020] +;api_url=https://open.yit.com/apigw/m.api +api_url=http://192.168.1.180:8020/ + +[021] +#api_url=http://flssandbox.xiaohongshu.com/ark/open_api/v0/packages/latest_packages? +;api_url=https://ark.xiaohongshu.com/ark/open_api/v0/packages +api_url=https://ark.xiaohongshu.com/ark/open_api/v3/common_controller + +[022] +api_url= + +[023] +api_url=https://openapi-fxg.jinritemai.com + +[024] +api_url= + +[025] +api_url= +#订单列表查询的时间间隔,快手在大促期间可能修改订单列表的查询时间间隔,单位小时 +orderListInteval=24 + +[026] +api_url=https://openapi.qunjielong.com/open/api/order +[parameter] +platformCode= +;店铺编码 +shopCode=20180329221 +;指定下单时间(格式:yyyy-MM-dd HH:mm:ss) +starTime=2019-12-09 12:00:00 +endTime=2019-12-09 18:00:00 + +[027] +api_url=https://api.vdian.com/api + +;指定系统单号 +orderId= + +[memcache] +url= +#192.168.1.172:11211 + +;库存同步,单位为分钟 +[storageUpdateTime] +interval=5 +stopStartTime=2018-11-10 00:00:00 +stopEndTime= + +;统一回退抓单时间,单位小时 +[coverTime] +coverage=10 + +[sttest] +;订单总数量 +orderCount=1000 +;订单起始订单号 +platform_code=200002 + + +[path] +;import_file_path=/var/www/html/emp3/public/uploads/order/ +import_file_path= +plg_url= +;plg_url=http://47.98.162.96:8088/servlet/login + +[problem_time] +time=2018-12-12 00:00:00 + +[hufu] +accessKeyId=E995C8167080BD5ED26B3573D8B08FFF +secretKey=17E8CFECA6B49E406D0ED6C6E81021DC +endpoint=hufu.cn-north-1.jdcloud-api.net +customerId=888 \ No newline at end of file diff --git a/db.properties b/db.properties new file mode 100644 index 0000000..5ed90b1 --- /dev/null +++ b/db.properties @@ -0,0 +1,47 @@ +[master]= +master.DriverClassName=com.mysql.jdbc.Driver +#url=jdbc:mysql://121.41.174.100:30001/EMP_20180531?characterEncoding=utf-8 +#username=test +#password=000000 +#url=jdbc:mysql://192.168.1.172:3306/EMP3?characterEncoding=utf-8 +master.url=jdbc:mysql://192.168.1.172:3307/EMP3?characterEncoding=utf-8 +#master.url=jdbc:mysql://192.168.1.179:3306/emp3?characterEncoding=utf-8&allowPublicKeyRetrieval=true +#master.url=jdbc:mysql://localhost:3306/emp3?characterEncoding=utf-8&allowPublicKeyRetrieval=true +master.username=root +master.password=123456 +master.filters=stat +master.initialSize=1 +master.maxActive=10 +master.maxWait=600000 +master.timeBetweenEvictionRunsMillis=5000 +master.minEvictableIdleTimeMillis=300000 +master.validationQuery=SELECT 1 +master.testWhileIdle=true +master.testOnBorrow=false +master.testOnReturn=false +master.poolPreparedStatements=false +master.maxPoolPreparedStatementPerConnectionSize=200 +[mihe]= +mihe.DriverClassName=com.mysql.jdbc.Driver +#url=jdbc:mysql://121.41.174.100:30001/EMP_20180531?characterEncoding=utf-8 +#username=test +#password=000000 +#mihe.url=jdbc:mysql://121.199.10.140:3306/mihe_db_dev?characterEncoding=utf-8&useSSL=false +#mihe.username=malluser +#mihe.password=Vmalldb124see! +mihe.url=jdbc:mysql://192.168.1.179:3306/mihe_db_dev?characterEncoding=utf-8&allowPublicKeyRetrieval=true +#mihe.url=jdbc:mysql://192.168.1.172:3307/EMP3_SALT?characterEncoding=utf-8&allowPublicKeyRetrieval=true +mihe.username=root +mihe.password=123456 +mihe.filters=stat +mihe.initialSize=1 +mihe.maxActive=10 +mihe.maxWait=600000 +mihe.timeBetweenEvictionRunsMillis=60000 +mihe.minEvictableIdleTimeMillis=300000 +mihe.validationQuery=SELECT 1 +mihe.testWhileIdle=true +mihe.testOnBorrow=false +mihe.testOnReturn=false +mihe.poolPreparedStatements=false +mihe.maxPoolPreparedStatementPerConnectionSize=200 diff --git a/libs/HufuErpMigrateV2-0.0.1-jar-with-dependencies.jar b/libs/HufuErpMigrateV2-0.0.1-jar-with-dependencies.jar new file mode 100644 index 0000000..a3bdb4c Binary files /dev/null and b/libs/HufuErpMigrateV2-0.0.1-jar-with-dependencies.jar differ diff --git a/libs/apache-mime4j-0.6.jar b/libs/apache-mime4j-0.6.jar new file mode 100644 index 0000000..1d2282c Binary files /dev/null and b/libs/apache-mime4j-0.6.jar differ diff --git a/libs/codec-client-0.2.4.jar b/libs/codec-client-0.2.4.jar new file mode 100644 index 0000000..686d528 Binary files /dev/null and b/libs/codec-client-0.2.4.jar differ diff --git a/libs/common-cipher-0.4.6.jar b/libs/common-cipher-0.4.6.jar new file mode 100644 index 0000000..888ea08 Binary files /dev/null and b/libs/common-cipher-0.4.6.jar differ diff --git a/libs/common-codec-0.4.6.jar b/libs/common-codec-0.4.6.jar new file mode 100644 index 0000000..575c820 Binary files /dev/null and b/libs/common-codec-0.4.6.jar differ diff --git a/libs/commons-beanutils-1.8.3.jar b/libs/commons-beanutils-1.8.3.jar new file mode 100644 index 0000000..218510b Binary files /dev/null and b/libs/commons-beanutils-1.8.3.jar differ diff --git a/libs/commons-codec-1.3.jar b/libs/commons-codec-1.3.jar new file mode 100644 index 0000000..957b675 Binary files /dev/null and b/libs/commons-codec-1.3.jar differ diff --git a/libs/commons-collections-3.2.1.jar b/libs/commons-collections-3.2.1.jar new file mode 100644 index 0000000..c35fa1f Binary files /dev/null and b/libs/commons-collections-3.2.1.jar differ diff --git a/libs/commons-collections4-4.1.jar b/libs/commons-collections4-4.1.jar new file mode 100644 index 0000000..43a9413 Binary files /dev/null and b/libs/commons-collections4-4.1.jar differ diff --git a/libs/commons-httpclient-3.1.jar b/libs/commons-httpclient-3.1.jar new file mode 100644 index 0000000..7c59774 Binary files /dev/null and b/libs/commons-httpclient-3.1.jar differ diff --git a/libs/commons-lang-2.5.jar b/libs/commons-lang-2.5.jar new file mode 100644 index 0000000..ae491da Binary files /dev/null and b/libs/commons-lang-2.5.jar differ diff --git a/libs/commons-lang3-3.1.jar b/libs/commons-lang3-3.1.jar new file mode 100644 index 0000000..a85e539 Binary files /dev/null and b/libs/commons-lang3-3.1.jar differ diff --git a/libs/commons-logging-1.2.jar b/libs/commons-logging-1.2.jar new file mode 100644 index 0000000..93a3b9f Binary files /dev/null and b/libs/commons-logging-1.2.jar differ diff --git a/libs/commons-pool-1.5.6.jar b/libs/commons-pool-1.5.6.jar new file mode 100644 index 0000000..ce5ff60 Binary files /dev/null and b/libs/commons-pool-1.5.6.jar differ diff --git a/libs/doudian-sdk-java-1.0.0-20211202165402.jar b/libs/doudian-sdk-java-1.0.0-20211202165402.jar new file mode 100644 index 0000000..0ffd4a8 Binary files /dev/null and b/libs/doudian-sdk-java-1.0.0-20211202165402.jar differ diff --git a/libs/druid-1.2.3.jar b/libs/druid-1.2.3.jar new file mode 100644 index 0000000..4c0e2d5 Binary files /dev/null and b/libs/druid-1.2.3.jar differ diff --git a/libs/ezmorph-1.0.6.jar b/libs/ezmorph-1.0.6.jar new file mode 100644 index 0000000..30fad12 Binary files /dev/null and b/libs/ezmorph-1.0.6.jar differ diff --git a/libs/fastjson-1.2.12.jar b/libs/fastjson-1.2.12.jar new file mode 100644 index 0000000..1b62aa3 Binary files /dev/null and b/libs/fastjson-1.2.12.jar differ diff --git a/libs/fe-platform_88fb7938e910aad5e7984042488ef09312f134bb_openSdk.jar.jar b/libs/fe-platform_88fb7938e910aad5e7984042488ef09312f134bb_openSdk.jar.jar new file mode 100644 index 0000000..614fc8f Binary files /dev/null and b/libs/fe-platform_88fb7938e910aad5e7984042488ef09312f134bb_openSdk.jar.jar differ diff --git a/libs/fnGson-1.2.jar b/libs/fnGson-1.2.jar new file mode 100644 index 0000000..906dd20 Binary files /dev/null and b/libs/fnGson-1.2.jar differ diff --git a/libs/gmos_client_sdk.jar b/libs/gmos_client_sdk.jar new file mode 100644 index 0000000..f20e09f Binary files /dev/null and b/libs/gmos_client_sdk.jar differ diff --git a/libs/httpclient-4.4.1.jar b/libs/httpclient-4.4.1.jar new file mode 100644 index 0000000..b80d379 Binary files /dev/null and b/libs/httpclient-4.4.1.jar differ diff --git a/libs/httpcore-4.4.1.jar b/libs/httpcore-4.4.1.jar new file mode 100644 index 0000000..99715b6 Binary files /dev/null and b/libs/httpcore-4.4.1.jar differ diff --git a/libs/httpmime-4.4.1.jar b/libs/httpmime-4.4.1.jar new file mode 100644 index 0000000..e748cbd Binary files /dev/null and b/libs/httpmime-4.4.1.jar differ diff --git a/libs/icu4j-59.1.jar b/libs/icu4j-59.1.jar new file mode 100644 index 0000000..3dc69c8 Binary files /dev/null and b/libs/icu4j-59.1.jar differ diff --git a/libs/jackson-core-asl-1.9.13.jar b/libs/jackson-core-asl-1.9.13.jar new file mode 100644 index 0000000..bb4fe1d Binary files /dev/null and b/libs/jackson-core-asl-1.9.13.jar differ diff --git a/libs/jackson-mapper-asl-1.9.13.jar b/libs/jackson-mapper-asl-1.9.13.jar new file mode 100644 index 0000000..0f2073f Binary files /dev/null and b/libs/jackson-mapper-asl-1.9.13.jar differ diff --git a/libs/jakarta-oro-2.0.8.jar b/libs/jakarta-oro-2.0.8.jar new file mode 100644 index 0000000..23488d2 Binary files /dev/null and b/libs/jakarta-oro-2.0.8.jar differ diff --git a/libs/jdom.jar b/libs/jdom.jar new file mode 100644 index 0000000..65a1b3f Binary files /dev/null and b/libs/jdom.jar differ diff --git a/libs/json-20160810.jar b/libs/json-20160810.jar new file mode 100644 index 0000000..a90e448 Binary files /dev/null and b/libs/json-20160810.jar differ diff --git a/libs/json-lib-2.2.3.jar b/libs/json-lib-2.2.3.jar new file mode 100644 index 0000000..8c92fab Binary files /dev/null and b/libs/json-lib-2.2.3.jar differ diff --git a/libs/justice-core-2.1.2.jar b/libs/justice-core-2.1.2.jar new file mode 100644 index 0000000..27de65c Binary files /dev/null and b/libs/justice-core-2.1.2.jar differ diff --git a/libs/jxl.jar b/libs/jxl.jar new file mode 100644 index 0000000..b210c06 Binary files /dev/null and b/libs/jxl.jar differ diff --git a/libs/kuaishou-merchant-open-sdk-110.jar b/libs/kuaishou-merchant-open-sdk-110.jar new file mode 100644 index 0000000..ce857a9 Binary files /dev/null and b/libs/kuaishou-merchant-open-sdk-110.jar differ diff --git a/libs/log4j-api-2.17.1.jar b/libs/log4j-api-2.17.1.jar new file mode 100644 index 0000000..605c45d Binary files /dev/null and b/libs/log4j-api-2.17.1.jar differ diff --git a/libs/log4j-core-2.17.1.jar b/libs/log4j-core-2.17.1.jar new file mode 100644 index 0000000..bbead12 Binary files /dev/null and b/libs/log4j-core-2.17.1.jar differ diff --git a/libs/lombok-1.18.18.jar b/libs/lombok-1.18.18.jar new file mode 100644 index 0000000..866caab Binary files /dev/null and b/libs/lombok-1.18.18.jar differ diff --git a/libs/mysql-connector-java-8.0.21.jar b/libs/mysql-connector-java-8.0.21.jar new file mode 100644 index 0000000..51e270c Binary files /dev/null and b/libs/mysql-connector-java-8.0.21.jar differ diff --git a/libs/okhttp-3.4.1.jar b/libs/okhttp-3.4.1.jar new file mode 100644 index 0000000..e31f248 Binary files /dev/null and b/libs/okhttp-3.4.1.jar differ diff --git a/libs/okio-1.9.0.jar b/libs/okio-1.9.0.jar new file mode 100644 index 0000000..3c42b93 Binary files /dev/null and b/libs/okio-1.9.0.jar differ diff --git a/libs/open-api-1.0-SNAPSHOT.jar b/libs/open-api-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..7d0559f Binary files /dev/null and b/libs/open-api-1.0-SNAPSHOT.jar differ diff --git a/libs/open-api-jdk1_8-1.0.2-SNAPSHOT.jar b/libs/open-api-jdk1_8-1.0.2-SNAPSHOT.jar new file mode 100644 index 0000000..ab375e1 Binary files /dev/null and b/libs/open-api-jdk1_8-1.0.2-SNAPSHOT.jar differ diff --git a/libs/open-api-sdk-2.0-2021-05-28.jar b/libs/open-api-sdk-2.0-2021-05-28.jar new file mode 100644 index 0000000..7f6b8a3 Binary files /dev/null and b/libs/open-api-sdk-2.0-2021-05-28.jar differ diff --git a/libs/osp-sdk.jar b/libs/osp-sdk.jar new file mode 100644 index 0000000..1b8ec90 Binary files /dev/null and b/libs/osp-sdk.jar differ diff --git a/libs/poi-3.17.jar b/libs/poi-3.17.jar new file mode 100644 index 0000000..353ce76 Binary files /dev/null and b/libs/poi-3.17.jar differ diff --git a/libs/poi-ooxml-3.17.jar b/libs/poi-ooxml-3.17.jar new file mode 100644 index 0000000..68086e8 Binary files /dev/null and b/libs/poi-ooxml-3.17.jar differ diff --git a/libs/poi-ooxml-schemas-3.17.jar b/libs/poi-ooxml-schemas-3.17.jar new file mode 100644 index 0000000..2e9b3e7 Binary files /dev/null and b/libs/poi-ooxml-schemas-3.17.jar differ diff --git a/libs/pop-sdk-1.10.97-all.jar b/libs/pop-sdk-1.10.97-all.jar new file mode 100644 index 0000000..db30401 Binary files /dev/null and b/libs/pop-sdk-1.10.97-all.jar differ diff --git a/libs/slf4j-api-1.6.1.jar b/libs/slf4j-api-1.6.1.jar new file mode 100644 index 0000000..42e0ad0 Binary files /dev/null and b/libs/slf4j-api-1.6.1.jar differ diff --git a/libs/slf4j-simple-1.6.1.jar b/libs/slf4j-simple-1.6.1.jar new file mode 100644 index 0000000..d894d96 Binary files /dev/null and b/libs/slf4j-simple-1.6.1.jar differ diff --git a/libs/spymemcached-2.12.3.jar b/libs/spymemcached-2.12.3.jar new file mode 100644 index 0000000..5635944 Binary files /dev/null and b/libs/spymemcached-2.12.3.jar differ diff --git a/libs/taobao-sdk-java-auto_1617699564157-20210406.jar b/libs/taobao-sdk-java-auto_1617699564157-20210406.jar new file mode 100644 index 0000000..2d9f8a2 Binary files /dev/null and b/libs/taobao-sdk-java-auto_1617699564157-20210406.jar differ diff --git a/libs/vop-sdk.jar b/libs/vop-sdk.jar new file mode 100644 index 0000000..61c271d Binary files /dev/null and b/libs/vop-sdk.jar differ diff --git a/libs/xmlbeans-2.6.0.jar b/libs/xmlbeans-2.6.0.jar new file mode 100644 index 0000000..d1b6627 Binary files /dev/null and b/libs/xmlbeans-2.6.0.jar differ diff --git a/libs/xom-1.1.jar b/libs/xom-1.1.jar new file mode 100644 index 0000000..3d1fcc8 Binary files /dev/null and b/libs/xom-1.1.jar differ diff --git a/libs/xstream-1.4.3.jar b/libs/xstream-1.4.3.jar new file mode 100644 index 0000000..815ed03 Binary files /dev/null and b/libs/xstream-1.4.3.jar differ diff --git a/libs/yz_SDK.jar b/libs/yz_SDK.jar new file mode 100644 index 0000000..5d07de1 Binary files /dev/null and b/libs/yz_SDK.jar differ diff --git a/log4j2-生产.properties b/log4j2-生产.properties new file mode 100644 index 0000000..845f2de --- /dev/null +++ b/log4j2-生产.properties @@ -0,0 +1,64 @@ +status = error +name = PropertiesConfig + +property.filename = logs/rollingtest.log + +filters = threshold + +filter.threshold.type = ThresholdFilter +filter.threshold.level = debug + +#appenders = console, I, W +#\u4E0D\u8981\u8F93\u51FA\u5230console\uFF0C\u8981\u517B\u6210\u770B\u65E5\u5FD7\u6587\u4EF6\u7684\u4E60\u60EF +appenders =I, W + +#appender.console.type = Console +#appender.console.name = STDOUT +#appender.console.target = SYSTEM_OUT +#appender.console.layout.type = PatternLayout +#appender.console.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n + +appender.I.type = RollingFile +appender.I.name = InfoRollingFile +appender.I.fileName = logs/info/info.log +appender.I.filePattern = logs/info/info_%d{yyyy-MM-dd}.log.%i +appender.I.layout.type = PatternLayout +appender.I.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n +appender.I.policies.type = Policies +appender.I.policies.time.type = TimeBasedTriggeringPolicy +appender.I.policies.time.interval = 1 +appender.I.policies.time.modulate = true +appender.I.policies.size.type = SizeBasedTriggeringPolicy +appender.I.policies.size.size=10M +appender.I.strategy.type = DefaultRolloverStrategy +appender.I.strategy.max = 10000 +appender.I.filter.threshold.type = ThresholdFilter +appender.I.filter.threshold.level = WARN +appender.I.filter.threshold.onMatch = DENY +appender.I.filter.threshold.onMisMatch=NEUTRAL + + +appender.W.type = RollingFile +appender.W.name = ErrorRollingFile +appender.W.fileName = logs/error/error.log +appender.W.filePattern = logs/error/error_%d{yyyy-MM-dd}.log.%i +appender.W.layout.type = PatternLayout +appender.W.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n +appender.W.policies.type = Policies +appender.W.policies.time.type = TimeBasedTriggeringPolicy +appender.W.policies.time.interval = 1 +appender.W.policies.time.modulate = true +appender.W.policies.size.type = SizeBasedTriggeringPolicy +appender.W.policies.size.size=10M +appender.W.strategy.type = DefaultRolloverStrategy +appender.W.strategy.max = 10000 + + +rootLogger.level = info +#rootLogger.appenderRefs = stdout,I,W +rootLogger.appenderRefs =I, W +#rootLogger.appenderRef.stdout.ref = STDOUT +rootLogger.appenderRef.I.ref = InfoRollingFile +rootLogger.appenderRef.I.level = info +rootLogger.appenderRef.W.ref = ErrorRollingFile +rootLogger.appenderRef.W.level = error \ No newline at end of file diff --git a/log4j2.properties b/log4j2.properties new file mode 100644 index 0000000..6e54965 --- /dev/null +++ b/log4j2.properties @@ -0,0 +1,64 @@ +status = error +name = PropertiesConfig + +property.filename = logs/rollingtest.log + +filters = threshold + +filter.threshold.type = ThresholdFilter +filter.threshold.level = debug + +appenders = console, I, W +#\u4E0D\u8981\u8F93\u51FA\u5230console\uFF0C\u8981\u517B\u6210\u770B\u65E5\u5FD7\u6587\u4EF6\u7684\u4E60\u60EF +#appenders =I, W + +appender.console.type = Console +appender.console.name = STDOUT +appender.console.target = SYSTEM_OUT +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n + +appender.I.type = RollingFile +appender.I.name = InfoRollingFile +appender.I.fileName = logs/info/info.log +appender.I.filePattern = logs/info/info_%d{yyyy-MM-dd}.log.%i +appender.I.layout.type = PatternLayout +appender.I.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n +appender.I.policies.type = Policies +appender.I.policies.time.type = TimeBasedTriggeringPolicy +appender.I.policies.time.interval = 1 +appender.I.policies.time.modulate = true +appender.I.policies.size.type = SizeBasedTriggeringPolicy +appender.I.policies.size.size=10M +appender.I.strategy.type = DefaultRolloverStrategy +appender.I.strategy.max = 10000 +appender.I.filter.threshold.type = ThresholdFilter +appender.I.filter.threshold.level = WARN +appender.I.filter.threshold.onMatch = DENY +appender.I.filter.threshold.onMisMatch=NEUTRAL + + +appender.W.type = RollingFile +appender.W.name = ErrorRollingFile +appender.W.fileName = logs/error/error.log +appender.W.filePattern = logs/error/error_%d{yyyy-MM-dd}.log.%i +appender.W.layout.type = PatternLayout +appender.W.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [ %c ] [ %L ] [ %p ] %m%n +appender.W.policies.type = Policies +appender.W.policies.time.type = TimeBasedTriggeringPolicy +appender.W.policies.time.interval = 1 +appender.W.policies.time.modulate = true +appender.W.policies.size.type = SizeBasedTriggeringPolicy +appender.W.policies.size.size=10M +appender.W.strategy.type = DefaultRolloverStrategy +appender.W.strategy.max = 10000 + + +rootLogger.level = info +rootLogger.appenderRefs = stdout,I,W +#rootLogger.appenderRefs =I, W +rootLogger.appenderRef.stdout.ref = STDOUT +rootLogger.appenderRef.I.ref = InfoRollingFile +rootLogger.appenderRef.I.level = info +rootLogger.appenderRef.W.ref = ErrorRollingFile +rootLogger.appenderRef.W.level = error \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..761d9f4 --- /dev/null +++ b/readme.md @@ -0,0 +1,76 @@ + + + + os_8.40.3(2020-04-23) + 1.JDK从oracle 8升级为open JDK11 + 2.优化淘宝有活动的商品的库存更新策略 + + os_8.40.2(2020-04-29) + 1.淘宝更新判断sync_lock_end_time的判断有误 + + os_8.40.1(2020-04-21) + 1.引入淘宝新的jar,他们修改了正常返回的订单详情的errorcode,之前是null,现在是空字符串 + + os_8.40.0(2020-04-21) + 1.新增抖店的抓单和延长授权(未启用) + 2.将拼多多的抓单和售后从南天门转到多多云内部服务 + 3.更新了淘宝的jar + + os_8.39.2(2020-04-21) + 1.新增抖店的抓单和延长授权(未启用) + 2.将拼多多的抓单和售后从南天门转到多多云内部服务 + 3.更新了淘宝的jar + + os_8.39.0(2020-12-10) + 1.售后订单还库存阶段,原来是统一还给发货的货架。现在的处理逻辑修改为:配货前需要还库存的,还给原货架,配货后还库存的,还到默认货架 + + os_8.38.0(2020-12-08) + 1.订单写入,对于直播订单标题中有指定关键字的,直接锁定 + 2.售后订单,在tb_sale_order的del_flag=1的按照之前的处理,新增处理:del_falg!=1时,在店铺开启了可以售后的前提下,可以直接登记和完成售后 + + os_8.37.0(忘记提交了) + 1.补录订单中的省份,校验必须填写完整且正确 + + os_8.36.4(2020-11-12) + 1.修复售后单写入的问题,在还库存的地方没有区分经销商自己发货和品牌商发货 + + os_8.36.0 + 1.加入京东虎符的业务逻辑 + + os_8.35.1 + 1.修复os_8.35.0中修改出的问题,将orderStatus>=3的情况改为orderStatus>3 + + os_8.35.0 + 1.修改售后写入的方法,在查询售后单状态由case when then改为直接使用出库单状态 + + os_8.34.2 + 1.修复商品的memcached的key值中包含空格时java和php处理不一致的问题。解决方案为存在空格的key值整体进行base64加密存储。 + + os_8.30.1 + 1.修复已知bug + 2.修改淘宝御城河订单提交策略,只要有就提交,不再等待满五分钟或者满100单 + 3.修改淘宝及供销平台单个订单详情获取失败的异常捕获机制 + + os_8.31.0 + 1.启用新版PLG拦截接口 + + os_8.31.1 + 1.修改启用新版PLG拦截接口bug + + os_8.31.2 + 1.修改启用新版PLG拦截接口bug + + os_8.31.3 + 1.修改御城河提交的问题 + + os_8.32.0 + 1.对于小红书的预售订单识别并丢弃 + + os_8.32.3 + 1.修复补录订单文件补录单元格为blank的问题 + + os_8.32.5 + 1.修复京东电子发票订单解析异常的问题 + + os_8.32.6 + 1.修复京东订单解析中商品查询接口失效的问题 \ No newline at end of file diff --git a/src/com/since/emp/analysis/AnalysisDataParse.java b/src/com/since/emp/analysis/AnalysisDataParse.java new file mode 100644 index 0000000..b647560 --- /dev/null +++ b/src/com/since/emp/analysis/AnalysisDataParse.java @@ -0,0 +1,8070 @@ +package com.since.emp.analysis; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.*; +import com.since.emp.base.aftersale.*; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.util.EmojiFilterUtil; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.MD5Util; +import jxl.Sheet; +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; +import net.spy.memcached.MemcachedClient; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * AnalysisDataParse 数据解析 + * + * @author jue + */ +public class AnalysisDataParse { + private static Logger logger; + public Vector tradeQueue; + public Vector pretradeQueue; + public Vector tradeQueue_Success; + private Vector exceptionTradeQueue; + public boolean flag_check_exist = false; + public boolean flag_check_exception = false; + private MemcachedClient mcc = null; + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + Vector activityUpdateQueue;// 更新数据库活动商品已送数量 + private static Lock lock;// 线程锁 + private static Lock presale_lock;// 预售订单处理线程锁 + + private String stopStartTime;// 定时同步停止同步的起始时间 + private String stopEndTime;// 定时同步停止同步的结束时间 + + private String plg_url; + + static { + Init(); + } + + public AnalysisDataParse() { + logger = LogManager.getLogger(AnalysisDataParse.class); + } + + private static void Init() { + lock = new ReentrantLock();// 获得锁 + presale_lock = new ReentrantLock();// 实例化线程锁 + } + + public void start() { + try { + mcc = OrderSyncs.MemcacheInit(AnalysisDataParse.class.getName()); + tradeQueue = new Vector(); + pretradeQueue = new Vector(); + tradeQueue_Success = new Vector(); + activityUpdateQueue = new Vector(); + exceptionTradeQueue = new Vector(); + threadPool = ThreadPool.getInstance(); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + TradeParseSuccessThread tpst = new TradeParseSuccessThread(); + scheduledThreadPool.scheduleAtFixedRate(tpst, 0, 100, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + TradeParseThread tpt = new TradeParseThread(); + + scheduledThreadPool.scheduleAtFixedRate(tpt, 0, 50, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + PretradeParseThread ppt = new PretradeParseThread(); + scheduledThreadPool.scheduleAtFixedRate(ppt, 0, 50, TimeUnit.MILLISECONDS); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + + ActivityUpdateThread aut = new ActivityUpdateThread(); + scheduledThreadPool.scheduleAtFixedRate(aut, 0, 100, TimeUnit.MILLISECONDS); + /** + * 异常订单检查线程 + */ + scheduledThreadPool = ScheduledThreadPool.getInstance(); + ExceptionTradeQueueThread etqt = new ExceptionTradeQueueThread(); + scheduledThreadPool.scheduleAtFixedRate(etqt, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + IniReader iniReader = new IniReader("config_all.ini"); + plg_url = iniReader.getValue("path", "plg_url"); + stopStartTime = iniReader.getValue("storageUpdateTime", "stopStartTime"); + stopEndTime = iniReader.getValue("storageUpdateTime", "stopEndTime"); + } catch (Exception e) { + logger.error(this, e); + } + + logger.info("数据处理线程启动"); + } + + private class TradeParseThread extends Thread { + @Override + public void run() { + try { + if (tradeQueue.size() > 0) { + int count = tradeQueue.size(); + if (count > 20) { + count = 20; + } + // 用两个map存储是防止并发数量大于设计量(20个线程) + Map map_002 = new ConcurrentHashMap();// 存储淘宝平台订单 + Map map_other = new ConcurrentHashMap(); // 存储其他平台订单 + for (int i = 0; i < count; i++) { + TradeInfo tradeInfo = tradeQueue.get(0); + if ("002".equals(tradeInfo.platform_code)) { + if ("taobao_trade_TradeBuyerPay".equals(tradeInfo.trade_type) + || "taobao_fenxiao_FxOrderPaid".equals(tradeInfo.trade_type)) { + String key = tradeInfo.company_code + "," + tradeInfo.shop_code + "," + tradeInfo.tid; + map_002.put(key, tradeInfo); + + } else if ("taobao_trade_TradeMemoModified".equals(tradeInfo.trade_type)) { + TradeMemoModify tradeMemoModify = new TradeMemoModify(tradeInfo); + threadPool.execute(tradeMemoModify); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + + } + } else { + String key = tradeInfo.company_code + "," + tradeInfo.shop_code + "," + tradeInfo.tid; + map_other.put(key, tradeInfo); + } + tradeQueue.remove(0); + } + for (Entry entry : map_002.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + TradeProcessThread tpt = new TradeProcessThread(tradeInfo, mcc); + threadPool.execute(tpt); + } + for (Entry entry : map_other.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + TradeProcessThread tpt = new TradeProcessThread(tradeInfo, mcc); + threadPool.execute(tpt); + } + logger.info("订单队列总数: [ {} ] ", tradeQueue.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + /** + * 预售订单处理线程 + */ + private class PretradeParseThread extends Thread { + @Override + public void run() { + try { + if (pretradeQueue.size() > 0) { + TradeInfo tradeInfo = pretradeQueue.get(0); + pretradeQueue.remove(0); + if (!pretradeProcess(tradeInfo)) { + pretradeQueue.add(tradeInfo); + } + } + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + /** + * pretradeProcess 预售订单处理 + * + * @param tradeInfo 订单 + * @return + */ + public boolean pretradeProcess(TradeInfo tradeInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + // boolean found; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + String result = insertPretradeTransaction(tradeInfo, conn, ps, rs); + // over表示是预售商品,但是赠品已送完,true表示写入成功,false表示异常,repeat表示订单重复 + if ("true".equals(result)) { + logger.info("预售订单写入成功| [ {} ] ", tradeInfo.tid); + return true; + } else if ("over".equals(result)) { + logger.info("预售订单超出赠品限额或不符合规则,不做处理| [ {} ] ", tradeInfo.tid); + return true; + } else { + logger.info("预售订单事务执行异常,回滚| [ {} ] ", tradeInfo.tid); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + return false; + } + // } + } catch (Exception e) { + try { + logger.info("预售订单事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + logger.info("回滚执行失败|{}", e.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 预售订单处理方法 + */ + private String insertPretradeTransaction(TradeInfo tradeInfo, DruidPooledConnection conn, PreparedStatement ps, + ResultSet rs) { + + String sql = ""; + try { + presale_lock.lock(); + if (!"".equals(tradeInfo.orders[0].platform_seller_code)) { + String company_code = tradeInfo.company_code; + String platform_seller_code = tradeInfo.orders[0].platform_seller_code; + String key = company_code + "_c" + platform_seller_code; + /** + * 如果更新存储的键值对,同时更新掉订单写入方法:inserttradeTransaction中的存储的键值对相应的 + */ + if (mcc == null || (mcc.get(key) == null)) { + int kind = 0; + int commodity_class = 0; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + company_code + "' and a.platform_seller_code= '" + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind"); + commodity_class = rs.getInt("class"); + if (rs.getString("name") != null) { + tradeInfo.brand = rs.getString("name"); + } + tradeInfo.orders[0].commodity_code = rs.getString("code") == null ? "" : rs.getString("code"); + tradeInfo.orders[0].commodity_class = commodity_class; + if ("".equals(tradeInfo.orders[0].commodity_code)) { + return "over"; + } + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("brand", tradeInfo.brand); + map.put("kind", String.valueOf(kind)); + map.put("code", tradeInfo.orders[0].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key,0, jsonStr); + } + } else { + logger.info("数据库未查询到|[ {} ] 记录,不处理预售订单", platform_seller_code); + return "over"; + } + + } else { + String jsonStr = (String) mcc.get(key); + JSONObject json = new JSONObject(jsonStr); + // String kind = (String) json.get("kind"); + // String brand = json.get("brand").toString(); + tradeInfo.orders[0].commodity_code = json.get("code") == null ? "" + : (String) json.get("code"); + if ("".equals(tradeInfo.orders[0].commodity_code)) { + return "over"; + } + } + } else { + return "over"; + } + + // 获取活动规则 + // 预售活动的判断要以订单的创建时间为判断基础 + List rules = Collections.synchronizedList(new ArrayList()); + sql = "select b.gift_activity_code,a.name as activity_name,a.shop_code,a.company_code,b.begin_time,b.end_time," + + "b.code as rule_code,b.name as rule_name,b.seq as rule_seq," + + "b.apply_object as rule_apply_object,b.pre_sale_flag as rule_pre_sale_flag," + + "b.pay_money as rule_pay_money,b.promotion_mode as rule_promotion_mode," + + "b.any_commodity as rule_any_commodity,b.any_number as rule_any_number," + + "b.appoint_commodity as rule_appoint_commodity,b.gift_mode as rule_gift_mode," + + "b.delivery_type_id as rule_delivery_type_id," + + "b.superposition_mode as rule_superposition_mode," + + "b.gift_limit_condition as rule_gift_limit_condition,b.limit_number as rule_limit_number," + + "b.gift_current as rule_gift_current,b.order_current as rule_order_current," + + "b.gift_commodity as rule_gift_commodity,b.presell_begin_time as rule_presell_begin_time," + + "b.presell_end_time as rule_presell_end_time " + + "from tb_gift_activity a,tb_gift_activity_rule b where a.status = 2 and " + + "b.gift_activity_code = a.code and b.begin_time<=? and b.end_time>=? and " + + "a.shop_code=? and b.pre_sale_flag=3 and presell_sort = 1 and apply_object = '2' order by b.gift_activity_code,b.seq desc"; + // 预售排序:1:付定金时间,2:付尾款时间 + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.pay_time); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, tradeInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + Rule rule = new Rule(); + rule.gift_activity_code = rs.getString("gift_activity_code"); + rule.activity_name = rs.getString("activity_name"); + rule.activity_shop_code = rs.getString("shop_code"); + rule.activity_company_code = rs.getString("company_code"); + rule.activity_begin_time = rs.getString("begin_time"); + rule.activity_end_time = rs.getString("end_time"); + rule.rule_code = rs.getString("rule_code"); + rule.rule_name = rs.getString("rule_name"); + rule.rule_seq = rs.getInt("rule_seq"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_pre_sale_flag = rs.getInt("rule_pre_sale_flag"); + rule.rule_pay_money = rs.getString("rule_pay_money"); + rule.rule_gift_mode = rs.getString("rule_gift_mode"); + rule.rule_promotion_mode = rs.getString("rule_promotion_mode"); + rule.rule_any_commodity = rs.getString("rule_any_commodity") == null ? "" + : rs.getString("rule_any_commodity"); + rule.rule_any_number = rs.getString("rule_any_number") == null ? "" : rs.getString("rule_any_number"); + rule.rule_appoint_commodity = rs.getString("rule_appoint_commodity") == null ? "" + : rs.getString("rule_appoint_commodity"); + rule.rule_delivery_type_id = rs.getInt("rule_delivery_type_id"); + rule.rule_superposition_mode = rs.getString("rule_superposition_mode"); + rule.rule_gift_limit_condition = rs.getString("rule_gift_limit_condition"); + rule.rule_limit_number = rs.getString("rule_limit_number") == null ? "" + : rs.getString("rule_limit_number"); + rule.rule_gift_current = rs.getInt("rule_gift_current"); + rule.rule_order_current = rs.getInt("rule_order_current"); + rule.rule_gift_commodity = rs.getString("rule_gift_commodity") == null ? "" + : rs.getString("rule_gift_commodity"); + rule.rule_presell_begin_time = rs.getString("rule_presell_begin_time") == null ? "" + : rs.getString("rule_presell_begin_time"); + rule.rule_presell_end_time = rs.getString("rule_presell_end_time") == null ? "" + : rs.getString("rule_presell_end_time"); + rules.add(rule); + } + + if (tradeInfo.orders.length == 1) {// 预售订单的子条目只可能为1 + OrderInfo orderInfo = tradeInfo.orders[0]; + if ("".equals(orderInfo.commodity_code)) { + logger.info("预售订单商品编码为空!"); + return "over"; + } + + String seq_fit_rules = "";// 对于有排序要求的记录符合的活动编码,其他规则不再赠送. + int seq_num_rules = 0;// 对于有排序要求的活动,而订单中由于高优先级的活动中赠品送完,这部分未配送赠品的又符合低优先级的活动,对该部分做记录并配送低优先级活动赠品 + for (int i = 0; i < rules.size(); i++) { + Rule rule = rules.get(i); + // 有顺序的规则,判断是否送过,如已经送过,则直接跳过 + if (rule.rule_seq > 0) { + if (seq_fit_rules.indexOf(rule.gift_activity_code) >= 0) { + continue; + } + } + + if (rule.rule_apply_object.equals("1") || rule.rule_promotion_mode.equals("2")) {// 预售订单只针对于商品且为促销方式为任意多件的,如果针对于订单则活动规则有误 + logger.info("预售订单活动无适用对象为订单的活动,活动规则建立错误!"); + continue; + } + + if (!"".equals(rule.rule_presell_begin_time) && !"".equals(rule.rule_presell_end_time)) {// 指定的预售开始时间和结束时间不为空 + if (tradeInfo.pay_time.compareTo(rule.rule_presell_begin_time) < 0 + || tradeInfo.pay_time.compareTo(rule.rule_presell_end_time) > 0) {// 预售订单不在指定的时间范围内 + logger.info("预售订单不在指定活动时间范围内!"); + continue; + } + } + + if (orderInfo.num < Integer.parseInt(rule.rule_any_number)) {// 订单中的商品数量不满足赠送条件 + logger.info("预售订单不满足活动条件!"); + continue; + } + + int num = 1;// 需要赠送的赠品份数 + String any_commodity = rule.rule_any_commodity; + String[] commodity_codes = any_commodity.trim().split("\\|"); + for (String commodity_code : commodity_codes) {// 遍历出所有指定的商品编码 + if (commodity_code.equals(orderInfo.commodity_code)) {// 商品满足活动条件 + // 限额条件:1:不限,2:订单,3:赠品 + // 订单查重 + String duplicate_checking_sql = "select 1 from tb_presale_order where platform_code=? and shop_code=? and rule_code =? limit 1"; + ps = conn.prepareStatement(duplicate_checking_sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, rule.rule_code); + rs = ps.executeQuery(); + + if (rs.next()) { + logger.info("预售订单已存在| [ {} ]", tradeInfo.tid); + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + continue; + } + + if ("1".equals(rule.rule_gift_limit_condition)) {// 不限额 + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + if ("1".equals(rule.rule_superposition_mode)) {// 限订单 不叠加 + num = 1;// 赠品份数 + } else if ("2".equals(rule.rule_superposition_mode)) {// 限订单叠加,叠加情况下赠送的赠品数量需要计算数量 + num = (int) Math.floor(orderInfo.num / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数; + } + + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + // 记录预售订单 + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } else if ("2".equals(rule.rule_gift_limit_condition) + && rule.rule_order_current < Integer.parseInt(rule.rule_limit_number) + && rule.rule_gift_mode.equals("2")) { + // 限额条件为限订单,赠送方式为赠送赠品, + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + // 计算赠品份数 + if ("1".equals(rule.rule_superposition_mode)) { + // 限订单 不叠加 + num = 1;// 赠品份数 + } else if (rule.rule_superposition_mode.equals("2")) { + // 限订单叠加,叠加情况下赠送的赠品数量需要计算数量 + num = (int) Math.floor(orderInfo.num / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数; + } + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + // 记录预售订单 + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update = "update tb_gift_activity_rule set order_current=" + + (rule.rule_order_current + 1) + " where code='" + rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新已送订单数量 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + logger.info("该限订单的预售订单 [ {} ] 订单已成功记录到预售单表,且已成功更新数据库中已赠送赠品数量!", tradeInfo.tid); + } else if ("3".equals(rule.rule_gift_limit_condition)// 限赠品 + && rule.rule_gift_current < Integer.parseInt(rule.rule_limit_number) + && rule.rule_gift_mode.equals("2")) {// 限额条件为限赠品,赠送方式为赠品 + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + if (rule.rule_superposition_mode.equals("1")) {// 不叠加 + num = 1; + } else if (rule.rule_superposition_mode.equals("2")) {// 叠加 + if ((rule.rule_gift_current + orderInfo.num) > Integer + .parseInt(rule.rule_limit_number)) { + num = (Integer.parseInt(rule.rule_limit_number) - rule.rule_gift_current); + seq_num_rules = rule.rule_gift_current + orderInfo.num + - Integer.parseInt(rule.rule_limit_number); + } else { + num = orderInfo.num; + } + } + + // 记录赠品信息 + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update = "update tb_gift_activity_rule set gift_current=" + + (rule.rule_gift_current + num) + " where code='" + rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update); + if (ps.executeUpdate() == 0) { + return "false"; + } + + // 记录预售订单 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + + if (seq_num_rules > 0) { + int num_rule = 0; + for (int j = 0; j < rules.size(); j++) { + Rule rule_rule = rules.get(j); + // 相同的规则 + if (rule_rule.rule_seq < rule.rule_seq && rule_rule.rule_seq > 0 + && (!rule_rule.rule_code.equals(rule.rule_code)// 不同的规则编号 + && rule_rule.rule_any_number.equals(rule.rule_any_number)// 指定的购买件数相同 + && rule_rule.rule_pre_sale_flag == rule.rule_pre_sale_flag// 预售 + && rule_rule.rule_presell_begin_time + .equals(rule.rule_presell_begin_time)// 相同的预售开始时间 + && rule_rule.rule_presell_end_time + .equals(rule.rule_presell_end_time)// 相同的预售结束时间 + && rule_rule.rule_gift_limit_condition + .equals(rule.rule_gift_limit_condition)// 相同的限额方式 + && "2".equals(rule_rule.rule_gift_mode))) { + if (seq_num_rules > Integer.parseInt(rule_rule.rule_limit_number)) { + num_rule = Integer.parseInt(rule_rule.rule_limit_number); + seq_num_rules = seq_num_rules - num_rule; + } else { + num_rule = seq_num_rules; + seq_num_rules = -1; + } + + // 记录预售单 + // 记录赠品信息 + Map nextGiftMap = new HashMap(); + nextGiftMap.put(num_rule, rule_rule.rule_gift_commodity); + Gson next_gn = new GsonBuilder().disableHtmlEscaping().create(); + String next_giftCommodityInfo = next_gn.toJson(nextGiftMap); + String sql_presale_rule = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale_rule); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule_rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, next_giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update_rule = "update tb_gift_activity_rule set gift_current=" + + num_rule + " where code='" + rule_rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update_rule); + if (ps.executeUpdate() == 0) { + return "false"; + } + if (seq_num_rules < 0) { + return "true"; + } + } + } + } + } + } + } + } + + } + } else { + logger.info("预售订单| [ {} ] 不符合规则,请检查!", tradeInfo.tid); + } + return "over"; + } catch (SQLException e) { + logger.error(this, e); + return "false"; + } catch (Exception e) { + logger.error(this, e); + return "false"; + } finally { + presale_lock.unlock();// 释放锁 + } + } + + /** + * 对于未检测未出库售后订单处理 + * + * @param refundInfo + * @return + * @throws Exception + */ + public boolean isStorageOut(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String sale_order_code, + String company_code, int aftersale_seq, boolean storageFlag, int aftersale_number, int aftersale_reason_id, + int entrust_issuccess, RefundInfo refundInfo, String entrust_msg) throws Exception { // 未检测,未发货,未出库 + // 更新发票状态 + String sql = ""; + sql = "select status from tb_invoice where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + rs = ps.executeQuery(); + while (rs.next()) { + sql = "update tb_invoice set status=4 where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + + // 更新售后状态 + String aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg) values(?,?,?,?,0,?,?,?,?,4,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setString(9, entrust_msg); + if (ps.executeUpdate() == 0) { + return false; + } + + // 更新订单表 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? , aftersale_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 3); + ps.setInt(2, aftersale_seq + 1); + ps.setInt(3, aftersale_number + 1); + ps.setString(4, sale_order_code); + if (ps.executeUpdate() == 0) { + return false; + } + + logger.info("退款订单 [ {} ] 处理成功!", refundInfo.tid); + return true; + } + + /* + * 退款取消订单处理 + * + * 买家撤销退款申请后,系统自动将售后取消,并同步将订单的锁定状态恢复到正常状态 + * 店铺运营管理中新增“售后自动关闭”开关,与自动退款一样,必须在售后自动登记开启时,才能设置 1.获取到撤销退款申请后,在系统中寻找自动登记的, + * 2.如果找到售后单,判断售后单是否过审核,已过审核的不处理,未过审核的可以进行撤销操作 3.撤销操作包括:关闭售后单(含链路)、解除订单的锁定状态 + * 开关字段:auto_cancel_aftersale_flag + */ + public boolean updateRefundClosedOrder(RefundInfo refundClosedInfo) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + boolean found = false; + try { + List list = new ArrayList(); + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "SELECT a.code as aftersale_code,b.code as sale_order_code " + + "FROM tb_aftersale_order a, tb_sale_order b " + + "WHERE a.del_flag = 1 AND a. STATUS = 1 AND b.del_flag = 2 AND a.platform_refund_code = ? AND b.platform_code = ?" + + "AND a.sale_order_code = b. CODE AND a.company_code = b.company_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundClosedInfo.refund_id); + ps.setString(2, refundClosedInfo.tid); + rs = ps.executeQuery(); + while (rs.next()) { + found = true; + RefundColseEntity refundColseEntity = new RefundColseEntity(); + refundColseEntity.aftersale_code = rs.getString("aftersale_code"); + refundColseEntity.sale_order_code = rs.getString("sale_order_code"); + list.add(refundColseEntity); + } + if (!found) { + logger.info("取消退款订单 [ {} ] 没有找到正在售后的对应销售单,放弃处理", refundClosedInfo.tid); + return true; + } + for (int i = 0; i < list.size(); i++) { + /* + * 将销售单的状态从锁定改为正常 + */ + RefundColseEntity refundColseEntity = list.get(i); + sql = "update tb_sale_order set del_flag=1,aftersale_order_flag=1 where code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundColseEntity.sale_order_code); + ps.setString(2, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + /* + * 将售后单的状态由正常改为删除状态 + */ + sql = "update tb_aftersale_order set del_flag=2 where code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundColseEntity.aftersale_code); + ps.setString(2, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + /* + * 将审核表的链路信息改为取消售后 + */ + sql = "insert into tb_aduit (aduit_user_id,module_code,sale_order_code,company_code)" + + " values (?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 0); + ps.setString(2, "07010202"); + ps.setString(3, refundColseEntity.sale_order_code); + ps.setString(4, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + } + logger.info("取消退款订单 [ {} ] 处理完成", refundClosedInfo.tid); + return true; + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("取消退款订单事务执行异常,回滚| [ {} ]:{}", refundClosedInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + public boolean logisticsAddressChanged(ChangLogisticsAddressInfo changLogisticsAddressInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + boolean foundRs = false;// 根据平台单号是否查询到符合条件的系统订单 + List changLogisticsAddressOrderList = new ArrayList(); + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + // 业务代码 + if (changLogisticsAddressInfo.company_type == 2) { // company_type:企业类型 1:后台管理公司,2:经销商,3:供应商 + sql = "select a.code as sale_order_code,a.entrust_type, a.company_code,a.obm_company_code, invoice_type, b.storage_code,c.platform_code as platformCode, " + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.company_code=b.company_code,tb_shop c " + + "where a.shop_code=c.code and a.aftersale_order_flag=1 and a.platform_code = ? and a.del_flag=1 and a.status>-1 and a.origin is null and a.shop_code = ? and a.aftersale_seq=0 and a.aftersale_number=0 order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(changLogisticsAddressInfo.tid)); + ps.setString(2, changLogisticsAddressInfo.shop_code); + rs = ps.executeQuery(); + } + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select a.code as sale_order_code,a.entrust_type, a.company_code,a.obm_company_code, invoice_type, b.storage_code,c.platform_code as platformCode," + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.obm_company_code=b.obm_company_code,tb_shop c " + + "where a.shop_code=c.code and a.aftersale_order_flag=1 and a.platform_code = ? and a.del_flag=1 and a.status>-1 and a.origin is null and a.shop_code = ? and a.aftersale_seq=0 and a.aftersale_number=0 order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(changLogisticsAddressInfo.tid));// 退款单对应的销售单订单编码 + ps.setString(2, changLogisticsAddressInfo.shop_code);// 店铺编码 + rs = ps.executeQuery(); + } + + while (rs.next()) { + foundRs = true; + // 如果是改单和拆单 + ChangLogisticsAddressOrder changLogisticsAddressOrder = new ChangLogisticsAddressOrder();// 售后订单 + changLogisticsAddressOrder.sale_order_code = rs.getString("sale_order_code"); + changLogisticsAddressOrder.platform_code = rs.getString("platformCode"); + changLogisticsAddressOrder.entrust_type = rs.getInt("entrust_type"); + changLogisticsAddressOrder.company_code = rs.getString("company_code") == null ? "" + : rs.getString("company_code"); + changLogisticsAddressOrder.sale_order_code = rs.getString("sale_order_code"); + changLogisticsAddressOrder.obm_company_code = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + changLogisticsAddressOrder.invoice_type = rs.getInt("invoice_type"); + changLogisticsAddressOrder.orderStatus = rs.getInt("orderStatus"); + changLogisticsAddressOrder.storage_code = rs.getString("storage_code") == null ? "" + : rs.getString("storage_code"); + changLogisticsAddressOrderList.add(changLogisticsAddressOrder); + } + if (!foundRs) { + logger.info("未查询到符合条件的修改地址订单,放弃处理| [ {} ] ", changLogisticsAddressInfo.tid); + return true; + } + + for (int i = 0; i < changLogisticsAddressOrderList.size(); i++) { + ChangLogisticsAddressOrder changLogisticsAddressOrder = changLogisticsAddressOrderList.get(i); + /** + * obmFlag true为品牌商或品牌商代发,false为经销商自有 + */ + boolean obmFlag = false; + if (!"".equals(changLogisticsAddressOrder.obm_company_code)) { + obmFlag = true; + } + /** + * 当订单为委外订单时判断是否拦截 + */ + int entrust_issuccess = 0; + String entrust_msg = ""; + if (changLogisticsAddressOrder.entrust_type == 2 && changLogisticsAddressOrder.orderStatus < 7) {// 属于委外订单且订单未发货 + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,logistics_company_code from tb_storage where logistics_company_code is not null and company_code=?"; + ps = conn.prepareStatement(sql); + if (obmFlag) { + ps.setString(1, changLogisticsAddressOrder.obm_company_code); + } else { + ps.setString(1, changLogisticsAddressOrder.company_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("code") == null ? "" : rs.getString("code"); + String logistics_company_code = rs.getString("logistics_company_code") == null ? "" + : rs.getString("logistics_company_code"); + /** + * 品牌商为空说明为经销商的自发订单 + */ + if (storage_code.equals(changLogisticsAddressOrder.storage_code) + && "PLG".equals(logistics_company_code)) { + + String param = "djbh=" + changLogisticsAddressOrder.sale_order_code + + "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; + HttpRequest httpRequest = new HttpRequest(); + String resultStr = httpRequest.sendGet(plg_url, param, AnalysisDataParse.class.getName()); + + /** + * 如果接口异常,放弃处理 + */ + + if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + entrust_issuccess = 1; + entrust_msg = "PLG服务器连接失败|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + break; + } + JSONObject json = new JSONObject(resultStr); + String isSuccess = json.getString("isSuccess"); + entrust_msg = json.getString("result"); + entrust_msg = isSuccess + "|" + entrust_msg + "|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if ("100".equals(isSuccess)) { + entrust_issuccess = 1; + break; + } + entrust_issuccess = 2; + + /** + * 新版接口,暂不使用,等周总通知 2019-07-08 + */ + /* + * HashMap resultMap = sendInterceptToPLG( + * changLogisticsAddressOrder.sale_order_code); if + * (!resultMap.containsKey("result")) { entrust_issuccess = 1; entrust_msg = + * "PLG服务器连接失败|" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new + * Date()); break; } boolean resultFlag = + * Boolean.valueOf(resultMap.get("flag")); String result = + * resultMap.get("result"); if (!resultFlag) { entrust_msg = result + "|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); entrust_issuccess + * = 1; break; } entrust_issuccess = 2; + */ + } + } + } + // 锁定订单 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 2); + ps.setInt(2, 1); + ps.setString(3, changLogisticsAddressOrder.sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 生成新售后详单 + + /** + * 分经销商和品牌商两种情况处理 + */ + if (changLogisticsAddressOrder.orderStatus >= 5) {// 对于有出库单表的订单,商品以出库单详表为准,如果还未出库,则以销售单详表为主 + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.obm_company_code); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.company_code); + rs = ps.executeQuery(); + } + } else { + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,money,gift from tb_sale_order_items where sale_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.obm_company_code); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,money,gift from tb_sale_order_items where sale_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.company_code); + rs = ps.executeQuery(); + } + } + + int num = 0; + String code = ""; + String commodity_code = ""; + int quantity = 0; + int left_quantity = 0; + double money = 0.0; + int gift = 0; + while (rs.next()) { + num++; + code = rs.getString("code"); + if (changLogisticsAddressInfo.company_type == 3) { + commodity_code = rs.getString("obm_commodity_code"); + } else { + commodity_code = rs.getString("commodity_code"); + } + quantity = rs.getInt("quantity"); + if (changLogisticsAddressOrder.orderStatus >= 5) { + left_quantity = rs.getInt("left_quantity"); + } else { + left_quantity = quantity; + } + + money = rs.getDouble("money"); + gift = rs.getInt("gift"); + sql = "insert into tb_aftersale_order_items(code,commodity_code,quantity,left_quantity,money,gift,original_sale_order_code,company_code) values(?,?,?,?,?,?,?,?) "; + ps = conn.prepareStatement(sql); + ps.setString(1, code); + ps.setString(2, commodity_code); + ps.setInt(3, quantity); + ps.setInt(4, left_quantity); + ps.setDouble(5, money); + ps.setInt(6, gift); + ps.setString(7, changLogisticsAddressOrder.sale_order_code); + // if (obmFlag) { + // ps.setString(8, ro.obm_company_code); + // } else { + ps.setString(8, changLogisticsAddressOrder.company_code); + // } + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + if (num <= 0) { + logger.info("修改收货地址订单| [ {} ] 出库单及销售单详单都未找到该订单,不添加当前商品信息!", changLogisticsAddressInfo.tid); + } + // 生成新售后单 + String aftersale_order_code = ""; + aftersale_order_code = "SH" + 1 + "_" + changLogisticsAddressOrder.sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,entrust_issuccess,status,entrust_msg,aftersale_type_id) values(?,?,?,?,0,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + ps.setInt(2, 4);// 售后诉求id(1:退款2:退货3:换货4:改单5:补货6:换票7:补票8:补偿9:并单10:拆单11:取消售后单) + ps.setInt(3, 10); + ps.setString(4, changLogisticsAddressOrder.sale_order_code); + ps.setString(5, changLogisticsAddressOrder.company_code); + ps.setString(6, "自动更新地址:" + changLogisticsAddressInfo.receiver_address); + if (entrust_issuccess == 0) { + ps.setString(7, null); + } + if (entrust_issuccess == 2) { + ps.setInt(7, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(7, 1); + } + ps.setInt(8, 2); + ps.setString(9, entrust_msg); + ps.setInt(10, 4);// 售后类型id(1:退款2:退货3:换货4:改单5:补货6:换票7:补票8:补偿9:并单10:拆单11:拦截售后订单) + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + // 生成新售后单表,复制销售单表,销售单详表,快递单表,财务单表,发票表(如果有)委外订单生成新的出库单,出库单详表 + boolean hasNullCommodityCode = false;// 销售单详表中是否有空商品 + // 销售单详表 + List TbSaleOrderItemsList = new ArrayList(); + sql = "select commodity_code,obm_commodity_code,quantity,unit_price,money,commodity_title,account,total_fee,adjust_fee,gift,sale_order_code,sku_message,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,obm_company_code " + + " from tb_sale_order_items where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + TbSaleOrderItems tbSaleOrderItems = new TbSaleOrderItems(); + tbSaleOrderItems.commodityCode = rs.getString("commodity_code") == null ? "" + : rs.getString("commodity_code"); + tbSaleOrderItems.obmCommodityCode = rs.getString("obm_commodity_code") == null ? "" + : rs.getString("obm_commodity_code"); + if (changLogisticsAddressInfo.company_type == 3 && "".equals(tbSaleOrderItems.obmCommodityCode)) {// 对于品牌商,品牌商商品编码为空,则不再处理 + hasNullCommodityCode = true; + break; + } + if (changLogisticsAddressInfo.company_type == 2 && "".equals(tbSaleOrderItems.commodityCode)) {// 对于经销商,商品编码为空,则不再处理 + hasNullCommodityCode = true; + break; + } + + tbSaleOrderItems.quantity = rs.getInt("quantity"); + tbSaleOrderItems.unitPrice = rs.getString("unit_price") == null ? -1 : rs.getDouble("unit_price"); + tbSaleOrderItems.money = rs.getString("money") == null ? -1 : rs.getDouble("money"); + tbSaleOrderItems.commodityTitle = rs.getString("commodity_title"); + tbSaleOrderItems.account = rs.getString("account") == null ? -1 : rs.getDouble("account"); + tbSaleOrderItems.totalFee = rs.getString("total_fee") == null ? -1 : rs.getDouble("total_fee"); + tbSaleOrderItems.adjustFee = rs.getString("adjust_fee") == null ? -1 : rs.getDouble("adjust_fee"); + tbSaleOrderItems.gift = rs.getInt("gift"); + tbSaleOrderItems.saleOrderCode = rs.getString("sale_order_code"); + tbSaleOrderItems.skuMessage = rs.getString("sku_message"); + tbSaleOrderItems.itemId = rs.getString("item_id"); + tbSaleOrderItems.productItemId = rs.getString("product_item_id"); + tbSaleOrderItems.companyCode = rs.getString("company_code"); + tbSaleOrderItems.divideOrderFee = rs.getString("divide_order_fee") == null ? -1 + : rs.getDouble("divide_order_fee"); + tbSaleOrderItems.partMjzDiscount = rs.getString("part_mjz_discount") == null ? -1 + : rs.getDouble("part_mjz_discount"); + tbSaleOrderItems.oid = rs.getString("oid"); + tbSaleOrderItems.obmCompanyCode = rs.getString("obm_company_code"); + TbSaleOrderItemsList.add(tbSaleOrderItems); + } + if (!hasNullCommodityCode) { + /* + * 生成新的系统单号 + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String order_code = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).split(" ")[0] + .replaceAll("-", ""); + String new_sale_order = createOrderCode(conn, ps, rs, order_code, "sh_002", + changLogisticsAddressInfo.tid); + new_sale_order = "SH" + new_sale_order; + + for (int j = 0; j < TbSaleOrderItemsList.size(); j++) { + TbSaleOrderItems tbSaleOrderItems = TbSaleOrderItemsList.get(j); + sql = "insert into tb_sale_order_items(code,commodity_code,obm_commodity_code,quantity,unit_price,money,commodity_title,account,total_fee,adjust_fee,gift,sale_order_code,sku_message,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,obm_company_code) " + + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order + "_" + (j + 1)); + ps.setString(2, tbSaleOrderItems.commodityCode); + ps.setString(3, tbSaleOrderItems.obmCommodityCode); + ps.setInt(4, tbSaleOrderItems.quantity); + if (tbSaleOrderItems.unitPrice == -1) { + ps.setString(5, null); + } else { + ps.setDouble(5, tbSaleOrderItems.unitPrice); + } + if (tbSaleOrderItems.money == -1) { + ps.setString(6, null); + } else { + ps.setDouble(6, tbSaleOrderItems.money); + } + ps.setString(7, tbSaleOrderItems.commodityTitle); + if (tbSaleOrderItems.account == -1) { + ps.setString(8, null); + } else { + ps.setDouble(8, tbSaleOrderItems.account); + } + if (tbSaleOrderItems.totalFee == -1) { + ps.setString(9, null); + } else { + ps.setDouble(9, tbSaleOrderItems.totalFee); + } + if (tbSaleOrderItems.adjustFee == -1) { + ps.setString(10, null); + } else { + ps.setDouble(10, tbSaleOrderItems.adjustFee); + } + ps.setInt(11, tbSaleOrderItems.gift); + ps.setString(12, new_sale_order); + ps.setString(13, tbSaleOrderItems.skuMessage); + ps.setString(14, tbSaleOrderItems.itemId); + ps.setString(15, tbSaleOrderItems.productItemId); + ps.setString(16, tbSaleOrderItems.companyCode); + if (tbSaleOrderItems.divideOrderFee == -1) { + ps.setString(17, null); + } else { + ps.setDouble(17, tbSaleOrderItems.divideOrderFee); + } + ps.setDouble(18, tbSaleOrderItems.partMjzDiscount); + ps.setString(19, tbSaleOrderItems.oid); + ps.setString(20, tbSaleOrderItems.obmCompanyCode); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + + } + + // 处理销售单表 + TbSaleOrder tbSaleOrder = new TbSaleOrder(); + List tbSaleOrderList = new ArrayList(); + sql = "select code,platform_code,pay_account,pay_no,platform_status,platform_type,step_status,cod_status,brand_list,quantity ,money ,status ,type ,sale_note,original_sale_order_code,receivables_difference,buyer_nick_name ,buyer_name ,buyer_address,buyer_telephone ,buyer_email ,platform_create_time ,platform_consign_time ,platform_end_time ,platform_modify_time ,buyer_message ,seller_note,pay_money, receivables_money ,total_fee ,adjust_fee ,discount_fee,pay_time,aftersale_order_code,aftersale_order_flag, aftersale_number,invoice_type, pay_mode_id,del_flag,user_id,create_time,shop_code,origin,trade_mode_id,aftersale_seq,cur_delivery_order_code,cur_money,cur_quantity,lock_reason_id,lock_note,cur_invoice_type,company_code,basket_code,write_back_status,write_back_reason,last_aftersale_order_code,storage_code,encrpy_buyer_nick_name,entrust_type,entrust_status,entrust_time,seller_flag,obm_company_code,dealer_purchase_order_code,pre_money,pre_money_voucher,order_splite,invoice_status,obm_storage_code,new_sale_order_code " + + " from tb_sale_order where code=? and shop_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + + tbSaleOrder.code = rs.getString("code"); + tbSaleOrder.platformCode = rs.getString("platform_code"); + tbSaleOrder.payAccount = rs.getString("pay_account"); + tbSaleOrder.payNo = rs.getString("pay_no"); + tbSaleOrder.platformStatus = rs.getString("platform_status"); + tbSaleOrder.platformType = rs.getString("platform_type"); + tbSaleOrder.stepStatus = rs.getString("step_status"); + tbSaleOrder.codStatus = rs.getString("cod_status"); + tbSaleOrder.brandList = rs.getString("brand_list"); + tbSaleOrder.quantity = rs.getInt("quantity"); + tbSaleOrder.money = rs.getString("money") == null ? -1 : rs.getDouble("money"); + tbSaleOrder.status = rs.getInt("status"); + tbSaleOrder.type = rs.getInt("type"); + tbSaleOrder.saleNote = rs.getString("sale_note"); + tbSaleOrder.originalSaleOrderCode = rs.getString("original_sale_order_code"); + tbSaleOrder.receivablesDifference = rs.getString("receivables_difference") == null ? -1 + : rs.getDouble("receivables_difference"); + tbSaleOrder.buyerNickName = rs.getString("buyer_nick_name"); + tbSaleOrder.buyerName = rs.getString("buyer_name"); + tbSaleOrder.buyerAddress = rs.getString("buyer_address"); + tbSaleOrder.buyerTelephone = rs.getString("buyer_telephone"); + tbSaleOrder.buyerEmail = rs.getString("buyer_email"); + tbSaleOrder.platformCreateTime = rs.getString("platform_create_time"); + tbSaleOrder.platformConsignTime = rs.getString("platform_consign_time"); + tbSaleOrder.platformEndTime = rs.getString("platform_end_time"); + tbSaleOrder.platformModifyTime = rs.getString("platform_modify_time"); + tbSaleOrder.buyerMessage = rs.getString("buyer_message"); + tbSaleOrder.sellerNote = rs.getString("seller_note"); + tbSaleOrder.payMoney = rs.getString("pay_money") == null ? -1 : rs.getDouble("pay_money"); + tbSaleOrder.receivablesMoney = rs.getString("receivables_money") == null ? -1 + : rs.getDouble("receivables_money"); + tbSaleOrder.totalFee = rs.getString("total_fee") == null ? -1 : rs.getDouble("total_fee"); + tbSaleOrder.adjustFee = rs.getString("adjust_fee") == null ? -1 : rs.getDouble("adjust_fee"); + tbSaleOrder.discountFee = rs.getString("discount_fee") == null ? -1 + : rs.getDouble("discount_fee"); + tbSaleOrder.payTime = rs.getString("pay_time"); + tbSaleOrder.aftersaleOrderCode = rs.getString("aftersale_order_code"); + tbSaleOrder.aftersaleOrderFlag = rs.getInt("aftersale_order_flag"); + tbSaleOrder.aftersaleNumber = rs.getInt("aftersale_number"); + tbSaleOrder.invoiceType = rs.getInt("invoice_type"); + tbSaleOrder.payModeId = rs.getString("pay_mode_id"); + tbSaleOrder.delFlag = rs.getInt("del_flag"); + tbSaleOrder.userId = rs.getString("user_id") == null ? -1 : rs.getInt("user_id"); + tbSaleOrder.createTime = rs.getString("create_time"); + tbSaleOrder.shopCode = rs.getString("shop_code"); + tbSaleOrder.origin = rs.getString("origin") == null ? -1 : rs.getInt("origin"); + tbSaleOrder.tradeModeId = rs.getInt("trade_mode_id"); + tbSaleOrder.aftersaleSeq = rs.getInt("aftersale_seq"); + tbSaleOrder.curDeliveryOrderCode = rs.getString("cur_delivery_order_code"); + tbSaleOrder.curMoney = rs.getDouble("cur_money"); + tbSaleOrder.curQuantity = rs.getInt("cur_quantity"); + tbSaleOrder.lockReasonId = rs.getInt("lock_reason_id"); + tbSaleOrder.lockNote = rs.getString("lock_note"); + tbSaleOrder.curInvoiceType = rs.getInt("cur_invoice_type"); + tbSaleOrder.companyCode = rs.getString("company_code"); + tbSaleOrder.basketCode = rs.getString("basket_code"); + tbSaleOrder.writeBackStatus = rs.getInt("write_back_status"); + tbSaleOrder.writeBackReason = rs.getString("write_back_reason"); + tbSaleOrder.lastAftersaleOrderCode = rs.getString("last_aftersale_order_code"); + tbSaleOrder.storageCode = rs.getString("storage_code"); + tbSaleOrder.encrpyBuyerNickName = rs.getString("encrpy_buyer_nick_name"); + tbSaleOrder.entrustType = rs.getInt("entrust_type"); + tbSaleOrder.entrustStatus = rs.getInt("entrust_status"); + tbSaleOrder.entrustTime = rs.getString("entrust_time"); + tbSaleOrder.sellerFlag = rs.getInt("seller_flag"); + tbSaleOrder.obmCompanyCode = rs.getString("obm_company_code"); + tbSaleOrder.dealerPurchaseOrderCode = rs.getString("dealer_purchase_order_code"); + tbSaleOrder.preMoney = rs.getDouble("pre_money"); + tbSaleOrder.preMoneyVoucher = rs.getString("pre_money_voucher"); + tbSaleOrder.orderSplite = rs.getString("order_splite") == null ? -1 : rs.getInt("order_splite"); + tbSaleOrder.invoiceStatus = rs.getString("invoice_status") == null ? -1 + : rs.getInt("invoice_status"); + tbSaleOrder.obmStorageCode = rs.getString("obm_storage_code"); + tbSaleOrder.newSaleOrderCode = rs.getString("new_sale_order_code"); + } + + sql = "insert into tb_sale_order(code,platform_code,pay_account,pay_no,platform_status,platform_type,step_status,cod_status,brand_list,quantity ,money ,status ,type ,sale_note,original_sale_order_code,receivables_difference,buyer_nick_name ,buyer_name ,buyer_address,buyer_telephone ,buyer_email ,platform_create_time ,platform_consign_time ,platform_end_time ,platform_modify_time ,buyer_message ,seller_note,pay_money, receivables_money ,total_fee ,adjust_fee ,discount_fee,pay_time,aftersale_order_code,aftersale_order_flag, aftersale_number,invoice_type, pay_mode_id,del_flag,user_id,create_time,shop_code,origin,trade_mode_id,aftersale_seq,cur_delivery_order_code,cur_money,cur_quantity,lock_reason_id,lock_note,cur_invoice_type,company_code,basket_code,write_back_status,write_back_reason,last_aftersale_order_code,storage_code,encrpy_buyer_nick_name,entrust_type,entrust_status,entrust_time,seller_flag,obm_company_code,dealer_purchase_order_code,pre_money,pre_money_voucher,order_splite,invoice_status,obm_storage_code,new_sale_order_code) " + + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order); + ps.setString(2, tbSaleOrder.platformCode); + ps.setString(3, tbSaleOrder.payAccount); + ps.setString(4, tbSaleOrder.payNo); + ps.setString(5, tbSaleOrder.platformStatus); + ps.setString(6, tbSaleOrder.platformType); + ps.setString(7, tbSaleOrder.stepStatus); + ps.setString(8, tbSaleOrder.codStatus); + ps.setString(9, tbSaleOrder.brandList); + ps.setInt(10, tbSaleOrder.quantity); + if (tbSaleOrder.money == -1) { + ps.setString(11, null); + } else { + ps.setDouble(11, tbSaleOrder.money); + } + ps.setInt(12, -1); + ps.setInt(13, tbSaleOrder.type); + ps.setString(14, tbSaleOrder.saleNote); + ps.setString(15, new_sale_order); + if (tbSaleOrder.receivablesDifference == -1) { + ps.setString(16, null); + } else { + ps.setDouble(16, tbSaleOrder.receivablesDifference); + } + ps.setString(17, tbSaleOrder.buyerNickName); + ps.setString(18, tbSaleOrder.buyerName); + ps.setString(19, tbSaleOrder.buyerAddress); + ps.setString(20, tbSaleOrder.buyerTelephone); + ps.setString(21, tbSaleOrder.buyerEmail); + ps.setString(22, tbSaleOrder.platformCreateTime); + ps.setString(23, tbSaleOrder.platformConsignTime); + ps.setString(24, tbSaleOrder.platformEndTime); + ps.setString(25, tbSaleOrder.platformModifyTime); + ps.setString(26, tbSaleOrder.buyerMessage); + ps.setString(27, tbSaleOrder.sellerNote); + if (tbSaleOrder.payMoney == -1) { + ps.setString(28, null); + } else { + ps.setDouble(28, tbSaleOrder.payMoney); + } + if (tbSaleOrder.receivablesMoney == -1) { + ps.setString(29, null); + } else { + ps.setDouble(29, tbSaleOrder.receivablesMoney); + } + if (tbSaleOrder.totalFee == -1) { + ps.setString(30, null); + } else { + ps.setDouble(30, tbSaleOrder.totalFee); + } + if (tbSaleOrder.adjustFee == -1) { + ps.setString(31, null); + } else { + ps.setDouble(31, tbSaleOrder.adjustFee); + } + if (tbSaleOrder.discountFee == -1) { + ps.setString(32, null); + } else { + ps.setDouble(32, tbSaleOrder.discountFee); + } + ps.setString(33, tbSaleOrder.payTime); + ps.setString(34, aftersale_order_code); + ps.setInt(35, 1); + ps.setInt(36, 0); + ps.setInt(37, tbSaleOrder.invoiceType); + ps.setString(38, tbSaleOrder.payModeId); + ps.setInt(39, 1); + if (tbSaleOrder.userId == -1) { + ps.setString(40, null); + } else { + ps.setDouble(40, tbSaleOrder.userId); + } + ps.setString(41, sdf.format(new Date())); + ps.setString(42, tbSaleOrder.shopCode); + ps.setDouble(43, 4);// 订单来源为改单 + ps.setInt(44, tbSaleOrder.tradeModeId); + ps.setInt(45, 0); + ps.setString(46, "PS" + new_sale_order); + ps.setDouble(47, tbSaleOrder.curMoney); + ps.setInt(48, tbSaleOrder.curQuantity); + ps.setInt(49, tbSaleOrder.lockReasonId); + ps.setString(50, tbSaleOrder.lockNote); + ps.setInt(51, tbSaleOrder.curInvoiceType); + ps.setString(52, tbSaleOrder.companyCode); + ps.setString(53, tbSaleOrder.basketCode); + ps.setInt(54, tbSaleOrder.writeBackStatus); + ps.setString(55, tbSaleOrder.writeBackReason); + ps.setString(56, tbSaleOrder.lastAftersaleOrderCode); + ps.setString(57, tbSaleOrder.storageCode); + ps.setString(58, tbSaleOrder.encrpyBuyerNickName); + ps.setInt(59, 1); + ps.setInt(60, 1); + ps.setString(61, null); + ps.setInt(62, tbSaleOrder.sellerFlag); + ps.setString(63, tbSaleOrder.obmCompanyCode); + ps.setString(64, tbSaleOrder.dealerPurchaseOrderCode); + ps.setDouble(65, tbSaleOrder.preMoney); + ps.setString(66, tbSaleOrder.preMoneyVoucher); + if (tbSaleOrder.orderSplite == -1) { + ps.setString(67, null); + } else { + ps.setDouble(67, tbSaleOrder.orderSplite); + } + if (tbSaleOrder.invoiceStatus == -1) { + ps.setString(68, null); + } else { + ps.setDouble(68, tbSaleOrder.invoiceStatus); + } + ps.setString(69, tbSaleOrder.obmStorageCode); + ps.setString(70, tbSaleOrder.newSaleOrderCode); + + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + + // 快递单表 + TbDeliveryOrder tbDeliveryOrder = new TbDeliveryOrder(); + sql = "select cost,delivery_mode_code from tb_delivery_order where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbDeliveryOrder.cost = rs.getString("cost") == null ? -1 : rs.getDouble("cost"); + tbDeliveryOrder.deliveryModeCode = rs.getInt("delivery_mode_code"); + } + + sql = "insert into tb_delivery_order (code,sale_order_code,cost,country,state,city,district,post_code,delivery_mode_code,company_code,name,mobile,address,telephone,encrpy_name,encrpy_mobile,encrpy_address,encrpy_telephone,obm_company_code,aftersale_order_code) " + + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, "PS" + new_sale_order); + ps.setString(2, new_sale_order); + if (tbDeliveryOrder.cost == -1) { + ps.setString(3, null); + } else { + ps.setDouble(3, tbDeliveryOrder.cost); + } + ps.setString(4, changLogisticsAddressInfo.receiver_country); + ps.setString(5, changLogisticsAddressInfo.receiver_state); + ps.setString(6, changLogisticsAddressInfo.receiver_city); + ps.setString(7, changLogisticsAddressInfo.receiver_district); + ps.setString(8, changLogisticsAddressInfo.receiver_zip); + ps.setInt(9, tbDeliveryOrder.deliveryModeCode); + ps.setString(10, changLogisticsAddressOrder.company_code); + ps.setString(11, changLogisticsAddressInfo.receiver_name); + ps.setString(12, changLogisticsAddressInfo.receiver_mobile); + ps.setString(13, changLogisticsAddressInfo.receiver_address); + ps.setString(14, changLogisticsAddressInfo.receiver_phone); + ps.setString(15, changLogisticsAddressInfo.encrpy_name); + ps.setString(16, changLogisticsAddressInfo.encrpy_mobile); + ps.setString(17, changLogisticsAddressInfo.encrpy_address); + ps.setString(18, changLogisticsAddressInfo.encrpy_telephone); + ps.setString(19, changLogisticsAddressOrder.obm_company_code); + ps.setString(20, aftersale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + // 发票表 + if (changLogisticsAddressOrder.invoice_type == 2) { + TbInvoice tbInvoice = new TbInvoice(); + sql = "select title,content,owner_flag,money,TAX_msg,type_id,create_time,supplier_code,tax,del_flag,company_code,TAX_id,telephone,address,account,bank_of_deposit,note,obm_company_code,obm_settlement_order_code,print_mode,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email,electronic_code,check_code,pdf_url" + + " from tb_invoice where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbInvoice.title = rs.getString("title"); + tbInvoice.content = rs.getString("content"); + tbInvoice.ownerFlag = rs.getInt("owner_flag"); + tbInvoice.money = rs.getDouble("money"); + tbInvoice.taxMsg = rs.getString("TAX_msg"); + tbInvoice.typeId = rs.getInt("type_id"); + tbInvoice.supplierCode = rs.getString("supplier_code"); + tbInvoice.tax = rs.getDouble("tax"); + tbInvoice.companyCode = rs.getString("company_code"); + tbInvoice.taxId = rs.getString("TAX_id"); + tbInvoice.telephone = rs.getString("telephone"); + tbInvoice.address = rs.getString("address"); + tbInvoice.account = rs.getString("account"); + tbInvoice.bankOfDeposit = rs.getString("bank_of_deposit"); + tbInvoice.note = rs.getString("note"); + tbInvoice.obmCompanyCode = rs.getString("obm_company_code"); + tbInvoice.obmSettlementOrderCode = rs.getString("obm_settlement_order_code"); + tbInvoice.printMode = rs.getInt("print_mode"); + tbInvoice.addressTelephone = rs.getString("address_telephone"); + tbInvoice.bankOfDepositAccountNumber = rs.getString("bank_of_deposit_account_number"); + tbInvoice.receiveTelephone = rs.getString("receive_telephone"); + tbInvoice.receiveEmail = rs.getString("receive_email"); + tbInvoice.electronicCode = rs.getString("electronic_code"); + tbInvoice.checkCode = rs.getString("check_code"); + tbInvoice.pdfUrl = rs.getString("pdf_url"); + } + + sql = "insert into tb_invoice (code,type,title,content,owner_flag,status,money,TAX_msg,sale_order_code,type_id,user_id,create_time,supplier_code,tax,del_flag,company_code,TAX_id,telephone,address,account,bank_of_deposit,note,obm_company_code,obm_settlement_order_code,print_mode,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email,electronic_code,check_code,pdf_url)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, "FP" + new_sale_order + "_1"); + ps.setInt(2, 1); + ps.setString(3, tbInvoice.title); + ps.setString(4, tbInvoice.content); + ps.setInt(5, tbInvoice.ownerFlag); + ps.setInt(6, 1); + ps.setDouble(7, tbInvoice.money); + ps.setString(8, tbInvoice.taxMsg); + ps.setString(9, new_sale_order); + ps.setInt(10, tbInvoice.typeId); + ps.setInt(11, 0); + ps.setString(12, sdf.format(new Date())); + ps.setString(13, tbInvoice.supplierCode); + ps.setDouble(14, tbInvoice.tax); + ps.setInt(15, 1); + ps.setString(16, tbInvoice.companyCode); + ps.setString(17, tbInvoice.taxId); + ps.setString(18, tbInvoice.telephone); + ps.setString(19, tbInvoice.address); + ps.setString(20, tbInvoice.account); + ps.setString(21, tbInvoice.bankOfDeposit); + ps.setString(22, tbInvoice.note); + ps.setString(23, tbInvoice.obmCompanyCode); + ps.setString(24, tbInvoice.obmSettlementOrderCode); + ps.setInt(25, tbInvoice.printMode); + ps.setString(26, tbInvoice.addressTelephone); + ps.setString(27, tbInvoice.bankOfDepositAccountNumber); + ps.setString(28, tbInvoice.receiveTelephone); + ps.setString(29, tbInvoice.receiveEmail); + ps.setString(30, tbInvoice.electronicCode); + ps.setString(31, tbInvoice.checkCode); + ps.setString(32, tbInvoice.pdfUrl); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + } + // 处理天猫供销平台订单 + if ("012".equals(changLogisticsAddressOrder.platform_code)) { + // 天猫供销平台主表 + TbSubSaleOrder tbSubSaleOrder = new TbSubSaleOrder(); + sql = "select tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code from tb_sub_sale_order where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbSubSaleOrder.tcOrderId = rs.getString("tc_order_id"); + tbSubSaleOrder.distributorUsername = rs.getString("distributor_username"); + tbSubSaleOrder.tradeType = rs.getInt("trade_type"); + tbSubSaleOrder.buyerPayment = rs.getDouble("buyer_payment"); + tbSubSaleOrder.status = rs.getString("status"); + tbSubSaleOrder.companyCode = rs.getString("company_code"); + } + sql = "insert into tb_sub_sale_order (code,tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code) values(?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order); + ps.setString(2, tbSubSaleOrder.tcOrderId); + ps.setString(3, tbSubSaleOrder.distributorUsername); + ps.setInt(4, tbSubSaleOrder.tradeType); + ps.setDouble(5, tbSubSaleOrder.buyerPayment); + ps.setString(6, tbSubSaleOrder.status); + ps.setString(7, tbSubSaleOrder.companyCode); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + // 天猫供销平台子表 + List tbSubSaleOrderItemsList = new ArrayList(); + sql = "select status,buyer_payment,discount_fee,tc_discountFee,tc_adjust_fee,company_code from tb_sub_sale_order_items where code like ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code + "_%"); + rs = ps.executeQuery(); + while (rs.next()) { + TbSubSaleOrderItems tbSubSaleOrderItems = new TbSubSaleOrderItems(); + tbSubSaleOrderItems.status = rs.getString("status"); + tbSubSaleOrderItems.buyerPayment = rs.getDouble("buyer_payment"); + tbSubSaleOrderItems.discountFee = rs.getDouble("discount_fee"); + tbSubSaleOrderItems.tcDiscountFee = rs.getDouble("tc_discountFee"); + tbSubSaleOrderItems.tcAdjustFee = rs.getDouble("tc_adjust_fee"); + tbSubSaleOrderItems.companyCode = rs.getString("company_code"); + tbSubSaleOrderItemsList.add(tbSubSaleOrderItems); + } + for (int j = 0; j < tbSubSaleOrderItemsList.size(); j++) { + TbSubSaleOrderItems tbSubSaleOrderItems = tbSubSaleOrderItemsList.get(j); + sql = "insert into tb_sub_sale_order_items (code,status,buyer_payment,tc_discount_fee,discount_fee,tc_adjust_fee,company_code) values(?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order + "_" + (j + 1)); + ps.setDouble(2, tbSubSaleOrderItems.buyerPayment); + ps.setDouble(3, tbSubSaleOrderItems.tcDiscountFee); + ps.setDouble(4, tbSubSaleOrderItems.discountFee); + ps.setDouble(5, tbSubSaleOrderItems.tcAdjustFee); + ps.setDouble(6, tbSubSaleOrderItems.tcAdjustFee); + ps.setString(7, tbSubSaleOrderItems.companyCode); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + } + } + } + } + logger.info("订单| [ {} ] 收货地址修改登记完成!", changLogisticsAddressInfo.tid); + return true; + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("修改收货地址订单事务执行异常,回滚| [ {} ] :{}", changLogisticsAddressInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + + // 售后处理 + public boolean insertRefundOrder(RefundInfo refundInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + List refundList = Collections.synchronizedList(new ArrayList()); + ResultSet rs = null; + ResultSet rs1 = null; + ResultSet rs2 = null; + + try { + conn = dbpc.getConnection(); + int origin = 0;// 售后来源(1:换货 2:补货 3:补偿 4:改单 5:并单 6:拆单 7:换票 8:补票) + boolean foundRs = false;// 是否有可登记销售订单 + int countFirst = 0;// 统计第一次循环的结果 + boolean originFlag = false;// 订单是否是改单和拆单 + + conn.setAutoCommit(false); + if (refundInfo.company_type == 2) { // company_type:企业类型 1:后台管理公司,2:经销商,3:供应商 + sql = "select a.code as sale_order_code, a.aftersale_seq,a.origin,a.entrust_type, a.company_code,a.obm_company_code,a.aftersale_number,b.storage_code,b.check_flag,c.auto_refund_flag, " + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.company_code=b.company_code,tb_shop c " + + "where a.shop_code=c.code and c.auto_aftersale_flag=2 and a.platform_code = ? and a.aftersale_order_flag=1 and a.del_flag=1 and a.status>-1 and a.shop_code = ? order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.tid)); + ps.setString(2, refundInfo.shop_code); + rs = ps.executeQuery(); + } + if (refundInfo.company_type == 3) { + sql = "select a.code as sale_order_code, a.aftersale_seq,a.origin,a.entrust_type, a.company_code,a.obm_company_code,a.aftersale_number,b.storage_code,b.check_flag,c.auto_refund_flag, " + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.obm_company_code=b.obm_company_code,tb_shop c " + + "where a.shop_code=c.code and c.auto_aftersale_flag=2 and a.platform_code = ? and a.aftersale_order_flag=1 and a.del_flag=1 and a.status>-1 and a.shop_code = ? order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.tid));// 退款单对应的销售单订单编码 + ps.setString(2, refundInfo.shop_code);// 店铺编码 + rs = ps.executeQuery(); + } + + while (rs.next()) { + foundRs = true; + origin = rs.getInt("origin"); + // 售后统计循环次数为0且来源为改单和拆单,改为改单和拆单 + if (countFirst == 0 && (origin == 4 || origin == 6)) { + originFlag = true; + } + // 如果是改单和拆单 + if (originFlag && (origin == 4 || origin == 6)) { + /* + * if (origin == 6) {// 暂时将拆单分出,放弃处理 logger.info("【" + logTitle + + * "】退款订单为拆单订单,放弃处理|" + refundInfo.tid); } else {// 改单的处理 + * + */ + RefundOrder ro = new RefundOrder();// 售后订单 + ro.aftersaleNumber = rs.getInt("aftersale_number"); + ro.checkFlag = rs.getInt("check_flag"); + ro.autoRefundFlag = rs.getInt("auto_refund_flag"); + ro.aftersaleSeq = rs.getInt("aftersale_seq"); + ro.orderStatus = rs.getInt("orderStatus"); + ro.saleOrderCode = rs.getString("sale_order_code"); + ro.entrustType = rs.getInt("entrust_type"); + ro.obmCompanyCode = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + ro.companyCode = rs.getString("company_code"); + ro.storageCode = rs.getString("storage_code") == null ? "" : rs.getString("storage_code"); + refundList.add(ro); + // } + + } + if (originFlag == false && origin == 0) {// 非改单和拆单 + RefundOrder ro = new RefundOrder(); + ro.aftersaleNumber = rs.getInt("aftersale_number"); + ro.checkFlag = rs.getInt("check_flag"); + ro.autoRefundFlag = rs.getInt("auto_refund_flag"); + ro.aftersaleSeq = rs.getInt("aftersale_seq"); + ro.orderStatus = rs.getInt("orderStatus"); + ro.saleOrderCode = rs.getString("sale_order_code"); + ro.entrustType = rs.getInt("entrust_type"); + ro.obmCompanyCode = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + ro.companyCode = ""; + ro.storageCode = rs.getString("storage_code") == null ? "" : rs.getString("storage_code"); + refundList.add(ro); + } + countFirst++; + } + if (!foundRs) {// 未开启售后登记 + logger.info("退款订单相应系统订单未找到或未开启自动登记售后功能,放弃处理| [ {} ] ", refundInfo.tid); + return true; + } + // 通过字典获取匹配的售后诉求的类型 + int aftersale_reason_id = 0;// 售后诉求类型 + refundInfo.reason = refundInfo.reason == null ? "" : refundInfo.reason; + if (refundInfo.reason.equals("")) { + aftersale_reason_id = 99999; + } else { + sql = "select id,name from tb_aftersale_reason_dic where name ='" + refundInfo.reason + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + aftersale_reason_id = rs.getInt("id"); + } else { + sql = "select count(*) as count from tb_aftersale_reason_dic"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + int count = rs.getInt("count"); + sql = "insert into tb_aftersale_reason_dic(id,name) values(?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, count); + ps.setString(2, refundInfo.reason); + if (ps.executeUpdate() == 0) { + logger.info("订单| [ {} ] 插入售后原因表失败!", refundInfo.tid); + return false; + } + aftersale_reason_id = count; + } else { + logger.info("订单| [ {} ] 查询售后原因表失败!", refundInfo.tid); + return false; + } + } + } + + // 对售后登记表的操作 + sql = "select 1 from tb_aftersale_order where platform_refund_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.refund_id)); + rs = ps.executeQuery(); + if (rs.next()) { + logger.info("订单| [ {} ] 已做过售后登记,放弃处理!", refundInfo.tid); + return true; + } else { + int listSize = refundList.size(); + if (listSize == 0) { + logger.info("订单| [ {} ] 已做过售后登记,放弃处理!", refundInfo.tid); + } + for (int i = 0; i < listSize; i++) { + RefundOrder ro = new RefundOrder(); + ro = refundList.get(i); + int aftersale_seq = ro.aftersaleSeq; + int orderStatus = ro.orderStatus; + String sale_order_code = ro.saleOrderCode; + boolean storageFlag = false; + + if (orderStatus >= 7) { + storageFlag = true; + } + /** + * obmFlag true为品牌商或品牌商代发,false为经销商自有 + */ + boolean obmFlag = false; + if (!"".equals(ro.obmCompanyCode)) { + obmFlag = true; + } + /** + * 当订单为委外订单时判断是否拦截 + */ + int entrust_issuccess = 0; + String entrust_msg = ""; + if (ro.entrustType == 2 && !storageFlag) { + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,logistics_company_code from tb_storage where logistics_company_code is not null and company_code=?"; + ps = conn.prepareStatement(sql); + if (obmFlag) { + ps.setString(1, ro.obmCompanyCode); + } else { + ps.setString(1, refundInfo.company_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("code") == null ? "" : rs.getString("code"); + String logistics_company_code = rs.getString("logistics_company_code") == null ? "" + : rs.getString("logistics_company_code"); + /** + * 品牌商为空说明为经销商的自发订单 + */ + + if (storage_code.equals(ro.storageCode) && "PLG".equals(logistics_company_code)) { + + String param = "djbh=" + ro.saleOrderCode + + "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; + HttpRequest httpRequest = new HttpRequest(); + String resultStr = httpRequest.sendGet(plg_url, param, AnalysisDataParse.class.getName()); + + /** + * 如果接口异常,放弃处理 + */ + + if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + entrust_issuccess = 1; + entrust_msg = "PLG服务器连接失败|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + break; + } + JSONObject json = new JSONObject(resultStr); + String isSuccess = json.getString("isSuccess"); + entrust_msg = json.getString("result"); + entrust_msg = isSuccess + "|" + entrust_msg + "|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if ("100".equals(isSuccess)) { + entrust_issuccess = 1; + break; + } + entrust_issuccess = 2; + /** + * 新版暂不启用,等周总通知 2019-07-08 + */ + /* + * HashMap resultMap = sendInterceptToPLG(ro.sale_order_code); + * if (!resultMap.containsKey("result")) { entrust_issuccess = 1; entrust_msg = + * "PLG服务器连接失败|" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new + * Date()); break; } boolean resultFlag = + * Boolean.valueOf(resultMap.get("flag")); String result = + * resultMap.get("result"); if (!resultFlag) { entrust_msg = result + "|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); entrust_issuccess + * = 1; break; } entrust_issuccess = 2; + */ + } + } + } + + if (aftersale_seq == 0) { // && aftersale_appeal_id == 2 ){ + if (orderStatus >= 5) { + /** + * 分经销商和品牌商两种情况处理 + */ + if (refundInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + ps.setString(2, ro.obmCompanyCode); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + ps.setString(2, refundInfo.company_code); + rs = ps.executeQuery(); + } + int num = 0; + String code = ""; + String commodity_code = ""; + int quantity = 0; + int left_quantity = 0; + double money = 0.0; + int gift = 0; + while (rs.next()) { + num++; + code = rs.getString("code"); + if (refundInfo.company_type == 3) { + commodity_code = rs.getString("obm_commodity_code"); + } else { + commodity_code = rs.getString("commodity_code"); + } + quantity = rs.getInt("quantity"); + left_quantity = rs.getInt("left_quantity"); + money = rs.getDouble("money"); + gift = rs.getInt("gift"); + sql = "insert into tb_aftersale_order_items(code,commodity_code,quantity,left_quantity,money,gift,original_sale_order_code,company_code) values(?,?,?,?,?,?,?,?) "; + ps = conn.prepareStatement(sql); + ps.setString(1, code); + ps.setString(2, commodity_code); + ps.setInt(3, quantity); + ps.setInt(4, left_quantity); + ps.setDouble(5, money); + ps.setInt(6, gift); + ps.setString(7, sale_order_code); + // if (obmFlag) { + // ps.setString(8, ro.obm_company_code); + // } else { + ps.setString(8, refundInfo.company_code); + // } + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + if (num <= 0) { + logger.info("退货订单| [ {} ] 出库单未找到该订单,不添加当前商品信息!", refundInfo.tid); + } + } + } + + if (orderStatus >= 7 || ro.autoRefundFlag != 2 || (orderStatus < 7 && refundInfo.bill_type != 1) + || (ro.autoRefundFlag == 2 && refundInfo.bill_type != 1)) { + String aftersale_order_code = ""; + aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg) values(?,?,?,?,0,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setInt(9, 1); + ps.setString(10, entrust_msg); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 修改订单表 + + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? where code=?"; + ps = conn.prepareStatement(sql); + if (storageFlag) { + ps.setInt(1, 1); + } else { + ps.setInt(1, 2); + } + ps.setInt(2, aftersale_seq + 1); + ps.setString(3, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + logger.info("售后订单| [ {} ] 写入成功!", refundInfo.tid); + } else { + boolean flag = false;// 用于判断结果集是否为空 true:不为空 false:为空 + sql = "select tsooi.quantity,tsooi.commodity_code,tsooi.commodity_position_code,tsooi.company_code from tb_storage_out_order_items tsooi where storage_out_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + flag = true; + int quantity_out = rs.getInt("quantity");// 出库商品数量 + String commodity_code = rs.getString("commodity_code");// 商品编码 + String commodity_position_code = rs.getString("commodity_position_code");// 商品位置码 + String company_code = rs.getString("company_code");// 企业编码 + if (ro.checkFlag == 2 && ro.autoRefundFlag == 2) {// 已检测,已发货 + sql = "select quantity from tb_commodity_position where code =? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, commodity_position_code); + ps.setString(2, commodity_code); + ps.setString(3, company_code); + rs1 = ps.executeQuery(); + while (rs1.next()) { + // 更新库存 + int quantity_in = rs1.getInt("quantity");// 仓库现有商品数量 + sql = "update tb_commodity_position set quantity=? where code=? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, quantity_in + quantity_out);// 还库存 + ps.setString(2, commodity_position_code); + ps.setString(3, commodity_code); + ps.setString(4, company_code); + + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + // 更新发票状态 + sql = "select status from tb_invoice where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + rs2 = ps.executeQuery(); + while (rs2.next()) { + sql = "update tb_invoice set status=4 where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + + // 更新售后状态 + String aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg) values(?,?,?,?,0,?,?,?,?,4,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setString(9, entrust_msg); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + // 更新订单表 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? , aftersale_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 3); + ps.setInt(2, aftersale_seq + 1); + ps.setInt(3, ro.aftersaleNumber + 1); + ps.setString(4, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + // 日志 + logger.info("售后订单| [ {} ] 更新售后订单状态成功!", refundInfo.tid); + + } else if (ro.checkFlag != 2 && ro.autoRefundFlag == 2) { + if (isStorageOut(conn, ps, rs1, sale_order_code, refundInfo.company_code, aftersale_seq, + storageFlag, ro.aftersaleNumber, aftersale_reason_id, entrust_issuccess, + refundInfo, entrust_msg)) { + // 日志 + logger.info("售后订单| [ {} ] 更新售后订单状态成功!", refundInfo.tid); + return true; + } else { + return false; + } + + } + + } + if (!flag) { + return isStorageOut(conn, ps, rs1, sale_order_code, refundInfo.company_code, aftersale_seq, + storageFlag, ro.aftersaleNumber, aftersale_reason_id, entrust_issuccess, + refundInfo, entrust_msg); + } + + } + + } + } + return true; + + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("售后订单事务执行异常,回滚| [ {} ] :{}", refundInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (rs1 != null) { + try { + rs1.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs1 = null; + } + if (rs2 != null) { + try { + rs2.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs2 = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 处理提交OMS接口请求 + * + * @param tid + * @return + */ + public boolean getOMSResult(String tid) throws Exception { + String param = "djbh=" + tid + "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; + HttpRequest httpRequest = new HttpRequest(); + String resultStr = httpRequest.sendGet(plg_url, param, AnalysisDataParse.class.getName()); + /** + * 如果接口异常,放弃处理 + */ + if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + return false; + } + JSONObject json = new JSONObject(resultStr); + String isSuccess = json.getString("isSuccess"); + return !"100".equals(isSuccess) && !"103".equals(isSuccess); + } + + public HashMap sendInterceptToPLG(String orderId) { + HashMap returnMap = new HashMap(); + try { + String key = "JnNBxiJ"; + String warehouseCode = "PLGBJ"; + // 验证内容:orderId+作废时间(yyyyMMddHHmm)+key+ warehouseCode + // Key= JnNBxiJ 作废时间=接口调用时间支持±1分钟的误差 加密算法为md5,加密后的md5值要大写 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + String cancelTime = sdf.format(new Date()); + MD5Util md5 = new MD5Util(); + String sourceToken = orderId + cancelTime + key + warehouseCode; + String token = md5.MD5(sourceToken).toUpperCase(); + HashMap map = new HashMap(); + map.put("token", token); + map.put("orderId", orderId); + map.put("warehouseCode", warehouseCode); + // map.put("cancelReason", "客户取消"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + HttpRequest httpRequest = new HttpRequest(); + + String result = httpRequest.sendPost(plg_url, json, 2, AnalysisDataParse.class.getName()); + logger.info("PLG拦截接口返回信息| {}", result); + HashMap resultMap = gson.fromJson(result, new TypeToken>() { + }.getType()); + boolean flag = false; + int code = -1; + if (resultMap.containsKey("flag")) { + String resultFlag = resultMap.get("flag"); + if ("success".equals(resultFlag)) { + flag = true; + } + } + if (resultMap.containsKey("code")) { + code = Integer.valueOf(resultMap.get("code")); + } + + returnMap.put("result", result); + if (code >= 0 && flag) { + resultMap.put("flag", "true"); + return resultMap; + } + } catch (Exception e) { + logger.info("PLG拦截订单调用接口执行异常,订单号| [ {} ] :{}", orderId, e.toString()); + } + returnMap.put("flag", "flase"); + return returnMap; + } + + /** + * 更新买家发货给卖家的退货单的快递编码 + * + * @param refund_id + * @param sid + * @return + */ + public boolean insertRefundDeliveryCode(String refund_id, String sid, String company_code) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + String aftersale_code = ""; + String obm_company_code = ""; + String sql = ""; + conn = dbpc.getConnection(); + sql = "select a.company_code,a.obm_company_code,b.code from tb_sale_order a,tb_aftersale_order b,tb_shop c where a.code=b.sale_order_code and a.shop_code=c.code and c.auto_aftersale_flag=2 and b.platform_refund_code=? and b.company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refund_id); + ps.setString(2, company_code); + rs = ps.executeQuery(); + if (rs.next()) { + aftersale_code = rs.getString("code"); + company_code = rs.getString("company_code") == null ? "" : rs.getString("company_code"); + obm_company_code = rs.getString("obm_company_code") == null ? "" : rs.getString("obm_company_code"); + if (aftersale_code == null || "".equals(aftersale_code)) { + logger.info("买家退货给卖家订单| [ {} ] 查询到售后单编码为空,为异常数据!", refund_id); + return true; + } + } else { + logger.info("买家退货给卖家订单| [ {} ] 对应的售后单号未登记售后单,放弃处理!", refund_id); + return true; + } + /** + * 查询售后单是否已经登记过退货单号 flag:true已经登记过,false:未登记过 + */ + sql = "update tb_aftersale_order set platform_refund_delivery_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sid); + ps.setString(2, aftersale_code); + if (ps.executeUpdate() == 0) { + logger.info("买家退货给卖家订单| [ {} ] 登记失败!", refund_id); + return false; + } + logger.info("买家退货给卖家订单| [ {} ] 登记成功!", refund_id); + return true; + } catch (SQLException e) { + logger.error(this, e); + logger.info("买家退款给卖家订单| [ {} ] (退款单号)登记异常:{}", refund_id, e.toString()); + return false; + } catch (Exception e) { + logger.error(this, e); + logger.info("买家退款给卖家订单| [ {} ] (退款单号)登记异常:{}", refund_id, e.toString()); + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 该方法将差评写入数据库 + * + * @param traderateInfo + * @return + */ + + public boolean badTag(TraderateInfo traderateInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + String sql = ""; + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "insert into tb_rate_bad (platform_code,shop_code,buyer_nick_name,rate_type,add_flag,num_iid,product_title,rate_content,key_word,company_code,rate_time)" + + " values (?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, traderateInfo.tid); + ps.setString(2, traderateInfo.shop_code); + ps.setString(3, traderateInfo.buyer_nick); + ps.setString(4, traderateInfo.rate_type); + ps.setInt(5, traderateInfo.add_flag); + ps.setLong(6, traderateInfo.num_iid); + ps.setString(7, traderateInfo.item_title); + ps.setString(8, traderateInfo.rate_content); + ps.setString(9, traderateInfo.key_word); + ps.setString(10, traderateInfo.company_code); + ps.setString(11, traderateInfo.rate_time); + return ps.executeUpdate() != 0; + } catch (SQLException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * emp自检程序 + * + * @param shopCode + * @param companyCode + * @param tid + * @param pay_time + * @return + */ + public boolean emp_check(String shopCode, String companyCode, String tid, String pay_time) { + File file = new File("TradeCheck.xls"); + boolean found = false; + int count = 0; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + // conn = OrderSync.dbUtil.getDbConn(); + try { + conn = dbpc.getConnection(); + sql = "select 1 from tb_sale_order where platform_code=? and shop_code=? and company_code=? limit 1"; + ps = conn.prepareStatement(sql); + ps.setString(1, tid); + ps.setString(2, shopCode); + ps.setString(3, companyCode); + rs = ps.executeQuery(); + if (rs.next()) { + found = true; + flag_check_exist = true; + return false; + } + if (!found) { + logger.info("未写入新订单| [ {} ] ,付款时间|{}", tid, pay_time); + } + + if (file.exists()) { + Workbook readwb = null; + InputStream instream = new FileInputStream(file); + readwb = Workbook.getWorkbook(instream); + Sheet readsheet = readwb.getSheet(0); + count = readsheet.getRows(); + + } else { + WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(file)); + // 创建新的一页 + WritableSheet sheet = wwb.createSheet("TradeCheck", 0); + // 创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容 + Label xuhao = new Label(0, 0, "序号"); + sheet.addCell(xuhao); + Label id = new Label(1, 0, "TID"); + sheet.addCell(id); + Label shopcode = new Label(2, 0, "ShopCode"); + sheet.addCell(shopcode); + Label paytime = new Label(3, 0, "pay_time"); + sheet.addCell(paytime); + + wwb.write(); + wwb.close(); + count++; + } + + Workbook readwb = Workbook.getWorkbook(file); + WritableWorkbook wwb = Workbook.createWorkbook(file, readwb); + // 读取第一张工作表 + WritableSheet sheet = wwb.getSheet(0); + + sheet.addCell(new Label(0, count, String.valueOf(count))); + sheet.addCell(new Label(1, count, tid)); + sheet.addCell(new Label(2, count, shopCode)); + sheet.addCell(new Label(3, count, pay_time)); + wwb.write(); + wwb.close(); + readwb.close(); + return true; + } catch (Exception e) { + logger.error(this, e); + flag_check_exception = true; + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + private class TradeMemoModify extends Thread { + public TradeInfo tradeInfo; + + public TradeMemoModify(TradeInfo tradeInfo) { + this.tradeInfo = tradeInfo; + } + + private int modify_error_loop = 3; + + @Override + public void run() { + try { + if (!tradeMemoModify()) { + logger.info("修改订单备注信息失败!"); + for (int i = 0; i < modify_error_loop; i++) { + if (!tradeMemoModify()) { + logger.info("修改订单备注信息失败!第:{}次重试", i + 1); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + logger.error(this, e); + } + } else {// 如果有异常,最多重试三次,只要其中一次成功,跳出 + break; + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * TradeMemoModify修改订单处理 + * + * @param tradeInfo + * @return + */ + private boolean tradeMemoModify() { + boolean res = false; + // Connection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + + if (modifyTransaction(conn, ps)) { + logger.info("订单修改成功| [ {} ] ", tradeInfo.tid); + res = true; + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("订单修改事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + private boolean modifyTransaction(DruidPooledConnection conn, PreparedStatement ps) throws Exception { + String sql = ""; + sql = "update tb_sale_order set buyer_message =?,seller_note =? where platform_code =? and shop_code=? and company_code=?;"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.buyer_message); + ps.setString(2, tradeInfo.seller_memo); + ps.setString(3, tradeInfo.tid); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, tradeInfo.company_code); + ps.executeUpdate(); + return true; + } + } + + /** + * TradeParseSuccessThread 订单队列处理线程 + * + * @author Lewis + */ + private class TradeParseSuccessThread extends Thread { + @Override + public void run() { + try { + if (tradeQueue_Success.size() > 0) { + TradeInfo tradeInfo = tradeQueue_Success.get(0); + logger.info("处理交易成功订单数据 [ {} ] ,所属店铺:{}", tradeInfo.tid, tradeInfo.shop_code); + if (tradeSuccess(tradeInfo)) { + tradeQueue_Success.remove(0); + } else { + loop(tradeInfo); + } + logger.info("交易成功订单队列总数: [ {} ] ", tradeQueue_Success.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + + private void loop(TradeInfo tradeInfo) throws Exception { + if (tradeInfo.retry_times >= 5) { + // 错误重试次数超过5次,放弃处理此消息,不含初始处理的1次 + logger.info("交易成功订单处理重试超限,放弃处理| [ {} ] ", tradeInfo.tid); + tradeQueue_Success.remove(0); + } else { + tradeInfo.retry_times += 1; + logger.info("交易成功订单第 [ {} ] 次处理失败,将于 [ {} ] 分钟后重试| [ {} ] " + tradeInfo.retry_times, + tradeInfo.retry_times - 1, tradeInfo.tid); + try { + Thread.sleep(1000 * 60 * (tradeInfo.retry_times - 1)); + } catch (InterruptedException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + } + + /** + * TradeSuccess交易成功订单处理 + * + * @param tradeInfo + * @return + */ + public synchronized boolean tradeSuccess(TradeInfo tradeInfo) { + boolean res = false; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + + if (successTransaction(tradeInfo, conn, ps, rs)) { + logger.info("交易成功订单处理成功 [ {} ] ", tradeInfo.tid); + res = true; + } else { + res = false; + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("交易成功订单处理事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + private boolean successTransaction(TradeInfo tradeInfo, Connection conn, PreparedStatement ps, ResultSet rs) + throws Exception { + // sql = "UPDATE tb_sale_order SET buyer_message =?,seller_note =? WHERE + // platform_code =?;"; + String sql = ""; + boolean found = false; + String order_code = ""; + sql = "select s.code " + " from tb_sale_order s ,tb_shop sh,tb_finance_order f,tb_storage_out_order st" + + " where sh.code =s.shop_code and s.code = st.sale_order_code and st.code = f.order_code and s.platform_code = ? and s.shop_code =? and s.company_code = ? and f.status = 1 and f.type = 1 and f.sub_type = 1 and f.order_type = 5"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, tradeInfo.company_code); + rs = ps.executeQuery(); + while (rs.next()) { + order_code = rs.getString("code"); + found = true; + } + if (!found) { + logger.info("交易成功订单未找到,放弃处理 [ {} ] ", tradeInfo.tid); + return true; + } + // order_code = "CK" + order_code; + sql = "update tb_finance_order set received_payments_type = ?,status = ?,note=? where order_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 1); + ps.setInt(2, 2); + ps.setString(3, "自动回款"); + ps.setString(4, "CK" + order_code); + if (ps.executeUpdate() == 0) { + return false; + } + sql = "insert into tb_aduit (aduit_user_id,module_code,sale_order_code,finance_order_code,storage_out_order_code,company_code)" + + " values (?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 0); + ps.setString(2, "03040101"); + ps.setString(3, order_code); + ps.setString(4, "CWCK" + order_code); + ps.setString(5, "CK" + order_code); + ps.setString(6, tradeInfo.company_code); + return ps.executeUpdate() != 0; + } + + /** + * memcache初始化统一调用ordersyncs的memcacheInit方法获取实例 + * + * @author Lewis + */ + + public class TradeProcessThread extends Thread { + TradeInfo tradeInfo; + MemcachedClient mcc; + + public TradeProcessThread(TradeInfo tradeInfo, MemcachedClient mcc) { + this.tradeInfo = tradeInfo; + this.mcc = mcc; + } + + @Override + public void run() { + try { + TradeInfo tradeInfoUseWhileException = (TradeInfo) tradeInfo.deepClone();// 备份订单信息,用于订单写入异常时回滚 + if (!tradeProcess()) { + if (tradeInfoUseWhileException.trade_type2 == 0) { + logger.info("订单| [ {} ] 写入失败,加入异常处理订单", tradeInfoUseWhileException.tid); + exceptionTradeQueue.add(tradeInfoUseWhileException); + } else { + if (tradeInfo.trade_type2 == 2) { + /** + * 将未写入订单重新写入Excel表 + */ + String msg = "订单写入异常"; + recordErrorReplenishTrade(tradeInfo, msg); + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, "失败", tradeInfo.out_path); + } + if (tradeInfo.trade_type2 == 1) { + String msg = "订单写入异常"; + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, msg, ""); + } + } + + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * tradeProcess 新订单处理 + * + * @param message + * @return + */ + public boolean tradeProcess() { + // boolean found; + boolean res = false; + String sql = ""; + /* + * 暂时弃用jdbc连接 + * + * Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; + * conn = OrderSyncs.dbUtil.getDbConn(); if (conn == null) { return res; } + */ + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + // 查询订单是否已存在 + boolean found = false;// 用于判断订单是否存在的开关 + // 检查普通订单 + if (!"".equals(tradeInfo.tid)) { + if (tradeInfo.company_type == 2) { + sql = "select 1 from tb_sale_order where platform_code=? and shop_code=? and company_code=? limit 1"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, tradeInfo.company_code); + rs = ps.executeQuery(); + if (rs.next()) { + found = true; + } + } + + // 检查OMS订单 + if (tradeInfo.company_type == 3) { + sql = "select 1 from tb_sale_order where platform_code=? and shop_code=? and obm_company_code=? limit 1"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, tradeInfo.company_code); + rs = ps.executeQuery(); + if (rs.next()) { + found = true; + } + } + } + if (found) { + logger.info("新订单已存在 [ {} ] ", tradeInfo.tid); + /** + * 将未写入订单重新写入Excel表 + */ + if (tradeInfo.trade_type2 == 2) { + String msg = "订单已存在"; + recordErrorReplenishTrade(tradeInfo, msg); + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, "失败", tradeInfo.out_path); + } + if (tradeInfo.trade_type2 == 1) { + String msg = "订单已存在"; + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, msg, ""); + } + + res = true; + } else { + + if (insertTradeTransaction(tradeInfo, conn, ps, rs)) { + logger.info("新订单写入成功| [ {} ] 时间->{}", tradeInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + if (tradeInfo.trade_type2 == 1) { + String msg = "订单写入成功"; + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, msg, ""); + } + /** + * 将新订单加入库存修改的队列 + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String now = sdf.format(new Date()); + if (now.compareTo(stopStartTime) < 0 || now.compareTo(stopEndTime) >= 0) { + OrderSyncs.storageUpdate.ImmediateUpdateQueue.add(tradeInfo); + } + + res = true; + } else { + logger.info("新订单事务执行异常,回滚 [ {} ] ", tradeInfo.tid); + conn.rollback(); + res = false; + } + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("新订单事务执行异常,回滚 [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + /** + * insertTradeTransaction 事务方式新增订单数据 + * + * @param TradeInfo tradeInf + * @param Connection conn + * @param PreparedStatement ps + * @throws Exception + */ + + private boolean insertTradeTransaction(TradeInfo originalTradeInfo, DruidPooledConnection conn, + PreparedStatement ps, ResultSet rs) { + ProjectRecord projectRecord = new ProjectRecord(); + long allBeginTime = System.currentTimeMillis(); + TradeInfo copyTradeInfo = null; + + long activityBeginTime = System.currentTimeMillis(); + long basketBeginTime = 0L; + long basketEndTime = 0L; + long insertTradeInfoEndTime = 0L; + long insertTradeInfoBeginTime = 0L; + + try { + + /** + * 深拷贝originalTradeInfo,保持事务回退时originalTradeInfo的内容不变 + * + */ + String activity_mcc_key = "_sa_V2.0_";// 当前店铺中所有的活动规则信息 + String rule_mcc_key = "_sr_V2.0_";// 每一条活动规则 + copyTradeInfo = originalTradeInfo; + // 生成系统订单号 + String sql = ""; + String[] a = copyTradeInfo.pay_time.split(" "); + String order_code = a[0].replaceAll("-", ""); + + if ("".equals(tradeInfo.pay_time)) { + order_code = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).split(" ")[0] + .replaceAll("-", ""); + } + // 生成订单号 + order_code = createOrderCode(conn, ps, rs, order_code, tradeInfo.platform_code, tradeInfo.tid); + // 补录订单单号头 + if (tradeInfo.trade_type2 != 0) { + order_code = order_code.replace("XT", "XTBL"); + } + if ("".equals(tradeInfo.tid)) { + tradeInfo.tid = order_code; + } + + if ("".equals(order_code)) { + logger.info("新订单系统单号生成异常!"); + return false; + } + + // 补款分流判断 + int type_kind = 0;// 如果判断订单商品全部属于补款,则将值改为4 + if ((copyTradeInfo.orders.length == 1)) { + // try { + // 将商品跟淘宝平台一样分配 + if (!"001".equals(copyTradeInfo.platform_code) && !"002".equals(copyTradeInfo.platform_code) + && !"012".equals(copyTradeInfo.platform_code)) { + copyTradeInfo.orders[0].divide_order_fee = copyTradeInfo.money; + copyTradeInfo.orders[0].part_mjz_discount = copyTradeInfo.discount_fee; + } + + if (!"".equals(copyTradeInfo.orders[0].platform_seller_code)) { + String platform_seller_code = copyTradeInfo.orders[0].platform_seller_code; + String key = copyTradeInfo.company_code + "_c" + platform_seller_code; + + /** + * 如果更新存储的键值对,同时更新掉预售订单写入方法:insertPretradeTransaction中的存储的键值对相应的 + */ + if (mcc == null || (mcc.get(key) == null)) { + int kind = 0; + int commodity_class = 0; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + copyTradeInfo.company_code + "' and a.platform_seller_code= '" + + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind");// 商品形态(1:实物2:虚物 3:服务 4:补价 5:包材) + commodity_class = rs.getInt("class");// 商品种类(1:单品 2:组合 3:配件) + if (rs.getString("name") != null) { + copyTradeInfo.brand = rs.getString("name");// 品牌名称 + } + copyTradeInfo.orders[0].commodity_code = rs.getString("code") == null ? "" + : rs.getString("code");// 商品编码 + copyTradeInfo.orders[0].commodity_class = commodity_class; + if ("".equals(copyTradeInfo.orders[0].commodity_code)) { + copyTradeInfo.null_code = true; + } + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("brand", copyTradeInfo.brand); + map.put("kind", String.valueOf(kind)); + map.put("code", copyTradeInfo.orders[0].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key, 0,jsonStr); + } + + if (kind == 4) { + type_kind = 4; + logger.info("查询数据库成功,商品 [ {} ] 为补款商品,已添加到memcache", platform_seller_code); + } + } else { + copyTradeInfo.orders[0].commodity_code = ""; + copyTradeInfo.orders[0].commodity_class = 1; + copyTradeInfo.null_code = true; + logger.info("数据库未查询到 [ {} ] 记录,不添加memcache!", platform_seller_code); + } + + } else { + String jsonStr = (String) mcc.get(key); + JSONObject json = new JSONObject(jsonStr); + String kind = (String) json.get("kind"); + String brand = json.get("brand").toString(); + copyTradeInfo.orders[0].commodity_code = json.get("code") == null ? "" + : (String) json.get("code"); + copyTradeInfo.orders[0].commodity_class = Integer + .valueOf((String) json.get("commodity_class")); + if ("".equals(copyTradeInfo.orders[0].commodity_code)) { + copyTradeInfo.null_code = true; + } + copyTradeInfo.brand = brand; + if (Integer.valueOf(kind) == 4) { + logger.info("查询memcache成功,商品 [ {} ] 为补款商品", platform_seller_code); + type_kind = 4; + } + } + } else { + copyTradeInfo.orders[0].commodity_code = ""; + copyTradeInfo.orders[0].commodity_class = 1; + copyTradeInfo.null_code = true; + } + + } else if (copyTradeInfo.orders.length > 1) { + double orders_discount_fee = 0; + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo order = copyTradeInfo.orders[i]; + // 将商品跟淘宝平台一样分配 + if (!"001".equals(copyTradeInfo.platform_code) && !"002".equals(copyTradeInfo.platform_code) + && !"012".equals(copyTradeInfo.platform_code)) { + if (i < copyTradeInfo.orders.length - 1) { + order.part_mjz_discount = (Double.valueOf(copyTradeInfo.discount_fee) * (Math.round( + Double.valueOf(order.payment) / Double.valueOf(copyTradeInfo.product_fee) * 100) + / 100.0)) + ""; + order.divide_order_fee = (Double.valueOf(order.payment) + - Double.valueOf(order.part_mjz_discount)) + ""; + orders_discount_fee = orders_discount_fee + Double.valueOf(order.part_mjz_discount); + } + if (i == copyTradeInfo.orders.length - 1) { + order.part_mjz_discount = (Double.valueOf(copyTradeInfo.discount_fee) + - orders_discount_fee) + ""; + order.divide_order_fee = (Double.valueOf(order.payment) + - Double.valueOf(order.part_mjz_discount)) + ""; + } + } + + if (!"".equals(order.platform_seller_code)) { + + String company_code = copyTradeInfo.company_code; + String platform_seller_code = order.platform_seller_code; + String key = company_code + "_c" + platform_seller_code; + if (mcc == null || (mcc.get(key) == null)) { + int kind = 0; + int commodity_class = 0; + String brand = ""; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + company_code + "' and a.platform_seller_code= '" + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind"); + commodity_class = rs.getInt("class"); + if (rs.getString("name") != null) { + brand = rs.getString("name"); + } + copyTradeInfo.orders[i].commodity_code = rs.getString("code") == null ? "" + : rs.getString("code"); + copyTradeInfo.orders[i].commodity_class = commodity_class; + if ("".equals(copyTradeInfo.orders[i].commodity_code)) { + copyTradeInfo.null_code = true; + } + if (copyTradeInfo.brand.length() == 0) { + copyTradeInfo.brand = brand; + } else { + if (copyTradeInfo.brand.indexOf(brand) == -1) { + copyTradeInfo.brand = copyTradeInfo.brand + " " + brand; + } + } + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("brand", brand); + map.put("kind", String.valueOf(kind)); + map.put("code", copyTradeInfo.orders[i].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key,0,jsonStr); + } + + } else { + copyTradeInfo.orders[i].commodity_code = ""; + copyTradeInfo.orders[i].commodity_class = 1; + copyTradeInfo.null_code = true; + logger.info("数据库未查询到 [ {} ] 记录,不添加memcache!", platform_seller_code); + } + } else { + String jsonStr = (String) mcc.get(key); + JSONObject json = new JSONObject(jsonStr); + String brand = json.getString("brand"); + copyTradeInfo.orders[i].commodity_code = json.getString("code") == null ? "" + : json.getString("code"); + copyTradeInfo.orders[i].commodity_class = Integer + .valueOf((String) json.get("commodity_class")); + if ("".equals(copyTradeInfo.orders[i].commodity_code)) { + copyTradeInfo.null_code = true; + } + if (copyTradeInfo.brand.length() == 0) { + copyTradeInfo.brand = brand; + } else { + if (copyTradeInfo.brand.indexOf(brand) == -1) { + copyTradeInfo.brand = copyTradeInfo.brand + " " + brand; + } + } + } + } else { + copyTradeInfo.orders[i].commodity_code = ""; + copyTradeInfo.orders[i].commodity_class = 1; + copyTradeInfo.null_code = true; + } + } + } + + String shop_code = copyTradeInfo.shop_code; + String activity_key = copyTradeInfo.company_code + activity_mcc_key + shop_code; + + // 122_sa_V2.0_20180224211 + List rules = Collections.synchronizedList(new ArrayList()); + if (mcc == null || (mcc.get(activity_key) == null)) { + sql = "select b.gift_activity_code,a.name as activity_name,a.shop_code,a.company_code,b.begin_time,b.end_time," + + "b.code as rule_code,b.name as rule_name,b.seq as rule_seq," + + "b.apply_object as rule_apply_object,b.pre_sale_flag as rule_pre_sale_flag," + + "b.pay_money as rule_pay_money,b.promotion_mode as rule_promotion_mode," + + "b.any_commodity as rule_any_commodity,b.any_number as rule_any_number," + + "b.appoint_commodity as rule_appoint_commodity,b.gift_mode as rule_gift_mode," + + "b.delivery_type_id as rule_delivery_type_id," + + "b.superposition_mode as rule_superposition_mode," + + "b.gift_limit_condition as rule_gift_limit_condition," + + "b.limit_number as rule_limit_number,b.gift_current as rule_gift_current," + + "b.order_current as rule_order_current,b.presell_sort as rule_presell_sort," + + "b.gift_commodity as rule_gift_commodity," + + "b.presell_begin_time as rule_presell_begin_time," + + "b.presell_end_time as rule_presell_end_time " + + "from tb_gift_activity a,tb_gift_activity_rule b where a.status = 2 " + + "and b.gift_activity_code = a.code and a.shop_code=? order by b.gift_activity_code,b.seq desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, copyTradeInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + Rule rule = new Rule(); + rule.gift_activity_code = rs.getString("gift_activity_code"); + rule.activity_name = rs.getString("activity_name"); + rule.activity_shop_code = rs.getString("shop_code"); + rule.activity_company_code = rs.getString("company_code"); + rule.activity_begin_time = rs.getString("begin_time"); + rule.activity_end_time = rs.getString("end_time"); + rule.rule_code = rs.getString("rule_code"); + rule.rule_name = rs.getString("rule_name"); + rule.rule_seq = rs.getInt("rule_seq"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_pre_sale_flag = rs.getInt("rule_pre_sale_flag"); + rule.rule_pay_money = rs.getString("rule_pay_money"); + rule.rule_gift_mode = rs.getString("rule_gift_mode"); + if ("1".equals(rule.rule_apply_object) && rule.rule_pay_money == null) { + rule.rule_pay_money = "0"; + if ("2".equals(rule.rule_gift_mode)) { + rule.rule_gift_mode = "1"; + } + } + rule.rule_promotion_mode = rs.getString("rule_promotion_mode"); + rule.rule_any_commodity = rs.getString("rule_any_commodity") == null ? "" + : rs.getString("rule_any_commodity"); + rule.rule_any_number = rs.getString("rule_any_number") == null ? "" + : rs.getString("rule_any_number"); + rule.rule_appoint_commodity = rs.getString("rule_appoint_commodity") == null ? "" + : rs.getString("rule_appoint_commodity"); + rule.rule_delivery_type_id = rs.getInt("rule_delivery_type_id"); + rule.rule_superposition_mode = rs.getString("rule_superposition_mode"); + rule.rule_gift_limit_condition = rs.getString("rule_gift_limit_condition"); + rule.rule_limit_number = rs.getString("rule_limit_number"); + rule.rule_gift_current = rs.getInt("rule_gift_current"); + rule.rule_order_current = rs.getInt("rule_order_current"); + rule.rule_presell_sort = rs.getInt("rule_presell_sort"); + rule.rule_gift_commodity = rs.getString("rule_gift_commodity") == null ? "" + : rs.getString("rule_gift_commodity"); + rule.rule_presell_begin_time = rs.getString("rule_presell_begin_time") == null ? "" + : rs.getString("rule_presell_begin_time"); + rule.rule_presell_end_time = rs.getString("rule_presell_end_time") == null ? "" + : rs.getString("rule_presell_end_time"); + rules.add(rule); + /* + * 对于赠品数量有限额的活动条目,将该条目单独存入memcached + */ + if (mcc != null && ("2".equals(rule.rule_gift_limit_condition) + || "3".equals(rule.rule_gift_limit_condition))) { + // 记录添加到memcache + + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = rule.rule_order_current; + gn.gift_current = rule.rule_gift_current; + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + + mcc.add(rule_key, 0,jsonStr);// 此处memcache不能用set方法,set包含add和replace,在并发时会覆盖掉已经写入的rule_key的数据,造成数据错误 + } + } + if (mcc != null) { + // 将查询到的店铺活动的集合转化为json对象放入memcache + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonArray = gson.toJson(rules); + mcc.set(activity_key,0, jsonArray); + } + } else { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = (String) mcc.get(activity_key); + rules = gson.fromJson(jsonStr, new TypeToken>() { + }.getType()); + } + + // String o1g1_fit_rules = "";// 记录符合的规则,对于一单只送1只的规则,防止多次赠送 + // String order_limit_fit_rules = "";// 记录符合的规则,对于单数限制的规则,一单计数只加1,防止多加 + String seq_fit_rules = "";// 对于有排序要求的记录符合的活动编码,其他规则不再赠送. + int seq_nextnum_rules = 0;// 对于有排序要求的活动,而订单中由于高优先级的活动中赠品送完,这部分未配送赠品的又符合低优先级的活动,对该部分做记录并配送低优先级活动赠品 + double seq_nextmoney_rules = 0.0;// 对于有排序要求的活动,高优先级不够送的,记录下来,查询有没有低优先级,有的话用低优先级继续送 + // 插入商品 + // int n = 0;// 用于计数赠品赠送的次数 + // int gift_num = 0;// 临时存储赠品数量 + // OrderInfo [] giftArray = {};// 临时存储赠品相关信息 + // boolean f = false;// 判断是否有赠品加入订单 + int delivery_type_id = copyTradeInfo.delivery_mode_id;// 记录快递公司编码,定时查询数据库 + String state = "";// 记录不包邮地区 + int orders_Length = copyTradeInfo.orders.length; + + /******************************** 新活动处理逻辑begin ********************************/ + // 将订单中的商品信息滤重 + Map tradeCommodityInfo = new HashMap();// 订单商品信息 + for (int i = 0; i < orders_Length; i++) { + String commodity_code = copyTradeInfo.orders[i].commodity_code; + if ("".equals(commodity_code)) { + continue; + } + String commodity_num = String.valueOf(copyTradeInfo.orders[i].num); + if (tradeCommodityInfo.containsKey(commodity_code)) { + String commodity_number = tradeCommodityInfo.get(commodity_code); + commodity_number = String + .valueOf(Integer.parseInt(commodity_number) + Integer.parseInt(commodity_num)); + tradeCommodityInfo.put(commodity_code, commodity_number); + } else { + tradeCommodityInfo.put(commodity_code, commodity_num); + } + } + // 遍历所有活动中指定的规则 + for (int i = 0; i < rules.size(); i++) { + Rule rule = rules.get(i); + // 判断订单付款时间是否在活动范围内 + if (!(copyTradeInfo.pay_time.compareTo(rule.activity_begin_time) >= 0 + && copyTradeInfo.pay_time.compareTo(rule.activity_end_time) <= 0)) { + continue; + } + // 判断是否符合预售条件 + if ("002".equals(copyTradeInfo.platform_code) || "005".equals(copyTradeInfo.platform_code) + || "003".equals(copyTradeInfo.platform_code)) { + if (rule.rule_pre_sale_flag == 2 && "step".equals(copyTradeInfo.type)) { + continue; + } + if (rule.rule_pre_sale_flag == 3 && !("step".equals(copyTradeInfo.type))) { + continue; + } + } + // 有顺序的规则,判断是否送过,如已经送过,则直接跳过 + if (rule.rule_seq > 0) { + if (seq_fit_rules.indexOf(rule.gift_activity_code) >= 0) { + continue; + } + } + // 判断送顺丰包邮时,不包邮地区直接跳过 + if ("3".equals(rule.rule_gift_mode) && state.indexOf(copyTradeInfo.receiver_state) >= 0) { + continue; + } + + int gift_copies = 0;// 用于记录要赠送的赠品份数 + boolean rule_flag = false;// 用于判断是否满足活动规则 + // 适用对象为商品 + Map ruleAppointCommodityInfo = new HashMap<>(); + if ("2".equals(rule.rule_apply_object) && "2".equals(rule.rule_promotion_mode)) { + ruleAppointCommodityInfo = getCommodityInfo(rule.rule_appoint_commodity);// 活动方式为指定搭配时指定的商品信息 + } + + Map giftCommodityInfo = new HashMap<>(); + if ("2".equals(rule.rule_gift_mode)) { + giftCommodityInfo = getCommodityInfo(rule.rule_gift_commodity);// 活动赠品信息 + } + + /** + * 适用对象为订单时处理逻辑 + */ + if ("1".equals(rule.rule_apply_object)) {// 适用对象为订单 + // 判断是否满足活动规则 + if (Double.parseDouble(copyTradeInfo.pay_money) >= Double.parseDouble(rule.rule_pay_money)) { + if ("1".equals(rule.rule_superposition_mode)) {// 不叠加 + gift_copies = 1;// 满足活动条件则赠送一份赠品 + } else if (rule.rule_superposition_mode.endsWith("2")) {// 叠加 + // 计算需要叠加的份数 默认倍数为1份 + gift_copies = (int) Math.floor(Double.parseDouble(copyTradeInfo.pay_money) + / Double.parseDouble(rule.rule_pay_money)); + } + + if ("1".equals(rule.rule_gift_limit_condition)) {// 不限额 + + if ("2".equals(rule.rule_gift_mode)) {// 配送赠品 + + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + // 订单限额 + // 同步方法查询订单限额 + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if ((Double.parseDouble(copyTradeInfo.pay_money) >= Double + .parseDouble(rule.rule_pay_money)) + && (order_current < Integer.parseInt(rule.rule_limit_number))) { + /** + * 2 订单 送赠品 订单限额 不叠加 + */ + if (rule.rule_gift_mode.equals("2")) {// 配送赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0,jsonStr); + } + activityUpdateQueue.add(gn); + + rule.rule_order_current = rule.rule_order_current + 1; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else if (rule.rule_gift_limit_condition.equals("3")) {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + + if ((Double.parseDouble(copyTradeInfo.pay_money) >= Double + .parseDouble(rule.rule_pay_money)) + && (gift_current < Integer.parseInt(rule.rule_limit_number))) { + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) {// 已赠送的赠品数+需赠送赠品数>赠品限额 + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current;// 当前级别赠送的礼品数为剩余的赠品数 + seq_nextmoney_rules = Double.parseDouble(copyTradeInfo.pay_money) + - gift_copies * Double.parseDouble(rule.rule_pay_money);// 超出的钱数 + } + + /** + * 适用对象为订单,配送赠品 + */ + if (rule.rule_gift_mode.equals("2")) {// 送赠品 + // 配送赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key,0, jsonStr); + } + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 对于有优先级排序的,高优先级没有送够赠品的,低优先级补上 + if (seq_nextmoney_rules > 0.0) {// 查询出符合的规则 + String sql_rule = "select code,limit_number,gift_activity_code,name,pay_money,gift_commodity from tb_gift_activity_rule " + + "where gift_activity_code=? and superposition_mode = 2 and apply_object = ? and pre_sale_flag=? " + + "and seq>0 and seq= rs_rule.getDouble("pay_money")) { + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (((int) Math.floor(seq_nextmoney_rules + / rs_rule.getDouble("pay_money"))) > rs_rule + .getInt("rule_limit_number")) {// 需要赠送的赠品数>大于当前级别的限额数,将本级别的赠品全额赠送, + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextmoney_rules = seq_nextnum_rules - gift_copies + * (rs_rule.getDouble("pay_money"));// 记录超出的数量 + } else { + gift_copies = (int) Math.floor(seq_nextmoney_rules + / rs_rule.getDouble("pay_money")); + seq_nextmoney_rules = -1.0; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rule.activity_name, rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs.getString("gift_commodity")); + // 配送赠品 + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule,0, jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextmoney_rules < 0.0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + } + } else { + break;// 活动规则不相同,不再看更小优先级的活动 + } + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + } + } + } + } finally { + lock.unlock(); + } + } + } + } + + /** + * 适用对象为商品的处理逻辑 + */ + if (rule.rule_apply_object.equals("2")) { + + if (rule.rule_promotion_mode.equals("1")) {// 活动方式为任意多件 + int result = 0; + String any_commodity = rule.rule_any_commodity; + String[] commodity_codes = any_commodity.trim().split("\\|"); + for (String commodity_code : commodity_codes) {// 遍历出所有指定的商品编码 + for (Entry tradeInfo : tradeCommodityInfo.entrySet()) {// 遍历订单中所有的商品 + // if (o1g1_fit_rules.indexOf(rule.rule_code) >= 0) { + // continue;// 一单只送一只,不再赠送! + // } + if (commodity_code.equals(tradeInfo.getKey())) {// 订单中的商品包含的有指定的商品且数量满足所要求的任意件数 + int temp = Integer.parseInt(tradeInfo.getValue()); + result = result + temp; + } + } + } + + if (result < Integer.parseInt(rule.rule_any_number)) { + continue; + } + + if (rule.rule_superposition_mode.equals("1")) {// 不叠加 + gift_copies = 1;// + } else if (rule.rule_superposition_mode.equals("2")) {// 叠加 + gift_copies = (int) Math.floor(result / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数 + } + + if (rule.rule_pre_sale_flag == 1 || rule.rule_pre_sale_flag == 2 + || (rule.rule_pre_sale_flag == 3 && rule.rule_presell_sort == 2)) {// 全部、非预售以及付尾款的预售 + // 配送赠品 + if (rule.rule_gift_limit_condition.equals("1")) {// 不限 + /** + * 任意多件 赠送赠品 不限额 不叠加 + * + */ + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + // 同步方法查询订单限额 + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if ((order_current < Integer.parseInt(rule.rule_limit_number))) { + /** + * 任意多件 赠送赠品 限订单 不叠加 + * + */ + + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 若一个订单中有多个商品满足活动 防止多加已送订单数 + // if (o1g1_fit_rules.indexOf(rule.rule_code) > -1) { + // lock.unlock(); + // continue; + // } + + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key,0, jsonStr); + } + activityUpdateQueue.add(gn); + + // rule.rule_order_current = rule.rule_order_current + 1; + // o1g1_fit_rules = "".equals(o1g1_fit_rules) ? rule.rule_code + // : o1g1_fit_rules + "," + rule.rule_code; + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + if (gift_current < Integer.parseInt(rule.rule_limit_number)) { + + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) {// 当前优先级赠品不够赠送 + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current;// 将当前级别可赠送的赠品赠送 + seq_nextnum_rules = gift_current + gift_copies + - Integer.parseInt(rule.rule_limit_number); + // 下一级别需要赠送的赠品数 = + } + /** + * 任意多件 赠送赠品 限赠品 叠加 + * + */ + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key,0, jsonStr); + } + + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 高优先级不够送,用低优先级配送 + if (seq_nextnum_rules > 0) { + String sql_rule = "select code,any_commodity,any_number,rule_limit_number,gift_activity_code,name,gift_commodity from tb_gift_activity_rule where promotion_mode = 1 and gift_activity_code=? and apply_object = ? and pre_sale_flag=? and seq>0 and seq last_commodity_map = new HashMap(); + Map next_commodity_map = new HashMap(); + for (int k = 0; k < commodity_codes.length; k++) { + last_commodity_map.put(commodity_codes[k], ""); + } + for (int j = 0; j < next_commodity_codes.length; j++) { + next_commodity_map.put(next_commodity_codes[j], ""); + } + Gson gson_to_json = new GsonBuilder().disableHtmlEscaping().create(); + if (gson_to_json.toJson(last_commodity_map) + .equals(gson_to_json.toJson(next_commodity_map)) + && rs_rule.getString("any_number") + .equals(rule.rule_any_number)) {// 比较另个规则是否相同 + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (seq_nextnum_rules > rs_rule + .getInt("rule_limit_number")) { + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextnum_rules = seq_nextnum_rules - gift_copies;// 记录超出的数量 + } else { + gift_copies = seq_nextnum_rules; + seq_nextnum_rules = -1; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rule.activity_name, rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs_rule.getString("gift_commodity")); + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule, 0,jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextnum_rules < 0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + } else { + break; + } + + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + } + } + } + } finally { + lock.unlock();// 释放锁 + } + } + + } else if (rule.rule_pre_sale_flag == 3 && rule.rule_presell_sort == 1) {// 预售订单 + String sql_presale = "select gift_commodity from tb_presale_order where platform_code=? and rule_code=? and shop_code=?"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, copyTradeInfo.tid); + ps.setString(2, rule.rule_code); + ps.setString(3, copyTradeInfo.shop_code); + rs = ps.executeQuery(); + if (rs.next()) { + String giftCommodityStr = rs.getString("gift_commodity"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + Map giftMap = gson.fromJson(giftCommodityStr, + new TypeToken>() { + }.getType()); + + for (Entry giftStr : giftMap.entrySet()) { + gift_copies = giftStr.getKey(); + } + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } + } + // } + + } else if (rule.rule_promotion_mode.equals("2")) {// 活动方式为指定搭配 + // 促销方式为指定搭配 + int count = 0;// 统计指定商品与订单商品对比的次数 + int tradeInfo_length = tradeCommodityInfo.keySet().size();// 第二个map的长度 + for (Entry appoint : ruleAppointCommodityInfo.entrySet()) { + for (Entry tradeInfo : tradeCommodityInfo.entrySet()) { + int temp = 0; + if (appoint.getKey().equals(tradeInfo.getKey())) { + temp = (int) Math.floor(Integer.parseInt(tradeInfo.getValue()) + / Integer.parseInt(appoint.getValue())); + if (temp == 0) { + rule_flag = true; + break; + } + + if (gift_copies == 0) { + gift_copies = temp; + break;// 若有商品 退出本次循环 开始循环下一件商品 + } else { + if (gift_copies > temp) { + gift_copies = temp; + } + } + + } + count++; + if (temp != 0) { + count = 0; + break; + } + } + if (count == tradeInfo_length) {// 说明第二个map循环了一遍都没有找到该商品 + gift_copies = 0; + break; + } + if (rule_flag) { + gift_copies = 0; + break; + } + } + + if (gift_copies >= 1) {// 满足活动要求 + /** + * 指定搭配 赠送赠品 不限 叠加 + */ + if (rule.rule_superposition_mode.equals("1")) { + gift_copies = 1; + } + if (rule.rule_gift_limit_condition.equals("1")) {// 限额条件为不限 + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if (order_current < Integer.parseInt(rule.rule_limit_number)) { + + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key,0, jsonStr); + } + activityUpdateQueue.add(gn); + rule.rule_order_current = rule.rule_order_current + 1; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + + if (gift_current < Integer.parseInt(rule.rule_limit_number)) { + + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) { + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current; + seq_nextnum_rules = gift_current + gift_copies + - Integer.parseInt(rule.rule_limit_number); + } + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key,0, jsonStr); + } + + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + // 高优先级不够 低优先级赠送 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 高优先级不够送,用低优先级配送 + if (seq_nextnum_rules > 0) { + String sql_rule = "select code,appoint_commodity,rule_limit_number,gift_activity_code,name,gift_commodity from tb_gift_activity_rule where promotion_mode = 1 and gift_activity_code=? and apply_object = ? and pre_sale_flag=? and seq>0 and seq next_appoint_commodityInfo = getCommodityInfo( + rs_rule.getString("appoint_commodity")); + Gson gson_to_json = new GsonBuilder().disableHtmlEscaping().create(); + if (gson_to_json.toJson(ruleAppointCommodityInfo).equals( + gson_to_json.toJson(next_appoint_commodityInfo))) {// 比较两次规则是否相同 + // 比较另个规则是否相同 + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (seq_nextnum_rules > rs_rule + .getInt("rule_limit_number")) { + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextnum_rules = seq_nextnum_rules - gift_copies;// 记录超出的数量 + } else { + gift_copies = seq_nextnum_rules; + seq_nextnum_rules = -1; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rs_rule.getString("code"), + rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs_rule.getString("gift_commodity")); + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule,0, jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextnum_rules < 0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + + } else { + break; + } + + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + + } + } + + } + } finally { + lock.unlock(); + } + } + } + } + } + } + + /** + * TODO 活动判断耗时统计 + */ + long activityEndTime = System.currentTimeMillis(); + + /** + * 订单拆单判断,分为自发订单,代发订单,自发代发混合订单的拆单,其根本是根据发货公司和发货的仓库不同来区分 + * 使用ArrayList集合存储订单数据,但是集合的第一个位置存储原单信息,如果有拆分订单则往后排 + * + * 保证原单的所有信息不变,以保证订单插入事务执行异常回滚后原订单重试时所有信息一致 + */ + + long OBMBeginTime = System.currentTimeMillis(); + long getUnsendSqlBeginTime = 0L; + long getUnsendSqlEndTime = 0L; + long getSaleableSqlBeginTime = 0L; + long getSaleableSqlEndTime = 0L; + long unSendUseTime = 0L; + long saleAbleUseTime = 0L; + + List tradeList = Collections.synchronizedList(new ArrayList()); + + // 代发品牌商公司编码map集合 + copyTradeInfo.obm_company_code_map = new HashMap(); + /** + * 当公司为品牌商时,将商品从commodity_code改为obm_commodity_code + */ + if (copyTradeInfo.company_type == 3) { + copyTradeInfo.obm_company_code = copyTradeInfo.company_code; + // obm_company_code = tradeInfo.company_code;/ + /** + * 将查到的品牌商对应商品写入原订单 + */ + for (int j = 0; j < copyTradeInfo.orders.length; j++) { + copyTradeInfo.orders[j].obm_commodity_code = copyTradeInfo.orders[j].commodity_code; + copyTradeInfo.orders[j].storage_code = copyTradeInfo.storage_code; + copyTradeInfo.orders[j].obm_company_code = copyTradeInfo.obm_company_code; + copyTradeInfo.orders[j].agent_type = 1; + + // // 可销售数量 (企业编码, 店铺编码, 商品编码, 是否代发) + + } + copyTradeInfo.omsOwnFlag = true;// 品牌商自有店铺 + } + /** + * 当公司为经销商时, 循环判断订单各个商品是代发还是自发 + */ + boolean zg = true;// 标记商品是否够发 + if (copyTradeInfo.company_type == 2) {// 普通用户公司 + int ordersLength = copyTradeInfo.orders.length; + int agentCount = 0;// 记录订单中代发商品的数量,当代发数量等于商品数量,则代发,否则订单所属公司的店铺发货 + for (int i = 0; i < ordersLength; i++) { + OrderInfo orderInfo = copyTradeInfo.orders[i]; + sql = "select a.obm_company_code,b.obm_commodity_code,a.obm_storage_code,smart_allot_storage_flag " + + "from tb_obm_agent_shop a,tb_obm_agent_commodity b " + + "where a.shop_code=? and a.company_code=? and b.commodity_code=? and a.status=2 and b.status=2 and " + + "b.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, copyTradeInfo.shop_code); + ps.setString(2, copyTradeInfo.company_code); + ps.setString(3, orderInfo.commodity_code); + rs = ps.executeQuery(); + if (rs.next()) { + agentCount++; + copyTradeInfo.orders[i].obm_commodity_code = rs.getString("obm_commodity_code") == null ? "" + : rs.getString("obm_commodity_code"); + copyTradeInfo.orders[i].agent_type = 2; + copyTradeInfo.orders[i].obm_company_code = rs.getString("obm_company_code"); + copyTradeInfo.orders[i].storage_code = rs.getString("obm_storage_code"); + copyTradeInfo.orders[i].smart_allot_storage_flag = rs.getInt("smart_allot_storage_flag"); + copyTradeInfo.obm_company_code_map.put(copyTradeInfo.orders[i].obm_company_code, ""); + + // 公司 商店 商品 + getUnsendSqlBeginTime = System.currentTimeMillis(); + String sql2 = "select _getUnsendQuantity(?,?,?)"; + ps = conn.prepareStatement(sql2); + ps.setString(1, copyTradeInfo.orders[i].obm_company_code); + ps.setString(2, copyTradeInfo.shop_code); + ps.setString(3, copyTradeInfo.orders[i].obm_commodity_code); + // 未发货 + int wfh = 0; + rs = ps.executeQuery(); + getUnsendSqlEndTime = System.currentTimeMillis(); + unSendUseTime += (getUnsendSqlEndTime - getUnsendSqlBeginTime); + if (rs.next()) { + wfh = rs.getInt(1); + // 公司 商店 商品 未发货量 + getSaleableSqlBeginTime = System.currentTimeMillis(); + String sql1 = "select _getSaleableQuantity(?,?,?,?) "; + ps = conn.prepareStatement(sql1); + ps.setString(1, copyTradeInfo.orders[i].obm_company_code); + ps.setString(2, copyTradeInfo.shop_code); + ps.setString(3, copyTradeInfo.orders[i].obm_commodity_code); + ps.setInt(4, wfh); + rs = ps.executeQuery(); + getSaleableSqlEndTime = System.currentTimeMillis(); + saleAbleUseTime += (getSaleableSqlEndTime - getSaleableSqlBeginTime); + if (rs.next()) { + copyTradeInfo.orders[i].zongshuliang = rs.getInt(1); + } + if (copyTradeInfo.orders[i].zongshuliang < copyTradeInfo.orders[i].num) { + zg = false; + } + + } + + } else { + /** + * 如果没有查询到代发关系,那么该商品即为自发 + */ + copyTradeInfo.orders[i].agent_type = 1; + copyTradeInfo.orders[i].storage_code = copyTradeInfo.storage_code; + } + } + /** + * agentCount == giftArrayLength全部商品为代发 agentCount == 0全部商品为自发 + * + */ + if (agentCount == ordersLength) {// 代发 + copyTradeInfo.obm_flag = 1; + } + if (agentCount == 0) { + copyTradeInfo.obm_flag = 0;// 自发 + } + if (agentCount > 0 && agentCount < ordersLength) { + copyTradeInfo.obm_flag = 2;// 混合 + } + } + + /** + * 为方便库存同步,需要将tradeInfo的订单中商品编码写值,在库存同步没有变结构的情况下,先将copyTradeInfo赋值给tradeInfo,后期需要删掉 + * + */ + tradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + + /** + * 销售单免审核分流判断 + */ + int sale_template_type = 0;// 销售模板类型 + int sale_template_type_bak = 0;// 销售模板类型 + int sale_order_no_audit = 0;// 销售单免审核 + int sale_order_no_audit_bak = 0;// 销售单免审核 + int sale_order_3_no_audit = 0;// 销售单三无免审核 + int sale_order_3_no_audit_bak = 0;// 销售单三无免审核 + int smart_allot_storage = 0;// 智能分仓开关,1:关闭,2:开启 + int auto_split = 0;// 自动拆单开关,1:关闭,2:开启 + int smart_allot_storage_code_num = 0;// 参与分仓发货的仓库编号串,数据库为字符串,转换为int放入memcache,1:关闭,2:开启 + + if (copyTradeInfo.obm_flag == 2 // 混合 + || (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() > 1)) { + smart_allot_storage = 2; + auto_split = 2; + smart_allot_storage_code_num = 2; + } + if (copyTradeInfo.obm_flag == 0 // 自发 + || (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() == 1)) { + String company_code = ""; + if (copyTradeInfo.obm_flag == 0) { + /** + * 包括品牌商自发和经销商自发 + */ + company_code = copyTradeInfo.company_code; + } + if (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() == 1) { + company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.smart_allot_storage_flag = copyTradeInfo.orders[0].smart_allot_storage_flag; + } + String sale_key = company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs.getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs.getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs.getString("smart_allot_storage_code_list") == null + ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + if (mcc != null) { + // 写入memcache + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(sale_key,0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + JSONObject json = new JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json.get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json.get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + } + + /** + * TODO 代发判断处理耗时 + */ + long OBMEndTime = System.currentTimeMillis(); + + // 查询可销售数量 + + /** + * 需要保证tradeInfo的值不变,在出现异常时,事务回退,再次尝试写入时才能保证订单的正确性 + */ + + + copyTradeInfo.trade_key = "原订单"; + /** + * 可能存在有赠品的情况,要更新原单商品数量 + */ + tradeList.add(copyTradeInfo); + + long storageBeginTime = System.currentTimeMillis(); + + /** + * 智能拆分订单 + * + */ + if (smart_allot_storage == 2) { + + /** + * 设置的智能分仓的仓库 + */ + if (smart_allot_storage_code_num == 2) { + /** + * 自动拆分 + */ + if (auto_split == 2) { + /** + * 单独循环每个商品的库存,对于任何仓库都没有库存的商品要加入到tradeList里面,因此不能在判断代发关系循环时 将产品的库存查出 + * + * 使用临时集合存储订单信息以匹配仓库,如果是全部是自发的商品或者全部(包括经销商自发和品牌商自发) 是代发的商品,那么集合只会有一个元素。 + * 如果是混合发货,则先将自发商品和代发商品区分出来,放在不同的下标元素中 + * + */ + List temporaryTradeInfoList = Collections + .synchronizedList(new ArrayList()); + /** + * 查询每个商品可以发货的仓库 + */ + int orderLength_1 = copyTradeInfo.orders.length; + for (int k = 0; k < orderLength_1; k++) { + + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[k]; + String delivery_storage_company_code = ""; + String delivery_storage_commodity_code = ""; + // boolean has_freeze_quantity = false; + + boolean is_found = false; + int order_count = 0;// 在一个商品有多个仓库的情况下,只有第一次循环采取添加子订单到temporaryTradeInfo + int commodity_class = 0; + int commodity_quantity = 1;// 加入有组合商品,组合中单品的数量 + + /** + * order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + */ + // int order_type = 0; + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + delivery_storage_orderInfo.order_type = 1; + delivery_storage_company_code = copyTradeInfo.company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.commodity_code; + } + if (copyTradeInfo.company_type == 3) { + delivery_storage_orderInfo.order_type = 2; + delivery_storage_company_code = copyTradeInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + } + /** + * tradeInfo.obm_flag == 1 代发订单,根据上面判断代发关系查询代发品牌商公司编码 + */ + if (copyTradeInfo.obm_flag == 1) { + delivery_storage_orderInfo.order_type = 3; + delivery_storage_company_code = delivery_storage_orderInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + /** + * tradeInfo.obm_flag == 2 代发和自发的混合订单,要分别判断每个商品是代发还是自发 + */ + if (copyTradeInfo.obm_flag == 2) { + if (delivery_storage_orderInfo.agent_type == 1) { + delivery_storage_orderInfo.order_type = 4; + delivery_storage_company_code = copyTradeInfo.company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.commodity_code; + } + if (delivery_storage_orderInfo.agent_type == 2) { + delivery_storage_orderInfo.order_type = 5; + delivery_storage_company_code = delivery_storage_orderInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + } + + // 如果 指定仓 + if (delivery_storage_orderInfo.smart_allot_storage_flag == 2) { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, commodity_quantity, + order_count, copyTradeInfo); + + continue; + } + + // 订单商品拆分 单商品查询可销售数量 不够 进默认,可以就智能分 + if ((copyTradeInfo.orders[k].num <= copyTradeInfo.orders[k].zongshuliang + && copyTradeInfo.orders[k].agent_type == 2) + || copyTradeInfo.orders[k].agent_type == 1) { + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (delivery_storage_orderInfo.order_type == 3 + || delivery_storage_orderInfo.order_type == 5) { + String osop_key = delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key,0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + JSONObject json = new JSONObject(jsonStr); + obm_storage_open_percent = (double) json.get("obm_storage_open_percent"); + } + } + + /** + * 空编码商品直接放默认仓库 + */ + + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_commodity_code); + ps.setString(2, delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + + sql = "select a.storage_code,sum(a.quantity) as quantity,b.smart_allot_storage_join " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.quantity>0 and a.storage_code=b.code " + + "group by a.storage_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_commodity_code); + ps.setString(2, delivery_storage_company_code); + + } + + /// 种类(1:单品 2:组合 3:配件) + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + sql = "select tem2.storage_code,tem2.freeze_quantity as quantity,tem2.commodity_quantity,ts.smart_allot_storage_join from ( " + + "select tem1.storage_code,tem1.quantity,tem1.commodity_quantity,tem1.freeze_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + "where tem2.storage_code = ts.code " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_commodity_code); + ps.setString(3, delivery_storage_company_code); + ps.setString(4, delivery_storage_commodity_code); + ps.setString(5, delivery_storage_company_code); + ps.setString(6, delivery_storage_company_code); + } + rs = ps.executeQuery(); + while (rs.next()) { + is_found = true; + String storage_code = rs.getString("storage_code"); + int quantity = rs.getInt("quantity"); + + /** + * 对于品牌商库存有开放度,该值默认为1(经销商统一为1) + */ + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + + int smart_allot_storage_join = rs.getInt("smart_allot_storage_join"); + + temporaryTradeInfoList = getSmartAllotAutoSplitStorageFound( + delivery_storage_company_code, storage_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, quantity, + commodity_quantity, smart_allot_storage_join, order_count, + copyTradeInfo); + order_count++; + } + if (!is_found) { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, + commodity_quantity, order_count, copyTradeInfo); + } + + } else { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, commodity_quantity, + order_count, copyTradeInfo); + } + + } + /** + * 根据订单判断各商品的发货仓库,并拆单 + */ + for (int i = 0; i < temporaryTradeInfoList.size(); i++) { + // 订单商品拆分 单商品查询可销售数量 不够 进默认,可以就智能分 + + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + String temporary_delivery_storage_company_code = ""; + if (temporaryTradeInfo.obm_flag == 0 && temporaryTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.obm_flag == 1 + || (temporaryTradeInfo.obm_flag == 0 && temporaryTradeInfo.company_type == 3)) { + temporary_delivery_storage_company_code = temporaryTradeInfo.obm_company_code; + } + + String sale_key = temporary_delivery_storage_company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + temporary_delivery_storage_company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs + .getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs + .getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs + .getString("smart_allot_storage_code_list") == null ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + if (mcc != null) { + // 写入memcache + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(sale_key,0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + JSONObject json = new JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json + .get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json + .get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + /** + * 已经按公司分好的订单,需要根据不同公司的设置区分是否拆分订单 + */ + if (smart_allot_storage == 2) { + if (smart_allot_storage_code_num == 2) { + /** + * 设置了智能分仓,按智能分仓判断由那个仓库发货 + */ + if (auto_split == 2) { + + /** + * 智能拆单开启,自动拆单 + */ + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.storage_code = storage_code; + tradeList = recordTrade(tradeList, temporaryTradeInfo, + trade_key); + continue;// 如果配送区域仓库可以发货,那么将跳过这个子订单,并判断下一个 + } + } + } + } + /** + * 走到这里说明默认仓库不能发货,如果tradeInfo的map包含默认仓库的话 然后遍历所有的仓库,找到可以发所有货的仓库 + */ + boolean has_other_storage = false; + for (Entry> entry_storage_codes : temporaryTradeInfo.storage_map + .entrySet()) { + String commodity_key = entry_storage_codes.getKey(); + ArrayList commodity_list = entry_storage_codes.getValue(); + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c2 = commodity_list.get(j); + if (c2.flag && c2.smart_allot_storage_join == 2) { + count++; + } + } + String storage_code = commodity_key.split("_cs")[1]; + if (count == temporaryTradeInfo.orders.length) { + has_other_storage = true; + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.storage_code = storage_code; + tradeList = recordTrade(tradeList, temporaryTradeInfo, + trade_key); + break; + } + } + } + /** + * 如果在非配送区域的发货仓库找到可以全部发货的仓库,则循环下一个子订单 + */ + if (has_other_storage) { + continue; + } + /** + * 走到这里说明没有没有仓库可以将此子订单的所有商品一次发货,需要拆单 需要将所有仓库根据订单商品的相关性排序,选出相关性最高的一个仓库发货, + * 然后从map删除该仓库,并将已经匹配的商品从暂用的订单商品中删除掉 并根据剩下的仓库和订单商品再进行相关性排序, + * 直到所有的商品都找到仓库或者没有仓库能匹配发货的商品到默认仓库去 + */ + do { + HashMap> commodity_map = selectStorage( + temporaryTradeInfo); + Iterator>> it = commodity_map + .entrySet().iterator(); + if (it.hasNext()) { + Entry> entry = it.next(); + String storage_code = entry.getKey().split("_cs")[1]; + ArrayList commodity_list = entry.getValue(); + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c5 = commodity_list.get(j); + String commodity_code = c5.commodity_code; + int[] index = {}; + boolean found_commodity = false; + for (int k = 0; k < temporaryTradeInfo.orders.length; k++) { + if (temporaryTradeInfo.orders[k].order_type == 1 + || temporaryTradeInfo.orders[k].order_type == 4) { + if (commodity_code.equals( + temporaryTradeInfo.orders[k].commodity_code)) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.orders[k].storage_code = storage_code; + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, + temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + index = Arrays.copyOf(index, index.length + 1); + index[index.length - 1] = k; + found_commodity = true; + } + } + if (temporaryTradeInfo.orders[k].order_type == 2 + || temporaryTradeInfo.orders[k].order_type == 3 + || temporaryTradeInfo.orders[k].order_type == 5) { + if (commodity_code.equals( + temporaryTradeInfo.orders[k].obm_commodity_code)) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.orders[k].storage_code = storage_code; + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, + temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + index = Arrays.copyOf(index, index.length + 1); + index[index.length - 1] = k; + found_commodity = true; + } + } + } + /** + * 删除map中的已经用过的仓库,删除temporaryTradeInfo中已经有仓库的商品 + */ + if (found_commodity) { + for (int k = index.length - 1; k >= 0; k--) { + temporaryTradeInfo.orders[index[k]] = temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1]; + temporaryTradeInfo.orders = Arrays.copyOf( + temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length - 1); + } + } + } + temporaryTradeInfo.storage_map + .remove(temporary_delivery_storage_company_code + "_cs" + + storage_code); + } else { + /** + * 如果返回的map没有值,说明订单中的商品已经查不到仓库发货,只能走默认仓库 + */ + for (int k = 0; k < temporaryTradeInfo.orders.length; k++) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + temporaryTradeInfo.orders[k].storage_code; + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + } + /** + * 将数组置为0 + */ + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + 0); + } + } while (temporaryTradeInfo.orders.length > 0); + } else { + /** + * 设置了智能分仓仓库,但是不拆分订单,首先查询配送区域内仓库,如果可以发货则由配送区域内发货,如果配送区域仓库内无货,则查询选择的分仓仓库,如果有仓库由货则由该仓库发货, + * 否则放到默认仓库发货 + */ + /** + * 如果是有空商品,区域仓库不能发货那么久直接去默认仓库 + */ + + if (temporaryTradeInfo.null_code) { + tradeList.add(temporaryTradeInfo); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + tradeList.add(temporaryTradeInfo); + continue;// 如果配送区域仓库可以发货,那么将跳过这个子订单,并判断下一个 + } + } + } + } + /** + * 走到这里说明默认仓库不能发货,如果tradeInfo的map包含默认仓库的话 然后遍历所有的仓库,找到可以发所有货的仓库 + */ + for (Entry> entry_storage_codes : temporaryTradeInfo.storage_map + .entrySet()) { + String commodity_key = entry_storage_codes.getKey(); + ArrayList commodity_list = entry_storage_codes + .getValue(); + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c2 = commodity_list.get(j); + if (c2.flag && c2.smart_allot_storage_join == 2) { + count++; + } + } + String storage_code = commodity_key.split("_cs")[1]; + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + // tradeList.add(temporaryTradeInfo); + break; + } + } + } + tradeList.add(temporaryTradeInfo); + } + } + } else { + /** + * 未设置智能分仓,查询配送区域仓库,不能发货的话走默认仓库 + */ + if (temporaryTradeInfo.null_code) { + tradeList.add(temporaryTradeInfo); + } else { + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + // tradeList.add(temporaryTradeInfo); + } + } + } + } + tradeList.add(temporaryTradeInfo); + } + } + } else { + /** + * 未开启智能分仓,直接到默认仓库 + */ + tradeList.add(temporaryTradeInfo); + } + // } + } + } else { + + /** + * 判断可销售数量是否足够,不够的进入默认仓(缺货仓),足够的继续 + */ + + if ((zg && copyTradeInfo.orders[0].agent_type == 2) + || copyTradeInfo.orders[0].agent_type == 1) { + + /** + * 设置了智能分仓仓库,但是不拆分订单,首先查询配送区域内仓库,如果可以发货则由配送区域内发货,如果配送区域仓库内无货,则查询选择的分仓仓库,如果有仓库由货则由该仓库发货, + * 否则放到默认仓库发货 + */ + + String temporary_delivery_storage_company_code = ""; + boolean obm_order_flag = false; + + /** + * 如果是有空商品,区域仓库不能发货那么久直接去默认仓库 + */ + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = copyTradeInfo.company_code; + } + if (copyTradeInfo.company_type == 3) { + temporary_delivery_storage_company_code = copyTradeInfo.obm_company_code; + obm_order_flag = true; + } + } + // if (copyTradeInfo.obm_flag == 2) { + // fixed_flag = true; + // } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + temporary_delivery_storage_company_code = copyTradeInfo.orders[0].obm_company_code; + obm_order_flag = true; + /** + * 更新纯代发订单的订单信息 + */ + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + } + } + + if (copyTradeInfo.null_code || copyTradeInfo.smart_allot_storage_flag == 2) { + tradeList.add(copyTradeInfo); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + Map agentStorageMap = new ConcurrentHashMap(); + Map commodity_map = new HashMap(); + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (obm_order_flag) { + if (copyTradeInfo.obm_flag == 1) { + String osop_key = temporary_delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key,0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", + temporary_delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + JSONObject json = new JSONObject(jsonStr); + obm_storage_open_percent = (double) json + .get("obm_storage_open_percent"); + } + } + } + + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[i]; + + boolean has_freeze_quantity = false;// true:有冻结库存,false:没有冻结库存 + int commodity_class = 0; + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + sql = "select storage_code,sum(a.quantity) as quantity,b.smart_allot_storage_join " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.quantity>0 and a.storage_code=b.code " + + "group by a.storage_code"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } + } + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + sql = "select tem2.storage_code,tem2.freeze_quantity as quantity,ts.smart_allot_storage_join,tem2.commodity_quantity from ( " + + "select tem1.storage_code,tem1.quantity,tem1.commodity_quantity,tem1.freeze_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + "where tem2.storage_code = ts.code " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(3, temporary_delivery_storage_company_code); + ps.setString(4, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(5, temporary_delivery_storage_company_code); + ps.setString(6, temporary_delivery_storage_company_code); + } else { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.commodity_code); + ps.setString(3, temporary_delivery_storage_company_code); + ps.setString(4, delivery_storage_orderInfo.commodity_code); + ps.setString(5, temporary_delivery_storage_company_code); + ps.setString(6, temporary_delivery_storage_company_code); + } + } + /** + * 只有没有冻结库存的才查询普通库存 + */ + rs = ps.executeQuery(); + if (rs.next()) { + do { + int commodity_quantity = 1; + int quantity = rs.getInt("quantity"); + String storage_code = rs.getString("storage_code"); + + /** + * 防止订单中有重复的商品,对于重复商品数量要计数累加去对比库存是否可以发货 + */ + int commodity_num = 0; + String key = ""; + if (obm_order_flag) { + key = storage_code + "_sc" + + delivery_storage_orderInfo.obm_commodity_code; + } else { + key = storage_code + "_sc" + + delivery_storage_orderInfo.commodity_code; + } + if (commodity_map.containsKey(key)) { + commodity_num = commodity_map.get(key) + + delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } else { + commodity_num = delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } + + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + + if (quantity >= commodity_num) { + if (agentStorageMap.containsKey(storage_code)) { + AgentStorage as = new AgentStorage(); + as = agentStorageMap.get(storage_code); + as.count++; + as.smart_allot_storage_join = rs + .getInt("smart_allot_storage_join"); + agentStorageMap.put(storage_code, as); + } else { + AgentStorage as = new AgentStorage(); + as.count++; + as.smart_allot_storage_join = rs + .getInt("smart_allot_storage_join"); + agentStorageMap.put(storage_code, as); + } + } + } while (rs.next()); + } else { + /** + * 如果存在某个商品查不到库存的情况,则将map清空 + */ + agentStorageMap.clear(); + break; + } + // } + + } + /** + * 如果agentStorageMap为空,那么没有仓库可以发货,直接放到默认仓库 + */ + if (agentStorageMap.size() == 0) { + tradeList.add(copyTradeInfo); + } + if (agentStorageMap.size() > 0) { + // 查询OMS设置的订单所在区域的代发仓库 + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, copyTradeInfo.receiver_country, + copyTradeInfo.receiver_state, copyTradeInfo.receiver_city, + copyTradeInfo.receiver_district); + boolean area_storage_falg = true; + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + if (agentStorageMap.containsKey(storage_code)) { + AgentStorage as = new AgentStorage(); + as = agentStorageMap.get(storage_code); + if (as.count == copyTradeInfo.orders.length) { + copyTradeInfo.storage_code = storage_code; + tradeList.add(copyTradeInfo); + } else { + area_storage_falg = false; + } + } else { + area_storage_falg = false; + } + } else { + area_storage_falg = false; + } + /** + * 如果配送区域不能发货,查询其他仓库 + */ + if (!area_storage_falg) { + Iterator> it = agentStorageMap.entrySet() + .iterator(); + String storage_code = ""; + if (it.hasNext()) { + do { + Entry entry = it.next(); + AgentStorage as = new AgentStorage(); + storage_code = entry.getKey(); + as = entry.getValue(); + if (as.count == copyTradeInfo.orders.length + && as.smart_allot_storage_join == 2) { + copyTradeInfo.storage_code = storage_code; + break; + } + } while (it.hasNext()); + } + tradeList.add(copyTradeInfo); + } + } + } + + } else { + /** + * 商品总数量 不足订单中的商品数量 只走默认仓库 混合订单及自发订单走自发订单 代发订单如果是一家供应商代发,走代发订单,否则走自发订单 + */ + + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + } else { + tradeList.add(copyTradeInfo); + } + } + + } + + } + } else { + // 判断 可销售数量是否足够 不够 放入默认仓 + if ((zg && copyTradeInfo.orders[0].agent_type == 2) + || copyTradeInfo.orders[0].agent_type == 1) { + + /** + * 没有设置智能分仓仓库,如果配送区域内仓库有货则由该仓库发货,否则由默认仓库发货 + */ + String temporary_delivery_storage_company_code = ""; + boolean obm_order_flag = false; + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = copyTradeInfo.company_code; + } + if (copyTradeInfo.company_type == 3) { + temporary_delivery_storage_company_code = copyTradeInfo.obm_company_code; + obm_order_flag = true; + } + } + // if (copyTradeInfo.obm_flag == 2) { + // fixed_flag = true; + // } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + temporary_delivery_storage_company_code = copyTradeInfo.orders[0].obm_company_code; + obm_order_flag = true; + /** + * 更新纯代发订单的订单信息 + */ + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + } + } + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (obm_order_flag) { + if (copyTradeInfo.obm_flag == 1) { + String osop_key = temporary_delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key,0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", + temporary_delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + JSONObject json = new JSONObject(jsonStr); + obm_storage_open_percent = (double) json.get("obm_storage_open_percent"); + } + } + } + + if (copyTradeInfo.null_code || copyTradeInfo.smart_allot_storage_flag == 2) { + tradeList.add(copyTradeInfo); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + storage_codes = queryAreaStorage(conn, ps, rs, temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + int area_storage = 0; + Map commodity_map = new HashMap(); + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[i]; + int commodity_class = 0; + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, copyTradeInfo.obm_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, copyTradeInfo.company_code); + } + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + + sql = "select quantity from ( " + "select sum(quantity) as quantity " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.storage_code=b.code and b.code=?) tem1 " + + "where tem1.quantity>=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, copyTradeInfo.obm_company_code); + ps.setString(3, storage_code); + ps.setInt(4, delivery_storage_orderInfo.num); + + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, copyTradeInfo.company_code); + ps.setString(3, storage_code); + ps.setInt(4, delivery_storage_orderInfo.num); + } + } + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + + sql = "select tem2.commodity_quantity,tem2.freeze_quantity as quantity from ( " + + "select tem1.storage_code,tem1.quantity,tem1.freeze_quantity,tem1.commodity_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + + "where tem2.storage_code = ts.code and ts.code=? " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(3, copyTradeInfo.obm_company_code); + ps.setString(4, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(5, copyTradeInfo.obm_company_code); + ps.setString(6, storage_code); + ps.setString(7, copyTradeInfo.obm_company_code); + } else { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.commodity_code); + ps.setString(3, copyTradeInfo.company_code); + ps.setString(4, delivery_storage_orderInfo.commodity_code); + ps.setString(5, copyTradeInfo.company_code); + ps.setString(6, storage_code); + ps.setString(7, copyTradeInfo.company_code); + } + } + rs = ps.executeQuery(); + if (rs.next()) { + + int quantity = rs.getInt("quantity"); + /** + * 对于品牌商库存有开放度,该值默认为1(经销商统一为1) + */ + int commodity_quantity = 1; + + /** + * 防止订单中有重复的商品,对于重复商品数量要计数累加去对比库存是否可以发货 + */ + int commodity_num = 0; + String key = ""; + if (obm_order_flag) { + key = storage_code + "_sc" + + delivery_storage_orderInfo.obm_commodity_code; + } else { + key = storage_code + "_sc" + delivery_storage_orderInfo.commodity_code; + } + if (commodity_map.containsKey(key)) { + commodity_num = commodity_map.get(key) + + delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } else { + commodity_num = delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } + + // quantity = (quantity - + // freeze_quantity) > 0 ? quantity - + // freeze_quantity + // : 0; + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + if (quantity >= commodity_num) { + area_storage++; + } + } + // } + } + if (area_storage == copyTradeInfo.orders.length) { + copyTradeInfo.storage_code = storage_code; + } + tradeList.add(copyTradeInfo); + } else { + /** + * 没有配置区域发货仓库,走默认仓库 + */ + tradeList.add(copyTradeInfo); + } + } + } else { + /** + * 商品总数量 不足订单中的商品数量 只走默认仓库 混合订单及自发订单走自发订单 代发订单如果是一家供应商代发,走代发订单,否则走自发订单 + */ + + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + } else { + tradeList.add(copyTradeInfo); + } + } + + } + } + + } else { + /** + * 非智能拆单,只走默认仓库 混合订单及自发订单走自发订单 代发订单如果是一家供应商代发,走代发订单,否则走自发订单 + * + */ + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + } else { + tradeList.add(copyTradeInfo); + } + } + } + + /** + * TODO 分仓判断耗时 + */ + long storageEndTime = System.currentTimeMillis(); + + /** + * order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + */ + + String sale_key = copyTradeInfo.company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + copyTradeInfo.company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs.getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs.getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs.getString("smart_allot_storage_code_list") == null + ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + if (mcc != null) { + // 写入memcache + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(sale_key,0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + JSONObject json = new JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json.get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json.get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + + int tradeListSize = tradeList.size(); + + /** + * true为拆分订单,false为没有拆分的订单 + */ + boolean separate_flag = false; + /** + * 记录tradeMap循环的次数,拆分订单当tradeMapLoopCount>1才开始判断货篮 + */ + int tradeListLoopCount = 0; + /** + * tradeMapSize==1表示只有原单,没有拆单,当tradeMapSize>1表示有拆单 + */ + if (tradeListSize > 2) { + separate_flag = true; + } + /** + * 如果是没有拆单的订单,要将tradeList.get(1)中的obm_company_code,company_type,obm_flag,storage_code给原单 + */ + if (!separate_flag) { + // tradeList.get(0).obm_flag = tradeList.get(1).obm_flag; + tradeList.get(0).company_type = tradeList.get(1).company_type; + tradeList.get(0).obm_company_code = tradeList.get(1).obm_company_code; + tradeList.get(0).storage_code = tradeList.get(1).storage_code; + } + + /** + * 用于拆分发票,混合订单只有其中的自发商品放入发票 + */ + int invoice_count = 0; + /** + * 记录拆分订单的金额 + */ + for (int l = 0; l < tradeListSize; l++) { + tradeListLoopCount++; + TradeInfo trade3 = tradeList.get(l); + OrderInfo[] order3 = null; + order3 = trade3.orders; + /** + * 重置公司配置信息 + */ + sale_template_type = sale_template_type_bak; + sale_order_no_audit = sale_order_no_audit_bak; + sale_order_3_no_audit = sale_order_3_no_audit_bak; + /** + * 如果是补款订单,那么只走标注模式 + */ + if (type_kind == 4) { + sale_template_type = 2; + sale_order_no_audit = 1; + sale_order_3_no_audit = 1; + } + /** + * 如果订单中有商品编码为空,那么只能走标准模式 + */ + if (trade3.null_code) { + sale_template_type = 0; + } + /** + * 如果是拆单的原单,统一标记为标准模式 + */ + if (separate_flag && tradeListLoopCount == 1) { + sale_template_type = 0; + } + /** + * 将发票分配到一张订单,只有拆分订单才做此操作 运费也放到同一张订单上 + */ + if (separate_flag && copyTradeInfo.invoice_type != 0) { + if (copyTradeInfo.obm_flag == 0 || copyTradeInfo.obm_flag == 1) { + if (tradeListLoopCount > 2) { + trade3.invoice_type = 0; + } + } + if (copyTradeInfo.obm_flag == 2 && tradeListLoopCount > 1) { + if (trade3.company_type == 3) { + trade3.invoice_type = 0; + } + if (invoice_count != 0 && trade3.company_type == 2) { + trade3.invoice_type = 0; + } + if (invoice_count == 0 && trade3.company_type == 2) { + invoice_count++; + } + } + } + /** + * 将运费发到拆分订单的第一个子单,不区分自发和代发 + */ + if (separate_flag) { + if (tradeListLoopCount > 2) { + trade3.post_fee = "0"; + } + } + + + // 货篮分流 + basketBeginTime = System.currentTimeMillis(); + + boolean flag_basket = true;// 用于判断货篮订单插入还是普通订单插入,免审订单类似于货篮订单,可用该字段做判断 + boolean flag_audit_3 = false;// 用于判断免审订单是否可以直接到待开发票环节,状态为3 + boolean flag_audit_4 = false;// 用于判断免审订单是否可以直接到打单环节,状态为4 + String basket_code = "";// 记录订单所属货篮编码 + if ((!(separate_flag && tradeListLoopCount == 1)) && (!(trade3.obm_flag == 1 + && (sale_template_type == 2 || (sale_template_type == 1 && sale_order_no_audit == 1))))) { + if (((trade3.invoice_type == 0) + && (("".equals(trade3.buyer_message) || (trade3.buyer_message == null))) + && (("".equals(trade3.seller_memo)) || (trade3.seller_memo == null))) + || (trade3.obm_flag == 1 && sale_template_type == 1 && sale_order_no_audit == 2 + && sale_order_3_no_audit == 1)) { + + /** + * 根据订单的类型传入company_code + */ + String basket_key = ""; + if (trade3.company_type == 2) { + basket_key = trade3.company_code + "_cb"; + } + if (trade3.company_type == 3) { + basket_key = trade3.obm_company_code + "_cb"; + } + + List baskets = Collections.synchronizedList(new ArrayList()); + if (mcc == null || (mcc.get(basket_key) == null)) { + sql = "select code from tb_basket where status=2 and company_code=?"; + ps = conn.prepareStatement(sql); + if (trade3.company_type == 2) { + ps.setString(1, trade3.company_code); + } + if (trade3.company_type == 3) { + ps.setString(1, trade3.obm_company_code); + } + rs = ps.executeQuery(); + while (rs.next()) { + Basket b = new Basket(); + b.code = rs.getString("code"); + baskets.add(b); + } + + for (int i = 0; i < baskets.size(); i++) { + sql = "select b.basket_code,b.commodity_code,b.quantity from " + + "tb_basket a, tb_basket_config b where a.status=2 and a.company_code=b.company_code and a.code=b.basket_code and b.basket_code='" + + baskets.get(i).code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + + // 生成条目数组 + baskets.get(i).b_num = 0; + while (rs.next()) { + baskets.get(i).items = Arrays.copyOf(baskets.get(i).items, + baskets.get(i).items.length + 1); + baskets.get(i).items[baskets.get(i).items.length - 1] = new Item(); + baskets.get(i).items[baskets.get(i).items.length - 1].basket_code = rs + .getString("basket_code"); + baskets.get(i).items[baskets.get(i).items.length - 1].commodity_code = rs + .getString("commodity_code"); + baskets.get(i).items[baskets.get(i).items.length - 1].quantity = rs + .getInt("quantity"); + baskets.get(i).b_num += rs.getInt("quantity"); + } + } + if (mcc != null) { + Map> map = new ConcurrentHashMap>(); + map.put("basket", baskets); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonArray = gson.toJson(baskets); + mcc.set(basket_key,0, jsonArray); + } + + } else { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = (String) mcc.get(basket_key); + baskets = gson.fromJson(jsonStr, new TypeToken>() { + }.getType()); + } + + // 循环处理各货篮,只要有匹配的即可退出 + for (int i = 0; i < baskets.size(); i++) { + int count = 0;// 计数器,用于判断订单与货篮中货物完全匹配的个数 + if (trade3.num == baskets.get(i).b_num) { + for (int j = 0; j < baskets.get(i).items.length; j++) { + baskets.get(i).items[j].t_num = 0; + for (int k = 0; k < order3.length; k++) { + // 判断订单商品编码是否为空 + if (trade3.company_type == 2) { + if (order3[k].commodity_code == null + || "".equals(order3[k].commodity_code)) { + continue; + } + if (order3[k].commodity_code + .equals(baskets.get(i).items[j].commodity_code)) { + baskets.get(i).items[j].t_num += order3[k].num; + } + } + if (trade3.company_type == 3) { + if (order3[k].obm_commodity_code == null + || "".equals(order3[k].obm_commodity_code)) { + continue; + } + if (order3[k].obm_commodity_code + .equals(baskets.get(i).items[j].commodity_code)) { + baskets.get(i).items[j].t_num += order3[k].num; + } + } + + } + } + for (int j = 0; j < baskets.get(i).items.length; j++) { + if (baskets.get(i).items[j].quantity == baskets.get(i).items[j].t_num) { + count++; + } + } + if (count == baskets.get(i).items.length) { + flag_basket = false; + basket_code = baskets.get(i).code; + break; + } + } + } + } + } + + /** + * TODO 订单货篮判断耗时 + */ + basketEndTime = System.currentTimeMillis(); + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,company_code from tb_storage where logistics_company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "PLG"); + rs = ps.executeQuery(); + while (rs.next()) { + String entrust_storage_code = rs.getString("code"); + String entrust_companyCode = rs.getString("company_code"); + if (entrust_storage_code == null || entrust_companyCode == null) { + continue; + } + if (trade3.company_type == 2) { + if (trade3.obm_flag == 0) { + if (separate_flag && tradeListLoopCount > 1) { + if (trade3.company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + if (!separate_flag) { + // trade3.storage_code = + // tradeList.get(1).storage_code; + if (trade3.company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + } + } + if (trade3.company_type == 3) { + if (separate_flag && tradeListLoopCount > 1) { + if (trade3.obm_company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + if (!separate_flag) { + if (trade3.obm_company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + } + } + + + insertTradeInfoBeginTime = System.currentTimeMillis(); + + // 插入销售单详表 + if (separate_flag && tradeListLoopCount > 1) { + trade3.money = trade3.pay_money = "0"; + trade3.discount_fee = "0"; + } + // int order_count = 0; + int order3_length = order3.length; + for (int i = 0; i < order3_length; i++) { + OrderInfo orderInfo3 = order3[i]; + // order_count ++; + /** + * 如果是拆分订单的话计算拆分金额 + */ + if (separate_flag && tradeListLoopCount > 1) { + /** + * 淘宝平台已经计算好了orderInfo3.divide_order_fee,其他平台由 + */ + + trade3.pay_money = trade3.money = (Double.valueOf(trade3.money) + + Double.valueOf(orderInfo3.divide_order_fee)) + ""; + trade3.discount_fee = (Double.valueOf(trade3.discount_fee) + + Double.valueOf(orderInfo3.part_mjz_discount)) + ""; + } + /** + * 执行订单详情插入操作 + */ + sql = "insert into tb_sale_order_items (code,sale_order_code,commodity_code,quantity,unit_price,money,commodity_title,Sku_message,account,total_fee,adjust_fee,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,gift,obm_commodity_code,obm_company_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1) + "_" + (i + 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } + if (trade3.omsOwnFlag) { + ps.setString(3, null); + } else { + ps.setString(3, orderInfo3.commodity_code); + } + ps.setInt(4, orderInfo3.num); + ps.setDouble(5, Double.parseDouble(orderInfo3.price)); + ps.setDouble(6, Double.parseDouble(orderInfo3.payment)); + ps.setString(7, orderInfo3.title); + ps.setString(8, orderInfo3.sku_properties_name); + ps.setDouble(9, Double.parseDouble(orderInfo3.discount_fee)); + ps.setDouble(10, Double.parseDouble(orderInfo3.total_fee)); + ps.setDouble(11, Double.parseDouble(orderInfo3.adjust_fee)); + if ("".equals(orderInfo3.sku_id) || orderInfo3.sku_id == null) { + ps.setString(12, null); + } else { + ps.setString(12, orderInfo3.sku_id); + } + ps.setString(13, + ("".equals(orderInfo3.productItemID_dd) || orderInfo3.productItemID_dd == null) ? null + : orderInfo3.productItemID_dd); + if (trade3.omsOwnFlag) { + ps.setString(14, null); + } else { + ps.setString(14, trade3.company_code); + } + ps.setDouble(15, Double.parseDouble(orderInfo3.divide_order_fee)); + ps.setDouble(16, Double.parseDouble(orderInfo3.part_mjz_discount)); + ps.setString(17, orderInfo3.oid); + ps.setInt(18, orderInfo3.gift_type); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + if (trade3.obm_flag == 1) { + ps.setString(19, orderInfo3.obm_commodity_code); + } + if (trade3.omsOwnFlag) { + ps.setString(19, orderInfo3.commodity_code); + } + ps.setString(20, trade3.obm_company_code); + } else { + ps.setString(19, null); + ps.setString(20, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + + // 如果是天猫分销平台的订单,同时写入tb_sub_sale_order_items + if ("012".equals(trade3.platform_code)) { + sql = "insert into tb_sub_sale_order_items (code,status,buyer_payment,company_code)" + + " values (?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1) + "_" + (i + 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } + ps.setString(2, orderInfo3.order_200_status); + ps.setDouble(3, Double.parseDouble(orderInfo3.order_buyer_payment)); + ps.setString(4, trade3.company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + + /** + * 统一处理订单的buyer_nick、receiver_name、receiver_adderss可能出现的emoji表情 + * 如果有emoji表情,移除emoji, + * 1.receiver_adderss不可能只有emoji组成 + * 2.receiver_name如果全部是emoji,移除后改为两个英文的??代替 + * 3.buyer_nick如果全部为emoji,移除后置为空字符串 + */ + //收货地址 + boolean hasReceiverAdressEmoji = EmojiFilterUtil.containsEmoji(trade3.receiver_address); + if (hasReceiverAdressEmoji) { + trade3.receiver_address = EmojiFilterUtil.filterEmoji(trade3.receiver_address).trim(); + } else { + trade3.receiver_address = trade3.receiver_address; + } + //购买人昵称 + trade3.buyer_nick = trade3.buyer_nick == null ? "" : trade3.buyer_nick;//如果存在null值,将null改为空字符串 + boolean hasBuyerNickEmoji = EmojiFilterUtil.containsEmoji(trade3.buyer_nick); + if (hasBuyerNickEmoji) { + trade3.buyer_nick = EmojiFilterUtil.filterEmoji(trade3.buyer_nick).trim(); + } else { + trade3.buyer_nick = trade3.buyer_nick; + } + //收货人姓名 + trade3.receiver_name = trade3.receiver_name == null ? "" : trade3.receiver_name;//如果存在null值,将null改为空字符串 + boolean hasReceiverNameEmoji = EmojiFilterUtil.containsEmoji(trade3.receiver_name); + if (hasReceiverNameEmoji) { + trade3.receiver_name = EmojiFilterUtil.filterEmoji(trade3.receiver_name).trim(); + if ("".equals(trade3.receiver_name)) { + trade3.receiver_name = "??"; + } + } else { + trade3.receiver_name = trade3.receiver_name; + } + + + if (!flag_basket) { + logger.info("货篮判断成功| [ {} ] ,属于货篮:{}", trade3.tid, basket_code); + // 插入符合货篮条件的订单 + sql = "insert into tb_sale_order (code,original_sale_order_code,platform_code,pay_account,pay_no,platform_status,platform_type,brand_list,quantity,money" + + ",type,buyer_nick_name,platform_create_time,buyer_message,seller_note,pay_money,total_fee,adjust_fee,discount_fee,pay_time,platform_modify_time,invoice_type,pay_mode_id" + + ",shop_code,company_code,trade_mode_id,cur_delivery_order_code,cur_money,cur_quantity,cur_invoice_type,status,basket_code,storage_code,encrpy_buyer_nick_name,seller_flag,obm_company_code,entrust_type,del_flag,order_splite,obm_storage_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + ps.setString(2, order_code); + } + ps.setString(3, trade3.tid); + ps.setString(4, null);// 原来存值为tradeInfo.alipay_id + ps.setString(5, trade3.alipay_no); + ps.setString(6, trade3.status); + ps.setString(7, trade3.type); + ps.setString(8, trade3.brand); + ps.setInt(9, trade3.num); + ps.setDouble(10, Double.parseDouble(trade3.money)); + if (type_kind == 4) { + ps.setInt(11, 5); + } else { + ps.setInt(11, 1); + } + + ps.setString(12, trade3.buyer_nick); + ps.setString(13, trade3.created); + ps.setString(14, trade3.buyer_message); + ps.setString(15, trade3.seller_memo); + ps.setDouble(16, Double.parseDouble(trade3.pay_money)); + ps.setDouble(17, Double.parseDouble(trade3.product_fee)); + ps.setDouble(18, Double.parseDouble(trade3.adjust_fee)); + ps.setDouble(19, Double.parseDouble(trade3.discount_fee)); + ps.setString(20, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + ps.setString(21, trade3.platform_modify_time); + ps.setInt(22, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(23, trade3.pay_mode_id); + ps.setString(24, trade3.shop_code); + if (trade3.omsOwnFlag) { + ps.setString(25, null); + } else { + ps.setString(25, trade3.company_code); + } + ps.setInt(26, 1); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(27, "PS" + order_code); + } else { + ps.setString(27, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(27, "PS" + order_code); + } + ps.setDouble(28, Double.parseDouble(trade3.pay_money)); + ps.setInt(29, trade3.num); + ps.setInt(30, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(31, 4); + ps.setString(32, basket_code); + // order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(33, null); + ps.setString(36, trade3.obm_company_code); + ps.setString(40, trade3.storage_code); + + } else { + ps.setString(33, trade3.storage_code); + ps.setString(36, null); + ps.setString(40, null); + } + ps.setString(34, trade3.encrpy_buyer_nick_name); + ps.setInt(35, trade3.seller_flag); + + if (trade3.entrust_type == 2) { + ps.setInt(37, 2); + } else { + ps.setInt(37, 1); + } + if ((separate_flag && tradeListLoopCount == 1) + || (trade3.trade_type2 == 2 && "是".equals(trade3.test_flag))) { + ps.setInt(38, 3); + } else { + ps.setInt(38, 1); + } + if (separate_flag) { + ps.setInt(39, 1); + } else { + ps.setString(39, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + } + // 执行普通订单的后续操作 + if (flag_basket) { + // 插入不符合货篮条件的订单 + sql = "insert into tb_sale_order (code,original_sale_order_code,platform_code,pay_account,pay_no,platform_status,platform_type,brand_list,quantity,money" + + ",type,buyer_nick_name,platform_create_time,buyer_message,seller_note,pay_money,total_fee,adjust_fee,discount_fee,pay_time,platform_modify_time,invoice_type,pay_mode_id" + + ",shop_code,company_code,trade_mode_id,cur_delivery_order_code,cur_money,cur_quantity,cur_invoice_type,status,storage_code,encrpy_buyer_nick_name,seller_flag,obm_company_code,entrust_type,entrust_time,del_flag,order_splite,invoice_status,obm_storage_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + ps.setString(2, order_code); + } + ps.setString(3, trade3.tid); + ps.setString(4, null);// 原来存值为tradeInfo.alipay_id + ps.setString(5, trade3.alipay_no); + ps.setString(6, trade3.status); + ps.setString(7, trade3.type); + ps.setString(8, trade3.brand); + ps.setInt(9, trade3.num); + ps.setDouble(10, Double.parseDouble(trade3.money)); + if (type_kind == 4) { + ps.setInt(11, 5); + } else { + ps.setInt(11, 1); + } + ps.setString(12, trade3.buyer_nick); + ps.setString(13, trade3.created); + ps.setString(14, trade3.buyer_message); + ps.setString(15, trade3.seller_memo); + ps.setDouble(16, Double.parseDouble(trade3.pay_money)); + ps.setDouble(17, Double.parseDouble(trade3.product_fee)); + ps.setDouble(18, Double.parseDouble(trade3.adjust_fee)); + ps.setDouble(19, Double.parseDouble(trade3.discount_fee)); + ps.setString(20, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + ps.setString(21, trade3.platform_modify_time); + ps.setInt(22, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(23, trade3.pay_mode_id); + ps.setString(24, trade3.shop_code); + if (trade3.omsOwnFlag) {// 如果omsOwnFlag为true,表示是天猫供销平台或者OMS取到的订单,公司编码写null + ps.setString(25, null); + } else { + ps.setString(25, trade3.company_code); + } + ps.setInt(26, 1); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(27, "PS" + order_code); + } else { + ps.setString(27, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(27, "PS" + order_code); + } + ps.setDouble(28, Double.parseDouble(trade3.pay_money)); + ps.setInt(29, trade3.num); + ps.setInt(30, trade3.invoice_type > 0 ? 2 : 1); + if (sale_template_type == 1) { + if (sale_order_no_audit == 2) { + if (sale_order_3_no_audit == 2) { + if ((trade3.invoice_type == 0) + && (("".equals(trade3.buyer_message) || (trade3.buyer_message == null))) + && (("".equals(trade3.seller_memo)) || (trade3.seller_memo == null))) { + ps.setInt(31, 4); + flag_basket = false; + flag_audit_4 = true; + } else { + ps.setInt(31, 1); + } + } else { + /** + * date2018-06-21 不管有没有发票,全部都走到打单去 + */ + + ps.setInt(31, 4); + flag_basket = false; + flag_audit_4 = true; + } + } else { + ps.setInt(31, 1); + } + } else { + ps.setInt(31, 1); + } + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(32, null); + ps.setString(35, trade3.obm_company_code); + ps.setString(41, trade3.storage_code); + } else { + ps.setString(32, trade3.storage_code); + ps.setString(35, null); + ps.setString(41, null); + } + ps.setString(33, trade3.encrpy_buyer_nick_name); + ps.setInt(34, trade3.seller_flag); + if (trade3.entrust_type == 2) { + ps.setInt(36, 2); + } else { + ps.setInt(36, 1); + } + if (trade3.entrust_type == 2 && flag_basket == false && flag_audit_4) { + ps.setString(37, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else { + ps.setString(37, null); + } + if ((separate_flag && tradeListLoopCount == 1) + || (trade3.trade_type2 == 2 && "是".equals(trade3.test_flag))) { + ps.setInt(38, 3); + } else { + ps.setInt(38, 1); + } + if (separate_flag) { + ps.setInt(39, 1); + } else { + ps.setString(39, null); + } + if (trade3.invoice_type > 0) { + ps.setInt(40, 1); + } else { + ps.setString(40, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + + } + // 对于天猫供销平台订单,同时写入tb_sub_sale_order + if ("012".equals(trade3.platform_code)) { + FenxiaoInfo fxInfo = trade3.fenxiaoInfo; + sql = "insert into tb_sub_sale_order (code,tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code)" + + " values (?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + } + ps.setString(2, fxInfo.tc_order_id); + ps.setString(3, fxInfo.distributor_username); + ps.setInt(4, fxInfo.trade_type); + ps.setString(5, fxInfo.buyer_payment); + ps.setString(6, fxInfo.status); + ps.setString(7, trade3.obm_company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + // 插入发票 + if (trade3.invoice_type > 0) { + sql = "insert into tb_invoice (code,type,title,content,money,TAX_msg,sale_order_code,type_id,company_code,status,obm_company_code,TAX_id,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "FP" + order_code + "_1"); + } else { + ps.setString(1, "FP" + order_code + (tradeListLoopCount - 1) + "_1"); + } + + } else { + ps.setString(1, "FP" + order_code + "_1"); + } + ps.setInt(2, 1); + ps.setString(3, trade3.invoice_title); + ps.setString(4, trade3.invoice_content); + ps.setDouble(5, Double.parseDouble(trade3.invoice_money)); + ps.setString(6, trade3.invoice_taxmsg); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(7, order_code); + } else { + ps.setString(7, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(7, order_code); + } + ps.setInt(8, trade3.invoice_type); + ps.setString(9, trade3.company_code); + if (flag_audit_4) { + ps.setInt(10, 2); + } else { + ps.setInt(10, 1); + } + if (trade3.company_type == 3 && trade3.obm_flag == 0) { + ps.setString(11, trade3.obm_company_code); + } else { + ps.setString(11, null); + } + ps.setString(12, trade3.tax_id); + ps.setString(13, trade3.address_telephone); + ps.setString(14, trade3.bank_of_deposit_account_number); + ps.setString(15, trade3.invoice_phone); + ps.setString(16, trade3.invoice_email); + if (ps.executeUpdate() == 0) { + return false; + } + } + // 插入配送单 + sql = "insert into tb_delivery_order (code,sale_order_code,cost,country,state,city,district,post_code,delivery_mode_code,company_code,name,mobile,address,telephone,encrpy_name,encrpy_mobile,encrpy_address,encrpy_telephone,obm_company_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "PS" + order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "PS" + order_code); + ps.setString(2, order_code); + } + + ps.setDouble(3, Double.parseDouble(trade3.post_fee)); + ps.setString(4, trade3.receiver_country); + ps.setString(5, trade3.receiver_state); + ps.setString(6, trade3.receiver_city); + ps.setString(7, trade3.receiver_district); + ps.setString(8, trade3.receiver_zip); + ps.setInt(9, delivery_type_id); + if (trade3.omsOwnFlag) { + ps.setString(10, null); + } else { + ps.setString(10, trade3.company_code); + } + ps.setString(11, trade3.receiver_name); + ps.setString(12, trade3.receiver_mobile); + ps.setString(13, trade3.receiver_address); + ps.setString(14, trade3.receiver_phone); + ps.setString(15, trade3.encrpy_name); + ps.setString(16, trade3.encrpy_mobile); + ps.setString(17, trade3.encrpy_address); + ps.setString(18, trade3.encrpy_telephone); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(19, trade3.obm_company_code); + } else { + ps.setString(19, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + /** + * 如果是拆分订单,则原单只插入上述部分 + */ + if (separate_flag && tradeListLoopCount == 1) { + continue; + } + // 执行货篮订单的后续操作/三无订单及全免审中无票订单 + if (flag_basket == false) { + // 插入出库单 + sql = "insert into tb_storage_out_order (code,brand_list,status,quantity,type,sale_order_code,company_code,storage_code,obm_company_code)" + + " values (?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "CK" + order_code); + } + ps.setString(2, trade3.brand); + if (flag_audit_4 || flag_audit_3) { + if (flag_audit_4) { + ps.setInt(3, 1); + } else { + ps.setInt(3, -1); + } + } else { + ps.setInt(3, 1); + } + ps.setInt(4, trade3.num); + if (flag_audit_4 || flag_audit_3) { + ps.setInt(5, 1); + } else { + ps.setInt(5, 3); + } + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(6, order_code); + } else { + ps.setString(6, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(6, order_code); + } + // ps.setString(6, order_code); + if (trade3.omsOwnFlag) { + ps.setString(7, null); + } else { + ps.setString(7, trade3.company_code); + } + ps.setString(8, trade3.storage_code); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(9, trade3.obm_company_code); + } else { + ps.setString(9, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + + /** + * 只有当委外订单时插入出库单详表 + */ + if (trade3.entrust_type == 2) { + /** + * 如果是单品直接插入 + */ + int storage_out_id = 0; + for (int i = 0; i < order3.length; i++) { + OrderInfo orderInfo3 = order3[i]; + + /** + * 是经销商订单 + */ + if (trade3.company_type == 2) { + // int commodity_class = 0; + // /** + // * 当商品为赠品时,查询商品的属性为单品还是组合 + // */ + /** + * 如果是单品,直接插入 + */ + if (orderInfo3.commodity_class == 1) { + sql = "insert into tb_storage_out_order_items (code,commodity_code,quantity,gift,storage_out_order_code,left_quantity,money,company_code)" + + " values (?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + "_" + + (++storage_out_id)); + } + + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setString(2, orderInfo3.commodity_code); + ps.setInt(3, orderInfo3.num); + ps.setInt(4, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(5, "CK" + order_code); + } else { + ps.setString(5, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(5, "CK" + order_code); + } + ps.setInt(6, orderInfo3.num); + ps.setDouble(7, Double.valueOf(orderInfo3.payment)); + ps.setString(8, trade3.company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + /** + * 如果是组合 + */ + if (orderInfo3.commodity_class == 2) { + Map commodity_codes_map = new HashMap(); + sql = "select commodity_code,commodity_quantity,commodity_price,adjust_price,adjust_begin_time,adjust_end_time from tb_group_commodity where group_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.commodity_code); + ps.setString(2, trade3.company_code); + rs = ps.executeQuery(); + while (rs.next()) { + EntrustOrder eo = new EntrustOrder(); + String commodity_code = rs.getString("commodity_code"); + eo.commodity_quantity = rs.getInt("commodity_quantity"); + eo.commodity_price = rs.getDouble("commodity_price"); + eo.adjust_price = rs.getDouble("adjust_price"); + eo.adjust_begin_time = rs.getString("adjust_begin_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_begin_time"); + eo.adjust_end_time = rs.getString("adjust_end_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_end_time"); + commodity_codes_map.put(commodity_code, eo); + } + for (Entry entry_commodity_codes : commodity_codes_map + .entrySet()) { + String commodity_code = entry_commodity_codes.getKey(); + EntrustOrder eo = entry_commodity_codes.getValue(); + sql = "insert into tb_storage_out_order_items (code,commodity_code,quantity,gift,storage_out_order_code,left_quantity,money,company_code,original_commodity_code)" + + " values (?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + + "_" + (++storage_out_id)); + } + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + ps.setString(2, commodity_code); + ps.setInt(3, orderInfo3.num * eo.commodity_quantity); + ps.setInt(4, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(5, "CK" + order_code); + } else { + ps.setString(5, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(5, "CK" + order_code); + } + + ps.setInt(6, orderInfo3.num); + if (orderInfo3.gift_type == 2) { + ps.setDouble(7, 0.0); + } else { + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()); + if (now.compareTo(eo.adjust_begin_time) > 0 + && now.compareTo(eo.adjust_end_time) < 0) { + ps.setDouble(7, + eo.adjust_price * eo.commodity_quantity * orderInfo3.num); + } else { + ps.setDouble(7, eo.commodity_price * eo.commodity_quantity + * orderInfo3.num); + } + } + ps.setString(8, trade3.company_code); + ps.setString(9, orderInfo3.commodity_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + + } + /** + * 如果是供应商,其中拆分订单品牌商代发的分订单的company_type==3,但是obm_flag为代发 + */ + if (trade3.company_type == 3) { + // int commodity_class = 0; + // /** + // * 当商品为赠品时,查询商品的属性为单品还是组合 + // */ + if (orderInfo3.commodity_class == 1) { + sql = "insert into tb_storage_out_order_items (code,quantity,gift,storage_out_order_code,left_quantity,money,obm_company_code,obm_commodity_code,company_code,commodity_code)" + + " values (?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + "_" + + (++storage_out_id)); + } + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setInt(2, orderInfo3.num); + ps.setInt(3, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(4, "CK" + order_code); + } else { + ps.setString(4, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(4, "CK" + order_code); + } + + ps.setInt(5, orderInfo3.num); + ps.setDouble(6, Double.valueOf(orderInfo3.payment)); + ps.setString(7, trade3.obm_company_code); + ps.setString(8, orderInfo3.obm_commodity_code); + if (trade3.obm_flag == 1) { + ps.setString(9, trade3.company_code); + ps.setString(10, orderInfo3.commodity_code); + } else { + ps.setString(9, null); + ps.setString(10, null); + } + + if (ps.executeUpdate() == 0) { + return false; + } + } + if (orderInfo3.commodity_class == 2) { + Map commodity_codes_map = new HashMap(); + if (trade3.obm_flag != 1) { + sql = "SELECT " + " commodity_code AS obm_commodity_code, " + + " commodity_quantity, " + " commodity_price, " + + " adjust_price, " + " adjust_begin_time, " + + " adjust_end_time, " + " commodity_code " + "FROM " + + " tb_group_commodity " + "WHERE " + " group_code = ? " + + "AND company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.obm_commodity_code); + ps.setString(2, trade3.obm_company_code); + } else { + sql = "SELECT " + " tgc.commodity_code AS obm_commodity_code, " + + " tgc.commodity_quantity, " + " tgc.commodity_price, " + + " tgc.adjust_price, " + " tgc.adjust_begin_time, " + + " tgc.adjust_end_time, " + " toac.commodity_code " + "FROM " + + " tb_group_commodity tgc, " + " tb_obm_agent_commodity toac, " + + " tb_obm_agent_shop toas " + "WHERE " + " tgc.group_code = ? " + + "AND tgc.company_code = ? " + + "AND tgc.commodity_code = toac.obm_commodity_code " + + "AND toac.obm_agent_shop_code = toas. code " + + "AND toas.shop_code = ?" + + "AND toas.obm_company_code = toac.obm_company_code " + + "AND toas.company_code = toac.company_code " + + "AND toac. STATUS = 2 " + "AND toas. STATUS = 2 " + + "AND toac.del_flag=1"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.obm_commodity_code); + ps.setString(2, trade3.obm_company_code); + ps.setString(3, trade3.shop_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + EntrustOrder eo = new EntrustOrder(); + String obm_commodity_code = rs.getString("obm_commodity_code"); + if (trade3.obm_flag == 1) { + eo.commodity_code = rs.getString("commodity_code"); + } + eo.commodity_quantity = rs.getInt("commodity_quantity"); + eo.commodity_price = rs.getDouble("commodity_price"); + eo.adjust_price = rs.getDouble("adjust_price"); + eo.adjust_begin_time = rs.getString("adjust_begin_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_begin_time"); + eo.adjust_end_time = rs.getString("adjust_end_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_end_time"); + commodity_codes_map.put(obm_commodity_code, eo); + } + + for (Entry entry_commodity_codes : commodity_codes_map + .entrySet()) { + EntrustOrder eo = entry_commodity_codes.getValue(); + String obm_commodity_code = entry_commodity_codes.getKey(); + sql = "insert into tb_storage_out_order_items (code,quantity,gift,storage_out_order_code,left_quantity,money,obm_company_code,obm_commodity_code,company_code,commodity_code,original_commodity_code,original_obm_commodity_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + + "_" + (++storage_out_id)); + } + + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setInt(2, orderInfo3.num * eo.commodity_quantity); + ps.setInt(3, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(4, "CK" + order_code); + } else { + ps.setString(4, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(4, "CK" + order_code); + } + ps.setInt(5, orderInfo3.num * eo.commodity_quantity); + if (orderInfo3.gift_type == 2) { + ps.setDouble(6, 0.0); + } else { + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()); + if (now.compareTo(eo.adjust_begin_time) > 0 + && now.compareTo(eo.adjust_end_time) < 0) { + ps.setDouble(6, + eo.adjust_price * eo.commodity_quantity * orderInfo3.num); + } else { + ps.setDouble(6, eo.commodity_price * eo.commodity_quantity + * orderInfo3.num); + } + } + ps.setString(7, trade3.obm_company_code); + ps.setString(8, obm_commodity_code); + if (trade3.obm_flag == 1) { + ps.setString(9, trade3.company_code); + ps.setString(10, eo.commodity_code); + ps.setString(11, orderInfo3.commodity_code); + } else { + ps.setString(9, null); + ps.setString(10, null); + ps.setString(11, null); + } + ps.setString(12, orderInfo3.obm_commodity_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + } + } + } + // if (!(agentFlag || omsOwnFlag)) {//代发和天猫供销平台不插入财务 + // 插入财务单 + sql = "insert into tb_finance_order (code,brand_list,quantity,money,status,type,sub_type,pay_time,order_type,order_code,company_code,platform_pay,obm_company_code)" + + " values (?,?,?,?,-1,1,1,?,5,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CWCK" + order_code); + } else { + ps.setString(1, "CWCK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "CWCK" + order_code); + } + ps.setString(2, trade3.brand); + ps.setInt(3, trade3.num); + ps.setString(4, trade3.money); + ps.setString(5, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(6, "CK" + order_code); + } else { + ps.setString(6, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(6, "CK" + order_code); + } + + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + if (trade3.obm_flag == 1) { + ps.setString(7, trade3.company_code); + ps.setString(9, trade3.obm_company_code); + } + if (trade3.omsOwnFlag) { + ps.setString(7, null); + ps.setString(9, trade3.obm_company_code); + } + } else { + ps.setString(7, trade3.company_code); + ps.setString(9, null); + } + ps.setDouble(8, Double.valueOf(trade3.money) * trade3.pay_percent); + if (ps.executeUpdate() == 0) { + return false; + } + } + + /** + * TODO 订单写入耗时统计 + */ + insertTradeInfoEndTime = System.currentTimeMillis(); + + /** + * 如果是未拆分订单,只执行原单插入,后面的订单不执行操作 + */ + if (!separate_flag) { + break; + } + + + } + long allEndTime = System.currentTimeMillis(); + projectRecord.setTradeInfoId(originalTradeInfo.tid); + + projectRecord.setAllBeginTime(allBeginTime); + projectRecord.setAllEndTime(allEndTime); + projectRecord.setAllOnceUseTime(allEndTime - allBeginTime); + + projectRecord.setActivityBeginTime(activityBeginTime); + projectRecord.setActivityEndTime(activityEndTime); + projectRecord.setActivityUseTime(activityEndTime - activityBeginTime); + + projectRecord.setObmBeginTime(OBMBeginTime); + projectRecord.setObmEndTime(OBMEndTime); + projectRecord.setObmUseTime(OBMEndTime - OBMBeginTime); + + projectRecord.setStorageBeginTime(storageBeginTime); + projectRecord.setStorageEndTime(storageEndTime); + projectRecord.setStorageUseTime(storageEndTime - storageBeginTime); + + projectRecord.setBasketBeginTime(basketBeginTime); + projectRecord.setBasketEndTime(basketEndTime); + projectRecord.setBasketUseTime(basketEndTime - basketBeginTime); + + projectRecord.setInsertBeginTime(insertTradeInfoBeginTime); + projectRecord.setInsertEndTime(insertTradeInfoEndTime); + projectRecord.setInsertUseTime(insertTradeInfoEndTime - insertTradeInfoBeginTime); + + projectRecord.setExecuteUnsendSqlBeginTime(getUnsendSqlBeginTime); + projectRecord.setExecuteUnsendSqlEndTime(getUnsendSqlEndTime); + projectRecord.setExecuteUnsendSqlUseTime(unSendUseTime); + + projectRecord.setExecuteSaleableSqlBeginTime(getSaleableSqlBeginTime); + projectRecord.setExecuteSaleableSqlEndTime(getSaleableSqlEndTime); + projectRecord.setExecuteSaleableSqlUseTime(saleAbleUseTime); + + + OrderSyncs.handlerRecord.projectRecordVector.add(projectRecord); + return true; + } catch (Exception e) { + logger.error(this, e); + if (giveBackGiftNumber(copyTradeInfo)) { + logger.info("订单 [ {} ] :归还赠品/订单成功!", copyTradeInfo.tid); + } else { + logger.info("订单 [ {} ] :归还赠品/订单失败!", copyTradeInfo.tid); + } + return false; + } + } + + /** + * @param giftCommodityInfo 赠品 + * @param copyTradeInfo 订单 + * @param gift_copies 赠品份数 + * @param rule 活动规则 + * @title: distributionGift + * @description: 配送赠品 + */ + private void distributionGift(Map giftCommodityInfo, TradeInfo copyTradeInfo, int gift_copies, + Rule rule, String rulename) throws Exception { + logger.info("订单 [ {} ] 符合活动规则:{}——{}", copyTradeInfo.tid, rule.activity_name, rule.rule_name); + for (Entry entry : giftCommodityInfo.entrySet()) { + copyTradeInfo.orders = Arrays.copyOf(copyTradeInfo.orders, copyTradeInfo.orders.length + 1); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1] = new OrderInfo(); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].commodity_code = entry.getKey(); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].num = gift_copies + * Integer.parseInt(entry.getValue());// 获取赠品的数量 + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].cid = rule.rule_apply_object; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].discount_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].payment = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].price = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_type = 2; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].title = rule.activity_name + "——" + rulename; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].sku_properties_name = ""; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].total_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].adjust_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].oid = ""; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].order_buyer_payment = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].rule_code = rule.rule_code; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_activity_code = rule.gift_activity_code; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_copies = gift_copies; + copyTradeInfo.num += (gift_copies * Integer.parseInt(entry.getValue()));// 计算订单总数量 + } + } + + /** + * @param tradeInfo + * @return boolean + * @title: giveBackGiftNumber + * @description: 发生异常时, 归还数据库中已赠送出去的赠品/订单数量(对于不限量的规则不予处理,对于有限额的规则,先归还memcached,再更新数据库) + * 1.订单满足多个规则,分别归还赠品/订单数量 2.订单满足一个规则,直接归还赠品/订单数量 + */ + public boolean giveBackGiftNumber(TradeInfo tradeInfo) { + try { + + Map map = new HashMap();// 存放规则及其需要归还的赠品/订单数量 + for (OrderInfo orderInfo : tradeInfo.orders) { + if (orderInfo.gift_type == 2) {// 该商品为赠品 + String activity_rule = orderInfo.gift_activity_code + orderInfo.rule_code; + if (map.containsKey(activity_rule)) { + continue; + } else { + map.put(activity_rule, orderInfo); + String rule_key = tradeInfo.shop_code + "_sr_V2.0_" + orderInfo.rule_code; + String rule = (String) mcc.get(rule_key); + GiftNum giftNum = new GsonBuilder().disableHtmlEscaping().create().fromJson(rule, GiftNum.class); + if (1 == giftNum.type) {// 限订单 + logger.info("订单 [ {} ] 活动规则是限订单,将开始归还订单数量!", tradeInfo.tid); + giftNum.order_current = giftNum.order_current - 1; + mcc.set(rule_key,0, new GsonBuilder().disableHtmlEscaping().create().toJson(giftNum)); + activityUpdateQueue.add(giftNum); + } else if (2 == giftNum.type) { + logger.info("订单 [ {} ] 活动规则是限赠品,将开始归还赠品数量!", tradeInfo.tid); + giftNum.gift_current = giftNum.gift_current - orderInfo.gift_copies; + mcc.set(rule_key,0, new GsonBuilder().disableHtmlEscaping().create().toJson(giftNum)); + activityUpdateQueue.add(giftNum); + } + } + } + } + return true; + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + } + + public synchronized boolean recordErrorReplenishTrade(TradeInfo tradeInfo, String msg) { + try { + // OrderSyncs.copyFile(new File(tradeInfo.out_path),new + // File(tradeInfo.out_path)); + + FileInputStream fis = new FileInputStream(tradeInfo.export_file_path + tradeInfo.out_path); + // FileInputStream fis = new FileInputStream("orders2.xlsx"); + XSSFWorkbook xw = new XSSFWorkbook(fis); + XSSFSheet xs = xw.getSheetAt(0); + + int rowLength = xs.getLastRowNum() + 1; + + xs.createRow(rowLength); + for (int i = 0; i < 40; i++) { + xs.getRow(rowLength).createCell(i); + xs.getRow(rowLength).getCell(i).getCellStyle().setLocked(false); + } + + xs.getRow(rowLength).getCell(0).setCellValue(tradeInfo.row_num - 3); + xs.getRow(rowLength).getCell(1).setCellValue(tradeInfo.shop_code); + xs.getRow(rowLength).getCell(2).setCellValue(tradeInfo.tid); + xs.getRow(rowLength).getCell(3).setCellValue(tradeInfo.product_fee); + xs.getRow(rowLength).getCell(4).setCellValue(tradeInfo.num); + xs.getRow(rowLength).getCell(5).setCellValue(tradeInfo.money); + xs.getRow(rowLength).getCell(6).setCellValue(tradeInfo.discount_fee); + xs.getRow(rowLength).getCell(7).setCellValue(tradeInfo.pay_time); + xs.getRow(rowLength).getCell(8).setCellValue(tradeInfo.created); + xs.getRow(rowLength).getCell(9).setCellValue(tradeInfo.receiver_name); + xs.getRow(rowLength).getCell(10).setCellValue(tradeInfo.receiver_phone); + xs.getRow(rowLength).getCell(11).setCellValue(tradeInfo.receiver_mobile); + xs.getRow(rowLength).getCell(12).setCellValue(tradeInfo.receiver_state); + xs.getRow(rowLength).getCell(13).setCellValue(tradeInfo.receiver_city); + xs.getRow(rowLength).getCell(14).setCellValue(tradeInfo.receiver_district); + xs.getRow(rowLength).getCell(15).setCellValue(tradeInfo.receiver_address); + xs.getRow(rowLength).getCell(16).setCellValue(tradeInfo.receiver_zip); + xs.getRow(rowLength).getCell(17).setCellValue(tradeInfo.post_fee); + xs.getRow(rowLength).getCell(18).setCellValue(tradeInfo.invoice_type); + xs.getRow(rowLength).getCell(19).setCellValue(tradeInfo.invoice_content); + xs.getRow(rowLength).getCell(20).setCellValue(tradeInfo.tax_id); + xs.getRow(rowLength).getCell(21).setCellValue(tradeInfo.invoice_taxmsg); + xs.getRow(rowLength).getCell(22).setCellValue(tradeInfo.invoice_email); + xs.getRow(rowLength).getCell(23).setCellValue(tradeInfo.invoice_phone); + xs.getRow(rowLength).getCell(24).setCellValue(tradeInfo.address_telephone); + xs.getRow(rowLength).getCell(25).setCellValue(tradeInfo.bank_of_deposit_account_number); + xs.getRow(rowLength).getCell(26).setCellValue(tradeInfo.invoice_money); + xs.getRow(rowLength).getCell(27).setCellValue(tradeInfo.status); + xs.getRow(rowLength).getCell(28).setCellValue(tradeInfo.title); + xs.getRow(rowLength).getCell(29).setCellValue(tradeInfo.type); + xs.getRow(rowLength).getCell(30).setCellValue(tradeInfo.buyer_message); + xs.getRow(rowLength).getCell(31).setCellValue(tradeInfo.seller_memo); + xs.getRow(rowLength).getCell(32).setCellValue(tradeInfo.test_flag); + + for (int i = 0; i < tradeInfo.orders.length; i++) { + if (i > 0) { + xs.createRow(rowLength + i); + } + + xs.getRow(rowLength + i).createCell(0); + xs.getRow(rowLength + i).getCell(0).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).createCell(34); + xs.getRow(rowLength + i).getCell(34).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).createCell(35); + xs.getRow(rowLength + i).getCell(35).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).createCell(36); + xs.getRow(rowLength + i).getCell(36).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).createCell(37); + xs.getRow(rowLength + i).getCell(37).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).createCell(38); + xs.getRow(rowLength + i).getCell(38).getCellStyle().setLocked(false); + xs.getRow(rowLength + i).getCell(0).setCellValue(++tradeInfo.row_num - 3); + xs.getRow(rowLength + i).getCell(34).setCellValue(tradeInfo.orders[i].platform_seller_code); + xs.getRow(rowLength + i).getCell(35).setCellValue(tradeInfo.orders[i].title); + xs.getRow(rowLength + i).getCell(36).setCellValue(tradeInfo.orders[i].price); + xs.getRow(rowLength + i).getCell(37).setCellValue(tradeInfo.orders[i].num); + xs.getRow(rowLength + i).getCell(38).setCellValue(tradeInfo.orders[i].divide_order_fee); + } + + xs.getRow(rowLength).getCell(39).setCellValue(msg); + + FileOutputStream fos = new FileOutputStream(tradeInfo.export_file_path + tradeInfo.out_path); + // FileOutputStream fos = new FileOutputStream("orders2.xlsx"); + xw.write(fos); + xw.close(); + fis.close(); + fos.close(); + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } + + } + + /** + * 查询配送区域的仓库 + * + * @param conn + * @param ps + * @param rs + * @param temporary_delivery_storage_company_code + * @param receiver_country + * @param receiver_state + * @param receiver_city + * @param receiver_district + * @return + * @throws Exception + */ + private String[] queryAreaStorage(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + String temporary_delivery_storage_company_code, String receiver_country, String receiver_state, + String receiver_city, String receiver_district) throws Exception { + /** + * 根据配置判断发货仓库 + */ + boolean provinceFlag = false;// 省级是否查询到仓库,false为未查到,true为查到 + boolean cityFlag = false;// 市级是否查询到仓库,false为未查到,true为一个或多个符合的结果,循环处理只要有合适的就退出循环,如果所有符合的仓库都不能发货,则去找库龄最长的仓库 + String[] storage_codes = {};// 记录订单所属发货区域 + int provinceNum = 0; + Map provinceStorageMap = new ConcurrentHashMap(); + + // 查询OMS设置的订单所在区域的代发仓库 + String sql = "select c.storage_code,d.name from (select a.storage_code,a.province_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=1 and a.country_code=b.code and a.company_code=? and b.name=? and (a.city_code is null or a.city_code='')) c left join tb_admin_dic d " + + "on c.province_code=d.code and d.type=2"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_country); + rs = ps.executeQuery(); + while (rs.next()) { + provinceNum++; + String storage_code = rs.getString("storage_code"); + String province_name = rs.getString("name") == null ? "" : rs.getString("name"); + provinceStorageMap.put(province_name, storage_code); + } + if (provinceNum == 1) { + Iterator> it = provinceStorageMap.entrySet().iterator(); + Entry entry = it.next(); + String province_name = entry.getKey(); + String storage_code = entry.getValue(); + if ((null == province_name || "".equals(province_name)) + || (null != province_name && receiver_state.equals(province_name))) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + provinceFlag = true; + } + } + if (provinceNum > 1) { + Iterator> it = provinceStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + String province_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != province_name && receiver_state.equals(province_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + provinceFlag = true; + break;// 只要有省份匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + + if (!provinceFlag) { + Map cityStorageMap = new ConcurrentHashMap(); + int cityNum = 0; + sql = "select c.storage_code,d.name from (select a.storage_code,a.city_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=2 and a.province_code=b.code and a.company_code=? and b.name=? and (a.district_code is null or a.district_code='')) c left join tb_admin_dic d " + + "on c.city_code=d.code and d.type=3"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_state); + rs = ps.executeQuery(); + while (rs.next()) { + cityNum++; + String storage_code = rs.getString("storage_code"); + String city_name = rs.getString("name"); + cityStorageMap.put(city_name, storage_code); + } + if (cityNum == 1) { + Iterator> it = cityStorageMap.entrySet().iterator(); + Entry entry = it.next(); + String city_name = entry.getKey(); + String storage_code = entry.getValue(); + if ((null == city_name || "".equals(city_name)) + || (null != city_name && receiver_city.equals(city_name))) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + cityFlag = true; + } + } + if (cityNum > 1) { + Iterator> it = cityStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + String city_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != city_name && receiver_city.equals(city_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + cityFlag = true; + break;// 只要有市匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + } + if (!cityFlag) { + Map districtStorageMap = new ConcurrentHashMap(); + sql = "select c.storage_code,d.name from (select a.storage_code,a.district_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=3 and a.city_code=b.code and a.company_code=? and b.name=?) c left join tb_admin_dic d " + + "on c.district_code=d.code and d.type=4"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_city); + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("storage_code"); + String district_name = rs.getString("name"); + districtStorageMap.put(district_name, storage_code); + } + Iterator> it = districtStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + String district_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != district_name && receiver_district.equals(district_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + break;// 只要有区县匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + return storage_codes; + } + + private List recordOrder(List tradeList, String trade_key, TradeInfo tradeInfo, + OrderInfo delivery_storage_orderInfo, int order_type) throws Exception { + boolean is_found = false; + for (int i = 0; i < tradeList.size(); i++) { + TradeInfo trade2 = tradeList.get(i); + if (trade2.trade_key.equals(trade_key)) { + if ("".equals(delivery_storage_orderInfo.commodity_code) && (order_type == 1 || order_type == 4)) { + trade2.null_code = true; + } + if ("".equals(delivery_storage_orderInfo.obm_commodity_code) + && (order_type == 2 || order_type == 3 || order_type == 5)) { + trade2.null_code = true; + } + trade2.num = trade2.num + delivery_storage_orderInfo.num; + trade2.orders = Arrays.copyOf(trade2.orders, trade2.orders.length + 1); + trade2.orders[trade2.orders.length - 1] = (OrderInfo) delivery_storage_orderInfo.deepClone(); + tradeList.set(i, trade2); + is_found = true; + } + } + + if (!is_found) { + TradeInfo trade2 = new TradeInfo(); + trade2 = (TradeInfo) tradeInfo.deepClone(); + trade2.trade_key = trade_key; + /** + * 对于原单有商品的订单,tradeInfo.null_code为true,但是拆分订单不一定每个商品都为空,所以在写入子订单时应该把trade2.null_code先改为false,如果 + * 子订单中有商品为空,那么下面在将该值改为true + */ + trade2.null_code = false; + /** + * 将仓库记入订单 + */ + trade2.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 记入子订单中商品总数量 + */ + trade2.num = delivery_storage_orderInfo.num; + /** + * 当商品为3:代发订单-全部代发商品,5:混合订单-品牌商代发商品时,拆分后的订单就是品牌商订单,但是obm_flag标志是代发订单 + */ + + if ("".equals(delivery_storage_orderInfo.commodity_code) && (order_type == 1 || order_type == 4)) { + trade2.null_code = true; + } + if ("".equals(delivery_storage_orderInfo.obm_commodity_code) + && (order_type == 2 || order_type == 3 || order_type == 5)) { + trade2.null_code = true; + } + /** + * 代发订单更新订单信息 + */ + if (order_type == 2) { + trade2.obm_company_code = delivery_storage_orderInfo.obm_company_code; + trade2.company_type = 3; + trade2.obm_flag = 0; + } + if (order_type == 3 || order_type == 5) { + trade2.obm_company_code = delivery_storage_orderInfo.obm_company_code; + trade2.company_type = 3; + trade2.obm_flag = 1; + } + + /** + * order_type==4上面将tradeInfo.obm_flag设为2-混合订单,此处拆开将obm_flag设为0-自发订单 + */ + if (order_type == 4 || order_type == 1) { + trade2.obm_flag = 0; + trade2.obm_company_code = ""; + } + trade2.orders = new OrderInfo[1]; + trade2.orders[0] = (OrderInfo) delivery_storage_orderInfo.deepClone(); + tradeList.add(trade2); + } + + return tradeList; + } + + private List recordTrade(List tradeList, TradeInfo temporaryTradeInfo, String trade_key) + throws Exception { + boolean is_found = false; + temporaryTradeInfo.trade_key = trade_key; + for (int i = 0; i < tradeList.size(); i++) { + TradeInfo trade2 = tradeList.get(i); + if (trade2.trade_key.equals(trade_key)) { + trade2.num = trade2.num + temporaryTradeInfo.num; + int ordersLength = trade2.orders.length; + trade2.orders = Arrays.copyOf(trade2.orders, trade2.orders.length + temporaryTradeInfo.orders.length); + System.arraycopy(temporaryTradeInfo.orders, 0, trade2.orders, ordersLength, + temporaryTradeInfo.orders.length); + tradeList.set(i, trade2); + is_found = true; + } + } + if (!is_found) { + tradeList.add(temporaryTradeInfo); + } + return tradeList; + } + + private HashMap> selectStorage(TradeInfo temporaryTradeInfo) throws Exception { + HashMap> commodity_map = temporaryTradeInfo.storage_map; + OrderInfo[] orders = temporaryTradeInfo.orders; + int count = 0; + // HashMap> storage_commodity = new + // HashMap>(); + for (Entry> entry_commodity_codes : commodity_map.entrySet()) { + int temporary_count = 0; + String storage_key = entry_commodity_codes.getKey(); + ArrayList commodity_list = entry_commodity_codes.getValue(); + HashMap> temporary_storage_commodity = new HashMap>(); + for (int i = 0; i < commodity_list.size(); i++) { + Commodity c3 = commodity_list.get(i); + for (int j = 0; j < orders.length; j++) { + OrderInfo order4 = orders[j]; + if (order4.order_type == 1 || order4.order_type == 4) { + if (c3.flag && c3.commodity_code.equals(orders[j].commodity_code) + && c3.smart_allot_storage_join == 2) { + temporary_count++; + if (temporary_storage_commodity.containsKey(storage_key)) { + ArrayList list = temporary_storage_commodity.get(storage_key); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } else { + ArrayList list = new ArrayList(); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } + } + } + if (order4.order_type == 2 || order4.order_type == 3 || order4.order_type == 5) { + if (c3.flag && c3.commodity_code.equals(orders[j].obm_commodity_code) + && c3.smart_allot_storage_join == 2) { + temporary_count++; + if (temporary_storage_commodity.containsKey(storage_key)) { + ArrayList list = temporary_storage_commodity.get(storage_key); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } else { + ArrayList list = new ArrayList(); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } + } + } + } + } + if (temporary_count >= count) { + count = temporary_count; + commodity_map = temporary_storage_commodity; + } + } + return commodity_map; + } + + /** + * 生成订单单号 + * + * @param conn + * @param ps + * @param rs + * @param order_code + * @param platform_code 正常抓单线程传入的是平台编码,买家退货给卖家处理线程传入的值为退款单号 + * @param tid 正常抓单线程传入的是订单号,买家退货给卖家传入的值为快递单号 + * @return + */ + private String createOrderCode(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String order_code, + String platform_code, String tid) { + String sql = ""; + int seq = 0;// 流水号 + try { + String unique_index = platform_code + "_" + tid; + sql = "insert into tb_seq (platform_code) values (?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, unique_index); + if (ps.executeUpdate() == 0) { + return ""; + } + sql = "select id from tb_seq where platform_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, unique_index); + rs = ps.executeQuery(); + if (rs.next()) { + seq = rs.getInt("id"); + } + order_code = "XT" + order_code + seq; + return order_code; + } catch (SQLException e) { + logger.error(this, e); + return ""; + } catch (Exception e) { + logger.error(this, e); + return ""; + } + } + + /** + * 智能分仓库存查询,temporaryTradeInfoList已经不为空 + * + * @throws Exception + */ + private List getSmartAllotAutoSplitStorageFound(String delivery_storage_company_code, + String storage_code, OrderInfo delivery_storage_orderInfo, List temporaryTradeInfoList, + String delivery_storage_commodity_code, int quantity, int commodity_quantity, int smart_allot_storage_join, + int order_count, TradeInfo copyTradeInfo) throws Exception { + String storage_key = delivery_storage_company_code + "_cs" + storage_code; + if (delivery_storage_orderInfo.order_type == 1 || delivery_storage_orderInfo.order_type == 2) { + if (temporaryTradeInfoList.size() > 0) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(0); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + boolean has_commodity = false; + int commodity_list_size = commodity_list.size(); + for (int i = 0; i < commodity_list_size; i++) { + Commodity c1 = commodity_list.get(i); + if (c1.commodity_code.equals(delivery_storage_commodity_code)) { + has_commodity = true; + c1.flag = c1.storage_commodity_quantity >= c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + if (order_count == 0) { + c1.order_commodity_quantity = c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + } + // c1.storage_commodity_quantity += quantity; + commodity_list.set(i, c1);// 重设c1的值 + if (order_count == 0) { + commodity_list.add(c1);// 对于重复的商品新增一个c1对象,表示commodity_list中的商品子条目数和copyTradeInfo中是一致的 + } + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + if (!has_commodity) { + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.storage_commodity_quantity = quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + /** + * 将copyTradeInfo.orders重置 + */ + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + if (delivery_storage_orderInfo.order_type == 4 || delivery_storage_orderInfo.order_type == 5 + || delivery_storage_orderInfo.order_type == 3) { + boolean has_company = false; + if (temporaryTradeInfoList.size() > 0) { + int temporaryTradeInfoListSize = temporaryTradeInfoList.size(); + for (int i = 0; i < temporaryTradeInfoListSize; i++) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + + String temporaryCompanyCode = ""; + if (temporaryTradeInfo.company_type == 2) { + temporaryCompanyCode = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.company_type == 3) { + temporaryCompanyCode = temporaryTradeInfo.obm_company_code; + } + if (temporaryCompanyCode.equals(delivery_storage_company_code)) { + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + + has_company = true; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + boolean has_commodity = false; + int commodity_list_size = commodity_list.size(); + for (int j = 0; j < commodity_list_size; j++) { + Commodity c1 = commodity_list.get(j); + if (c1.commodity_code.equals(delivery_storage_commodity_code)) { + has_commodity = true; + c1.flag = c1.storage_commodity_quantity >= c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + if (order_count == 0) { + c1.order_commodity_quantity = c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + } + // c1.storage_commodity_quantity += + // quantity; + commodity_list.set(j, c1);// 重设c1的值 + if (order_count == 0) { + commodity_list.add(c1);// 对于重复的商品新增一个c1对象,表示commodity_list中的商品自条目数和copyTradeInfo中是一致的 + } + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + if (!has_commodity) { + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + /** + * 如果没有这个仓库,则新增 + */ + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + } + } + /** + * 如果没找到这家公司或者temporaryTradeInfoList是初始化状态,则新增 + */ + if (!has_company || temporaryTradeInfoList.isEmpty()) { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + + temporaryTradeInfo.obm_company_code = "";// 初始化obm_company_code + temporaryTradeInfo.obm_flag = 0; + temporaryTradeInfo.company_type = 2; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 如果是order_type == 5的子条目,需要更新obm_company_code + */ + if (delivery_storage_orderInfo.order_type == 5 || delivery_storage_orderInfo.order_type == 3) { + temporaryTradeInfo.obm_company_code = delivery_storage_company_code; + temporaryTradeInfo.obm_flag = 1; + temporaryTradeInfo.company_type = 3; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + } + + /** + * 对于order_type == 4或者order_type == 5的条目都要清空orders, + * 并将delivery_storage_orderInfo写入orders,orders从copyTradeInfo拷贝过来是有值的,所以要缩容至1 + * 以写入delivery_storage_orderInfo + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + return temporaryTradeInfoList; + } + + /** + * 智能分仓库存查询,temporaryTradeInfoList为空 + * + * @throws Exception + */ + private List getSmartAllotAutoSplitStorageNotFound(String delivery_storage_company_code, + OrderInfo delivery_storage_orderInfo, List temporaryTradeInfoList, + String delivery_storage_commodity_code, int commodity_quantity, int order_count, TradeInfo copyTradeInfo) + throws Exception { + + /** + * 未查询到商品库存的商品不再写入tradelist,包括未查到库存或者空编码商品,并且发货仓库为默认仓库, + * 其中商品为空的情况,将tradeInfo.null_code改为true + */ + + String storage_key = delivery_storage_company_code + "_cs" + delivery_storage_orderInfo.storage_code; + if (delivery_storage_orderInfo.order_type == 1 || delivery_storage_orderInfo.order_type == 2) { + if (temporaryTradeInfoList.size() > 0) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(0); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } else { + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.storage_commodity_quantity = 0; + c1.flag = false; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + /** + * 将copyTradeInfo.orders重置 + */ + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + if (delivery_storage_orderInfo.order_type == 4 || delivery_storage_orderInfo.order_type == 5 + || delivery_storage_orderInfo.order_type == 3) { + boolean has_company = false; + if (temporaryTradeInfoList.size() > 0) { + int temporaryTradeInfoListSize = temporaryTradeInfoList.size(); + for (int i = 0; i < temporaryTradeInfoListSize; i++) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + + String temporaryCompanyCode = ""; + if (temporaryTradeInfo.company_type == 2) { + temporaryCompanyCode = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.company_type == 3) { + temporaryCompanyCode = temporaryTradeInfo.obm_company_code; + } + if (temporaryCompanyCode.equals(delivery_storage_company_code)) { + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + + has_company = true; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 查不到库存的商品可能是没有库存,或者是为空编码商品 + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } else { + /** + * 如果没有这个仓库,则新增 + */ + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + } + /** + * 如果没找到这家公司或者temporaryTradeInfoList是初始化状态,则新增 + */ + if (!has_company || temporaryTradeInfoList.isEmpty()) { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + temporaryTradeInfo.obm_company_code = "";// 初始化obm_company_code + temporaryTradeInfo.obm_flag = 0; + temporaryTradeInfo.company_type = 2; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 如果是order_type == 5的子条目,需要更新obm_company_code + */ + if (delivery_storage_orderInfo.order_type == 5 || delivery_storage_orderInfo.order_type == 3) { + temporaryTradeInfo.obm_company_code = delivery_storage_company_code; + temporaryTradeInfo.obm_flag = 1; + temporaryTradeInfo.company_type = 3; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + } + /** + * 对于order_type == 4或者order_type == 5的条目都要清空orders, + * 并将delivery_storage_orderInfo写入orders,orders从copyTradeInfo拷贝过来是有值的,所以要缩容至1 + * 以写入delivery_storage_orderInfo + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.smart_allot_storage_join = 0; + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + return temporaryTradeInfoList; + } + + /** + * @param str + * @return commodity + * @title: getCommodityInfo + * @description: 解析从数据库中拿到的商品信息 + */ + private Map getCommodityInfo(String str) throws Exception { + boolean hasComma = str.contains(","); + boolean hasVerticalLine = str.contains("|"); + Map commodity = new HashMap(); + if (hasComma) {// 包含逗号,商品有多个种类 + String[] code = str.split(","); + for (int i = 0; i < code.length; i++) { + if (hasVerticalLine) {// 有竖线,数据正常 + String[] commodityStr = code[i].split("\\|"); + commodity.put(commodityStr[0], commodityStr[1]); + } else {// 无竖线,数据异常 + logger.info("活动规则未指定赠品或赠品信息异常!"); + } + } + return commodity; + } else {// 不包含逗号,商品只有一种或数据异常 + if (hasVerticalLine) {// 有竖线,只有一个商品 + String[] commodityStr = str.split("\\|"); + commodity.put(commodityStr[0], commodityStr[1]); + } else {// 无竖线,数据异常 + logger.info("活动规则未指定赠品或赠品信息异常!"); + } + return commodity; + } + } + + /** + * 活动数量更新线程 + * + * @author Lewis + */ + private class ActivityUpdateThread extends Thread { + @Override + public void run() { + try { + if (activityUpdateQueue.size() > 0) { + GiftNum gn = activityUpdateQueue.get(0); + if (activityUpdate(gn)) { + activityUpdateQueue.remove(0); + } + + logger.info("待更新赠品数量队列总数: [ {} ] ", activityUpdateQueue.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + + private synchronized boolean activityUpdate(GiftNum gn) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + if (gn.type == 1) { + String sql = "update tb_gift_activity_rule set order_current =? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.order_current); + ps.setString(2, gn.rule_code); + } else if (gn.type == 2) { + String sql = "update tb_gift_activity_rule set gift_current =? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.gift_current); + ps.setString(2, gn.rule_code); + } else { + String sql = "update tb_gift_activity_rule set order_current =?,gift_current=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.order_current); + ps.setInt(2, gn.gift_current); + ps.setString(3, gn.rule_code); + } + if (ps.executeUpdate() == 0) { + return false; + } + logger.info("赠品数量更新数据库成功:{},{},{},{}", gn.rule_code, gn.type, gn.order_current, gn.gift_current); + return true; + } catch (SQLException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + } + + /** + * 异常订单处理线程 + * + * @author Lewis + */ + private class ExceptionTradeQueueThread extends Thread { + @Override + public void run() { + try { + logger.info("异常订单写入队列检查开始: [ {} ] ", exceptionTradeQueue.size()); + // 新订单及修改备注消息 + while (exceptionTradeQueue.size() > 0) { + TradeInfo tradeInfo = exceptionTradeQueue.get(0); + tradeQueue.add(tradeInfo); + exceptionTradeQueue.remove(0); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + } + +} diff --git a/src/com/since/emp/analysis/HandlerRecord.java b/src/com/since/emp/analysis/HandlerRecord.java new file mode 100644 index 0000000..38255ab --- /dev/null +++ b/src/com/since/emp/analysis/HandlerRecord.java @@ -0,0 +1,394 @@ +package com.since.emp.analysis; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.GsonBuilder; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; + +import jxl.Sheet; +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; + +/** + * @className: RecordTOExcel + * @description: 将数据写到excel表中 + * @author: Sunshine + * @date: 2019/9/24 14:30 + * @version: 1.0 + */ +public class HandlerRecord { + + private static final Logger logger = LogManager.getLogger(HandlerRecord.class); + public Vector projectRecordVector; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public void start() { + projectRecordVector = new Vector<>(); + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + scheduledThreadPool.scheduleAtFixedRate(new RecordParseThread(), 0, 50, TimeUnit.MILLISECONDS); + } + + /** + * @className: RecordActivityToExcelThread + * @description: 单个线程写入 + * @author: Sunshine + * @date: 2019/9/27 11:14 + * @version: 1.0 + */ + class RecordActivityToExcelThread implements Runnable { + + @Override + public void run() { + while (projectRecordVector.size() > 0) { + //将记录写入excel + //区分出不同的项目名称分别写入不同的表格 + ProjectRecord projectRecord = projectRecordVector.get(0); + if (myRecordToDataBase(projectRecord)) { + logger.info("记录写入数据库成功-{}", new GsonBuilder().disableHtmlEscaping().create().toJson(projectRecord)); + projectRecordVector.remove(0); + } + } + } + } + + /** + * @className: RecordParseThread + * @description: 20个线程并发处理 + * @author: Sunshine + * @date: 2019/9/27 11:14 + * @version: 1.0 + */ + class RecordParseThread implements Runnable { + + @Override + public void run() { + try { + if (projectRecordVector.size() > 0) { + int count = projectRecordVector.size(); + if (count > 20) { + count = 20; + } + + Map projectRecordMap = new ConcurrentHashMap<>(20); + + for (int i = 0; i < count; i++) { + ProjectRecord projectRecord = projectRecordVector.get(0); + String key = projectRecord.getTradeInfoId(); + projectRecordMap.put(key, projectRecord); + projectRecordVector.remove(0); + } + + for (Map.Entry entry : projectRecordMap.entrySet()) { + ProjectRecord projectRecord = entry.getValue(); + logger.info("订单 [ {} ] 已添加至耗时统计处理线程!", entry.getKey()); + threadPool.execute(() -> myRecordToDataBase(projectRecord)); + } + + logger.info("待写入订单处理耗时总数 [ {} ]", projectRecordVector.size()); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + + /** + * @param: projectRecord + * @return: boolean + * @description: 写入记录到Excel表 + * @date: 2019/9/24 15:05 + */ + public boolean recordToExcel(ProjectRecord projectRecord) { + File file = null; + int count = 0; + String orderTotal = "100000单-1"; + try { + file = new File("C:\\Users\\sunshine\\Desktop\\订单同步程序各项耗时统计\\" + orderTotal + "订单处理各项耗时统计表.xls"); + if (file.exists()) { + Workbook readwb = null; + InputStream instream = new FileInputStream(file); + readwb = Workbook.getWorkbook(instream); + Sheet readsheet = readwb.getSheet(0); + count = readsheet.getRows(); + } else { + WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(file)); + // 创建新的一页 + WritableSheet sheet = wwb.createSheet("TradeCheck", 0); + // 创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容 + Label xuhao = new Label(0, 0, "序号"); + sheet.addCell(xuhao); + //程序处理开始时间戳 + Label tradeInfoId = new Label(1, 0, "订单号"); + sheet.addCell(tradeInfoId); + + Label allBeginTime = new Label(2, 0, "程序处理开始时间"); + sheet.addCell(allBeginTime); + Label allEndTime = new Label(3, 0, "程序处理结束时间"); + sheet.addCell(allEndTime); + Label allOnceUseTime = new Label(4, 0, "程序处理单次总耗时"); + sheet.addCell(allOnceUseTime); + + Label activityBeginTime = new Label(5, 0, "活动判断开始时间"); + sheet.addCell(activityBeginTime); + Label activityEndTime = new Label(6, 0, "活动判断结束时间"); + sheet.addCell(activityEndTime); + Label activityUseTime = new Label(7, 0, "活动判断总耗时"); + sheet.addCell(activityUseTime); + + Label obmBeginTime = new Label(8, 0, "代发判断开始时间"); + sheet.addCell(obmBeginTime); + Label obmEndTime = new Label(9, 0, "代发判断结束时间"); + sheet.addCell(obmEndTime); + Label obmUseTime = new Label(10, 0, "代发判断总耗时"); + sheet.addCell(obmUseTime); + + Label storageBeginTime = new Label(11, 0, "分仓判断开始时间"); + sheet.addCell(storageBeginTime); + Label storageEndTime = new Label(12, 0, "分仓判断结束时间"); + sheet.addCell(storageEndTime); + Label storageUseTime = new Label(13, 0, "分仓判断总耗时"); + sheet.addCell(storageUseTime); + + Label basketBeginTime = new Label(14, 0, "货篮判断开始时间"); + sheet.addCell(basketBeginTime); + Label basketEndTime = new Label(15, 0, "货篮判断结束时间"); + sheet.addCell(basketEndTime); + Label basketUseTime = new Label(16, 0, "货篮判断总耗时"); + sheet.addCell(basketUseTime); + + Label insertBeginTime = new Label(17, 0, "写入开始时间"); + sheet.addCell(insertBeginTime); + Label insertEndTime = new Label(18, 0, "写入结束时间"); + sheet.addCell(insertEndTime); + Label insertUseTime = new Label(19, 0, "写入总耗时"); + sheet.addCell(insertUseTime); + + wwb.write(); + wwb.close(); + count++; + } + + Workbook readwb = Workbook.getWorkbook(file); + WritableWorkbook wwb = Workbook.createWorkbook(file, readwb); + // 读取第一张工作表 + WritableSheet sheet = wwb.getSheet(0); + + sheet.addCell(new Label(0, count, String.valueOf(count))); + sheet.addCell(new Label(1, count, String.valueOf(projectRecord.getTradeInfoId()))); + + sheet.addCell(new Label(2, count, String.valueOf(projectRecord.getAllBeginTime()))); + sheet.addCell(new Label(3, count, String.valueOf(projectRecord.getAllEndTime()))); + sheet.addCell(new Label(4, count, String.valueOf(projectRecord.getAllOnceUseTime()))); + + sheet.addCell(new Label(5, count, String.valueOf(projectRecord.getActivityBeginTime()))); + sheet.addCell(new Label(6, count, String.valueOf(projectRecord.getActivityEndTime()))); + sheet.addCell(new Label(7, count, String.valueOf(projectRecord.getActivityUseTime()))); + + sheet.addCell(new Label(8, count, String.valueOf(projectRecord.getObmBeginTime()))); + sheet.addCell(new Label(9, count, String.valueOf(projectRecord.getObmEndTime()))); + sheet.addCell(new Label(10, count, String.valueOf(projectRecord.getObmUseTime()))); + + sheet.addCell(new Label(11, count, String.valueOf(projectRecord.getStorageBeginTime()))); + sheet.addCell(new Label(12, count, String.valueOf(projectRecord.getStorageEndTime()))); + sheet.addCell(new Label(13, count, String.valueOf(projectRecord.getStorageUseTime()))); + + sheet.addCell(new Label(14, count, String.valueOf(projectRecord.getBasketBeginTime()))); + sheet.addCell(new Label(15, count, String.valueOf(projectRecord.getBasketEndTime()))); + sheet.addCell(new Label(16, count, String.valueOf(projectRecord.getBasketUseTime()))); + + sheet.addCell(new Label(17, count, String.valueOf(projectRecord.getInsertBeginTime()))); + sheet.addCell(new Label(18, count, String.valueOf(projectRecord.getInsertEndTime()))); + sheet.addCell(new Label(19, count, String.valueOf(projectRecord.getInsertUseTime()))); + wwb.write(); + wwb.close(); + readwb.close(); + return true; + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + /** + * @param: projectRecord + * @return: boolean + * @description: 写入记录到Excel表 + * @date: 2019/9/24 15:05 + */ + public boolean myRecordToExcel(ProjectRecord projectRecord) { + File file = null; + int count = 0; + String orderTotal = "10000单-1"; + try { + file = new File("C:\\Users\\sunshine\\Desktop\\订单同步程序各项耗时统计\\" + orderTotal + "订单处理各项耗时统计表.xls"); + if (file.exists()) { + Workbook readwb = null; + InputStream instream = new FileInputStream(file); + readwb = Workbook.getWorkbook(instream); + Sheet readsheet = readwb.getSheet(0); + count = readsheet.getRows(); + } else { + WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(file)); + // 创建新的一页 + WritableSheet sheet = wwb.createSheet("TradeCheck", 0); + // 创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容 + Label xuhao = new Label(0, 0, "序号"); + sheet.addCell(xuhao); + //程序处理开始时间戳 + Label tradeInfoId = new Label(1, 0, "订单号"); + sheet.addCell(tradeInfoId); + + Label allOnceUseTime = new Label(2, 0, "程序处理单次总耗时"); + sheet.addCell(allOnceUseTime); + + Label activityUseTime = new Label(3, 0, "活动判断总耗时"); + sheet.addCell(activityUseTime); + + Label obmUseTime = new Label(4, 0, "代发判断总耗时"); + sheet.addCell(obmUseTime); + + Label storageUseTime = new Label(5, 0, "分仓判断总耗时"); + sheet.addCell(storageUseTime); + + Label basketUseTime = new Label(6, 0, "货篮判断总耗时"); + sheet.addCell(basketUseTime); + + Label insertUseTime = new Label(7, 0, "写入总耗时"); + sheet.addCell(insertUseTime); + Label sumUseTime = new Label(8, 0, "sum"); + sheet.addCell(sumUseTime); + wwb.write(); + wwb.close(); + count++; + } + + Workbook readwb = Workbook.getWorkbook(file); + WritableWorkbook wwb = Workbook.createWorkbook(file, readwb); + // 读取第一张工作表 + WritableSheet sheet = wwb.getSheet(0); + + sheet.addCell(new Label(0, count, String.valueOf(count))); + sheet.addCell(new Label(1, count, String.valueOf(projectRecord.getTradeInfoId()))); + + sheet.addCell(new Label(2, count, String.valueOf(projectRecord.getAllOnceUseTime()))); + + sheet.addCell(new Label(3, count, String.valueOf(projectRecord.getActivityUseTime()))); + + sheet.addCell(new Label(4, count, String.valueOf(projectRecord.getObmUseTime()))); + + sheet.addCell(new Label(5, count, String.valueOf(projectRecord.getStorageUseTime()))); + + sheet.addCell(new Label(6, count, String.valueOf(projectRecord.getBasketUseTime()))); + + sheet.addCell(new Label(7, count, String.valueOf(projectRecord.getInsertUseTime()))); + long sum = projectRecord.getActivityUseTime() + + projectRecord.getObmUseTime() + + projectRecord.getBasketUseTime() + + projectRecord.getStorageUseTime() + + projectRecord.getInsertUseTime(); + sheet.addCell(new Label(8, count, String.valueOf(sum))); + wwb.write(); + wwb.close(); + readwb.close(); + return true; + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + /** + * @param: projectRecord + * @return: boolean + * @description: 写入记录到Excel表 + * @date: 2019/9/24 15:05 + */ + public boolean myRecordToDataBase(ProjectRecord projectRecord) { + DbPoolConnection dbPoolConnection = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + try { + conn = dbPoolConnection.getConnection(); + conn.setAutoCommit(false); + String sql = "insert into tb_ordersync_analysis (order_code,handler_use_time,activity_use_time,obm_use_time,storage_use_time,basket_use_time,write_order_use_time,sum_handler,unsend_quantity_use_time,saleable_quantity_use_time) values(?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, projectRecord.getTradeInfoId()); + ps.setLong(2, projectRecord.getAllOnceUseTime()); + ps.setLong(3, projectRecord.getActivityUseTime()); + ps.setLong(4, projectRecord.getObmUseTime()); + ps.setLong(5, projectRecord.getStorageUseTime()); + ps.setLong(6, projectRecord.getBasketUseTime()); + ps.setLong(7, projectRecord.getInsertUseTime()); + long sum = projectRecord.getActivityUseTime() + + projectRecord.getObmUseTime() + + projectRecord.getBasketUseTime() + + projectRecord.getStorageUseTime() + + projectRecord.getInsertUseTime(); + ps.setLong(8, sum); + ps.setLong(9, projectRecord.getExecuteUnsendSqlUseTime()); + ps.setLong(10, projectRecord.getExecuteSaleableSqlUseTime()); + if (ps.executeUpdate() == 1) { + return true; + } + } catch (Exception e) { + try { + logger.error(this, e); + if (conn != null) { + conn.rollback(); + } + } catch (Exception e1) { + logger.error(this, e1); + } + } finally { + try { + if (conn != null) { + conn.setAutoCommit(true); + } + } catch (SQLException e) { + logger.error(this, e); + } + if (ps != null) { + try { + ps.close(); + + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + try { + if (conn != null) { + conn.close(); + } + + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + return false; + } +} diff --git a/src/com/since/emp/analysis/ProjectRecord.java b/src/com/since/emp/analysis/ProjectRecord.java new file mode 100644 index 0000000..0e18f38 --- /dev/null +++ b/src/com/since/emp/analysis/ProjectRecord.java @@ -0,0 +1,277 @@ +package com.since.emp.analysis; + +/** + * @className: CountProgramUseTime + * @description: 统计程序运行使用时间 + * @author: Sunshine + * @date: 2019/9/24 14:03 + * @version: 1.0 + */ +public class ProjectRecord { + + /** + * 订单号 + */ + private String tradeInfoId; + + /** + * 每单处理开始时间 + */ + private long allBeginTime; + private long allEndTime; + private long allOnceUseTime; + + private long activityBeginTime; + private long activityEndTime; + private long activityUseTime; + + private long obmBeginTime; + private long obmEndTime; + private long obmUseTime; + + private long storageBeginTime; + private long storageEndTime; + private long storageUseTime; + + private long basketBeginTime; + private long basketEndTime; + private long basketUseTime; + + private long insertBeginTime; + private long insertEndTime; + private long insertUseTime; + + private long executeUnsendSqlBeginTime; + private long executeUnsendSqlEndTime; + private long executeUnsendSqlUseTime; + + private long executeSaleableSqlBeginTime; + private long executeSaleableSqlEndTime; + private long executeSaleableSqlUseTime; + + public long getExecuteUnsendSqlBeginTime() { + return executeUnsendSqlBeginTime; + } + + public ProjectRecord setExecuteUnsendSqlBeginTime(long executeUnsendSqlBeginTime) { + this.executeUnsendSqlBeginTime = executeUnsendSqlBeginTime; + return this; + } + + public long getExecuteUnsendSqlEndTime() { + return executeUnsendSqlEndTime; + } + + public ProjectRecord setExecuteUnsendSqlEndTime(long executeUnsendSqlEndTime) { + this.executeUnsendSqlEndTime = executeUnsendSqlEndTime; + return this; + } + + public long getExecuteUnsendSqlUseTime() { + return executeUnsendSqlUseTime; + } + + public ProjectRecord setExecuteUnsendSqlUseTime(long executeUnsendSqlUseTime) { + this.executeUnsendSqlUseTime = executeUnsendSqlUseTime; + return this; + } + + public long getExecuteSaleableSqlBeginTime() { + return executeSaleableSqlBeginTime; + } + + public ProjectRecord setExecuteSaleableSqlBeginTime(long executeSaleableSqlBeginTime) { + this.executeSaleableSqlBeginTime = executeSaleableSqlBeginTime; + return this; + } + + public long getExecuteSaleableSqlEndTime() { + return executeSaleableSqlEndTime; + } + + public ProjectRecord setExecuteSaleableSqlEndTime(long executeSaleableSqlEndTime) { + this.executeSaleableSqlEndTime = executeSaleableSqlEndTime; + return this; + } + + public long getExecuteSaleableSqlUseTime() { + return executeSaleableSqlUseTime; + } + + public ProjectRecord setExecuteSaleableSqlUseTime(long executeSaleableSqlUseTime) { + this.executeSaleableSqlUseTime = executeSaleableSqlUseTime; + return this; + } + + public String getTradeInfoId() { + return tradeInfoId; + } + + public ProjectRecord setTradeInfoId(String tradeInfoId) { + this.tradeInfoId = tradeInfoId; + return this; + } + + public long getAllBeginTime() { + return allBeginTime; + } + + public ProjectRecord setAllBeginTime(long allBeginTime) { + this.allBeginTime = allBeginTime; + return this; + } + + public long getAllEndTime() { + return allEndTime; + } + + public ProjectRecord setAllEndTime(long allEndTime) { + this.allEndTime = allEndTime; + return this; + } + + public long getAllOnceUseTime() { + return allOnceUseTime; + } + + public ProjectRecord setAllOnceUseTime(long allOnceUseTime) { + this.allOnceUseTime = allOnceUseTime; + return this; + } + + public long getActivityBeginTime() { + return activityBeginTime; + } + + public ProjectRecord setActivityBeginTime(long activityBeginTime) { + this.activityBeginTime = activityBeginTime; + return this; + } + + public long getActivityEndTime() { + return activityEndTime; + } + + public ProjectRecord setActivityEndTime(long activityEndTime) { + this.activityEndTime = activityEndTime; + return this; + } + + public long getActivityUseTime() { + return activityUseTime; + } + + public ProjectRecord setActivityUseTime(long activityUseTime) { + this.activityUseTime = activityUseTime; + return this; + } + + public long getObmBeginTime() { + return obmBeginTime; + } + + public ProjectRecord setObmBeginTime(long obmBeginTime) { + this.obmBeginTime = obmBeginTime; + return this; + } + + public long getObmEndTime() { + return obmEndTime; + } + + public ProjectRecord setObmEndTime(long obmEndTime) { + this.obmEndTime = obmEndTime; + return this; + } + + public long getObmUseTime() { + return obmUseTime; + } + + public ProjectRecord setObmUseTime(long obmUseTime) { + this.obmUseTime = obmUseTime; + return this; + } + + public long getStorageBeginTime() { + return storageBeginTime; + } + + public ProjectRecord setStorageBeginTime(long storageBeginTime) { + this.storageBeginTime = storageBeginTime; + return this; + } + + public long getStorageEndTime() { + return storageEndTime; + } + + public ProjectRecord setStorageEndTime(long storageEndTime) { + this.storageEndTime = storageEndTime; + return this; + } + + public long getStorageUseTime() { + return storageUseTime; + } + + public ProjectRecord setStorageUseTime(long storageUseTime) { + this.storageUseTime = storageUseTime; + return this; + } + + public long getBasketBeginTime() { + return basketBeginTime; + } + + public ProjectRecord setBasketBeginTime(long basketBeginTime) { + this.basketBeginTime = basketBeginTime; + return this; + } + + public long getBasketEndTime() { + return basketEndTime; + } + + public ProjectRecord setBasketEndTime(long basketEndTime) { + this.basketEndTime = basketEndTime; + return this; + } + + public long getBasketUseTime() { + return basketUseTime; + } + + public ProjectRecord setBasketUseTime(long basketUseTime) { + this.basketUseTime = basketUseTime; + return this; + } + + public long getInsertBeginTime() { + return insertBeginTime; + } + + public ProjectRecord setInsertBeginTime(long insertBeginTime) { + this.insertBeginTime = insertBeginTime; + return this; + } + + public long getInsertEndTime() { + return insertEndTime; + } + + public ProjectRecord setInsertEndTime(long insertEndTime) { + this.insertEndTime = insertEndTime; + return this; + } + + public long getInsertUseTime() { + return insertUseTime; + } + + public ProjectRecord setInsertUseTime(long insertUseTime) { + this.insertUseTime = insertUseTime; + return this; + } +} + diff --git a/src/com/since/emp/analysis/StOrderSync_lxy.java b/src/com/since/emp/analysis/StOrderSync_lxy.java new file mode 100644 index 0000000..4b0b11d --- /dev/null +++ b/src/com/since/emp/analysis/StOrderSync_lxy.java @@ -0,0 +1,415 @@ +package com.since.emp.analysis; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.StorageUpdate; + +/** + * + * @className:StOrderSync_lxy + * @description:性能测试 + * @author:Sunshine + * @date:2019年10月15日 上午9:39:23 + */ +public class StOrderSync_lxy extends OrderSyncs { + + private static final Logger logger = LogManager.getLogger(StOrderSync_lxy.class); + private static String config_filename = "config_all.ini"; + private static String[][] items; + private static String storageUpdateTime; + public static int order_count; + public static int platform_code; + + public static void main(String[] args) { + + // 读取文件配置 + if (!initFileConfig()) { + logger.info("【初始化】文件读取配置失败"); + return; + } + logger.info("【初始化】文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.info("【初始化】数据库读取配置失败"); + e.printStackTrace(); + return; + } + logger.info("【初始化】数据库读取配置成功"); + + // 数据处理类启动 + analysisDataParse = new AnalysisDataParse(); + analysisDataParse.start(); + + //统计处理类启动 + handlerRecord = new HandlerRecord(); + handlerRecord.start(); + + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, "1970-01-01 00:00:00", + "1970-01-01 00:00:00"); + storageUpdate.start(); + + /** + * TODO + * 1.活动判断 + * 1.1 商品只满足一个活动 商品数量为一个 + * 1.2 商品满足多个活动 商品数量为多个 + * 2.代发判断 + * + * 3.分仓判断 + * + * 4.货篮判断 + * + * 5.订单写入 + * + */ + + + // 平台订单号 + long count2 = platform_code; + int num = order_count; + boolean myFlag = true; + while (num > 0) { + num--; + + TradeInfo tradeInfo = new TradeInfo(); + tradeInfo.orders = new OrderInfo[1]; + + String money = "190"; + // 仓库编码 + tradeInfo.storage_code = "201709251"; + // 公司编码 + tradeInfo.company_code = "122"; + // 店铺编码 + tradeInfo.shop_code = "20180205210"; + // 2:普通商家,3:品牌商 + tradeInfo.company_type = 2; + + tradeInfo.type = "fixed"; + + tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; +// tradeInfo.trade_type = "taobao_trade_TradeBuyerStepPay"; + tradeInfo.tid = String.valueOf(count2); + tradeInfo.brand = ""; + tradeInfo.adjust_fee = "0"; + tradeInfo.alipay_id = "3434"; + tradeInfo.alipay_no = "5435"; + // tradeInfo.buyer_memo = "买家备注"; + tradeInfo.seller_memo = ""; + tradeInfo.buyer_message = ""; + // 0:无发票,1:有发票 + tradeInfo.invoice_type = 0; + tradeInfo.invoice_money = "100"; + tradeInfo.delivery_mode_id = 2; + + tradeInfo.buyer_nick = "test20190925"; + tradeInfo.buyer_obtain_point_fee = 20; + tradeInfo.buyer_rate = false; + tradeInfo.cod_fee = "dfaf"; + tradeInfo.cod_status = "NEW_CREATED"; +// tradeInfo.company_code = "31201608100018"; + + tradeInfo.discount_fee = "0"; + tradeInfo.has_post_fee = true; + tradeInfo.money = money; + tradeInfo.num = 2; + + tradeInfo.status = "WAIT_SELLER_SEND_GOODS"; + + // 设置日期格式 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long time = System.currentTimeMillis(); + Date now = new Date(time); + tradeInfo.pay_time = df.format(now); + tradeInfo.created = "2019-10-27 10:27:28"; + tradeInfo.pay_mode_id = 2; + + tradeInfo.receiver_country = ""; + tradeInfo.receiver_country = "中国"; + + tradeInfo.receiver_state = "上海"; + tradeInfo.receiver_city = "上海市"; + tradeInfo.receiver_district = "浦东新区"; + + tradeInfo.receiver_zip = "110000"; + tradeInfo.receiver_name = "秋雨凉凉"; + tradeInfo.receiver_address = "克东路22弄"; + + tradeInfo.receiver_mobile = "13112314565"; + tradeInfo.platform_code = "003"; + + tradeInfo.pay_money = money; + tradeInfo.product_fee = "190"; + tradeInfo.post_fee = "8"; + + //只有一件商品 + tradeInfo.orders[0] = new OrderInfo(); + tradeInfo.orders[0].buyer_rate = true; + // "632.008";//平台商家编码 + tradeInfo.orders[0].platform_seller_code = "008"; + tradeInfo.orders[0].cid = "2"; + tradeInfo.orders[0].num = 1; + tradeInfo.orders[0].discount_fee = "0"; + tradeInfo.orders[0].price = "190"; + tradeInfo.orders[0].payment = "190"; + tradeInfo.orders[0].sku_properties_name = "8"; + tradeInfo.orders[0].total_fee = "190"; + tradeInfo.orders[0].adjust_fee = "0"; + tradeInfo.orders[0].status = "1111"; + tradeInfo.orders[0].title = "空气凤梨"; + tradeInfo.orders[0].gift_type = 1; + tradeInfo.orders[0].divide_order_fee = "150"; + tradeInfo.orders[0].order_buyer_payment = "150"; + //多件商品 + +// if (platform_code > 5999 && platform_code < 6999) { +// tradeInfo.orders[0] = new OrderInfo(); +// tradeInfo.orders[0].buyer_rate = true; +// +// // "632.008";//平台商家编码 +// tradeInfo.orders[0].platform_seller_code = "015"; +// +// tradeInfo.orders[0].cid = "2"; +// tradeInfo.orders[0].num = 1; +// tradeInfo.orders[0].discount_fee = "0"; +// tradeInfo.orders[0].price = "287"; +// tradeInfo.orders[0].payment = "287"; +// tradeInfo.orders[0].sku_properties_name = "8"; +// tradeInfo.orders[0].total_fee = "287"; +// tradeInfo.orders[0].adjust_fee = "0"; +// tradeInfo.orders[0].status = "1111"; +// tradeInfo.orders[0].title = "买一送一"; +// tradeInfo.orders[0].gift_type = 1; +// tradeInfo.orders[0].divide_order_fee = "150"; +// tradeInfo.orders[0].order_buyer_payment = "150"; +// +// } else { +// tradeInfo.orders[0] = new OrderInfo(); +// tradeInfo.orders[1] = new OrderInfo(); +// tradeInfo.orders[0].buyer_rate = true; +// if (platform_code > 6999 && platform_code < 7999) { +// tradeInfo.orders[0].platform_seller_code = "011";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "012";// "632.008";//平台商家编码 +// } else if (platform_code > 7999 && platform_code < 8999) { +// tradeInfo.orders[0].platform_seller_code = "015";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 +// } else if (platform_code > 8999 && platform_code < 9999) { +// tradeInfo.orders[0].platform_seller_code = "018";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "022";// "632.008";//平台商家编码 +// } else if (platform_code > 9999 && platform_code < 10999) { +// tradeInfo.orders[0].platform_seller_code = "021";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 +// } else if (platform_code > 10999 && platform_code < 11999) { +// tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "021";// "632.008";//平台商家编码 +// } else if (platform_code > 11999 && platform_code < 12999) { +// tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 +// } else if (platform_code > 12999 && platform_code < 13999) { +// tradeInfo.orders[0].platform_seller_code = "016";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "020";// "632.008";//平台商家编码 +// } else if (platform_code > 13999 && platform_code < 14999) { +// tradeInfo.orders[0].platform_seller_code = "015";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "020";// "632.008";//平台商家编码 +// } else if (platform_code > 14999 && platform_code < 15999) { +// tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "021";// "632.008";//平台商家编码 +// } else if (platform_code > 15999 && platform_code < 16999) { +// tradeInfo.orders[0].platform_seller_code = "020";// "632.008";//平台商家编码 +// tradeInfo.orders[1].platform_seller_code = "030";// "632.008";//平台商家编码 +// } +// tradeInfo.orders[0].cid = "2"; +// tradeInfo.orders[0].num = 1; +// tradeInfo.orders[0].discount_fee = "0"; +// tradeInfo.orders[0].price = "287"; +// tradeInfo.orders[0].payment = "287"; +// tradeInfo.orders[0].sku_properties_name = "8"; +// tradeInfo.orders[0].total_fee = "287"; +// tradeInfo.orders[0].adjust_fee = "0"; +// tradeInfo.orders[0].status = "1111"; +// tradeInfo.orders[0].title = "买一送一"; +// tradeInfo.orders[0].gift_type = 1; +// tradeInfo.orders[0].divide_order_fee = "150"; +// tradeInfo.orders[0].order_buyer_payment = "150"; +// +// tradeInfo.orders[1].buyer_rate = true; +// tradeInfo.orders[1].cid = "2"; +// tradeInfo.orders[1].num = 1; +// tradeInfo.orders[1].discount_fee = "0"; +// tradeInfo.orders[1].price = "180"; +// tradeInfo.orders[1].payment = "200.07"; +// tradeInfo.orders[1].sku_properties_name = "8"; +// tradeInfo.orders[1].total_fee = "60"; +// tradeInfo.orders[1].adjust_fee = "2"; +// tradeInfo.orders[1].status = "1111"; +// tradeInfo.orders[1].title = "不送不送"; +// tradeInfo.orders[1].gift_type = 1; +// tradeInfo.orders[1].divide_order_fee = "180"; +// tradeInfo.orders[1].order_buyer_payment = "180"; +// tradeInfo.fenxiaoInfo = new FenxiaoInfo(); +// } + + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + + if (myFlag) { + try { + Thread.sleep(10 * 1000); + // Thread.yield(); + } catch (Exception e) { + logger.error(StOrderSync_lxy.class, e); + } + } + + myFlag = false; + OrderSyncs.analysisDataParse.tradeQueue.add(tradeInfo); + //预售 + // OrderSyncs.dataParse.pretradeQueue.add(tradeInfo); + count2++; + + } + } + + + + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + order_count = Integer.valueOf(iniReader.getValue("sttest", "orderCount")); + platform_code = Integer.valueOf(iniReader.getValue("sttest", "platform_code")); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = new ArrayList(); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = new ArrayList(); + config.plats.add(pc); + } + res = true; + } catch (IOException e) { + logger.error(StOrderSync_lxy.class, e); + } catch (Exception e) { + logger.error(StOrderSync_lxy.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + + String sql = "select " + "c.platform_code," + "c.code as app_code," + "c.key as app_key," + + "c.secret as app_secret," + "a.company_code as shop_company_code," + "a.code as shop_code," + + "a.name as shop_name," + "a.session_key as shop_session_key," + "b.name as shop_brand" + " from " + + "tb_shop a," + "tb_brand_dic b," + "tb_platform_app c" + " where " + "a.brand_code = b.code" + + " and a.del_flag = 1" + " and a.app_code = c.code" + " and c.del_flag = 1" + + " and a.company_code = b.company_code"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 先判断app是否存在 + String plat_code = rs.getString("platform_code"); + String app_code = rs.getString("app_code"); + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig plat_config = config.plats.get(i); + if (plat_code.equals(plat_config.plat_code)) { + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.brand = rs.getString("shop_brand"); + for (int j = 0; j < plat_config.apps.size(); j++) { + AppConfig app_config = plat_config.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = new ArrayList(); + appConfig.shops.add(shopConfig); + plat_config.apps.add(appConfig); + } + break; + } + } + } + res = true; + } catch (Exception e) { + logger.error(StOrderSync_lxy.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(StOrderSync_lxy.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(StOrderSync_lxy.class, e); + } + conn = null; + } + } + return res; + } +} diff --git a/src/com/since/emp/base/AgentStorage.java b/src/com/since/emp/base/AgentStorage.java new file mode 100644 index 0000000..1cf5037 --- /dev/null +++ b/src/com/since/emp/base/AgentStorage.java @@ -0,0 +1,16 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/** + * 库龄排序参数类,在查询最长库龄时记录 + * @author Lewis + * + */ +public class AgentStorage implements Serializable{ + private static final long serialVersionUID = -1007249945464422289L; + public String storageCode;//仓库编码 + public String create_time;//库龄 + public int count;//统计与订单中商品匹配的次数 + public int smart_allot_storage_join;//仓库是否开启智能分仓 +} diff --git a/src/com/since/emp/base/Basket.java b/src/com/since/emp/base/Basket.java new file mode 100644 index 0000000..3a6f68a --- /dev/null +++ b/src/com/since/emp/base/Basket.java @@ -0,0 +1,15 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/*** + * 篮子内容- 货篮编号 货篮子条目的商品数量之和 企业编号 货篮内容 -- + ***/ + +public class Basket implements Serializable { + private static final long serialVersionUID = -449126785790936824L; + public String code;// 货篮编号 + public int b_num;// 货篮子条目的商品数量之和 + public String company_code;// 企业编号 + public Item[] items = {};// 货篮内容 +} diff --git a/src/com/since/emp/base/Commodity.java b/src/com/since/emp/base/Commodity.java new file mode 100644 index 0000000..c3bf502 --- /dev/null +++ b/src/com/since/emp/base/Commodity.java @@ -0,0 +1,35 @@ +package com.since.emp.base; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +/** + * 分仓订单中商品查重 + */ +public class Commodity implements Serializable { + static final long serialVersionUID = -8084210473720589252L; + public String commodity_code;// 商品的编码 + public int order_commodity_quantity;// 商品目前出现的总数量 + public boolean flag;// 这个商品编码目前的仓库是否可发货 + public int storage_commodity_quantity;// 仓库中该商品在不同货架不同货位的总库存数量 + public int smart_allot_storage_join;// 是否参加智能分仓,1:不参加,2:参加 + + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } +} diff --git a/src/com/since/emp/base/Config.java b/src/com/since/emp/base/Config.java new file mode 100644 index 0000000..e625c13 --- /dev/null +++ b/src/com/since/emp/base/Config.java @@ -0,0 +1,20 @@ +package com.since.emp.base; + +import java.util.List; + +import com.since.emp.service.OrderSyncs.PlatConfig; + +/** + * 综合参数类 + */ +public class Config { + + public String db_host; + public String db_port; + public String db_name; + public String db_user; + public String db_password; + + public String globe_plats; + public List plats; +} diff --git a/src/com/since/emp/base/DbPoolConnection.java b/src/com/since/emp/base/DbPoolConnection.java new file mode 100644 index 0000000..f679298 --- /dev/null +++ b/src/com/since/emp/base/DbPoolConnection.java @@ -0,0 +1,116 @@ +package com.since.emp.base; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidDataSourceFactory; +import com.alibaba.druid.pool.DruidPooledConnection; + +/** + * 要实现单例模式,保证全局只有一个数据库连接池 + */ +public class DbPoolConnection { + private static final Logger logger = LogManager.getLogger(DbPoolConnection.class); + private static DruidDataSource druidDataSource = null; + + static { + + Init(); + } + + private static void Init() { + try { + Properties properties = loadPropertiesFile(); + logger.info("读取数据库配置文件成功"); + Properties masterProperties = new Properties(); + masterProperties.setProperty("DriverClassName", properties.getProperty("master.DriverClassName")); + masterProperties.setProperty("url", properties.getProperty("master.url")); + masterProperties.setProperty("username", properties.getProperty("master.username")); + masterProperties.setProperty("password", properties.getProperty("master.password")); + masterProperties.setProperty("filters", properties.getProperty("master.filters")); + masterProperties.setProperty("initialSize", properties.getProperty("master.initialSize")); + masterProperties.setProperty("maxActive", properties.getProperty("master.maxActive")); + masterProperties.setProperty("maxWait", properties.getProperty("master.maxWait")); + masterProperties.setProperty("timeBetweenEvictionRunsMillis", + properties.getProperty("master.timeBetweenEvictionRunsMillis")); + masterProperties.setProperty("minEvictableIdleTimeMillis", + properties.getProperty("master.minEvictableIdleTimeMillis")); + masterProperties.setProperty("validationQuery", properties.getProperty("master.validationQuery")); + masterProperties.setProperty("testWhileIdle", properties.getProperty("master.testWhileIdle")); + masterProperties.setProperty("testOnBorrow", properties.getProperty("master.testOnBorrow")); + masterProperties.setProperty("testOnReturn", properties.getProperty("master.testOnReturn")); + masterProperties.setProperty("poolPreparedStatements", + properties.getProperty("master.poolPreparedStatements")); + masterProperties.setProperty("maxPoolPreparedStatementPerConnectionSize", + properties.getProperty("master.maxPoolPreparedStatementPerConnectionSize")); + druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(masterProperties); // DruidDataSrouce工厂模式 + // TODO 调试配置,用完删除 + druidDataSource.setRemoveAbandoned(true); + druidDataSource.setRemoveAbandonedTimeout(600); + druidDataSource.setLogAbandoned(true); + druidDataSource.setTimeBetweenConnectErrorMillis(60000); + } catch (Exception e) { + logger.error("读取数据库配置文件失败"); + logger.error(DbPoolConnection.class, e); + } + } + + /** + * 使用静态内部类实现数据库连接池单例 + * + * @return + */ + + private static class DbPoolInner { + private final static DbPoolConnection dbPoolConnection = new DbPoolConnection(); + } + + public static DbPoolConnection getInstance() { + return DbPoolInner.dbPoolConnection; + } + + /** + * 返回druid数据库连接 + * + * @return + * @throws Exception + */ + public DruidPooledConnection getConnection() throws Exception { +// logger.info("数据库连接情况:{}", druidDataSource.dump()); + // logger.info("【" + logTitle + "】" +"活跃的数据库连接:" + + // druidDataSource.getActiveConnectionStackTrace()); + return druidDataSource.getConnection(); + } + + /** + * + * @return Properties对象 + */ + private static Properties loadPropertiesFile() { + InputStream inputStream = null; + Properties p = null; + try { + inputStream = new FileInputStream(new File("db.properties"));// 原来是决定路径,现在用相对路径 + p = new Properties(); + p.load(inputStream); + } catch (Exception e) { + logger.error(DbPoolConnection.class, e); + } finally { + try { + if (null != inputStream) { + inputStream.close(); + } + } catch (Exception e) { + logger.error(DbPoolConnection.class, e); + } + } + return p; + } + +} diff --git a/src/com/since/emp/base/DbPoolConnection_MiHe.java b/src/com/since/emp/base/DbPoolConnection_MiHe.java new file mode 100644 index 0000000..93166ba --- /dev/null +++ b/src/com/since/emp/base/DbPoolConnection_MiHe.java @@ -0,0 +1,120 @@ +package com.since.emp.base; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidDataSourceFactory; +import com.alibaba.druid.pool.DruidPooledConnection; + +/** + * 要实现单例模式,保证全局只有一个数据库连接池 + */ +public class DbPoolConnection_MiHe { + private static Logger logger; + private static DruidDataSource druidDataSource = null; + + static { + Init(); + } + + private static void Init() { + try { + logger = LogManager.getLogger(DbPoolConnection_MiHe.class.getName()); + Properties properties = loadPropertiesFile("db.properties"); + Properties miheProperties = new Properties(); + miheProperties.setProperty("DriverClassName", properties.getProperty("mihe.DriverClassName")); + miheProperties.setProperty("url", properties.getProperty("mihe.url")); + miheProperties.setProperty("username", properties.getProperty("mihe.username")); + miheProperties.setProperty("password", properties.getProperty("mihe.password")); + miheProperties.setProperty("filters", properties.getProperty("mihe.filters")); + miheProperties.setProperty("initialSize", properties.getProperty("mihe.initialSize")); + miheProperties.setProperty("maxActive", properties.getProperty("mihe.maxActive")); + miheProperties.setProperty("maxWait", properties.getProperty("mihe.maxWait")); + miheProperties.setProperty("timeBetweenEvictionRunsMillis", + properties.getProperty("mihe.timeBetweenEvictionRunsMillis")); + miheProperties.setProperty("minEvictableIdleTimeMillis", + properties.getProperty("mihe.minEvictableIdleTimeMillis")); + miheProperties.setProperty("validationQuery", properties.getProperty("mihe.validationQuery")); + miheProperties.setProperty("testWhileIdle", properties.getProperty("mihe.testWhileIdle")); + miheProperties.setProperty("testOnBorrow", properties.getProperty("mihe.testOnBorrow")); + miheProperties.setProperty("testOnReturn", properties.getProperty("mihe.testOnReturn")); + miheProperties.setProperty("poolPreparedStatements", properties.getProperty("mihe.poolPreparedStatements")); + miheProperties.setProperty("maxPoolPreparedStatementPerConnectionSize", + properties.getProperty("mihe.maxPoolPreparedStatementPerConnectionSize")); + logger.info("读取数据库配置文件成功"); + druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(miheProperties); // DruidDataSrouce工厂模式 + // TODO 调试配置,用完删除 + druidDataSource.setRemoveAbandoned(true); + druidDataSource.setRemoveAbandonedTimeout(600); + druidDataSource.setLogAbandoned(true); + // druidDataSource.setBreakAfterAcquireFailure(true); + druidDataSource.setTimeBetweenConnectErrorMillis(60000); + // druidDataSource.setConnectionErrorRetryAttempts(0); + } catch (Exception e) { + logger.error("读取数据库配置文件失败"); + logger.error(DbPoolConnection_MiHe.class, e); + } + } + + /** + * 使用静态内部类实现数据库连接池单例 + * + * @return + */ + + private static class DbPoolInner { + private final static DbPoolConnection_MiHe dbPoolConnection = new DbPoolConnection_MiHe(); + } + + public static DbPoolConnection_MiHe getInstance() { + return DbPoolInner.dbPoolConnection; + } + + /** + * 返回druid数据库连接 + * + * @return + * @throws Exception + */ + public DruidPooledConnection getConnection() throws Exception { +// logger.info("数据库连接情况:{}", druidDataSource.dump()); + // logger.info("【" + logTitle + "】" +"活跃的数据库连接:" + + // druidDataSource.getActiveConnectionStackTrace()); + return druidDataSource.getConnection(); + } + + /** + * @param string 配置文件名 + * @return Properties对象 + */ + private static Properties loadPropertiesFile(String fullFile) { + if (null == fullFile || fullFile.equals("")) { + throw new IllegalArgumentException("Properties file path can not be null" + fullFile); + } + InputStream inputStream = null; + Properties p = null; + try { + inputStream = new FileInputStream(new File(fullFile));// 原来是决定路径,现在用相对路径 + p = new Properties(); + p.load(inputStream); + } catch (Exception e) { + logger.error(DbPoolConnection_MiHe.class, e); + } finally { + try { + if (null != inputStream) { + inputStream.close(); + } + } catch (Exception e) { + logger.error(DbPoolConnection_MiHe.class, e); + } + } + return p; + } + +} diff --git a/src/com/since/emp/base/DbUtil.java b/src/com/since/emp/base/DbUtil.java new file mode 100644 index 0000000..6732939 --- /dev/null +++ b/src/com/since/emp/base/DbUtil.java @@ -0,0 +1,49 @@ +package com.since.emp.base; + +import java.sql.Connection; +import java.sql.DriverManager; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * DbUtil 数据库通用类 + * + * @author jue + * + */ +public class DbUtil { + private Logger logger; + private String db_host, db_port, db_name, db_user, db_password; + + public DbUtil(String db_host, String db_port, String db_name, String db_user, String db_password) { + this.db_host = db_host; + this.db_port = db_port; + this.db_name = db_name; + this.db_user = db_user; + this.db_password = db_password; + logger = LogManager.getLogger(DbUtil.class.getName()); + } + + /** + * getDbConn 获取数据库连接 用完需要关闭 + * + * @return + */ + public Connection getDbConn() { + Connection conn = null; + try { + String url = "jdbc:mysql://" + db_host + ":" + db_port + "/" + db_name + + "?useUnicode=true&characterEncoding=UTF-8"; + String user = db_user; + String password = db_password; + Class.forName("com.mysql.jdbc.Driver"); + conn = DriverManager.getConnection(url, user, password); + } catch (Exception e) { + logger.error("数据库连接失败|{}", e.toString()); + logger.error(this, e); + } + return conn; + } + +} diff --git a/src/com/since/emp/base/DeliveryArea.java b/src/com/since/emp/base/DeliveryArea.java new file mode 100644 index 0000000..764a8a6 --- /dev/null +++ b/src/com/since/emp/base/DeliveryArea.java @@ -0,0 +1,9 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class DeliveryArea implements Serializable { + private static final long serialVersionUID = -6702265238965579823L; + public int delivery_mode_id;// 快递公司在erp内部编码 + public String areas;// 快递公司对应的配送区域 +} diff --git a/src/com/since/emp/base/DrpOrderInfo.java b/src/com/since/emp/base/DrpOrderInfo.java new file mode 100644 index 0000000..0fd39f2 --- /dev/null +++ b/src/com/since/emp/base/DrpOrderInfo.java @@ -0,0 +1,15 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class DrpOrderInfo implements Serializable { + private static final long serialVersionUID = -3843027481664917685L; + public int docseq;// 序号 + public String part;// 商品代号 + public int txqty;// 10(数量) + public String buyremark;// 买家备注 + public String saleremark;// 卖家留言 + public double orgprc;// 单价 + public String cpartno;// 商品组合编号 + public double cprice;// 商品供货价 +} diff --git a/src/com/since/emp/base/DrpParams.java b/src/com/since/emp/base/DrpParams.java new file mode 100644 index 0000000..6d07b81 --- /dev/null +++ b/src/com/since/emp/base/DrpParams.java @@ -0,0 +1,14 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/*** + * ---------------------------------tb_drp_sale_order推送订单参数------------------------------------ + * -- + ***/ +public class DrpParams implements Serializable{ + private static final long serialVersionUID = -6126136768506706187L; + public String code;// 系统订单号 + public int bill_type;// 订单类型 + public int user_id;// 创建人 +} diff --git a/src/com/since/emp/base/DrpTradeInfo.java b/src/com/since/emp/base/DrpTradeInfo.java new file mode 100644 index 0000000..6755e3f --- /dev/null +++ b/src/com/since/emp/base/DrpTradeInfo.java @@ -0,0 +1,20 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class DrpTradeInfo implements Serializable { + private static final long serialVersionUID = -624181808141645785L; + public String prloc;//仓库 + public String taono;//淘宝单号 + public String cust_desc;//店家 + public String docdate;//发货日期 + public String csales;//业务员 + public String tranfer;//物流公司 + public int tranferno;//物流公司代号 + public String tranferdocno;//物流单号 + public double transfees;//运费 + public double packfees;//包材费 + public String omstype;//OMS出货单类型 + public String omscust;//DRP客户编号 + public DrpOrderInfo[] details;//详单 +} diff --git a/src/com/since/emp/base/EntrustOrder.java b/src/com/since/emp/base/EntrustOrder.java new file mode 100644 index 0000000..0342e3e --- /dev/null +++ b/src/com/since/emp/base/EntrustOrder.java @@ -0,0 +1,13 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class EntrustOrder implements Serializable{ + private static final long serialVersionUID = -15076564274272566L; + public int commodity_quantity;//商品数量 + public String commodity_code; + public double commodity_price;//商品价格 + public double adjust_price;//调整单价 + public String adjust_begin_time;//调整开始时间 + public String adjust_end_time;//调整结束时间 +} diff --git a/src/com/since/emp/base/FenxiaoInfo.java b/src/com/since/emp/base/FenxiaoInfo.java new file mode 100644 index 0000000..562592a --- /dev/null +++ b/src/com/since/emp/base/FenxiaoInfo.java @@ -0,0 +1,38 @@ +package com.since.emp.base; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +/** + * 该类用来记录分销订单中客户的购买信息,主要区别于淘宝订单中没有涉及的信息 + * @author Lewis + * + */ +public class FenxiaoInfo implements Serializable{ + static final long serialVersionUID = -8084210473720589252L; + public String status;//订单在平台的状态 + public int trade_type;//分为经销和代销 + public String distributor_username; // 例如:zhangsan分销商在来源网站的帐号名 + public String tc_order_id; // 例如:112233主订单ID (经销不显示 + public String buyer_payment; //例如:买家支付给分销商的总金额。注意买家购买的商品可能不是全部来自同一供货商,请同时参考子单上的相关金额。(精确到2位小数;单位:元。如:200.07,表示:200元7分) + public String order_fenxiao_id; //例如:子订单分销账号,主键 + + public Object deepClone() throws Exception { + //save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + //read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } +} diff --git a/src/com/since/emp/base/GiftNum.java b/src/com/since/emp/base/GiftNum.java new file mode 100644 index 0000000..f443282 --- /dev/null +++ b/src/com/since/emp/base/GiftNum.java @@ -0,0 +1,19 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class GiftNum implements Serializable{ + private static final long serialVersionUID = 1237656858983900625L; + public String rule_code; + public int gift_current;// 已送商品的数量 + public int order_current;// 已送订单的数量 + public int type;// 1.根据订单更新,2.根据商品更新3.两种一起更新 + @Override + public String toString() { + return "GiftNum [rule_code=" + rule_code + ", gift_current=" + gift_current + ", order_current=" + order_current + + ", type=" + type + "]"; + } + + + +} diff --git a/src/com/since/emp/base/HttpRequestCode.java b/src/com/since/emp/base/HttpRequestCode.java new file mode 100644 index 0000000..0c977d8 --- /dev/null +++ b/src/com/since/emp/base/HttpRequestCode.java @@ -0,0 +1,36 @@ +package com.since.emp.base; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * Http请求的常量池 + * @author Lewis + *2018年10月31日 + *HttpRequestCode + */ +public class HttpRequestCode implements Serializable { + /** + * @fields serialVersionUID :TODO(用一句话描述这个变量表示什么) + */ + private static final long serialVersionUID = 5030435243641686764L; + + /** content-Type:text/plain */ + public static final int CONTENT_TEXT = 1; + + /** content-Type:application/json */ + public static final int CONTENT_JSON = 2; + + /** application/x-www-form-urlencoded; charset=utf-8 */ + public static final int URLENCODED = 3; + + public static final Map REQUEST_INFO = new HashMap(); + + static { + REQUEST_INFO.put(CONTENT_TEXT, "text/plain;charset=utf-8"); + REQUEST_INFO.put(CONTENT_JSON, "application/json;charset=utf-8"); + REQUEST_INFO.put(URLENCODED, "application/x-www-form-urlencoded; charset=utf-8"); + } + +} diff --git a/src/com/since/emp/base/ImportExcelDataInfo.java b/src/com/since/emp/base/ImportExcelDataInfo.java new file mode 100644 index 0000000..f2bdec6 --- /dev/null +++ b/src/com/since/emp/base/ImportExcelDataInfo.java @@ -0,0 +1,35 @@ +package com.since.emp.base; + +import java.util.ArrayList; + +public class ImportExcelDataInfo { + private String errorTitle; + private int errorRow; + private ArrayList list; + private ArrayList tradeList; + public String getErrorTitle() { + return errorTitle; + } + public void setErrorTitle(String errorTitle) { + this.errorTitle = errorTitle; + } + public int getErrorRow() { + return errorRow; + } + public void setErrorRow(int errorRow) { + this.errorRow = errorRow; + } + public ArrayList getList() { + return list; + } + public void setList(ArrayList list) { + this.list = list; + } + public ArrayList getTradeList() { + return tradeList; + } + public void setTradeList(ArrayList tradeList) { + this.tradeList = tradeList; + } + +} diff --git a/src/com/since/emp/base/ImportParams.java b/src/com/since/emp/base/ImportParams.java new file mode 100644 index 0000000..04d7fbf --- /dev/null +++ b/src/com/since/emp/base/ImportParams.java @@ -0,0 +1,18 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class ImportParams implements Serializable { + private static final long serialVersionUID = -5528454389199169662L; + public String code;// 编码 + public String shop_code;// 店铺编码 + public String platform_num;// 平台单号 + public String begin_time;// 补抓开始时间 + public String end_time;// 补抓结束时间 + public String in_path;// xlsx保存路径 + public String platform_code;// erp内平台编码 + public String company_code; + public String obm_company_code; + public int once_max_replenish_order_count; + public int type; +} diff --git a/src/com/since/emp/base/IniReader.java b/src/com/since/emp/base/IniReader.java new file mode 100644 index 0000000..5263994 --- /dev/null +++ b/src/com/since/emp/base/IniReader.java @@ -0,0 +1,148 @@ +package com.since.emp.base; +/* +* IniReader.java +* 用Java读取INI文件(带section的) +* 示例: +* tmp.IniReader reader = new tmp.IniReader("E:\\james\\win.ini"); +* out.println(reader.getValue("TestSect3", "kkk 6")); +*/ + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.HashMap; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +public class IniReader { + private Logger logger; + protected HashMap sections = new HashMap(); + private transient String currentSecion; + private transient Properties current; + private String filename; + + public IniReader(String filename) throws Exception { + logger = (Logger) LogManager.getLogger(IniReader.class.getName()); + this.filename = filename; + BufferedReader reader = new BufferedReader(new FileReader(filename)); + read(reader); + reader.close(); + } + + protected void read(BufferedReader reader) throws Exception { + String line; + while ((line = reader.readLine()) != null) { + parseLine(line); + } + } + + protected void parseLine(String line) { + line = line.trim(); + if (line.matches("\\[.*\\]")) { + currentSecion = line.replaceFirst("\\[(.*)\\]", "$1"); + current = new Properties(); + sections.put(currentSecion, current); + } else if (line.matches(".*=.*")) { + if (current != null) { + int i = line.indexOf('='); + String name = line.substring(0, i); + String value = line.substring(i + 1); + current.setProperty(name, value); + } + } + } + + public String getValue(String section, String name) { + Properties p = (Properties) sections.get(section); + + if (p == null) { + return null; + } + + String value = p.getProperty(name); + return value; + } + + /** + * 修改ini配置文档中变量的值 + * + * @param file 配置文档的路径 + * @param section 要修改的变量所在段名称 + * @param variable 要修改的变量名称 + * @param value 变量的新值 + * @throws Exception 抛出文档操作可能出现的io异常 + */ + public boolean setValue(String section, String name, String value) throws IOException { + String fileContent, allLine, strLine, newLine, remarkStr; + String getValue; + BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(new FileInputStream(new File(this.filename)), "UTF-8")); + boolean isInSection = false; + fileContent = ""; + try { + while ((allLine = bufferedReader.readLine()) != null) { + allLine = allLine.trim(); + // System.out.println("allLine == "+allLine); + strLine = allLine; + Pattern p; + Matcher m; + p = Pattern.compile("\\[" + section + "\\]"); + m = p.matcher((strLine)); + // System.out.println("+++++++ "); + if (m.matches()) { + // System.out.println("+++++++ "); + p = Pattern.compile("\\[" + section + "\\]"); + m = p.matcher(strLine); + if (m.matches()) { + // System.out.println("true "); + isInSection = true; + } else { + isInSection = false; + // System.out.println("+++++++ "); + } + } + if (isInSection == true) { + strLine = strLine.trim(); + String[] strArray = strLine.split("="); + getValue = strArray[0].trim(); + if (getValue.equalsIgnoreCase(name)) { + // newLine = getValue + " = " + value + " " + remarkStr; + newLine = getValue + " = " + value + " "; + fileContent += newLine + "\r\n"; + while ((allLine = bufferedReader.readLine()) != null) { + fileContent += allLine + "\r\n"; + } + bufferedReader.close(); + BufferedWriter bufferedWriter = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(this.filename, false), "UTF-8"));// new + // BufferedWriter(new + // FileWriter(this.filename, + // false)); + bufferedWriter.write(fileContent); + bufferedWriter.flush(); + bufferedWriter.close(); + return true; + } + } + fileContent += allLine + "\r\n"; + } + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + bufferedReader.close(); + } + return false; + } +} diff --git a/src/com/since/emp/base/Item.java b/src/com/since/emp/base/Item.java new file mode 100644 index 0000000..f13e68a --- /dev/null +++ b/src/com/since/emp/base/Item.java @@ -0,0 +1,14 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/*** + * 篮子内容 货篮编号 商品编号 商品数量 订单中每个商品的数目之和 -- + ***/ +public class Item implements Serializable { + private static final long serialVersionUID = -8734910537221017378L; + public String basket_code;// 货篮编号 + public String commodity_code;// 商品编号 + public int quantity;// 商品数量 + public int t_num;// 订单中每个商品的数目之和 +} diff --git a/src/com/since/emp/base/MsgInfo.java b/src/com/since/emp/base/MsgInfo.java new file mode 100644 index 0000000..043e46e --- /dev/null +++ b/src/com/since/emp/base/MsgInfo.java @@ -0,0 +1,18 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class MsgInfo implements Serializable { + private static final long serialVersionUID = -93302054824300373L; + public String topic; + public long tid; + public String seller_nick; + public int exception_record; + + public MsgInfo(String topic, long tid, String seller_nick, int exception_record) { + this.topic = topic; + this.tid = tid; + this.seller_nick = seller_nick; + this.exception_record = exception_record; + } +} diff --git a/src/com/since/emp/base/OrderInfo.java b/src/com/since/emp/base/OrderInfo.java new file mode 100644 index 0000000..00ecf62 --- /dev/null +++ b/src/com/since/emp/base/OrderInfo.java @@ -0,0 +1,116 @@ +/** + * Copyright @ 2014 ChinaPcd Co. Ltd. + * All rights reserved. + * @author: Carl + * date: 2014-09-11 + */ +package com.since.emp.base; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +/** + * OrderInfo 淘宝订单信息类 + */ +public class OrderInfo implements Serializable { + static final long serialVersionUID = -8084210473720589252L; + public String commodity_code = "";// 软维平台生成的商品编码 + public String platform_seller_code = "";// 用户录入商品编码 + + public String cid;// 交易商品对应的类目ID + public String adjust_fee;// 手工调整金额.格式为:1.01;单位:元;精确到小数点后两位 + public boolean buyer_rate;// 买家是否已评价。可选值:true(已评价),false(未评价) + public String discount_fee;// 子订单级订单优惠金额。精确到2位小数;单位:元。如:200.07,表示:200元7分 + public int num;// 购买数量。取值范围:大于零的整数 + public String num_iid;// 商品数字ID + public String oid;// 子订单编号 + public String outer_iid;// 商家外部编码(可与商家外部系统对接)。外部商家自己定义的商品Item的id,可以通过taobao.items.custom.get获取商品的Item的信息 + public String outer_sku_id;// 外部网店自己定义的Sku编号 + public String payment;// 子订单实付金额。精确到2位小数,单位:元。如:200.07,表示:200元7分。对于多子订单的交易,计算公式如下:payment + // = price * num + adjust_fee - discount_fee + // ;单子订单交易,payment与主订单的payment一致,对于退款成功的子订单,由于主订单的优惠分摊金额,会造成该字段可能不为0.00元。建议使用退款前的实付金额减去退款单中的实际退款金额计算。 + public String pic_path;// 商品图片的绝对路径 + public String price;// 商品价格。精确到2位小数;单位:元。如:200.07,表示:200元7分 + public String refund_status;// 退款状态。退款状态。可选值 + // WAIT_SELLER_AGREE(买家已经申请退款,等待卖家同意) + // WAIT_BUYER_RETURN_GOODS(卖家已经同意退款,等待买家退货) + // WAIT_SELLER_CONFIRM_GOODS(买家已经退货,等待卖家确认收货) + // SELLER_REFUSE_BUYER(卖家拒绝退款) CLOSED(退款关闭) + // SUCCESS(退款成功) + public boolean seller_rate;// 卖家是否已评价。可选值:true(已评价),false(未评价) + public String seller_type;// 卖家类型,可选值为:B(商城商家),C(普通卖家) + // public String sku_id;// 商品的最小库存单位Sku的id.可以通过taobao.item.sku.get获取详细的Sku信息 + public String sku_properties_name;// SKU的值。如:机身颜色:黑色;手机套餐:官方标配 + + public String productItemID_dd;// 商品明细编码(只用于当当) + public String sku_id;// 商品标识码 + /* + * 订单状态(请关注此状态,如果为TRADE_CLOSED_BY_TAOBAO状态,则不要对此订单进行发货,切记啊!)。可选值: + * TRADE_NO_CREATE_PAY(没有创建支付宝交易) WAIT_BUYER_PAY(等待买家付款) + * WAIT_SELLER_SEND_GOODS(等待卖家发货,即:买家已付款) + * WAIT_BUYER_CONFIRM_GOODS(等待买家确认收货,即:卖家已发货) TRADE_BUYER_SIGNED(买家已签收,货到付款专用) + * TRADE_FINISHED(交易成功) TRADE_CLOSED(付款以后用户退款成功,交易自动关闭) + * TRADE_CLOSED_BY_TAOBAO(付款以前,卖家或买家主动关闭交易) PAY_PENDING(国际信用卡支付付款确认中) + */ + public int gift_type;// 1为商品,2为赠品 + public int commodity_class;// 种类(1:单品 2:组合 3:配件) + public String status; + public String title;// 商品标题 + public String total_fee;// 应付金额(商品价格 * 商品数量 + 手工调整金额 - + // 子订单级订单优惠金额)。精确到2位小数;单位:元。如:200.07,表示:200元7分,<只计算商品级的优惠,不计算订单级的优惠> + + public String divide_order_fee = "0.0";// 分摊之后的实付金额 + public String part_mjz_discount = "0.0";// 优惠分摊 + + // 赠品相关字段 + /* + * public Boolean f; public String seq_fit_rules; public String o1g1_fit_rules; + * public String order_limit_fit_rules; public String booleanContinue; public + * int delivery_type_id; public int gift_num; public int n; + */ + // 天猫供销平台中的子订单中客户订单信息 + public String order_200_status; // 例如:PAID_SEND_GOODS代销采购单对应下游200订单状态。可选值:WAIT_SELLER_SEND_GOODS(已付款,待发货)WAIT_BUYER_CONFIRM_GOODS(已付款,已发货)TRADE_CLOSED(已退款成功)TRADE_REFUNDING(退款中)TRADE_FINISHED(交易成功)TRADE_CLOSED_BY_TAOBAO(交易关闭) + public String order_buyer_payment; // 例如:200.07买家订单上对应的子单零售金额,除以num(数量)后等于最终宝贝的零售价格(精确到2位小数;单位:元。如:200.07,表示:200元7分) + public String order_tc_discount_fee; // 例如:1000优惠金额,始终为正数,单位是分,不带小数 + public String order_tc_adjust_fee; // 例如:1000商品的卖出金额调整,金额增加时为正数,金额减少时为负数,单位是分,不带小数 + public String order_discount_fee; // 例如:11.11优惠活动的折扣金额 + + public String obm_commodity_code;// 经销商商品对应的品牌商商品编码 + public int agent_type;// 商品代发类型,1为自发,2为代发 + public String obm_company_code;// 代发商品查询到的代发品牌商公司编码 + // public String obm_storage_code;//代发商品查询到的代发品牌商公司默认代发发货仓库 + public String storage_code;// 自发商品查询到经销商发货仓库 + public int order_type;// 1:经销商自发商品,2:品牌商自发商品,3:品牌商全部代发的商品,4:混合订单中经销商自发的商品,5:混合订单中品牌商代发的商品 + public String delivery_area_setting;// 分区配送设置 + + public int smart_allot_storage_flag;// 是否参与智能分仓,1:参与,2:不参与 + public int zongshuliang;// 可用数量 + public String rule_code;// 满足的规则编码 + public String gift_activity_code;// 满足的活动编码 + public int gift_copies;//赠品份数 + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } +} diff --git a/src/com/since/emp/base/RecatchConfig.java b/src/com/since/emp/base/RecatchConfig.java new file mode 100644 index 0000000..fe8ec6f --- /dev/null +++ b/src/com/since/emp/base/RecatchConfig.java @@ -0,0 +1,33 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/** + * 平台补抓单参数类 天猫,一号店,国美,当当 + */ +public class RecatchConfig implements Serializable { + private static final long serialVersionUID = 7522341143484535471L; + public String starTime;// 开始时间 + public String endTime;// 结束时间 + public String orderId;// 订单id + public String shop_code;// 店铺编码 + public String platform_code;// 平台编码 +// public String real_platform_code; + public String shopCodes; + public String hour; + public String minute; + public String platform_account; + public int type;// 默认值0:抓单程序或者后台补抓单,1:按单号补抓,2:导入文件,3:按时间段补抓 4:用户时间段 + public int once_max_replenish_order_count; + public String replenish_code;// 补抓条目编号 + + @Override + public String toString() { + return "RecatchConfig [starTime=" + starTime + ", endTime=" + endTime + ", orderId=" + orderId + ", shop_code=" + + shop_code + ", platform_code=" + platform_code + + ", shopCodes=" + shopCodes + ", hour=" + hour + ", minute=" + minute + ", platform_account=" + + platform_account + ", type=" + type + ", once_max_replenish_order_count=" + + once_max_replenish_order_count + ", replenish_code=" + replenish_code + "]"; + } + +} diff --git a/src/com/since/emp/base/RefundInfo.java b/src/com/since/emp/base/RefundInfo.java new file mode 100644 index 0000000..9ee8065 --- /dev/null +++ b/src/com/since/emp/base/RefundInfo.java @@ -0,0 +1,34 @@ +package com.since.emp.base; + +import com.alibaba.fastjson.JSON; + +import java.io.Serializable; + +/** + * 自动登记售后参数类 + * + * @author Lewis + * + */ +public class RefundInfo implements Serializable { + private static final long serialVersionUID = -8794022937042793540L; + public String tid;// 退款单对应的销售单订单编码 + public String refund_id;// 退款单编码 + public int bill_type;// 退款类型:可用值为:1:退款2:退货3:换货 + public String reason;// 退款原因 + public String shop_code;// 店铺编码 + public String company_code;// 企业编码 + public int company_type;// 企业类型1:后台管理公司,2:经销商,3:供应商 + public String desc;// 用户退货描述 + public String return_delivery_code;// 退货的快递单号 + public int after_sales_status;//售后状态 1:全部 2:买家申请退款,待商家处理 3:退货退款,待商家处理 ,仅适用于拼多多 + public String platform_code; + public long create_time; + public double refund_fee;//退还金额(退还给买家的金额)。 + public int sub_refund_type;//子订单退款或者全单退款,1:全单退款,2:子订单退款 + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/base/RefundMsgInfo.java b/src/com/since/emp/base/RefundMsgInfo.java new file mode 100644 index 0000000..bebe9e4 --- /dev/null +++ b/src/com/since/emp/base/RefundMsgInfo.java @@ -0,0 +1,20 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class RefundMsgInfo implements Serializable { + private static final long serialVersionUID = -954000108417789022L; + public String topic; + public long tid; + public String seller_nick; + public long refund_id; + public String bill_type; + + public RefundMsgInfo(String topic, long tid, String seller_nick, long refund_id, String bill_type) { + this.topic = topic; + this.tid = tid; + this.seller_nick = seller_nick; + this.refund_id = refund_id; + this.bill_type = bill_type; + } +} diff --git a/src/com/since/emp/base/RefundOrder.java b/src/com/since/emp/base/RefundOrder.java new file mode 100644 index 0000000..e944fe5 --- /dev/null +++ b/src/com/since/emp/base/RefundOrder.java @@ -0,0 +1,21 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class RefundOrder implements Serializable { + private static final long serialVersionUID = 763843280098046389L; + public String saleOrderCode;//系统订单号 + public int orderStatus;//订单状态 + public int aftersaleSeq;//售后次序,每次售后累加 + public int entrustType;//委外类型 + public String obmCompanyCode;//品牌商企业编码 + public String companyCode;//经销商品牌编码 + public String storageCode;//仓库编码 + public int checkFlag;// 是否检测 1:未检测 2:已检测 + public int autoRefundFlag;// 是否开启自动退款 1:不是 2:是 + public int aftersaleNumber;//售后订单数量 + public String lastAftersaleOrderCode;//销售单-最后一次有效售后单号 + public double pay_money;//订单实付总金额 + public String storageOutOrderCode;//出库单编码 + public String lockNote;//订单锁定原因 +} diff --git a/src/com/since/emp/base/ReplenishInfo.java b/src/com/since/emp/base/ReplenishInfo.java new file mode 100644 index 0000000..023709b --- /dev/null +++ b/src/com/since/emp/base/ReplenishInfo.java @@ -0,0 +1,13 @@ +package com.since.emp.base; + +import java.io.Serializable; + +public class ReplenishInfo implements Serializable { + private static final long serialVersionUID = 9208877117316339188L; + public boolean original_trade;// 是否为订单行(对比只有商品的子条目行) + public String error_msg;// 错误信息 + public boolean error_flag;// 改行或该单的上面某行有错误 + public int row_num;// 行号 + public int location; + public int shopid; +} diff --git a/src/com/since/emp/base/Rule.java b/src/com/since/emp/base/Rule.java new file mode 100644 index 0000000..ed7782c --- /dev/null +++ b/src/com/since/emp/base/Rule.java @@ -0,0 +1,44 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/*** + * ---------------------------------活动规则------------------------------------ -- + ***/ +public class Rule implements Serializable { + private static final long serialVersionUID = -6560085675638948402L; + public String activity_name;// 活动名称 + public String activity_shop_code;// 活动店铺编码 + public String activity_company_code;// 活动企业编码 + public String activity_begin_time;// 活动开始时间 + public String activity_end_time;// 活动结束时间 + public String gift_activity_code;// 活动编码 + public String rule_code;// 规则编码 + public String rule_name;// 规则名称 + public int rule_seq;// 排序 + public String rule_apply_object;// 适用对象,1:订单(默认) 2:商品 + public int rule_pre_sale_flag;// 预售标志,1:全部(默认) 2:非预售 3:预售 + public String rule_pay_money;// 订单金额 + // TODO 新添加字段 + public String rule_promotion_mode;// 促销方式:1:任意多件 2:指定搭配,0:无(默认)new + public String rule_any_commodity;// 任意多件_商品范围new + public String rule_any_number;// 任意多件_购买件数new + public String rule_appoint_commodity;// 指定搭配_商品范围及数量new + public String rule_gift_mode;// 赠送方式,0:无(默认) 1:快递 2:商品 + public int rule_delivery_type_id;// 快递公司编码 + public String rule_superposition_mode;// 叠加方式:1:否(默认),2:是new + public String rule_gift_limit_condition;// 限额条件:1:不限(默认) 2:订单,3:赠品 new + // public String rule_check_mode;// 判断模式? + // public String rule_commodity_code;// 商品编码? + // public String rule_gift_code;// 赠品编码? + // public String rule_gift_limit;// 礼品总数? + // public String rule_order_limit;// 订单总数? + public String rule_limit_number;// 限额总数new + public int rule_gift_current;// 已送礼品数 + public int rule_order_current;// 当前订单数 + public int rule_presell_sort;// 预售排序:1:付定金时间,2:付尾款时间 new + public String rule_gift_commodity;// 赠送商品 + public String rule_presell_begin_time;// 预售开始时间 + public String rule_presell_end_time;// 预售结束时间 + +} diff --git a/src/com/since/emp/base/ShopCommodityConfig.java b/src/com/since/emp/base/ShopCommodityConfig.java new file mode 100644 index 0000000..517768b --- /dev/null +++ b/src/com/since/emp/base/ShopCommodityConfig.java @@ -0,0 +1,26 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/** + * 同步策略信息类 + * + * @author Lewis + * + */ +public class ShopCommodityConfig implements Serializable { + private static final long serialVersionUID = 6894961805863876040L; + public int quantity; + public float percent; + public int formula; + public int onpassage_flag; + public int min_syn_quantity;// 人工设置的最小同步数量 + public String storageCodes; + public String app_key; + public String app_secret; + public String session_key; + public String shop_name; + public String platform_code; + public String platform_seller_code; + public String sync_lock_end_time;//库存同步锁定截止时间 +} diff --git a/src/com/since/emp/base/ShopMessage.java b/src/com/since/emp/base/ShopMessage.java new file mode 100644 index 0000000..6772141 --- /dev/null +++ b/src/com/since/emp/base/ShopMessage.java @@ -0,0 +1,28 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/** + * 店铺信息汇总类 + * + * @author Lewis + * + */ +public class ShopMessage implements Serializable { + private static final long serialVersionUID = -2177033669251125170L; + private int order_sync_lock_flag;//抓单锁定 1:关,2:开 + private String order_sync_lock_keyword;//抓单锁定商品标题关键字 + public int getOrder_sync_lock_flag() { + return order_sync_lock_flag; + } + public void setOrder_sync_lock_flag(int order_sync_lock_flag) { + this.order_sync_lock_flag = order_sync_lock_flag; + } + public String getOrder_sync_lock_keyword() { + return order_sync_lock_keyword; + } + public void setOrder_sync_lock_keyword(String order_sync_lock_keyword) { + this.order_sync_lock_keyword = order_sync_lock_keyword; + } + +} diff --git a/src/com/since/emp/base/ShopOrderInfo.java b/src/com/since/emp/base/ShopOrderInfo.java new file mode 100644 index 0000000..7074f3c --- /dev/null +++ b/src/com/since/emp/base/ShopOrderInfo.java @@ -0,0 +1,28 @@ +package com.since.emp.base; + +import java.io.Serializable; + +import com.since.emp.service.OrderSyncs.ShopConfig; + +public class ShopOrderInfo implements Serializable { + + private static final long serialVersionUID = 658110795213931035L; + public String tid; + public String app_key; + public String app_secret; + public ShopConfig shopConfig; + public String refundId; + + public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, String app_secret) { + this.tid = tid; + this.shopConfig = shopConfig; + this.app_key = app_key; + this.app_secret = app_secret; + } + + @Override + public String toString() { + return "ShopOrderInfo [tid=" + tid + ", app_key=" + app_key + ", app_secret=" + app_secret + ", shopConfig=" + + shopConfig + ", refundId=" + refundId + "]"; + } +} diff --git a/src/com/since/emp/base/TradeInfo.java b/src/com/since/emp/base/TradeInfo.java new file mode 100644 index 0000000..8807059 --- /dev/null +++ b/src/com/since/emp/base/TradeInfo.java @@ -0,0 +1,197 @@ +/** + * Copyright @ 2014 ChinaPcd Co. Ltd. + * All rights reserved. + * @author: Carl + * date: 2014-09-11 + */ +package com.since.emp.base; + +import lombok.Data; +import org.json.JSONArray; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + +/** + * TradeInfo 淘宝交易信息类 + */ +@Data +public class TradeInfo implements Serializable { + static final long serialVersionUID = -8084210473720589252L; + public int retry_times = 0; // 重试次数 + public int pay_mode_id = 14; // 支付方式 + public String platform_modify_time; + public String invoice_title; + public String invoice_content; + public String invoice_taxmsg = ""; + public String invoice_money = "0"; + public int invoice_type = 0;// 0:无票,1:旧版普票,2:新版普票,3:增票,4:电子发票 + public String invoice_email; + public String invoice_phone; + public String tax_id;// 纳税人识别号 + public String bank_of_deposit_account_number;// 开户行及账号(增票) + public String address_telephone;// 地址及电话(增票) + + public String money;// 商家实收金额 + public String pay_money;// 买家实付金额 + public String product_fee;// 商品金额 + public String discount_fee;// 系统优惠金额(如打折,VIP,满就送等),精确到2位小数,单位:元。如:200.07,表示:200元7分。建议使用trade.promotion_details查询系统优惠 + public String post_fee;// 邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分 + + public String adjust_fee;// 卖家手工调整金额,精确到2位小数,单位:元。如:200.07,表示:200元7分。来源于订单价格修改,如果有多笔子订单的时候,这个为0,单笔的话则跟[order].adjust_fee一样 + public String buyer_nick;// 买家昵称 + public int buyer_obtain_point_fee;// 买家获得积分,返点的积分。格式:100;单位:个。返点的积分要交易成功之后才能获得。 + public boolean buyer_rate;// 买家是否已评价。可选值:true(已评价),false(未评价)。如买家只评价未打分,此字段仍返回false + public String cod_fee;// 货到付款服务费。精确到2位小数;单位:元。如:12.07,表示:12元7分。 + public String cod_status;// 货到付款物流状态。 初始状态 NEW_CREATED, 接单成功 + // ACCEPTED_BY_COMPANY, 接单失败 + // REJECTED_BY_COMPANY, 接单超时 RECIEVE_TIMEOUT, + // 揽收成功 TAKEN_IN_SUCCESS, 揽收失败 TAKEN_IN_FAILED, + // 揽收超时 TAKEN_TIMEOUT, 签收成功 SIGN_IN, 签收失败 + // REJECTED_BY_OTHER_SIDE, 订单等待发送给物流公司 + // WAITING_TO_BE_SENT, 用户取消物流订单 CANCELED + public String created;// 交易创建时间。格式:yyyy-MM-dd HH:mm:ss + public String modified;// 交易修改时间(用户对订单的任何修改都会更新此字段)。格式:yyyy-MM-dd HH:mm:ss + public OrderInfo[] orders;// 订单,所购商品集合,是一个OrderInfo对象的数组。 + //public String preOrders;// 定金预售阶段单,所购商品集合,是一个OrderInfo对象的数组。 + public String pay_time;// 付款时间。格式:yyyy-MM-dd HH:mm:ss。订单的付款时间即为物流订单的创建时间。 + public int point_fee;// 买家使用积分,下单时生成,且一直不变。格式:100;单位:个. + public int real_point_fee;// 买家实际使用积分(扣除部分退款使用的积分),交易完成后生成(交易成功或关闭),交易未完成时该字段值为0。格式:100;单位:个 + public String received_payment;// 卖家实际收到的支付宝打款金额(由于子订单可以部分确认收货,这个金额会随着子订单的确认收货而不断增加,交易成功后等于买家实付款减去退款金额)。精确到2位小数;单位:元。如:200.07,表示:200元7分 + public String receiver_address;// 收货人的详细地址 + public String receiver_city;// 收货人的所在城市 + public String receiver_district;// 收货人的所在地区 + /* + * 注:因为国家对于城市和地区的划分的有:省直辖市和省直辖县级行政区(区级别的)划分的, 淘宝这边根据这个差异保存在不同字段里面 + * 比如:广东广州:广州属于一个直辖市是放在的receiver_city的字段里面; + * 而河南济源:济源属于省直辖县级行政区划分,是区级别的,放在了receiver_district里面 + * 建议:程序依赖于城市字段做物流等判断的操作,最好加一个判断逻辑: 如果返回值里面只有receiver_district参数,该参数作为城市 + */ + public String receiver_mobile;// 收货人的手机号码 + public String receiver_name;// 收货人的姓名 + public String receiver_phone;// 收货人的电话号码 + public String receiver_state;// 收货人的所在省份 + public String receiver_country;// 收货人的所在国家 + public String receiver_zip;// 收货人的邮编 + public String seller_nick;// 卖家昵称 + public boolean seller_rate;// 卖家是否已评价。可选值:true(已评价),false(未评价) + public String shipping_type;// 创建交易时的物流方式(交易完成前,物流方式有可能改变,但系统里的这个字段一直不变)。可选值:free(卖家包邮),post(平邮),express(快递),ems(EMS),virtual(虚拟发货),25(次日必达),26(预约配送)。 + public String sid;// 未知,大概与tid交易编号一致。 + public String status;// 交易状态。可选值: + public String orderStatusName;// 订单状态名称(微盟专用) + + public String tid;// 交易编号 (父订单的交易编号) + public String title;// 交易标题,以店铺名作为此标题的值。注:taobao.trades.get接口返回的Trade中的title是商品名称 + public String type;// 交易类型列表,同时查询多种交易类型可用逗号分隔。默认同时查询guarantee_trade, + + public int num;// 商品购买数量。取值范围:大于零的整数,对于一个trade对应多个order的时候(一笔主订单,对应多笔子订单),num=0,num是一个跟商品关联的属性,一笔订单对应多比子订单的时候,主订单上的num无意义。 + public String alipay_no;// 平台流水号,如:2009112081173831 + public String alipay_id;// 支付宝交易账号,如:2009112081173831 + public boolean has_post_fee;// 是否包含邮费。与available_confirm_fee同时使用。可选值:true(包含),false(不包含) + public boolean has_buyer_message;// 是否有买家留言 + public String buyer_message = "";// 买家留言 + public String seller_memo = "";// 商家备注 + public String buyer_memo;// 买家备注(与淘宝网上订单的买家备注对应,只有买家才能查看该字段) + + public String trade_type;// 天猫推送消息的topic类型 + public double pay_percent;// 计提应付百分比` + + public String company_code;// 企业编号 + public String shop_code;// 店铺编号 + public String brand = "";// 默认品牌名称中文 + public String platform_code;// 平台编号(001:淘宝,002:天猫,003:京东,004:一号店,005:当当,006:国美,007:苏宁,008:亚马逊) + + public String step_trade_status;// 分阶段付款状态 + public int delivery_mode_id;// 默认快递发货方式 + public String storage_code;// 默认发货仓库 + + public String encrpy_buyer_nick_name;// 加密的昵称 + public String encrpy_name;// 加密的名字 + public String encrpy_mobile;// 加密的手机 + public String encrpy_telephone;// 加密的电话 + public String encrpy_address;// 加密的地址 + + + public String encrypt_invoice_title;//加密的发票抬头 + public String encrypt_invoice_email;//加密的发票接收邮箱 + public String encrypt_invoice_phone;//加密的发票接收电话 + public String bank_of_deposit;//开户行 + public String encrypt_bank_account;//银行账号 + + + public int seller_flag;// 商家插旗标志 + public int entrust_type;// oms订单类型1:正常订单,2:oms订单 + public String entrust_time;// oms订单抓单时间 + + public int obm_flag;// 订单是否为代发,0为自发,1为代发,2为混合 + public String obm_company_code;// 品牌商公司编码,只有代发订单有值 + public int company_type;// 企业类型,1:平台管理公司,2:普通用户公司 3:品牌商公司 + public HashMap obm_company_code_map;// 代发品牌商公司编码map集合 + + public boolean omsOwnFlag;// 是否为品牌商自有店铺 + public FenxiaoInfo fenxiaoInfo;// 针对于天猫供销平台的参数类 + public boolean null_code;// 如果订单中有商品编码为空,则为true,表明订单只能走标准模式,而不考虑用户的设置 + public String trade_key;// 拆单用于记录是否是同一单,原单此字段写“原订单”,拆分订单写公司编码(品牌商,经销商)+"_ts"+仓库编码 + public HashMap> storage_map;// 拆分订单用来存储仓库可以发货哪些商品,key是公司编码(品牌商或经销商),value是商品信息 + + public String test_flag = "";// 是否是测试订单(导入订单有值) + public int row_num;// 导入订单在Excel表的行号 + public int trade_type2;// 订单写入的类型,默认0为正常抓单,1:按照单号写入,2:导入文件,3:按照时间段抓取 + public String replenish_code;// 补录单单号 + public String out_path;// 文件路径 + public String export_file_path; + + public int smart_allot_storage_flag;// 是否参与智能分仓,1:参与,2:不参与 + public int zongshuliang;// 可用数量 + public ShopMessage shopMessage;//订单需要用到的店铺信息,之前的店铺直接卸载TradeInfo里面的,暂时不动 + + public boolean delFlag;//订单写入库的时候是否标记为删除状态,true为删除 + + /** + * 该单是否做正常,true为正常,false为异常,只有该字段和tid字段可用,需根据tid字段重新查询订单信息 + */ + public Boolean is_success; + + /** + * 导入文件的模式 + * 1:简易模式 + * 2:标准模式 + * 3:滴滴订单 + */ + public int templateStatus; + + //解码OAID(Open Addressee ID),收件人信息(淘宝平台) + public String oaid; + + public String csvOrderNumber; + + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } + +} diff --git a/src/com/since/emp/base/TraderateInfo.java b/src/com/since/emp/base/TraderateInfo.java new file mode 100644 index 0000000..bce07ef --- /dev/null +++ b/src/com/since/emp/base/TraderateInfo.java @@ -0,0 +1,24 @@ +package com.since.emp.base; + +import java.io.Serializable; + +/** + * 负面评价实体类 + * + * @author Lewis + * + */ +public class TraderateInfo implements Serializable { + private static final long serialVersionUID = -4850169061434893651L; + public String tid; + public String shop_code; + public String buyer_nick; + public String rate_type;// 评价的类型 + public int add_flag;// 1:初次评价,2:追评 + public long num_iid; + public String item_title; + public String rate_content; + public String key_word; + public String company_code; + public String rate_time; +} diff --git a/src/com/since/emp/base/YchClient.java b/src/com/since/emp/base/YchClient.java new file mode 100644 index 0000000..f3ca8c5 --- /dev/null +++ b/src/com/since/emp/base/YchClient.java @@ -0,0 +1,249 @@ +package com.since.emp.base; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.service.OrderSyncs; + +/** + * @className:YchClient + * @description:御城河客户端 + * @author:Sunshine + * @date:2019年10月16日 上午10:01:33 + */ +public class YchClient { + + private static final Logger LOGGER = LogManager.getLogger(YchClient.class); + + private String appkey; + + private String secret; + + private class TrustAllTrustManager implements X509TrustManager { + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + } + + public YchClient(String appkey, String secret) { + this.appkey = appkey; + this.secret = secret; + } + + public String send(String url, TreeMap params) { + if (appkey == null || appkey.length() == 0 + || secret == null || secret.length() == 0 + || url == null || url.length() == 0 + || params == null || params.size() == 0) { + return "Parameter error."; + } + + Set keys = params.keySet(); + + for (String key : keys) { + String value = params.get(key); + + if (value == null || value.equalsIgnoreCase("null")) { + return key + " is null."; + } + } + + params.put("appKey", appkey); + + return doPost(url, params); + } + + private String doPost(String url, TreeMap params) { + + String queryString = getSignedUrl(secret, params); + + if (queryString == null || queryString.length() == 0) { + return "getSignedUrl error."; + } + + return sendRequest(url, queryString); + } + + private String getSignedUrl(String appSecret, TreeMap paramMap) { + String sign = getSignature(appSecret, paramMap); + StringBuilder query = new StringBuilder(); + + for (Entry en : paramMap.entrySet()) { + query.append(en.getKey()); + query.append("="); + try { + if (en.getValue() != null && en.getValue().length() > 0) { + query.append(URLEncoder.encode(en.getValue(), "UTF-8")); + } + } catch (UnsupportedEncodingException e) { + LOGGER.info("御城河订单日志提交|getSignedUrl throw error:{}", e.getMessage()); + } + query.append("&"); + } + + query.append("sign="); + query.append(sign); + + return query.toString(); + } + + private String getSignature(String appSecret, TreeMap paramMap) { + try { + if (paramMap == null) { + return ""; + } + + StringBuilder combineString = new StringBuilder(); + combineString.append(appSecret); + Set> entrySet = paramMap.entrySet(); + + for (Entry entry : entrySet) { + String key = entry.getKey(); + + if (key != null && key.length() > 0) { + combineString.append(key); + String vaule = entry.getValue(); + + if (vaule != null && vaule.length() > 0) { + combineString.append(vaule); + } + } + } + + combineString.append(appSecret); + + byte[] bytesOfMessage = combineString.toString().getBytes("UTF-8"); + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] thedigest = md.digest(bytesOfMessage); + String signature = bytesToHexString(thedigest); + + return signature; + } catch (Exception e) { + LOGGER.info(String.format("御城河订单日志提交|generate sign exception:{}",e.getMessage())); + return ""; + } + } + + private String bytesToHexString(byte[] src) { + try { + StringBuilder stringBuilder = new StringBuilder(""); + + if (src == null || src.length <= 0) { + return null; + } + + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + + if (hv.length() < 2) { + stringBuilder.append(0); + } + + stringBuilder.append(hv); + } + + return stringBuilder.toString(); + } catch (Exception e) { + return null; + } + } + + private String sendRequest(String path, String query) { + StringBuilder result = new StringBuilder(); + URL url; + HttpURLConnection conn; + OutputStreamWriter out = null; + BufferedReader rd; + String line; + + final int connectTimeout = 5000; + final int readTimeout = 15000; + + try { + url = new URL(path); + conn = (HttpURLConnection) url.openConnection(); + + if (conn instanceof HttpsURLConnection) { + HttpsURLConnection connHttps = (HttpsURLConnection) conn; + SSLContext ctx = SSLContext.getInstance("TLSV1.2"); + ctx.init(null, new TrustManager[] { new TrustAllTrustManager() }, new java.security.SecureRandom()); + connHttps.setSSLSocketFactory(ctx.getSocketFactory()); + connHttps.setHostnameVerifier(new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + conn = connHttps; + } + + conn.setConnectTimeout(connectTimeout); + conn.setReadTimeout(readTimeout); + conn.setRequestProperty("User-Agent", "ych-sdk-java"); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + out.write(query); + out.flush(); + + InputStream urlStream = conn.getInputStream(); + rd = new BufferedReader(new InputStreamReader(urlStream)); + + while ((line = rd.readLine()) != null) { + result.append(line); + } + + urlStream.close(); + rd.close(); + } + catch (NoSuchAlgorithmException e) { + return "NoSuchAlgorithmException"; + } + catch (Exception e) { + return e.getMessage(); + } + finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + } + } + } + + return result.toString(); + } +} + + diff --git a/src/com/since/emp/base/aftersale/ChangLogisticsAddressInfo.java b/src/com/since/emp/base/aftersale/ChangLogisticsAddressInfo.java new file mode 100644 index 0000000..bd05d63 --- /dev/null +++ b/src/com/since/emp/base/aftersale/ChangLogisticsAddressInfo.java @@ -0,0 +1,40 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; + +/** + * 买家修改收货地址参数类 + * @author Lewis + *2018年12月17日 + *ChangLogisticsAddressInfo + */ +public class ChangLogisticsAddressInfo implements Serializable{ + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = 7042844027924893921L; + public String receiver_address;// 收货人的详细地址 + public String receiver_city;// 收货人的所在城市 + public String receiver_district;// 收货人的所在地区 + /* + * 注:因为国家对于城市和地区的划分的有:省直辖市和省直辖县级行政区(区级别的)划分的, 淘宝这边根据这个差异保存在不同字段里面 + * 比如:广东广州:广州属于一个直辖市是放在的receiver_city的字段里面; + * 而河南济源:济源属于省直辖县级行政区划分,是区级别的,放在了receiver_district里面 + * 建议:程序依赖于城市字段做物流等判断的操作,最好加一个判断逻辑: 如果返回值里面只有receiver_district参数,该参数作为城市 + */ + public String receiver_mobile;// 收货人的手机号码 + public String receiver_name;// 收货人的姓名 + public String receiver_phone;// 收货人的电话号码 + public String receiver_state;// 收货人的所在省份 + public String receiver_country;// 收货人的所在国家 + public String receiver_zip;// 收货人的邮编 + public String shop_code;// 店铺编码 + public String company_code;// 企业编码 + public int company_type;// 企业类型1:后台管理公司,2:经销商,3:供应商 + public String encrpy_telephone;//加密的电话号码 + public String encrpy_mobile;//加密的手机号码 + public String encrpy_name;//加密的收货人姓名 + public String encrpy_address;//加密的收货人详细地址 + public String tid;//订单号 + public String oaid;//解码OAID(Open Addressee ID),返回收件人信息(淘宝平台) +} diff --git a/src/com/since/emp/base/aftersale/ChangLogisticsAddressOrder.java b/src/com/since/emp/base/aftersale/ChangLogisticsAddressOrder.java new file mode 100644 index 0000000..5e7b8d0 --- /dev/null +++ b/src/com/since/emp/base/aftersale/ChangLogisticsAddressOrder.java @@ -0,0 +1,24 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; + +/** + * 根据平台单号查询到的符合条件的系统订单的参数类 + * @author Lewis + *2018年12月17日 + *ChangLogisticsAddressOrder + */ +public class ChangLogisticsAddressOrder implements Serializable{ + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = -629081727850601521L; + public String sale_order_code;//系统单号 + public int entrust_type;//委托类型(1:否 2:是) + public String company_code;//经销企业编码 + public String obm_company_code;//品牌商编码 + public int invoice_type;//发票类型(1:无票2:有票) + public int orderStatus;//订单的状态 + public String storage_code;//发货的仓库 + public String platform_code;//订单店铺所属平台的编码 +} diff --git a/src/com/since/emp/base/aftersale/RefundColseEntity.java b/src/com/since/emp/base/aftersale/RefundColseEntity.java new file mode 100644 index 0000000..35403fb --- /dev/null +++ b/src/com/since/emp/base/aftersale/RefundColseEntity.java @@ -0,0 +1,14 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; + +/** + * 取消退款单查询到的符合条件的订单集合 + * @author Lewis + *2018年12月13日 + *RefundColseEntity + */ +public class RefundColseEntity implements Serializable{ + public String aftersale_code;//售后单编码 + public String sale_order_code;//销售单编码 +} diff --git a/src/com/since/emp/base/aftersale/TbDeliveryOrder.java b/src/com/since/emp/base/aftersale/TbDeliveryOrder.java new file mode 100644 index 0000000..820fa99 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbDeliveryOrder.java @@ -0,0 +1,165 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应快递单表字段 + * @author Lewis + *2018年12月19日 + *TbDeliveryOrder + */ +public class TbDeliveryOrder implements Serializable{ + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 单号 + */ + public String number; + + /** + * 买家运费/退货快件扣除配送费 + */ + public double cost; + + /** + * 国籍 + */ + public String country; + + /** + * 省份 + */ + public String state; + + /** + * 城市 + */ + public String city; + + /** + * 地区 + */ + public String district; + + /** + * 街道 + */ + public String town; + + /** + * 重量 + */ + public String weightDel; + + /** + * 邮编 + */ + public String postCode; + + /** + * 备注 + */ + public String note; + + /** + * 方式编码 + */ + public int deliveryModeCode; + + /** + * 企业编号 + */ + public String companyCode; + + /** + * 销售单编码 + */ + public String saleOrderCode; + + /** + * 收货人姓名 + */ + public String name; + + /** + * 收货人手机 + */ + public String mobile; + + /** + * 收货人地址 + */ + public String address; + + /** + * 收货人电话 + */ + public String telephone; + + /** + * 类型(1:开出 2:收到) + */ + public int type; + + /** + * 售后单编码 + */ + public String aftersaleOrderCode; + + /** + * 汇总单编码 + */ + public String summaryOrderCode; + + /** + * 快件计费金额(称重) + */ + public double businessCost; + + /** + * 收货人姓名 + */ + public String encrpyName; + + /** + * 收货人手机 + */ + public String encrpyMobile; + + /** + * 收货人地址 + */ + public String encrpyAddress; + + /** + * 收货人电话 + */ + public String encrpyTelephone; + + /** + * 品牌商企业编号 + */ + public String obmCompanyCode; + + /** + * 人工费 + */ + public double peopleFee; + + /** + * 包材费 + */ + public double packageFee; + + /** + * 对账运费金额 + */ + public double businessCostTmp; +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbFinanceOrder.java b/src/com/since/emp/base/aftersale/TbFinanceOrder.java new file mode 100644 index 0000000..0a01c15 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbFinanceOrder.java @@ -0,0 +1,155 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应财务单表的所有字段 + * @author Lewis + *2018年12月19日 + *TbFinanceOrder + */ +public class TbFinanceOrder implements Serializable{ + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 品牌列表 + */ + public String brandList; + + /** + * 总数量 + */ + public int quantity; + + /** + * 金额 + */ + public double money; + + /** + * 应付款金额 + */ + public double payableMoney; + + /** + * 回款类型 + */ + public String receivedPaymentsType; + + /** + * 平台佣金 + */ + public String platformCommission; + + /** + * 备注 + */ + public String note; + + /** + * 反馈 + */ + public String feedback; + + /** + * 状态(-1:/未生效 1:待支付/应收款 2:已支付/回款) + */ + public int status; + + /** + * 类型(1:应收款 2:应付款 ) + */ + public int type; + + /** + * 子类(1:采购应付款/销售应收款 2:售后应付款/售后应收款 3:大客户应收款 4:结算应收款) + */ + public int subType; + + /** + * 付款时间 + */ + public String payTime; + + /** + * 创建人 + */ + public int userId; + + /** + * 创建时间 + */ + public String createTime; + + /** + * 来源单类型(1:采购单(预付款)2:入库单 3:结账单 4.销售单(预收款)5.出库单 6.售后单 7.结算单 + */ + public int orderType; + + /** + * 来源单编码 + */ + public String orderCode; + + /** + * 供应商编码 + */ + public String supplierCode; + + /** + * 付款单编码(order_type=1才有值) + */ + public String financeOrderCode; + + /** + * 企业编号 + */ + public String companyCode; + + /** + * 计提应付 + */ + public double platformPay; + + /** + * 预付款金额 + */ + public double preMoney; + + /** + * 删除标志(1:正常 2:删除) + */ + public int delFlag; + + /** + * 未付金额(付款单) + */ + public double unpayMoney; + + /** + * 品牌商企业编号 + */ + public String obmCompanyCode; + + /** + * 收付款凭证 + */ + public String moneyVoucher; + + /** + * 发票状态(1.待收票 2.已收票) + */ + public int invoiceStatus; + + /** + * 经销商企业编号 + */ + public String distributorCompanyCode; +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbInvoice.java b/src/com/since/emp/base/aftersale/TbInvoice.java new file mode 100644 index 0000000..19072f0 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbInvoice.java @@ -0,0 +1,191 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应发票表的所有字段 + * @author Lewis + *2018年12月19日 + *TbInvoice + */ + +public class TbInvoice implements Serializable{ + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 号码 + */ + public String number; + + /** + * 售后单编码(收票) + */ + public String aftersaleOrderCode; + + /** + * 性质(1:开出 2:收进 3:共用) + */ + public int type; + + /** + * 抬头 + */ + public String title; + + /** + * 内容 + */ + public String content; + + /** + * 归属标志 + */ + public int ownerFlag; + + /** + * 状态(1:未生效 2:待开/待收 3:已开/已收 4:退票中 5:已退票 6:作废) + */ + public int status; + + /** + * 金额 + */ + public double money; + + /** + * 财税信息 + */ + public String taxMsg; + + /** + * 销售单编码 + */ + public String saleOrderCode; + + /** + * 类型id(1:旧版普票 2:新版普票 3:增票 4:电子发票 5.普通发票 6.增值税普通发票 7.增值税专用发票) + */ + public int typeId; + + /** + * 创建人 + */ + public int userId; + + /** + * 创建时间 + */ + public String createTime; + + /** + * + */ + public String supplierCode; + + /** + * 税费 + */ + public double tax; + + /** + * 删除标志(1:正常 2:删除) + */ + public int delFlag; + + /** + * 企业编号 + */ + public String companyCode; + + /** + * 财务单编码 + */ + public String financeOrderCode; + + /** + * 税号 + */ + public String taxId; + + /** + * 电话 + */ + public String telephone; + + /** + * 地址 + */ + public String address; + + /** + * 账户 + */ + public String account; + + /** + * 开户行 + */ + public String bankOfDeposit; + + /** + * 备注 + */ + public String note; + + /** + * 品牌商企业编号 + */ + public String obmCompanyCode; + + /** + * 结算单编号 + */ + public String obmSettlementOrderCode; + + /** + * 出票方式(1.纸质 2.电子) + */ + public int printMode; + + /** + * 地址、电话 + */ + public String addressTelephone; + + /** + * 开户行及账号 + */ + public String bankOfDepositAccountNumber; + + /** + * 收票手机号 + */ + public String receiveTelephone; + + /** + * 收票邮箱 + */ + public String receiveEmail; + + /** + * 发票请求流水号FPQQLSH + */ + public String electronicCode; + + /** + * 发票校验码JYM + */ + public String checkCode; + + /** + * pdf下载地址 + */ + public String pdfUrl; +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbSaleOrder.java b/src/com/since/emp/base/aftersale/TbSaleOrder.java new file mode 100644 index 0000000..dc3bb94 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbSaleOrder.java @@ -0,0 +1,368 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应销售单表的所有字段 + * @author Lewis + * + *2018年12月19日 + * + *TbSaleOrder + * + */ +public class TbSaleOrder implements Serializable{ + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 平台编码 + */ + public String platformCode; + + /** + * 支付ID号 + */ + public String payAccount; + + /** + * 支付流水号 + */ + public String payNo; + + /** + * 平台订单状态 + */ + public String platformStatus; + + /** + * 平台订单类型 + */ + public String platformType; + + /** + * 分段付款订单状态 + */ + public String stepStatus; + + /** + * 货到付款订单状态 + */ + public String codStatus; + + /** + * 品牌列表 + */ + public String brandList; + + /** + * 数量 + */ + public int quantity; + + /** + * 金额,若为null,设为-1 + */ + public double money; + + /** + * 状态(1:销售单 2:待审销售单 3:待开发票 4:打单 5:待配货 6:待发货 7:应收款) + */ + public int status; + + /** + * 类型(1:系统单 2:零售 3:大客户 4:其它 5:补款单 6:经销商) + */ + public int type; + + /** + * 销售备注 + */ + public String saleNote; + + /** + * 原单号 + */ + public String originalSaleOrderCode; + + /** + * 应收款差额,若为null,设为-1 + */ + public double receivablesDifference; + + /** + * 订货人昵称 + */ + public String buyerNickName; + + /** + * 订货人姓名 + */ + public String buyerName; + + /** + * 订货人地址 + */ + public String buyerAddress; + + /** + * 订货人电话 + */ + public String buyerTelephone; + + /** + * 订货人邮箱 + */ + public String buyerEmail; + + /** + * 平台创建时间 + */ + public String platformCreateTime; + + /** + * 平台发货时间 + */ + public String platformConsignTime; + + /** + * 平台结束时间 + */ + public String platformEndTime; + + /** + * 平台修改时间 + */ + public String platformModifyTime; + + /** + * 买家留言 + */ + public String buyerMessage; + + /** + * 商家备注 + */ + public String sellerNote; + + /** + * 买家付款金额 + */ + public double payMoney; + + /** + * 实际收取金额 + */ + public double receivablesMoney; + + /** + * 商品总金额 + */ + public double totalFee; + + /** + * 手工调整金额 + */ + public double adjustFee; + + /** + * 优惠金额 + */ + public double discountFee; + + /** + * 付款时间 + */ + public String payTime; + + /** + * (生成此销售单的)售后单号 + */ + public String aftersaleOrderCode; + + /** + * 可售后标志(1: 是2:否) + */ + public int aftersaleOrderFlag; + + /** + * 售后次数 + */ + public int aftersaleNumber; + + /** + * 发票类型(1:无票2:有票) + */ + public int invoiceType; + + /** + * 付款方式 + */ + public String payModeId; + + /** + * 删除标志(1:正常 2:锁定 3:删除) + */ + public int delFlag; + + /** + * 创建人,若为null,设为-1 + */ + public int userId; + + /** + * 创建时间 + */ + public String createTime; + + /** + * 店铺编码 + */ + public String shopCode; + + /** + * 售后来源(1:换货 2:补货 3:补偿 4:改单 5:并单 6:拆单 7:换票 8:补票)若为null,设为-1 + */ + public int origin; + + /** + * 交易方式(1:款到发货 2:货到付款 3:预付) + */ + public int tradeModeId; + + /** + * 售后次序 + */ + public int aftersaleSeq; + + /** + * 售后配送单号 + */ + public String curDeliveryOrderCode; + + /** + * 售后金额 + */ + public double curMoney; + + /** + * 售后数量 + */ + public int curQuantity; + + /** + * 锁原因id(1:正常 2:缺货) + */ + public int lockReasonId; + + /** + * 锁定备注 + */ + public String lockNote; + + /** + * 发票类型(1:无票2:有票) + */ + public int curInvoiceType; + + /** + * 企业编号 + */ + public String companyCode; + + /** + * 货篮编码 + */ + public String basketCode; + + /** + * 回写状态(1:未回写 2:回写失败 3:系统回写成功 4:人工回写成功 5:未二次回写 ) + */ + public int writeBackStatus; + + /** + * 回写失败原因 + */ + public String writeBackReason; + + /** + * 最后一次有效售后单号 + */ + public String lastAftersaleOrderCode; + + /** + * 仓库 + */ + public String storageCode; + + /** + * 订货人昵称 + */ + public String encrpyBuyerNickName; + + /** + * 委托类型(1:否 2:是) + */ + public int entrustType; + + /** + * 委外状态(1.未抓取 2.已抓取) + */ + public int entrustStatus; + + /** + * 委托时间 + */ + public String entrustTime; + + /** + * 卖家备注旗帜 + */ + public int sellerFlag; + + /** + * 品牌商企业编号 + */ + public String obmCompanyCode; + + /** + * 经销商采购单号 + */ + public String dealerPurchaseOrderCode; + + /** + * 预收款 + */ + public double preMoney; + + /** + * 预收付款凭证 + */ + public String preMoneyVoucher; + + /** + * 订单拆分(1:拆分的订单)若为null,设为-1 + */ + public int orderSplite; + + /** + * 发票状态(1:待开 2:已开),若为null,设为-1 + */ + public int invoiceStatus; + + /** + * 品牌商仓库 + */ + public String obmStorageCode; + + /** + * 并单后生成的销售单 + */ + public String newSaleOrderCode; +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbSaleOrderItems.java b/src/com/since/emp/base/aftersale/TbSaleOrderItems.java new file mode 100644 index 0000000..82ab972 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbSaleOrderItems.java @@ -0,0 +1,126 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应销售单详表的所有字段 + * @author Lewis + *2018年12月19日 + *TbSaleOrderItems + */ +public class TbSaleOrderItems implements Serializable{ + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = 7597041901752823696L; + + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 商品编码 + */ + public String commodityCode; + + /** + * 品牌商商品编码 + */ + public String obmCommodityCode; + + /** + * 数量 + */ + public int quantity; + + /** + * 单价 + */ + public double unitPrice; + + /** + * 金额 + */ + public double money; + + /** + * 商品标题 + */ + public String commodityTitle; + + /** + * 折扣 + */ + public double account; + + /** + * 应付金额 + */ + public double totalFee; + + /** + * 手工调整金额 + */ + public double adjustFee; + + /** + * 赠品(1:不是 2:是) + */ + public int gift; + + /** + * 销售单编码 + */ + public String saleOrderCode; + + /** + * Sku信息 + */ + public String skuMessage; + + /** + * 商品标识符(当当) + */ + public String itemId; + + /** + * 商品明细编号(当当) + */ + public String productItemId; + + /** + * 企业编号 + */ + public String companyCode; + + /** + * 分摊之后的实付金额 + */ + public double divideOrderFee; + + /** + * 优惠分摊 + */ + public double partMjzDiscount; + + /** + * 平台子订单号 + */ + public String oid; + + /** + * 品牌商企业编号 + */ + public String obmCompanyCode; + + /** + * 平台sku外部编码 + */ + public String outer_id; + +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbSubSaleOrder.java b/src/com/since/emp/base/aftersale/TbSubSaleOrder.java new file mode 100644 index 0000000..e15cb4a --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbSubSaleOrder.java @@ -0,0 +1,51 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; + +/** + * 对应供销平台销售表的所有字段 + * @author Lewis + *2018年12月19日 + *TbSubSaleOrder + */ +public class TbSubSaleOrder implements Serializable{ + /** + * + */ + public Long id; + + /** + * + */ + public String code; + + /** + * 主订单ID + */ + public String tcOrderId; + + /** + * + */ + public String distributorUsername; + + /** + * 代销方式(1:AGENT 2:DEALER) + */ + public int tradeType; + + /** + * 金额 + */ + public double buyerPayment; + + /** + * 状态 + */ + public String status; + + /** + * 企业编号 + */ + public String companyCode; +} \ No newline at end of file diff --git a/src/com/since/emp/base/aftersale/TbSubSaleOrderItems.java b/src/com/since/emp/base/aftersale/TbSubSaleOrderItems.java new file mode 100644 index 0000000..a7bd949 --- /dev/null +++ b/src/com/since/emp/base/aftersale/TbSubSaleOrderItems.java @@ -0,0 +1,50 @@ +package com.since.emp.base.aftersale; + +import java.io.Serializable; +/** + * 对应天猫供销平台销售单详表的所有字段 + * @author Lewis + *2018年12月19日 + *TbSubSaleOrderItems + */ +public class TbSubSaleOrderItems implements Serializable{ + /** + * + */ + public Long id; + + /** + * 子采购单id + */ + public String code; + + /** + * 状态 + */ + public String status; + + /** + * 零售价格 + */ + public double buyerPayment; + + /** + * 优惠金额 + */ + public double tcDiscountFee; + + /** + * 折扣金额 + */ + public double discountFee; + + /** + * 卖出金额调整 + */ + public double tcAdjustFee; + + /** + * 企业编号 + */ + public String companyCode; +} \ No newline at end of file diff --git a/src/com/since/emp/base/constant/LoggerRecordConstant.java b/src/com/since/emp/base/constant/LoggerRecordConstant.java new file mode 100644 index 0000000..dd11d33 --- /dev/null +++ b/src/com/since/emp/base/constant/LoggerRecordConstant.java @@ -0,0 +1,13 @@ +package com.since.emp.base.constant; + +/** + * @description 日志记录的常量,用于各个类中重复的打印字段 + * @author Lewis + * @file_name LoggerRecordConstant.java + * @date 2019年7月8日 + */ +public class LoggerRecordConstant { + public static final String TIMER_TASK_LOGGER = "开始执行订单任务-"; + public static final String ORDER_TYPE = "抓单"; + public static final String EXCEPTION_TYPE = "异常检查"; +} diff --git a/src/com/since/emp/base/constant/ProvinceConstant.java b/src/com/since/emp/base/constant/ProvinceConstant.java new file mode 100644 index 0000000..9edd2d7 --- /dev/null +++ b/src/com/since/emp/base/constant/ProvinceConstant.java @@ -0,0 +1,57 @@ +package com.since.emp.base.constant; + +import java.util.HashMap; +import java.util.Map; + +/** + * @description 订单省份统一匹配字典 + * @author Lewis + * @file_name ProvinceConstant.java + * @date 2020年12月03日 + */ +public class ProvinceConstant { + public static final Map privince = new HashMap(); + static { + privince.put("北京", ""); + privince.put("上海", ""); + privince.put("天津", ""); + privince.put("重庆", ""); + + privince.put("辽宁省", ""); + privince.put("湖北省", ""); + privince.put("山西省", ""); + privince.put("福建省", ""); + privince.put("青海省", ""); + privince.put("江西省", ""); + privince.put("河南省", ""); + privince.put("浙江省", ""); + privince.put("吉林省", ""); + privince.put("安徽省", ""); + privince.put("海南省", ""); + privince.put("四川省", ""); + privince.put("黑龙江省", ""); + privince.put("云南省", ""); + privince.put("贵州省", ""); + privince.put("江苏省", ""); + privince.put("陕西省", ""); + privince.put("广东省", ""); + privince.put("河北省", ""); + privince.put("湖南省", ""); + privince.put("甘肃省", ""); + privince.put("山东省", ""); + + + privince.put("西藏自治区", ""); + privince.put("广西壮族自治区", ""); + privince.put("宁夏回族自治区", ""); + privince.put("新疆维吾尔自治区", ""); + privince.put("内蒙古自治区", ""); + + privince.put("香港特别行政区", ""); + privince.put("澳门特别行政区", ""); + + privince.put("台湾", ""); + privince.put("海外", ""); + + } +} diff --git a/src/com/since/emp/base/doudian/CipherInfo.java b/src/com/since/emp/base/doudian/CipherInfo.java new file mode 100644 index 0000000..2103aa5 --- /dev/null +++ b/src/com/since/emp/base/doudian/CipherInfo.java @@ -0,0 +1,32 @@ +package com.since.emp.base.doudian; + +import java.io.Serializable; + +/** + * @Description: 解密参数详细参数类 + * @ClassName: CipherInfo + * @author Lewis + * @date 2021-7-16 10:20:38 + * + */ +public class CipherInfo implements Serializable{ + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = 277304869183414155L; + private String auth_id; + private String cipher_text; + public String getAuth_id() { + return auth_id; + } + public void setAuth_id(String auth_id) { + this.auth_id = auth_id; + } + public String getCipher_text() { + return cipher_text; + } + public void setCipher_text(String cipher_text) { + this.cipher_text = cipher_text; + } + +} diff --git a/src/com/since/emp/base/doudian/CipherInfos.java b/src/com/since/emp/base/doudian/CipherInfos.java new file mode 100644 index 0000000..e17689d --- /dev/null +++ b/src/com/since/emp/base/doudian/CipherInfos.java @@ -0,0 +1,21 @@ +package com.since.emp.base.doudian; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; +/** + * @Description: 抖店解密参数类 + * @ClassName: CipherInfos + * @author Lewis + * @date 2021-7-16 10:20:23 + * + */ +@Data +public class CipherInfos implements Serializable{ + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = -8821369030034543909L; + private List cipher_infos; +} diff --git a/src/com/since/emp/base/doudian/DdEncryptBO.java b/src/com/since/emp/base/doudian/DdEncryptBO.java new file mode 100644 index 0000000..60bb96e --- /dev/null +++ b/src/com/since/emp/base/doudian/DdEncryptBO.java @@ -0,0 +1,30 @@ +package com.since.emp.base.doudian; + +import lombok.Data; + +/** + * @Description: 抖音店铺密文及解密字段 + * @ClassName: DdEncryptBO + * @author Lewis + * @date 2021-7-14 12:28:57 + * + */ +@Data +public class DdEncryptBO { + //订单号 + private String orderNo; + + // 密文电话 + private String encryptPostTel; + // 密文收货人姓名 + private String encryptPostReceiver; + // 密文收货人地址 + private String encryptDetail; + + // 解密后的明文电话 + private String postTel; + // 解密后的明文收货人姓名 + private String postReceiver; + // 解密后的明文收货人地址 + private String detail; +} diff --git a/src/com/since/emp/base/mia/MiaAftersaleRequestParams.java b/src/com/since/emp/base/mia/MiaAftersaleRequestParams.java new file mode 100644 index 0000000..5d11c81 --- /dev/null +++ b/src/com/since/emp/base/mia/MiaAftersaleRequestParams.java @@ -0,0 +1,11 @@ +package com.since.emp.base.mia; + +public class MiaAftersaleRequestParams { + public String start_date;//售后单创建开始时间, 格式: yyyy-MM-dd HH:mm:ss + public String end_date;//售后单创建结束时间, 格式: yyyy-MM-dd HH:mm:ss + public String return_state;//售后单状态可以用英文逗号隔开 默认1。 0. 作废1. 处理中2. 已完结 + public String page;//页数 + public String page_size;//页大小(min 1;max 100) + public String optional_field;// 需返回的字段列表。字段之间用,分隔。可选值:returns_list结构体中的所有字段 + public String date_sort;//默认升序,1是降序,其它数字都是升序 +} diff --git a/src/com/since/emp/base/mia/MiaCommonRequestParams.java b/src/com/since/emp/base/mia/MiaCommonRequestParams.java new file mode 100644 index 0000000..eed53de --- /dev/null +++ b/src/com/since/emp/base/mia/MiaCommonRequestParams.java @@ -0,0 +1,10 @@ +package com.since.emp.base.mia; + +public class MiaCommonRequestParams { + public String method;//API接口名称 + public String vendor_key;//商家的ID + public String timestamp;//时间戳,格式为1428983222。API服务端允许客户端请求时间误差为8分钟 + public String format;//暂时只支持json + public String version;//API协议版本,可选值:1.0 + +} diff --git a/src/com/since/emp/base/mia/MiaOrdersRequestParams.java b/src/com/since/emp/base/mia/MiaOrdersRequestParams.java new file mode 100644 index 0000000..2268c39 --- /dev/null +++ b/src/com/since/emp/base/mia/MiaOrdersRequestParams.java @@ -0,0 +1,12 @@ +package com.since.emp.base.mia; + +public class MiaOrdersRequestParams { + public String start_date;// 订单开始时间, 格式: yyyy-MM-dd HH:mm:ss + public String end_date;//订单结束时间, 格式: yyyy-MM-dd HH:mm:ss + public String order_state;//多订单状态可以用英文逗号隔开 1.待付款;2.已付款待发货;3.发货中[预留,暂不使用];4.发货完成;5.订单完结;6.已取消 + public String page;//页数 + public String page_size;// 页大小(min 1;max 100) + public String optional_field;//需返回的字段列表。字段之间用,分隔。可选值:order_info结构体中的所有字段 + public String date_sort;//排序方式(下单时间),默认升序,1是降序,其它数字都是升序 + public String date_type;//查询时间类型,默认按创建时间查询。1为按订单创建时间查询;其它数字为按订单修改时间 +} diff --git a/src/com/since/emp/base/thread/CustomRejectedExecutionHandler.java b/src/com/since/emp/base/thread/CustomRejectedExecutionHandler.java new file mode 100644 index 0000000..f6fde86 --- /dev/null +++ b/src/com/since/emp/base/thread/CustomRejectedExecutionHandler.java @@ -0,0 +1,31 @@ +package com.since.emp.base.thread; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +public class CustomRejectedExecutionHandler implements RejectedExecutionHandler { + private static final Logger logger = LogManager.getLogger(CustomRejectedExecutionHandler.class); + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + /* + * 2019-08-05弃用阻塞方法,当需要执行的线程大于线程队列,新开独立线程执行任务,目前暂不考虑使用无界队列,防止OOM // + * 核心改造点,由blockingqueue的offer改成put阻塞方法 executor.getQueue().put(r); + */ +// System.out.println("rejected方法执行"); + /* + * String threadName = "独立线程:" + count.addAndGet(1); + * logger.info("线程池拒绝策略,{},执行,阻塞队列长度:{}",threadName,executor.getQueue().size()); + * new Thread(r, threadName).start(); + */ + + try { + // 核心改造点,由blockingqueue的offer改成put阻塞方法 + executor.getQueue().put(r); + } catch (InterruptedException e) { + logger.error(this, e); + } + } +} diff --git a/src/com/since/emp/base/thread/CustomThreadFactory.java b/src/com/since/emp/base/thread/CustomThreadFactory.java new file mode 100644 index 0000000..be5daf9 --- /dev/null +++ b/src/com/since/emp/base/thread/CustomThreadFactory.java @@ -0,0 +1,19 @@ +package com.since.emp.base.thread; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + + +public class CustomThreadFactory implements ThreadFactory { + + private AtomicInteger count = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + String threadName = CustomThreadFactory.class.getSimpleName() + count.addAndGet(1); +// System.out.println("定制的线程工厂"+threadName); + t.setName(threadName); + return t; + } +} diff --git a/src/com/since/emp/base/thread/ScheduledThreadPool.java b/src/com/since/emp/base/thread/ScheduledThreadPool.java new file mode 100644 index 0000000..1bf37fe --- /dev/null +++ b/src/com/since/emp/base/thread/ScheduledThreadPool.java @@ -0,0 +1,35 @@ +package com.since.emp.base.thread; + +import java.util.concurrent.ScheduledThreadPoolExecutor; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.service.StorageUpdate; + +/** + * @author Sunshine + * @date 2019/10/12 13:20 + * @description 定时器线程池 + * @fileName ScheduledThreadPool.java + */ +public class ScheduledThreadPool { + + private static final Logger logger = LogManager.getLogger(ScheduledThreadPool.class); + + private static class SingletonExecutorServiceHandler { + + private static ScheduledThreadPoolExecutor scheduledThreadPool = new ScheduledThreadPoolExecutor(15); + + } + + private ScheduledThreadPool() { + + } + + public static ScheduledThreadPoolExecutor getInstance() { + logger.info("活跃的定时器线程数:{}", SingletonExecutorServiceHandler.scheduledThreadPool.getActiveCount()); + return SingletonExecutorServiceHandler.scheduledThreadPool; + } + +} diff --git a/src/com/since/emp/base/thread/ThreadPool.java b/src/com/since/emp/base/thread/ThreadPool.java new file mode 100644 index 0000000..3b5d944 --- /dev/null +++ b/src/com/since/emp/base/thread/ThreadPool.java @@ -0,0 +1,71 @@ +package com.since.emp.base.thread; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Properties; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ThreadPool { + private static final Logger logger = LogManager.getLogger(ThreadPool.class); + + private static class SingletonThreadPoolHandler { + private static HashMap map = loadPropertiesFile(); + + private static ThreadPoolExecutor pool = new ThreadPoolExecutor(Integer.valueOf(map.get("corePoolSize")), + Integer.valueOf(map.get("maximumPoolSize")), Integer.valueOf(map.get("keepAliveTime")), + TimeUnit.MINUTES, new ArrayBlockingQueue(Integer.valueOf(map.get("queueSize"))), + new CustomThreadFactory(), new CustomRejectedExecutionHandler()); + + } + + private ThreadPool() { + + } + + public static ThreadPoolExecutor getInstance() { + logger.info("活跃的线程池线程数:{},阻塞队列长度:{}", SingletonThreadPoolHandler.pool.getActiveCount(), + SingletonThreadPoolHandler.pool.getQueue().size()); + return SingletonThreadPoolHandler.pool; + } + + /** + * @return HashMap + * @description 加载配置文件返回map集合 + */ + private static HashMap loadPropertiesFile() { + HashMap map = new HashMap(); + InputStream inputStream = null; + Properties properties; + try { + inputStream = new FileInputStream(new File("tp.properties"));// 原来是绝对路径,现在用相对路径 + properties = new Properties(); + properties.load(inputStream); + Enumeration em = properties.propertyNames(); + while (em.hasMoreElements()) { + String key = (String) em.nextElement(); + String value = properties.getProperty(key); + map.put(key, value); + } + } catch (Exception e) { + logger.error(ThreadPool.class, e); + } finally { + try { + if (null != inputStream) { + inputStream.close(); + } + } catch (Exception e) { + logger.error(ThreadPool.class, e); + } + } + return map; + } + +} diff --git a/src/com/since/emp/base/weimob/MerchantOrderListQueryByCreateTimeParameter.java b/src/com/since/emp/base/weimob/MerchantOrderListQueryByCreateTimeParameter.java new file mode 100644 index 0000000..ad33781 --- /dev/null +++ b/src/com/since/emp/base/weimob/MerchantOrderListQueryByCreateTimeParameter.java @@ -0,0 +1,9 @@ +package com.since.emp.base.weimob; + +import java.util.List; + +public class MerchantOrderListQueryByCreateTimeParameter { + public Long createStartTime;//订单创建开始时间 + public Long createEndTime;//订单创建结束时间 + public List orderStatuses;//订单状态 +} diff --git a/src/com/since/emp/base/weimob/MerchantOrderListQueryByPaymentTimeParameter.java b/src/com/since/emp/base/weimob/MerchantOrderListQueryByPaymentTimeParameter.java new file mode 100644 index 0000000..37b48f9 --- /dev/null +++ b/src/com/since/emp/base/weimob/MerchantOrderListQueryByPaymentTimeParameter.java @@ -0,0 +1,9 @@ +package com.since.emp.base.weimob; + +import java.util.List; + +public class MerchantOrderListQueryByPaymentTimeParameter { + public Long paymentStartTime;//订单支付开始时间 + public Long paymentEndTime;//订单支付结束时间 + public List orderStatuses;//订单状态 +} diff --git a/src/com/since/emp/base/weimob/MerchantOrderListQueryByUpdateTimeParameter.java b/src/com/since/emp/base/weimob/MerchantOrderListQueryByUpdateTimeParameter.java new file mode 100644 index 0000000..7682d3b --- /dev/null +++ b/src/com/since/emp/base/weimob/MerchantOrderListQueryByUpdateTimeParameter.java @@ -0,0 +1,9 @@ +package com.since.emp.base.weimob; + +import java.util.List; + +public class MerchantOrderListQueryByUpdateTimeParameter { + public Long updateStartTime;//订单支付开始时间 + public Long updateEndTime;//订单支付结束时间 + public List orderStatuses;//订单状态 +} diff --git a/src/com/since/emp/base/weimob/WeimobOrderRequestByCreateTimeParams.java b/src/com/since/emp/base/weimob/WeimobOrderRequestByCreateTimeParams.java new file mode 100644 index 0000000..4b09263 --- /dev/null +++ b/src/com/since/emp/base/weimob/WeimobOrderRequestByCreateTimeParams.java @@ -0,0 +1,12 @@ +package com.since.emp.base.weimob; + +public class WeimobOrderRequestByCreateTimeParams { +// public int order_status;//订单状态(1交易中,2交易成功,3交易关闭,空值代表所有) +// public int pay_status;//订单支付状态(0待支付,1已支付,空值代表所有) +// public int delivery_status;//物流状态(0待发货,1卖家发货,2买家收货,空值代表所有) +// public String create_begin_time;//订单创建时间起始值(格式:yyyy-MM-dd HH:mm:ss) +// public String create_end_time;//订单创建时间终点值(格式:yyyy-MM-dd HH:mm:ss) + public int page_size;//分页条数(取值范围【1,50】) + public int page_num;//分页页码(从1开始) + public MerchantOrderListQueryByCreateTimeParameter queryParameter;//查询参数 +} diff --git a/src/com/since/emp/base/weimob/WeimobOrderRequestByPaymentTimeParams.java b/src/com/since/emp/base/weimob/WeimobOrderRequestByPaymentTimeParams.java new file mode 100644 index 0000000..d9e8d3d --- /dev/null +++ b/src/com/since/emp/base/weimob/WeimobOrderRequestByPaymentTimeParams.java @@ -0,0 +1,12 @@ +package com.since.emp.base.weimob; + +public class WeimobOrderRequestByPaymentTimeParams { +// public int order_status;//订单状态(1交易中,2交易成功,3交易关闭,空值代表所有) +// public int pay_status;//订单支付状态(0待支付,1已支付,空值代表所有) +// public int delivery_status;//物流状态(0待发货,1卖家发货,2买家收货,空值代表所有) +// public String create_begin_time;//订单创建时间起始值(格式:yyyy-MM-dd HH:mm:ss) +// public String create_end_time;//订单创建时间终点值(格式:yyyy-MM-dd HH:mm:ss) + public int page_size;//分页条数(取值范围【1,50】) + public int page_num;//分页页码(从1开始) + public MerchantOrderListQueryByPaymentTimeParameter queryParameter;//查询参数 +} diff --git a/src/com/since/emp/base/weimob/WeimobOrderRequestByUpdateTimeParams.java b/src/com/since/emp/base/weimob/WeimobOrderRequestByUpdateTimeParams.java new file mode 100644 index 0000000..bbeda31 --- /dev/null +++ b/src/com/since/emp/base/weimob/WeimobOrderRequestByUpdateTimeParams.java @@ -0,0 +1,12 @@ +package com.since.emp.base.weimob; + +public class WeimobOrderRequestByUpdateTimeParams { +// public int order_status;//订单状态(1交易中,2交易成功,3交易关闭,空值代表所有) +// public int pay_status;//订单支付状态(0待支付,1已支付,空值代表所有) +// public int delivery_status;//物流状态(0待发货,1卖家发货,2买家收货,空值代表所有) +// public String create_begin_time;//订单创建时间起始值(格式:yyyy-MM-dd HH:mm:ss) +// public String create_end_time;//订单创建时间终点值(格式:yyyy-MM-dd HH:mm:ss) + public int page_size;//分页条数(取值范围【1,50】) + public int page_num;//分页页码(从1开始) + public MerchantOrderListQueryByUpdateTimeParameter queryParameter;//查询参数 +} diff --git a/src/com/since/emp/constant/CheckNewOrderQueue.java b/src/com/since/emp/constant/CheckNewOrderQueue.java new file mode 100644 index 0000000..5032045 --- /dev/null +++ b/src/com/since/emp/constant/CheckNewOrderQueue.java @@ -0,0 +1,6 @@ +package com.since.emp.constant; + +public class CheckNewOrderQueue { + //cnoq:check-new-order-queue + public final static String fileName = "cnop.properties"; +} diff --git a/src/com/since/emp/exception/NoShopException.java b/src/com/since/emp/exception/NoShopException.java new file mode 100644 index 0000000..7ba5c2d --- /dev/null +++ b/src/com/since/emp/exception/NoShopException.java @@ -0,0 +1,18 @@ +package com.since.emp.exception; + +import java.io.IOException; + + +public class NoShopException extends IOException{ + + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = 3139541956190703617L; + + public NoShopException(String msg) + { + super(msg); + } + +} diff --git a/src/com/since/emp/exception/TemplateException.java b/src/com/since/emp/exception/TemplateException.java new file mode 100644 index 0000000..d96614f --- /dev/null +++ b/src/com/since/emp/exception/TemplateException.java @@ -0,0 +1,15 @@ +package com.since.emp.exception; + +import java.io.IOException; + +public class TemplateException extends IOException { + /** + * @Fields serialVersionUID : + */ + private static final long serialVersionUID = 2403438483197128941L; + + public TemplateException(String msg) + { + super(msg); + } +} diff --git a/src/com/since/emp/exception/WeiDianException.java b/src/com/since/emp/exception/WeiDianException.java new file mode 100644 index 0000000..b814d62 --- /dev/null +++ b/src/com/since/emp/exception/WeiDianException.java @@ -0,0 +1,7 @@ +package com.since.emp.exception; + +public class WeiDianException extends Exception { + public WeiDianException(String message) { + super(message); + } +} diff --git a/src/com/since/emp/exception/XiaoHongShuOrderException.java b/src/com/since/emp/exception/XiaoHongShuOrderException.java new file mode 100644 index 0000000..a7c0e94 --- /dev/null +++ b/src/com/since/emp/exception/XiaoHongShuOrderException.java @@ -0,0 +1,12 @@ +package com.since.emp.exception; + +/** + * @author zh + * @Date 2022/2/17 + */ + +public class XiaoHongShuOrderException extends Exception { + public XiaoHongShuOrderException(String message) { + super(message); + } +} diff --git a/src/com/since/emp/newplatform/service/ApiDangDangNew.java b/src/com/since/emp/newplatform/service/ApiDangDangNew.java new file mode 100644 index 0000000..da74a14 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiDangDangNew.java @@ -0,0 +1,747 @@ +package com.since.emp.newplatform.service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * @author Sunshine + * @className ApiDangDangNew + * @description 当当APi接口类 + * @date 2019/5/6 15:10:26 + */ +public class ApiDangDangNew { + private static final Logger logger = LogManager.getLogger(ApiDangDangNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + /** + * 订单处理队列 + */ + private Vector orderVector; + + /** + * 异常订单集合 + */ + private Map exceptionOrderMap; + + public ApiDangDangNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + ThreadPoolExecutor threadPool = ThreadPool.getInstance(); + ScheduledThreadPoolExecutor scheduledThreadPool = ScheduledThreadPool.getInstance(); + orderVector = new Vector<>(); + exceptionOrderMap = new ConcurrentHashMap<>(); + scheduledThreadPool.scheduleAtFixedRate(new GetTradeInfoThread(), 0, 500, TimeUnit.MILLISECONDS); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + StringBuilder shopName = null; + StringBuilder shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = new StringBuilder(platConfig.apps.get(i).shops.get(j).name); + shopCode = new StringBuilder(platConfig.apps.get(i).shops.get(j).code); + } else { + shopName.append(",").append(platConfig.apps.get(i).shops.get(j).name); + shopCode.append(",").append(platConfig.apps.get(i).shops.get(j).code); + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [{}]", platConfig.apps.get(i).key, + shopCode != null ? shopCode.toString() : null, + shopName != null ? shopName.toString() : null); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * @author Sunshine + * @className OrdersTimerTask + * @description 定时抓取订单线程 + * @date 2019/5/6 3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + OrderSyncs.getAppMessage(platConfig); + threadPool.execute(new ExceptionTradeInfoThread()); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (ShopConfig shopConfig : shops) { + // 初始时,当前时间往前init_time小时 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + threadPool.execute(new GetOrderThread(shopConfig, shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * @author Sunshine + * @className GetOrderThread + * @description 抓单线程 + * @date: 2019/5/6 15:14:52 + */ + class GetOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + // this.time_start = "2019-07-01 00:00:00";// 开始时间 + this.time_end = time_end;// 结束时间 + // this.time_end = "2019-07-17 00:00:00";// 结束时间 + } + + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 获取订单响应:{}", shopConfig.code, shopConfig.name, response_str); + + this.parseOrderList(response_str); + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @param response_str + * @title: parseOrderList + * @description: 解析订单 + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + // 处理异常信息 + if (total_results < 1) { + shopConfig.errFlag = false; + logger.info("[ {} ] | [ {} ] 返回订单:本次没有抓取到订单!", shopConfig.code, shopConfig.name); + return; + } + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取到订单数:[ {} ]", shopConfig.code, shopConfig.name, + total_results); + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 2条 + if (this.page_now == this.page_count) { + currentPageCount = total_results % this.page_rows; + } + + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + if (!tradeInfo.is_success) { + String tradeInfoId = tradeInfo.tid; + exceptionOrderMap.put(tradeInfoId, + new ShopOrderInfo(tradeInfoId, shopConfig, null, null)); + // exceptionOrderVector.add(new ShopOrderInfo(tradeInfoId, shopConfig, null, + // null)); + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 获取订单详情异常,已加入异常处理队列!", shopConfig.code, + shopConfig.name, tradeInfoId); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + if (!tradeInfo.is_success) { + String tradeInfoId = tradeInfo.tid; + exceptionOrderMap.put(tradeInfoId, + new ShopOrderInfo(tradeInfoId, shopConfig, null, null)); + // exceptionOrderVector.add(new ShopOrderInfo(tradeInfoId, shopConfig, null, + // null)); + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 获取订单详情异常,已加入异常处理队列!", shopConfig.code, + shopConfig.name, tradeInfoId); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.code); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * @author Sunshine + * @className RecatchOrderThread + * @description 根据时间段补抓订单 + * @date 2019/5/29/ 17:21:09 + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + // this.time_start = "2019-04-01 00:00:00";// 开始时间 + this.time_end = time_end;// 结束时间 + // this.time_end = "2019-05-01 00:00:00";// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单响应信息:{}", shopConfig.code, shopConfig.name, response_str); + this.parseOrderList(response_str); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @param response_str 请求响应信息 + * @description 解析订单 + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + // 处理异常信息 + logger.info("[ {} ] | [ {} ] 返回订单,本次补抓到订单数:[ {} ]", shopConfig.code, shopConfig.name, + total_results); + if (total_results < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (total_results > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 当前页条数 + if (this.page_now == this.page_count) {// 只有一页 + currentPageCount = total_results % this.page_rows; + } + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + } + + } + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单,时间:{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } else if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_message, ""); + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,异常编码 [ {} ], 异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + } + + } + + } + + /** + * @param shopOrderInfo 订单信息 + * @description 根据单号补抓订单 + */ + private void getOrderDetailByOrderId(ShopOrderInfo shopOrderInfo) { + + String url = platConfig.api_url + "order/orderDetail?shop_code=" + shopOrderInfo.shopConfig.code + + "&platform_num=" + shopOrderInfo.tid; + try { + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单响应信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, response_str); + + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderDetail_response")) { + JSONObject microservice_orderDetail_response = response_json + .getJSONObject("microservice_orderDetail_response"); + if (microservice_orderDetail_response.has("data")) { + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson( + microservice_orderDetail_response.getJSONObject("data").toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + + } else if (response_json.has("error_response")) { + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 4.108订单号错误 + if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + } else if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单,时间:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,异常编码 [ {} ], 异常信息:[ {} ]时间:{}", + shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + } // 其他问题自动重试 + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @author Sunshine + * @className GetTradeInfoThread + * @description 订单处理线程 + * @date 2019/7/17 14:37:58 + */ + class GetTradeInfoThread implements Runnable { + + @Override + public void run() { + try { + if (orderVector.size() > 0) { + ShopOrderInfo shopOrderInfo = orderVector.get(0); + if (getOrderDetail(shopOrderInfo)) { + orderVector.remove(0); + logger.info("[ {} ] | [ {} ] 异常订单 [ {} ] 获取订单详情成功,已转交至数据处理中心!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + orderVector.remove(0); + exceptionOrderMap.put(shopOrderInfo.tid, shopOrderInfo); + // exceptionOrderVector.add(shopOrderInfo); + logger.info("error:解析订单详情错误,已加入异常处理队列!"); + } + logger.info("[ {} ] | [ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, orderVector.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @param shopOrderInfo 订单信息 + * @return boolean + * @description 根据订单号获取订单详情 + */ + private boolean getOrderDetail(ShopOrderInfo shopOrderInfo) { + + String url = platConfig.api_url + "order/orderDetail?shop_code=" + shopOrderInfo.shopConfig.code + + "&platform_num=" + shopOrderInfo.tid; + try { + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 异常订单 [ {} ] 获取订单详情响应信息 :{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, response_str); + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderDetail_response")) { + JSONObject microservice_orderDetail_response = response_json + .getJSONObject("microservice_orderDetail_response"); + if (microservice_orderDetail_response.has("data")) { + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson( + microservice_orderDetail_response.getJSONObject("data").toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃抓取!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + } + } + return true; + } else if (response_json.has("error_response")) { + shopOrderInfo.shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code + || 119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] 信息异常,将不再抓单,异常信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, error_message); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return false; + } + + } catch (Exception e) { + logger.error(this, e); + shopOrderInfo.shopConfig.errFlag = false; + } + return false; + } + + } + + /** + * @author Sunshine + * @className ExceptionTradeInfoThread + * @description 异常订单处理线程 + * @date 2019/7/17 10:58:41 + */ + class ExceptionTradeInfoThread implements Runnable { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始:异常订单队列剩余未处理数 [ {} ]", exceptionOrderMap.size()); + for (Entry shopOrderInfo : exceptionOrderMap.entrySet()) { + String tradeInfo_id = shopOrderInfo.getKey(); + ShopOrderInfo shop_order_info = shopOrderInfo.getValue(); + exceptionOrderMap.remove(tradeInfo_id); + orderVector.add(shop_order_info); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + } + +} diff --git a/src/com/since/emp/newplatform/service/ApiDouDianNew_Deprecated.java b/src/com/since/emp/newplatform/service/ApiDouDianNew_Deprecated.java new file mode 100644 index 0000000..1eae59c --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiDouDianNew_Deprecated.java @@ -0,0 +1,159 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + + +/** + * @Description: 抖店api接口类 + * @ClassName: ApiDouDianNew + * @author Lewis + * @date 2021-4-12 9:30:24 + * + */ +public class ApiDouDianNew_Deprecated { + private static final Logger logger = LogManager.getLogger(ApiDouDianNew_Deprecated.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiDouDianNew_Deprecated(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "抖店")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + System.out.println(new GsonBuilder().disableHtmlEscaping().create().toJson(platConfig)); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ]根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + threadPool + .execute(new GetOrderDetailThread(logger, recatchConfig, platConfig, shopOrderInfo, "抖店")); + // getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + String apiName = "ApiDouDianNew"; + new UpdateAccessToken().getNewAccessToken(platConfig, logger, apiName); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } +} diff --git a/src/com/since/emp/newplatform/service/ApiGomeNew.java b/src/com/since/emp/newplatform/service/ApiGomeNew.java new file mode 100644 index 0000000..20b4013 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiGomeNew.java @@ -0,0 +1,152 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +/** + * + * @className:ApiGomeNew + * @description:国美Api接口类 + * @author:Sunshine + * @date:2019年7月18日 上午9:36:19 + */ +public class ApiGomeNew { + private static final Logger logger = LogManager.getLogger(ApiGomeNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiGomeNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "国美")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ]根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + threadPool + .execute(new GetOrderDetailThread(logger, recatchConfig, platConfig, shopOrderInfo, "国美")); + // getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } +} diff --git a/src/com/since/emp/newplatform/service/ApiJingdongNew.java b/src/com/since/emp/newplatform/service/ApiJingdongNew.java new file mode 100644 index 0000000..7fdd9bb --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiJingdongNew.java @@ -0,0 +1,1517 @@ +package com.since.emp.newplatform.service; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.jd.open.api.sdk.DefaultJdClient; +import com.jd.open.api.sdk.JdClient; +import com.jd.open.api.sdk.JdException; +import com.jd.open.api.sdk.request.refundapply.PopAfsSoaRefundapplyQueryByIdRequest; +import com.jd.open.api.sdk.request.refundapply.PopAfsSoaRefundapplyQueryPageListRequest; +import com.jd.open.api.sdk.response.refundapply.PopAfsSoaRefundapplyQueryByIdResponse; +import com.jd.open.api.sdk.response.refundapply.PopAfsSoaRefundapplyQueryPageListResponse; +import com.jd.security.tdeclient.TDEClient; +import com.jdcloud.sdk.apim.auth.CredentialsProvider; +import com.jdcloud.sdk.apim.auth.StaticCredentialsProvider; +import com.jdcloud.sdk.apim.client.Environment; +import com.jdcloud.sdk.apim.http.ContentType; +import com.jdcloud.sdk.apim.http.HttpRequestConfig; +import com.jdcloud.sdk.apim.http.Protocol; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.util.HttpRequest; + +import net.jdcloud.HufuErpMigrateV2.client.HufuErpMigrateV2Client; +import net.jdcloud.HufuErpMigrateV2.model.JingdongHufuOrderPopOrderGetRequest; +import net.jdcloud.HufuErpMigrateV2.model.JingdongHufuOrderPopOrderGetResponse; +import net.jdcloud.HufuErpMigrateV2.model.JingdongHufuOrderPopOrderSearchRequest; +import net.jdcloud.HufuErpMigrateV2.model.JingdongHufuOrderPopOrderSearchResponse; +import net.jdcloud.HufuErpMigrateV2.model.jingdonghufuorderpoporderget.JingdongHufuOrderPopOrderGetBody; +import net.jdcloud.HufuErpMigrateV2.model.jingdonghufuorderpopordersearch.JingdongHufuOrderPopOrderSearchBody; + +/** + * + * 京东API请求接口默认设置连接超时时长为0,不超时,读超时时长为0秒,不超时,提供显示设置方法,抓单统一设置为30秒, 库存同步设置为5秒. + * + * ApiJingdong 京东api接口类 + * + * @author Lewis + * + */ +public class ApiJingdongNew { + private static final Logger logger = LogManager.getLogger(ApiJingdongNew.class); + private String logTitle = "ApiJingdongNew"; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private Vector refundQueue; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + private CredentialsProvider credentialsProvider; + private HufuErpMigrateV2Client client; + /* + * 虎符相关配置 + */ + private String accessKeyId;// 鼎外appkey + private String customerId;// 京东虎符客户编号 + +// private static String accessKeyId = "2D21F9134F11451D156D4110F4552997";//鼎内appkey +// private static String secretKey = "89B0A7E118BDF86C8CC2664DD8C748AD";//鼎内appsecret + + + public ApiJingdongNew(PlatConfig platConfig, RecatchConfig recatchConfig,String accessKeyId, String secretKey, String endpoint, + String customerId) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + this.accessKeyId = accessKeyId; + this.customerId = customerId; + try { + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + credentialsProvider = new StaticCredentialsProvider(accessKeyId, secretKey); + client = HufuErpMigrateV2Client.builder() + .credentialsProvider(credentialsProvider) + .httpRequestConfig(new HttpRequestConfig.Builder().connectionTimeout(10000) + .contentType(ContentType.APPLICATION_JSON).protocol(Protocol.HTTPS).build()) + .environment(new Environment.Builder().endpoint(endpoint).build()) // 线上环境地址 + .build(); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderThread2 thread2 = new GetOrderThread2(platConfig.apps.get(0).shops.get(i), + recatchConfig.starTime, recatchConfig.endTime); + // thread2.start(); + threadPool.execute(thread2); + } + + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + refundQueue = new Vector(); + GetRefundInfoThread grt = new GetRefundInfoThread(); + scheduledThreadPool.scheduleAtFixedRate(grt, 0, 500, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ] ", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + dealUpdateToken(); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + /* + * 调用虎符接口获取订单 + */ + JingdongHufuOrderPopOrderSearchRequest jingdongHufuOrderPopOrderSearchRequest = new JingdongHufuOrderPopOrderSearchRequest(); + jingdongHufuOrderPopOrderSearchRequest.setAppKey(accessKeyId); + jingdongHufuOrderPopOrderSearchRequest.setCustomerId(customerId); + jingdongHufuOrderPopOrderSearchRequest.setMethod("jingdong.hufu.order.popOrderSearch"); + JingdongHufuOrderPopOrderSearchBody jingdongHufuOrderPopOrderSearchBody = new JingdongHufuOrderPopOrderSearchBody(); + jingdongHufuOrderPopOrderSearchBody.setToken(shopConfig.session_key);// d291b02aa59e4befba9c2402fda6a720di5m + jingdongHufuOrderPopOrderSearchBody + .setOrderState("WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,FINISHED_L"); + jingdongHufuOrderPopOrderSearchBody.setPage(String.valueOf(page_now)); + jingdongHufuOrderPopOrderSearchBody.setPageSize(String.valueOf(page_rows)); + jingdongHufuOrderPopOrderSearchBody.setStartDate(time_start); + jingdongHufuOrderPopOrderSearchBody.setEndDate(time_end); + jingdongHufuOrderPopOrderSearchBody + .setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + jingdongHufuOrderPopOrderSearchBody.setOptionalFields( + "venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + jingdongHufuOrderPopOrderSearchRequest + .setJingdongHufuOrderPopOrderSearchBody(jingdongHufuOrderPopOrderSearchBody); + JingdongHufuOrderPopOrderSearchResponse jingdongHufuOrderPopOrderSearchResponse = client + .jingdongHufuOrderPopOrderSearch(jingdongHufuOrderPopOrderSearchRequest); + String hfJsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(jingdongHufuOrderPopOrderSearchResponse); + JSONObject hfJsonResult = new JSONObject(hfJsonString); + JSONObject result = hfJsonResult.getJSONObject("result"); + logger.info("[ {} ] | [ {} ] 虎符返回批量订单:{}", shopConfig.code, shopConfig.name, result.toString()); + String code = result.getString("code"); + if (!"0000".equals(code)) { + logger.info("[ {} ] | [ {} ] 虎符返回订单异常,等待下次重试"); + return; + } + + String url = platConfig.agent_api_ip + "/jd/orderSearch"; + String order_status = "WAIT_SELLER_STOCK_OUT,FINISHED_L"; + String params = "session_key=" + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + + time_end + "&order_status=" + order_status + "&shop_code=" + shopConfig.code + "&page_now=" + + String.valueOf(page_now) + "&page_rows=" + String.valueOf(page_rows) + + "&sort_type=0&date_type=0"; + HttpRequest httpRequest = new HttpRequest(); + params = params.replaceAll(" ", "%20"); + String jsonString = httpRequest.sendGet(url, params, logTitle); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + String code = json.getString("code"); + if ("0000".equals(code)) { + int totalResults = json.getInt("totalResults"); + if (totalResults < 1) { + shopConfig.errFlag = false; + return; + } + JSONArray orderList = json.getJSONArray("orderList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(order.toString(), TradeInfo.class); + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + // 等待出库 的订单 + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } + + } + this.page_count = (int) Math.ceil((double) totalResults / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else { + if ("102".equals(code)) { + logger.info("异常订单返回结果:{}", jsonString); + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if ("120".equals(code)) { + logger.info("异常订单返回结果:{}", jsonString); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 补抓单处理线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + /* + * 调用虎符接口获取订单 + */ + JingdongHufuOrderPopOrderSearchRequest jingdongHufuOrderPopOrderSearchRequest = new JingdongHufuOrderPopOrderSearchRequest(); + jingdongHufuOrderPopOrderSearchRequest.setAppKey(accessKeyId); + jingdongHufuOrderPopOrderSearchRequest.setCustomerId(customerId); + jingdongHufuOrderPopOrderSearchRequest.setMethod("jingdong.hufu.order.popOrderSearch"); + JingdongHufuOrderPopOrderSearchBody jingdongHufuOrderPopOrderSearchBody = new JingdongHufuOrderPopOrderSearchBody(); + jingdongHufuOrderPopOrderSearchBody.setToken(shopConfig.session_key);// d291b02aa59e4befba9c2402fda6a720di5m + jingdongHufuOrderPopOrderSearchBody + .setOrderState("WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,FINISHED_L"); + jingdongHufuOrderPopOrderSearchBody.setPage(String.valueOf(page_now)); + jingdongHufuOrderPopOrderSearchBody.setPageSize(String.valueOf(page_rows)); + jingdongHufuOrderPopOrderSearchBody.setStartDate(time_start); + jingdongHufuOrderPopOrderSearchBody.setEndDate(time_end); + jingdongHufuOrderPopOrderSearchBody + .setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + jingdongHufuOrderPopOrderSearchBody.setOptionalFields( + "venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + jingdongHufuOrderPopOrderSearchRequest + .setJingdongHufuOrderPopOrderSearchBody(jingdongHufuOrderPopOrderSearchBody); + JingdongHufuOrderPopOrderSearchResponse jingdongHufuOrderPopOrderSearchResponse = client + .jingdongHufuOrderPopOrderSearch(jingdongHufuOrderPopOrderSearchRequest); + String hfJsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(jingdongHufuOrderPopOrderSearchResponse); + logger.info("[ {} ] | [ {} ] 虎符返回批量订单:{}", shopConfig.code, shopConfig.name, hfJsonString); + + JSONObject hfJsonResult = new JSONObject(hfJsonString); + JSONObject result = hfJsonResult.getJSONObject("result"); + String code = result.getString("code"); + if (!"0000".equals(code)) { + logger.info("[ {} ] | [ {} ] 虎符返回订单异常,等待下次重试"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + return; + } + String url = platConfig.agent_api_ip + "/jd/orderSearch"; + String order_status = "WAIT_SELLER_STOCK_OUT,FINISHED_L"; + String params = "session_key=" + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + + time_end + "&order_status=" + order_status + "&page_now=" + String.valueOf(page_now) + + "&shop_code=" + shopConfig.code + "&page_rows=" + String.valueOf(page_rows) + + "&sort_type=0&date_type=1"; + params = params.replaceAll(" ", "%20"); + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendGet(url, params, logTitle); + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + logger.info(jsonString); + parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析京东返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + String code = json.getString("code"); + if ("0000".equals(code)) { + int totalResults = json.getInt("totalResults"); + if (totalResults < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (totalResults > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + JSONArray orderList = json.getJSONArray("orderList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(order.toString(), TradeInfo.class); + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", + ""); + } + continue; + } + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单 [ {} ] 处理失败!", tradeInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + this.page_count = (int) Math.ceil((double) totalResults / page_rows);// 计算分页总数 + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end; + } + + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if ("102".equals(code)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + } + + } + + public static String asciiToString(String value) { + StringBuffer sbu = new StringBuffer(); + String[] chars = value.split(","); + for (int i = 0; i < chars.length; i++) { + sbu.append((char) Integer.parseInt(chars[i])); + } + return sbu.toString(); + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + JingdongHufuOrderPopOrderGetRequest jingdongHufuOrderPopOrderGetRequest = new JingdongHufuOrderPopOrderGetRequest(); + jingdongHufuOrderPopOrderGetRequest.setAppKey(accessKeyId); + jingdongHufuOrderPopOrderGetRequest.setCustomerId(customerId); + jingdongHufuOrderPopOrderGetRequest.setMethod("jingdong.hufu.order.popOrderGet"); + JingdongHufuOrderPopOrderGetBody jingdongHufuOrderPopOrderGetBody = new JingdongHufuOrderPopOrderGetBody(); + jingdongHufuOrderPopOrderGetBody.setOptionalFields( + "venderId,returnOrder,pin,consigneeInfo.county,consigneeInfo.province,consigneeInfo.town,consigneeInfo.city,consigneeInfo.mobile,consigneeInfo.fullAddress,consigneeInfo.telephone,consigneeInfo.fullname,consigneeInfo.cityId,consigneeInfo.townId,consigneeInfo.provinceId,consigneeInfo.countyId,waybill,logisticsId,parentOrderId,orderType,itemInfoList.skuName,itemInfoList.itemTotal,itemInfoList.wareId,itemInfoList.outerSkuId,itemInfoList.jdPrice,itemInfoList.serviceName,itemInfoList.itemExt,itemInfoList.giftPoint,itemInfoList.skuId,itemInfoList.productNo,itemInfoList.newStoreId,itemInfoList.itemImg,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo.invoiceConsigneeEmail,invoiceEasyInfo.invoiceConsigneePhone,invoiceEasyInfo.invoiceType,invoiceEasyInfo.invoiceContentId,invoiceEasyInfo.invoiceTitle,invoiceEasyInfo.invoiceCode,vatInfo.bankAccount,vatInfo.userAddress,vatInfo.depositBank,vatInfo.vatNo,vatInfo.addressRegIstered,vatInfo.userPhone,userName,vatInfo.phoneRegIstered,couponDetailList.orderId,couponDetailList.couponType,couponDetailList.couponPrice,couponDetailList.skuId"); + jingdongHufuOrderPopOrderGetBody.setToken(shopOrderInfo.shopConfig.session_key); + jingdongHufuOrderPopOrderGetBody.setOrderId(shopOrderInfo.tid); + jingdongHufuOrderPopOrderGetBody + .setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + jingdongHufuOrderPopOrderGetRequest.setJingdongHufuOrderPopOrderGetBody(jingdongHufuOrderPopOrderGetBody); + JingdongHufuOrderPopOrderGetResponse jingdongHufuOrderPopOrderGet = client + .jingdongHufuOrderPopOrderGet(jingdongHufuOrderPopOrderGetRequest); + String hfJsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(jingdongHufuOrderPopOrderGet); + logger.info("[ {} ] | [ {} ] 虎符返回订单详情:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, hfJsonString); + JSONObject jsonResult = new JSONObject(hfJsonString); + JSONObject result = jsonResult.getJSONObject("result"); + String code = result.getString("code"); + if (!"0000".equals(code)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + + String param = "session_key=" + shopOrderInfo.shopConfig.session_key + "&platform_num=" + shopOrderInfo.tid + "&shop_code=" + shopOrderInfo.shopConfig.code; + HttpRequest httpRequest = new HttpRequest(); + tradeInfoString = httpRequest.sendGet(platConfig.agent_api_ip + "/jd/orderGet", param, logTitle); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + + JSONObject json = new JSONObject(tradeInfoString); + code = json.getString("code"); + + // api接口错误处理 + if (!"0000".equals(code)) { + if ("102".equals(code)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopConfig.code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + }else if ("108".equals(code)) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + JSONObject orderInfo = json.getJSONObject("orderInfo"); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(orderInfo.toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", ""); + } + return false; + } + + // TODO 用完改为 WAIT_SELLER_STOCK_OUT + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单[ {} ]处理失败!", shopOrderInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + /* + private TradeInfo parseTradeInfo(String jsonString, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = new JSONObject(jsonString); + // JSONObject orderList = json.getJSONObject("order_get_response"); + // JSONObject order = orderList.getJSONObject("order"); + // JSONObject orderDetail = order.getJSONObject("orderInfo"); + JSONObject orderDetail = json; + JSONObject userInfo = orderDetail.getJSONObject("consigneeInfo"); + JSONArray orderItemList = orderDetail.getJSONArray("itemInfoList"); + // JSONArray coupon_detail = + // orderDetail.getJSONArray("couponDetailList"); + + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopOrderInfo.shopConfig.company_code; + tradeInfo.shop_code = shopOrderInfo.shopConfig.code; + tradeInfo.delivery_mode_id = shopOrderInfo.shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopOrderInfo.shopConfig.storage_code; + tradeInfo.company_type = shopOrderInfo.shopConfig.company_type; + tradeInfo.pay_percent = shopOrderInfo.shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = orderDetail.getString("orderId"); + tradeInfo.status = orderDetail.getString("orderState"); + tradeInfo.num = 0; + tradeInfo.discount_fee = orderDetail.getString("sellerDiscount"); + tradeInfo.money = orderDetail.getString("orderSellerPrice"); + tradeInfo.pay_money = orderDetail.getString("orderPayment"); + tradeInfo.product_fee = orderDetail.getString("orderTotalPrice"); + tradeInfo.created = orderDetail.getString("orderStartTime"); + // tradeInfo.pay_time = orderDetail.getString("paymentConfirmTime"); + tradeInfo.pay_time = orderDetail.has("paymentConfirmTime") ? orderDetail.getString("paymentConfirmTime") + : "到付订单"; + tradeInfo.platform_modify_time = orderDetail.getString("modified"); + tradeInfo.post_fee = orderDetail.getString("freightPrice"); + tradeInfo.buyer_nick = orderDetail.getString("pin"); + // tradeInfo.alipay_id = orderDetail.getString("pin"); + String fullname = userInfo.getString("fullname"); + TDEClient tdeClient = null; + try { + tdeClient = SecretJdClient.getInstance(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret); + } catch (Exception e) { + logger.error(this, e); + } + + if (TDEClient.isEncryptData(fullname)) { + tradeInfo.receiver_name = new String(tdeClient.decrypt(fullname), "UTF-8"); + tradeInfo.encrpy_name = fullname; + } else { + tradeInfo.receiver_name = fullname; + tradeInfo.encrpy_name = ""; + } + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = userInfo.has("province") ? userInfo.getString("province") : ""; + + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + String city = userInfo.has("province") ? userInfo.getString("province") : ""; + tradeInfo.receiver_city = city + "市"; + tradeInfo.receiver_district = userInfo.has("city") ? userInfo.getString("city") : ""; + } else { + tradeInfo.receiver_city = userInfo.has("city") ? userInfo.getString("city") : ""; + tradeInfo.receiver_district = userInfo.has("county") ? userInfo.getString("county") : ""; + } + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + + // 根据店铺设置匹配发货的快递 + + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + String fullAddress = userInfo.getString("fullAddress"); + if (TDEClient.isEncryptData(fullAddress)) { + tradeInfo.receiver_address = new String(tdeClient.decrypt(fullAddress), "UTF-8"); + tradeInfo.encrpy_address = fullAddress; + } else { + tradeInfo.receiver_address = fullAddress; + tradeInfo.encrpy_address = ""; + } + // tradeInfo.receiver_address = userInfo.getString("fullAddress"); + String mobile = userInfo.has("mobile") ? userInfo.getString("mobile") : ""; + if (TDEClient.isEncryptData(mobile)) { + tradeInfo.receiver_mobile = new String(tdeClient.decrypt(mobile), "UTF-8"); + tradeInfo.encrpy_mobile = mobile; + } else { + tradeInfo.receiver_mobile = mobile; + tradeInfo.encrpy_mobile = ""; + } + // tradeInfo.receiver_mobile = userInfo.has("mobile") ? + // userInfo.getString("mobile") : ""; + String telephone = userInfo.has("telephone") ? userInfo.getString("telephone") : ""; + if (TDEClient.isEncryptData(telephone)) { + tradeInfo.receiver_phone = new String(tdeClient.decrypt(telephone), "UTF-8"); + tradeInfo.encrpy_telephone = telephone; + } else { + tradeInfo.receiver_phone = telephone; + tradeInfo.encrpy_telephone = ""; + } + tradeInfo.buyer_message = orderDetail.has("orderRemark") ? orderDetail.getString("orderRemark") : ""; + tradeInfo.seller_memo = orderDetail.has("venderRemark") ? orderDetail.getString("venderRemark") : ""; + tradeInfo.adjust_fee = "0"; + + String payServiceType = orderDetail.has("payType") ? orderDetail.getString("payType") : "-1"; + tradeInfo.type = ""; + + // 京东 + tradeInfo.platform_code = "003"; + + + // 发票 + // tradeInfo.invoice_type = + // orderDetail.getString("invoiceInfo").indexOf("不需要开具发票") >-1 ? 0 : + // 1; + JSONObject invoiceEasyInfo = orderDetail.getJSONObject("invoiceEasyInfo"); + int invoice_type = Integer.valueOf(invoiceEasyInfo.getString("invoiceType")); + + + //京东平台规定:发票类型,0=不开发票、1=普通发票、2=增值税发票、3=电子发票 + tradeInfo.invoice_content = ""; + String invoice_info = orderDetail.getString("invoiceInfo"); + String[] invoiceInfo = invoice_info.split(";"); + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + if (invoiceInfo.length == 3) { + tradeInfo.invoice_content = invoiceInfo[2].split(":")[1]; + } + JSONObject vatInfo = orderDetail.has("vatInfo") ? orderDetail.getJSONObject("vatInfo") : null; + String invoice_title = ""; + if (null != vatInfo) { + invoice_title = vatInfo.has("invoicePersonalName") ? vatInfo.getString("invoicePersonalName") : ""; + } + if (invoice_type == 3) { + tradeInfo.invoice_type = 6; + String invoice_phone = invoiceEasyInfo.has("invoiceConsigneePhone") + ? invoiceEasyInfo.getString("invoiceConsigneePhone") + : ""; + if (TDEClient.isEncryptData(invoice_phone)) { + tradeInfo.invoice_phone = new String(tdeClient.decrypt(invoice_phone), "UTF-8"); + tradeInfo.encrypt_invoice_phone = invoice_phone; + } else { + tradeInfo.invoice_phone = invoice_phone; + tradeInfo.encrypt_invoice_phone = ""; + } + String invoice_email = invoiceEasyInfo.has("invoiceConsigneeEmail") + ? invoiceEasyInfo.getString("invoiceConsigneeEmail") + : ""; + if (TDEClient.isEncryptData(invoice_email)) { + tradeInfo.invoice_email = new String(tdeClient.decrypt(invoice_email), "UTF-8"); + tradeInfo.encrypt_invoice_email = invoice_email; + } else { + tradeInfo.invoice_email = invoice_email; + tradeInfo.encrypt_invoice_email = ""; + } + invoice_title = "".equals(invoice_title) ? invoiceEasyInfo.getString("invoiceTitle") : invoice_title; + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + + if (!"个人".equals(tradeInfo.invoice_title)) { + tradeInfo.tax_id = invoiceEasyInfo.has("invoiceCode") ? invoiceEasyInfo.getString("invoiceCode") + : ""; + } + } + if (invoice_type == 2) { + tradeInfo.invoice_type = 7;// erp系统3对应增票 + + String invoice_address = vatInfo.getString("addressRegIstered"); + String invoice_phone = vatInfo.getString("phoneRegIstered"); + String invoice_bank = vatInfo.getString("depositBank"); + tradeInfo.bank_of_deposit = invoice_bank; + String invoice_account = vatInfo.getString("bankAccount"); + if (TDEClient.isEncryptData(invoice_account)) { + tradeInfo.encrypt_bank_account = invoice_account; + invoice_account = new String(tdeClient.decrypt(invoice_account), "UTF-8"); + } else { + tradeInfo.encrypt_bank_account = ""; + } + + tradeInfo.address_telephone = invoice_address + " " + invoice_phone; + tradeInfo.bank_of_deposit_account_number = invoice_bank + " " + invoice_account; + tradeInfo.tax_id = vatInfo.getString("vatNo"); + invoice_title = invoiceEasyInfo.getString("invoiceTitle"); + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + } + if (invoice_type == 1) { + tradeInfo.invoice_type = 6;// erp系统2对应新版普票 + invoice_title = "".equals(invoice_title) ? invoiceEasyInfo.getString("invoiceTitle") : invoice_title; + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + if (!"个人".equals(tradeInfo.invoice_title)) { + tradeInfo.tax_id = invoiceEasyInfo.has("invoiceCode") ? invoiceEasyInfo.getString("invoiceCode") + : ""; + } + } + + tradeInfo.invoice_money = tradeInfo.pay_money; + + // 商品 + tradeInfo.orders = new OrderInfo[orderItemList.length()]; + for (int i = 0; i < orderItemList.length(); i++) { + JSONObject item = orderItemList.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outerSkuId") ? item.getString("outerSkuId") : ""; + String sku_id = item.getString("skuId"); + + // c3b758c08fb24151aab9a6b0ce92369eninz + if (orderInfo.platform_seller_code == null || "".equals(orderInfo.platform_seller_code)) { + JdClient client = new DefaultJdClient(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret, 5000, 5000); + SkuReadFindSkuByIdRequest request = new SkuReadFindSkuByIdRequest(); + request.setSkuId(Long.valueOf(sku_id)); + + request.setField("outer_id"); + SkuReadFindSkuByIdResponse response = client.execute(request); + String skuString = response.getMsg(); + JSONObject jsonStr = new JSONObject(skuString); + logger.info("[ {} ] | [ {} ] 通过订单详单查询订单外部编码响应信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, skuString); + // api接口错误处理 + if (jsonStr.has("error_response")) { + return null; + } + logger.info("[ {} ] | [ {} ] 通过订单详单查询到的订单外部编码为空,通过商品API查询编码返回:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, jsonStr); + JSONObject skuList = jsonStr.getJSONObject("jingdong_sku_read_findSkuById_responce"); + JSONObject sku = skuList.getJSONObject("sku"); + orderInfo.platform_seller_code = sku.getString("outerId"); + } + orderInfo.num = Integer.valueOf(item.getString("itemTotal")); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getString("jdPrice"); + orderInfo.total_fee = Double.valueOf(orderInfo.price) * orderInfo.num + ""; + orderInfo.discount_fee = "" + 0; + orderInfo.payment = String.valueOf(orderInfo.num * Double.valueOf(orderInfo.price)); + orderInfo.title = item.getString("skuName"); + orderInfo.sku_id = sku_id; + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } +*/ + public TradeInfo decryptInvoiceTitle(TDEClient tdeClient, TradeInfo tradeInfo, String invoice_title) + throws Exception { + if (TDEClient.isEncryptData(invoice_title)) { + tradeInfo.invoice_title = new String(tdeClient.decrypt(invoice_title), "UTF-8"); + tradeInfo.encrypt_invoice_title = invoice_title; + } else { + tradeInfo.invoice_title = invoice_title; + tradeInfo.encrypt_invoice_title = ""; + } + return tradeInfo; + } + + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数1-50 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + JdClient client = new DefaultJdClient(platConfig.api_url, shopConfig.session_key, appConfig.key, + appConfig.secret, 30 * 1000, 30 * 1000);// connectTimeout=30秒,readTimeout=30秒 + PopAfsSoaRefundapplyQueryPageListRequest request = new PopAfsSoaRefundapplyQueryPageListRequest(); + request.setApplyTimeStart(time_start); + request.setApplyTimeEnd(time_end); + request.setPageIndex(page_now); + request.setPageSize(page_rows); + PopAfsSoaRefundapplyQueryPageListResponse response = client.execute(request); + + String jsonString = response.getMsg(); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (JdException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_afs_soa_refundapply_queryPageList_responce")) { + JSONObject jingdong_pop_afs_soa_refundapply_queryPageList_responce = json + .getJSONObject("jingdong_pop_afs_soa_refundapply_queryPageList_responce"); + JSONObject queryResult = jingdong_pop_afs_soa_refundapply_queryPageList_responce + .getJSONObject("queryResult"); + int totalCount = queryResult.getInt("totalCount"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.refundErrFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray result = queryResult.getJSONArray("result"); + for (int i = 0; i < result.length(); i++) { + JSONObject refundOrder = result.getJSONObject(i); + String refundId = refundOrder.getLong("id") + ""; + refundQueue.add(new ShopOrderInfo(refundId, shopConfig, appConfig.key, appConfig.secret)); + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } else {// 处理错误信息 + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单", shopConfig.code, shopConfig.name); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (jsonString + .indexOf("interval between beginDate and endDate is more than one month") > -1) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * GetOrderInfoThread 获取订单详情线程 + * + * @author Carl + * + */ + private class GetRefundInfoThread extends Thread { + @Override + public void run() { + // while (true) { + try { + if (refundQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = (ShopOrderInfo) refundQueue.get(0); + logger.info("[" + shopOrderInfo.shopConfig.name + "] 获取退款订单详情|" + shopOrderInfo.tid); + if (getRefundInfo(shopOrderInfo)) {// 如果队列中订单有问题,订单已查询到,可以排除系统级错误,不断重试,并不会影响其他线程 + logger.info("[ {} ] | [ {} ] 获取退款订单详情成功[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + logger.info("[ {} ] | [ {} ] 获取退款订单处理失败[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } + refundQueue.remove(0); + logger.info("[ {} ] | [ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, refundQueue.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + } + } + + private boolean getRefundInfo(ShopOrderInfo shopOrderInfo) { + + try { + + JdClient client = new DefaultJdClient(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret, 30 * 1000, 30 * 1000);// connectTimeout=30秒,readTimeout=30秒 + PopAfsSoaRefundapplyQueryByIdRequest request = new PopAfsSoaRefundapplyQueryByIdRequest(); + request.setId(Long.valueOf(shopOrderInfo.tid)); + PopAfsSoaRefundapplyQueryByIdResponse response = client.execute(request); + String jsonString = response.getMsg(); + + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_afs_soa_refundapply_queryById_responce")) { + List refundlist = parseRefundInfo(jsonString, shopOrderInfo.shopConfig); + if (refundlist == null) { + logger.info("[ {} ] | [ {} ] error:订单[ {} ]解析订单详情错误!时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + for (int i = 0; i < refundlist.size(); i++) { + RefundInfo refundInfo = refundlist.get(i); + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // return false; + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + return false; + } + } + return true; + } else { + // 处理错误信息 + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] 返回退款订单:{}",shopOrderInfo.shopConfig.name , errInfo); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return false; + + } + } catch (Exception e) { + logger.error(this, e); + return false; + } + } + + private List parseRefundInfo(String jsonString, ShopConfig shopConfig) { + List refundList = Collections.synchronizedList(new ArrayList()); + try { + RefundInfo refundInfo = new RefundInfo(); + JSONObject json = new JSONObject(jsonString); + JSONObject jingdong_pop_afs_soa_refundapply_queryById_responce = json + .getJSONObject("jingdong_pop_afs_soa_refundapply_queryById_responce"); + JSONObject queryResult = jingdong_pop_afs_soa_refundapply_queryById_responce.getJSONObject("queryResult"); + JSONArray results = queryResult.getJSONArray("result"); + for (int i = 0; i < results.length(); i++) { + JSONObject result = results.getJSONObject(i); + refundInfo.tid = result.getString("orderId"); + refundInfo.refund_id = result.getLong("id") + ""; + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.platform_code = shopConfig.platformCode; + try { + refundInfo.desc = result.has("checkRemark") ? result.getString("checkRemark") : ""; + } catch (JSONException e) { + logger.error(this, e); + refundInfo.desc = ""; + } catch (Exception e) { + logger.error(this, e); + refundInfo.desc = ""; + } + refundInfo.reason = "其它"; + refundList.add(refundInfo); + } + + } catch (Exception e) { + logger.error(this, e); + } + return refundList; + } + + /** + * + * @ClassName:UpdateTokenThread + * @Author:Luke + * @Date:2018年11月23日 下午3:21:45 + */ + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 2 * 60 * 60 * 1000) && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于两个个小时的话更新 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String client_id = um.app_key; + String client_secret = um.app_secret; + String refresh_token = um.refresh_token; + String url = "https://oauth.jd.com/oauth/token"; + String params = "client_id=" + client_id + "&client_secret=" + client_secret + + "&grant_type=refresh_token&refresh_token=" + refresh_token; + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, params, 3, logTitle); + JSONObject json = new JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新码到期,放弃刷新", shop_code, shop_name); + } + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_code, shop_name, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code, shop_name); + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌成功,已写入数据库!", shop_code, shop_name); + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/newplatform/service/ApiKtt.java b/src/com/since/emp/newplatform/service/ApiKtt.java new file mode 100644 index 0000000..f171784 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiKtt.java @@ -0,0 +1,741 @@ +package com.since.emp.newplatform.service; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddKttIncrementOrderQueryRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddKttOrderGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddKttOrderListRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddKttIncrementOrderQueryResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddKttOrderGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddKttOrderListResponse; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +/** + * @Description: 快团团订单类 + * 快团团api地址:https://open.pinduoduo.com/application/document/api?id=pdd.ktt.increment.order.query&permissionId=101 + * @ClassName: ApiKtt2 + * @author Lewis + * @date 2021年5月31日 下午4:55:40 + * + */ +public class ApiKtt { + private static final Logger logger = LogManager.getLogger(ApiKtt.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + /** + * 弃用executors创建线程池,改为ThreadPoolExecutors创建 + */ + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiKtt(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + boolean recatchFlag = (!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId))); + if (recatchFlag) { + // 根据订单生成时间抓取订单 + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderThread2 thread2 = new GetOrderThread2(platConfig.apps.get(0), + platConfig.apps.get(0).shops.get(i), recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(thread2); + } + + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = new StringBuilder(shopName).append(",") + .append(platConfig.apps.get(i).shops.get(j).name).toString(); + shopCode = new StringBuilder(shopCode).append(",") + .append(platConfig.apps.get(i).shops.get(j).code).toString(); + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ] ", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 1; + private int pageNow = 1; + private int pageRows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, pageNow); + + PopClient client = new PopHttpClient(appConfig.key, appConfig.secret); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + PddKttIncrementOrderQueryRequest request = new PddKttIncrementOrderQueryRequest(); +// request.setActivityNo("str");//团号 + request.setAfterSalesStatus(0);// 售后状态 0-未发起售后 1-退款中 2-退款成功 3-待处理 4-拒绝退款 + request.setCancelStatus(0);// 取消状态, 可选 0-未取消 1-已取消 + request.setEndUpdatedAt(sdf.parse(timeEnd).getTime());// 更新结束时间 + request.setPageNumber(pageNow);// 页码 + request.setPageSize(pageRows);// 每页订单数量 + request.setShippingStatus(0);// 发货状态, 可选 0-未发货 1-已发货 + request.setStartUpdatedAt(sdf.parse(timeStart).getTime()); // 更新起始时间 +// request.setVerificationStatus(0);//核销状态, 可选 0-未核销 1-已核销 2-部分核销 + PddKttIncrementOrderQueryResponse response = client.syncInvoke(request, shopConfig.session_key); + String jsonString = JsonUtil.transferToJson(response); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = JSONObject.parseObject(jsonString); + if (json.containsKey("ktt_increment_order_query_response")) { + JSONObject kttIncrementOrderQueryResponse = json + .getJSONObject("ktt_increment_order_query_response"); + int totalCount = kttIncrementOrderQueryResponse.getIntValue("total_count"); + if (totalCount < 1) { + shopConfig.errFlag = false; + return; + } + JSONArray orderList = kttIncrementOrderQueryResponse.getJSONArray("order_list"); + for (int i = 0; i < orderList.size(); i++) { + JSONObject order = orderList.getJSONObject(i); + String orderId = order.getString("order_sn"); + TradeInfo tradeInfo = parseTradeInfo(order, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + tradeInfo = Transform.transform2DeliveryMode(shopConfig, tradeInfo); + // 等待出库 的订单 + if ("0".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + /* + * else if ("FINISHED_L".equals(tradeInfo.status)) { + * + * OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); } + */ + } + this.pageCount = (int) Math.ceil((double) totalCount / pageRows);// 计算分页总数 + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else { + logger.info("异常订单返回结果:{}", jsonString); + JSONObject errorResponse = json.getJSONObject("error_response"); + String errorCode = errorResponse.getString("error_code"); + if ("10019".equals(errorCode)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if ("50001".equals(errorCode)) { + String subCode = errorResponse.getString("sub_code"); + if ("2000000".equals(subCode)) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 补抓单处理线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + private AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 1; + private int pageNow = 1; + private int pageRows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.shopConfig = shopConfig; + this.appConfig = appConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + PopClient client = new PopHttpClient(appConfig.key, appConfig.secret); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + PddKttOrderListRequest request = new PddKttOrderListRequest(); +// request.setActivityNo("str"); + request.setAfterSalesStatus(0); + request.setCancelStatus(0); + request.setConfirmAtBegin(sdf.parse(timeStart).getTime()); + request.setConfirmAtEnd(sdf.parse(timeEnd).getTime()); + request.setPageNumber(pageNow); + request.setPageSize(pageRows); + request.setShippingStatus(0); +// request.setVerificationStatus(0); + PddKttOrderListResponse response = client.syncInvoke(request, shopConfig.session_key); + String jsonString = JsonUtil.transferToJson(response); + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, pageNow); + logger.info(jsonString); + JSONObject json = JSONObject.parseObject(jsonString); +// JSONObject kttOrderListResponse = json.getJSONObject("ktt_order_list_response"); + if (!json.containsKey("ktt_order_list_response")) { + logger.info("[ {} ] | [ {} ] 返回订单异常,等待下次重试"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快团团平台故障,请联系软维ERP排查", ""); + } + return; + } + + parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析快团团返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = JSONObject.parseObject(jsonString); + if (json.containsKey("ktt_order_list_response")) { + JSONObject kttOrderListResponse = json.getJSONObject("ktt_order_list_response"); + int totalCount = kttOrderListResponse.getIntValue("total_count"); + if (totalCount < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + JSONArray orderList = kttOrderListResponse.getJSONArray("order_list"); + for (int i = 0; i < orderList.size(); i++) { + JSONObject order = orderList.getJSONObject(i); + String orderId = order.getString("order_sn"); + TradeInfo tradeInfo = parseTradeInfo(order, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + tradeInfo = Transform.transform2DeliveryMode(shopConfig, tradeInfo); + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无未发货的子订单", ""); + } + continue; + } + if ("0".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + /* + * else if ("FINISHED_L".equals(tradeInfo.status)) { if + * (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + * logger.info("交易成功订单 [ {} ] 处理失败!", tradeInfo.tid); // System.exit(0); } } + */ + else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + } + + this.pageCount = (int) Math.ceil((double) totalCount / pageRows);// 计算分页总数 + //在最后一页更新批量补录的状态 + if(this.pageNow == this.pageCount){ + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.timeEnd; + } + + } else { + logger.info("异常订单返回结果:{}", jsonString); + JSONObject errorResponse = json.getJSONObject("error_response"); + String errorCode = errorResponse.getString("error_code"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if ("10019".equals(errorCode)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快团团平台故障,请联系软维ERP排查", ""); + } + } + + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快团团平台故障,请联系软维ERP排查", ""); + } + } + } + + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + PopClient client = new PopHttpClient(shopOrderInfo.app_key, shopOrderInfo.app_secret); + + PddKttOrderGetRequest request = new PddKttOrderGetRequest(); + request.setOrderSn(shopOrderInfo.tid); + PddKttOrderGetResponse response = client.syncInvoke(request, shopOrderInfo.shopConfig.session_key); + String jsonString = JsonUtil.transferToJson(response); + logger.info("[ {} ] | [ {} ] 返回订单详情:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + jsonString); + JSONObject jsonResult = JSONObject.parseObject(jsonString); + + /* + * if (!jsonResult.has("ktt_order_get_response")) { // 提交任务补抓单程序的结果 if + * (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == + * 4) { OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + * "快团团平台故障,请联系软维ERP排查", ""); } } + */ + + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + + // api接口错误处理 + if (!jsonResult.containsKey("ktt_order_get_response")) { + JSONObject errorResponse = jsonResult.getJSONObject("error_response"); + String errorCode = errorResponse.getString("error_code"); + if ("10019".equals(errorCode)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopConfig.code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + /** + * 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + */ + return true; + } + /* + * else if ("108".equals(code)) { if (recatchConfig.type == 1 || + * recatchConfig.type == 3 || recatchConfig.type == 4) { + * OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + * "无此订单号,请核对后重新提交!", ""); } } + */ + else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快团团平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + JSONObject kttOrderGetResponse = jsonResult.getJSONObject("ktt_order_get_response"); + JSONObject orderInfo = kttOrderGetResponse.getJSONObject("order_info"); + TradeInfo tradeInfo = parseTradeInfo(orderInfo, shopOrderInfo.shopConfig); + + tradeInfo = Transform.transform2DeliveryMode(shopOrderInfo.shopConfig, tradeInfo); + + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无未发货的子订单", ""); + } + return false; + } + + if ("0".equals(tradeInfo.status)) { + /** + * 发送tradeInfo至订单数据处理队列 + */ + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + } + /* + * else if ("FINISHED_L".equals(tradeInfo.status)) { if + * (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + * logger.info("交易成功订单[ {} ]处理失败!", shopOrderInfo.tid); // System.exit(0); } } + */ + else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + + private TradeInfo parseTradeInfo(JSONObject orderDetail, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + // 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 订单配置信息 + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + // 订单平台解析数据 + tradeInfo.tid = orderDetail.getString("order_sn"); + tradeInfo.status = String.valueOf(orderDetail.getIntValue("shipping_status")); + tradeInfo.num = 0; + tradeInfo.discount_fee = String.valueOf(orderDetail.getLong("discount_amount") / 100.0); + tradeInfo.money = String.valueOf(orderDetail.getLong("order_amount") / 100.0); + tradeInfo.pay_money = String.valueOf(orderDetail.getLong("order_amount") / 100.0); + tradeInfo.product_fee = tradeInfo.money; + tradeInfo.pay_time = tradeInfo.created = sdf.format(new Date(orderDetail.getLong("confirm_at"))); + tradeInfo.platform_modify_time = sdf.format(new Date(orderDetail.getLong("updated_at"))); + tradeInfo.post_fee = String.valueOf(orderDetail.getLong("shipping_amount") / 100.0); + tradeInfo.buyer_nick = orderDetail.getString("nick_name"); + + tradeInfo.receiver_name = orderDetail.getString("receiver_name"); + + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = orderDetail.getString("receiver_address_province"); + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + tradeInfo.receiver_city = orderDetail.getString("receiver_address_city"); + tradeInfo.receiver_district = orderDetail.getString("receiver_address_district"); + String receiverAddressDetail = orderDetail.getString("receiver_address_detail"); + tradeInfo.receiver_address = new StringBuilder(tradeInfo.receiver_state).append(" ") + .append(tradeInfo.receiver_city).append(" ").append(tradeInfo.receiver_district).append(" ") + .append(receiverAddressDetail).toString(); + tradeInfo.receiver_mobile = orderDetail.containsKey("receiver_mobile") + ? orderDetail.getString("receiver_mobile") + : ""; + tradeInfo.receiver_phone = orderDetail.containsKey("receiver_mobile") + ? orderDetail.getString("receiver_mobile") + : ""; + tradeInfo = Transform.transform2DeliveryMode(shopConfig, tradeInfo); + + String businessNote = orderDetail.containsKey("business_note") ? orderDetail.getString("business_note") + : ""; + String buyerMemo = orderDetail.containsKey("buyer_memo") ? orderDetail.getString("buyer_memo") : ""; + + tradeInfo.buyer_message = !"".equals(businessNote) + ? new StringBuilder("团长备注:").append(businessNote).toString() + : ""; + tradeInfo.buyer_message = !"".equals(buyerMemo) + ? new StringBuilder(!"".equals(tradeInfo.buyer_message) ? tradeInfo.buyer_message + "," : "") + .append("团员备注:").toString() + : tradeInfo.buyer_message; + tradeInfo.seller_memo = "跟团号:" + (orderDetail.containsKey("supply_participate_no")? String.valueOf(orderDetail.getInteger("supply_participate_no")) : "无"); + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = ""; + + // 快团团 + tradeInfo.platform_code = "024"; + + JSONArray subOrderList = orderDetail.getJSONArray("sub_order_list"); + // 商品 + tradeInfo.orders = new OrderInfo[subOrderList.size()]; + for (int i = 0; i < subOrderList.size(); i++) { + JSONObject item = subOrderList.getJSONObject(i); + int cancelStatus = item.getIntValue("cancel_status"); + if (cancelStatus != 0) { + continue; + } + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.containsKey("external_sku_id") ? item.getString("external_sku_id") + : ""; + String skuId = item.containsKey("sku_id")?String.valueOf(item.getLong("sku_id")):""; + + orderInfo.num = item.getIntValue("goods_number"); + //计算订单总数量 + tradeInfo.num += orderInfo.num; + orderInfo.price = String.valueOf(item.getLong("goods_price") / 100.0); + orderInfo.total_fee = String.valueOf(item.getLong("goods_amount") / 100.0); + orderInfo.discount_fee = "0"; + /* + * 由于快团团的tradeInfo.money=tradeInfo.product_fee,所以下面两种算法对结果与影响 + */ +// orderInfo.payment = String.valueOf(orderInfo.num * Double.valueOf(orderInfo.price)); + String payment = (new BigDecimal(orderInfo.price).multiply(new BigDecimal(orderInfo.num))) + .divide(new BigDecimal(Double.valueOf(tradeInfo.getProduct_fee()) == 0 ? 1.0 + "" + : tradeInfo.getProduct_fee()), 2, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal(tradeInfo.getMoney())).toString(); + orderInfo.payment = payment; + + orderInfo.title = item.containsKey("goods_name") ? item.getString("goods_name") : ""; + orderInfo.sku_id = skuId; + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } +} diff --git a/src/com/since/emp/newplatform/service/ApiKuaiShou.java b/src/com/since/emp/newplatform/service/ApiKuaiShou.java new file mode 100644 index 0000000..f7b8628 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiKuaiShou.java @@ -0,0 +1,1394 @@ +package com.since.emp.newplatform.service; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jd.security.tdeclient.TDEClient; +import com.kuaishou.merchant.open.api.client.AccessTokenKsMerchantClient; +import com.kuaishou.merchant.open.api.common.utils.GsonUtils; +import com.kuaishou.merchant.open.api.domain.order.OrderAddressInfo; +import com.kuaishou.merchant.open.api.domain.order.OrderBaseInfo; +import com.kuaishou.merchant.open.api.domain.order.OrderDetail; +import com.kuaishou.merchant.open.api.domain.order.OrderItemInfo; +import com.kuaishou.merchant.open.api.domain.order.OrderList; +import com.kuaishou.merchant.open.api.domain.order.OrderListData; +import com.kuaishou.merchant.open.api.domain.order.OrderLogisticsInfo; +import com.kuaishou.merchant.open.api.domain.order.OrderNote; +import com.kuaishou.merchant.open.api.domain.order.OrderRefundInfo; +import com.kuaishou.merchant.open.api.request.order.OpenOrderCursorListRequest; +import com.kuaishou.merchant.open.api.request.order.OpenOrderDetailRequest; +import com.kuaishou.merchant.open.api.request.refund.OpenSellerOrderRefundPcursorListRequest; +import com.kuaishou.merchant.open.api.response.order.OpenOrderCursorListResponse; +import com.kuaishou.merchant.open.api.response.order.OpenOrderDetailResponse; +import com.kuaishou.merchant.open.api.response.refund.OpenSellerOrderRefundPcursorListResponse; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.ProvinceLevelMunicipalityConstants; + +/** + * @Description: 快手API请求接口默认设置连接超时时长为15秒,读超时时长为30秒 + * @ClassName: ApiKuaiShou + * @author Lewis + * @date 2021-7-2 11:34:31 + * + */ +public class ApiKuaiShou { + private static final Logger logger = LogManager.getLogger(ApiKuaiShou.class); + private String logTitle = "ApiKuaiShou"; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + private String client_secret = "gta9zTRU5fplClNyAXoocA"; + // 快手退款原因的map + Map refundReasonMap; + + public ApiKuaiShou(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + String fileName = "config_all.ini"; + IniReader reader = new IniReader(fileName); + threadPool = ThreadPool.getInstance(); + // 加载退款原因 + refundReasonMap = refundReason(); + + logger.info("订单详情获取线程启动"); + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderListThreadByTime thread2 = new GetOrderListThreadByTime( + platConfig.apps.get(0).shops.get(i), recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(thread2); + } + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrdersTimerTask ott = new OrdersTimerTask(threadPool, reader); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ] ", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * @Description: 定时抓取时间段内订单列表线程 + * @ClassName: OrdersTimerTask + * @author Lewis + * @date 2021-7-2 11:37:07 + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private IniReader reader; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, IniReader reader) { + this.threadPool = threadPool; + this.reader = reader; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + + // 查询当前配置文件中的订单列表的时间间隔,单位为小时 + int orderListInteval = StringUtils.isNumeric(reader.getValue("026", "orderListInteval")) + ? Integer.valueOf(reader.getValue("026", "orderListInteval")) + : 24; + + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + dealUpdateToken(); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = new ArrayList(); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + // 首次启动根据配置的抓单回退时间和平台的抓单间隔,切割请求次数,以满足回退抓单时间内的订单需求 + int orderLoop = (int) Math + .ceil((double) shopConfig.init_time / (orderListInteval * 60 * 60 * 1000));// 初始抓单回退时间 + for (int k = 0; k < orderLoop; k++) { + String startTime = df.format(new Date( + now.getTime() - (orderLoop - k) * (orderListInteval * 60 * 60 * 1000)));// 开始时间 + String endTime = df.format(new Date( + now.getTime() - (orderLoop - k - 1) * (orderListInteval * 60 * 60 * 1000))); + // 启动抓单线程 + threadPool.execute( + new GetOrderListThread(platConfig.apps.get(i), shopConfig, startTime, endTime)); + } + + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + // 启动抓单线程 + GetOrderListThread thread = new GetOrderListThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + // 首次启动根据配置的抓单回退时间和平台的抓单间隔,切割请求次数,以满足回退抓单时间内的订单需求 + int orderLoop = (int) Math + .ceil((double) shopConfig.init_time / (orderListInteval * 60 * 60 * 1000));// 初始抓单回退时间 + for (int k = 0; k < orderLoop; k++) { + String startTime = df.format(new Date( + now.getTime() - (orderLoop - k) * (orderListInteval * 60 * 60 * 1000)));// 开始时间 + String endTime = df.format(new Date( + now.getTime() - (orderLoop - k - 1) * (orderListInteval * 60 * 60 * 1000))); + // 启动售后抓单线程 + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + startTime, endTime); + threadPool.execute(grt); + } + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } catch (Exception e) { + logger.error(this, e); + } + } + + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderListThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 1; + private int pageRows = 50;// 每次订单列表获取的单页条数50-100 + // 快手平台的订单查询游标,第一次传空字符串,第一页以后的需要传该游标值 + private String cursor = ""; + + public GetOrderListThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},游标(快手以游标翻页)[ {} ]", shopConfig.code, shopConfig.name, + timeStart, timeEnd, cursor); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(platConfig.api_url, appConfig.key, + appConfig.secret); + + /* + * 老版本调用api OpenSellerOrderPcursorListRequest request = new + * OpenSellerOrderPcursorListRequest(); + * request.setAccessToken(shopConfig.session_key); + * request.setApiMethodVersion(1L); // 快手平台的订单状态,0未知 1 全部 2 待付款 3 待发货 4 + * 待收货(已发货)5 已收货 6 交易成功订单 7 已关闭订单 request.setType(3); + * request.setCurrentPage(Long.valueOf(pageNow)); request.setPageSize(pageRows); + * // 快手平台的订单排序规则,1时间降序 2时间升序 默认降序 request.setSort(2); // 快手平台的订单查询方式,1按创建时间查找 + * 2按更新时间查找 默认创建时间 request.setQueryType(2); + * request.setBeginTime(sdf.parse(timeStart).getTime()); + * request.setEndTime(sdf.parse(timeEnd).getTime()); // 快手平台的订单类型,分销类型 0-全部 + * 1-普通订单 2-分销订单 request.setCpsType(0); request.setPcursor(pcursor); + * OpenSellerOrderPcursorListResponse response = client.execute(request); + */ + // 新版本批量订单调用 + OpenOrderCursorListRequest request = new OpenOrderCursorListRequest(); + request.setAccessToken(shopConfig.session_key); + request.setApiMethodVersion(1L); + // 订单状态,0未知 1 全部 2 待付款 3 待发货 4 待收货(已发货)5 已收货 6 交易成功订单 7 已关闭订单 + request.setOrderViewStatus(3); + request.setPageSize(pageRows); + // 1时间降序 2时间升序 默认降序 + request.setSort(2); + // 1按创建时间查找 2按更新时间查找 默认创建时间 + request.setQueryType(2); + request.setBeginTime(sdf.parse(timeStart).getTime()); + request.setEndTime(sdf.parse(timeEnd).getTime()); + request.setCpsType(1); + request.setCursor(cursor); + + OpenOrderCursorListResponse response = client.execute(request); + String jsonString = GsonUtils.toJSON(response); + + logger.info("[ {} ] | [ {} ] 返回批量订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(response); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 快手的批量订单超过平台的时间跨度,并不会报错,因此在此处判断时间跨度,如果大于时间跨度,直接修改抓单的起始时间,缩小跨度 + */ + + /** + * parseOrderList 解析快手返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(OpenOrderCursorListResponse openOrderCursorListResponse) { + try { + int result = openOrderCursorListResponse.getResult(); + // 只有result为1是正确的返回 + if (result != 1) { + String errorMsg = openOrderCursorListResponse.getErrorMsg(); + if (result == 24 || result == 28) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (result == 21 && "time range over than 168 hours".equals(errorMsg)) { + logger.info("异常订单返回结果:{}", GsonUtils.toJSON(openOrderCursorListResponse)); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + shopConfig.errFlag = false; + return; + } + OrderListData data = openOrderCursorListResponse.getData(); + OrderList[] orderList = data.getOrderList(); + int totalResults = orderList.length; + // 没有订单的直接返回 + if (totalResults < 1) { + shopConfig.errFlag = false; + return; + } + // 获取游标值 + cursor = data.getCursor(); + + for (int i = 0; i < totalResults; i++) { + OrderList order = orderList[i]; + OrderBaseInfo orderBaseInfo = order.getOrderBaseInfo(); + Long orderId = orderBaseInfo.getOid(); + TradeInfo tradeInfo = parseTradeInfo(order, shopConfig); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + // 等待出库 的订单 + if ("30".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } +// else if ("6".equals(tradeInfo.status)) { +// OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); +// } + + } + + if ("nomore".equals(cursor)) { + shopConfig.lastCatchTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } else { + this.getOrder();// 抓取下一页 + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 补抓单处理线程 + * + * @author Lewis + * + */ + class GetOrderListThreadByTime extends Thread { + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 1; + // 每次订单列表获取的单页条数50-100 + private int pageRows = 50; + // 快手平台的订单查询游标,第一次传空字符串,第一页以后的需要传该游标值 + private String cursor = ""; + + public GetOrderListThreadByTime(ShopConfig shopConfig, String timeStart, String timeEnd) { + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},游标(快手以游标翻页)[ {} ]", shopConfig.code, shopConfig.name, + timeStart, timeEnd, cursor); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(platConfig.api_url, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret); + /* + * 老版本调用api OpenSellerOrderPcursorListRequest request = new + * OpenSellerOrderPcursorListRequest(); + * request.setAccessToken(shopConfig.session_key); + * request.setApiMethodVersion(1L); // 快手平台的订单状态,0未知 1 全部 2 待付款 3 待发货 4 + * 待收货(已发货)5 已收货 6 交易成功订单 7 已关闭订单 request.setType(3); + * request.setCurrentPage(Long.valueOf(pageNow)); request.setPageSize(pageRows); + * // 快手平台的订单排序规则,1时间降序 2时间升序 默认降序 request.setSort(2); // 快手平台的订单查询方式,1按创建时间查找 + * 2按更新时间查找 默认创建时间 request.setQueryType(1); + * request.setBeginTime(sdf.parse(timeStart).getTime()); + * request.setEndTime(sdf.parse(timeEnd).getTime()); // 快手平台的订单类型,分销类型 0-全部 + * 1-普通订单 2-分销订单 request.setCpsType(0); request.setPcursor(pcursor); + * OpenSellerOrderPcursorListResponse response = client.execute(request); String + * jsonString = GsonUtils.toJSON(response); + */ + // 新版本批量订单调用 + OpenOrderCursorListRequest request = new OpenOrderCursorListRequest(); + request.setAccessToken(shopConfig.session_key); + request.setApiMethodVersion(1L); + // 订单状态,0未知 1 全部 2 待付款 3 待发货 4 待收货(已发货)5 已收货 6 交易成功订单 7 已关闭订单 + request.setOrderViewStatus(3); + request.setPageSize(pageRows); + // 1时间降序 2时间升序 默认降序 + request.setSort(2); + // 1按创建时间查找 2按更新时间查找 默认创建时间 + request.setQueryType(1); + request.setBeginTime(sdf.parse(timeStart).getTime()); + request.setEndTime(sdf.parse(timeEnd).getTime()); + request.setCpsType(0); + request.setCursor(cursor); + + OpenOrderCursorListResponse response = client.execute(request); + String jsonString = GsonUtils.toJSON(response); + logger.info("[ {} ] | [ {} ] 返回批量订单:{}", shopConfig.code, shopConfig.name, jsonString); + parseOrderList(response); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析快手返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(OpenOrderCursorListResponse response) { + try { + int result = response.getResult(); + if (result != 1) { + String errorMsg = response.getErrorMsg(); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if (result == 24 || result == 28) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } else if (result == 21 && "time range over than 168 hours".equals(errorMsg)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "时间跨度超过平台限制", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快手平台故障,请联系软维ERP排查", ""); + } + } + return; + } + + OrderListData data = response.getData(); + OrderList[] orderList = data.getOrderList(); + int totalResults = orderList.length; + if (totalResults < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (totalResults > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 获取游标值 + cursor = data.getCursor(); + + for (int i = 0; i < totalResults; i++) { + OrderList order = orderList[i]; + OrderBaseInfo orderBaseInfo = order.getOrderBaseInfo(); + Long orderId = orderBaseInfo.getOid(); + TradeInfo tradeInfo = parseTradeInfo(order, shopConfig); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + if ("30".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } +// else if ("6".equals(tradeInfo.status)) { +// if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { +// logger.info("交易成功订单 [ {} ] 处理失败!", tradeInfo.tid); +// // System.exit(0); +// } +// } + else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if ("nomore".equals(cursor)) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } else { + this.getOrder();// 抓取下一页 + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快手平台故障,请联系软维ERP排查", ""); + } + } + } + + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(platConfig.api_url, + shopOrderInfo.app_key, shopOrderInfo.app_secret); + /* + * OpenSellerOrderDetailRequest request = new OpenSellerOrderDetailRequest(); + * request.setAccessToken(shopOrderInfo.shopConfig.session_key); + * request.setApiMethodVersion(1L); + * request.setOrderId(Long.valueOf(shopOrderInfo.tid)); + * OpenSellerOrderDetailResponse response = client.execute(request); + */ + OpenOrderDetailRequest request = new OpenOrderDetailRequest(); + request.setAccessToken(shopOrderInfo.shopConfig.session_key); + request.setApiMethodVersion(1L); + request.setOid(Long.valueOf(shopOrderInfo.tid)); + OpenOrderDetailResponse response = client.execute(request); + + tradeInfoString = GsonUtils.toJSON(response); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + + int result = response.getResult(); + + // api接口错误处理 + if (result != 1) { + String errorMsg = response.getErrorMsg(); + if (result == 24 || result == 28) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + return true;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if ((result == 21 && "order not found".equals(errorMsg)) + || (result == 2002 && "order does not exist".equals(errorMsg))) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快手平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + + OrderDetail orderInfo = response.getData(); + OrderBaseInfo orderBaseInfo = orderInfo.getOrderBaseInfo(); + Long orderId = orderBaseInfo.getOid(); + TradeInfo tradeInfo = parseTradeInfo(orderInfo, shopOrderInfo.shopConfig); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "订单解析失败", ""); + } + return false; + } + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "商品售后中,不能发货", ""); + } + return false; + } + + if ("30".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } +// else if ("6".equals(tradeInfo.status)) { +// if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { +// logger.info("交易成功订单[ {} ]处理失败!", shopOrderInfo.tid); +// // System.exit(0); +// } +// } + else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "快手平台故障,请联系软维ERP排查", ""); + } + return false; + } + + } + + /** + * @Description: 解析快手订单详情 + * @Title: parseTradeInfo + * @author Lewis + * @param orderDetail + * @param shopConfig + * @return TradeInfo + */ + private TradeInfo parseTradeInfo(OrderList orderDetail, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + // 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 订单配置信息 + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + // 订单平台解析数据 + // 订单基础信息 + OrderBaseInfo orderBaseInfo = orderDetail.getOrderBaseInfo(); + // 订单商品信息 + OrderItemInfo orderItemInfo = orderDetail.getOrderItemInfo(); + // 订单退款列表,按照创建时间逆序,最新的在第一个 + OrderRefundInfo[] orderRefundList = orderDetail.getOrderRefundList(); + // 订单物流信息 + OrderLogisticsInfo[] orderLogisticsInfo = orderDetail.getOrderLogisticsInfo(); + // 订单备注,按照创建时间正序,最新的在最后一个 + OrderNote orderNote = orderDetail.getOrderNote(); + // 订单地址信息 + OrderAddressInfo orderAddress = orderDetail.getOrderAddress(); + + tradeInfo.tid = String.valueOf(orderBaseInfo.getOid()); + tradeInfo.status = String.valueOf(orderBaseInfo.getStatus()); + tradeInfo.num = 0; + tradeInfo.discount_fee = String.valueOf(orderBaseInfo.getDiscountFee() / 100.0); + // 运费 + long postFee = orderBaseInfo.getExpressFee(); + tradeInfo.post_fee = String.valueOf(postFee / 100.0); + // 不包含运费的支付金额,单位为分 + long payMoney = orderBaseInfo.getTotalFee(); + tradeInfo.pay_money = tradeInfo.money = String.valueOf((postFee + payMoney) / 100.0); + + tradeInfo.product_fee = new BigDecimal(tradeInfo.money).add(new BigDecimal(tradeInfo.discount_fee)) + .toString(); + tradeInfo.pay_time = tradeInfo.created = sdf.format(new Date(orderBaseInfo.getPayTime())); + tradeInfo.platform_modify_time = sdf.format(new Date(orderBaseInfo.getUpdateTime())); + tradeInfo.buyer_nick = orderBaseInfo.getBuyerNick(); + + // 收货信息 + + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = orderAddress.getProvince(); + tradeInfo.receiver_city = orderAddress.getCity(); + if (ProvinceLevelMunicipalityConstants.provinceLevelMunicipalityMap.containsKey(tradeInfo.receiver_state)) { + tradeInfo.receiver_city = tradeInfo.receiver_state; + tradeInfo.receiver_state = tradeInfo.receiver_state.replace("市", ""); + } + tradeInfo.receiver_district = orderAddress.getDistrict(); + + String receiverAddressDetail = orderAddress.getDesensitiseAddress(); + tradeInfo.receiver_address = new StringBuilder(tradeInfo.receiver_state).append(" ") + .append(tradeInfo.receiver_city).append(" ").append(tradeInfo.receiver_district).append(" ") + .append(receiverAddressDetail).toString(); + tradeInfo.encrpy_address = orderAddress.getEncryptedAddress(); + tradeInfo.receiver_name = orderAddress.getDesensitiseConsignee(); + tradeInfo.encrpy_name = orderAddress.getEncryptedConsignee(); + tradeInfo.receiver_mobile = tradeInfo.receiver_phone = orderAddress.getDesensitiseMobile() == null ? "" + : orderAddress.getDesensitiseMobile(); + tradeInfo.encrpy_mobile = tradeInfo.encrpy_telephone = orderAddress.getEncryptedMobile() == null ? "" + : orderAddress.getEncryptedMobile(); + tradeInfo = Transform.transform2DeliveryMode(shopConfig, tradeInfo); + + tradeInfo.buyer_message = orderBaseInfo.getRemark() == null ? "" : orderBaseInfo.getRemark(); + + if (orderNote.getSellerNote().length > 0) { + String[] sellerNote = orderNote.getSellerNote(); + int sellerNoteListSize = sellerNote.length; + for (int i = 0; i < sellerNoteListSize; i++) { + if (i == 0) { + tradeInfo.seller_memo = sellerNote[i]; + } else { + tradeInfo.seller_memo = tradeInfo.seller_memo + "|" + sellerNote[i]; + } + } + } + + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = ""; + + // 快手平台 + tradeInfo.platform_code = "025"; + // 支付方式,1=微信;2=支付宝 + int payType = orderBaseInfo.getPayType(); + switch (payType) { + case 1: + tradeInfo.pay_mode_id = 8; + break; + case 2: + tradeInfo.pay_mode_id = 6; + break; + default: + tradeInfo.pay_mode_id = 14; + } + + // 有退款行为,直接返回,不写入订单 + for (OrderRefundInfo orderRefundInfo : orderRefundList) { + if (orderRefundInfo.getRefundStatus() > 1) { + return null; + } + } + // 商品 + tradeInfo.orders = new OrderInfo[1]; + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = orderItemInfo.getSkuNick() == null ? "" : orderItemInfo.getSkuNick(); + String skuId = String.valueOf(orderItemInfo.getSkuId()); + + orderInfo.num = Integer.valueOf((orderItemInfo.getNum())); + // 计算订单总数量 + tradeInfo.num += orderInfo.num; + orderInfo.price = String.valueOf(orderItemInfo.getPrice() / 100.0); + + orderInfo.discount_fee = String.valueOf(orderItemInfo.getDiscountFee() / 100.0); + orderInfo.payment = String.valueOf(orderInfo.num * Double.valueOf(orderInfo.price)); + orderInfo.total_fee = new BigDecimal(orderInfo.discount_fee).add(new BigDecimal(orderInfo.payment)) + .toString(); + orderInfo.title = orderItemInfo.getItemTitle() == null ? "" : orderItemInfo.getItemTitle(); + orderInfo.sku_id = skuId; + orderInfo.sku_properties_name = orderItemInfo.getSkuDesc() == null ? "" : orderItemInfo.getSkuDesc(); + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + tradeInfo.orders[0] = orderInfo; + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * @Description: 解析快手订单详情 + * @Title: parseTradeInfo + * @author Lewis + * @param orderDetail + * @param shopConfig + * @return TradeInfo + */ + private TradeInfo parseTradeInfo(OrderDetail orderDetail, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + // 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 订单配置信息 + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + // 订单平台解析数据 + // 订单基础信息 + OrderBaseInfo orderBaseInfo = orderDetail.getOrderBaseInfo(); + // 订单商品信息 + OrderItemInfo orderItemInfo = orderDetail.getOrderItemInfo(); + // 订单退款列表,按照创建时间逆序,最新的在第一个 + OrderRefundInfo[] orderRefundList = orderDetail.getOrderRefundList(); + // 订单物流信息 + OrderLogisticsInfo[] orderLogisticsInfo = orderDetail.getOrderLogisticsInfo(); + // 订单备注,按照创建时间正序,最新的在最后一个 + OrderNote orderNote = orderDetail.getOrderNote(); + // 订单地址信息 + OrderAddressInfo orderAddress = orderDetail.getOrderAddress(); + + tradeInfo.tid = String.valueOf(orderBaseInfo.getOid()); + tradeInfo.status = String.valueOf(orderBaseInfo.getStatus()); + tradeInfo.num = 0; + tradeInfo.discount_fee = String.valueOf(orderBaseInfo.getDiscountFee() / 100.0); + // 运费 + long postFee = orderBaseInfo.getExpressFee(); + tradeInfo.post_fee = String.valueOf(postFee / 100.0); + // 不包含运费的支付金额,单位为分 + long payMoney = orderBaseInfo.getTotalFee(); + tradeInfo.pay_money = tradeInfo.money = String.valueOf((postFee + payMoney) / 100.0); + + tradeInfo.product_fee = new BigDecimal(tradeInfo.money).add(new BigDecimal(tradeInfo.discount_fee)) + .toString(); + tradeInfo.pay_time = tradeInfo.created = sdf.format(new Date(orderBaseInfo.getPayTime())); + tradeInfo.platform_modify_time = sdf.format(new Date(orderBaseInfo.getUpdateTime())); + tradeInfo.buyer_nick = orderBaseInfo.getBuyerNick(); + + // 收货信息 + + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = orderAddress.getProvince(); + tradeInfo.receiver_city = orderAddress.getCity(); + if (ProvinceLevelMunicipalityConstants.provinceLevelMunicipalityMap.containsKey(tradeInfo.receiver_state)) { + tradeInfo.receiver_city = tradeInfo.receiver_state; + tradeInfo.receiver_state = tradeInfo.receiver_state.replace("市", ""); + } + tradeInfo.receiver_district = orderAddress.getDistrict(); + + String receiverAddressDetail = orderAddress.getDesensitiseAddress(); + tradeInfo.receiver_address = new StringBuilder(tradeInfo.receiver_state).append(" ") + .append(tradeInfo.receiver_city).append(" ").append(tradeInfo.receiver_district).append(" ") + .append(receiverAddressDetail).toString(); + tradeInfo.encrpy_address = orderAddress.getEncryptedAddress(); + tradeInfo.receiver_name = orderAddress.getDesensitiseConsignee(); + tradeInfo.encrpy_name = orderAddress.getEncryptedConsignee(); + tradeInfo.receiver_mobile = tradeInfo.receiver_phone = orderAddress.getDesensitiseMobile() == null ? "" + : orderAddress.getDesensitiseMobile(); + tradeInfo.encrpy_mobile = tradeInfo.encrpy_telephone = orderAddress.getEncryptedMobile() == null ? "" + : orderAddress.getEncryptedMobile(); + tradeInfo = Transform.transform2DeliveryMode(shopConfig, tradeInfo); + + tradeInfo.buyer_message = orderBaseInfo.getRemark() == null ? "" : orderBaseInfo.getRemark(); + + if (orderNote.getSellerNote().length > 0) { + String[] sellerNote = orderNote.getSellerNote(); + int sellerNoteListSize = sellerNote.length; + for (int i = 0; i < sellerNoteListSize; i++) { + if (i == 0) { + tradeInfo.seller_memo = sellerNote[i]; + } else { + tradeInfo.seller_memo = tradeInfo.seller_memo + "|" + sellerNote[i]; + } + } + } + + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = ""; + + // 快手平台 + tradeInfo.platform_code = "025"; + // 支付方式,1=微信;2=支付宝 + int payType = orderBaseInfo.getPayType(); + switch (payType) { + case 1: + tradeInfo.pay_mode_id = 8; + break; + case 2: + tradeInfo.pay_mode_id = 6; + break; + default: + tradeInfo.pay_mode_id = 14; + } + + // 有退款行为,直接返回,不写入订单 + for (OrderRefundInfo orderRefundInfo : orderRefundList) { + if (orderRefundInfo.getRefundStatus() > 1) { + return null; + } + } + // 商品 + tradeInfo.orders = new OrderInfo[1]; + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = orderItemInfo.getSkuNick() == null ? "" : orderItemInfo.getSkuNick(); + String skuId = String.valueOf(orderItemInfo.getSkuId()); + + orderInfo.num = Integer.valueOf((orderItemInfo.getNum())); + // 计算订单总数量 + tradeInfo.num += orderInfo.num; + orderInfo.price = String.valueOf(orderItemInfo.getPrice() / 100.0); + + orderInfo.discount_fee = String.valueOf(orderItemInfo.getDiscountFee() / 100.0); + orderInfo.payment = String.valueOf(orderInfo.num * Double.valueOf(orderInfo.price)); + orderInfo.total_fee = new BigDecimal(orderInfo.discount_fee).add(new BigDecimal(orderInfo.payment)) + .toString(); + orderInfo.title = orderItemInfo.getItemTitle() == null ? "" : orderItemInfo.getItemTitle(); + orderInfo.sku_id = skuId; + orderInfo.sku_properties_name = orderItemInfo.getSkuDesc() == null ? "" : orderItemInfo.getSkuDesc(); + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + tradeInfo.orders[0] = orderInfo; + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + public TradeInfo decryptInvoiceTitle(TDEClient tdeClient, TradeInfo tradeInfo, String invoice_title) + throws Exception { + if (TDEClient.isEncryptData(invoice_title)) { + tradeInfo.invoice_title = new String(tdeClient.decrypt(invoice_title), "UTF-8"); + tradeInfo.encrypt_invoice_title = invoice_title; + } else { + tradeInfo.invoice_title = invoice_title; + tradeInfo.encrypt_invoice_title = ""; + } + return tradeInfo; + } + + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 1; + private long pageNow = 1; + // 每次订单列表获取的单页条数1-50 + private int pageRows = 50; + // 快手平台的订单查询游标,第一次传空字符串,第一页以后的需要传该游标值 + private String pcursor = ""; + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, pageNow); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(platConfig.api_url, appConfig.key, + appConfig.secret); + OpenSellerOrderRefundPcursorListRequest request = new OpenSellerOrderRefundPcursorListRequest(); + request.setAccessToken(shopConfig.session_key); + request.setApiMethodVersion(1L); + + request.setBeginTime(sdf.parse(timeStart).getTime()); + request.setEndTime(sdf.parse(timeEnd).getTime()); + // 快手平台的退款类型,退款单请求类型,8 等待退款 9 全部退款订单 + request.setType(9); + request.setPageSize(pageRows); + request.setCurrentPage(pageNow); + // 快手平台的排序方式,排序方式,1时间降序 2时间升序 ,默认降序 + request.setSort(2); + // 快手平台的查找方式,查找方式,1按创建时间查找 2按更新时间查找 ,默认创建时间 + request.setQueryType(2); + // 快手平台的售后单状态,协商状态,1待商家处理 2 商家同意 3商家驳回,等待买家修改 默认返回所有数据 + request.setNegotiateStatus(1); + request.setPcursor(pcursor); + // 退款状态(非必传),枚举:[10, "买家仅退款申请"] [11, "买家退货退款申请"] [20, "平台介入-买家仅退款申请"] [21, + // "平台介入-买家退货退款申请"] [22, "平台介入-已确认退货退款"] [30, "商品回寄信息待买家更新"] [40, "商品回寄信息待卖家确认"] + // [50, "退款执行中"] [60, "退款成功"] [70, "退款失败"] +// request.setStatus(10); + OpenSellerOrderRefundPcursorListResponse response = client.execute(request); + String jsonString = GsonUtils.toJSON(response); + logger.info("[ {} ] | [ {} ] 返回售后订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析快手返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = JSON.parseObject(jsonString); + int result = json.getIntValue("result"); + String errorMsg = json.getString("error_msg"); + // 只有result为1是正确的返回 + if (result != 1) { + if (result == 24 || result == 28) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (result == 21 && "time range over than 168 hours".equals(errorMsg)) { + logger.info("异常订单返回结果:{}", jsonString); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + shopConfig.errFlag = false; + return; + } + + JSONObject data = json.getJSONObject("data"); + JSONArray refundOrderInfoList = data.getJSONArray("refundOrderInfoList"); + int totalCount = refundOrderInfoList.size(); + if (totalCount < 1) { + shopConfig.refundErrFlag = false; + return; + } + // 获取游标值 + pcursor = data.getString("pcursor"); + + // 将订单移至队列,等待获取详细信息 + for (int i = 0; i < totalCount; i++) { + JSONObject refundOrder = refundOrderInfoList.getJSONObject(i); + String refundId = refundOrder.getLong("id") + ""; + RefundInfo refundInfo = parseRefundInfo(refundOrder, shopConfig); + if (refundInfo == null) { + logger.info("error:解析售后订单错误,tid[ {} ],跳过处理->{}", refundId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo); + } + + this.pageCount = (int) Math.ceil((double) totalCount / pageRows);// 计算分页总数 + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + private RefundInfo parseRefundInfo(JSONObject refundDetail, ShopConfig shopConfig) { + try { + RefundInfo refundInfo = new RefundInfo(); + refundInfo.tid = refundDetail.getLong("oid").toString(); + refundInfo.refund_id = refundDetail.getLong("refundId").toString(); + refundInfo.refund_fee = refundDetail.getDouble("refundFee") / 100.00; + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.platform_code = shopConfig.platformCode; + refundInfo.desc = refundDetail.getString("refundDesc"); + int reason = refundDetail.getIntValue("refundReason"); + refundInfo.reason = refundReasonMap.containsKey(reason) ? refundReasonMap.get(reason) : ""; + return refundInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private static Map refundReason() { + Map map = new HashMap(); + map.put(0, "未知状态"); + map.put(1, "拍错/拍多/不想要了"); + map.put(2, "买错了/买多了"); + map.put(1, "拍错/拍多/不想要了"); + map.put(3, "质量问题"); + map.put(2, "买错了/买多了"); + map.put(4, "卖家发错货"); + map.put(3, "质量问题"); + map.put(5, "未按约定时间发货"); + map.put(4, "卖家发错货"); + map.put(6, "七天无理由退货"); + map.put(5, "未按约定时间发货"); + map.put(7, "其他"); + map.put(6, "七天无理由退货"); + map.put(8, "商品与商家宣传不符"); + map.put(7, "其他"); + map.put(9, "商品少件或破损"); + map.put(8, "商品与商家宣传不符"); + map.put(10, "拍错、拍多"); + map.put(9, "商品少件或破损"); + map.put(11, "不喜欢、不想要了"); + map.put(10, "拍错、拍多"); + map.put(12, "地址填错了"); + map.put(11, "不喜欢、不想要了"); + map.put(13, "缺货"); + map.put(12, "地址填错了"); + map.put(14, "快递/物流一直未送到"); + map.put(13, "缺货"); + map.put(15, "假冒品牌"); + map.put(14, "快递/物流一直未送到"); + map.put(16, "商品少件/漏发"); + map.put(15, "假冒品牌"); + map.put(17, "商品破损"); + map.put(16, "商品少件/漏发"); + map.put(18, "退运费"); + map.put(17, "商品破损"); + map.put(19, "7天无理由退货"); + map.put(18, "退运费"); + map.put(20, "7天无理由退货(拆封后不支持)"); + map.put(19, "7天无理由退货"); + map.put(21, "7天无理由退货(激活后不支持)"); + map.put(20, "7天无理由退货(拆封后不支持)"); + map.put(21, "7天无理由退货(激活后不支持)"); + map.put(22, "7天无理由退货(安装后不支持)"); + map.put(23, "7天无理由退货(定制类不支持)"); + map.put(24, "7天无理由退货(使用后不支持)"); + map.put(25, "7天无理由退货(开窗后不支持)"); + map.put(26, "已拒签"); + map.put(27, "拍错、拍多"); + map.put(28, "不喜欢、不想要了"); + map.put(29, "充值未到账"); + map.put(30, "充值少到账"); + map.put(31, "充错号码"); + map.put(32, "优惠券过期自动退款"); + map.put(33, "无可用商品"); + map.put(34, "商家闭店"); + map.put(35, "优惠力度小于店内优惠"); + map.put(22, "7天无理由退货(安装后不支持)"); + map.put(36, "清关失败"); + map.put(37, "买卖双方协商一致退款"); + map.put(23, "7天无理由退货(定制类不支持)"); + map.put(24, "7天无理由退货(使用后不支持)"); + map.put(25, "7天无理由退货(开窗后不支持)"); + map.put(26, "已拒签"); + map.put(27, "拍错、拍多"); + map.put(28, "不喜欢、不想要了"); + map.put(29, "充值未到账"); + map.put(30, "充值少到账"); + map.put(31, "充错号码"); + map.put(32, "优惠券过期自动退款"); + map.put(33, "无可用商品"); + map.put(34, "商家闭店"); + map.put(35, "优惠力度小于店内优惠"); + map.put(36, "清关失败"); + map.put(37, "买卖双方协商一致退款"); + return map; + } + + /** + * + * @ClassName:UpdateTokenThread + * @Author:Luke + * @Date:2018年11月23日 下午3:21:45 + */ + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expiresTimeSdf = sdf.parse(expires_time).getTime(); + long nowTimeSdf = System.currentTimeMillis(); + if (expiresTimeSdf - nowTimeSdf <= 2 * 60 * 60 * 1000) {// 判断小于两个个小时的话更新 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String client_id = um.app_key; + + String refresh_token = um.refresh_token; + String url = "https://open.kwaixiaodian.com/oauth2/refresh_token"; + String params = "app_id=" + client_id + "&app_secret=" + client_secret + + "&grant_type=refresh_token&refresh_token=" + refresh_token; + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, params, 3, logTitle); + JSONObject json = JSON.parseObject(result); + int resultCode = json.getIntValue("result"); + if (resultCode == 1) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + String refreshToken = json.getString("refresh_token"); + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + updateNewToken(shop_name, shop_code, access, refreshToken, expiresIn, nowTimeSdf); + + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新码到期,放弃刷新", shop_code, shop_name); + } + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_code, shop_name, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + private void updateNewToken(String shopName, String shopCode, String access, String refreshToken, long expiresIn, + long nowTimeSdf) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopCode.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + + String expiresInSdf = sdf.format(new Date(expiresIn * 1000 + nowTimeSdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresInSdf + + "',refresh_token='" + refreshToken + "' where code = '" + shopCode + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shopCode, shopName); + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌成功,已写入数据库!", shopCode, shopName); + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shopName, shopCode, access, refreshToken, expiresIn, nowTimeSdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/newplatform/service/ApiPinDuoDuoThirdEdition.java b/src/com/since/emp/newplatform/service/ApiPinDuoDuoThirdEdition.java new file mode 100644 index 0000000..6a9313d --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiPinDuoDuoThirdEdition.java @@ -0,0 +1,813 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * @Description: 第三版的拼多多抓单,不再使用南天门获取订单。拼多多要求敏感接口的发起要在多多云内发起,所以现在拼多多的订单获取 + * 经过多多云中转。 + * @ClassName: ApiPinDuoDuoThirdEdition + * @author Lewis + * @date 2021-4-19 13:29:31 + * + */ +public class ApiPinDuoDuoThirdEdition { + private static final Logger logger = LogManager.getLogger(ApiPinDuoDuoThirdEdition.class); + private String logTitle = "ApiPinDuoDuoThirdEdition"; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + +// private static String accessKeyId = "2D21F9134F11451D156D4110F4552997";//鼎内appkey +// private static String secretKey = "89B0A7E118BDF86C8CC2664DD8C748AD";//鼎内appsecret + + public ApiPinDuoDuoThirdEdition(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderThread2 thread2 = new GetOrderThread2(platConfig.apps.get(0).shops.get(i), + recatchConfig.starTime, recatchConfig.endTime); + // thread2.start(); + threadPool.execute(thread2); + } + + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ] ", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + // TODO + String apiName = "ApiPinDuoDuoThirdEdition"; + new UpdateAccessToken().getNewAccessToken(platConfig, logger, apiName); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + + if (shopConfig.lastCatchTime == null) { + int orderLoop = (int) Math.ceil((double) shopConfig.init_time / 30);// 初始抓单回退时间 + for (int k = 0; k < orderLoop; k++) { + String startTime = df.format(new Date(now.getTime() - (orderLoop - k) * 30 * 60000));// 开始时间 + String endTime = df + .format(new Date(now.getTime() - (orderLoop - k - 1) * 30 * 60000)); + // 启动抓单线程 + threadPool.execute(new GetOrderThread(platConfig.apps.get(i), shopConfig, + startTime, endTime)); + } + + Date beforeDate = new Date(now.getTime() - 60000 * 30);// 拼多多平台增量查询订单的时间跨度最大为30分钟,所以不能根据shopConfig.init_time(一般为一个小时) + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + threadPool.execute(new GetOrderThread(platConfig.apps.get(i), shopConfig, + df.format(now.getTime() - 30 * 60000), df.format(now))); + } catch (Exception e) { + logger.error(this, e); + } + } + + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + int refund_loop = (int) Math.ceil((double) shopConfig.init_time / 30); + for (int k = 0; k < refund_loop; k++) { + String start_time = df + .format(new Date(now.getTime() - (refund_loop - k) * 30 * 60000)); + String end_time = df + .format(new Date(now.getTime() - (refund_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + start_time, end_time); + threadPool.execute(grt); + } + Date beforeDate = new Date(now.getTime() - 60000 * 30); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + /** + * 2019-05-23 注释,拼多多不再使用时间覆盖式,而是根据当前时间往前半个小时的方式查询 By Lewis + */ + // Date date = df.parse(shopConfig.lastQueryRefundTime); + // date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : + // 0)); + // shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + // .format(date); + // 启动抓单线程 + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + df.format(now.getTime() - 30 * 60 * 1000), df.format(now)); + threadPool.execute(grt); + } + // catch (ParseException e) { + // logger.error(this, e); + // } + catch (Exception e) { + logger.error(this, e); + } + + } + } + + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + String url = platConfig.agent_api_ip + "/order/orderSearch"; + String order_status = "2";// 订单状态,目前平台层只支持待发货订单查询 0:全部 1.等待买家付款 2.等待卖家发货 3.等待买家确认收货 4.买家已签收(货到付款专用) + // 5.交易成功 6.交易关闭 7.付订金(预售专用) + String params = "session_key=" + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + + time_end + "&order_status=" + order_status + "&shop_code=" + shopConfig.code + "&page_now=" + + String.valueOf(page_now) + "&page_rows=" + String.valueOf(page_rows) + + "&sort_type=0&date_type=2"; + HttpRequest httpRequest = new HttpRequest(); + params = params.replaceAll(" ", "%20"); + String jsonString = httpRequest.sendGet(url, params, logTitle); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析拼多多返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + String code = json.getString("code"); + if ("0000".equals(code)) { + int totalResults = json.getInt("totalResults"); + if (totalResults < 1) { + shopConfig.errFlag = false; + return; + } + JSONArray orderList = json.getJSONArray("searchOrderList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create() + .fromJson(order.toString(), TradeInfo.class); + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + // 等待出库 的订单 + if ("2".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("5".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } + + } + this.page_count = (int) Math.ceil((double) totalResults / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else { + if ("102".equals(code)) { + logger.info("异常订单返回结果:{}", jsonString); + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if ("120".equals(code)) { + logger.info("异常订单返回结果:{}", jsonString); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 补抓单处理线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + String url = platConfig.agent_api_ip + "/order/orderSearch"; + String order_status = "2"; + String params = "session_key=" + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + + time_end + "&order_status=" + order_status + "&page_now=" + String.valueOf(page_now) + + "&shop_code=" + shopConfig.code + "&page_rows=" + String.valueOf(page_rows) + + "&sort_type=0&date_type=1"; + params = params.replaceAll(" ", "%20"); + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendGet(url, params, logTitle); + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + logger.info(jsonString); + parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析拼多多返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + String code = json.getString("code"); + if ("0000".equals(code)) { + int totalResults = json.getInt("totalResults"); + if (totalResults < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (totalResults > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + JSONArray orderList = json.getJSONArray("searchOrderList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create() + .fromJson(order.toString(), TradeInfo.class); + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", + ""); + } + continue; + } + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("5".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单 [ {} ] 处理失败!", tradeInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + + } + + this.page_count = (int) Math.ceil((double) totalResults / page_rows);// 计算分页总数 + + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end; + } + + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if ("102".equals(code)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "拼多多平台故障,请联系软维ERP排查", ""); + } + } + + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "拼多多平台故障,请联系软维ERP排查", ""); + } + } + } + + } + + public static String asciiToString(String value) { + StringBuffer sbu = new StringBuffer(); + String[] chars = value.split(","); + for (int i = 0; i < chars.length; i++) { + sbu.append((char) Integer.parseInt(chars[i])); + } + return sbu.toString(); + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + + String param = "session_key=" + shopOrderInfo.shopConfig.session_key + "&platform_num=" + shopOrderInfo.tid + + "&shop_code=" + shopOrderInfo.shopConfig.code; + HttpRequest httpRequest = new HttpRequest(); + tradeInfoString = httpRequest.sendGet(platConfig.agent_api_ip + "/order/orderDetail", param, logTitle); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + + JSONObject json = new JSONObject(tradeInfoString); + String code = json.getString("code"); + + // api接口错误处理 + if (!"0000".equals(code)) { + if ("102".equals(code)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopConfig.code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if ("108".equals(code)) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "拼多多平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + JSONObject orderInfo = json.getJSONObject("orderInfo"); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(orderInfo.toString(), + TradeInfo.class); + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", ""); + } + return false; + } + + // TODO 用完改为 WAIT_SELLER_STOCK_OUT + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("5".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单[ {} ]处理失败!", shopOrderInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + + } + + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数1-50 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + + String url = (platConfig.agent_api_ip + "/refund/refundList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&bill_type=1,2&session_key=" + shopConfig.session_key).replaceAll(" ", "%20"); + // 处理返回信息 + String response = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 获取退款订单响应:{}", shopConfig.code, shopConfig.name, response); + + this.dealRefundList(response); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void dealRefundList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + String code = json.getString("code"); + if ("0000".equals(code)) { + if (json.has("RefundList")) { + int totalCount = json.getInt("totalResults"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.refundErrFlag = false; + return; + } + JSONArray refundList = json + .getJSONArray("RefundList"); + for (int i = 0; i < refundList.length(); i++) { + RefundInfo refundInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(refundList.getJSONObject(i).toString(), + RefundInfo.class); + //写入企业店铺信息Info + Transform.transform2RefundInfo(refundInfo, shopConfig, recatchConfig); + OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo); + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } + } else {// 处理错误信息 + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + String msg = json.getString("msg"); + if ("119".equals(code)) { + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + msg, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if ("107".equals(code) || "105".equals(code) || "102".equals(code) || "106".equals(code)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if ("120".equals(code)) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } // 其他问题自动重试 + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } +} \ No newline at end of file diff --git a/src/com/since/emp/newplatform/service/ApiWeiDianFirst.java b/src/com/since/emp/newplatform/service/ApiWeiDianFirst.java new file mode 100644 index 0000000..b42cb3c --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiWeiDianFirst.java @@ -0,0 +1,658 @@ +package com.since.emp.newplatform.service; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.since.emp.base.*; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.exception.WeiDianException; +import com.since.emp.exception.XiaoHongShuOrderException; +import com.since.emp.service.OrderSyncs; +import com.since.emp.util.CloseUtil; + +import java.net.URLEncoder; + +import com.xiaohongshu.fls.opensdk.client.PackageClient; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.math.BigDecimal; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ApiWeiDianFirst { + private static final Logger logger = LogManager.getLogger(ApiWeiDianFirst.class); + private static OrderSyncs.PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiWeiDianFirst(OrderSyncs.PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + /* + platConfig 平台参数 + recatchConfig 抓单参数 + threadPool 线程池 + scheduledThreadPool 定时任务 + appConfig app 参数 + shopConfig 店铺参数 + */ + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrderSyncs.AppConfig appConfig = platConfig.apps.get(0); + OrderSyncs.ShopConfig shopConfig = appConfig.shops.get(0); + logger.info("订单详情获取线程启动"); + + + boolean timeIsNotNull = StringUtils.isNotBlank(recatchConfig.starTime) && StringUtils.isNotBlank(recatchConfig.endTime); + boolean idIsNotNull = StringUtils.isNotBlank(recatchConfig.orderId); + + // 根据下单时间段抓取订单 + if (timeIsNotNull) { + logger.info("[ {} ] | [ {} ] 根据时间段抓取订单->{}", + shopConfig.code, shopConfig.name, LocalDate.now().toString()); + getOrderListByTime(shopConfig, recatchConfig, 0, 0, 1, false); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + return; + } + + // 根据系统单号抓取订单 + if (idIsNotNull) { + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],???->{}", + shopConfig.code, shopConfig.name, + recatchConfig.orderId, + LocalDate.now().toString()); + // 订单id + TradeInfo tradeInfo = getOrderDetailByOrderId(shopConfig, recatchConfig, recatchConfig.orderId, false); + String msg = ""; + if (tradeInfo != null) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, shopConfig.name, recatchConfig.orderId); + msg = "未查询到该订单"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, msg, ""); + return; + } + + // 抓单之前 开启一次补抓 + for (OrderSyncs.AppConfig app : platConfig.apps) { + StringBuilder name = new StringBuilder(); + StringBuilder code = new StringBuilder(); + for (OrderSyncs.ShopConfig shop : app.shops) { + name.append(shop.name).append(","); + code.append(shop.code).append(","); + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + + long currentTimeMillis = System.currentTimeMillis(); + long start = currentTimeMillis - shop.init_time * 60 * 1000; + long end = 0; + while (start < currentTimeMillis) { + end = start + 24 * 60 * 60 * 1000; + getOrderListByTime(shop, recatchConfig, start, end, 1, true); + start = end; + } + } + String printName = name.toString().substring(0, name.length() - 1); + String printCode = code.toString().substring(0, code.length() - 1); + logger.info("app:[ {} ]平台补抓订单开始,店铺信息:[ {} ] | [ {} ]", app.key, printCode, printName); + } + + // 抓单定时任务启动 + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(), 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // 售后单 + scheduledThreadPool.scheduleAtFixedRate(new RefundOrdersTimerTask(), 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + + } catch (WeiDianException e) { + logger.error(this, e); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, e.getMessage(), ""); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 根据时间段获取订单信息 + * + * @param recatchConfig 补录订单需要信息 + * @param startTime 开始时间 抓单 使用 + * @param endTime 结束时间 抓单使用 + * @param isCatchOrder 是否抓单 用来标识是否处理异常 true 抓单;false 补录 + * @throws Exception + */ + private void getOrderListByTime(OrderSyncs.ShopConfig shopConfig, RecatchConfig recatchConfig, + long startTime, long endTime, int timeType, + boolean isCatchOrder) throws Exception { + + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + /* + start 开始时间 + end 结束时间 + pageNumber 当前页 + pageSize 条数 + timeType 1 创建时间 限制 end-start<=24h、2 更新时间 限制 end-start<=30min + orderStatus : 0全部 1已下单待付款 2已支付处理中 3清关中 4待发货 5部分发货 6待收货 7已完成 8已关闭 9已取消 10换货申请中 + */ + int pageNumber = 1; + int pageSize = 50; + String orderType = "unship"; + + // 如果是抓单流程 那么使用方法中的参数作为入参,timeType ==1 ,订单创建时间作为查询条件,typeTime ==2 ,条件为更新时间 + if (isCatchOrder) { + if (timeType == 1) { + node.put("add_start", format.format(new Date(startTime))); + node.put("add_end", format.format(new Date(endTime))); + } else if (timeType == 2) { + node.put("update_start", format.format(new Date(startTime))); + node.put("update_end", format.format(new Date(endTime))); + } + // 补录订单流程,创建时间作为参数 + } else { + node.put("add_start", recatchConfig.starTime); + node.put("add_end", recatchConfig.endTime); + } + + node.put("page_num", pageNumber); + node.put("order_type", orderType); + node.put("page_size", pageSize); + String serviceParam = UrlEncode(node.toString()); + String publicParam = UrlEncode(createPublicParam(shopConfig.session_key, "vdian.order.list.get", "1.2")); + HttpGet httpGet = new HttpGet(platConfig.api_url + "?param=" + serviceParam + "&public=" + publicParam); + CloseableHttpResponse responseList = httpClient.execute(httpGet); + String s = EntityUtils.toString(responseList.getEntity()); + JSONObject execute = JSONObject.parseObject(s); + + logger.info("订单列表原始数据->>>>{}", JSON.toJSONString(s)); + // 成功返回 + if (Objects.equals("0", execute.getJSONObject("status").getString("status_code"))) { + List list = new ArrayList<>(); + // 计算总页数 + int totalCount = execute.getJSONObject("result").getIntValue("total_num"); + int totalPage = (totalCount + pageSize - 1) / pageSize; + // 循环获取数据 + while (pageNumber <= totalPage) { + for (Object o : execute.getJSONObject("result").getJSONArray("orders")) { + JSONObject jsonObject = (JSONObject) o; + // 获取订单详情 + TradeInfo tradeInfo = getOrderDetailByOrderId(shopConfig, recatchConfig, jsonObject.getString("order_id"), isCatchOrder); + if (Objects.isNull(tradeInfo)) { + continue; + } + list.add(tradeInfo); + } + node.put("page_num", pageNumber++); + execute = JSONObject.parseObject(EntityUtils.toString(httpClient.execute(httpGet).getEntity())); + } + OrderSyncs.dataParse.tradeQueue.addAll(list); + } else { + if (!isCatchOrder) { + throw new WeiDianException(execute.getJSONObject("status").getString("status_reason")); + } + logger.error("补录订单异常:店铺{}--->{},返回数据:{}", shopConfig.code, shopConfig.name, execute); + } + } + + /** + * 获取订单详情写入 tradeInfo + * + * @param shopConfig + * @param orderId + * @return + * @throws Exception + */ + private TradeInfo getOrderDetailByOrderId(OrderSyncs.ShopConfig shopConfig, + RecatchConfig recatchConfig, String orderId, boolean isCatchOrder) throws Exception { + CloseableHttpClient client = HttpClientBuilder.create().build(); + ObjectNode node = new ObjectMapper().createObjectNode(); + node.put("order_id", orderId); + String serviceParam = UrlEncode(node.toString()); + String publicParam = UrlEncode(createPublicParam(shopConfig.session_key, "vdian.order.get", "1.0")); + HttpGet httpGet = new HttpGet(platConfig.api_url + "?param=" + serviceParam + "&public=" + publicParam); + CloseableHttpResponse response = client.execute(httpGet); + String s = EntityUtils.toString(response.getEntity()); + JSONObject execute = JSONObject.parseObject(s); + + logger.info("订单详情原始数据->>>{}", JSON.toJSONString(s)); + if (Objects.equals("0", execute.getJSONObject("status").getString("status_code"))) { + if (Objects.isNull(execute.getJSONObject("result"))) { + throw new WeiDianException("暂无该订单信息!"); + } + + if (!Objects.equals("待发货", execute.getJSONObject("result").getString("status_desc"))) { + return null; + } + return writeToTradeInfo(execute.getJSONObject("result"), shopConfig, recatchConfig); + } else { + logger.error("获取订单异常id{};异常结果{}", orderId, execute); + if (!isCatchOrder) { + throw new WeiDianException(execute.getJSONObject("status").getString("status_reason")); + } + } + return null; + } + + + /** + * 将数据写入 TradeInfo + * + * @param jsonObject 订单详情数据 + */ + private TradeInfo writeToTradeInfo(JSONObject jsonObject, OrderSyncs.ShopConfig shopConfig, RecatchConfig recatchConfig) throws Exception { + + + TradeInfo info = new TradeInfo(); + Transform.transform2TradeInfo(info, shopConfig, recatchConfig); + JSONObject buyerInfo = jsonObject.getJSONObject("buyer_info"); + info.setTid(jsonObject.getString("order_id")); + info.setPlatform_code("027"); + info.setType(getTradeInfoType(jsonObject.getIntValue("order_type"))); + info.setIs_success(true); + info.setStatus("4"); + info.setMoney(jsonObject.getString("last_income")); + info.setPay_money(jsonObject.getString("total")); + info.setDiscount_fee("0"); + info.setInvoice_type(0); + info.setBuyer_message(jsonObject.getString("note") == null ? "" : jsonObject.getString("note")); + info.setAdjust_fee("0"); + info.setProduct_fee(jsonObject.getString("last_income")); + info.setReceiver_zip(""); + info.setSeller_memo(jsonObject.getString("seller_note")); + info.setPay_time(jsonObject.getString("pay_time")); + info.setCreated(jsonObject.getString("add_time")); + info.setReceiver_name(buyerInfo.getString("name")); + info.setBuyer_nick(buyerInfo.getString("name")); + info.setReceiver_phone(buyerInfo.getString("phone")); + info.setReceiver_mobile(buyerInfo.getString("phone")); + info.setReceiver_state(buyerInfo.getString("province")); + info.setReceiver_country("中国"); + info.setReceiver_address(buyerInfo.getString("address")); + + String cityName; + switch (buyerInfo.getString("city")) { + case "上海": + cityName = "上海市"; + break; + case "北京": + cityName = "北京市"; + break; + case "重庆": + cityName = "重庆市"; + break; + case "天津": + cityName = "天津市"; + break; + default: + cityName = buyerInfo.getString("city"); + break; + + } + info.setReceiver_city(cityName); + info.setReceiver_district(buyerInfo.getString("region")); + List list = new ArrayList<>(); + int totalCount = 0; + BigDecimal expressFee = new BigDecimal("0"); + for (Object o : jsonObject.getJSONArray("items")) { + JSONObject object = (JSONObject) o; + String refundStatus = object.getJSONObject("refund_info").getString("refund_status"); + if (!Objects.equals("0", refundStatus) && StringUtils.isNotBlank(refundStatus)) { + continue; + } + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = object.getString("merchant_code"); + orderInfo.sku_id = object.getString("item_id"); + orderInfo.title = object.getString("item_name"); + orderInfo.num = object.getIntValue("quantity"); + orderInfo.price = object.getString("price"); + orderInfo.discount_fee = "0"; + orderInfo.sku_properties_name = object.getString("item_desc"); + orderInfo.divide_order_fee = object.getString("price"); + orderInfo.total_fee = orderInfo.divide_order_fee; + orderInfo.payment = orderInfo.divide_order_fee; + orderInfo.adjust_fee = "0"; + list.add(orderInfo); + totalCount += orderInfo.num; + String goodsExpressFee = object.getString("expressFee") == null ? "0" : object.getString("expressFee"); + expressFee = expressFee.add(new BigDecimal(goodsExpressFee)); + } + if (totalCount == 0) { + return null; + } + info.setNum(totalCount); + info.setOrders(list.toArray(new OrderInfo[0])); + info.post_fee = expressFee.toString(); + JSON.toJSONString(info); + return info; + } + + /** + * 返回订单类型 1为货到付款,2为直接交易,3为担保交易 + * + * @param packageType + * @return + */ + private String getTradeInfoType(int packageType) { + switch (packageType) { + case 1: + return "货到付款"; + case 2: + return "直接交易"; + case 3: + return "担保交易"; + default: + return ""; + } + } + + + /** + * 抓单线程 + */ + private class OrdersTimerTask extends Thread { + + public OrdersTimerTask() { + } + + @Override + public void run() { + try { + logger.info("{}{},店铺抓单启动:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 更新平台参数 + OrderSyncs.getAppMessage(platConfig); + refreshToken(); + for (OrderSyncs.AppConfig app : platConfig.apps) { + for (OrderSyncs.ShopConfig shop : app.shops) { + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + threadPool.execute(() -> { + try { + long end = System.currentTimeMillis(); + long start = end - 30 * 60 * 1000; + getOrderListByTime(shop, recatchConfig, start, end, 2, true); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + + } + + /*** + * 售后单线程 + */ + private class RefundOrdersTimerTask extends Thread { + + public RefundOrdersTimerTask() { + + } + + @Override + public void run() { + try { + logger.info("{}{},店铺抓单(售后单)启动:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 更新平台参数 + OrderSyncs.getAppMessage(platConfig); + + for (OrderSyncs.AppConfig app : platConfig.apps) { + for (OrderSyncs.ShopConfig shop : app.shops) { + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + threadPool.execute(() -> { + try { + long end = System.currentTimeMillis(); + long start = end - 24 * 60 * 60 * 1000; + getAfterOrderListByTime(shop, start, end); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 获取售后单列表 + * + * @param shop 店铺配置信息 + * @param start 开始时间 + * @param end 结束时间 + * @throws Exception + */ + private void getAfterOrderListByTime(OrderSyncs.ShopConfig shop, long start, long end) throws Exception { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + int pageNumber = 1; + int pageSize = 50; + node.put("addTimeStart", format.format(new Date(start))); + node.put("addTimeEnd", format.format(new Date(end))); + node.put("pageNum", pageNumber); + node.put("pageSize", pageSize); + String serviceParam = UrlEncode(node.toString()); + String publicParam = UrlEncode(createPublicParam(shop.session_key, "open.SellerQueryRefundList", "1.0")); + HttpGet httpGet = new HttpGet(platConfig.api_url + "?param=" + serviceParam + "&public=" + publicParam); + CloseableHttpResponse responseList = httpClient.execute(httpGet); + String s = EntityUtils.toString(responseList.getEntity()); + JSONObject execute = JSONObject.parseObject(s); + + logger.info("(售后单)列表原始数据->>>>{}", JSON.toJSONString(s)); + // 成功返回 + + if (Objects.equals("0", execute.getJSONObject("status").getString("status_code"))) { + // 计算总页数 + int totalCount = execute.getJSONObject("result").getIntValue("totalNum"); + int totalPage = (totalCount + pageSize - 1) / pageSize; + List list = new ArrayList<>(); + // 循环获取数据 + while (pageNumber <= totalPage) { + for (Object o : execute.getJSONObject("result").getJSONArray("list")) { + JSONObject jsonObject = (JSONObject) o; + // 获取订单详情 + RefundInfo refundInfo = getAfterOrderDetailByOrderId(shop, jsonObject.getString("refund_no")); + if (Objects.isNull(refundInfo)) { + continue; + } + list.add(refundInfo); + } + node.put("page_num", pageNumber++); + execute = JSONObject.parseObject(EntityUtils.toString(httpClient.execute(httpGet).getEntity())); + } + OrderSyncs.refundOrderHandler.refundInfoQueue.addAll(list); + } else { + logger.error("售后单录入异常:店铺{}--->{},返回数据:{}", shop.code, shop.name, execute); + } + } + + /** + * 获取订单详情 (售后单) + * + * @param shop + * @param refundNo + * @return + */ + private RefundInfo getAfterOrderDetailByOrderId(OrderSyncs.ShopConfig shop, String refundNo) throws Exception { + CloseableHttpClient client = HttpClientBuilder.create().build(); + ObjectNode node = new ObjectMapper().createObjectNode(); + node.put("refundNo", refundNo); + String serviceParam = UrlEncode(node.toString()); + String publicParam = UrlEncode(createPublicParam(shop.session_key, "open.sellerQueryRefundDetail", "1.0")); + HttpGet httpGet = new HttpGet(platConfig.api_url + "?param=" + serviceParam + "&public=" + publicParam); + CloseableHttpResponse response = client.execute(httpGet); + String s = EntityUtils.toString(response.getEntity()); + JSONObject execute = JSONObject.parseObject(s); + + logger.info("售后单详情原始数据->>>{}", JSON.toJSONString(s)); + if (Objects.equals("0", execute.getJSONObject("status").getString("status_code"))) { + if (Objects.isNull(execute.getJSONObject("result"))) { + throw new WeiDianException("暂无该订单信息!"); + } + return writeToRefundInfo(shop, execute.getJSONObject("result")); + } else { + logger.error("获取订单异常id{};异常结果{}", refundNo, execute); + } + return null; + } + + /** + * 写入 RefundInfo + * + * @param shop + * @param object + * @return + */ + private RefundInfo writeToRefundInfo(OrderSyncs.ShopConfig shop, JSONObject object) { + RefundInfo refundInfo = new RefundInfo(); + JSONObject data = object.getJSONObject("refundBasicInfo"); + + int refundType = data.getIntValue("refundKind"); + // 退款类型 1-退款 2-退货 3-换货;换货不处理 + if (refundType == 3) { + return null; + } + refundInfo.tid = object.getString("orderId"); + refundInfo.refund_id = object.getString("refundNo"); + refundInfo.bill_type = refundType; + refundInfo.company_code = shop.company_code; + refundInfo.shop_code = shop.code; + refundInfo.company_type = shop.company_type; + refundInfo.platform_code = shop.platformCode; + refundInfo.desc = data.getString("refundDesc"); + refundInfo.reason = ""; + refundInfo.after_sales_status = 2; + refundInfo.create_time = data.getLong("addTime"); + refundInfo.refund_fee = new BigDecimal(data.getIntValue("refundFee")).multiply(new BigDecimal("100")).intValue(); + refundInfo.return_delivery_code = ""; + return refundInfo; + } + + + /** + * 刷新token + */ + public void refreshToken() { + try { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + for (OrderSyncs.UpdateMessage updateMessage : platConfig.updateTokenList) { + String expires_time = updateMessage.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 过期时间 + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 30 * 60 * 1000) && (expires_time_sdf > now_time_sdf)) {// 判断小于半个个小时的话更新 + + String shop_code = updateMessage.shop_code; + String shop_name = updateMessage.shop_name; + + String url = "https://oauth.open.weidian.com/oauth2/refresh_token?grant_type=client_credential&appkey=" + updateMessage.app_key + "&refresh_token=" + updateMessage.refresh_token; + HttpGet httpGet = new HttpGet(url); + CloseableHttpResponse execute = httpClient.execute(httpGet); + String s = EntityUtils.toString(execute.getEntity()); + JSONObject jsonObject = JSON.parseObject(s); + if ("0".equals(jsonObject.getJSONObject("status").getString("status_code"))) { + // 更新 + updateNewToken(jsonObject.getJSONObject("result"), shop_code); + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + } + } + } + } catch (Exception e) { + + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + // 更新token + private void updateNewToken(JSONObject jsonObject, String shop_code) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + // + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + int expires_in = jsonObject.getIntValue("expire_in") / 1000; + StringBuilder builder = new StringBuilder(); + // 拼接sql + builder.append("update tb_shop set "); + builder.append("session_key = '").append(jsonObject.getString("access_token")).append("'"); + builder.append(",expires_time = '").append(sdf.format(new Date(System.currentTimeMillis() + expires_in))).append("'"); + builder.append(",expires_in = '").append(expires_in).append("'"); + builder.append(",refresh_token = '").append(jsonObject.getString("refresh_token")).append("'"); + builder.append(" where code = ").append(shop_code); + + if (statement.executeUpdate(builder.toString()) == 0) { + logger.info("店铺:[ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code); + } else { + logger.info("店铺:[ {} ] ,刷新令牌成功,已写入数据库!", shop_code); + } + } catch (Exception e) { + logger.error("刷新令牌失败--->错误详情:", e); + } finally { + CloseUtil.close(statement, conn); + } + + } + + // 创建默认参数 + public String createPublicParam(String token, String methods, String version) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode objectNode = mapper.createObjectNode(); + objectNode.put("method", methods) + .put("access_token", token) + .put("version", version); + return objectNode.toString(); + } + + public String UrlEncode(String param) throws Exception { + return URLEncoder.encode(param, "utf-8"); + } +} diff --git a/src/com/since/emp/newplatform/service/ApiWeiMobNew.java b/src/com/since/emp/newplatform/service/ApiWeiMobNew.java new file mode 100644 index 0000000..2d6f17e --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiWeiMobNew.java @@ -0,0 +1,169 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +/** + * + * @className:ApiWeiMobNew + * @description:微盟Api接口类 + * @author:Sunshine + * @date:2019年7月18日 下午4:46:36 + */ +public class ApiWeiMobNew { + + private static final Logger logger = LogManager.getLogger(ApiWeiMobNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiWeiMobNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "微盟")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + threadPool + .execute(new GetOrderDetailThread(logger, recatchConfig, platConfig, shopOrderInfo, "微盟")); + // getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + // TODO + String apiName = "ApiWeiMobNew"; + new UpdateAccessToken().getNewAccessToken(platConfig, logger, apiName); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + /* + * 店铺初次抓单前执行一次刷新授权码,如果有错误,重试两次,如果依然错误,直接放弃 + */ + // for (int k = 0; k < 3; k++) { + // if (new + // UpdateAccessToken().initRefreshToken(shopConfig.code,platConfig,logger)) { + // break; + // } + // try { + // Thread.sleep(1000); + // } catch (InterruptedException e) { + // logger.error(this, e); + // } + // } + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } +} diff --git a/src/com/since/emp/newplatform/service/ApiXiaoHongShuNew.java b/src/com/since/emp/newplatform/service/ApiXiaoHongShuNew.java new file mode 100644 index 0000000..c680ffb --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiXiaoHongShuNew.java @@ -0,0 +1,841 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * @className: ApiXiaoHongShuNew + * @description: 小红书Api接口类 + * @author: Sunshine + * @date: 2019/9/2 10:12 + * @version: 1.0 + */ +public class ApiXiaoHongShuNew { + private static final Logger logger = LogManager.getLogger(ApiXiaoHongShuNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /** + * 订单处理队列 + */ + private Vector orderVector; + + /** + * 异常订单集合 + */ + private Map exceptionOrderMap; + + /** + * 异常订单处理队列 + */ + // private Vector exceptionOrderVector; + + public ApiXiaoHongShuNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + orderVector = new Vector<>(); + exceptionOrderMap = new ConcurrentHashMap<>(); + // exceptionOrderVector = new Vector<>(); + scheduledThreadPool.scheduleAtFixedRate(new GetTradeInfoThread(), 0, 500, TimeUnit.MILLISECONDS); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + threadPool.execute(new ExceptionTradeInfoThread()); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + threadPool.execute(new GetOrderThread(shopConfig, shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * + * @className:GetOrderThread + * @description:抓单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:14:52 + */ + class GetOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + // this.time_start = "2019-07-01 00:00:00";// 开始时间 + this.time_end = time_end;// 结束时间 + // this.time_end = "2019-07-18 00:00:00";// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 获取订单响应:{}", shopConfig.code, shopConfig.name, response_str); + + this.parseOrderList(response_str); + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @title: parseOrderList + * @description: 解析订单 + * @param response_str + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + if (total_results < 1) { + shopConfig.errFlag = false; + logger.info("[ {} ] | [ {} ] 返回订单:本次没有抓取到订单!", shopConfig.code, shopConfig.name); + return; + } + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取到订单数:[ {} ]", shopConfig.code, shopConfig.name, + total_results); + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + // JSONArray data_array = microservice_order_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 2条 + if (this.page_now == this.page_count) { + currentPageCount = total_results % this.page_rows; + } + + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + if (tradeInfo.is_success == false) { + String tradeInfoId = tradeInfo.tid; + exceptionOrderMap.put(tradeInfoId, + new ShopOrderInfo(tradeInfoId, shopConfig, null, null)); + // exceptionOrderVector.add(new ShopOrderInfo(tradeInfoId, shopConfig, null, + // null)); + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 获取订单详情异常,已加入异常处理队列!", shopConfig.code, + shopConfig.name, tradeInfoId); + continue; + } + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 为预售订单,放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + if (tradeInfo.is_success == false) { + String tradeInfoId = tradeInfo.tid; + exceptionOrderMap.put(tradeInfoId, + new ShopOrderInfo(tradeInfoId, shopConfig, null, null)); + // exceptionOrderVector.add(new ShopOrderInfo(tradeInfoId, shopConfig, null, + // null)); + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 获取订单详情异常,已加入异常处理队列!", shopConfig.code, + shopConfig.name, tradeInfoId); + continue; + } + + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 为预售订单,放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } // 其他问题自动重试 + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * + * @className:RecatchOrderThread + * @description:根据时间段补抓订单 + * @author:Sunshine + * @date:2019年5月29日 下午5:21:09 + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + // this.time_start = "2019-04-01 00:00:00";// 开始时间 + this.time_end = time_end;// 结束时间 + // this.time_end = "2019-05-01 00:00:00";// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单响应信息:{}", shopConfig.code, shopConfig.name, response_str); + this.parseOrderList(response_str); + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @title: parseOrderList + * @description: 解析订单 + * @param response_str + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + // 处理异常信息 + logger.info("[ {} ] [ {} ] 返回订单,本次补抓到订单数:[ {} ]", shopConfig.code, shopConfig.name, total_results); + if (total_results < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (total_results > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 当前页条数 + if (this.page_now == this.page_count) {// 只有一页 + currentPageCount = total_results % this.page_rows; + } + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ] 为预售订单,放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ] 为预售订单,放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, + shopConfig.name, tradeInfo.tid); + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + } + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + logger.info("店铺:[ {} ] [ {} ]店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + error_message, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } else if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_message, ""); + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,异常编码 [ {} ], 异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + return; + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + } + + } + + } + + /** + * + * @title: getOrderDetailByOrderId + * @description: 根据单号补抓订单 + * @param shopOrderInfo + * @return + */ + private boolean getOrderDetailByOrderId(ShopOrderInfo shopOrderInfo) { + + String url = platConfig.api_url + "order/orderDetail?shop_code=" + shopOrderInfo.shopConfig.code + + "&platform_num=" + shopOrderInfo.tid; + try { + String resp_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单响应信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, resp_str); + + JSONObject response_json = new JSONObject(resp_str); + if (response_json.has("microservice_orderDetail_response")) { + JSONObject microservice_orderDetail_response = response_json + .getJSONObject("microservice_orderDetail_response"); + if (microservice_orderDetail_response.has("data")) { + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson( + microservice_orderDetail_response.getJSONObject("data").toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + if (recatchConfig.type == 1) { + logger.info("[ {} ] | [ {} ] 订单[ {} ] 为预售订单,放弃处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + return true; + } + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + + } else if (response_json.has("error_response")) { + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 4.108订单号错误 + if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + } else if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + } else if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_message, ""); + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,异常编码 [ {}], 异常信息:[ {} ]时间:{}", + shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + } // 其他问题自动重试 + + } catch (Exception e) { + logger.error(this, e); + } + return false; + + } + + /** + * + * @className:GetTradeInfoThread + * @description:订单处理线程 + * @author:Sunshine + * @date:2019年7月17日 下午2:37:58 + */ + class GetTradeInfoThread implements Runnable { + + @Override + public void run() { + try { + if (orderVector.size() > 0) { + ShopOrderInfo shopOrderInfo = orderVector.get(0); + if (getOrderDetail(shopOrderInfo)) { + orderVector.remove(0); + logger.info("[ {} ] | [ {} ] 异常订单 [ {} ] 获取订单详情成功,已转交至数据处理中心!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + orderVector.remove(0); + exceptionOrderMap.put(shopOrderInfo.tid, shopOrderInfo); + // exceptionOrderVector.add(shopOrderInfo); + logger.info("error:解析订单详情错误,已加入异常处理队列!"); + } + logger.info("[ {} ] | [ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, orderVector.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @title: getOrderDetail + * @description: 根据订单号获取订单详情 + * @param shopOrderInfo + * @return + */ + private boolean getOrderDetail(ShopOrderInfo shopOrderInfo) { + + String url = platConfig.api_url + "order/orderDetail?shop_code=" + shopOrderInfo.shopConfig.code + + "&platform_num=" + shopOrderInfo.tid; + try { + String resp_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 异常订单 [ {} ] 获取订单详情响应信息 :{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, resp_str); + JSONObject response_json = new JSONObject(resp_str); + if (response_json.has("microservice_orderDetail_response")) { + JSONObject microservice_orderDetail_response = response_json + .getJSONObject("microservice_orderDetail_response"); + if (microservice_orderDetail_response.has("data")) { + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson( + microservice_orderDetail_response.getJSONObject("data").toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + // 订单类型 若订单类型为step 说明该单为预售订单,丢弃暂不处理 + String orderStatus = tradeInfo.status; + if ("7".equals(orderStatus)) { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 为预售订单,已放弃处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + return true; + + } + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃抓取!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + } + } + return true; + } else if (response_json.has("error_response")) { + shopOrderInfo.shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (137 == error_code) { + logger.info("订单 [ {} ] 已取消,放弃处理!", shopOrderInfo.tid); + return true; + } + if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code + || 119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] 信息异常,将不再抓单,异常信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), error_message); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return false; + } + + } catch (Exception e) { + logger.error(this, e); + shopOrderInfo.shopConfig.errFlag = false; + } + return false; + } + + } + + /** + * + * @className:ExceptionTradeInfoThread + * @description:异常订单处理线程 + * @author:Sunshine + * @date:2019年7月17日 上午10:58:41 + */ + class ExceptionTradeInfoThread implements Runnable { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始:异常订单队列剩余未处理数 [ {} ]", exceptionOrderMap.size()); + for (Entry shopOrderInfo : exceptionOrderMap.entrySet()) { + String tradeInfo_id = shopOrderInfo.getKey(); + ShopOrderInfo shop_order_info = shopOrderInfo.getValue(); + exceptionOrderMap.remove(tradeInfo_id); + orderVector.add(shop_order_info); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + } +} diff --git a/src/com/since/emp/newplatform/service/ApiXiaoHongShuNewThirdEdition.java b/src/com/since/emp/newplatform/service/ApiXiaoHongShuNewThirdEdition.java new file mode 100644 index 0000000..5d22d64 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiXiaoHongShuNewThirdEdition.java @@ -0,0 +1,652 @@ +package com.since.emp.newplatform.service; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.since.emp.base.*; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.exception.XiaoHongShuOrderException; +import com.since.emp.service.OrderSyncs; +import com.since.emp.util.CloseUtil; +import com.since.emp.util.TimeUtil; +import com.xiaohongshu.fls.opensdk.client.AfterSaleClient; +import com.xiaohongshu.fls.opensdk.client.OauthClient; +import com.xiaohongshu.fls.opensdk.client.PackageClient; +import com.xiaohongshu.fls.opensdk.entity.BaseResponse; +import com.xiaohongshu.fls.opensdk.entity.afterSale.request.GetAfterSaleDetailRequest; +import com.xiaohongshu.fls.opensdk.entity.afterSale.request.GetAfterSaleListRequest; +import com.xiaohongshu.fls.opensdk.entity.afterSale.response.GetAfterSaleDetailResponse; +import com.xiaohongshu.fls.opensdk.entity.afterSale.response.GetAfterSaleListResponse; +import com.xiaohongshu.fls.opensdk.entity.oauth.request.RefreshTokenRequest; +import com.xiaohongshu.fls.opensdk.entity.oauth.response.RefreshTokenResponse; +import com.xiaohongshu.fls.opensdk.entity.packages.request.GetPackageDetailRequest; +import com.xiaohongshu.fls.opensdk.entity.packages.request.GetPackageListRequest; +import com.xiaohongshu.fls.opensdk.entity.packages.request.GetReceiverInfoRequest; +import com.xiaohongshu.fls.opensdk.entity.packages.response.GetPackageDetailResponse; +import com.xiaohongshu.fls.opensdk.entity.packages.response.GetPackagesListResponse; +import com.xiaohongshu.fls.opensdk.entity.packages.response.GetReceiveInfoResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.math.BigDecimal; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author zh + * @Date 2022/2/16 + */ +public class ApiXiaoHongShuNewThirdEdition { + private static final Logger logger = LogManager.getLogger(ApiXiaoHongShuNewThirdEdition.class); + private static OrderSyncs.PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + private PackageClient packageClient; + + + public ApiXiaoHongShuNewThirdEdition(OrderSyncs.PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + /* + platConfig 平台参数 + recatchConfig 抓单参数 + threadPool 线程池 + scheduledThreadPool 定时任务 + packageClient 小红书工具类 + appConfig app 参数 + shopConfig 店铺参数 + */ + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrderSyncs.AppConfig appConfig = platConfig.apps.get(0); + OrderSyncs.ShopConfig shopConfig = appConfig.shops.get(0); + packageClient = new PackageClient(platConfig.api_url, appConfig.key, "2.0", appConfig.secret); + logger.info("订单详情获取线程启动"); + // 处理刷新token + boolean timeIsNotNull = StringUtils.isNotBlank(recatchConfig.starTime) && StringUtils.isNotBlank(recatchConfig.endTime); + boolean idIsNotNull = StringUtils.isNotBlank(recatchConfig.orderId); + + // 根据下单时间段抓取订单 + if (timeIsNotNull) { + logger.info("[ {} ] | [ {} ] 根据时间段抓取订单->{}", + shopConfig.code, shopConfig.name, LocalDate.now().toString()); + getOrderListByTime(packageClient, shopConfig, recatchConfig, 0, 0, 1, false); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + return; + } + + // 根据系统单号抓取订单 + if (idIsNotNull) { + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],???->{}", + shopConfig.code, shopConfig.name, + recatchConfig.orderId, + LocalDate.now().toString()); + // 兼容小红书 订单id + TradeInfo tradeInfo = getOrderDetailByOrderId(packageClient, shopConfig, recatchConfig, recatchConfig.orderId, false); + String msg = ""; + if (tradeInfo != null) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, shopConfig.name, recatchConfig.orderId); + msg = "未查询到该订单"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, msg, ""); + return; + } + + // 抓单之前 开启一次补抓 + for (OrderSyncs.AppConfig app : platConfig.apps) { + StringBuilder name = new StringBuilder(); + StringBuilder code = new StringBuilder(); + for (OrderSyncs.ShopConfig shop : app.shops) { + name.append(shop.name).append(","); + code.append(shop.code).append(","); + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + long currentTimeMillis = System.currentTimeMillis(); + long start = currentTimeMillis - shop.init_time * 60 * 1000; + long end = 0; + PackageClient client = new PackageClient(platConfig.api_url, app.key, "2.0", app.secret); + while (start < currentTimeMillis) { + end = start + 24 * 60 * 60 * 1000; + getOrderListByTime(client, shop, recatchConfig, start, end, 1, true); + start = end; + } + } + String printName = name.toString().substring(0,name.length() - 1); + String printCode = code.toString().substring(0,code.length() - 1); + logger.info("app:[ {} ]平台补抓订单开始,店铺信息:[ {} ] | [ {} ]", app.key, printCode, printName); + } + + // 抓单定时任务启动 + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(), 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // 售后单 +// scheduledThreadPool.scheduleAtFixedRate(new RefundOrdersTimerTask(), 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + + } catch (XiaoHongShuOrderException e) { + logger.error(this, e); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, e.getMessage(), ""); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 根据时间段获取订单信息 + * + * @param packageClient 平台参数 + * @param shopConfig 店铺 + * @param recatchConfig 补录订单需要信息 + * @param startTime 开始时间 抓单 使用 + * @param endTime 结束时间 抓单使用 + * @param isCatchOrder 是否抓单 用来标识是否处理异常 true 抓单;false 补录 + * @throws Exception + */ + private void getOrderListByTime(PackageClient packageClient, OrderSyncs.ShopConfig shopConfig, + RecatchConfig recatchConfig, long startTime, long endTime, int timeType, boolean isCatchOrder) throws Exception { + + GetPackageListRequest request = new GetPackageListRequest(); + /* + start 开始时间 + end 结束时间 + pageNumber 当前页 + pageSize 条数 + timeType 1 创建时间 限制 end-start<=24h、2 更新时间 限制 end-start<=30min + orderStatus : 0全部 1已下单待付款 2已支付处理中 3清关中 4待发货 5部分发货 6待收货 7已完成 8已关闭 9已取消 10换货申请中 + */ + int pageNumber = 1; + int pageSize = 100; + long start; + long end; + if (isCatchOrder) { + start = startTime; + end = endTime; + } else { + start = TimeUtil.getTimeMillisecond(recatchConfig.starTime); + end = TimeUtil.getTimeMillisecond(recatchConfig.endTime); + } + int orderStatus = 4; + request.setEndTime(end); + request.setStartTime(start); + request.setPageNo(pageNumber); + request.setPageSize(pageSize); + request.setTimeType(timeType); + request.setPackageStatus(orderStatus); + BaseResponse execute = packageClient.execute(request, shopConfig.session_key); + logger.info("订单列表原始数据->>>>{}", JSON.toJSONString(execute)); + // 成功返回 + if (execute.success) { + List list = new ArrayList<>(); + // 循环获取数据 + while (pageNumber <= execute.data.pageSize) { + GetPackagesListResponse response = execute.data; + for (GetPackagesListResponse.PackageSimpleDetail packageSimpleDetail : response.packageList) { + // 获取订单详情 + TradeInfo tradeInfo = getOrderDetailByOrderId(packageClient, shopConfig, recatchConfig, packageSimpleDetail.packageId, isCatchOrder); + if (Objects.isNull(tradeInfo)) { + continue; + } + list.add(tradeInfo); + } + request.setPageNo(pageNumber++); + execute = packageClient.execute(request, shopConfig.session_key); + } + OrderSyncs.dataParse.tradeQueue.addAll(list); + } else { + if (!isCatchOrder) { + throw new XiaoHongShuOrderException(execute.msg); + } + logger.error("补录订单异常:店铺{}--->{},返回数据:{}", shopConfig.code, shopConfig.name, execute); + } + } + + /** + * @className:OrdersTimerTask + * @description:???????????? + * @author:Sunshine + * @date:2019??5??6?? ????3:30:04 + */ + private class OrdersTimerTask extends Thread { + + public OrdersTimerTask() { + } + + @Override + public void run() { + try { + logger.info("{}{},店铺抓单启动:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 更新平台参数 + OrderSyncs.getAppMessage(platConfig); + refreshToken(); + for (OrderSyncs.AppConfig app : platConfig.apps) { + for (OrderSyncs.ShopConfig shop : app.shops) { + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + PackageClient packageClient = new PackageClient(platConfig.api_url, app.key, "2.0", app.secret); + threadPool.execute(() -> { + try { + long end = System.currentTimeMillis(); + long start = end - 30 * 60 * 1000; + getOrderListByTime(packageClient, shop, recatchConfig, start, end, 2, true); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 刷新token + */ + public void refreshToken() { + try { + for (OrderSyncs.UpdateMessage updateMessage : platConfig.updateTokenList) { + String expires_time = updateMessage.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 30 * 60 * 1000) && (expires_time_sdf > now_time_sdf)) {// 判断小于半个个小时的话更新 + + String shop_code = updateMessage.shop_code; + String shop_name = updateMessage.shop_name; + + OauthClient client = new OauthClient(platConfig.api_url, updateMessage.app_key, "2.0", updateMessage.app_secret); + RefreshTokenRequest request = new RefreshTokenRequest(); + request.setRefreshToken(updateMessage.refresh_token); + BaseResponse execute = client.execute(request); + if (execute.success) { + RefreshTokenResponse refreshTokenResponse = execute.data; + // 更新 + updateNewToken(refreshTokenResponse, shop_code); + logger.info("店铺[ {} ] | [ {} ] 刷新令牌成功", shop_code, shop_name); + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + } + } + } + } catch (Exception e) { + + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + private void updateNewToken(RefreshTokenResponse refreshTokenResponse, String shop_code) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + int expires_in = (int) refreshTokenResponse.getAccessTokenExpiresAt() / 1000; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + StringBuilder builder = new StringBuilder(); + // 拼接sql + builder.append("update tb_shop set "); + builder.append("session_key = '").append(refreshTokenResponse.getAccessToken()).append("'"); + builder.append(",expires_time = '").append(sdf.format(new Date(refreshTokenResponse.getAccessTokenExpiresAt()))).append("'"); + builder.append(",refresh_token = '").append(refreshTokenResponse.getRefreshToken()).append("'"); + builder.append(",expires_in = '").append(expires_in).append("'"); + builder.append(" where code = ").append(shop_code); + + if (statement.executeUpdate(builder.toString()) == 0) { + logger.info("店铺:[ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code); + } else { + logger.info("店铺:[ {} ] ,刷新令牌成功,已写入数据库!", shop_code); + } + } catch (Exception e) { + logger.error("刷新令牌失败--->错误详情:", e); + } finally { + CloseUtil.close(statement, conn); + } + + } + } + + /*** + * 售后单线程 + */ + private class RefundOrdersTimerTask extends Thread { + + public RefundOrdersTimerTask() { + + } + + @Override + public void run() { + try { + logger.info("{}{},店铺抓单(售后单)启动:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 更新平台参数 + OrderSyncs.getAppMessage(platConfig); + + for (OrderSyncs.AppConfig app : platConfig.apps) { + for (OrderSyncs.ShopConfig shop : app.shops) { + if (StringUtils.isBlank(shop.session_key)) { + continue; + } + AfterSaleClient afterSaleClient = new AfterSaleClient(platConfig.api_url, app.key, "2.0", app.secret); + threadPool.execute(() -> { + try { + long end = System.currentTimeMillis(); + long start = end - 24 * 60 * 60 * 1000; + getAfterOrderListByTime(afterSaleClient, shop, start, end); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 获取售后单列表 + * + * @param afterSaleClient 官方API + * @param shop 店铺配置信息 + * @param start 开始时间 + * @param end 结束时间 + * @throws Exception + */ + private void getAfterOrderListByTime(AfterSaleClient afterSaleClient, + OrderSyncs.ShopConfig shop, + long start, long end) throws Exception { + GetAfterSaleListRequest request = new GetAfterSaleListRequest(); + int pageNumber = 1; + request.setStartTime(start); + request.setEndTime(end); + // 1:根据创建时间查询 end-start<=24h;2:根据更新时间查询 end-start<=30min + request.setTimeType(1); + // 售后状态 1:待审核;2:待用户寄回;3:待收货;4:完成;5:取消;6:关闭;9:拒绝;9999:删除,不传默认全部 + request.setStatus(5); + request.setPageSize(100); + request.setUseHasNext(false); + request.setPageNo(pageNumber); + + BaseResponse execute = afterSaleClient.execute(request, shop.session_key); + if (!execute.success) { + logger.error("获取售后单列表出错,原因:{},", execute.msg); + return; + } + GetAfterSaleListResponse data = execute.data; + List list = new ArrayList<>(); + while (pageNumber <= data.pageSize) { + for (GetAfterSaleListResponse.SimpleAfterSaleDTO simpleAfterSaleDTO : data.simpleAfterSaleList) { + GetAfterSaleDetailRequest detailRequest = new GetAfterSaleDetailRequest(); + detailRequest.setAfterSaleId(simpleAfterSaleDTO.getReturnsId()); + BaseResponse executeDetail = afterSaleClient.execute(detailRequest, shop.session_key); + if (!execute.success) { + logger.error("获取售后单详情出错,原因:{},", execute.msg); + continue; + } + RefundInfo refundInfo = writeToRefundInfo(shop, executeDetail.data); + logger.info("售后单数据详情--->{}", JSON.toJSON(executeDetail.data)); + list.add(refundInfo); + } + request.setPageNo(pageNumber++); + execute = afterSaleClient.execute(request, shop.session_key); + } + OrderSyncs.refundOrderHandler.refundInfoQueue.addAll(list); + } + + /** + * 写入 RefundInfo + * + * @param shop + * @param data + * @return + */ + private RefundInfo writeToRefundInfo(OrderSyncs.ShopConfig shop, GetAfterSaleDetailResponse data) { + RefundInfo refundInfo = new RefundInfo(); + refundInfo.tid = data.packageId; + refundInfo.refund_id = data.returnsId; + refundInfo.bill_type = getBillType(data.returnType); + refundInfo.company_code = shop.company_code; + refundInfo.shop_code = shop.code; + refundInfo.company_type = shop.company_type; + refundInfo.platform_code = shop.platformCode; + refundInfo.desc = data.desc == null ? "" : data.desc; + refundInfo.reason = data.reason; + refundInfo.after_sales_status = 2; + refundInfo.create_time = data.createdAt; + refundInfo.refund_fee = data.refundFee; + refundInfo.return_delivery_code = data.returnExpressNo; + return refundInfo; + } + + /** + * 获取退款类型 小红书返回类型 转 系统自定义类型 + * + * @param returnType 小红书返回类型 1-退货退款, 2-换货, 3:仅退款(old) 4:仅退款(new) 理论上不会有3出现 -1 - 全部 + * @return 系统自定义类型 退款类型:可用值为:1:退款2:退货3:换货 + */ + private int getBillType(Integer returnType) { + switch (returnType) { + case 1: + return 2; + case 2: + return 3; + case 4: + return 1; + } + return 0; + } + + } + + /** + * 获取订单详情写入 tradeInfo + * + * @param packageClient + * @param shopConfig + * @param orderId + * @return + * @throws Exception + */ + private TradeInfo getOrderDetailByOrderId(PackageClient packageClient, OrderSyncs.ShopConfig shopConfig, RecatchConfig recatchConfig, String orderId, boolean isCatchOrder) throws Exception { + GetPackageDetailRequest request = new GetPackageDetailRequest(); + request.setPackageId(orderId); + BaseResponse execute = packageClient.execute(request, shopConfig.session_key); + logger.info("订单原始数据->>>{}", JSON.toJSONString(execute)); + if (execute.success) { + GetPackageDetailResponse data = execute.data; + if (Objects.isNull(data)) { + throw new XiaoHongShuOrderException("暂无该订单信息!"); + } + // 不是待发货 过滤掉 + if (data.packageStatus != 4) { + return null; + } + // 不是 无售后 过滤掉 + if (data.packageAfterSalesStatus != 1) { + return null; + } + // 不是 未申请取消 过滤掉 + if (data.cancelStatus != 0) { + return null; + } + GetReceiveInfoResponse receiveInfoResponse = getReceiverInfo(packageClient, shopConfig, data.getOpenAddressId(), data.getPackageId(), isCatchOrder); + logger.info("获取订单id{};订单数据{}", orderId, JSON.toJSON(data)); + logger.info("获取订单id{};收货人数据{}", orderId, JSON.toJSON(receiveInfoResponse)); + + return writeToTradeInfo(data, receiveInfoResponse, shopConfig, recatchConfig); + } else { + logger.error("获取订单异常id{};异常结果{}", orderId, execute); + if (!isCatchOrder) { + throw new XiaoHongShuOrderException(execute.msg); + } + } + return null; + } + + /** + * 获取收货人 + * + * @param packageClient + * @param shopConfig + * @param openAddressId + * @param orderId + * @param isCatchOrder + */ + private GetReceiveInfoResponse getReceiverInfo(PackageClient packageClient, + OrderSyncs.ShopConfig shopConfig, + String openAddressId, String orderId, boolean isCatchOrder) throws Exception { + List list = new ArrayList<>(); + GetReceiverInfoRequest getReceiverInfoRequest = new GetReceiverInfoRequest(); + GetReceiverInfoRequest.ReceiverQuery receiverQuery = new GetReceiverInfoRequest().new ReceiverQuery(); + receiverQuery.setOpenAddressId(openAddressId); + receiverQuery.setPackageId(orderId); + list.add(receiverQuery); + getReceiverInfoRequest.setReceiverQueries(list); + + BaseResponse execute = packageClient.execute(getReceiverInfoRequest, shopConfig.session_key); + if (execute.success) { + return execute.data; + } else { + logger.error("获取订单异常id{};异常结果{}", orderId, execute); + if (!isCatchOrder) { + throw new XiaoHongShuOrderException(execute.msg); + } + } + return null; + } + + /** + * 将数据写入 TradeInfo + * + * @param data + */ + private TradeInfo writeToTradeInfo(GetPackageDetailResponse data, GetReceiveInfoResponse receiveInfoResponse, OrderSyncs.ShopConfig shopConfig, RecatchConfig recatchConfig) throws Exception { + + GetReceiveInfoResponse.ReceiverInfo receiverInfo = receiveInfoResponse.getReceiverInfos().get(0); + TradeInfo info = new TradeInfo(); + Transform.transform2TradeInfo(info, shopConfig, recatchConfig); + info.setTid(data.getPackageId()); + info.setPlatform_code("021"); + info.setType(getTradeInfoType(data.getPackageType())); + info.setIs_success(true); + info.setStatus("4"); + info.setMoney(getMoney(data.totalPayAmount)); + info.setPay_money(getMoney(data.totalPayAmount)); + info.setDiscount_fee("0"); + info.setInvoice_type(0); + info.setBuyer_message(data.customerRemark == null ? "" : data.customerRemark); + info.setAdjust_fee("0"); + info.setProduct_fee(getMoney(data.totalPayAmount)); + info.setPost_fee(getMoney(data.getTotalShippingFree())); + info.setReceiver_zip(""); + info.setSeller_memo(data.sellerRemark == null ? "" : data.sellerRemark); + info.setPay_time(TimeUtil.getTimeMillisecondString(data.paidTime)); + info.setCreated(TimeUtil.getTimeMillisecondString(data.createdTime)); + info.setReceiver_name(receiverInfo.receiverName); + info.setBuyer_nick(info.getReceiver_name()); + info.setReceiver_phone(receiverInfo.receiverPhone); + info.setReceiver_mobile(receiverInfo.receiverPhone); + info.setReceiver_state(receiverInfo.receiverProvinceName); + info.setReceiver_country("中国"); + info.setReceiver_address(receiverInfo.receiverAddress); + info.setReceiver_city(receiverInfo.receiverCityName); + info.setReceiver_district(receiverInfo.receiverDistrictName); + List list = new ArrayList<>(); + int totalCount = 0; + for (GetPackageDetailResponse.PackageItemDTO packageItemDTO : data.itemList) { + for (GetPackageDetailResponse.PackageSkuDTO skuDTO : packageItemDTO.skuList) { + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = skuDTO.erpCode == null ? "" : skuDTO.erpCode; + orderInfo.sku_id = skuDTO.itemId; + orderInfo.title = skuDTO.itemName; + orderInfo.num = skuDTO.quantity; + orderInfo.price = getMoney((int) skuDTO.pricePerSku); + orderInfo.discount_fee = getMoney((int) (skuDTO.merchantDiscountPerSku + skuDTO.redDiscountPerSku)); + orderInfo.sku_properties_name = packageItemDTO.itemSpec; + orderInfo.divide_order_fee = getMoney((int) skuDTO.paidAmountPerSku * skuDTO.quantity); + orderInfo.total_fee = orderInfo.divide_order_fee; + orderInfo.payment = orderInfo.divide_order_fee; + orderInfo.adjust_fee = "0"; + orderInfo.part_mjz_discount = getMoney((int) (skuDTO.merchantDiscountPerSku + skuDTO.redDiscountPerSku)); + list.add(orderInfo); + totalCount += skuDTO.quantity; + } + } + info.setNum(totalCount); + info.setOrders(list.toArray(new OrderInfo[0])); + JSON.toJSONString(info); + return info; + } + + /** + * 计算每件商品数量 + * + * @param itemQuantity + * @param totalPaidAmount + * @return + */ + private String getGoodsMoney(int itemQuantity, long totalPaidAmount) { + BigDecimal num = new BigDecimal(itemQuantity); + BigDecimal money = new BigDecimal(totalPaidAmount); + BigDecimal single = money.divide(num, 2, BigDecimal.ROUND_HALF_UP); + return getMoney(single.intValue()); + } + + /** + * 计算金额 + * + * @param totalPayAmount 金额 单位 分 + * @return 金额 单位 元 + */ + private String getMoney(int totalPayAmount) { + BigDecimal total = new BigDecimal(totalPayAmount); + BigDecimal divide = total.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP); + return divide.toString(); + } + + + /** + * 返回订单类型 1普通 2定金预售 3全款预售 4延迟发货 5换货补发 + * + * @param packageType + * @return + */ + private String getTradeInfoType(int packageType) { + switch (packageType) { + case 1: + return "普通"; + case 2: + return "定金预售"; + case 3: + return "全款预售"; + case 4: + return "延迟发货"; + case 5: + return "换货补发"; + default: + return ""; + } + } + +} diff --git a/src/com/since/emp/newplatform/service/ApiYiTiaoNew.java b/src/com/since/emp/newplatform/service/ApiYiTiaoNew.java new file mode 100644 index 0000000..b77ac93 --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiYiTiaoNew.java @@ -0,0 +1,468 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * + * @className:YiTiaoApi + * @description:一条平台api接口类 + * @author:Sunshine + * @date:2019年2月1日 下午2:23:33 + */ +public class ApiYiTiaoNew { + private static final Logger logger = LogManager.getLogger(ApiYiTiaoNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiYiTiaoNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "一条")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平台不支持根据单号补抓订单", ""); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + threadPool.execute(new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * + * @className:GetOrderThread + * @description:单次抓单线程 + * @author:Sunshine + * @date:2019年2月1日 下午2:29:02 + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private HashMap tradeInfo_map = new HashMap();// 用于订单合并,存储订单信息 + private ArrayList oid_List = new ArrayList(); + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + } + + @Override + public void run() { + this.getOrder(0); + try { + + int totalCount = tradeInfo_map.size(); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ]", shopConfig.code, shopConfig.name, totalCount); + for (Entry entry : tradeInfo_map.entrySet()) { + + TradeInfo tradeInfo = entry.getValue(); + + if (tradeInfo.orders.length > 1) { + logger.info("[ {} ] | [ {} ] 本次接口调用重复的订单号:[ {} ]", shopConfig.code, shopConfig.name, + tradeInfo.tid); + } + + // 等待出库 的订单 + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + } + + } + + // list转int数组,注意list数组不可以直接转换为int数组,只能通过遍历转换。 + int[] ids = new int[oid_List.size()]; + for (int i = 0; i < oid_List.size(); i++) { + ids[i] = oid_List.get(i); + } + + if (ids.length > 0) { + // 确认下载订单 + boolean confirmDownload = confirmDownload(ids, shopConfig.code, shopConfig.name); + if (confirmDownload) { + logger.info("[ {} ] | [ {} ]:该批次订单确认下载成功!", shopConfig.code, shopConfig.name); + shopConfig.errFlag = true; + } else {// 确认下载订单失败重试一次 + Thread.sleep(5 * 1000); + boolean confirmDownload_next = confirmDownload(ids, shopConfig.code, shopConfig.name); + if (confirmDownload_next) { + logger.info("[ {} ] | [ {} ] :该批次订单确认下载成功!", shopConfig.code, shopConfig.name); + shopConfig.errFlag = true; + } else { + logger.info("[ {} ] | [ {} ] :该批次订单确认下载失败!", shopConfig.code, shopConfig.name); + } + + } + logger.info("[ {} ] | [ {} ] 本次补抓到到订单数:[ {} ],订单号:[ {} ]", shopConfig.code, shopConfig.name, + oid_List.size(), Arrays.toString(ids)); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @title: getOrder + * @description: 调用接口获取订单 + * @param lastId + */ + public void getOrder(int lastId) { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{}", shopConfig.code, shopConfig.name, time_start, time_end); + int order_status = 2; + if (shopConfig.name == null) { + // 商户sellerID非纯数字,放弃处理 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + String url = platConfig.api_url + "order/yitOrderList?shop_code=" + shopConfig.code + + "&order_status=" + order_status + "&nextToken=" + lastId; + String response_json_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 获取订单响应:{}", shopConfig.code, shopConfig.name, response_json_str); + this.parseOrderList(response_json_str); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @title: parseOrderList + * @description: 解析订单 + * @param response_str + */ + private void parseOrderList(String response_str) { + try { + int lastId = 0; + int count = 0;// 用于统计当次获取的订单数量 + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + // 处理异常信息 + if (total_results < 1) { + shopConfig.errFlag = false; + logger.info("[ {} ] | [ {} ] 返回订单:本次没有抓取到订单!", shopConfig.code, shopConfig.name); + return; + } + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取到订单数:[ {} ]", shopConfig.code, shopConfig.name, + total_results); + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + for (int i = 0; i < data_array.length(); i++) { + count++; + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo_origin = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo_origin = Transform.transform2TradeInfo(tradeInfo_origin, shopConfig, recatchConfig); + + // 将本次获取的订单id放入数组,用于回传 TODO + Integer oid = null; + if (tradeInfo_map.containsKey(tradeInfo_origin.tid)) { + TradeInfo tradeInfo = tradeInfo_map.get(tradeInfo_origin.tid); + // 将金额和数量等信息加到订单里面 + tradeInfo.num = (tradeInfo.num + tradeInfo_origin.num); + tradeInfo.money = ((Double.parseDouble(tradeInfo_origin.money) + + Double.parseDouble(tradeInfo_origin.money) + "")); + tradeInfo.pay_money = ((Double.parseDouble(tradeInfo.pay_money) + + Double.parseDouble(tradeInfo_origin.pay_money) + "")); + tradeInfo.product_fee = ((Double.parseDouble(tradeInfo.product_fee) + + Double.parseDouble(tradeInfo_origin.product_fee) + "")); + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = tradeInfo_origin.orders[0]; + + for (OrderInfo order : tradeInfo.orders) { + oid = Integer.valueOf(order.oid); + oid_List.add(oid); + } + tradeInfo_map.put(tradeInfo.tid, tradeInfo); + } else { + OrderInfo[] orders = tradeInfo_origin.orders; + // 遍历子订单获取oid,用于确认下载订单 + for (OrderInfo order : orders) { + oid = Integer.valueOf(order.oid); + oid_List.add(oid); + } + tradeInfo_map.put(tradeInfo_origin.tid, tradeInfo_origin); + } + + if (i == 199) { + lastId = Integer.valueOf(oid); + } + } + // 若本次回去订单数够200条则进行下次调用 + if (count == 200) { + getOrder(lastId); + count = 0; + } + + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ]店铺信息异常,将不再抓单,异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + error_message, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单,", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } // 其他问题自动重试 + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * + * @title: confirmDownload + * @description: 根据订单商品id确认订单已下载 + * @param ids 确认已下载的订单商品id + */ + private boolean confirmDownload(int[] ids, String shop_code, String shop_name) { + try { + YiTiaoParam yiTiaoParam = new YiTiaoParam(); + yiTiaoParam.setShop_code(shop_code); + yiTiaoParam.setIds(ids); + String response_str = new HttpRequest().sendPost(platConfig.api_url + "order/yitConfirmOrders", + new GsonBuilder().disableHtmlEscaping().create().toJson(yiTiaoParam), 2, ApiYiTiaoNew.class.getName()); + JSONObject response = new JSONObject(response_str); + logger.info("店铺 [ {} ] | [ {} ] 确认下载订单响应信息:{}", shop_code, shop_name, response_str); + if (response.has("microservice_yit_confirm_download_result")) { + return response.getBoolean("microservice_yit_confirm_download_result"); + } else if (response.has("error_response")) { + JSONObject error_response = response.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + logger.info("店铺 [ {} ] | [ {} ] 确认下载订单异常,异常编码:{},异常信息:{}", shop_code, shop_name, error_code, + error_message); + return false; + } + } catch (Exception e) { + logger.error(this, e); + return false; + } + return false; + } + + /** + * + * @className:YiTiaoParam + * @description:用于存放确认下载订单参数的内部类 + * @author:Sunshine + * @date:2019年7月19日 下午4:50:29 + */ + class YiTiaoParam { + private String shop_code; + private int[] ids; + + public String getShop_code() { + return shop_code; + } + + public void setShop_code(String shop_code) { + this.shop_code = shop_code; + } + + public int[] getIds() { + return ids; + } + + public void setIds(int[] ids) { + this.ids = ids; + } + + } + +} diff --git a/src/com/since/emp/newplatform/service/ApiYouZanNew.java b/src/com/since/emp/newplatform/service/ApiYouZanNew.java new file mode 100644 index 0000000..c38cb6c --- /dev/null +++ b/src/com/since/emp/newplatform/service/ApiYouZanNew.java @@ -0,0 +1,146 @@ +package com.since.emp.newplatform.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +public class ApiYouZanNew { + private static final Logger logger = LogManager.getLogger(ApiYouZanNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiYouZanNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "有赞")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + threadPool + .execute(new GetOrderDetailThread(logger, recatchConfig, platConfig, shopOrderInfo, "有赞")); + // getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + String apiName = "ApiYouZanNew"; + new UpdateAccessToken().getNewAccessToken(platConfig, logger, apiName); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + shopConfig.lastCatchTime, df.format(now))); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } +} diff --git a/src/com/since/emp/newplatform/service/GetOrderDetailThread.java b/src/com/since/emp/newplatform/service/GetOrderDetailThread.java new file mode 100644 index 0000000..4ac550b --- /dev/null +++ b/src/com/since/emp/newplatform/service/GetOrderDetailThread.java @@ -0,0 +1,166 @@ +package com.since.emp.newplatform.service; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.logging.log4j.Logger; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.util.HttpRequest; + +/** + * @className:GetOrderDetailThread + * @description:获取订单详情线程 + * @author:Sunshine + * @date:2019年7月18日 上午11:35:39 + */ +public class GetOrderDetailThread implements Runnable { + private Logger logger; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ShopOrderInfo shopOrderInfo; + private String platformName; + + public GetOrderDetailThread(Logger logger, RecatchConfig recatchConfig, PlatConfig platConfig, + ShopOrderInfo shopOrderInfo, String platformName) { + this.logger = logger; + this.recatchConfig = recatchConfig; + this.platConfig = platConfig; + this.shopOrderInfo = shopOrderInfo; + this.platformName = platformName; + } + + @Override + public void run() { + for (int i = 0; i < 10; i++) { + if (getOrderDetail(shopOrderInfo,i)) { + break; + } + if (i>0) { + logger.info("补录订单:{},第{}次重试",shopOrderInfo.tid,i); + } + + try { + Thread.sleep(5 * 1000); + } catch (InterruptedException e) { + logger.error(this, e); + } + + } + + } + + /** + * @param shopOrderInfo + * @return + * @title: getOrderDetail + * @description: 根据订单号获取订单详情 + */ + private boolean getOrderDetail(ShopOrderInfo shopOrderInfo,int num) { + + String url = platConfig.api_url + "order/orderDetail?shop_code=" + shopOrderInfo.shopConfig.code + + "&platform_num=" + shopOrderInfo.tid; + try { + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 异常订单 [ {} ] 获取订单详情响应信息 :{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, response_str); + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderDetail_response")) { + JSONObject microservice_orderDetail_response = response_json + .getJSONObject("microservice_orderDetail_response"); + if (microservice_orderDetail_response.has("data")) { + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson( + microservice_orderDetail_response.getJSONObject("data").toString(), TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃抓取!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + return true; + } else if (response_json.has("error_response")) { + shopOrderInfo.shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + String error_note = error_response.has("error_note") ? error_response.getString("error_note") + : "平台故障,请联系软维ERP排查"; + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + if (num <9) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "稍后自动重试", ""); + } + } + + } else if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + platformName + "未查询到店铺信息,请确认店铺存在并启用", ""); + if (num <9) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "稍后自动重试", ""); + } + } + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + if (num <9) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "稍后自动重试", ""); + } + } + logger.info("店铺:[ {} ] | [ {}]session_key过期,将不再抓单|", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + } else if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_message, ""); + if (num <9) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "稍后自动重试", ""); + } + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, platformName + error_note, ""); + if (num <9) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "稍后自动重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ]店铺信息异常,异常编码 [ {}], 异常信息:[ {} ]时间:{}", + shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + return false; + } + + } catch (Exception e) { + logger.error(this, e); + shopOrderInfo.shopConfig.errFlag = false; + } + return false; + } + +} diff --git a/src/com/since/emp/newplatform/service/GetOrderThread.java b/src/com/since/emp/newplatform/service/GetOrderThread.java new file mode 100644 index 0000000..cc198e1 --- /dev/null +++ b/src/com/since/emp/newplatform/service/GetOrderThread.java @@ -0,0 +1,188 @@ +package com.since.emp.newplatform.service; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * @className:GetOrderThread + * @description:批量抓取订单线程 + * @author:Sunshine + * @date:2019年7月18日 上午11:36:00 + */ +public class GetOrderThread implements Runnable { + private Logger logger; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(Logger logger, RecatchConfig recatchConfig, PlatConfig platConfig, ShopConfig shopConfig, + String time_start, String time_end) { + this.logger = logger; + this.recatchConfig = recatchConfig; + this.platConfig = platConfig; + this.shopConfig = shopConfig; + + this.time_start = time_start;// 开始时间 + // this.time_start = "2019-05-01 00:00:00"; + this.time_end = time_end;// 结束时间 + // this.time_end = "2019-07-18 00:00:00"; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 获取订单响应:{}", shopConfig.code, shopConfig.name, response_str); + + this.parseOrderList(response_str); + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @title: parseOrderList + * @description: 解析订单 + * @param response_str + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + if (total_results < 1) { + shopConfig.errFlag = false; + logger.info("[ {} ] | [ {} ] 返回订单:本次没有抓取到订单!", shopConfig.code, shopConfig.name); + return; + } + logger.info("[ {} ] | [ {} ]返回订单:本次抓取到订单数:[ {} ]", shopConfig.code, shopConfig.name, total_results); + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + // JSONArray data_array = microservice_order_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 2条 + if (this.page_now == this.page_count) { + currentPageCount = total_results % this.page_rows; + } + + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] 订单 [ {} ] 不是待发货订单,已放弃处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + error_message, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } // 其他问题自动重试 + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + +} diff --git a/src/com/since/emp/newplatform/service/RecatchOrderThread.java b/src/com/since/emp/newplatform/service/RecatchOrderThread.java new file mode 100644 index 0000000..f773e68 --- /dev/null +++ b/src/com/since/emp/newplatform/service/RecatchOrderThread.java @@ -0,0 +1,227 @@ +package com.since.emp.newplatform.service; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * @className:RecatchOrderThread + * @description:根据时间段批量补抓订单线程 + * @author:Sunshine + * @date:2019年7月18日 上午11:36:40 + */ +public class RecatchOrderThread implements Runnable { + + private Logger logger; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private String platformName; + private int page_count = 1;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public RecatchOrderThread(Logger logger, RecatchConfig recatchConfig, PlatConfig platConfig, ShopConfig shopConfig, + String time_start, String time_end, String platformName) { + this.recatchConfig = recatchConfig; + this.platConfig = platConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + this.platformName = platformName; + this.logger = logger; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + String url = (platConfig.api_url + "order/orderList?shop_code=" + shopConfig.code + + "&date_type=1&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&order_status=2").replaceAll(" ", "%20"); + // 处理返回信息 + String response_str = new HttpRequest().getOrderRequest(url); + logger.info("[ {} ] | [ {} ] 根据时间段补抓订单响应信息:{}", shopConfig.code, shopConfig.name, response_str); + + this.parseOrderList(response_str); + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @param response_str + * @title: parseOrderList + * @description: 解析订单 + */ + private void parseOrderList(String response_str) { + try { + JSONObject response_json = new JSONObject(response_str); + if (response_json.has("microservice_orderList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_orderList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + // 处理异常信息 + logger.info("[ {} ] | [ {} ] 返回订单,本次补抓到订单数:[ {} ]", shopConfig.code, shopConfig.name, total_results); + if (total_results < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (total_results > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 当前页条数 + if (this.page_now == this.page_count) {// 只有一页 + currentPageCount = total_results % this.page_rows; + } + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + TradeInfo tradeInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, TradeInfo.class); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + if ("2".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + + } + } + + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else if (response_json.has("error_response")) { + shopConfig.errFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + String error_note = error_response.has("error_note") ? error_response.getString("error_note") : "平台故障,请联系软维ERP排查"; + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, platformName + "未查询到店铺信息,请确认店铺存在并启用", + ""); + } + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + error_message, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { +// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 +// Date date = df.parse(shopConfig.lastCatchTime); +// date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 +// shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_note, ""); + } + + } else if (108 == error_code) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, error_message, ""); + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, platformName + error_note, + ""); + logger.info("店铺:[ {} ] | [ {} ] 店铺信息异常,异常编码 [ {} ], 异常信息:[ {} ]时间:{}", shopConfig.code, + shopConfig.name, error_code, error_message, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平台故障,请联系软维ERP排查", ""); + } + } + + } + +} diff --git a/src/com/since/emp/newplatform/service/RefundOrderThread.java b/src/com/since/emp/newplatform/service/RefundOrderThread.java new file mode 100644 index 0000000..2c36663 --- /dev/null +++ b/src/com/since/emp/newplatform/service/RefundOrderThread.java @@ -0,0 +1,188 @@ +package com.since.emp.newplatform.service; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.google.gson.GsonBuilder; +import com.since.emp.base.RefundInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; + +/** + * + * @className:RefundOrderThread + * @description:退款单处理线程 + * @author:Sunshine + * @date:2020年3月11日 上午9:31:14 + */ +public class RefundOrderThread implements Runnable { + + private Logger LOGGER; + private PlatConfig platConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private String platformName; + private int page_count = 1;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数50-100 + + public RefundOrderThread(Logger logger, PlatConfig platConfig, ShopConfig shopConfig, String time_start, + String time_end, String platformName) { + this.platConfig = platConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + this.platformName = platformName; + this.LOGGER = logger; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + /** + * + * @title: getRefundOrder + * @description: 获取退款单 + */ + private void getRefundOrder() { + try { + + LOGGER.info("[ {} ] | [ {} ] 获取退款订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + String url = (platConfig.api_url + "refund/refundList?shop_code=" + shopConfig.code + + "&date_type=2&start_date=" + time_start + "&end_date=" + time_end + "&page_rows=" + page_rows + + "&page_now=" + page_now + "&bill_type=1,2").replaceAll(" ", "%20"); + // 处理返回信息 + String response = new HttpRequest().getOrderRequest(url); + LOGGER.info("[ {} ] | [ {} ] 获取退款订单响应:{}", shopConfig.code, shopConfig.name, response); + + this.parseRefundOrder(response); + } catch (Exception e) { + LOGGER.error(this, e); + } + + } + + /** + * + * @title: parseRefundOrder + * @description: 解析退款单响应信息 + * @param response + */ + private void parseRefundOrder(String response) { + try { + JSONObject response_json = new JSONObject(response); + if (response_json.has("microservice_refundList_response")) { + JSONObject microservice_orderList_response = response_json + .getJSONObject("microservice_refundList_response"); + int total_results = microservice_orderList_response.getInt("total_results"); + if (total_results < 1) { + shopConfig.refundErrFlag = false; + LOGGER.info("[ {} ] | [ {} ] 返回订单:本次没有抓取到退款订单!", shopConfig.code, shopConfig.name); + return; + } + LOGGER.info("[ {} ] | [ {} ]返回订单:本次抓取到退款订单数:[ {} ]", shopConfig.code, shopConfig.name, total_results); + // 将本次获取到的订单放入数据处理队列 + JSONArray data_array = microservice_orderList_response.getJSONArray("data"); + this.page_count = (int) Math.ceil((double) total_results / page_rows);// 计算分页总数 + int currentPageCount = this.page_rows;// 2条 + if (this.page_now == this.page_count) { + currentPageCount = total_results % this.page_rows; + } + + if (currentPageCount == 1) { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + RefundInfo refundInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, RefundInfo.class); + refundInfo.company_code = shopConfig.company_code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.platform_code = shopConfig.platformCode; + refundInfo.shop_code = shopConfig.code; + if (refundInfo.bill_type == 1 || refundInfo.bill_type == 2) { + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + LOGGER.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + } + } + } else { + for (int i = 0; i < data_array.length(); i++) { + JSONObject json = (JSONObject) data_array.get(i); + String tradeInfoString = json.toString(); + RefundInfo refundInfo = new GsonBuilder().disableHtmlEscaping().create().fromJson(tradeInfoString, RefundInfo.class); + refundInfo.company_code = shopConfig.company_code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.platform_code = shopConfig.platformCode; + refundInfo.shop_code = shopConfig.code; + if (refundInfo.bill_type == 1 || refundInfo.bill_type == 2) { + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + LOGGER.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } else if (response_json.has("error_response")) { + shopConfig.refundErrFlag = false; + JSONObject error_response = response_json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + // 1.107 session_key错误 2.119 未查询到店铺信息 3.120 请求接口超过时间限制 + if (119 == error_code) { + LOGGER.info("店铺:[ {} ] | [ {} ] 店铺信息异常,将不再抓单|异常信息:[ {} ]时间:{}", shopConfig.code, shopConfig.name, + error_message, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else if (107 == error_code || 105 == error_code || 102 == error_code || 106 == error_code) { + LOGGER.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单|", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if (120 == error_code) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } // 其他问题自动重试 + return; + } + } catch (Exception e) { + LOGGER.error(this, e); + shopConfig.refundErrFlag = false; + } + + } +} diff --git a/src/com/since/emp/newplatform/service/Transform.java b/src/com/since/emp/newplatform/service/Transform.java new file mode 100644 index 0000000..800a30e --- /dev/null +++ b/src/com/since/emp/newplatform/service/Transform.java @@ -0,0 +1,70 @@ +package com.since.emp.newplatform.service; + +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs.ShopConfig; + +public class Transform { + public static TradeInfo transform2TradeInfo(TradeInfo tradeInfo, ShopConfig shopConfig, + RecatchConfig recatchConfig) { + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.obm_company_code = "";// 品牌商公司编码,只有代发订单有值 + tradeInfo.platform_code = shopConfig.realPlatformCode; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + return tradeInfo; + } + + public static RefundInfo transform2RefundInfo(RefundInfo refundInfo, ShopConfig shopConfig, + RecatchConfig recatchConfig) { + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.platform_code = shopConfig.platformCode; + return refundInfo; + } + /** + * @Description: 将店铺的发货快递编码写入tradeInfo + * @Title: transform2DeliveryMode + * @author Lewis + * @param shopConfig + * @param tradeInfo + * @return TradeInfo + */ + public static TradeInfo transform2DeliveryMode(ShopConfig shopConfig, TradeInfo tradeInfo) { + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List deliveryAreaSettingList = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < deliveryAreaSettingList.size(); i++) { + DeliveryArea deliveryAreaSettingItem = deliveryAreaSettingList.get(i); + int deliveryModeId = deliveryAreaSettingItem.delivery_mode_id; + String areas = deliveryAreaSettingItem.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = deliveryModeId; + break; + } + } + } + return tradeInfo; + } +} diff --git a/src/com/since/emp/newplatform/service/UpdateAccessToken.java b/src/com/since/emp/newplatform/service/UpdateAccessToken.java new file mode 100644 index 0000000..471d15f --- /dev/null +++ b/src/com/since/emp/newplatform/service/UpdateAccessToken.java @@ -0,0 +1,341 @@ +package com.since.emp.newplatform.service; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.logging.log4j.Logger; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.GsonBuilder; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.util.HttpRequest; + +/** + * @className:UpdateAccessToken + * @description:更新AccessToken + * @author:Sunshine + * @date:2019年7月31日 上午10:48:19 + */ +public class UpdateAccessToken { + + /** + * @param platConfig 平台配置 + * @param logger 日志 + * @param apiName 平台Api名称 + * @title: getNewAccessToken + * @description: 刷新令牌 + */ + public void getNewAccessToken(PlatConfig platConfig, Logger logger, String apiName) { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + + String shop_code = um.shop_code; + // TODO 测试 + // String shop_code = "201708288112"; + String shop_name = um.shop_name; + try { + logger.info("店铺:[ {} ]开始执行刷新令牌任务!", shop_name); + // 刷新令牌剩余时间 + int timeRemaining = 0; + /** + * 微盟的授权只有2个小时,其他的平台授权都很长,此处利用cpu的分支预测,其他平台采用switch判断 + */ + if (apiName.equals("ApiWeiMobNew")) { + timeRemaining = 30 * 60 * 1000; + } else { + switch (apiName) { + //抖音店铺的授权只有在过期前一个小时内刷新才会刷到新的token和refresh_token,在过期前一个小时外刷新,只会获取到老的token和refresh_token +// case "ApiDouDian": +// timeRemaining = 60 * 60 * 1000; +// break; + + default: + timeRemaining = 2 * 60 * 60 * 1000; + } + + } + // 判断小于timeRemaining的话更新 + if ((expires_time_sdf - now_time_sdf <= timeRemaining) && (expires_time_sdf - now_time_sdf > 0)) { + String url = platConfig.api_url + "authorize/refresh_token"; + Map param = new HashMap(16); + param.put("shop_code", shop_code); + String params = new GsonBuilder().disableHtmlEscaping().create().toJson(param); + String response_str = new HttpRequest().sendPost(url, params, 2, + UpdateAccessToken.class.getName()); + JSONObject json = new JSONObject(response_str); + + logger.info("店铺[ {} ]执行刷新令牌返回信息:{}", shop_name, json); + if (json.has("microservice_refresh_response")) { + JSONObject microservice_refresh_response = json + .getJSONObject("microservice_refresh_response"); + if (microservice_refresh_response.has("data")) { + JSONObject data = microservice_refresh_response.getJSONObject("data"); + String access = data.getString("session_key"); + String refresh = ""; + if (data.has("refresh_token")) { + refresh = data.getString("refresh_token"); + } + // 获取的是当前时候往后expires_in(秒)过期 + long expiresIn = data.getLong("expires_in"); + + if (apiName.equals("ApiWeiMobNew")) { + // 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + if (expiresIn > 10 * 60) { + updateNewToken(logger, platConfig, shop_name, shop_code, access, refresh, + expiresIn, now_time_sdf); + } else { + logger.info("店铺:[ {} ],刷新码到期,放弃刷新!", shop_name); + } + } else { + // 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + if (expiresIn > 2 * 60 * 60) { + updateNewToken(logger, platConfig, shop_name, shop_code, access, refresh, + expiresIn, now_time_sdf); + } else { + logger.info("店铺:[ {} ],刷新码到期,放弃刷新!", shop_name); + } + } + } + } else if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + int error_code = error_response.getInt("code"); + String error_message = error_response.getString("message"); + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:错误码[ {} ],异常信息:{}", shop_name, error_code, + error_message); + } else { + logger.info("店铺:[ {} ]刷新令牌失败,出现未知异常,请检查!", shop_name); + } + } else { + logger.info("店铺:[ {} ]尚未到刷新令牌时间,本次不予刷新!", shop_name); + } + } catch (Exception e) { + logger.info("店铺:[ {} ]刷新令牌失败", shop_name); + logger.error(this, e); + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试"); + } + + } + + /** + * @param logger 日志 + * @param platConfig 平台配置 + * @param shop_name 店铺名称 + * @param shop_code 店铺编码 + * @param access 新的令牌 + * @param refresh 新的刷新码 + * @param expiresIn 过期时间 + * @param now_time_sdf 当前时间 + * @title: updateNewToken + * @description: 将刷新好的令牌更新至数据库中 + */ + public void updateNewToken(Logger logger, PlatConfig platConfig, String shop_name, String shop_code, String access, + String refresh, long expiresIn, long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = ""; + if (refresh.equals("")) { + sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + } else { + sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "',refresh_token='" + refresh + "' where code = '" + shop_code + "'"; + } + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + } else { + logger.info("店铺:[ {} ],刷新令牌成功,已写入数据库!", shop_name); + + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(logger, platConfig, shop_name, shop_code, access, refresh, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 程序启动或者店铺开启抓单首先执行刷新授权码步骤 + *

+ * 2018年11月13日 void Lewis + */ + public boolean initRefreshToken(String shopCode, PlatConfig platConfig, Logger logger) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String shop_code = um.shop_code; + if (shopCode != null && shopCode.equals(shop_code)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long now_time_sdf = System.currentTimeMillis(); + String shop_name = um.shop_name; + String url = platConfig.api_url + "authorize/refresh_token"; + Map param = new HashMap(16); + param.put("shop_code", shop_code); + String params = new GsonBuilder().disableHtmlEscaping().create().toJson(param); + String response_str = new HttpRequest().sendPost(url, params, 2, UpdateAccessToken.class.getName()); + JSONObject json = new JSONObject(response_str); + + if (json.has("microservice_refresh_response")) { + + JSONObject microservice_refresh_response = json.getJSONObject("microservice_refresh_response"); + if (microservice_refresh_response.has("data")) { + JSONObject data = microservice_refresh_response.getJSONObject("data"); + String access = data.getString("session_key"); + String refresh = ""; + if (data.has("refresh_token")) { + refresh = data.getString("refresh_token"); + } + + // 获取的是当前时候往后expires_in(秒)过期 + long expiresIn = json.getLong("expires_in"); + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + // 更新相关店铺的sessionkey + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + + expiresIn_sdf + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + return false; + } else { + logger.info("店铺:[ {} ]刷新令牌成功,已写入数据库!", shop_name); + return true; + } + } + + } else { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_name, response_str); + return false; + } + } + } + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/service/ApiDouDian.java b/src/com/since/emp/service/ApiDouDian.java new file mode 100644 index 0000000..5168acd --- /dev/null +++ b/src/com/since/emp/service/ApiDouDian.java @@ -0,0 +1,1335 @@ +package com.since.emp.service; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.doudian.open.api.afterSale_List.AfterSaleListRequest; +import com.doudian.open.api.afterSale_List.AfterSaleListResponse; +import com.doudian.open.api.afterSale_List.data.AfterSaleListData; +import com.doudian.open.api.afterSale_List.data.AftersaleInfo; +import com.doudian.open.api.afterSale_List.data.ItemsItem; +import com.doudian.open.api.afterSale_List.data.TextPart; +import com.doudian.open.api.afterSale_List.param.AfterSaleListParam; +import com.doudian.open.api.token.AccessTokenData; +import com.doudian.open.core.AccessToken; +import com.doudian.open.core.AccessTokenBuilder; +import com.doudian.open.core.GlobalConfig; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.doudian.CipherInfo; +import com.since.emp.base.doudian.CipherInfos; +import com.since.emp.base.doudian.DdEncryptBO; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.test.vo.CombineStatusVO; +import com.since.emp.test.vo.DouDianOrderListQueryVO; +import com.since.emp.test.vo.DouDianSignVO; +import com.since.emp.test.vo.OrderDetialVO; +import com.since.emp.test.vo.RefundVO; +import com.since.emp.util.ConvertUtil; +import com.since.emp.util.DouDianSignUtil; +import com.since.emp.util.HttpRequest; + +/** + * @Description:抖店Api接口类 + * @Author: wg + * @Date: 2021/6/7 13:18 + */ +public class ApiDouDian { + private static final Logger logger = LogManager.getLogger(ApiDouDian.class); + private PlatConfig platConfig;// 平台参数 + private RecatchConfig recatchConfig;// 补抓单参数 + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool;// 定时器 + + public ApiDouDian(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + // 根据下单时间段进行补抓取订单 + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderThreadByTime getOrderThreadByTime = new GetOrderThreadByTime(platConfig.apps.get(0), + platConfig.apps.get(0).shops.get(i), recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(getOrderThreadByTime); + } + + } + // 根据系统单号补抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号补抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(platConfig.apps.get(0), shopOrderInfo); + } + } else { + // 定时器执行抓单 + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + // 获取公共参数配置信息提取 + public void setCommonConfig(DouDianSignVO douDianSignVO, String appKey, String sessionKey, String douOrderDetial, + String timestamp) { + douDianSignVO.setApp_key(appKey); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douOrderDetial); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + } + + private boolean getOrderInfo(AppConfig appConfig, ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String appKey = shopOrderInfo.app_key; + String appSecret = shopOrderInfo.app_secret; + String sessionKey = shopOrderInfo.shopConfig.session_key; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + OrderDetialVO orderDetialVO = new OrderDetialVO(); + orderDetialVO.setShop_order_id(shopOrderInfo.tid); + String s = orderDetialVO.toJsonString(); + + Map douDianOrderDetialQueryMap = douDianSignUtil.jsonToMap(s); + String douOrderDetial = douDianSignUtil.sortParams(douDianOrderDetialQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("order.orderDetail"); + setCommonConfig(douDianSignVO, appKey, sessionKey, douOrderDetial, timestamp); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); + + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String douOrderDetialString = new HttpRequest().sendGet(platConfig.api_url + "/order/orderDetail", + douDianSignVORequestString, "测试logTitle"); + + logger.info("[ {} ] | [ {} ] 订单编号抓取订单:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + douOrderDetialString); + JSONObject responJson = new JSONObject(douOrderDetialString); + if (!responJson.has("data")) { + logger.info("[ {} ] 异常订单返回结果:{}", shopOrderInfo.shopConfig.code, responJson); + int errorCode = responJson.getInt("err_no"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if (30002 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权access_token已过期,请重新授权后重试", + ""); + } else if (30005 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + "店铺授权access_token不存在,请使用最新的access_token访问", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "抖店平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + + JSONObject data = responJson.getJSONObject("data"); + JSONObject shopOrderDetail = data.getJSONObject("shop_order_detail"); + TradeInfo tradeInfo = parseTradeInfo(appConfig, shopOrderDetail, shopOrderInfo.shopConfig); + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无未发货的子订单", ""); + } + } + if ("2".equals(tradeInfo.status)) { + logger.info("[ {} ]未发货订单信息:{}", shopOrderInfo.shopConfig.code, JSON.toJSONString(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + + } + if ("1".equals(tradeInfo.status) && "2".equals(tradeInfo.type)) { + OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 发送tradeInfo至预售订单处理队列 + logger.info("[ {} ]预售订单信息:{}", shopOrderInfo.shopConfig.code, JSON.toJSONString(tradeInfo)); + } + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + } + + /** + * 定时器抓取订单 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + List statusList = new ArrayList(); + // 设置抓单的订单状态 + CombineStatusVO preCombineStatusVO = new CombineStatusVO(); + preCombineStatusVO.setOrder_status("1"); + preCombineStatusVO.setMain_status("103"); + CombineStatusVO othersCombineStatusVO = new CombineStatusVO(); + othersCombineStatusVO.setOrder_status("2"); + statusList.add(preCombineStatusVO); + statusList.add(othersCombineStatusVO); + + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + // 处理token更新 + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + for (CombineStatusVO combineStatusVO : statusList) { + threadPool.execute(new GetOrderListThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now), combineStatusVO)); + } + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now))); + } + + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + // 定时器订单列表查询(定金预售订单 普通订单) + public class GetOrderListThread implements Runnable { + private final Logger logger = LogManager.getLogger(GetOrderListThread.class); + public OrderSyncs.AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 0;// 条数 + private int pageNow = 0;// 当前页 + private int pageRows = 100;// 每次订单列表获取的单页条数50-100 + + private CombineStatusVO combineStatusVO; + + public GetOrderListThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd, + CombineStatusVO combineStatusVO) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + this.combineStatusVO = combineStatusVO; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单,订单状态:{}:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + JSON.toJSON(combineStatusVO), timeStart, timeEnd, pageNow); + + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String appKey = appConfig.key; + String appSecret = appConfig.secret; + String sessionKey = shopConfig.session_key; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + DouDianOrderListQueryVO douDianOrderListQueryVO = new DouDianOrderListQueryVO(); + douDianOrderListQueryVO.setPage(pageNow); + douDianOrderListQueryVO.setSize(pageRows); + douDianOrderListQueryVO.setUpdate_time_start((sdf.parse(timeStart).getTime()) / 1000); + douDianOrderListQueryVO.setUpdate_time_end((sdf.parse(timeEnd).getTime()) / 1000); + + ArrayList list = new ArrayList(); + list.add(combineStatusVO); + douDianOrderListQueryVO.setCombine_status(list); + + String douDianOrderListQueryVOStrJson = douDianOrderListQueryVO.toJsonString(); + Map douDianOrderListQueryMap = douDianSignUtil + .jsonToMap(douDianOrderListQueryVOStrJson); + String douDianOrderListQueryString = douDianSignUtil.sortParams(douDianOrderListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("order.searchList"); + setCommonConfig(douDianSignVO, appKey, sessionKey, douDianOrderListQueryString, timestamp); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String orderListString = new HttpRequest().sendGet(platConfig.api_url + "/order/searchList", + douDianSignVORequestString, "测试logTitle"); + logger.info("[ {} ] | [ {} ] 返回订单,订单状态:{}:{}", shopConfig.code, shopConfig.name, + JSON.toJSON(combineStatusVO), orderListString); + // 解析订单 + this.parseOrderList(orderListString); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * @param orderListString + * @title: parseOrderList + * @description: 解析订单 + */ + private void parseOrderList(String orderListString) { + try { + org.json.JSONObject responJson = new org.json.JSONObject(orderListString); + if (!responJson.has("data")) { + logger.info("[ {} ]异常订单返回结果:{}", shopConfig.code, responJson); + int errorCode = responJson.getInt("err_no"); + if (30002 == errorCode || 30005 == errorCode) { + logger.info("店铺:[ {} ] | [ {} ] access_token已过期或不存在,将不再抓单,请重新授权后重试->{}", shopConfig.code, + shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (7 == errorCode) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "抖店平台故障,请联系软维ERP排查", ""); + } + shopConfig.errFlag = false; + return; + } + JSONObject data = responJson.getJSONObject("data"); + int total = data.getInt("total"); + if (total < 1) { + shopConfig.errFlag = false; + return; + } + + logger.info("[ {} ] | [ {} ]返回订单:本次抓取到订单数:[ {} ]", shopConfig.code, shopConfig.name, total); + // 将本次获取到的订单放入数据处理队列 + JSONArray shop_order_list = data.getJSONArray("shop_order_list"); + + this.pageCount = (int) Math.ceil((double) total / pageRows);// 计算分页总数 + + for (int i = 0; i < shop_order_list.length(); i++) { + JSONObject shopOrder = shop_order_list.getJSONObject(i); + + String orderId = shopOrder.getString("order_id"); + TradeInfo tradeInfo = parseTradeInfo(appConfig, shopOrder, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无未发货的子订单", ""); + } + continue; + } + if ("2".equals(tradeInfo.status)) { +// logger.info("[ {} ]未发货订单信息:{}", shopConfig.code, JSON.toJSONString(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + if ("1".equals(tradeInfo.status) && "2".equals(tradeInfo.type)) { + OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 发送tradeInfo至预售订单处理队列 + logger.info("[ {} ]预售订单信息:{}", shopConfig.code, JSON.toJSONString(tradeInfo)); + } + } + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getOrder();// 抓取下一页 + + } else { + shopConfig.lastCatchTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + // 方法解析订单 + private TradeInfo parseTradeInfo(AppConfig appConfig, JSONObject orderDetail, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + + org.json.JSONObject post_addr = orderDetail.getJSONObject("post_addr"); + org.json.JSONObject province = post_addr.getJSONObject("province"); + org.json.JSONObject town = post_addr.getJSONObject("town"); + org.json.JSONObject city = post_addr.getJSONObject("city"); + org.json.JSONObject street = post_addr.getJSONObject("street"); + + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Calendar payTimeCalendar = Calendar.getInstance(); + payTimeCalendar.setTimeInMillis(orderDetail.getLong("pay_time") * 1000);// 转换为毫秒 + Date payTime = payTimeCalendar.getTime(); + + Calendar updateTimeCalendar = Calendar.getInstance(); + updateTimeCalendar.setTimeInMillis(orderDetail.getLong("update_time") * 1000);// 转换为毫秒 + Date updateTime = updateTimeCalendar.getTime(); + + // 订单配置信息 + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + // 订单平台解析数据 + tradeInfo.tid = orderDetail.getString("order_id");// 店铺订单号 + tradeInfo.status = String.valueOf(orderDetail.getInt("order_status"));// 订单状态 + tradeInfo.type = String.valueOf(orderDetail.getInt("trade_type"));// 交易类型 定金支付 + tradeInfo.orderStatusName = orderDetail.getString("order_status_desc");// 订单状态描述 订单状态名称 ep:待支付 + tradeInfo.num = 0; // 商品购买数量 + tradeInfo.discount_fee = String.valueOf(orderDetail.getLong("promotion_platform_amount") / 100.0); + tradeInfo.money = String.valueOf(orderDetail.getLong("pay_amount") / 100.0);// 商家实收金额 + tradeInfo.pay_money = String.valueOf(orderDetail.getLong("pay_amount") / 100.0);// 支付金额(分) + tradeInfo.product_fee = String.valueOf(orderDetail.getLong("order_amount") / 100.0);// 订单金额(分) + tradeInfo.pay_time = tradeInfo.created = sd.format(payTime);// 支付时间 + tradeInfo.platform_modify_time = sd.format(updateTime);// 订单更新时间 + tradeInfo.post_fee = String.valueOf(orderDetail.getLong("post_amount") / 100.0);// 快递费 + tradeInfo.receiver_name = orderDetail.has("post_receiver") ? orderDetail.getString("post_receiver") : "";// 收件人姓名 + tradeInfo.receiver_country = "中国";// 收货人的所在国家 + tradeInfo.receiver_state = province.getString("name");// 收货人的所在省份 + tradeInfo.receiver_city = city.getString("name");// 收货人的所在城市 + tradeInfo.receiver_district = town.getString("name");// 收货人的所在地区 + tradeInfo.receiver_address = post_addr.getString("detail");// 收货人的详细地址 + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + tradeInfo.receiver_city = province.getString("name");// 收货人的所在城市 + } + tradeInfo.receiver_mobile = tradeInfo.receiver_phone = orderDetail.has("post_tel") + ? orderDetail.getString("post_tel") + : ""; + // 收件人电话密文 + tradeInfo.encrpy_mobile = tradeInfo.encrpy_telephone = orderDetail.has("encrypt_post_tel") + ? orderDetail.getString("encrypt_post_tel") + : ""; + // 收件人姓名密文 + tradeInfo.encrpy_name = orderDetail.has("encrypt_post_receiver") + ? orderDetail.getString("encrypt_post_receiver") + : ""; + // 收件人地址密文 + tradeInfo.encrpy_address = post_addr.has("encrypt_detail") ? post_addr.getString("encrypt_detail") : ""; + + DdEncryptBO ddEncryptBO = new DdEncryptBO(); + ddEncryptBO.setOrderNo(tradeInfo.tid); + // 标记是否有密文数据需要解密 + boolean hasEncryptData = false; + if (!"".equals(tradeInfo.encrpy_address)) { + ddEncryptBO.setEncryptDetail(tradeInfo.encrpy_address); + hasEncryptData = true; + } + if (!"".equals(tradeInfo.encrpy_name)) { + ddEncryptBO.setEncryptPostReceiver(tradeInfo.encrpy_name); + hasEncryptData = true; + } + if (!"".equals(tradeInfo.encrpy_mobile)) { + ddEncryptBO.setEncryptPostTel(tradeInfo.encrpy_mobile); + hasEncryptData = true; + } + if (hasEncryptData) { + ddEncryptBO = requestData(appConfig, shopConfig, ddEncryptBO); + if (null != ddEncryptBO.getPostTel()) { + tradeInfo.receiver_mobile = tradeInfo.receiver_phone = ddEncryptBO.getPostTel(); + } + if (null != ddEncryptBO.getPostReceiver()) { + tradeInfo.receiver_name = ddEncryptBO.getPostReceiver(); + } + if (null != ddEncryptBO.getDetail()) { + tradeInfo.receiver_address = ddEncryptBO.getDetail(); + } + } + String streetString = street.getString("name");// 街道 + + tradeInfo.receiver_address = new StringBuilder(tradeInfo.receiver_state).append(" ") + .append(tradeInfo.receiver_city).append(" ").append(tradeInfo.receiver_district).append(" ") + .append(streetString).append(" ").append(tradeInfo.receiver_address).toString(); + + tradeInfo.buyer_message = orderDetail.getString("buyer_words");// 买家留言 + tradeInfo.seller_memo = orderDetail.getString("seller_words");// 商家备注 + tradeInfo.title = orderDetail.getString("shop_name");// 商户名称 + tradeInfo.alipay_id = orderDetail.getString("channel_payment_no");// 支付流水号 + + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + + // 抖店平台编号 + tradeInfo.platform_code = "023"; + + // 商品单信息 + JSONArray skurderist = orderDetail.getJSONArray("sku_order_list"); + tradeInfo.orders = new OrderInfo[skurderist.length()]; + for (int i = 0; i < skurderist.length(); i++) { + JSONObject item = skurderist.getJSONObject(i); + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("code") ? item.getString("code") : "";// 用户录入商品编码 + + orderInfo.sku_id = String.valueOf(item.getLong("sku_id"));// 商品标识码 + + orderInfo.num = item.getInt("item_num");// 购买数量。取值范围:大于零的整数 + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = String.valueOf(item.getLong("origin_amount") / 100.0); + orderInfo.total_fee = String.valueOf(item.getLong("pay_amount") / 100.0); + orderInfo.discount_fee = "0"; + /* + * 计算商品级实付金额 + */ + String payment = (new BigDecimal(orderInfo.price).multiply(new BigDecimal(orderInfo.num))) + .divide(new BigDecimal(Double.valueOf(tradeInfo.getProduct_fee()) == 0 ? 1.0 + "" + : tradeInfo.getProduct_fee()), 2, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal(tradeInfo.getMoney())).toString(); + orderInfo.payment = payment; + + orderInfo.title = item.has("product_name") ? item.getString("product_name") : ""; + orderInfo.productItemID_dd = ""; + orderInfo.outer_sku_id = item.getString("out_sku_id"); + orderInfo.sku_properties_name = ""; + JSONArray spec = item.getJSONArray("spec"); + if (spec.length() > 0) { + for (int j = 0; j < spec.length(); j++) { + JSONObject specObject = spec.getJSONObject(j); + orderInfo.sku_properties_name += specObject.getString("name") + ":" + + specObject.getString("value") + (j < spec.length() - 1 ? "|" : ""); + } + } + orderInfo.outer_iid = item.getString("out_product_id"); + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + tradeInfo.adjust_fee = "0"; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + public DdEncryptBO requestData(AppConfig appConfig, ShopConfig shopConfig, DdEncryptBO ddEncryptBO) + throws Exception { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + // 封装业务参数 + CipherInfos decryptData = decryptData(ddEncryptBO); + // 封装平台参数 + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("order.batchSensitive"); + setCommonConfig(douDianSignVO, appConfig.key, shopConfig.session_key, JSON.toJSONString(decryptData), + timestamp); + // 生成签名 + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appConfig.secret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil.buildRequestString(convertUtil.object2Map(douDianSignVO)); + // 密文字段包含各种乱七八糟的字符,需要转义 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20").replaceAll("#", "%23") + .replaceAll("/", "%2F").replaceAll("\\+", "%2B"); + String douOrderDetialString = new HttpRequest().sendGet(platConfig.api_url + "/order/batchSensitive", + douDianSignVORequestString, "测试logTitle"); + logger.info("[ {} ] | [ {} ]返回订单:订单数据解密返回:[ {} ]", shopConfig.code, shopConfig.name, douOrderDetialString); + + ddEncryptBO = parseDecryptData(douOrderDetialString, ddEncryptBO); + return ddEncryptBO; + } + + /** + * @Description: 解析密文返回的报文 + * @Title: parseDecryptData + * @author Lewis + * @param douOrderDetialString + * @param ddEncryptBO + * @return + * @throws Exception + */ + public DdEncryptBO parseDecryptData(String douOrderDetialString, DdEncryptBO ddEncryptBO) throws Exception { + com.alibaba.fastjson.JSONObject json = JSON.parseObject(douOrderDetialString); + int errCode = json.getInteger("err_no"); + if (errCode != 0) { + throw new RuntimeException("解密失败"); + } + com.alibaba.fastjson.JSONObject data = json.getJSONObject("data"); + com.alibaba.fastjson.JSONArray decryptInfos = data.getJSONArray("decrypt_infos"); + for (int i = 0; i < decryptInfos.size(); i++) { + com.alibaba.fastjson.JSONObject decryptInfo = decryptInfos.getJSONObject(i); + int errCodeEveryData = decryptInfo.getInteger("err_no"); + if (errCodeEveryData != 0) { + throw new RuntimeException("子条目解密失败"); + } +// String authId = decryptInfo.getString("auth_id"); + String cipherText = decryptInfo.containsKey("cipher_text") ? decryptInfo.getString("cipher_text") : ""; + String decryptText = decryptInfo.getString("decrypt_text"); + if (cipherText.equals(ddEncryptBO.getEncryptDetail())) { + ddEncryptBO.setDetail(decryptText); + continue; + } + if (cipherText.equals(ddEncryptBO.getEncryptPostReceiver())) { + ddEncryptBO.setPostReceiver(decryptText); + continue; + } + if (cipherText.equals(ddEncryptBO.getEncryptPostTel())) { + ddEncryptBO.setPostTel(decryptText); + continue; + } + } + return ddEncryptBO; + } + + /** + * @Description: 封装解密的业务入参 + * @Title: decryptData + * @author Lewis + * @param ddEncryptBO + */ + public CipherInfos decryptData(DdEncryptBO ddEncryptBO) { + CipherInfos cipherInfos = new CipherInfos(); + // 抖店总有三个加密字段 + List list = new ArrayList(); + // 详细地址 + if (null != ddEncryptBO.getEncryptDetail()) { + CipherInfo cipherInfoDetail = new CipherInfo(); + cipherInfoDetail.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoDetail.setCipher_text(ddEncryptBO.getEncryptDetail()); + list.add(cipherInfoDetail); + } + + // 电话 + if (null != ddEncryptBO.getEncryptPostTel()) { + CipherInfo cipherInfoMobile = new CipherInfo(); + cipherInfoMobile.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoMobile.setCipher_text(ddEncryptBO.getEncryptPostTel()); + list.add(cipherInfoMobile); + } + // 姓名 + if (null != ddEncryptBO.getEncryptPostReceiver()) { + CipherInfo cipherInfoName = new CipherInfo(); + cipherInfoName.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoName.setCipher_text(ddEncryptBO.getEncryptPostReceiver()); + list.add(cipherInfoName); + } + + list.sort(Comparator.comparing(CipherInfo::getCipher_text)); + cipherInfos.setCipher_infos(list); + return cipherInfos; + } + + // 按时间段补抓取订单 + public class GetOrderThreadByTime extends Thread { + private OrderSyncs.AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int page_count = 0;// 条数 + private int page_now = 0;// 当前页 + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThreadByTime(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.shopConfig = shopConfig; + this.appConfig = appConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String appKey = appConfig.key; + String appSecret = appConfig.secret; + String sessionKey = shopConfig.session_key; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + DouDianOrderListQueryVO douDianOrderListQueryVO = new DouDianOrderListQueryVO(); + douDianOrderListQueryVO.setPage(page_now); + douDianOrderListQueryVO.setSize(page_rows); + douDianOrderListQueryVO.setCreate_time_start((sdf.parse(timeStart).getTime()) / 1000); + douDianOrderListQueryVO.setCreate_time_end((sdf.parse(timeEnd).getTime()) / 1000); + + String douDianOrderListQueryVOStrJson = douDianOrderListQueryVO.toJsonString(); + Map douDianOrderListQueryMap = douDianSignUtil + .jsonToMap(douDianOrderListQueryVOStrJson); + String douDianOrderListQueryString = douDianSignUtil.sortParams(douDianOrderListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("order.searchList"); + setCommonConfig(douDianSignVO, appKey, sessionKey, douDianOrderListQueryString, timestamp); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); + + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String orderListString = new HttpRequest().sendGet(platConfig.api_url + "/order/searchList", + douDianSignVORequestString, "测试logTitle"); + + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, page_now); + logger.info("[ {} ]根据订单生成时间抓取订单:{}", shopConfig.code, orderListString); + JSONObject json = new JSONObject(orderListString); + if (!json.has("data")) { + logger.info("[ {} ]异常订单返回结果:{}", shopConfig.code, orderListString); + int errorCode = json.getInt("err_no"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if (30002 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + "店铺授权access_token已过期,请重新授权后重试", ""); + } else if (30005 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + "店铺授权access_token不存在,请使用最新的access_token访问", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "抖店平台故障,请联系软维ERP排查", ""); + } + } + return; + } + // 解析时间段内的订单 + this.parseOrderList(orderListString); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void parseOrderList(String orderListString) { + try { + org.json.JSONObject responJson = new org.json.JSONObject(orderListString); + if (!responJson.has("data")) { + logger.info("[ {} ]异常订单返回结果:{}", recatchConfig.shop_code, responJson); + int errorCode = responJson.getInt("err_no"); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if (30002 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + "店铺授权access_token已过期,请重新授权后重试", ""); + } else if (30005 == errorCode) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, + "店铺授权access_token不存在,请使用最新的access_token访问", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "抖店平台故障,请联系软维ERP排查", ""); + } + } + return; + } + + JSONObject data = responJson.getJSONObject("data"); + int total = data.getInt("total"); + if (total < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (total > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将本次补抓获取到的订单放入数据处理队列 + JSONArray shop_order_list = data.getJSONArray("shop_order_list"); + this.page_count = (int) Math.ceil((double) total / page_rows);// 计算分页总数 + for (int i = 0; i < shop_order_list.length(); i++) { + JSONObject shopOrder = shop_order_list.getJSONObject(i); + String orderId = shopOrder.getString("order_id"); + TradeInfo tradeInfo = parseTradeInfo(appConfig, shopOrder, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + // 根据店铺设置匹配发货的快递 + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int j = 0; j < delivery_area_setting_list.size(); j++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(j); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无未发货的子订单", ""); + } + continue; + } + if ("2".equals(tradeInfo.status)) { + logger.info("[ {} ]补抓单未发货订单信息:{}", shopConfig.code, JSON.toJSONString(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + + } + if ("1".equals(tradeInfo.status) && "2".equals(tradeInfo.type)) { + OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 发送tradeInfo至预售订单处理队列 + logger.info("[ {} ]补抓单预售订单信息:{}", shopConfig.code, JSON.toJSONString(tradeInfo)); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "抖店平台故障,请联系软维ERP排查", ""); + } + } + } + } + + // 获取售后订单 + class GetRefundThread extends Thread { + public OrderSyncs.AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 0;// 条数 + private int pageNow = 0;// 当前页 + private int pageRows = 100;// 每次订单列表获取的单页条数50-100 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + + GlobalConfig.initAppKey(appConfig.key); + GlobalConfig.initAppSecret(appConfig.secret); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + AfterSaleListRequest request = new AfterSaleListRequest(); + AfterSaleListParam param = request.getParam(); + // 退货物流状态,枚举为1(全部),2(已发货),3(未发货) + param.setLogisticsStatus(1L); + param.setPage(Long.valueOf(pageNow)); + param.setSize(Long.valueOf(pageRows)); + param.setStartTime(sdf.parse(timeStart).getTime() / 1000); + param.setEndTime(sdf.parse(timeEnd).getTime() / 1000); + ArrayList orderList = new ArrayList(); + orderList.add("update_time"); + param.setOrderBy(orderList); + AccessToken token = AccessTokenBuilder.parse(shopConfig.session_key); + AfterSaleListResponse response = request.execute(token); + + /* + * DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); ConvertUtil + * convertUtil = new ConvertUtil(); + * + * String appKey = appConfig.key; String appSecret = appConfig.secret; String + * sessionKey = shopConfig.session_key; SimpleDateFormat sdf = new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String timestamp = sdf.format(new + * Date()); + * + * RefundVO refundVO = new RefundVO(); refundVO.setStatus(1); + * refundVO.setType(5); refundVO.setLogistics_status(3); + * refundVO.setPage(pageNow); refundVO.setSize(pageRows); + * refundVO.setStart_time(timeStart); refundVO.setEnd_time(timeEnd); + * refundVO.setOrder_by("update_time"); + * + * String s = refundVO.toJsonString(); + * + * Map douDianRefundListQueryMap = douDianSignUtil.jsonToMap(s); + * String douRefundAreaList = + * douDianSignUtil.sortParams(douDianRefundListQueryMap); + * + * DouDianSignVO douDianSignVO = new DouDianSignVO(); + * douDianSignVO.setMethod("trade.refundListSearch"); + * setCommonConfig(douDianSignVO, appKey, sessionKey, douRefundAreaList, + * timestamp); + * + * Map douDianSignMap = new + * ConvertUtil().object2Map(douDianSignVO); String buildSignString = + * douDianSignUtil.buildSignString(appSecret, douDianSignMap); + * + * String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + * douDianSignVO.setSign(md5Sign); String douDianSignVORequestString = + * douDianSignUtil .buildRequestString(convertUtil.object2Map(douDianSignVO)); + * + * douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", + * "%20"); String refundList = new HttpRequest().sendGet(platConfig.api_url + + * "/trade/refundListSearch", douDianSignVORequestString, + * ApiDouDian.class.getName()); + */ + + // 售后单列表 + logger.info("[ {} ]售后单列表:{}", shopConfig.code, response.toString()); + // 解析时间段内的订单 + this.parseRefundList(response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void parseRefundList(AfterSaleListResponse response) { + try { + Long errNo = response.getErrNo(); + if (errNo != 0) { + logger.info("异常订单返回结果:{}", response.toString()); + // 30002:授权过期,30005:token不存在 + if (30002 == errNo || 30005 == errNo) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } +// if (7 == errNo) { +// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 +// Date date = df.parse(shopConfig.lastCatchTime); +// date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 +// shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); +// shopConfig.refundErrFlag = false; +// } + shopConfig.refundErrFlag = false; + return; + + } + + AfterSaleListData data = response.getData(); + Long totalResults = data.getTotal(); + + // 判断订单数是否小于 + if (totalResults < 1) { + shopConfig.refundErrFlag = false; + return; + } + + // 将本次获取到的售后单数据处理队列 + List aftersaleList = data.getItems(); + for (int i = 0; i < aftersaleList.size(); i++) { + ItemsItem saleOrder = aftersaleList.get(i); + AftersaleInfo aftersaleInfo = saleOrder.getAftersaleInfo(); + /* + * 售后类型,枚举为0(退货退款),1(已发货仅退款),2(未发货仅退款),3(换货), 6(价保) + */ + int aftersaleType = aftersaleInfo.getAftersaleType().intValue(); + /* + * 售后状态,枚举为2(发货前退款待处理),3(发货后仅退款待处理),4(退货待处理),5(换货待处理),6(同意退款,退款失败),7(同意退款,退款成功), + * 8(待商家处理),9(待商家收货),10(同意退款,退款中),11(仲裁中),12(售后关闭),13(待买家退货),14(等待用户收货),15(换货成功) + * ,16(拒绝售后),17(退货后拒绝退款),18(待商家上传凭证),19(仲裁中-待商家举证),20(仲裁中-待商家举证或协商期) + * + * + * TODO 售后状态新增 aftersaleStatus==12,2021-12-14 由于抖店商家后台开启了自动退款,王总要求加入,在erp登记售后 + */ + int aftersaleStatus = aftersaleInfo.getAftersaleStatus().intValue(); + if ((aftersaleType == 0 || aftersaleType == 1 || aftersaleType == 2) + && (aftersaleStatus == 6 || aftersaleStatus == 7 || aftersaleStatus == 12)) { + RefundInfo refundInfo = new RefundInfo(); + TextPart textPart = saleOrder.getTextPart(); + refundInfo.desc = refundInfo.reason = textPart.getReasonText() != null + ? textPart.getReasonText() + : ""; + refundInfo.refund_fee = aftersaleInfo.getRefundAmount() / 100.0; + switch (aftersaleType) { + case 0: + refundInfo.bill_type = 2; + break; + case 1: + case 2: + refundInfo.bill_type = 1; + break; + default: + break; + } + com.doudian.open.api.afterSale_List.data.OrderInfo orderInfo = saleOrder.getOrderInfo(); + refundInfo.after_sales_status = 2; + refundInfo.company_code = shopConfig.company_code; + refundInfo.tid = orderInfo.getShopOrderId(); + refundInfo.refund_id = aftersaleInfo.getAftersaleId(); + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.platform_code = shopConfig.platformCode; + logger.info("[ {} ]售后单{}", shopConfig.code, refundInfo.toJsonString()); + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("[ {} ]退款消息订单|[ {} ]处理订单异常", shopConfig.code, refundInfo.tid); + } + logger.info("[ {} ]退款消息订单|[ {} ]成功", shopConfig.code, refundInfo.tid); + } + } + this.pageCount = (int) Math.ceil((double) totalResults / pageRows);// 计算分页总数 + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + private void dealUpdateToken() { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + // 抖音店铺的授权只有在过期前一个小时内刷新才会刷到新的token和refresh_token,在过期前一个小时外刷新,只会获取到老的token和refresh_token + if (expires_time_sdf - now_time_sdf <= 1 * 60 * 60 * 1000) { + String shopCode = um.shop_code; + String shopName = um.shop_name; + String refreshToken = um.refresh_token; + try { + String url = "https://openapi-fxg.jinritemai.com/token/refresh"; + Map updateParamsMap = new HashMap(); + updateParamsMap.put("grant_type", "refresh_token"); + updateParamsMap.put("refresh_token", um.refresh_token); + String updateParamsString = douDianSignUtil.sortParams(updateParamsMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("token.refresh"); + setCommonConfig(douDianSignVO, um.app_key, null, updateParamsString, sdf.format(new Date())); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(um.app_secret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(new ConvertUtil().object2Map(douDianSignVO)); + + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String result = new HttpRequest().sendGet(url, douDianSignVORequestString, ""); + JSONObject json = new JSONObject(result); + if (json.has("data")) { + JSONObject data = json.getJSONObject("data"); + String access = data.getString("access_token"); + refreshToken = data.getString("refresh_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = data.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 1 * 60 * 60) {// 如果授权码的时效不足1个小时,即购买在两小时内到期,不做更新 + updateNewToken(shopName, shopCode, access, refreshToken, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新码到期,放弃刷新", shopCode, shopName); + } + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shopCode, shopName, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shopCode, shopName); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("刷新令牌异常,将在5分钟后重试!"); + } + } + + private void updateNewToken(String shopName, String shopCode, String access, String refreshToken, long expiresIn, + long nowTimeSdf) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopCode.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + + String expiresInSdf = sdf.format(new Date(expiresIn * 1000 + nowTimeSdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresInSdf + + "',refresh_token='" + refreshToken + "' where code = '" + shopCode + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shopCode, shopName); + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌成功,已写入数据库!", shopCode, shopName); + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺[ {} ] 刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shopName, shopCode, access, refreshToken, expiresIn, nowTimeSdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } +} diff --git a/src/com/since/emp/service/ApiMiHeMall.java b/src/com/since/emp/service/ApiMiHeMall.java new file mode 100644 index 0000000..c415639 --- /dev/null +++ b/src/com/since/emp/service/ApiMiHeMall.java @@ -0,0 +1,810 @@ +package com.since.emp.service; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.GsonBuilder; +import com.since.emp.base.DbPoolConnection_MiHe; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.Base64Util; + +/** + * + * @className:ApiMiHeMall + * @description:米合商城Api接口类 + * @author:Sunshine + * @date:2019年4月1日 下午3:31:07 + */ +public class ApiMiHeMall { + private static final Logger logger = LogManager.getLogger(ApiMiHeMall.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiMiHeMall(PlatConfig platConfig, RecatchConfig recatchConfig) { + + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(recatchOrderThread); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ]根据订单号抓取订单,订单号:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS);// TODO + // 正式环境改为5分钟一次 + + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年4月1日 下午6:11:02 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + try { + platConfig = OrderSyncs.getAppMessage(platConfig); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * + * @className:GetOrderThread + * @description:定时抓取订单 + * @author:Sunshine + * @date:2019年4月1日 下午3:56:02 + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + public void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 定时获取订单:{}->{}", shopConfig.code, shopConfig.name, time_start, time_end); + + if (shopConfig.name == null) { + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + Map tradeInfoMap = getTradeInfo(time_start, time_end, shopConfig, 1, null); + if (tradeInfoMap != null) { + int total_count = tradeInfoMap.size(); + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},本次获取到订单数:[ {} ]", shopConfig.code, shopConfig.name, + time_start, time_end, total_count); + if (total_count < 0) { + shopConfig.errFlag = false; + return; + } + for (Entry tradeInfo_str : tradeInfoMap.entrySet()) { + TradeInfo tradeInfo = tradeInfo_str.getValue(); + logger.info("[ {} ] | [ {} ] 抓取到的订单信息:{}", shopConfig.code, shopConfig.name, + new GsonBuilder().disableHtmlEscaping().create().toJson(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } else { + logger.info("抓取订单异常,请检查!"); + } + } + + } catch (Exception e) { + logger.error(e); + } + } + + } + + /** + * + * @className:RecatchOrderThread + * @description:根据下单时间补抓订单 + * @author:Sunshine + * @date:2019年4月2日 上午10:30:07 + */ + class RecatchOrderThread extends Thread { + + private ShopConfig shopConfig; + private String time_start, time_end; + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + public void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据下单时间补抓订单:{}->{}", shopConfig.code, shopConfig.name, time_start, + time_end); + if (shopConfig.name == null) { + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + Map tradeInfoMap = getTradeInfo(time_start, time_end, shopConfig, 2, null); + int total_count = tradeInfoMap.size(); + // 未查询到未发货订单 + if (total_count < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + // 查询订单数量超过平台限制 + if (total_count > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},本次获取到订单数:[ {} ]", total_count, shopConfig.code, + shopConfig.name, time_start, time_end, total_count); + for (Entry tradeInfo_str : tradeInfoMap.entrySet()) { + TradeInfo tradeInfo = tradeInfo_str.getValue(); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + /** + * + * @title: getOrderByOrderId + * @description: 根据订单号补抓订单 + * @param shopOrderInfo + * @return + */ + private boolean getOrderByOrderId(ShopOrderInfo shopOrderInfo) { + try { + Map tradeInfo_Map = getTradeInfo(null, null, shopOrderInfo.shopConfig, 3, + shopOrderInfo.tid); + if (tradeInfo_Map != null) { + + int total_count = tradeInfo_Map.size(); + + // 未查询到订单 + if (total_count == 0) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "无此订单号,请核对后重新提交!"; + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + return false; + } + } + if (total_count > 0) { + for (Entry tradeInfo_str : tradeInfo_Map.entrySet()) { + TradeInfo tradeInfo = tradeInfo_str.getValue(); + logger.info("[ {} ] | [ {} ] 根据订单号补抓订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, new GsonBuilder().disableHtmlEscaping().create().toJson(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return true; + } + } + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + /** + * + * @title: getTradeInfo + * @description: 获取订单详情 + * @param time_start + * @param time_end + * @param shopConfig + * @param get_order_flag 1:定时抓取订单 2:根据时间段补抓订单 3:根据订单号获取订单 + * @return + */ + public Map getTradeInfo(String time_start, String time_end, ShopConfig shopConfig, + int get_order_flag, String pay_order_code) { + DbPoolConnection_MiHe dbpc = null; + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + try { + dbpc = DbPoolConnection_MiHe.getInstance(); + conn = dbpc.getConnection(); + logger.info("[ {} ] | [ {} ] 开始抓取订单!时间->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + Map tradeInfo_Map = new HashMap(); + // 先查询订单表 + if (get_order_flag == 1) { + String get_sale_order_sql = "SELECT tor.`code` AS order_code, tor.is_qrt, tor.shop_code, tor.qrt_code, tor.pay_no , tor.pay_order_code, tor.platform_code, tor.quantity, tor.create_time, " + + "tor.delivery_fee , tor.discount, tor.buyer_name, tor.buyer_address, tor.buyer_country_city, tor.buyer_telephone , tor.leave_message, tor.pay_time, tor.money, tor.pay_money, " + + "tor.invoice_remarks , tor.invoice_status, tor.`status`, tor.taxation, tor.country, tor.province , tor.city, tor.county, tu.wechat_nick FROM tb_order tor LEFT JOIN tb_user tu " + + "ON tor.user_code = tu.`code` WHERE tor.pay_time >= ? AND tor.pay_time <= ? AND tor.pay_time IS NOT NULL AND tor.`status` = 5 AND tor.is_qrt = 2 AND tor.shop_code = ? UNION " + + "SELECT tor.`code` AS order_code, tor.is_qrt, tor.shop_code, tor.qrt_code, tor.pay_no , tor.pay_order_code, tor.platform_code, tor.quantity, tor.create_time, tor.delivery_fee , " + + "tor.discount, tor.buyer_name, tor.buyer_address, tor.buyer_country_city, tor.buyer_telephone , tor.leave_message, tor.pay_time, tor.money, tor.pay_money, tor.invoice_remarks , " + + "tor.invoice_status, tor.`status`, tor.taxation, tor.country, tor.province , tor.city, tor.county, tu.wechat_nick FROM tb_order tor LEFT JOIN tb_user tu ON tor.user_code = tu.`code` " + + "LEFT JOIN tb_qrt_goods tqg ON tor.qrt_code = tqg.`code` WHERE tqg.completion_time IS NOT NULL AND tor.`status` = 5 AND tor.is_qrt = 1 AND tor.pay_time IS NOT NULL AND tor.pay_time >= " + + "tqg.begin_time AND tor.pay_time <= DATE_ADD(tqg.end_time, INTERVAL 45 MINUTE) AND tor.shop_code = ? AND tqg.amount_clouds <= tqg.sales AND GREATEST(tor.pay_time, tqg.completion_time) >= ? " + + "AND GREATEST(tor.pay_time, tqg.completion_time) <= ?"; + ps = conn.prepareStatement(get_sale_order_sql); + ps.setString(1, time_start);// 根据时间查订单 + ps.setString(2, time_end); + ps.setString(3, shopConfig.name); + ps.setString(4, shopConfig.name); + ps.setString(5, time_start);// 根据时间查订单 + ps.setString(6, time_end); + } else if (get_order_flag == 2) { + String get_sale_order_sql = "SELECT tor.`code` AS order_code, tor.is_qrt, tor.shop_code, tor.qrt_code, tor.pay_no , tor.pay_order_code, tor.platform_code, tor.quantity, tor.create_time, tor.delivery_fee , " + + "tor.discount, tor.buyer_name, tor.buyer_address, tor.buyer_country_city, tor.buyer_telephone , tor.leave_message, tor.pay_time, tor.money, tor.pay_money, tor.invoice_remarks , tor.invoice_status, " + + "tor.`status`, tor.taxation, tor.country, tor.province , tor.city, tor.county, tu.wechat_nick FROM tb_order tor LEFT JOIN tb_user tu ON tor.user_code = tu.`code` WHERE tor.create_time >= ? AND " + + "tor.create_time <= ? AND tor.pay_time IS NOT NULL AND tor.`status` = 5 AND tor.is_qrt = 2 AND tor.shop_code = ? UNION SELECT tor.`code` AS order_code, tor.is_qrt, tor.shop_code, tor.qrt_code, " + + "tor.pay_no , tor.pay_order_code, tor.platform_code, tor.quantity, tor.create_time, tor.delivery_fee , tor.discount, tor.buyer_name, tor.buyer_address, tor.buyer_country_city, tor.buyer_telephone , " + + "tor.leave_message, tor.pay_time, tor.money, tor.pay_money, tor.invoice_remarks , tor.invoice_status, tor.`status`, tor.taxation, tor.country, tor.province , tor.city, tor.county, tu.wechat_nick " + + "FROM tb_order tor LEFT JOIN tb_user tu ON tor.user_code = tu.`code` LEFT JOIN tb_qrt_goods tqg ON tor.qrt_code = tqg.`code` WHERE tqg.completion_time IS NOT NULL AND tor.`status` = 5 AND tor.is_qrt = 1 " + + "AND tor.pay_time IS NOT NULL AND tor.pay_time >= tqg.begin_time AND tor.pay_time <= DATE_ADD(tqg.end_time, INTERVAL 45 MINUTE) AND tor.shop_code = ? AND tqg.amount_clouds <= tqg.sales AND tor.create_time >= ? " + + "AND tor.create_time <= ?"; + ps = conn.prepareStatement(get_sale_order_sql); + ps.setString(1, time_start);// 根据时间查订单 + ps.setString(2, time_end); + ps.setString(3, shopConfig.name); + ps.setString(4, shopConfig.name); + ps.setString(5, time_start);// 根据时间查订单 + ps.setString(6, time_end); + } else if (get_order_flag == 3 && !"".equals(pay_order_code)) { + String get_sale_order_sql = "SELECT tor.`code` AS order_code, tor.is_qrt, tor.shop_code, tor.qrt_code, tqg.completion_time , tqg.end_time, tor.pay_no, tor.pay_order_code, tor.platform_code, tor.quantity , " + + "tor.create_time, tor.delivery_fee, tor.discount, tor.buyer_name, tor.buyer_address , tor.buyer_country_city, tor.buyer_telephone, tor.leave_message, tor.pay_time, tor.money , tor.pay_money, " + + "tor.invoice_remarks, tor.invoice_status, tor.`status`, tor.taxation , tor.country, tor.province, tor.city, tor.county, tu.wechat_nick FROM tb_order tor LEFT JOIN tb_user tu ON tor.user_code = " + + "tu.`code` LEFT JOIN tb_qrt_goods tqg ON tor.qrt_code = tqg.`code` WHERE (tor.pay_time IS NOT NULL AND tor.user_code = tu.`code` AND tor.`status` = 5 AND tor.is_qrt = 2 AND tor.shop_code = ? " + + "AND tor.`code` = ?) OR (tor.pay_time IS NOT NULL AND tor.user_code = tu.`code` AND tor.`status` = 5 AND tor.is_qrt = 1 AND shop_code = ? AND tor.`code` = ? AND tqg.completion_time IS NOT NULL " + + "AND tor.pay_time <= DATE_ADD(tqg.end_time, INTERVAL 45 MINUTE))"; + ps = conn.prepareStatement(get_sale_order_sql); + ps.setString(1, shopConfig.name);// 根据订单号补抓订单 + ps.setString(2, pay_order_code);// 根据订单号补抓订单 + ps.setString(3, shopConfig.name);// 根据订单号补抓订单 + ps.setString(4, pay_order_code);// 根据订单号补抓订单 + } + rs = ps.executeQuery(); + while (rs.next()) { + TradeInfo tradeInfo = new TradeInfo(); + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + tradeInfo.tid = rs.getString("order_code");// 订单编码(ID) + tradeInfo.num = rs.getInt("quantity");// 订单商品总数量 + tradeInfo.receiver_name = rs.getString("buyer_name");// 收件人姓名 + tradeInfo.status = rs.getString("status");// 订单状态 + tradeInfo.money = rs.getString("money");// 订单总金额 + tradeInfo.pay_money = rs.getString("pay_money");// 付款金额 + tradeInfo.pay_time = rs.getString("pay_time");// 付款时间 + tradeInfo.created = rs.getString("create_time");// 创建时间 + tradeInfo.buyer_nick = Base64Util + .decode(rs.getString("wechat_nick") == null ? "" : rs.getString("wechat_nick"));// 收件人昵称 + tradeInfo.receiver_phone = rs.getString("buyer_telephone");// 收件人电话 + tradeInfo.receiver_mobile = rs.getString("buyer_telephone");// 收件人电话 + tradeInfo.alipay_id = rs.getString("pay_order_code"); + tradeInfo.alipay_no = rs.getString("pay_no"); + // 收件人地址处理 + /*****************************/ + tradeInfo.discount_fee = String.valueOf(rs.getDouble("discount")); + tradeInfo.invoice_type = 0;// 发票类型 + tradeInfo.buyer_message = ""; + tradeInfo.adjust_fee = "0"; + tradeInfo.product_fee = tradeInfo.money; + tradeInfo.receiver_zip = ""; + tradeInfo.seller_memo = ""; + tradeInfo.post_fee = "0"; + /*****************************/ + tradeInfo.receiver_country = rs.getString("country");// 国家 + tradeInfo.receiver_state = rs.getString("province");// 省 + tradeInfo.receiver_city = rs.getString("city");// 市 + tradeInfo.receiver_district = rs.getString("county");// 区 + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.receiver_state = tradeInfo.receiver_state.replaceAll("市", ""); + } + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + // 查询订单详情 + tradeInfo.receiver_address = rs.getString("buyer_address");// 收货地址 + tradeInfo.orders = getOrderItemsByOrderId(tradeInfo.tid); + if (tradeInfo.orders == null) {// TODO 异常订单处理 + continue; + } + tradeInfo_Map.put(tradeInfo.tid, tradeInfo); + } + logger.info("[ {} ] | [ {} ] 抓取到的订单信息:{}", shopConfig.code, shopConfig.name, + new GsonBuilder().disableHtmlEscaping().create().toJson(tradeInfo_Map)); + return tradeInfo_Map; + } catch (Exception e) { + logger.error(this, e); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return null; + + } + + /** + * + * @title: getOrderItemsByOrderId + * @description: 根据订单号获取订单详情 + * @param pay_order_code + * @throws Exception + */ + public OrderInfo[] getOrderItemsByOrderId(String pay_order_code) { + DbPoolConnection_MiHe dbpc = null; + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + dbpc = DbPoolConnection_MiHe.getInstance(); + conn = dbpc.getConnection(); + String get_sale_order_items = "select platform_seller_code,sku_code,goods_code,quantity,unit_price,money,pay_money,goods_title,discount " + + "from tb_order_items where order_code=?"; + ps = conn.prepareStatement(get_sale_order_items); + ps.setString(1, pay_order_code);// 根据时间查订单 + rs = ps.executeQuery(); + OrderInfo[] orders = {}; + while (rs.next()) { + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = rs.getString("platform_seller_code");// 平台商家编码 + orderInfo.num = rs.getInt("quantity"); + orderInfo.price = rs.getString("unit_price"); + orderInfo.payment = rs.getString("pay_money"); + orderInfo.commodity_code = rs.getString("goods_code"); + orderInfo.title = rs.getString("goods_title"); + /*****************************/ + orderInfo.sku_id = rs.getString("sku_code"); + orderInfo.discount_fee = String.valueOf(rs.getDouble("discount")); + orderInfo.divide_order_fee = "0"; + orderInfo.total_fee = orderInfo.payment; + orderInfo.adjust_fee = "0"; + orderInfo.productItemID_dd = ""; + orderInfo.part_mjz_discount = "0"; + /*****************************/ + orders = Arrays.copyOf(orders, orders.length + 1); + orders[orders.length - 1] = orderInfo; + } + if (orders.length <= 0) { + logger.info("获取订单详情错误,该订单没有商品详细信息,请核查订单信息,订单号:" + pay_order_code); + return null; + } + return orders; + } catch (Exception e) { + logger.error(this, e); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return null; + } + + /** + * + * @className:GetRefundThread + * @description:售后处理线程 + * @author:Sunshine + * @date:2019年4月9日 下午4:07:43 + */ + class GetRefundThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + public void getRefundOrder() { + + try { + Map allRefundOrder = getAllRefundOrder(time_start, time_end, shopConfig); + if (allRefundOrder != null) { + int totalCount = allRefundOrder.size(); + logger.info("[ {} ] | [ {} ] 抓取退款订单:{}->{} 本次抓取退款单总条数:[ {} ]", shopConfig.code, shopConfig.name, + time_start, time_end, totalCount); + + if (totalCount <= 0) { + logger.info("[ {} ] | [ {} ] 未抓取需退款的订单!", shopConfig.code, shopConfig.name); + return; + } + + if (totalCount > 0) { + for (Entry refundInfo_str : allRefundOrder.entrySet()) { + RefundInfo refundInfo = refundInfo_str.getValue(); + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, + // refundInfo.tid); + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + } + + shopConfig.lastQueryRefundTime = time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + } + + /** + * + * @param time_end + * @param time_start + * @title: getAllRefundOrder + * @description: 获取退款订单 + * @param shopConfig + * @return + */ + private Map getAllRefundOrder(String time_start, String time_end, ShopConfig shopConfig) { + + DbPoolConnection_MiHe dbpc = null; + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + Map refund_order_map = new HashMap<>(); + dbpc = DbPoolConnection_MiHe.getInstance(); + conn = dbpc.getConnection(); + String get_refundorder_sql = "SELECT taso.order_code, taso.`code` AS after_sale_order_code, taso.`status` AS after_sale_order_status, taso.after_sale_reason, " + + "tor.logistics_number FROM tb_after_sale_order taso, tb_order tor WHERE taso.order_code = tor.`code` AND tor.shop_code = ? AND taso.create_time >= ? " + + "AND taso.create_time <= ?"; + ps = conn.prepareStatement(get_refundorder_sql); + ps.setString(1, shopConfig.name); + ps.setString(2, time_start); + ps.setString(3, time_end); + rs = ps.executeQuery(); + while (rs.next()) { + RefundInfo refundInfo = new RefundInfo(); + refundInfo.tid = rs.getString("order_code");// 销售单编码 + refundInfo.refund_id = rs.getString("after_sale_order_code");// 退款单编码 + refundInfo.after_sales_status = rs.getInt("after_sale_order_status");// 售后类型 + // 转换退款状态 状态(1:待审 2:同意3:拒绝4:已退) + // 退款类型:可用值为:1:退款2:退货3:换货 + // int bill_type = rs.getInt("status");// 售后状态 + // if (1 == bill_type) { + // refundInfo.bill_type = 2; + // } else if (2 == bill_type) { + // refundInfo.bill_type = 1; + // } else if (4 == bill_type) { + // refundInfo.bill_type = 1; + // } + refundInfo.bill_type = 1;// 售后类型 + refundInfo.company_code = shopConfig.company_code;// 企业编码 + refundInfo.company_type = shopConfig.company_type;// 企业类型 + refundInfo.shop_code = shopConfig.code;// 店铺编码 + refundInfo.desc = rs.getString("after_sale_reason");// 售后原因 + refundInfo.return_delivery_code = rs.getString("logistics_number");// 退货的快递单号 + refundInfo.platform_code = shopConfig.platformCode; + refund_order_map.put(refundInfo.tid, refundInfo); + + } + logger.info("[ {} ] | [ {} ] 获取到退款订单:{}", shopConfig.code, shopConfig.name, + new GsonBuilder().disableHtmlEscaping().create().toJson(refund_order_map)); + return refund_order_map; + + } catch (Exception e) { + logger.error(this, e); + } finally { + + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return null; + } + +} diff --git a/src/com/since/emp/service/ApiMia.java b/src/com/since/emp/service/ApiMia.java new file mode 100644 index 0000000..e4c4140 --- /dev/null +++ b/src/com/since/emp/service/ApiMia.java @@ -0,0 +1,1019 @@ +package com.since.emp.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONException; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.jd.open.api.sdk.JdException; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.HttpRequestCode; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.mia.MiaAftersaleRequestParams; +import com.since.emp.base.mia.MiaCommonRequestParams; +import com.since.emp.base.mia.MiaOrdersRequestParams; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.MD5Util; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +public class ApiMia { + private static final Logger logger = LogManager.getLogger(ApiMia.class); + private PlatConfig platConfig;// 平台参数类 + private RecatchConfig recatchConfig;// 平台补抓单参数类 + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /* + * public class ShopOrderInfo { String tid; ShopConfig shopConfig; String + * app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, + * String app_secret) { this.tid = tid; this.shopConfig = shopConfig; + * this.app_key = app_key; this.app_secret = app_secret; } } + */ + + public ApiMia(PlatConfig platConfig, RecatchConfig recatchConfig) { + + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + // 启动订单详情获取队列 + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + ordersByTime(platConfig.apps.get(0).shops.get(0)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,API返回订单数据:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + // logger.info("["+logTitle+"]app:"+app_key+"启动,抓取店铺:"+shops.get(0).name); + + } else { + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // OrdersTimerTask ott = new OrdersTimerTask(cachedThreadPool); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 抓取所有为待发货的订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void ordersByTime(ShopConfig shopConfig) { + // 启动抓单线程 + RecatchOrderThread thread1 = new RecatchOrderThread(shopConfig, recatchConfig.starTime, recatchConfig.endTime); + // thread1.start(); + threadPool.execute(thread1); + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author jue + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + // private ExecutorService cachedThreadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(shopConfig, shopConfig.lastCatchTime, + df.format(now.getTime() - 30 * 60 * 1000)); + threadPool.execute(thread); + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == -1) {// TODO 设置为-1表示api暂不启动自动登记售后的功能 + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } + } + } + + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 根据订单创建时间抓取 + * + * @author Carl + * + */ + class GetOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数 微盟api:1-50 + + public GetOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单(蜜芽平台的订单最快只能在下单时间30分钟后获取到):{}->{},第[ {} ]页", shopConfig.code, + shopConfig.name, time_start, time_end, page_now); + // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + MiaCommonRequestParams miaCommonRequestParams = new MiaCommonRequestParams(); + miaCommonRequestParams.method = "mia.orders.search"; + miaCommonRequestParams.vendor_key = shopConfig.name; + miaCommonRequestParams.timestamp = System.currentTimeMillis() / 1000 + ""; + miaCommonRequestParams.format = "json"; + miaCommonRequestParams.version = "1.0"; + MiaOrdersRequestParams miaOrdersRequestParams = new MiaOrdersRequestParams(); + miaOrdersRequestParams.start_date = time_start; + miaOrdersRequestParams.end_date = time_end; + miaOrdersRequestParams.order_state = "2"; + miaOrdersRequestParams.page = page_now + ""; + miaOrdersRequestParams.page_size = page_rows + ""; + miaOrdersRequestParams.optional_field = "";// 不传值但是要传参,表示取所有的字段 + miaOrdersRequestParams.date_sort = "1"; + miaOrdersRequestParams.date_type = "0"; + String signParams = "date_sort" + miaOrdersRequestParams.date_sort + "date_type" + + miaOrdersRequestParams.date_type + "end_date" + miaOrdersRequestParams.end_date + "format" + + miaCommonRequestParams.format + "method" + miaCommonRequestParams.method + "optional_field" + + miaOrdersRequestParams.optional_field + "order_state" + miaOrdersRequestParams.order_state + + "page" + miaOrdersRequestParams.page + "page_size" + miaOrdersRequestParams.page_size + + "start_date" + miaOrdersRequestParams.start_date + "timestamp" + + miaCommonRequestParams.timestamp + "vendor_key" + miaCommonRequestParams.vendor_key + + "version" + miaCommonRequestParams.version + shopConfig.session_key; + MD5Util md5 = new MD5Util(); + String signStr = md5.MD5(signParams); + String params = "sign=" + signStr + "&date_sort=" + miaOrdersRequestParams.date_sort + "&date_type=" + + miaOrdersRequestParams.date_type + "&end_date=" + miaOrdersRequestParams.end_date + "&format=" + + miaCommonRequestParams.format + "&method=" + miaCommonRequestParams.method + + "&optional_field=" + miaOrdersRequestParams.optional_field + "&order_state=" + + miaOrdersRequestParams.order_state + "&page=" + miaOrdersRequestParams.page + "&page_size=" + + miaOrdersRequestParams.page_size + "&start_date=" + miaOrdersRequestParams.start_date + + "×tamp=" + miaCommonRequestParams.timestamp + "&vendor_key=" + + miaCommonRequestParams.vendor_key + "&version=" + miaCommonRequestParams.version;// + + // "&secret=" + // + + // app_secret; + String jsonString = new HttpRequest().sendPost(platConfig.api_url, params, HttpRequestCode.URLENCODED, + ApiMia.class.getName()); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + // JSONObject respon_code = json.getJSONObject("code"); + String code = json.getString("code"); + // String msg = json.getString("msg"); + // 处理错误信息 + if (!"200".equals(code)) {// 蜜芽无session_key过期异常,只会报签名故障 + logger.info("异常订单返回结果:{}", jsonStr); + + shopConfig.errFlag = false; + if ("1033".equals(code)) {// 时间跨度越界异常 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + return; + } + + // 未查询到数据 + JSONObject content = json.getJSONObject("content"); + JSONObject orders_list_response = content.getJSONObject("orders_list_response"); + // if (respon_data.isNullObject()) { + // logger.info("店铺:" + shopConfig.name + ""); + // shopConfig.errFlag = false; + // logger.info("[" + shopConfig.name + "]本批数据总数:" + + // 0); + // return; + // } else { + int totalCount = orders_list_response.has("total") ? orders_list_response.getInt("total") : 0; + if (totalCount <= 0) { + shopConfig.errFlag = false; + logger.info("[ {} ] | [ {} ] 本批数据总数:[ 0 ]", shopConfig.code, shopConfig.name); + return; + } + logger.info("[ {} ] | [ {} ] 本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + JSONArray order_list = orders_list_response.getJSONArray("order_list"); + for (int i = 0; i < order_list.size(); i++) { + JSONObject order = order_list.getJSONObject(i); + String order_id = order.getString("order_id"); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],将加入异常处理队列时间->{}", order_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("未付款订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ]为未付款订单,不予处理!", shopConfig.code, shopConfig.name, order_id); + continue; + } + // 等待出库 的订单 + if ("待发货".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] | [ {} ] error:订单[ {} ]的状态非待发货,不予处理!时间->{}", shopConfig.code, + shopConfig.name, order_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + + } + // } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 蜜芽支持1-100的单页数据 + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据订单生成时间获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + MiaCommonRequestParams miaCommonRequestParams = new MiaCommonRequestParams(); + miaCommonRequestParams.method = "mia.orders.search"; + miaCommonRequestParams.vendor_key = shopConfig.name; + miaCommonRequestParams.timestamp = System.currentTimeMillis() / 1000 + ""; + miaCommonRequestParams.format = "json"; + miaCommonRequestParams.version = "1.0"; + MiaOrdersRequestParams miaOrdersRequestParams = new MiaOrdersRequestParams(); + miaOrdersRequestParams.start_date = time_start; + miaOrdersRequestParams.end_date = time_end; + miaOrdersRequestParams.order_state = "2"; + miaOrdersRequestParams.page = page_now + ""; + miaOrdersRequestParams.page_size = page_rows + ""; + miaOrdersRequestParams.optional_field = "";// 不传值但是要传参,表示取所有的字段 + miaOrdersRequestParams.date_sort = "1"; + miaOrdersRequestParams.date_type = "1"; + String signParams = "date_sort" + miaOrdersRequestParams.date_sort + "date_type" + + miaOrdersRequestParams.date_type + "end_date" + miaOrdersRequestParams.end_date + "format" + + miaCommonRequestParams.format + "method" + miaCommonRequestParams.method + "optional_field" + + miaOrdersRequestParams.optional_field + "order_state" + miaOrdersRequestParams.order_state + + "page" + miaOrdersRequestParams.page + "page_size" + miaOrdersRequestParams.page_size + + "start_date" + miaOrdersRequestParams.start_date + "timestamp" + + miaCommonRequestParams.timestamp + "vendor_key" + miaCommonRequestParams.vendor_key + + "version" + miaCommonRequestParams.version + shopConfig.session_key; + MD5Util md5 = new MD5Util(); + String signStr = md5.MD5(signParams); + String params = "sign=" + signStr + "&date_sort=" + miaOrdersRequestParams.date_sort + "&date_type=" + + miaOrdersRequestParams.date_type + "&end_date=" + miaOrdersRequestParams.end_date + "&format=" + + miaCommonRequestParams.format + "&method=" + miaCommonRequestParams.method + + "&optional_field=" + miaOrdersRequestParams.optional_field + "&order_state=" + + miaOrdersRequestParams.order_state + "&page=" + miaOrdersRequestParams.page + "&page_size=" + + miaOrdersRequestParams.page_size + "&start_date=" + miaOrdersRequestParams.start_date + + "×tamp=" + miaCommonRequestParams.timestamp + "&vendor_key=" + + miaCommonRequestParams.vendor_key + "&version=" + miaCommonRequestParams.version; + + String jsonString = new HttpRequest().sendPost(platConfig.api_url, params, HttpRequestCode.URLENCODED, + ApiMia.class.getName()); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析蜜芽返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + String code = json.getString("code"); + // 处理错误信息 + if (!"200".equals(code)) { + // JSONObject error_response = json.getJSONObject("error_response"); + // String error_code = error_response.getString("error_code"); + logger.info("[ {} ] | [ {} ] 平台返回错误信息:{}", shopConfig.code, shopConfig.name, jsonStr); + // this.getOrder();// 重新抓取 + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "蜜芽平台故障,请联系软维ERP排查"; + if ("1033".equals(code)) { + result = "时间跨度超过平台限制"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return; + } + + // 未查询到数据 + JSONObject content = json.getJSONObject("content"); + JSONObject orders_list_response = content.getJSONObject("orders_list_response"); + + int totalCount = orders_list_response.has("total") ? orders_list_response.getInt("total") : 0; + if (totalCount <= 0) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + logger.info("店铺[ {} ] | [ {} ] 本批数据总数:[ 0 ]", shopConfig.code, shopConfig.name); + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + logger.info("[ {} ] | [ {} ] 本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + // 当前页订单数>1 + JSONArray order_list = orders_list_response.getJSONArray("order_list"); + for (int i = 0; i < order_list.size(); i++) { + JSONObject order = order_list.getJSONObject(i); + String order_id = order.getString("order_id"); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, shopConfig); + if (tradeInfo == null) { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "蜜芽平台故障,请联系软维ERP排查", ""); + } + logger.info("[ {} ] | [ {} ] error:订单[ {} ]解析订单详情错误!时间->{}", shopConfig.code, shopConfig.name, + order_id, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("未付款订单".equals(tradeInfo.pay_time)) { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "未付款订单暂不支持处理,请联系软维ERP", ""); + } + logger.info("[ {} ] | [ {} ] 订单[ {} ]为未付款订单,不予处理!", shopConfig.code, shopConfig.name, order_id); + continue; + } + // 等待出库 的订单 + if ("待发货".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + logger.info("[ {} ] | [ {} ] error:订单[ {} ]的状态非待发货,不予处理!时间->{}", shopConfig.code, + shopConfig.name, order_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + + } + + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + } catch (Exception e) { + logger.error(this, e); + // this.getOrder();//重新抓取 + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "蜜芽平台故障,请联系软维ERP排查", ""); + } + } + } + } + + private void getOrderInfo(ShopOrderInfo shopOrderInfo) { + GetOrderByIdThread thread = new GetOrderByIdThread(shopOrderInfo); + // thread.start(); + threadPool.execute(thread); + } + + private class GetOrderByIdThread extends Thread { + private ShopOrderInfo shopOrderInfo; + + public GetOrderByIdThread(ShopOrderInfo shopOrderInfo) { + this.shopOrderInfo = shopOrderInfo; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + MiaCommonRequestParams miaCommonRequestParams = new MiaCommonRequestParams(); + miaCommonRequestParams.method = "mia.order.get"; + miaCommonRequestParams.vendor_key = shopOrderInfo.shopConfig.name; + miaCommonRequestParams.timestamp = System.currentTimeMillis() / 1000 + ""; + miaCommonRequestParams.format = "json"; + miaCommonRequestParams.version = "1.0"; + String optional_field = ""; + String order_id = shopOrderInfo.tid; + String signParams = "format" + miaCommonRequestParams.format + "method" + miaCommonRequestParams.method + + "optional_field" + optional_field + "order_id" + order_id + "timestamp" + + miaCommonRequestParams.timestamp + "vendor_key" + miaCommonRequestParams.vendor_key + + "version" + miaCommonRequestParams.version + shopOrderInfo.shopConfig.session_key; + MD5Util md5 = new MD5Util(); + String signStr = md5.MD5(signParams); + String params = "sign=" + signStr + "&format=" + miaCommonRequestParams.format + "&method=" + + miaCommonRequestParams.method + "&optional_field=" + optional_field + "×tamp=" + + miaCommonRequestParams.timestamp + "&vendor_key=" + miaCommonRequestParams.vendor_key + + "&version=" + miaCommonRequestParams.version + "&order_id=" + order_id;// + "&secret=" + + // app_secret; + + String jsonString = new HttpRequest().sendPost(platConfig.api_url, params, HttpRequestCode.URLENCODED, + ApiMia.class.getName()); + + logger.info("[ {} ] | [ {} ] 根据订单号查找返回订单:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, jsonString); + this.parseOrder(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrder 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + + private boolean parseOrder(String jsonStr) { + boolean res = false; + try { + JSONObject json = JSONObject.fromObject(jsonStr); + String code = json.getString("code"); + + if (!"200".equals(code)) { + logger.info("[ {} ] | [ {} ] 蜜芽返回订单错误信息{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, jsonStr); + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "蜜芽平台故障,请联系软维ERP排查"; + if ("140".equals(code)) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + + } + JSONObject content = json.getJSONObject("content"); + if (content.getJSONArray("order_response").size() <= 0) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "无此订单号或订单不是代发货状态"; + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + } + JSONObject order_response = content.getJSONArray("order_response").getJSONObject(0);// .getJSONObject(0); + String tradeInfoStr = order_response.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, shopOrderInfo.shopConfig); + // 将订单移至数据处理中心 + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result_response = "蜜芽平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("查无此订单或商品") > -1) { + result_response = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result_response, ""); + } + + logger.info("[ {} ] | [ {} ] error:解析订单详情错误!时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + + if ("待发货".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return true; + } catch (JSONException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return res; + } + } + + /** + * parseTradeInfo 解析批量订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject trade = JSONObject.fromObject(jsonString); + // 订单 + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + + tradeInfo.tid = trade.getString("order_id"); + int orderStatus = trade.getInt("order_state");// 1未确认待审核,2已确认待发货,3部分发货,4已发货,5已完成,6已取消 + + switch (orderStatus) { + case 1: + tradeInfo.status = "待支付"; + break; + case 2: + tradeInfo.status = "待发货"; + break; + case 3: + tradeInfo.status = "部分发货"; + break; + case 4: + tradeInfo.status = "已发货"; + break; + case 5: + tradeInfo.status = "已完成"; + break; + case 6: + tradeInfo.status = "已取消"; + break; + default: + tradeInfo.status = ""; + break; + } + // String payment_id = trade.getString("payment_id");//支付方式ID + // String payment_code = trade.getString("payment_code");//支付方式编码 + int pay_type = trade.has("pay_type") ? trade.getInt("pay_type") : 0;// 支付方式名称 + + // logger.info("解析蜜芽订单的支付方式ID为:" + payment_id + + // ",支付方式编码:" + payment_code + ",支付方式名称:" + payment_name); + tradeInfo.pay_mode_id = 14; + if (pay_type == 20 || pay_type == 115) { + tradeInfo.pay_mode_id = 8; + } + if (pay_type == 3 || pay_type == 114) { + tradeInfo.pay_mode_id = 6; + } + if (pay_type == 8) { + tradeInfo.pay_mode_id = 5; + } + tradeInfo.post_fee = trade.getDouble("ship_price") + ""; + tradeInfo.num = 0; + tradeInfo.discount_fee = "0.0"; + tradeInfo.discount_fee = trade.has("order_seller_discount") ? trade.getDouble("order_seller_discount") + "" + : "0.0"; + tradeInfo.pay_money = trade.getDouble("pay_price") + ""; + tradeInfo.money = trade.getString("pay_price"); + tradeInfo.product_fee = (trade.getDouble("order_total_price") + Double.valueOf(tradeInfo.post_fee)) + ""; + + tradeInfo.created = trade.getString("order_time"); + String confirm_time = trade.getString("confirm_time"); + if ("0000-00-00 00:00:00".equals(confirm_time)) { + tradeInfo.pay_time = "未付款订单"; + } + tradeInfo.pay_time = confirm_time; + tradeInfo.platform_modify_time = trade.getString("modify_time"); + + JSONObject address_info = trade.getJSONObject("address_info"); + + tradeInfo.buyer_nick = address_info.getString("dst_name"); + tradeInfo.receiver_name = address_info.getString("dst_name"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_address = address_info.has("dst_address") ? address_info.getString("dst_address") : ""; + tradeInfo.receiver_state = address_info.getString("dst_province"); + tradeInfo.receiver_city = address_info.getString("dst_city"); + tradeInfo.receiver_district = address_info.getString("dst_area"); + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_phone = address_info.has("dst_tel") ? address_info.getString("dst_tel") : ""; + tradeInfo.receiver_mobile = address_info.has("dst_mobile") ? address_info.getString("dst_mobile") : ""; + tradeInfo.receiver_zip = ""; + tradeInfo.buyer_message = ""; + tradeInfo.seller_memo = ""; + tradeInfo.adjust_fee = "0"; + int need_invoice = trade.has("need_invoice") ? trade.getInt("need_invoice") : 0; + if (need_invoice == 2) { + tradeInfo.buyer_message = "需要发票"; + } + + tradeInfo.type = "fixed"; + + + // 蜜芽发票只提供了是否需要,需要的已经写到的买家留言 + tradeInfo.invoice_type = 0; + // tradeInfo.invoice_money = "0"; + + // 商品 + JSONArray item_info_list = trade.getJSONArray("item_info_list"); + // tradeInfo.orders = new OrderInfo[order.size()]; + OrderInfo[] orders = {}; + for (int i = 0; i < item_info_list.size(); i++) { + JSONObject item = item_info_list.getJSONObject(i); + int item_stat = item.getInt("item_stat");// 商品的状态 1:未拣货:4:配送中:5:已签收:6:完成:7:暂停发货:8:取消:9:确认取消: + if (item_stat != 1) { + // 商品的状态不为1的,直接跳过 + continue; + } + orders = Arrays.copyOf(orders, orders.length + 1); + orders[orders.length - 1] = new OrderInfo(); + orders[orders.length - 1].platform_seller_code = item.has("item_code") + ? (item.getString("item_code") == null ? "" : item.getString("item_code")) + : ""; + orders[orders.length - 1].num = item.getInt("item_total"); + tradeInfo.num += orders[orders.length - 1].num;// 计算订单总数量 + orders[orders.length - 1].price = item.getDouble("sale_price") + ""; + orders[orders.length - 1].total_fee = item.getDouble("pay_price") + ""; + orders[orders.length - 1].payment = item.getDouble("deal_price") + ""; + orders[orders.length - 1].discount_fee = item.getDouble("seller_discount") + ""; + + orders[orders.length - 1].title = item.getString("item_name"); + orders[orders.length - 1].sku_properties_name = item.has("item_code_color") + ? item.getString("item_code_color") + : ""; + orders[orders.length - 1].adjust_fee = "0"; + orders[orders.length - 1].productItemID_dd = ""; + orders[orders.length - 1].sku_id = item.getInt("sku_id") + ""; + orders[orders.length - 1].gift_type = 1; + + } + if (orders.length == 0) { + logger.info("error,订单[ {} ]没有商品处于代发货的状态,订单放弃处理,时间->{}", tradeInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return null; + } + tradeInfo.orders = orders; + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * 售后订单处理线程 + * + * @author Lewis 2018年11月15日 GetRefundThread + */ + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数1-100 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + MiaCommonRequestParams miaCommonRequestParams = new MiaCommonRequestParams(); + miaCommonRequestParams.method = "mia.returns.get"; + miaCommonRequestParams.vendor_key = shopConfig.name; + miaCommonRequestParams.timestamp = System.currentTimeMillis() / 1000 + ""; + miaCommonRequestParams.format = "json"; + miaCommonRequestParams.version = "1.0"; + MiaAftersaleRequestParams miaAftersaleRequestParams = new MiaAftersaleRequestParams(); + miaAftersaleRequestParams.start_date = time_start; + miaAftersaleRequestParams.end_date = time_end; + miaAftersaleRequestParams.return_state = "1"; + miaAftersaleRequestParams.page = page_now + ""; + miaAftersaleRequestParams.page_size = page_rows + ""; + miaAftersaleRequestParams.optional_field = ""; + miaAftersaleRequestParams.date_sort = "0"; + + String signParams = "date_sort" + miaAftersaleRequestParams.date_sort + "end_date" + + miaAftersaleRequestParams.end_date + "format" + miaCommonRequestParams.format + "method" + + miaCommonRequestParams.method + "optional_field" + miaAftersaleRequestParams.optional_field + + "page" + miaAftersaleRequestParams.page + "page_size" + miaAftersaleRequestParams.page_size + + "return_state" + miaAftersaleRequestParams.return_state + "start_date" + + miaAftersaleRequestParams.start_date + "timestamp" + miaCommonRequestParams.timestamp + + "vendor_key" + miaCommonRequestParams.vendor_key + "version" + miaCommonRequestParams.version + + shopConfig.session_key; + MD5Util md5 = new MD5Util(); + String signStr = md5.MD5(signParams); + String params = "sign=" + signStr + "&date_sort=" + miaAftersaleRequestParams.date_sort + "&end_date=" + + miaAftersaleRequestParams.end_date + "&format=" + miaCommonRequestParams.format + "&method=" + + miaCommonRequestParams.method + "&optional_field=" + miaAftersaleRequestParams.optional_field + + "&return_state=" + miaAftersaleRequestParams.return_state + "&page=" + + miaAftersaleRequestParams.page + "&page_size=" + miaAftersaleRequestParams.page_size + + "&start_date=" + miaAftersaleRequestParams.start_date + "×tamp=" + + miaCommonRequestParams.timestamp + "&vendor_key=" + miaCommonRequestParams.vendor_key + + "&version=" + miaCommonRequestParams.version;// + "&secret=" + app_secret; + + String jsonString = new HttpRequest().sendPost(platConfig.api_url, params, 3, ApiMia.class.getName()); + logger.info("[ {} ] | [ {} ] 返回售后订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (JdException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = JSONObject.fromObject(jsonString); + String code = json.getString("code"); + if (!"200".equals(code)) { + shopConfig.refundErrFlag = false; + // logger.info("[" + shopConfig.name + + // "]蜜芽返回售后单错误信息" + jsonString); + return; + } + JSONObject content = json.getJSONObject("content"); + JSONObject returns_search_response = content.getJSONObject("returns_search_response"); + int totalCount = returns_search_response.has("total") ? returns_search_response.getInt("total") : 0; + if (totalCount <= 0) { + // 提交任务补抓单程序的结果 + logger.info("店铺:[ {} ] | [ {} ] 本批售后单总数:[ 0 ]", shopConfig.code, shopConfig.name); + shopConfig.refundErrFlag = false; + return; + } + JSONArray returns_list = returns_search_response.getJSONArray("returns_list"); + for (int i = 0; i < returns_list.size(); i++) { + JSONObject returns_order = returns_list.getJSONObject(i); + String returnOrderStr = returns_order.toString(); + RefundInfo refundInfo = getRefundInfo(returnOrderStr, shopConfig); + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, + // refundInfo.tid); + // } + + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + private RefundInfo getRefundInfo(String returnOrderString, ShopConfig shopConfig) { + RefundInfo refundInfo = new RefundInfo(); + try { + JSONObject returnOrder = JSONObject.fromObject(returnOrderString); + refundInfo.company_code = shopConfig.company_code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.shop_code = shopConfig.code; + refundInfo.tid = returnOrder.has("order_code") ? returnOrder.getString("order_code") : ""; + refundInfo.refund_id = returnOrder.getString("return_id"); + refundInfo.bill_type = 2; + refundInfo.desc = ""; + refundInfo.reason = returnOrder.has("return_items") + ? returnOrder.getJSONArray("return_items").getJSONObject(0).getString("return_reason") + : ""; + refundInfo.platform_code = shopConfig.platformCode; + // refundInfo.reason = refundOrder.has("after_sale_reason") ? + // refundOrder.getString("after_sale_reason") : ""; + + } catch (Exception e) { + logger.error(this, e); + } + return refundInfo; + } +} diff --git a/src/com/since/emp/service/ApiPinDuoDuoNew.java b/src/com/since/emp/service/ApiPinDuoDuoNew.java new file mode 100644 index 0000000..eb65356 --- /dev/null +++ b/src/com/since/emp/service/ApiPinDuoDuoNew.java @@ -0,0 +1,209 @@ +package com.since.emp.service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.GetOrderDetailThread; +import com.since.emp.newplatform.service.GetOrderThread; +import com.since.emp.newplatform.service.RecatchOrderThread; +import com.since.emp.newplatform.service.RefundOrderThread; +import com.since.emp.newplatform.service.UpdateAccessToken; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +/** + * + * @className:ApiPingDuoDuoNew + * @description:拼多多Api接口类 + * @author:Sunshine + * @date:2019年7月18日 下午4:35:03 + */ +public class ApiPinDuoDuoNew { + + private static final Logger logger = LogManager.getLogger(ApiPinDuoDuoNew.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiPinDuoDuoNew(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + threadPool.execute(new RecatchOrderThread(logger, recatchConfig, platConfig, + platConfig.apps.get(0).shops.get(0), recatchConfig.starTime, recatchConfig.endTime, "拼多多")); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单,订单号:[ {} ],时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + threadPool + .execute(new GetOrderDetailThread(logger, recatchConfig, platConfig, shopOrderInfo, "拼多多")); + // getOrderDetailByOrderId(shopOrderInfo); + } + + } else { + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年5月6日 下午3:30:04 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + // TODO + String apiName = "ApiPinDuoDuoNew"; + new UpdateAccessToken().getNewAccessToken(platConfig, logger, apiName); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + + if (shopConfig.lastCatchTime == null) { + int order_loop = (int) Math.ceil((double) shopConfig.init_time / 30);// 初始抓单回退时间 + for (int k = 0; k < order_loop; k++) { + String start_time = df.format(new Date(now.getTime() - (order_loop - k) * 30 * 60000));// 开始时间 + String end_time = df + .format(new Date(now.getTime() - (order_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + start_time, end_time)); + } + + Date beforeDate = new Date(now.getTime() - 60000 * 30);// 拼多多平台增量查询订单的时间跨度最大为30分钟,所以不能根据shopConfig.init_time(一般为一个小时) + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + threadPool.execute(new GetOrderThread(logger, recatchConfig, platConfig, shopConfig, + df.format(now.getTime() - 30 * 60000), df.format(now))); + } catch (Exception e) { + logger.error(this, e); + } + } + + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + int refund_loop = (int) Math.ceil((double) shopConfig.init_time / 30); + for (int k = 0; k < refund_loop; k++) { + String start_time = df + .format(new Date(now.getTime() - (refund_loop - k) * 30 * 60000)); + String end_time = df + .format(new Date(now.getTime() - (refund_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + RefundOrderThread grt = new RefundOrderThread(logger, platConfig, shopConfig, + start_time, end_time, "ApiPinDuoDuoNew"); + threadPool.execute(grt); + } + Date beforeDate = new Date(now.getTime() - 60000 * 30); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + /** + * 2019-05-23 注释,拼多多不再使用时间覆盖式,而是根据当前时间往前半个小时的方式查询 By Lewis + */ + // Date date = df.parse(shopConfig.lastQueryRefundTime); + // date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : + // 0)); + // shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + // .format(date); + // 启动抓单线程 + RefundOrderThread grt = new RefundOrderThread(logger, platConfig, shopConfig, + df.format(now.getTime() - 30 * 60 * 1000), df.format(now), + "ApiPinDuoDuoNew"); + threadPool.execute(grt); + } + // catch (ParseException e) { + // logger.error(this, e); + // } + catch (Exception e) { + logger.error(this, e); + } + + } + } + + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + +} diff --git a/src/com/since/emp/service/ApiPingan.java b/src/com/since/emp/service/ApiPingan.java new file mode 100644 index 0000000..3860014 --- /dev/null +++ b/src/com/since/emp/service/ApiPingan.java @@ -0,0 +1,1191 @@ +package com.since.emp.service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.pajk.justice.openapi.biz.common.JkClient; +import com.pajk.justice.openapi.biz.common.QueryEnv; +import com.pajk.justice.openapi.biz.model.reuslt.refund.PageQueryRefundIncrementResult; +import com.pajk.justice.openapi.biz.model.reuslt.refund.RefundResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.PageQueryTradeAllResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.PageQueryTradeIncrementResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.QueryTradeDetailResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeCouponResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeDetailResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeInvoiceResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeItemResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeReceiverResult; +import com.pajk.justice.openapi.biz.request.refund.PageQueryRefundIncrementRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.PageQueryTradeAllRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.PageQueryTradeIncrementRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.QueryTradeDetailRequest; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +/** + * 平安好医生API请求接口默认设置超时时长为5秒,未提供显示设置方法,不可更改 + * + * @filename ApiPingAn.java + * @description 平安好医生Api接口类 + * @author Sunshine + * @date 2018年10月30日 下午3:09:49 + */ +public class ApiPingan { + private static final Logger logger = LogManager.getLogger(ApiPingan.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private List payServiceTypeDic; + private QueryEnv env = QueryEnv.PROD; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /** + * + * @typename Dic + * @description 付款类型字典 + * @author Sunshine + * @date 2018年11月1日 上午9:45:43 + */ + private class Dic { + String code; + String name; + + public Dic(String code, String name) { + this.code = code; + this.name = name; + } + } + + private void initDic() { + payServiceTypeDic = Collections.synchronizedList(new ArrayList()); + // 支付渠道(以下列举了一些常用订单支付渠道) alipayWalletPA :"支付宝钱包支付" alipayWapPA + // :"支付宝WAP端支付"wangcaiPA : "旺财渠道" wechatH5 : "微信H5"wechatPA : + // "微信app支付"wechatPublicPA :"微信公众号"yqbWap : "平安付wap" + payServiceTypeDic.add(new Dic("alipayWalletPA", "6")); + payServiceTypeDic.add(new Dic("alipayWapPA", "6")); + payServiceTypeDic.add(new Dic("wechatH5", "8")); + payServiceTypeDic.add(new Dic("wechatPA", "8")); + payServiceTypeDic.add(new Dic("wechatPublicPA", "8")); + payServiceTypeDic.add(new Dic("wangcaiPA", "14")); + payServiceTypeDic.add(new Dic("yqbWap", "14")); + } + + public ApiPingan(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + this.initDic(); + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime); + // recatchOrderThread.start(); + threadPool.execute(recatchOrderThread); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize()+1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Sunshine + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + // cachedThreadPool.execute(thread); + threadPool.execute(thread); + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == -1) {// TODO 设置为-1表示api暂不启动自动登记售后的功能 + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + // cachedThreadPool.execute(grt); + threadPool.execute(grt); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * + * @typename GetOrderThread + * @description 单次抓单线程 采用线程模式避免出错后,影响主线程 + * @author Sunshine + * @date 2018年10月30日 下午3:22:07 + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + /** + * getOrder 调用平安好医生api接口获取订单 时间范围: 只能查93天之内的订单 , 开始和结束时间间隔不能超过1天 + */ + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + String status = "WAIT_DELIVERY"; + JkClient jkClient = new JkClient(appConfig.key, appConfig.secret, env); + PageQueryTradeIncrementRequest request = new PageQueryTradeIncrementRequest(); + if (StringUtils.isNumeric(shopConfig.name)) {// 判断商户sellerId是否为纯数字,如果不是,放弃处理该商户 + request.setSellerId(Long.valueOf(shopConfig.name)); + } else {// 商户sellerID非纯数字,放弃处理 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } + request.setStartTime(time_start); + // request.setStartTime("2018-10-28 00:00:00"); + request.setEndTime(time_end); + // request.setEndTime("2018-11-03 00:00:00"); + request.setStatus(status); + request.setPageNo(page_now); + request.setPageSize(page_rows); + PageQueryTradeIncrementResult result = jkClient.execute(request); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String json = gn.toJson(result); + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取订单总条数:[ {} ] 订单数据:{}", shopConfig.code, shopConfig.name, + result.getTotalCount(), json); + this.parseOrderList(result); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrderList 解析平安好医生返回的订单列表数据 + * + * @param result + */ + private void parseOrderList(PageQueryTradeIncrementResult result) { + try { + int resultCode = result.getResultCode(); // 获取平台返回的状态码 + if (resultCode == 0) {// 接口调用正常 + int totalCount = result.getTotalCount();// 获取抓取订单的总条数 + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) {// 没有需要处理的订单 + shopConfig.errFlag = false; + return; + } + // 将订单移至队列,等待获取详细信息 + List orderList = result.getModel();// 获取订单列表 + for (int i = 0; i < orderList.size(); i++) { + TradeDetailResult order = orderList.get(i); + String orderCode = order.getTradeId();// 获取订单id + TradeInfo tradeInfo = parseTradeInfo(order, + new ShopOrderInfo(orderCode, shopConfig, appConfig.key, appConfig.secret)); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", orderCode, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单|[ {} ]为到付订单,不予处理!", shopConfig.code, shopConfig.name, + orderCode); + continue; + } + // 等待出库 的订单 + if ("WAIT_DELIVERY".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("SUCCESS".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } else {// 处理错误信息 + logger.info("异常订单返回结果:{}", new GsonBuilder().disableHtmlEscaping().create().toJson(result)); + + if (resultCode == 11) {// 商户sellerID错误,请填写正确的商户id + logger.info("店铺:[ {} ] | [ {} ] sellerId错误,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// sellerId错误,不再处理 + } else if (resultCode == 18) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.errFlag = false; + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * + * @typename RecatchOrderThread + * @description 补抓订单线程类 + * @author Sunshine + * @date 2018年11月3日 下午1:28:11 + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + String status = "WAIT_DELIVERY"; + JkClient jkClient = new JkClient(platConfig.apps.get(0).key, platConfig.apps.get(0).secret, env); + PageQueryTradeAllRequest request = new PageQueryTradeAllRequest(); + if (StringUtils.isNumeric(shopConfig.name)) {// 判断商户sellerId是否为纯数字,如果不是,放弃处理该商户 + request.setSellerId(Long.valueOf(shopConfig.name)); + } else {// 商户sellerID非纯数字,放弃处理 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } + request.setStartTime(time_start); + request.setEndTime(time_end); + request.setStatus(status); + request.setPageNo(page_now); + request.setPageSize(page_rows); + PageQueryTradeAllResult result = jkClient.execute(request); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String json = gn.toJson(result); + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取订单总条数:[ {} ] 订单数据:{}", shopConfig.code, shopConfig.name, + result.getTotalCount(), json); + this.parseOrderList(result); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 解析补抓的订单 + * + * @param result + */ + private void parseOrderList(PageQueryTradeAllResult result) { + try { + int resultCode = result.getResultCode(); // 获取平台返回的状态码 + if (resultCode == 0) {// 接口调用正常 + int totalCount = result.getTotalCount();// 获取抓取订单的总条数 + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) {// 没有需要处理的订单 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将订单移至队列,等待获取详细信息 + List orderList = result.getModel();// 获取订单列表 + for (int i = 0; i < orderList.size(); i++) { + TradeDetailResult order = orderList.get(i); + String orderCode = order.getTradeId();// 获取订单id + TradeInfo tradeInfo = parseTradeInfo(order, new ShopOrderInfo(orderCode, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret)); + + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", + ""); + } + + logger.info("[ {} ] | [ {} ] error:订单|[ {} ]解析订单详情错误!时间->{}", shopConfig.code, + shopConfig.name, orderCode, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单|[ {} ]为到付订单,不予处理!", shopConfig.code, shopConfig.name, + orderCode); + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", + ""); + } + continue; + } + + // 等待出库 的订单 + if ("WAIT_DELIVERY".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("SUCCESS".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单|[ {} ] :处理失败!", orderCode); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end; + } + + } else {// 处理错误信息 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + + if (resultCode == 11) {// 商户sellerID错误,请填写正确的商户id + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺sellerID错误,请重新授权后重试", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", ""); + } + } + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, result.getResultMsg()); + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", ""); + } + } + + } + + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param shopOrderInfo + * @return + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + JkClient jkClient = new JkClient(platConfig.apps.get(0).key, platConfig.apps.get(0).secret, env); + QueryTradeDetailRequest request = new QueryTradeDetailRequest(); + if (StringUtils.isNumeric(shopOrderInfo.shopConfig.name)) {// 判断商户sellerId是否为纯数字,如果不是,放弃处理该商户 + request.setSellerId(Long.valueOf(shopOrderInfo.shopConfig.name)); + } else {// 商户sellerID非纯数字,放弃处理 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return false; + } + request.setTradeId(shopOrderInfo.tid); + QueryTradeDetailResult result = jkClient.execute(request); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String json = gn.toJson(result); + logger.info("[ {} ] | [ {} ] 返回订单:" + "订单数据:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, json); + int resultCode = result.getResultCode(); // 获取平台返回的状态码 + if (resultCode != 0) { + if (resultCode == 11) {// 调用接口异常 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopConfig.code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ] | [ {} ] sellerID不可用,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + + } else if (resultCode == 101) {// 无效的订单号 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + return false; + + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", ""); + } + return false; + } + } + TradeDetailResult model = result.getModel(); + tradeInfoString = model.toString(); + Gson gn1 = new GsonBuilder().disableHtmlEscaping().create(); + String json2 = gn1.toJson(model); + logger.info("[ {} ] | [ {} ] 返回订单:" + "订单数据:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, json2); + TradeInfo tradeInfo = parseTradeInfo(model, shopOrderInfo); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", ""); + } + + logger.info("[ {} ] | [ {} ] error:订单|[ {} ]解析订单详情错误!时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单|:[ {} ],为到付订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", ""); + } + return false; + } + + // if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + // && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + // || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + if ("WAIT_DELIVERY".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("SUCCESS".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单|[ {} ] :处理失败!", shopOrderInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + // } + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + } + + /** + * 解析平安好医生订单详情 + * + * @param order + * @param shopOrderInfo + * @return + */ + private TradeInfo parseTradeInfo(TradeDetailResult order, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + + //将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + tradeInfo.tid = order.getTradeId();// 订单id + tradeInfo.status = order.getStatus(); + tradeInfo.num = 0; // 商品购买数量 + tradeInfo.discount_fee = "0.0"; + tradeInfo.money = String.valueOf((int) Double.parseDouble(order.getCashTotalFee()) / 100.0); // 如:120007,表示:1200元7分 + tradeInfo.pay_money = String.valueOf((int) Double.parseDouble(order.getCashTotalFee()) / 100.0); + tradeInfo.product_fee = "0.0"; + tradeInfo.created = order.getCreateTime();// 订单创建时间 + tradeInfo.alipay_no = order.getPaPayFlow();// 平安内部支付信息流水号 + if ("CASH_ON_DELIVERY".equals(order.getPayMode())) {// 货到付款 + tradeInfo.pay_time = "到付订单"; + } else { + tradeInfo.pay_time = order.getPayTime();// 在线支付订单支付时间 + } + tradeInfo.platform_modify_time = order.getModifyTime(); + tradeInfo.post_fee = String.valueOf((int) Double.parseDouble(order.getCashPostFee()) / 100.0);// 现金支付的邮费(分) + tradeInfo.buyer_nick = "";// 买家昵称 + // 收货人信息 + TradeReceiverResult receiverResult = order.getReceiver(); + tradeInfo.receiver_mobile = receiverResult.getMobile();// 收货人的手机号 + tradeInfo.receiver_name = receiverResult.getName();// 收货人的姓名 + tradeInfo.receiver_country = "中国";// 收货人所在的国家 + tradeInfo.receiver_state = receiverResult.getProv();// 收货人的所在省份 + tradeInfo.receiver_district = receiverResult.getArea();// 收货人所在地区 + tradeInfo.receiver_city = receiverResult.getCity();// 收货人所在城市 + tradeInfo.receiver_address = receiverResult.getAddress();// 收货人详细地址 + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.receiver_city = receiverResult.getProv(); + tradeInfo.receiver_district = receiverResult.getCity(); + } else { + tradeInfo.receiver_city = receiverResult.getCity(); + tradeInfo.receiver_district = receiverResult.getArea(); + } + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + + tradeInfo.receiver_phone = "";// 收货人的电话号码 + tradeInfo.receiver_zip = "";// 收货人的邮编 + tradeInfo.seller_nick = "";// 卖家昵称 + + // 主订单信息 + // tradeInfo.status = order.getApproveStatus();// 订单审核状态 审核状态(目前只有处方药可以审核非强制) + // NO_NEED_APPROVE:无需审核 + // WAITING_TO_APPROVE:待审核 + // APPROVE_PASS:审核通过 APPROVE_FAIL:审核不通过 + + // 计算现金支付总金额(包含邮费 商品 税费等) + tradeInfo.modified = order.getModifyTime();// 订单最后更新时间 + + tradeInfo.buyer_message = order.getBuyerNote();// 买家留言 + tradeInfo.seller_memo = ""; + if (null == order.getSellerRemark()) { + tradeInfo.seller_memo = order.getSellerRemark(); + } + tradeInfo.adjust_fee = "0"; + // order.getOriginPostFee();// 原始邮费(下单应收邮费(分)) 如:2007,表示:20元7分 + String payServiceType = order.getPayChannel();// 支付渠道(以下列举了一些常用订单支付渠道) alipayWalletPA :"支付宝钱包支付" + // alipayWapPA + // :"支付宝WAP端支付"wangcaiPA : "旺财渠道" wechatH5 : + // "微信H5"wechatPA + // : + // "微信app支付"wechatPublicPA :"微信公众号"yqbWap : "平安付wap" + if (null == order.getPayChannel()) { + tradeInfo.pay_mode_id = 14; + } else { + String dicname = getDicName(payServiceTypeDic, payServiceType); + tradeInfo.pay_mode_id = dicname.equals("") ? 14 : Integer.parseInt(dicname); + } + tradeInfo.type = ""; + // 平安好医生 + + /* + * 订单状态:NOT_PAY : 买家未付款 NOT_PAY_CLOSE : 买家未付款订单关闭 //APPROVING: + * 审核中(需要审核的订单(如处方药)待平台审核后才能进行发货) //WAIT_DELIVERY : 待卖家发货(订单可以进行发货的状态 ) + * //GROUPING:拼团中(拼团订单且为还未成团的订单) //DELIVERY : 订单已发货(卖家已经上传物流单给平台) //REFUNDING : + * 退款中(订单商品全部同意退款了) //REFUNDED : 已经退款订单(退款已完成) //LOCKED : 订单已锁定(未发货订单产生了退款单需要处理) + * //RISKY_APPROVING : 已支付风控审核中(订单被风控了平台审核中) //RISKY_REFUND:风控审核不通过 + * 退款中(分控订单平台审核不通过) //SUCCESS : 交易成功(已经确认收货的订单) //CANCEL : 货到付款取消订单 + */ + // order.getSubBizType();// 下单渠道(以HEALTH_PRES为结束 都会有电子处方) + // 订单商品信息 + + // 订单发票信息 + TradeInvoiceResult invoiceResult = order.getInvoice(); + if (invoiceResult == null) { + // 默认无票 + tradeInfo.invoice_title = ""; + tradeInfo.invoice_content = ""; + tradeInfo.invoice_taxmsg = ""; + tradeInfo.invoice_money = "0"; + tradeInfo.invoice_type = 0; + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.tax_id = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + } else { + if (invoiceResult.getType().equals("1") && invoiceResult.getMode().equals("0")) {// 纸质发票 + if (invoiceResult.getSignal().equals("1")) {// 公司增值普票 + tradeInfo.invoice_title = invoiceResult.getName(); + tradeInfo.invoice_money = "0";// 实付金额 + tradeInfo.invoice_type = 6; + tradeInfo.tax_id = invoiceResult.getTaxpayerId();// 纳税人识别号 + tradeInfo.address_telephone = invoiceResult.getAddress() + invoiceResult.getPhone();// 地址及电话 + tradeInfo.bank_of_deposit_account_number = invoiceResult.getBankAccount() + + invoiceResult.getBankName();// 开户行及账号 + } else {// 个人增值普票 + tradeInfo.invoice_title = ""; + tradeInfo.invoice_type = 6; + tradeInfo.invoice_money = "0";// 实付金额 + tradeInfo.tax_id = invoiceResult.getTaxpayerId();// 纳税人识别号 + } + } else if (invoiceResult.getType().equals("2") && invoiceResult.getMode().equals("1")) {// 电子发票 + if (invoiceResult.getSignal().equals("1")) {// 公司增值专票 + tradeInfo.invoice_title = invoiceResult.getName(); + tradeInfo.invoice_type = 7; + tradeInfo.invoice_money = "0";// 实付金额 + tradeInfo.tax_id = invoiceResult.getTaxpayerId();// 纳税人识别号 + tradeInfo.invoice_email = invoiceResult.getReceiveEmail();// 电子发票通知邮箱 + tradeInfo.invoice_phone = invoiceResult.getReceiveMobile();// 电子发票通知手机号 + tradeInfo.address_telephone = invoiceResult.getAddress() + invoiceResult.getPhone();// 地址及电话 + tradeInfo.bank_of_deposit_account_number = invoiceResult.getBankAccount() + + invoiceResult.getBankName();// 开户行及账号 + } else {// 个人增值专票 + tradeInfo.invoice_type = 7; + tradeInfo.invoice_title = ""; + tradeInfo.invoice_money = "0";// 实付金额 + tradeInfo.tax_id = invoiceResult.getTaxpayerId();// 纳税人识别号 + tradeInfo.invoice_email = invoiceResult.getReceiveEmail();// 电子发票通知邮箱 + tradeInfo.invoice_phone = invoiceResult.getReceiveMobile();// 电子发票通知手机号 + } + } else { + logger.info("获取发票信息有误!"); + } + + } + tradeInfo.invoice_money = tradeInfo.pay_money; + + List orderItems = order.getItems(); + tradeInfo.orders = new OrderInfo[0]; + for (int i = 0; i < orderItems.size(); i++) { + OrderInfo orderInfo = new OrderInfo(); + orderInfo.payment = "0"; + orderInfo.discount_fee = "" + 0; + orderInfo.divide_order_fee = "0"; + orderInfo.adjust_fee = "0"; + TradeItemResult tir = orderItems.get(i); + orderInfo.num = Integer.parseInt(tir.getBuyCount()) - Integer.parseInt(tir.getRefundCount());// 购买数量-订单已退数量 + tradeInfo.num += orderInfo.num;// 计算商品的总数量 + orderInfo.sku_id = tir.getSkuId();// 商品skuId(平台商品skuId) + orderInfo.productItemID_dd = ""; + orderInfo.gift_type = 1; + if (orderInfo.num <= 0) { + return null; + } else { + orderInfo.payment = String.valueOf((int) Double.parseDouble(tir.getCashFee()) / 100.0);// 实际支付现金 + tir.getCashTaxFee();// 实际支付税费 + orderInfo.platform_seller_code = tir.getOutSkuId();// 商品sku外部编号(合作方skuId) + // tir.getRebateRatio();// 商品抽佣比例 + orderInfo.price = String.valueOf((int) Double.parseDouble(tir.getSellPrice()) / 100.0);// sku销售单价(分) + orderInfo.total_fee = String.valueOf(orderInfo.num * Double.parseDouble(orderInfo.price)); + // tir.getSettlePrice();// sku结算单价(分) + // tir.getSpuId();// 商品spuId(平台商品spuId) + if (null == tir.getTitle()) { + orderInfo.title = ""; + } else { + orderInfo.title = tir.getTitle();// 商品名(平台商品名) + } + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = orderInfo; + } + + } + + // 订单优惠信息 + List coupons = order.getCoupons(); + for (TradeCouponResult tcr : coupons) { + // 抵扣金额(分), 如1321 代表 13元21分 + tradeInfo.discount_fee = (Double.valueOf(tradeInfo.discount_fee) + + (int) Double.parseDouble(null == tcr.getDiscountFee() ? "0" : tcr.getDiscountFee()) / 100.0) + + ""; + + tradeInfo.product_fee = (Double.valueOf(tradeInfo.product_fee) + (int) Double.parseDouble(order + .getCashTotalFee() + + (int) Double.parseDouble(null == tcr.getDiscountFee() ? "0" : tcr.getDiscountFee()) / 100.0)) + + "";// 未优惠之前的总金额 + tcr.getMethod();// 支付方式: -1, "虚拟支付" 6, "健康金" + // 7, "优惠券" 8, "促销抵扣" 10, "健康生活通卡" + // 对谁支付: 1, "商品"2, "邮费"3, "税费" + tcr.getPlatformRatio();// 平台承担比例, 目前只有当method=7/8/9的时候, 该字段才会生效, 格式为 "0.0" ~ "1.0 + // 空的话代表全部卖家承担 + // 0.0则表示全部卖家承担 + // 1.0则标识全部平台承担 + // 0.5 则表示平台承担50% 卖家承担50% + // 空的话代表全部卖家承担 + // 0.0则表示全部卖家承担 + // 1.0则标识全部平台承担 + // 0.5 则表示平台承担50% 卖家承担50% + // tcr.getPromRefCode();// 当method = 7 优惠券券码 当method =8 促销活动id + // tcr.getSkuId();// 平安商品skuId(当payFor为“1” 和 “3”时 该字段才会生效) + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + + } + + /** + * 获取付款类型 + * + * @param dics + * @param code + * @return + */ + private String getDicName(List dics, String code) throws Exception { + for (int i = 0; i < dics.size(); i++) { + Dic dic = dics.get(i); + if (code.equals(dic.code)) { + return dic.name; + } + } + return ""; + } + + /** + * + * @ClassName:GetRefundThread + * @Description:TODO(平安好医生平台获取退款订单线程) @author:Sunshine + * @date:2018年11月11日 下午2:12:53 + */ + class GetRefundThread extends Thread { + + public AppConfig appConfig;// 应用参数类 + private ShopConfig shopConfig;// 店铺参数类 + // private String time_start, time_end;// 开始时间,结束时间 + private String time_start, time_end;// 开始时间,结束时间// + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100; + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + String status = "CREATED"; + JkClient jkClient = new JkClient(appConfig.key, appConfig.secret, env); + PageQueryRefundIncrementRequest request = new PageQueryRefundIncrementRequest(); + if (StringUtils.isNumeric(shopConfig.name)) {// 判断商户sellerId是否为纯数字,如果不是,放弃处理该商户 + request.setSellerId(Long.valueOf(shopConfig.name)); + } else {// 商户sellerID非纯数字,放弃处理 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } + request.setStatus(status); + request.setStartTime(time_start); + request.setEndTime(time_end); + request.setPageNo(page_now); + request.setPageSize(page_rows); + PageQueryRefundIncrementResult result = jkClient.execute(request); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String json = gn.toJson(result); + logger.info("[ {} ] | [ {} ] 返回订单:本次抓取退款单总条数:[ {} ] 订单数据:{}", shopConfig.code, shopConfig.name, + result.getTotalCount(), json); + this.parseRefundOrderList(result); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @Title: parseRefundOrderList + * @Description: 解析平安好医生平台返回的退款订单详情列表 + * @param:result + * @return: void + * @throws + */ + private void parseRefundOrderList(PageQueryRefundIncrementResult result) { + int resultCode = result.getResultCode();// 获取平安好医生返回的状态码 + try { + if (resultCode == 0) {// 接口调用正常 + int totalCount = result.getTotalCount();// 获取抓取订单的总条数 + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) {// 没有需要处理的订单 + shopConfig.errFlag = false; + return; + } + // 将订单放入队列,等待获取详细信息 + List refundOrders = result.getModel();// 获取退款订单详情 + for (int i = 0; i < refundOrders.size(); i++) { + RefundResult refundOrder = refundOrders.get(i); + RefundInfo refundInfo = parseRefundInfo(refundOrder, shopConfig); + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // logger.info("退款订单[ {} ] 处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, + // refundInfo.tid); + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } else {// 处理错误信息 + if (resultCode == 11) {// 商户sellerID错误,请填写正确的商户id + logger.info("店铺:[ {} ] | [ {} ] sellerId错误,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// sellerId错误,不再处理 + } else if (resultCode == 18) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.refundErrFlag = false; + return; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + /** + * + * @Title: parseRefundInfo @Description: TODO(获取退款订单信息) @param: + * shopOrderInfo @return: boolean @throws + */ + private RefundInfo parseRefundInfo(RefundResult refundOrder, ShopConfig shopConfig) { + RefundInfo refundInfo = new RefundInfo(); + try { + refundInfo.refund_id = refundOrder.getRefundId();// 商品ID + refundInfo.tid = refundOrder.getTradeId();// 订单ID + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.desc = "";// 退款原因 + refundInfo.reason = (null == refundOrder.getRefundComment() ? "" : refundOrder.getRefundComment()); + refundInfo.platform_code = shopConfig.platformCode; + } catch (Exception e) { + logger.error(this, e); + } + return refundInfo; + + } + +} diff --git a/src/com/since/emp/service/ApiQunJieLong.java b/src/com/since/emp/service/ApiQunJieLong.java new file mode 100644 index 0000000..aa9904b --- /dev/null +++ b/src/com/since/emp/service/ApiQunJieLong.java @@ -0,0 +1,984 @@ +package com.since.emp.service; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.since.emp.base.*; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.test.vo.PageParamVo; +import com.since.emp.util.HttpRequest; +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @Description: 群接龙API接口 + * @Author: wg + * @Date: 2021/6/17 09:42 + */ +public class ApiQunJieLong { + private static final Logger logger = LogManager.getLogger(ApiQunJieLong.class); + private PlatConfig platConfig;// 平台参数 + private RecatchConfig recatchConfig;// 补抓单参数 + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool;// 定时器 + + public ApiQunJieLong(PlatConfig platConfig, RecatchConfig recatchConfig) { + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + logger.info("[ {} ]根据下单时间段进行补抓取订单", recatchConfig.shop_code); + // 根据下单时间段进行补抓取订单 + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + ApiQunJieLong.GetOrderThreadByTime getOrderThreadByTime = new ApiQunJieLong.GetOrderThreadByTime( + platConfig.apps.get(0), platConfig.apps.get(0).shops.get(i), recatchConfig.starTime, + recatchConfig.endTime); + threadPool.execute(getOrderThreadByTime); + } + } + // 根据系统单号补抓订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据系统单号补抓订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + if (getOrderInfo(shopOrderInfo.tid, shopOrderInfo.shopConfig)) { + logger.info("[ {} ]订单处理成功|{},已转交数据处理中心", shopOrderInfo.shopConfig.code, shopOrderInfo.tid); + } else { + logger.info("[ {} ]订单处理失败|{},放弃处理", shopOrderInfo.shopConfig.code, shopOrderInfo.tid); + } + } + + } else { + // 定时器执行抓单 + scheduledThreadPool.scheduleAtFixedRate(new OrdersTimerTask(threadPool, logger), 1000, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时器抓取订单 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + private Logger logger; + + public OrdersTimerTask(ThreadPoolExecutor threadPool, Logger logger) { + this.threadPool = threadPool; + this.logger = logger; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new GetOrderThread(platConfig, platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now))); + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + threadPool.execute(new ApiQunJieLong.GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now))); + } + + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + class GetOrderThread extends Thread { + private final Logger logger = LogManager.getLogger(ApiQunJieLong.GetOrderThread.class); + private PlatConfig platConfig; + public OrderSyncs.AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 0;// 条数 + private int pageNow = 1;// 当前页 + private int pageRows = 20;// 每次订单列表获取的单页条数20最多200条 + + public GetOrderThread(PlatConfig platConfig, AppConfig appConfig, ShopConfig shopConfig, String timeStart, + String timeEnd) { + this.platConfig = platConfig; + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, pageNow); + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(pageNow); + pageParamVo.setPageSize(pageRows); + map.put("pageParam", pageParamVo); + map.put("startTime", timeStart); + map.put("endTime", timeEnd); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderListResponseStr = httpRequest.sendPost( + platConfig.api_url + "/forward/query_order_list?accessToken=" + shopConfig.session_key, json, 2, + ApiQunJieLong.class.getName()); + logger.info("[ {} ] 正向订单查询返回订单{}", shopConfig.code, queryOrderListResponseStr); + JSONObject queryOrderListResponse = new JSONObject(queryOrderListResponseStr); + int code = queryOrderListResponse.getInt("code"); +// String msg = queryOrderListResponse.getString("msg"); + if (code != 200) { + if (403001 == code || 401001 == code) { + logger.info("店铺:[ {} ] | [ {} ] access_token已过期或不存在,将不再抓单,请重新授权后重试->{}", shopConfig.code, + shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + } + + this.parseOrderList(queryOrderListResponseStr); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 解析正向订单查询接口 + * + * @param queryOrderListResponseStr + */ + private void parseOrderList(String queryOrderListResponseStr) { + try { + JSONObject queryOrderListResponse = new JSONObject(queryOrderListResponseStr); + JSONObject queryOrderListData = queryOrderListResponse.getJSONObject("data"); + JSONArray entityList = queryOrderListData.getJSONArray("entityList"); + if (entityList.length() < 1) { + shopConfig.errFlag = false; + return; + } + for (int i = 0; i < entityList.length(); i++) { + String orderNO = entityList.get(i).toString(); + if (getOrderInfo(orderNO, shopConfig)) { + logger.info("订单处理成功|{},已转交数据处理中心", orderNO); + } else { + logger.info("订单处理失败|{},放弃处理", orderNO); + } + } + this.pageCount = (int) Math.ceil((double) entityList.length() / pageRows);// 计算分页总数 + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = true; + } + + } + } + + private boolean getOrderInfo(String orderNO, ShopConfig shopConfig) { + try { + HashMap map = new HashMap(); + map.put("orderNo", orderNO); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderInfoResponseStr = httpRequest.sendPost( + platConfig.api_url + "/single/query_order_info?accessToken=" + shopConfig.session_key, json, 2, + ApiQunJieLong.class.getName()); + logger.info("已支付订单详情查询接口返回订单数据:{}", queryOrderInfoResponseStr); + + JSONObject queryOrderInfoResponse = new JSONObject(queryOrderInfoResponseStr); + int code = queryOrderInfoResponse.getInt("code"); + if (code != 200) { + if (401001 == code || 403001 == code) { + logger.info("店铺:[ {} ] | [ {} ] access_token已过期或不存在,将不再抓单,请重新授权后重试->{}", shopConfig.code, + shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + + } + shopConfig.errFlag = false; + return false; + } + JSONObject queryOrderInfo = queryOrderInfoResponse.getJSONObject("data"); + String orderId = queryOrderInfo.getString("orderNo"); + TradeInfo tradeInfo = parseTradeInfo(queryOrderInfoResponseStr, shopConfig); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],跳过处理->{}", orderId, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if (tradeInfo.orders.length == 0) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],无未发货的子订单,不做处理!", shopConfig.code, shopConfig.name, tradeInfo.tid); + } + if ("PAY_SUCCESS".equals(tradeInfo.status)) { + logger.info("支付成功订单信息:{}", JSON.toJSONString(tradeInfo)); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + return true; + } catch (Exception e) { + logger.info("发送POST请求出现异常!" + e); + return false; + } + } + + private TradeInfo parseTradeInfo(String queryOrderInfoResponseStr, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject queryOrderInfoResponse = new JSONObject(queryOrderInfoResponseStr); + JSONObject queryOrderInfo = queryOrderInfoResponse.getJSONObject("data"); + + // 订单扩展信息 + if (!queryOrderInfo.has("orderExts")) { + logger.info("订单号异常请检查后输入:[ {} ] | [ {} ]", queryOrderInfoResponse.getInt("code"), + queryOrderInfoResponse.getJSONObject("data").toString()); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交", ""); + } + } + JSONObject orderExts = queryOrderInfo.getJSONObject("orderExts"); + + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Calendar payTimeCalendar = Calendar.getInstance(); + payTimeCalendar.setTimeInMillis(queryOrderInfo.getLong("dealTime"));// 转换为毫秒 + Date payTime = payTimeCalendar.getTime(); + + Calendar createTimeCalendar = Calendar.getInstance(); + payTimeCalendar.setTimeInMillis(queryOrderInfo.getLong("createTime"));// 转换为毫秒 + Date createTime = createTimeCalendar.getTime(); + + Calendar modifyTimeCalendar = Calendar.getInstance(); + payTimeCalendar.setTimeInMillis(queryOrderInfo.getLong("modifyTime"));// 转换为毫秒 + Date modifyTime = modifyTimeCalendar.getTime(); + + // 配置信息 + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + tradeInfo.tid = queryOrderInfo.getString("orderNo");// 店铺订单号 + + tradeInfo.num = queryOrderInfo.getInt("goodsCount");// 订单的商品总数 + tradeInfo.pay_money = tradeInfo.money = tradeInfo.product_fee = String + .valueOf(queryOrderInfo.getLong("realPrice") / 100.0);// 订单总价(单位:分) + tradeInfo.post_fee = String.valueOf(queryOrderInfo.getLong("carriagePrice") / 100.0);// 运费金额(单位:分) + tradeInfo.discount_fee = String.valueOf(queryOrderInfo.getLong("discountPrice") / 100.0);// 满减金额(单位:分) + + tradeInfo.created = sd.format(createTime);// 创建时间 + tradeInfo.platform_modify_time = sd.format(modifyTime);// 修改时间 + tradeInfo.pay_time = sd.format(payTime);// 支付时间 + tradeInfo.status = queryOrderInfo.getString("orderStatus");// USER_CANCEL:用户取消,USER_APPLY_CANCEL:用户申请取消,SELLER_CANCEL:发起人取消,PAY_SUCCESS:支付成功,ORDER_SIGN:订单签收,ORDER_END:订单结束 + tradeInfo.buyer_message = queryOrderInfo.has("userMark") ? queryOrderInfo.getString("userMark") : "";// 用户备注 + String sellerMark = queryOrderInfo.has("sellerMark") ? queryOrderInfo.getString("sellerMark") : "";// 卖家留言 + StringBuilder sb = new StringBuilder("跟团号:"); + if (StringUtils.isNotEmpty(sellerMark)) { + tradeInfo.seller_memo = sb.append(queryOrderInfo.getInt("actNo")).append(",").append(sellerMark) + .toString(); + } else { + tradeInfo.seller_memo = sb.append(queryOrderInfo.getInt("actNo")).toString(); + } + tradeInfo.receiver_country = "中国";// 收货人的所在国家 + tradeInfo.receiver_state = orderExts.getString("province");// 收货人的所在省份 + tradeInfo.receiver_city = orderExts.getString("city");// 收货人的所在城市 + tradeInfo.receiver_district = orderExts.getString("country");// 收货人的所在地区 + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + tradeInfo.receiver_city = orderExts.getString("province");// 收货人的所在城市 + } + tradeInfo.receiver_address = orderExts.getString("address"); + ;// 收货人的详细地址 + tradeInfo.receiver_mobile = orderExts.has("linkPhone") ? orderExts.getString("linkPhone") : "";// 收货电话 + tradeInfo.receiver_name = orderExts.getString("linkMan");// 收货人 + tradeInfo.title = queryOrderInfo.getString("actName");// 活动名称 + tradeInfo.seller_nick = queryOrderInfo.getString("leaderName");// 所属团长昵称 + tradeInfo.buyer_nick = queryOrderInfo.getString("nickname");// 买家昵称 + + // 订单明细 + JSONArray orderItems = queryOrderInfo.getJSONArray("orderItems"); + + tradeInfo.orders = new OrderInfo[orderItems.length()]; + for (int i = 0; i < orderItems.length(); i++) { + JSONObject item = orderItems.getJSONObject(i); + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("goodsNo") ? item.getString("goodsNo") : "";// 商品编码 + orderInfo.sku_id = item.has("goodsId") ? String.valueOf(item.getLong("goodsId")) : ""; + orderInfo.price = String.valueOf(item.getLong("groupPrice") / 100.0);// 商品单价 + orderInfo.total_fee = String.valueOf(item.getLong("groupPrice") * item.getLong("buyQuantity") / 100.0);// 应付金额 + orderInfo.num = item.getInt("buyQuantity");// 购买数量。取值范围:大于零的整数 + orderInfo.discount_fee = "0"; + /* + * 计算商品级实付金额 + */ + String payment = (new BigDecimal(orderInfo.price).multiply(new BigDecimal(orderInfo.num))) + .divide(new BigDecimal(Double.valueOf(tradeInfo.getProduct_fee()) == 0 ? 1.0 + "" + : tradeInfo.getProduct_fee()), 2, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal(tradeInfo.getMoney())).toString(); + orderInfo.payment = payment; + orderInfo.title = item.has("goodsName") ? item.getString("goodsName") : ""; + orderInfo.productItemID_dd = ""; + orderInfo.divide_order_fee = String + .valueOf(item.getLong("groupPrice") * item.getLong("buyQuantity") / 100.0); + orderInfo.outer_sku_id = String.valueOf(item.getLong("goodsId"));// 商品id(skuId) + orderInfo.sku_properties_name = ""; + orderInfo.adjust_fee = "0.0"; + orderInfo.gift_type = 1; + tradeInfo.orders[i] = orderInfo; + } + tradeInfo.platform_code = "026"; + tradeInfo.adjust_fee = "0"; + + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(shopConfig.order_sync_lock_flag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(shopConfig.order_sync_lock_keyword); + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + // 按时间段补抓取订单 + public class GetOrderThreadByTime extends Thread { + private AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int page_count = 0;// 条数 + private int page_now = 1;// 当前页 + private int page_rows = 20;// 每次订单列表获取的单页条数20 + + public GetOrderThreadByTime(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.shopConfig = shopConfig; + this.appConfig = appConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + getOrderByTime(); + } + + private void getOrderByTime() { + try { + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(page_now); + pageParamVo.setPageSize(page_rows); + map.put("pageParam", pageParamVo); + map.put("startTime", timeStart); + map.put("endTime", timeEnd); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderListResponseStr = httpRequest.sendPost( + platConfig.api_url + "?accessToken=" + shopConfig.session_key, json, 2, + ApiQunJieLong.class.getName()); + + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, page_now); + + JSONObject queryOrderListResponse = new JSONObject(queryOrderListResponseStr); + logger.info("[ {} ] 正向订单查询返回订单{}", shopConfig.code, queryOrderListResponseStr); + if (!queryOrderListResponse.has("data")) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "群接龙平台故障,请联系软维ERP排查", ""); + } + return; + } + int code = queryOrderListResponse.getInt("code"); + + if (code != 200) { + if (403001 == code) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + if (401001 == code) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权access_token不存在", ""); + } + logger.info("【" + shopConfig.name + "】" + queryOrderListResponse.getString("code") + ":" + + queryOrderListResponse.getString("msg")); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "群接龙平台故障,请联系软维ERP排查", ""); + return; + } + + this.parseOrderList(queryOrderListResponseStr); + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 解析正向订单查询接口 + * + * @param queryOrderListResponseStr + */ + private void parseOrderList(String queryOrderListResponseStr) { + try { + JSONObject queryOrderListResponse = new JSONObject(queryOrderListResponseStr); + if (queryOrderListResponse.has("data") && 200 == queryOrderListResponse.getInt("code")) { + JSONObject queryOrderListData = queryOrderListResponse.getJSONObject("data"); + JSONArray entityList = queryOrderListData.getJSONArray("entityList"); + int totalCount = entityList.length(); + logger.info("[ {} ] | [ {} ]返回订单:[ {} ]", shopConfig.code, shopConfig.name, + queryOrderListResponseStr); + if (totalCount < 1) { + return; + } + if (entityList.length() > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + for (int i = 0; i < totalCount; i++) { + String orderNO = entityList.get(i).toString(); + if (getOrderInfo(orderNO, shopConfig)) { + logger.info("订单处理成功|{},已转交数据处理中心", orderNO); + } else { + logger.info("订单处理失败|{},放弃处理", orderNO); + } + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrderByTime();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * @ClassName:UpdateTokenThread + * @Author:wg + * @Date:2021年6月18日 下午13:31:32 + */ + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.apps.size(); i++) { + AppConfig appConfig = platConfig.apps.get(i); + for (int j = 0; j < appConfig.shops.size(); j++) { + ShopConfig shopConfig = appConfig.shops.get(j); + if ("".equals(shopConfig.name) || shopConfig.order_sync_flag != 2) { + continue; + } + // 标记不更新的店铺 + boolean unupdateFlag = false; + for (int k = platConfig.updateTokenList.size() - 1; k >= 0; k--) { + OrderSyncs.UpdateMessage updateMessage = platConfig.updateTokenList.get(k); + // 如果platform_account为空或者未开启抓单按钮,直接跳过。 + // 如果updateTokenList已经存在店铺更新信息,直接跳过。 + if (updateMessage.shop_code.equals(shopConfig.code)) { + unupdateFlag = true; + break; + } + } + // 执行到此处的if判断即为有必要更新token的店铺 + if (platConfig.updateTokenList.size() == 0 || !unupdateFlag) { + initUpdateMessage(shopConfig); + } + } + } + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + OrderSyncs.UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if (expires_time_sdf - now_time_sdf <= 30 * 60 * 1000) {// 判断小于一个半小时就更新个,防止服务抖动 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String url = "https://openapi.qunjielong.com/open/auth/token"; + String params = "secret=" + shop_name; + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendGet(url, params, ""); + JSONObject json = new JSONObject(result); + if (json.has("data") && 200 == json.getInt("code")) { + String access = json.getString("data"); + long expiresIn = ((System.currentTimeMillis() / 1000) + 2 * 60 * 60);// 获取的是当前时候往后expires_in(秒)过期 + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_code, shop_name, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + /** + * @param shopConfig 初始Token更新数据 + */ + private void initUpdateMessage(ShopConfig shopConfig) { + OrderSyncs.UpdateMessage um = new OrderSyncs.UpdateMessage(); + um.shop_name = shopConfig.name; + um.shop_code = shopConfig.code; + um.expires_time = "1970-01-01 00:00:00"; + um.refresh_token = shopConfig.name; + platConfig.updateTokenList.add(um); + } + + /** + * 更新token + * + * @param shop_name + * @param shop_code + * @param access + * @param expiresIn + * @param now_time_sdf + */ + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(expiresIn * 1000); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "',refresh_token='" + shop_name + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code, shop_name); + } else { + logger.info("店铺:[ {} ] | [ {} ],刷新令牌成功,已写入数据库!", shop_code, shop_name); + } + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + // 申请退款订单查询 + class GetRefundThread extends Thread { + public OrderSyncs.AppConfig appConfig; + private ShopConfig shopConfig; + private String timeStart, timeEnd; + private int pageCount = 0;// 条数 + private int pageNow = 1;// 当前页 + private int pageRows = 20;// 每次订单列表获取的单页条数20 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String timeStart, String timeEnd) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.timeStart = timeStart; + this.timeEnd = timeEnd; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + /** + * 获取售后单列表 + */ + private void getRefundOrder() { + try { + + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, timeStart, + timeEnd, pageNow); + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(pageNow); + pageParamVo.setPageSize(pageRows); + map.put("pageParam", pageParamVo); + map.put("startTime", timeStart); + map.put("endTime", timeEnd); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String reverseQueryOrderListResponseStr = httpRequest.sendPost( + platConfig.api_url + "/apply_cancel/query_order_list?accessToken=" + shopConfig.session_key, + json, 2, ApiQunJieLong.class.getName()); + + logger.info("店铺:[ {} ]申请退款订单查询返回订单:{}", shopConfig.code, reverseQueryOrderListResponseStr); + + JSONObject reverseQueryOrderListResponse = new JSONObject(reverseQueryOrderListResponseStr); + int code = reverseQueryOrderListResponse.getInt("code"); + if (code != 200) { + if (code == 401001 || code == 403001) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + + } + shopConfig.refundErrFlag = false; + return; + } + this.parseReverseOrderList(reverseQueryOrderListResponseStr); + + } catch (Exception e) { + shopConfig.refundErrFlag = false; + e.printStackTrace(); + } + } + + /** + * 解析逆向订单查询接口 + * + * @param ReverseOrderList + */ + private void parseReverseOrderList(String ReverseOrderList) { + try { + JSONObject reverseQueryOrderListResponse = new JSONObject(ReverseOrderList); + if (reverseQueryOrderListResponse.has("data") && 200 == reverseQueryOrderListResponse.getInt("code")) { + JSONObject reverseQueryOrderListData = reverseQueryOrderListResponse.getJSONObject("data"); + + JSONArray entityList = reverseQueryOrderListData.getJSONArray("entityList"); + logger.info("[ {} ] | [ {} ]返回订单:[ {} ]", shopConfig.code, shopConfig.name, ReverseOrderList); + if (entityList.length() < 1) { + shopConfig.refundErrFlag = false; + return; + } + + for (int i = 0; i < entityList.length(); i++) { + String orderNO = entityList.get(i).toString(); + try { + HashMap map = new HashMap(); + map.put("orderNo", orderNO); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderInfoResponseStr = httpRequest.sendPost(platConfig.api_url + + "/single/query_order_info?accessToken=" + shopConfig.session_key, json, 2, + ApiQunJieLong.class.getName()); + + logger.info("[ {} ] 售后单订单详情查询接口返回订单数据:{}", shopConfig.code, queryOrderInfoResponseStr); + + JSONObject queryOrderInfoResponse = new JSONObject(queryOrderInfoResponseStr); + if (queryOrderInfoResponse.has("data") && 200 == queryOrderInfoResponse.getInt("code")) { + JSONObject queryOrderInfo = queryOrderInfoResponse.getJSONObject("data"); + + if (!queryOrderInfo.has("orderExts")) { + logger.info("[ {} ] 订单号异常请检查后输入:[ {} ] | [ {} ]", shopConfig.code, + queryOrderInfoResponse.getInt("code"), + queryOrderInfoResponse.getJSONObject("data")); + } + + JSONObject orderExts = queryOrderInfo.getJSONObject("orderExts"); + + RefundInfo refundInfo = new RefundInfo(); + refundInfo.reason = queryOrderInfo.has("refundReason") + ? queryOrderInfo.getString("refundReason") + : ""; + refundInfo.desc = queryOrderInfo.has("desc") ? queryOrderInfo.getString("desc") : ""; + refundInfo.refund_fee = orderExts.has("refundAmount") + ? orderExts.getDouble("refundAmount") + : 0; + if ("UN_DELIVER_GOODS" == queryOrderInfo.getString("orderLogisticsStatus")) { + refundInfo.bill_type = 1; + } + if ("DELIVERED" == queryOrderInfo.getString("orderLogisticsStatus")) { + refundInfo.bill_type = 2; + } + refundInfo.after_sales_status = 2; + refundInfo.company_code = shopConfig.company_code; + refundInfo.refund_id = refundInfo.tid = queryOrderInfo.getString("orderNo"); + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.platform_code = shopConfig.platformCode; + logger.info("[ {} ]售后单:{}", shopConfig.code, refundInfo.toJsonString()); + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("[ {} ]退款消息订单|[ {} ]处理订单异常", shopConfig.code, refundInfo.tid); + } + logger.info("[ {} ]退款消息订单|[ {} ]成功", shopConfig.code, refundInfo.tid); + + } + if (0 == queryOrderInfoResponse.getInt("code")) { + logger.info("【" + shopConfig.name + "】" + queryOrderInfoResponse.getString("code") + ":" + + queryOrderInfoResponse.getString("msg")); + + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.refundErrFlag = false; + } + if (403001 == queryOrderInfoResponse.getInt("code")) { + logger.info("店铺授权access_token已过期,请重新授权后重试"); + } + if (401001 == queryOrderInfoResponse.getInt("code")) { + logger.info("店铺授权access_token不存在"); + } + } catch (Exception e) { + logger.info("发送POST请求出现异常!" + e); + } + } + this.pageCount = (int) Math.ceil((double) entityList.length() / pageRows);// 计算分页总数 + + if (this.pageNow < this.pageCount) { + this.pageNow++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.timeEnd;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } +} diff --git a/src/com/since/emp/service/ApiTmall.java b/src/com/since/emp/service/ApiTmall.java new file mode 100644 index 0000000..1c133f7 --- /dev/null +++ b/src/com/since/emp/service/ApiTmall.java @@ -0,0 +1,3473 @@ +package com.since.emp.service; + +import java.io.File; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.FenxiaoInfo; +import com.since.emp.base.MsgInfo; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.RefundMsgInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.aftersale.ChangLogisticsAddressInfo; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.constant.CheckNewOrderQueue; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.TimeUtil; +import com.taobao.api.ApiException; +import com.taobao.api.BatchTaobaoClient; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoBatchRequest; +import com.taobao.api.TaobaoBatchResponse; +import com.taobao.api.TaobaoClient; +import com.taobao.api.internal.tmc.Message; +import com.taobao.api.internal.tmc.MessageHandler; +import com.taobao.api.internal.tmc.MessageStatus; +import com.taobao.api.internal.tmc.TmcClient; +import com.taobao.api.internal.toplink.LinkException; +import com.taobao.api.request.FenxiaoDealerRequisitionorderGetRequest; +import com.taobao.api.request.FenxiaoDealerRequisitionorderQueryRequest; +import com.taobao.api.request.FenxiaoOrdersGetRequest; +import com.taobao.api.request.RefundGetRequest; +import com.taobao.api.request.RefundsReceiveGetRequest; +import com.taobao.api.request.TradeFullinfoGetRequest; +import com.taobao.api.request.TradesSoldGetRequest; +import com.taobao.api.response.FenxiaoDealerRequisitionorderGetResponse; +import com.taobao.api.response.FenxiaoDealerRequisitionorderQueryResponse; +import com.taobao.api.response.FenxiaoOrdersGetResponse; +import com.taobao.api.response.RefundGetResponse; +import com.taobao.api.response.RefundsReceiveGetResponse; +import com.taobao.api.response.TradeFullinfoGetResponse; +import com.taobao.api.response.TradesSoldGetResponse; +import com.taobao.api.security.SecurityClient; + +/** + * 天猫API请求接口默认设置连接超时时长为15秒,读超时时长为30秒,提供显示设置方法,目前调用未更改 + * + * ApiTmall 天猫api接口类 + * + * @author jue + * + */ +public class ApiTmall { + private static final Logger logger = LogManager.getLogger(ApiTmall.class); + private String tmc_url, api_url, app_key, app_secret; + private List shops; + private RecatchConfig recatchConfig; + private String security_key = "Z8lJ15F4HA4EhPHbrNlmjIPe7c0jnezbHSFpRhgC0X4="; + private Map exceptionChangeLogisticsAddress = new ConcurrentHashMap<>(); + + private Vector msgQueue;// 新订单及修改备注消息队列 + private Vector msgQueue_s;// 交易完成消息队列 + private Vector msgQueue_fenxiao_agent;// 代销消息队列 + private Vector msgQueue_fenxiao_dealer;// 经销消息队列 + private Vector msgQueue_refund;// 退款创建消息队列 + private Vector msgQueue_refund_returngoods;// 买家退货给卖家消息队列 + private Vector msgQueue_refundClosed;// 取消退款消息队列 + private Vector msgQueue_changeLogisticsAddress;// 修改收货地址消息队列 + private Vector exceptionMsgQueue_changeLogisticsAddress;// 修改收货地址消息异常队列 + private Vector exceptionMsgQueue_refundClosed;// 取消退款消息异常队列 + private Vector exceptionMsgQueue;// 新消息异常处理队列 + private Vector exceptionMsgQueue_refund;// 退款创建消息异常队列 + private Vector exceptionMsgQueue_refund_returngoods;// 买家退货给卖家消息异常队列 + private Vector exceptionAgentFenXiaoMsgQueue;// 代销消息异常队列 + private Vector exceptionDealerFenXiaoMsgQueue;// 经销消息异常队列 + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /* + * public class MsgInfo { String topic; long tid; String seller_nick; int + * exception_record; + * + * public MsgInfo(String topic, long tid, String seller_nick, int + * exception_record) { this.topic = topic; this.tid = tid; this.seller_nick = + * seller_nick; this.exception_record = exception_record; } } + */ + /* + * public class RefundMsgInfo { String topic; long tid; String seller_nick; long + * refund_id; String bill_type; + * + * public RefundMsgInfo(String topic, long tid, String seller_nick, long + * refund_id, String bill_type) { this.topic = topic; this.tid = tid; + * this.seller_nick = seller_nick; this.refund_id = refund_id; this.bill_type = + * bill_type; } } + */ + + public class ExceptionMessage { + MsgInfo msgInfo;// 推送消息内容 + String errorMessage = "";// 订单请求的第三方平台返回的错误信息 + int orderType;// 订单类型,1为普通订单,可以同过交易API中的批量查询及详单查询接口查到的订单,2为分销订单中的代销订单,3为分销订单中的经销订单,供应商由分销API查询到的订单 + } + + /** + * 负面评价实体类 + * + * @author Lewis + * + */ + /* + * public class TraderateInfo { String tid; String shop_code; String buyer_nick; + * String rate_type;// 评价的类型 int add_flag;// 1:初次评价,2:追评 long num_iid; String + * item_title; String rate_content; String key_word; String company_code; String + * rate_time; } + */ + + /** + * 批量处理消息类 + * + * @author Lewis + * + */ + private class Batch { + + String sessionKey; + String code;// 店铺编码 + String topic; + String seller_nick; + long tid; + int count;// 用于batch数组检查是否被遍历过 + int exception_record; + } + + public ApiTmall(String api_url, String tmc_url, String app_key, String app_secret, List shops, + RecatchConfig recatchConfig) { + this.api_url = api_url; + this.app_key = app_key; + this.app_secret = app_secret; + this.tmc_url = tmc_url; + this.shops = shops; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + } catch (Exception e) { + logger.error(this, e); + } + } + + public void start() { + try { + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + // 根据订单创建时间补抓订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + for (int i = 0; i < shops.size(); i++) { + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(shops.get(i), recatchConfig.starTime, + recatchConfig.endTime); + // thread.start(); + // ordersByTime1(shops.get(i)); + threadPool.execute(thread); + } + } + // 根据系统单号补抓订单 + if (recatchConfig.orderId.length() > 0) { + try { + if ("012".equals(shops.get(0).realPlatformCode)) { + logger.info("根据分销单号抓取订单,API返回订单数据:[ {} ]", recatchConfig.orderId); + if (!getAgentFenXiaoTradeFullInfoByTid("taobao_fenxiao_FxOrderPaid", + Long.valueOf(recatchConfig.orderId), recatchConfig.platform_account) + .startsWith("4")) { + getDealerFenXiaoTradeFullInfoByTid("taobao_fenxiao_FxOrderPaid", + Long.valueOf(recatchConfig.orderId), recatchConfig.platform_account); + } + + } else { + logger.info("根据订单号抓取订单,API返回订单数据:[ {} ]", recatchConfig.orderId); + getTradeFullInfoByTid(Long.parseLong(recatchConfig.orderId), shops.get(0)); + } + } catch (Exception e) { + if (e instanceof NumberFormatException) { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "订单号非纯数字,请检查单号是否正确", ""); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "补录异常,请联系软维ERP服务人员", ""); + } + } + logger.error(this, e); + + } + + } + } else { + // 获取新订单队列积压的时间 + String tradeCreateTime = readCheckTradeQueueFile(); + + // 根据订单创建时间先进行一次补抓订单 + String shop_names = ""; + String shop_codes = ""; + for (int i = 0; i < shops.size(); i++) { + ShopConfig shopConfig = shops.get(i); + if (!"".equals(tradeCreateTime)) { + int checkTradeCreateTime = (int) Math.abs(TimeUtil.getDifferenceValue(tradeCreateTime)); + if (checkTradeCreateTime > shopConfig.init_time) { + shopConfig.init_time = checkTradeCreateTime; + } + } + if (i == 0) { + shop_names += shopConfig.name; + shop_codes += shopConfig.code; + } else { + shop_names += "," + shopConfig.name; + shop_codes += "," + shopConfig.code; + } + + // 启动抓单线程 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + String starTime = df.format(beforeDate); + String endTime = df.format(now); + + GetOrderThread thread = new GetOrderThread(shops.get(i), starTime, endTime); + // thread.start(); + threadPool.execute(thread); + } + logger.info("app:[ {} ] 启动,抓取店铺:[ {} ] | [ {} ]", app_key, shop_codes, shop_names); + msgQueue = new Vector(); + exceptionMsgQueue = new Vector(); + exceptionMsgQueue_refund = new Vector(); + exceptionMsgQueue_refund_returngoods = new Vector(); + msgQueue_refundClosed = new Vector(); + exceptionMsgQueue_refundClosed = new Vector(); + ; + msgQueue_s = new Vector(); + msgQueue_fenxiao_agent = new Vector(); + msgQueue_fenxiao_dealer = new Vector(); + msgQueue_refund = new Vector(); + msgQueue_refund_returngoods = new Vector(); + exceptionAgentFenXiaoMsgQueue = new Vector(); + exceptionDealerFenXiaoMsgQueue = new Vector(); + msgQueue_changeLogisticsAddress = new Vector(); + exceptionMsgQueue_changeLogisticsAddress = new Vector(); + + Thread thread_s = new Thread(new MsgServiceTask()); + // thread_s.start(); + threadPool.execute(thread_s); + logger.info("消息接收线程启动"); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + Thread thread_p = new Thread(new MsgParseThread()); + // thread_p.start(); + scheduledThreadPool.scheduleAtFixedRate(thread_p, 0, 500, TimeUnit.MILLISECONDS); + logger.info("新订单及修改备注消息处理线程启动"); + + MsgParseThread_Success mpts = new MsgParseThread_Success(); + // mpts.start(); + scheduledThreadPool.scheduleAtFixedRate(mpts, 0, 500, TimeUnit.MILLISECONDS); + logger.info("交易完成消息处理线程启动"); + + MsgParseThread_AgentFenXiao mptafx = new MsgParseThread_AgentFenXiao(); + // mptafx.start(); + scheduledThreadPool.scheduleAtFixedRate(mptafx, 0, 500, TimeUnit.MILLISECONDS); + logger.info("分销消息处理线程启动"); + + MsgParseThread_DealerFenXiao mptdfx = new MsgParseThread_DealerFenXiao(); + // mptdfx.start(); + scheduledThreadPool.scheduleAtFixedRate(mptdfx, 0, 500, TimeUnit.MILLISECONDS); + logger.info("代销消息处理线程启动"); + + MsgParseThread_refund mptr = new MsgParseThread_refund(); + // mptr.start(); + scheduledThreadPool.scheduleAtFixedRate(mptr, 0, 500, TimeUnit.MILLISECONDS); + logger.info("退款创建消息处理线程启动"); + + MsgParseThread_changeLogisticsAddress mptcla = new MsgParseThread_changeLogisticsAddress(); + scheduledThreadPool.scheduleAtFixedRate(mptcla, 150, 500, TimeUnit.MILLISECONDS); + logger.info("买家修改收货地址消息处理线程启动"); + + MsgParseThread_refund_returngoods mptrrg = new MsgParseThread_refund_returngoods(); + // mptrrg.start(); + scheduledThreadPool.scheduleAtFixedRate(mptrrg, 0, 500, TimeUnit.MILLISECONDS); + logger.info("买家退货给卖家消息处理线程启动"); + + MsgParseThread_refundClosed mptrc = new MsgParseThread_refundClosed(); + scheduledThreadPool.scheduleAtFixedRate(mptrc, 10, 500, TimeUnit.MILLISECONDS); + logger.info("买家取消退款消息处理线程启动"); + + ExceptionQueueThread eqt = new ExceptionQueueThread(); + // Timer timer = new Timer(); + // timer.schedule(eqt, 1000, 5 * 60 * 1000);// 正式启用调5分钟运行一次 + scheduledThreadPool.scheduleAtFixedRate(eqt, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + logger.info("异常订单处理线程启动"); + // cachedThreadPool = Executors.newCachedThreadPool(); // 使用线程池管理订单批量处理线程 + + // initFilexls(); + // for (int i = 0; i < 300000; i++) { + // msgQueue.add(new MsgInfo("taobao_trade_TradeBuyerStepPay", + // 77123533816785502L, "膳魔师新实专卖店",0)); + // msgQueue.add(new MsgInfo("taobao_trade_TradeBuyerPay", + // 77164161301624524L, "膳魔师新实专卖店",0)); + // } + + /* + * 2020-12-07 RefundInfo refundInfo = new RefundInfo(); refundInfo.reason = + * "不想要了"; refundInfo.desc = "反正就是不想要了"; refundInfo.bill_type = 1; + * refundInfo.company_code = "181"; refundInfo.company_type = 2; refundInfo.tid + * = "1409939028235032020"; refundInfo.refund_id = "91955809033032020"; + * refundInfo.shop_code = "20180925254"; refundInfo.refund_fee=119.60; + * OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo); + */ + // msgQueue_fenxiao_dealer.add(new + // MsgInfo("taobao_fenxiao_FxOrderPaid",26726219090797L, + // "rosendahl旗舰店供应商", 0)); + // msgQueue_fenxiao_agent.add(new + // MsgInfo("taobao_fenxiao_FxOrderPaid",26095759879159L, + // "rosendahl旗舰店供应商", 0)); + +// msgQueue_refund.add(new RefundMsgInfo("taobao_refund_RefundCreated", +// 1314824726198901716L, "膳魔师旗舰店", 84967776153901617L, "refund_bill"));//1.平台单号 + // 2.退款单号 用完注释 + // msgQueue_refundClosed.add(new + // RefundMsgInfo("taobao_refund_RefundClosed",302036385864523324L , + // "膳魔师新实专卖店",17411778730522433L , "refund_bill")); + // msgQueue_refund_returngoods.add(new + // RefundMsgInfo("taobao_refund_RefundCreated", + // 164215068336861120L,"膳魔师新实专卖店",9448232333862011L,"return_bill")); + // msgQueue_changeLogisticsAddress.add(new + // MsgInfo("taobao_trade_TradeLogisticsAddressChanged", 302442880894523324L, + // "rosendahl旗舰店", 0)); + + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /* + * 读取记录积压队列时间的文件,获取队列积压订单的最早创建时间 + */ + private String readCheckTradeQueueFile() throws Exception { + File file = new File(CheckNewOrderQueue.fileName); + if (file.exists()) { + if (file.canRead()) { + Stream stringStream = Files + .lines(Paths.get(CheckNewOrderQueue.fileName), Charset.defaultCharset()) + .flatMap(line -> Arrays.stream(line.split("="))); + List words = stringStream.collect(Collectors.toList()); + String tradeCreateTime = words.get(1); + logger.info("获取新订单写入队列文件的时间,文件读取成功,tradeCreateTime={}", tradeCreateTime); + return tradeCreateTime; + } else { + logger.info("获取新订单写入队列文件的时间,文件不可读取,放弃处理"); + } + } + logger.info("获取新订单写入队列文件的时间,文件不存在,放弃处理"); + return ""; + } + + /** + * 根据订单生成时间抓取订单 + * + * @author Lewis + * + */ + /* + * private class GetOrderThread extends Thread { private ShopConfig shopConfig; + * private String time_start, time_end; private int page_count = 1; private int + * page_now = 1; private int page_rows = 50;// 每次订单列表获取的单页条数5、10、15、20,默认20 + * private Boolean flag = false;// 作为是否是第一次查询第三方接口的开关,第一次只查询该批订单的数目 + * + * public GetOrderThread(ShopConfig shopConfig, String time_start, String + * time_end) { this.shopConfig = shopConfig; this.time_start = time_start; + * this.time_end = time_end; } + * + * public void run() { this.getOrder(); } + * + * public void getOrder() { if (recatchConfig.starTime.length() > 0 && + * recatchConfig.endTime.length() > 0) { try { String jsonString = null; + * logger.info("[" + shopConfig.name + "]根据订单创建时间获取订单:" + time_start + "->" + + * time_end + ",第" + page_now + "页"); + * + * if ("012".equals(recatchConfig.real_platform_code)) { TaobaoClient client = + * new DefaultTaobaoClient(api_url, app_key, app_secret); + * FenxiaoOrdersGetRequest req = new FenxiaoOrdersGetRequest(); + * req.setStatus("WAIT_SELLER_SEND_GOODS"); req.setStartCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + * req.setEndCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + * req.setTimeType("trade_time_type"); req.setPageNo((long) page_now); + * req.setPageSize((long) page_rows); req.setFields("fenxiao_id"); + * FenxiaoOrdersGetResponse rsp = client.execute(req, shopConfig.session_key); + * jsonString = rsp.getBody(); this.parseFenXiaoOrderList(jsonString); } else { + * TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + * TradesSoldGetRequest req = new TradesSoldGetRequest(); req.setFields("tid"); + * req.setStartCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + * req.setEndCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + * req.setStatus("WAIT_SELLER_SEND_GOODS,TRADE_FINISHED"); req.setType(// + * fixed,guarantee_trade,auto_delivery,independent_simple_trade, + * independent_shop_trade,cod,ec,game_equipment,shopex_trade,netcn_trade, + * external_trade,step,nopaid,pre_auth_type + * "fixed,guarantee_trade,auto_delivery,independent_simple_trade,independent_shop_trade,cod,ec,game_equipment,shopex_trade,netcn_trade,external_trade,nopaid,pre_auth_type" + * ); req.setPageNo((long) page_now); req.setPageSize((long) page_rows); + * TradesSoldGetResponse rsp = client.execute(req, shopConfig.session_key); // + * TradesSoldGetResponse rsp = client.execute(req, // shopConfig.session_key); + * jsonString = rsp.getBody(); logger.info("[" + logTitle + "]获取订单详情:" + + * jsonString); this.parseOrderList(jsonString); } + * + * + * } catch (ParseException e) { logger.error(this, e); } catch (ApiException e) + * { logger.error(this, e); } catch (Exception e) { logger.error(this, e); } } } + * + * /** parseOrderList 解析天猫返回的订单列表数据 + * + * @param jsonStr + */ + /* + * private void parseOrderList(String jsonStr) { try { int total_result = 0; + * JSONObject orders_get_response = null; JSONArray trade = null; long tid = 0L; + * JSONObject json = new JSONObject(jsonStr); if + * (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + * if ("012".equals(recatchConfig.real_platform_code)) { + * + * } else { orders_get_response = + * json.getJSONObject("trades_sold_get_response"); total_result = + * orders_get_response.getInt("total_results"); if (total_result < 1) { return; + * } JSONObject trades = orders_get_response.getJSONObject("trades"); trade = + * trades.getJSONArray("trade"); } } if (flag) { Long[] tradeId = new + * Long[trade.length()]; for (int i = 0; i < trade.length(); i++) { JSONObject + * orderJson = trade.getJSONObject(i); if + * ("20170329116783".equals(shops.get(0).code)) { tid = + * orderJson.getLong("fenxiao_id"); } else { tid = orderJson.getLong("tid"); } + * tradeId[i] = tid; } tradeId = reverse(tradeId);// 将订单顺序反转,使其按照下单时间排序 // + * 将订单移至数据处理中心 for (int i = 0; i < tradeId.length; i++) { tid = tradeId[i]; if + * (getTradeFullInfoByTid(tid)) { logger.info("[" + logTitle + "]消息处理成功|" + tid + * + ",已转交数据处理中心"); } else { logger.info("[" + logTitle + "]消息处理失败|" + tid + + * ",放弃处理"); } try { Thread.sleep(100);// 限制详单查询接口的调用频率 } catch + * (InterruptedException e) { logger.error(this, e); } } } + * + * // 从天猫查询到的数据是根据下单时间倒序排列的,对于补抓单有活动的,需要按正序排列才能保证活动赠送正确 this.page_count = (int) + * Math.ceil((double) total_result / page_rows);// 计算分页总数 // 倒序排列抓单 if (!flag) { + * logger.info("[" + shopConfig.name + "]根据时间查询本批数据总数:" + total_result + + * ",剩余未处理数:" + total_result); this.page_now = this.page_count + 1; } else { // + * 未查询到数据 if (this.page_now > 1) { logger.info("[" + shopConfig.name + + * "]根据时间查询本批数据总数:" + total_result + ",剩余未处理数:" + (page_rows * (this.page_now - + * 2))); } } + * + * flag = true;// 经过第一次查询得到订单总数,按订单页数倒序查询 if (this.page_now > 1) { + * this.page_now--; this.getOrder();// 抓取下一页 } // if (trade.length() == 0) { // + * System.exit(0); // } + * + * } catch (JSONException e) { logger.error(this, e); // this.getOrder();// 重新抓取 + * } } + */ + /** + * 分销订单数据 + * + * @param jsonStr + */ + + /* + * private void parseFenXiaoOrderList(String jsonStr) { try { int total_result = + * 0; JSONObject fenxiao_orders_get_response = null; JSONArray trade = null; + * long fenxiao_id = 0L; JSONObject json = new JSONObject(jsonStr); if + * (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + * fenxiao_orders_get_response = + * json.getJSONObject("fenxiao_orders_get_response"); total_result = + * fenxiao_orders_get_response.getInt("total_results"); if (total_result < 1) { + * return; } JSONObject trades = + * fenxiao_orders_get_response.getJSONObject("purchase_orders"); trade = + * trades.getJSONArray("purchase_order"); + * + * } if (flag) { Long[] tradeId = new Long[trade.length()]; for (int i = 0; i < + * trade.length(); i++) { JSONObject orderJson = trade.getJSONObject(i); + * fenxiao_id = orderJson.getLong("fenxiao_id"); tradeId[i] = fenxiao_id; } + * tradeId = reverse(tradeId);// 将订单顺序反转,使其按照下单时间排序 // 将订单移至数据处理中心 for (int i = + * 0; i < tradeId.length; i++) { fenxiao_id = tradeId[i]; String message = + * getFenXiaoTradeFullInfoByTid("taobao_fenxiao_FxOrderPaid", fenxiao_id, + * recatchConfig.platform_account); if (message.startsWith("1")) { + * logger.info("消息处理成功|" + fenxiao_id + ",已转交数据处理中心"); } else { + * logger.info("消息处理失败|" + fenxiao_id + ",放弃处理"); } try { Thread.sleep(100);// + * 限制详单查询接口的调用频率 } catch (InterruptedException e) { logger.error(this, e); } } } + * + * // 从天猫查询到的数据是根据下单时间倒序排列的,对于补抓单有活动的,需要按正序排列才能保证活动赠送正确 this.page_count = (int) + * Math.ceil((double) total_result / page_rows);// 计算分页总数 // 倒序排列抓单 if (!flag) { + * logger.info("[" + shopConfig.name + "]根据时间查询本批数据总数:" + total_result + + * ",剩余未处理数:" + total_result); this.page_now = this.page_count + 1; } else { // + * 未查询到数据 if (this.page_now > 1) { logger.info("[" + shopConfig.name + + * "]根据时间查询本批数据总数:" + total_result + ",剩余未处理数:" + (page_rows * (this.page_now - + * 2))); } } + * + * flag = true;// 经过第一次查询得到订单总数,按订单页数倒序查询 if (this.page_now > 1) { + * this.page_now--; this.getOrder();// 抓取下一页 } // if (trade.length() == 0) { // + * System.exit(0); // } + * + * } catch (JSONException e) { logger.error(this, e); // this.getOrder();// 重新抓取 + * } } } + */ + /** + * 根据订单最后修改时间抓取订单,与同名线程(根据订单生成时间抓取订单) + * + * @author Lewis + * + */ + + private class GetOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数5、10、15、20,默认20 + private Boolean flag = false;// 作为是否是第一次查询第三方接口的开关,第一次只查询该批订单的数目 + + public GetOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + public void getOrder() { + if (time_start.length() > 0 && time_end.length() > 0) { + try { + String jsonString = null; + String jsonString_agent = null; + String jsonString_dealer = null; + logger.info("[ {} ] | [ {} ] 根据订单创建时间获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + if ("012".equals(shopConfig.platformCode)) { + /** + * 分销-代销订单,可按照如下两种方式查询:trade_time_type(采购单按照成交时间范围查询),update_time_type(采购单按照更新时间范围查询) + * 目前使用订单创建时间查询 + */ + TaobaoClient client_agent = new DefaultTaobaoClient(api_url, app_key, app_secret); + FenxiaoOrdersGetRequest req_agent = new FenxiaoOrdersGetRequest(); + req_agent.setStatus("WAIT_SELLER_SEND_GOODS"); + req_agent.setStartCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + req_agent.setEndCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + req_agent.setTimeType("trade_time_type"); + req_agent.setPageNo((long) page_now); + req_agent.setPageSize((long) page_rows); + req_agent.setFields("fenxiao_id"); + FenxiaoOrdersGetResponse rsp_agent = client_agent.execute(req_agent, shopConfig.session_key); + jsonString_agent = rsp_agent.getBody(); + this.parseAgentFenXiaoOrderList(jsonString_agent); + /** + * 分销-经销订单,淘宝分销只提供按照最后修改时间的查询 + */ + TaobaoClient client_dealer = new DefaultTaobaoClient(api_url, app_key, app_secret); + FenxiaoDealerRequisitionorderGetRequest req = new FenxiaoDealerRequisitionorderGetRequest(); + req.setStartDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + req.setEndDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + req.setPageNo((long) page_now); + req.setPageSize((long) page_rows); + req.setOrderStatus(7L); + req.setFields("dealer_order_id"); + req.setIdentity(1L); + FenxiaoDealerRequisitionorderGetResponse rsp_dealer = client_dealer.execute(req, + shopConfig.session_key); + jsonString_dealer = rsp_dealer.getBody(); + this.parseDealerFenXiaoOrderList(jsonString_dealer); + } else { + /* + * 根据订单最后修改时间创建订单 + */ + /* + * TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + * TradesSoldIncrementGetRequest req = new TradesSoldIncrementGetRequest(); + * req.setFields("tid"); req.setStartModified(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + * req.setEndModified(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + * req.setStatus("WAIT_SELLER_SEND_GOODS"); req.setType("fixed,step"); + * req.setPageNo((long) page_now); req.setPageSize((long) page_rows); + * TradesSoldIncrementGetResponse rsp = client.execute(req, + * shopConfig.session_key); jsonString = rsp.getBody(); + */ + /* + * 根据订单创建时间获取订单 + */ + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + TradesSoldGetRequest req = new TradesSoldGetRequest(); + req.setFields("tid"); + req.setStartCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + req.setEndCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + req.setStatus("WAIT_SELLER_SEND_GOODS"); + req.setType("fixed,step"); + req.setExtType("service"); + req.setPageNo((long) page_now); + req.setPageSize((long) page_rows); + TradesSoldGetResponse rsp = client.execute(req, shopConfig.session_key); + jsonString = rsp.getBody(); + logger.info("获取订单详情:{}", jsonString); + this.parseOrderList(jsonString); + } + } catch (ParseException e) { + logger.error(this, e); + } catch (ApiException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * parseOrderList 解析天猫返回的订单列表数据 + * + * + * @param jsonStr + */ + + private void parseOrderList(String jsonStr) { + try { + int total_result = 0; + JSONObject trades_sold_increment_get_response = null; + JSONArray trade = null; + long tid = 0L; + JSONObject json = new JSONObject(jsonStr); + // System.out.println(json.toString()); + if (time_start.length() > 0 && time_end.length() > 0) { + if ((!json.has("trades_sold_get_response") && recatchConfig.type == 3) + || (!json.has("trades_sold_get_response") && recatchConfig.type == 4)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查!", ""); + } + trades_sold_increment_get_response = json.getJSONObject("trades_sold_get_response"); + total_result = trades_sold_increment_get_response.getInt("total_results"); + if (total_result < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (total_result > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + // 提交任务补抓单程序的结果 + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + JSONObject trades = trades_sold_increment_get_response.getJSONObject("trades"); + trade = trades.getJSONArray("trade"); + } + if (flag) { + Long[] tradeId = new Long[trade.length()]; + for (int i = 0; i < trade.length(); i++) { + JSONObject orderJson = trade.getJSONObject(i); + tid = orderJson.getLong("tid"); + tradeId[i] = tid; + } + tradeId = reverse(tradeId);// 将订单顺序反转,使其按照下单时间排序 + // 将订单移至数据处理中心 + for (int i = 0; i < tradeId.length; i++) { + tid = tradeId[i]; + if (getTradeFullInfoByTid(tid, shopConfig)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", tid); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", tid); + } + + try { + Thread.sleep(1); + } catch (InterruptedException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + // 从天猫查询到的数据是根据下单时间倒序排列的,对于补抓单有活动的,需要按正序排列才能保证活动赠送正确 + this.page_count = (int) Math.ceil((double) total_result / page_rows);// 计算分页总数 + + // 倒序排列抓单 + if (!flag) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + total_result, total_result); + this.page_now = this.page_count + 1; + } else { // 未查询到数据 + if (this.page_now > 1) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, + shopConfig.name, total_result, (page_rows * (this.page_now - 2))); + } + } + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + flag = true;// 经过第一次查询得到订单总数,按订单页数倒序查询 + if (this.page_now > 1) { + this.page_now--; + this.getOrder();// 抓取下一页 } + } + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查", ""); + } + } + // this.getOrder();// 重新抓取 + } + + /** + * 分销-代销订单数据 + * + * @param jsonStr + */ + + private void parseAgentFenXiaoOrderList(String jsonStr) { + try { + int total_result = 0; + JSONObject fenxiao_orders_get_response = null; + JSONArray trade = null; + long fenxiao_id = 0L; + JSONObject json = new JSONObject(jsonStr); + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + if ((!json.has("fenxiao_orders_get_response") && recatchConfig.type == 3) + || (!json.has("fenxiao_orders_get_response") && recatchConfig.type == 4)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查!", ""); + } + fenxiao_orders_get_response = json.getJSONObject("fenxiao_orders_get_response"); + total_result = fenxiao_orders_get_response.getInt("total_results"); + if (total_result < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + logger.info("补抓单无分销-代销订单"); + return; + } + + if (total_result > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + // 提交任务补抓单程序的结果 + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + JSONObject trades = fenxiao_orders_get_response.getJSONObject("purchase_orders"); + trade = trades.getJSONArray("purchase_order"); + + } + if (flag) { + Long[] tradeId = new Long[trade.length()]; + for (int i = 0; i < trade.length(); i++) { + JSONObject orderJson = trade.getJSONObject(i); + fenxiao_id = orderJson.getLong("fenxiao_id"); + tradeId[i] = fenxiao_id; + } + tradeId = reverse(tradeId);// 将订单顺序反转,使其按照下单时间排序 + // 将订单移至数据处理中心 + for (int i = 0; i < tradeId.length; i++) { + fenxiao_id = tradeId[i]; + String message = getAgentFenXiaoTradeFullInfoByTid("taobao_fenxiao_FxOrderPaid", fenxiao_id, + shopConfig.name); + if (message.startsWith("1")) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", fenxiao_id); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", fenxiao_id); + } + try { + Thread.sleep(100);// 限制详单查询接口的调用频率 + } catch (InterruptedException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + // 从天猫查询到的数据是根据下单时间倒序排列的,对于补抓单有活动的,需要按正序排列才能保证活动赠送正确 + this.page_count = (int) Math.ceil((double) total_result / page_rows);// 计算分页总数 + // 倒序排列抓单 + if (!flag) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + total_result, total_result); + this.page_now = this.page_count + 1; + } else { + // 未查询到数据 + if (this.page_now > 1) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, + shopConfig.name, total_result, (page_rows * (this.page_now - 2))); + } + } + + flag = true;// 经过第一次查询得到订单总数,按订单页数倒序查询 + if (this.page_now > 1) { + this.page_now--; + this.getOrder();// 抓取下一页 + } + // if (trade.length() == 0) { + // System.exit(0); + // } + + } catch (JSONException e) { + logger.error(this, e); + // this.getOrder();// 重新抓取 + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 分销-代销订单数据 经销 + * + * @param jsonStr + */ + + private void parseDealerFenXiaoOrderList(String jsonStr) { + try { + int total_result = 0; + JSONObject fenxiao_dealer_requisitionorder_get_response = null; + JSONArray trade = null; + long dealer_order_id = 0L; + JSONObject json = new JSONObject(jsonStr); + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + if ((!json.has("trades_sold_get_response") && recatchConfig.type == 3) + || (!json.has("trades_sold_get_response") && recatchConfig.type == 4)) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查!", ""); + } + fenxiao_dealer_requisitionorder_get_response = json + .getJSONObject("fenxiao_dealer_requisitionorder_get_response"); + total_result = fenxiao_dealer_requisitionorder_get_response.getInt("total_results"); + if (total_result < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + logger.info("补抓单无分销-经销订单"); + return; + } + + if (total_result > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + // 提交任务补抓单程序的结果 + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + JSONObject trades = fenxiao_dealer_requisitionorder_get_response.getJSONObject("dealer_orders"); + trade = trades.getJSONArray("dealer_order"); + + } + if (flag) { + Long[] tradeId = new Long[trade.length()]; + for (int i = 0; i < trade.length(); i++) { + JSONObject orderJson = trade.getJSONObject(i); + dealer_order_id = orderJson.getLong("dealer_order_id"); + tradeId[i] = dealer_order_id; + } + tradeId = reverse(tradeId);// 将订单顺序反转,使其按照下单时间排序 + // 将订单移至数据处理中心 + for (int i = 0; i < tradeId.length; i++) { + dealer_order_id = tradeId[i]; + String message = getDealerFenXiaoTradeFullInfoByTid("taobao_fenxiao_FxOrderPaid", + dealer_order_id, shopConfig.name); + if (message.startsWith("1")) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", dealer_order_id); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", dealer_order_id); + } + try { + Thread.sleep(100);// 限制详单查询接口的调用频率 + } catch (InterruptedException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + // 从天猫查询到的数据是根据下单时间倒序排列的,对于补抓单有活动的,需要按正序排列才能保证活动赠送正确 + this.page_count = (int) Math.ceil((double) total_result / page_rows);// 计算分页总数 + // 倒序排列抓单 + if (!flag) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + total_result, total_result); + this.page_now = this.page_count + 1; + } else { + // 未查询到数据 + if (this.page_now > 1) { + logger.info("[ {} ] | [ {} ] 根据时间查询本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, + shopConfig.name, total_result, (page_rows * (this.page_now - 2))); + } + } + + flag = true;// 经过第一次查询得到订单总数,按订单页数倒序查询 + if (this.page_now > 1) { + this.page_now--; + this.getOrder();// 抓取下一页 + } + // if (trade.length() == 0) { + // System.exit(0); + // } + + } catch (JSONException e) { + logger.error(this, e); + // this.getOrder();// 重新抓取 + } catch (Exception e) { + logger.error(this, e); + } + } + } + + // 对数组进行颠倒顺序 + /** + * @param arr + * @return + */ + public Long[] reverse(Long[] arr) throws Exception { + + // 初始化数组并定义长度 + Long[] arrResult = new Long[arr.length]; + int j = 0;// 新数组的下标 + // 通过循环替换数据 + for (int i = arr.length - 1; i >= 0; i--, j++) { + arrResult[j] = arr[i]; + } + return arrResult; + } + + /** + * getTradeFullInfoByTid 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param long tid + */ + private boolean getTradeFullInfoByTid(long tid, ShopConfig shopConfig) { + + boolean res = false; + String tradeInfoStr = ""; + try { + // API查询订单详细信息 + + TradeInfo tradeInfo = null; + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields( + "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,orders.divide_order_fee,orders.part_mjz_discount,orders.sku_id,orders.num_iid,orders.oid,seller_flag" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee,modified"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, shopConfig.session_key); + tradeInfoStr = rsp.getBody(); + logger.info("获取订单详情:{}", tradeInfoStr); + String topic = "taobao_trade_TradeBuyerPay"; + if (null == rsp.getErrorCode() || "".equals(rsp.getErrorCode())) { + OrderSyncs.submitLog.ychLogQueue.add(String.valueOf(tid)); + } + // String topic = "taobao_trade_TradeBuyerStepPay"; + tradeInfo = parseTradeInfo(tradeInfoStr, shopConfig, topic); + + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1) { + String result = "淘宝平台故障,请联系软维ERP排查"; + if (tradeInfoStr.indexOf("订单不存在") > -1 || tradeInfoStr.indexOf("必须是此交易的买家或卖家才能获取交易详细信息") > -1) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + logger.info("error:解析订单详情错误时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("API返回订单数据:{}", tradeInfoStr); + return false; + } + + if ("".equals(tradeInfo.pay_time) && !"nopaid".equals(tradeInfo.type)) { + logger.info("[ {} ]:付款时间为空,放弃处理", tid, tradeInfoStr); + } else { + // 发送tradeInfo至订单数据处理队列 + if ("taobao_trade_TradeBuyerPay".equals(tradeInfo.trade_type) + && "WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } +// if (recatchConfig.type == 3 || recatchConfig.type == 4) { +// OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); +// } + } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.error("API返回订单数据:{}", tradeInfoStr); + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查", ""); + } + } + return res; + } + + private class MsgServiceTask implements Runnable { + + @Override + public void run() { + TmcClient client = new TmcClient(tmc_url, app_key, app_secret, "default"); + client.setMessageHandler(new MessageHandler() { + + @Override + public void onMessage(Message message, MessageStatus status) { + try { + String topic = message.getTopic(); + String content = message.getContent(); + + JSONObject json = new JSONObject(content); + int exception_record = 0; + if ("taobao_trade_TradeBuyerPay".equals(topic) // 已付款消息 + || "taobao_refund_RefundCreated".equals(topic)// 创建退款消息 + || "taobao_trade_TradeMemoModified".equals(topic)// 修改备注消息 + || "taobao_trade_TradeSuccess".equals(topic)// 交易成功消息 + || "taobao_trade_TradeBuyerStepPay".equals(topic)// 付定金消息 + || "taobao_refund_RefundBuyerReturnGoods".equals(topic)// 买家退货给卖家消息 + || "taobao_refund_RefundClosed".equals(topic)) {// 买家取消退款消息 + long tid = json.getLong("tid"); + String seller_nick = json.getString("seller_nick"); + logger.info("新消息|{}:[ {} ],[ {} ]", topic, seller_nick, tid); + + if (topic.equals("taobao_trade_TradeBuyerPay")) { + msgQueue.add(new MsgInfo(topic, tid, seller_nick, exception_record)); + // status.fail(); + } + if (topic.equals("taobao_refund_RefundCreated")) { + String bill_type = json.getString("bill_type"); + long refund_id = json.getLong("refund_id"); + msgQueue_refund.add(new RefundMsgInfo(topic, tid, seller_nick, refund_id, bill_type)); + logger.info("{}:{}", topic, content); + } + if (topic.equals("taobao_trade_TradeMemoModified")) { + msgQueue.add(new MsgInfo(topic, tid, seller_nick, exception_record)); + } + if (topic.equals("taobao_trade_TradeSuccess")) { + msgQueue_s.add(new MsgInfo(topic, tid, seller_nick, exception_record)); + } + if ("taobao_trade_TradeBuyerStepPay".equals(topic)) { + msgQueue.add(new MsgInfo(topic, tid, seller_nick, exception_record)); + } + if ("taobao_refund_RefundBuyerReturnGoods".equals(topic)) { + long refund_id = json.getLong("refund_id"); + msgQueue_refund_returngoods + .add(new RefundMsgInfo(topic, tid, seller_nick, refund_id, "")); + } + if ("taobao_refund_RefundClosed".equals(topic)) { + long refund_id = json.getLong("refund_id"); + String bill_type = json.getString("bill_type"); + msgQueue_refundClosed + .add(new RefundMsgInfo(topic, tid, seller_nick, refund_id, bill_type)); + } + } else if ("taobao_trade_TradeLogisticsAddressChanged".equals(topic)) { + String seller_nick = json.has("seller_nick") ? json.getString("seller_nick") : ""; + String trade_status = json.has("status") ? json.getString("status") : ""; + if ((!"".equals(seller_nick)) && ("WAIT_SELLER_SEND_GOODS".equals(trade_status))) { + Long tid = json.getLong("tid"); + logger.info("修改地址消息|{}:[ {} ],[ {} }", topic, seller_nick, tid); + msgQueue_changeLogisticsAddress + .add(new MsgInfo("taobao_trade_TradeLogisticsAddressChanged", tid, seller_nick, + exception_record)); + } else { + // TODO + Long tid = json.has("tid") ? json.getLong("tid") : 0L; + String shopPlatFormAccount = getShopPlatFormAccount(String.valueOf(tid)); + + if ("".equals(shopPlatFormAccount)) { + logger.info("修改地址消息,未查询到订单所在店铺seller_nick,[ {} ],{},{}", tid, topic, content); + } else if ("error".equals(shopPlatFormAccount)) { + if (exceptionChangeLogisticsAddress.containsKey(tid)) { + if (exceptionChangeLogisticsAddress.get(tid) > 10) { + exceptionChangeLogisticsAddress.remove(tid); + logger.info("订单[ {} ] 处理修改地址消息失败超限,已放弃处理.", tid); + } else { + Integer count = exceptionChangeLogisticsAddress.get(tid); + exceptionChangeLogisticsAddress.put(tid, count + 1); + logger.info("订单[ {} ] 处理修改地址消息失败,已更新异常统计,当前错误次数[ {} ].", tid, count); + status.fail(); + } + } else { + logger.info("订单[ {} ] 处理修改地址消息失败,已统计异常次数.", tid); + exceptionChangeLogisticsAddress.put(tid, 1); + status.fail(); + } + } else { + msgQueue_changeLogisticsAddress + .add(new MsgInfo("taobao_trade_TradeLogisticsAddressChanged", tid, + shopPlatFormAccount, exception_record)); + + logger.info("修改地址消息,已查询到订单所在店铺的seller_nick,{},{},{}", topic, shopPlatFormAccount, + tid); + } + + } + } else if ("taobao_fenxiao_FxOrderPaid".equals(topic)) { + long fenxiao_id = json.getLong("fenxiao_id"); + String supplier_username = json.getString("supplier_username"); + String trade_type = json.getString("trade_type"); + if ("AGENT".equals(trade_type)) { + logger.info("代销系统消息|{}:[ {} ],[ {} ]", topic, supplier_username, fenxiao_id); + msgQueue_fenxiao_agent + .add(new MsgInfo(topic, fenxiao_id, supplier_username, exception_record)); + } + if ("DEALER".equals(trade_type)) { + logger.info("经销系统消息2|{}:[ {} ],[ {} ]" + topic, supplier_username, fenxiao_id); + // msgQueue_fenxiao_dealer.add(new + // MsgInfo(topic,fenxiao_id, supplier_username, + // exception_record)); + } + } else if ("taobao_fenxiao_DealerPay".equals(topic)) { + long dealer_order_id = json.getLong("dealer_order_id"); + String supplier_username = json.getString("supplier_nick"); + logger.info("经销系统消息|{}:[ {} ],[ {} ]" + topic, supplier_username, dealer_order_id); + msgQueue_fenxiao_dealer + .add(new MsgInfo(topic, dealer_order_id, supplier_username, exception_record)); + } else { + logger.info("未处理类型的消息|{}:{}", topic, content); + } + // logger.info(topic + ":" + content); + // processTradeBuyerPayMsg(topic,content); + // status.fail(); + } catch (Exception e) { + logger.error(this, e); + status.fail(); + } + } + }); + try { + client.connect(); + } catch (LinkException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 买家修改收货地址消息,一般发生在订单生成五分钟以内 + * + * @author Lewis 2018年12月17日 MsgParseThread_refund + */ + private class MsgParseThread_changeLogisticsAddress extends Thread { + @Override + public void run() { + try { + if (msgQueue_changeLogisticsAddress.size() > 0) { + MsgInfo changeLogisticsAddressMsgInfo = msgQueue_changeLogisticsAddress.get(0); + if (getNewLogisticsAddress(changeLogisticsAddressMsgInfo)) { + msgQueue_changeLogisticsAddress.remove(0); + } else { + msgQueue_changeLogisticsAddress.remove(0); + exceptionMsgQueue_changeLogisticsAddress.add(changeLogisticsAddressMsgInfo); + logger.info("修改收货地址消息订单|[ {} ]加入异常处理订单", changeLogisticsAddressMsgInfo.tid); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /* + * + */ + private boolean getNewLogisticsAddress(MsgInfo changeLogisticsAddressMsgInfo) { + try { + String seller_nick = changeLogisticsAddressMsgInfo.seller_nick; + long tid = changeLogisticsAddressMsgInfo.tid; + + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单|[ {} ]需人工处理!时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + if (cur_shopConfig.auto_update_address_flag != 2) { + logger.info("error:店铺:[ {} ]未开启自动修改订单收货地址功能,放弃处理订单|[ {} ]时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields( + "tid, receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,oaid"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, cur_shopConfig.session_key); + String LogisticsStr = rsp.getBody(); + if (null == rsp.getErrorCode() || "".equals(rsp.getErrorCode())) { + OrderSyncs.submitLog.ychLogQueue.add(String.valueOf(tid)); + } + logger.info("获取退货订单详情:{}", LogisticsStr); + + ChangLogisticsAddressInfo changLogisticsAddressInfo = parseNewLogisticsAddress(LogisticsStr, + cur_shopConfig); + if (changLogisticsAddressInfo == null) { + logger.info("error:解析修改后的新地址错误时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("API返回订单数据:{}", LogisticsStr); + return false; + } + + if (!OrderSyncs.dataParse.logisticsAddressChanged(changLogisticsAddressInfo)) { + return false; + } + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } + } + + private ChangLogisticsAddressInfo parseNewLogisticsAddress(String LogisticsStr, ShopConfig shopConfig) { + try { + ChangLogisticsAddressInfo changLogisticsAddressInfo = new ChangLogisticsAddressInfo(); + JSONObject json = new JSONObject(LogisticsStr); + + if (json.has("trade_fullinfo_get_response")) { + JSONObject trade_fullinfo_get_response = json.getJSONObject("trade_fullinfo_get_response"); + JSONObject trade = trade_fullinfo_get_response.getJSONObject("trade"); + + changLogisticsAddressInfo.company_type = shopConfig.company_type; + changLogisticsAddressInfo.company_code = shopConfig.company_code; + changLogisticsAddressInfo.shop_code = shopConfig.code; + changLogisticsAddressInfo.receiver_country = "中国"; + changLogisticsAddressInfo.receiver_state = trade.has("receiver_state") + ? trade.getString("receiver_state") + : ""; + + changLogisticsAddressInfo.tid = trade.has("tid") ? trade.getLong("tid") + "" : "0"; + changLogisticsAddressInfo.receiver_city = trade.has("receiver_city") ? trade.getString("receiver_city") + : ""; + changLogisticsAddressInfo.receiver_district = trade.has("receiver_district") + ? trade.getString("receiver_district") + : ""; + String encrpy_address = trade.getString("receiver_address"); + String encrpy_mobile = trade.has("receiver_mobile") ? trade.getString("receiver_mobile") : ""; + String encrpy_telephone = trade.has("receiver_phone") ? trade.getString("receiver_phone") : ""; + String encrpy_name = trade.has("receiver_name") ? trade.getString("receiver_name") : ""; + changLogisticsAddressInfo.receiver_zip = trade.has("receiver_zip") ? trade.getString("receiver_zip") + : ""; + + // 密文密码解密 + SecurityClient securityClient = new SecurityClient( + new DefaultTaobaoClient("https://eco.taobao.com/router/rest", app_key, app_secret), + security_key); + + if (SecurityClient.isEncryptData(encrpy_telephone, "simple")) { + changLogisticsAddressInfo.receiver_phone = securityClient.decrypt(encrpy_telephone, "simple", + shopConfig.session_key); + changLogisticsAddressInfo.encrpy_telephone = encrpy_telephone; + } else { + changLogisticsAddressInfo.receiver_phone = encrpy_telephone; + changLogisticsAddressInfo.encrpy_telephone = ""; + } + if (SecurityClient.isEncryptData(encrpy_mobile, "phone")) { + changLogisticsAddressInfo.receiver_mobile = securityClient.decrypt(encrpy_mobile, "phone", + shopConfig.session_key); + changLogisticsAddressInfo.encrpy_mobile = encrpy_mobile; + } else { + changLogisticsAddressInfo.receiver_mobile = encrpy_mobile; + changLogisticsAddressInfo.encrpy_mobile = ""; + } + if (SecurityClient.isEncryptData(encrpy_name, "simple")) { + changLogisticsAddressInfo.receiver_name = securityClient.decrypt(encrpy_name, "simple", + shopConfig.session_key); + changLogisticsAddressInfo.encrpy_name = encrpy_name; + } else { + changLogisticsAddressInfo.receiver_name = encrpy_name; + changLogisticsAddressInfo.encrpy_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_address, "simple")) { + changLogisticsAddressInfo.receiver_address = securityClient.decrypt(encrpy_address, "simple", + shopConfig.session_key); + changLogisticsAddressInfo.encrpy_address = encrpy_address; + } else { + changLogisticsAddressInfo.receiver_address = encrpy_address; + changLogisticsAddressInfo.encrpy_address = ""; + } + changLogisticsAddressInfo.receiver_name = changLogisticsAddressInfo.receiver_name.replaceAll("\\\"", + "");// 去双引号 + changLogisticsAddressInfo.receiver_name = changLogisticsAddressInfo.receiver_name.replaceAll("\\\'", + "");// 去单引号 + changLogisticsAddressInfo.receiver_address = changLogisticsAddressInfo.receiver_address + .replaceAll("\\\"", "");// 去双引号 + changLogisticsAddressInfo.receiver_address = changLogisticsAddressInfo.receiver_address + .replaceAll("\\\'", "");// 去单引号 + changLogisticsAddressInfo.receiver_address = changLogisticsAddressInfo.receiver_state + " " + + changLogisticsAddressInfo.receiver_city + " " + changLogisticsAddressInfo.receiver_district + + " " + changLogisticsAddressInfo.receiver_address; + + changLogisticsAddressInfo.oaid = trade.has("oaid") ? trade.getString("oaid") : ""; + + return changLogisticsAddressInfo; + } else { + if (LogisticsStr.indexOf("invalid-sessionkey") > -1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺授权码过期:[ {} ] | [ {} ]", shopConfig.code, shopConfig.name); + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺从原appkey:[ {} ]删除!", shopConfig.code, shopConfig.name, + app_key); + break; + } + } + } + return null; + } + } catch (Exception e) { + logger.error(this, e); + return null; + } + + } + + /** + * 退款单处理线程 + * + * @author Lewis + * + */ + private class MsgParseThread_refund extends Thread { + @Override + public void run() { + try { + if (msgQueue_refund.size() > 0) { + RefundMsgInfo refundMsgInfo = msgQueue_refund.get(0); + if (getRefund(refundMsgInfo)) { + msgQueue_refund.remove(0); + } else { + msgQueue_refund.remove(0); + exceptionMsgQueue_refund.add(refundMsgInfo); + logger.info("退款消息订单|[ {} ]加入异常处理订单", refundMsgInfo.tid); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 退款申请关闭处理线程 当用户取消退款申请时发送此消息 + * + * @author Lewis + * + */ + private class MsgParseThread_refundClosed extends Thread { + @Override + public void run() { + try { + if (msgQueue_refundClosed.size() > 0) { + RefundMsgInfo refundClosedMsgInfo = msgQueue_refundClosed.get(0); + if (parseRefundClosedOrder(refundClosedMsgInfo)) { + msgQueue_refundClosed.remove(0); + } else { + msgQueue_refundClosed.remove(0); + exceptionMsgQueue_refundClosed.add(refundClosedMsgInfo); + logger.info("退款关闭订单|[ {} ]加入异常处理订单", refundClosedMsgInfo.tid); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + /* + * 解析退款取消消息的店铺信息,并发送给dataparse处理取消的后续业务 + */ + private boolean parseRefundClosedOrder(RefundMsgInfo refundClosedMsgInfo) { + try { + String seller_nick = refundClosedMsgInfo.seller_nick; + // long refund_id = refundClosedMsgInfo.refund_id; + long tid = refundClosedMsgInfo.tid; + + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单|[ {} ]需人工处理!时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + if (cur_shopConfig.auto_cancel_aftersale_flag != 2) { + logger.info("error:店铺:[ {} ]未开启自动撤销售后功能,放弃处理订单|[ {} ],店铺配置信息{},时间->{}", seller_nick, tid, + new GsonBuilder().disableHtmlEscaping().create().toJson(cur_shopConfig), + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + RefundInfo refundClosedInfo = new RefundInfo(); + // 转换退款状态 + if (refundClosedMsgInfo.bill_type.equals("refund_bill")) { + refundClosedInfo.bill_type = 1; + } else if (refundClosedMsgInfo.bill_type.equals("return_bill")) { + refundClosedInfo.bill_type = 2; + } else { + refundClosedInfo.bill_type = 3; + } + refundClosedInfo.tid = refundClosedMsgInfo.tid + ""; + refundClosedInfo.refund_id = refundClosedMsgInfo.refund_id + ""; + refundClosedInfo.shop_code = cur_shopConfig.code; + refundClosedInfo.company_type = cur_shopConfig.company_type; + refundClosedInfo.company_code = cur_shopConfig.company_code; + if (!OrderSyncs.dataParse.updateRefundClosedOrder(refundClosedInfo)) { + return false; + } + } catch (Exception e) { + logger.error(this, e); + } + return true; + } + + private boolean getRefund(RefundMsgInfo refundMsgInfo) { + try { + // 读取session_key + String seller_nick = refundMsgInfo.seller_nick; + long refund_id = refundMsgInfo.refund_id; + long tid = refundMsgInfo.tid; + + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + if (cur_shopConfig.auto_aftersale_flag != 2) { + logger.info("error:店铺:[ {} ]未开启自动登记售后功能,放弃处理订单|[ {} ],时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + RefundGetRequest req = new RefundGetRequest(); + req.setFields("reason,desc,refund_fee,oid"); + req.setRefundId(refund_id); + RefundGetResponse rsp = client.execute(req, cur_shopConfig.session_key); + String refundString = rsp.getBody(); + logger.info("[ {} ]返回订单:{}", cur_shopConfig.name, refundString); + JSONObject json = new JSONObject(refundString); + + // api接口错误处理 + if (json.has("error_response")) { + if (refundString.indexOf("invalid-sessionkey") > -1) { + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", cur_shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(cur_shopConfig.code, cur_shopConfig.name); + + logger.info("店铺授权码过期:[ {} ]", cur_shopConfig.code); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (cur_shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ]店铺从原appkey:[ {} ]删除!", cur_shopConfig.code, app_key); + break; + } + } + } + /* + * 如果订单是纠纷单,需要单独的接口查询 + * 此接口的报错报文:{"error_response":{"code":15,"msg":"Remote service error","sub_code" + * :"isv.change-refund-top-api","sub_msg": + * "请使用taobao.special.refund.get接口查询对应的退款信息","request_id":"10cfvcq9wodug"}}, + * 只要报此错误,放弃处理该单,返回true,留给人工处理 + */ + if (refundString.indexOf("isv.change-refund-top-api") > -1) { + logger.info("订单:[ {} ]为纠纷单,放弃处理", refundMsgInfo.tid); + return true; + } + return false; + } + JSONObject refund_get_response = json.getJSONObject("refund_get_response"); + JSONObject refund = refund_get_response.getJSONObject("refund"); + RefundInfo refundInfo = new RefundInfo(); + refundInfo.reason = refund.has("reason") ? refund.getString("reason") : ""; + refundInfo.desc = refund.has("desc") ? refund.getString("desc") : ""; + refundInfo.refund_fee = refund.has("refund_fee") ? refund.getDouble("refund_fee") : 0; + long oid = refund.has("oid") ? refund.getLong("oid") : 0L; + if (oid == tid) { + refundInfo.sub_refund_type = 1; + } else { + refundInfo.sub_refund_type = 2; + } + String bill_type = refundMsgInfo.bill_type; + // 转换退款状态 + if (bill_type.equals("refund_bill")) { + refundInfo.bill_type = 1; + } else if (bill_type.equals("return_bill")) { + refundInfo.bill_type = 2; + } else { + refundInfo.bill_type = 3; + } + refundInfo.company_code = cur_shopConfig.company_code; + refundInfo.tid = refundMsgInfo.tid + ""; + refundInfo.refund_id = refundMsgInfo.refund_id + ""; + refundInfo.shop_code = cur_shopConfig.code; + refundInfo.company_type = cur_shopConfig.company_type; + refundInfo.platform_code = cur_shopConfig.platformCode; + // refundInfo.return_delivery_code = refund.has("sid") ? + // refund.getString("sid") : ""; + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // return false; + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + return false; + } + + return true; + } catch (ApiException e) { + logger.error(this, e); + return false; + } catch (JSONException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } + + } + + /** + * 退款单退货给卖家消息处理线程 + * + * @author Lewis + * + */ + private class MsgParseThread_refund_returngoods extends Thread { + @Override + public void run() { + try { + if (msgQueue_refund_returngoods.size() > 0) { + RefundMsgInfo refundReturnGoodsMsgInfo = msgQueue_refund_returngoods.get(0); + if (getRefundReturnGoods(refundReturnGoodsMsgInfo)) { + msgQueue_refund_returngoods.remove(0); + } else { + msgQueue_refund_returngoods.remove(0); + exceptionMsgQueue_refund_returngoods.add(refundReturnGoodsMsgInfo); + logger.info("买家退货消息订单|[ {} ]加入异常处理订单", refundReturnGoodsMsgInfo.tid); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + private boolean getRefundReturnGoods(RefundMsgInfo refundMsgInfo) { + try { + // 读取session_key + String seller_nick = refundMsgInfo.seller_nick; + long refund_id = refundMsgInfo.refund_id; + long tid = refundMsgInfo.tid; + + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } + + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + RefundGetRequest req = new RefundGetRequest(); + req.setFields("sid,company_name"); + req.setRefundId(refund_id); + RefundGetResponse rsp = client.execute(req, cur_shopConfig.session_key); + String refundString = rsp.getBody(); + logger.info("[ {} ]返回订单:{}", cur_shopConfig.name, refundString); + JSONObject json = new JSONObject(refundString); + + // api接口错误处理 + if (json.has("error_response")) { + if (refundString.indexOf("invalid-sessionkey") > -1) { + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", cur_shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(cur_shopConfig.code, cur_shopConfig.name); + + logger.info("店铺授权码过期:{}", cur_shopConfig.code); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (cur_shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ]店铺从原appkey:[ {} ]删除!", cur_shopConfig.code, app_key); + break; + } + } + } + return false; + } + JSONObject refund_get_response = json.getJSONObject("refund_get_response"); + JSONObject refund = refund_get_response.getJSONObject("refund"); + String sid = refund.has("sid") ? refund.getString("sid") : ""; + if ("".equals(sid)) { + return true; + } + if (!OrderSyncs.dataParse.insertRefundDeliveryCode(String.valueOf(refund_id), sid, + cur_shopConfig.company_code)) { + return false; + } + + return true; + } catch (ApiException e) { + logger.error(this, e); + return false; + } catch (JSONException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } + + } + + /** + * MsgParseThread 淘宝消息队列处理线程 + * + * @author Carl + * + */ + private class MsgParseThread extends Thread { + @Override + public void run() { + try { + if (msgQueue.size() > 0) { + if (msgQueue.size() == 1) { + MsgInfo msginfo = (MsgInfo) msgQueue.get(0); + logger.info("处理新订单消息|{}:[ {} ],[ {} ]", msginfo.topic, msginfo.seller_nick, msginfo.tid); + String message = getTradeFullInfoByTid(msginfo.topic, msginfo.tid, msginfo.seller_nick); + if (message.startsWith("1")) { + msgQueue.remove(0); + } else { + exceptionMsgQueue.add(new MsgInfo(msginfo.topic, msginfo.tid, msginfo.seller_nick, + ++msginfo.exception_record)); + if (msginfo.exception_record == 1 && ("taobao_trade_TradeBuyerPay".equals(msginfo.topic) + || "taobao_trade_TradeBuyerStepPay".equals(msginfo.topic))) { + ExceptionMessage em = new ExceptionMessage(); + if ((message.startsWith("2") && message.indexOf("invalid-sessionkey") == -1) + || message.startsWith("3")) { + em.msgInfo = msginfo; + em.errorMessage = message; + em.orderType = 1; + if (!recordExceptionOrders(em)) { + msginfo.exception_record--; + } + logger.info("新订单|[ {} ]消息加入异常处理订单", msginfo.tid); + } else { + logger.info("新订单|[ {} ]相关sessionkey已过期!", msginfo.tid); + } + + } + + msgQueue.remove(0); + } + } else if (msgQueue.size() > 1) { + int msgCount = msgQueue.size(); + int threadCount = 0; + int lastTradeCount = 0; + if (msgCount >= 100) { + threadCount = 5; + } else { + threadCount = (int) Math.ceil(msgCount / 20.0); + lastTradeCount = msgCount % 20; + } + for (int i = 0; i < threadCount; i++) { + int count = 0; + if (i == threadCount - 1) { + if (lastTradeCount == 0) { + count = 20; + } else { + count = lastTradeCount; + } + } else { + count = 20; + } + List batch = Collections.synchronizedList(new ArrayList()); + logger.info("新订单及修改备注:该批批量处理的订单量为:[ {} ]", count); + for (int j = 0; j < count; j++) { + MsgInfo msginfo = (MsgInfo) msgQueue.get(0); + Batch bt = new Batch(); + bt.seller_nick = msginfo.seller_nick; + bt.tid = msginfo.tid; + bt.topic = msginfo.topic; + bt.exception_record = msginfo.exception_record; + batch.add(bt); + msgQueue.remove(0); + } + TradeByBatch tbb = new TradeByBatch(shops, batch); + threadPool.execute(tbb); + } + + } + logger.info("新订单及修改备注消息队列总数:[ {} ]", msgQueue.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * MsgParseThread_AgentFenXiao 淘宝消息队列处理线程 Agent 代理 + * + * @author Carl + * + */ + private class MsgParseThread_AgentFenXiao extends Thread { + @Override + public void run() { + try { + if (msgQueue_fenxiao_agent.size() > 0) { + MsgInfo msginfo_fenxiao_agent = (MsgInfo) msgQueue_fenxiao_agent.get(0); + logger.info("处理消息|{}:[ {} ],[ {} ]", msginfo_fenxiao_agent.topic, msginfo_fenxiao_agent.seller_nick, + msginfo_fenxiao_agent.tid); + String message = getAgentFenXiaoTradeFullInfoByTid(msginfo_fenxiao_agent.topic, + msginfo_fenxiao_agent.tid, msginfo_fenxiao_agent.seller_nick); + if (message.startsWith("1")) { + msgQueue_fenxiao_agent.remove(0); + logger.info("消息处理成功|{}:[ {} ],[ {} ],已转交数据处理中心", msginfo_fenxiao_agent.topic, + msginfo_fenxiao_agent.seller_nick, msginfo_fenxiao_agent.tid); + } else { + exceptionAgentFenXiaoMsgQueue + .add(new MsgInfo(msginfo_fenxiao_agent.topic, msginfo_fenxiao_agent.tid, + msginfo_fenxiao_agent.seller_nick, ++msginfo_fenxiao_agent.exception_record)); + if (msginfo_fenxiao_agent.exception_record == 1) { + ExceptionMessage em = new ExceptionMessage(); + if ((message.startsWith("2") && message.indexOf("invalid-sessionkey") == -1) + || message.startsWith("3")) { + em.msgInfo = msginfo_fenxiao_agent; + em.errorMessage = message; + em.orderType = 2; + if (!recordExceptionOrders(em)) { + msginfo_fenxiao_agent.exception_record--; + } + logger.info("新订单|[ {} ]加入异常处理订单", msginfo_fenxiao_agent.tid); + } else { + logger.info("新订单|[ {} ]相关sessionkey已过期!", msginfo_fenxiao_agent.tid); + } + + } + msgQueue_fenxiao_agent.remove(0); + } + logger.info("消息队列总数:[ {} ]", msgQueue_fenxiao_agent.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * MsgParseThread_AgentFenXiao 淘宝消息队列处理线程 Dealer 经销 + * + * @author Carl + * + */ + private class MsgParseThread_DealerFenXiao extends Thread { + @Override + public void run() { + try { + if (msgQueue_fenxiao_dealer.size() > 0) { + MsgInfo msginfo_fenxiao_dealer = (MsgInfo) msgQueue_fenxiao_dealer.get(0); + logger.info("处理消息|{}:[ {} ],[ {} ]", msginfo_fenxiao_dealer.topic, + msginfo_fenxiao_dealer.seller_nick, msginfo_fenxiao_dealer.tid); + String message = getDealerFenXiaoTradeFullInfoByTid(msginfo_fenxiao_dealer.topic, + msginfo_fenxiao_dealer.tid, msginfo_fenxiao_dealer.seller_nick); + if (message.startsWith("1")) { + msgQueue_fenxiao_dealer.remove(0); + logger.info("消息处理成功|{}:[ {} ],[ {} ],已转交数据处理中心", msginfo_fenxiao_dealer.topic, + msginfo_fenxiao_dealer.seller_nick, msginfo_fenxiao_dealer.tid); + } else { + exceptionAgentFenXiaoMsgQueue + .add(new MsgInfo(msginfo_fenxiao_dealer.topic, msginfo_fenxiao_dealer.tid, + msginfo_fenxiao_dealer.seller_nick, ++msginfo_fenxiao_dealer.exception_record)); + if (msginfo_fenxiao_dealer.exception_record == 1) { + ExceptionMessage em = new ExceptionMessage(); + if ((message.startsWith("2") && message.indexOf("invalid-sessionkey") == -1) + || message.startsWith("3")) { + em.msgInfo = msginfo_fenxiao_dealer; + em.errorMessage = message; + em.orderType = 3; + if (!recordExceptionOrders(em)) { + msginfo_fenxiao_dealer.exception_record--; + } + logger.info("新订单| [ {} ]加入异常处理订单", msginfo_fenxiao_dealer.tid); + } else { + logger.info("新订单| [ {} ]相关sessionkey已过期!", msginfo_fenxiao_dealer.tid); + } + + } + msgQueue_fenxiao_dealer.remove(0); + } + logger.info("消息队列总数:[ {} ]", msgQueue_fenxiao_dealer.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * MsgParseThread_Success 淘宝消息队列处理线程 + * + * @author lewis + * + */ + private class MsgParseThread_Success extends Thread { + @Override + public void run() { + try { + if (msgQueue_s.size() > 0) { + MsgInfo msginfo_s = (MsgInfo) msgQueue_s.get(0); + logger.info("处理交易成功消息|{}:[ {} ],[ {} ]", msginfo_s.topic, msginfo_s.seller_nick, msginfo_s.tid); + ShopConfig cur_shopConfig = null; + for (int i = 0; i < shops.size(); i++) { + ShopConfig shopConfig = shops.get(i); + if (msginfo_s.seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", msginfo_s.seller_nick, msginfo_s.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else { + TradeInfo tradeInfo = new TradeInfo(); + tradeInfo.tid = msginfo_s.tid + ""; + tradeInfo.company_code = cur_shopConfig.company_code; + tradeInfo.shop_code = cur_shopConfig.code; + + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + logger.info("消息处理成功|{}:[ {} ] | [ {} ],[ {} ],已转交数据处理中心", msginfo_s.topic, tradeInfo.shop_code, + msginfo_s.seller_nick, msginfo_s.tid); + } + msgQueue_s.remove(0); + logger.info("交易成功消息队列总数:[ {} ]", msgQueue_s.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + class TradeByBatch extends Thread { + List shops; + List batch; + + public TradeByBatch(List shops, List batch) { + this.shops = shops; + this.batch = batch; + + } + + @Override + public void run() { + getTradeFullInfoByBatch(); + } + + private void getTradeFullInfoByBatch() { + + int sessionkeysum = 0; + JSONObject trade_fullinfo_get_response = null; + try { + BatchTaobaoClient client = new BatchTaobaoClient("https://gw.api.taobao.com/router/batch?", app_key, + app_secret); + TaobaoBatchRequest req = new TaobaoBatchRequest(); + String session_key = null; + for (int i = batch.size() - 1; i >= 0; i--) { + ShopConfig cur_shopConfig = null; + for (int k = 0; k < this.shops.size(); k++) { + ShopConfig shopConfig = this.shops.get(k); + if (batch.get(i).seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + if (i == 0) { + session_key = shopConfig.session_key; + } + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", batch.get(i).seller_nick, + batch.get(i).tid, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + batch.remove(i); + continue; + } + if (batch.get(0).seller_nick.equals(batch.get(i).seller_nick)) { + TradeFullinfoGetRequest req1 = new TradeFullinfoGetRequest(); + req1.setFields( + "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,orders.divide_order_fee,orders.part_mjz_discount,orders.sku_id,orders.num_iid,orders.oid,seller_flag" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee,modified"); + req1.setTid(batch.get(i).tid); // 商家a的订单1 + req.addRequest(req1); + } else { + TradeFullinfoGetRequest req2 = new TradeFullinfoGetRequest(); + req2.setFields( + "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,orders.divide_order_fee,orders.part_mjz_discount,orders.sku_id,orders.num_iid,orders.oid,seller_flag" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee,modified"); + req2.setTid(batch.get(i).tid); // 商家b、c、d的订单1 + req2.setBatchApiSession(cur_shopConfig.session_key); // 商家b、c、d的sessionkey2 + req.addRequest(req2); + } + } + + if (batch.size() > 0) { + TaobaoBatchResponse rsp = client.execute(req, session_key);// 商家a的sessionkey + if (rsp.isSuccess()) { + for (int k = 0; k < rsp.getResponseList().size(); k++) { + String tradeInfoString = rsp.getResponseList().get(k).getBody(); + JSONObject json = new JSONObject(tradeInfoString); + + if (json.has("trade_fullinfo_get_response")) { + trade_fullinfo_get_response = json.getJSONObject("trade_fullinfo_get_response"); + JSONObject trade = trade_fullinfo_get_response.getJSONObject("trade"); + long cur_tid = Long.valueOf(trade.getString("tid")); + OrderSyncs.submitLog.ychLogQueue.add(String.valueOf(cur_tid)); + String cur_shop = null, cur_topic = null; + for (int j = 0; j < batch.size(); j++) { + if (cur_tid == batch.get(j).tid && batch.get(j).count == 0) { + cur_shop = batch.get(j).seller_nick; + cur_topic = batch.get(j).topic; + batch.get(j).count++; + break; + } + } + ShopConfig cur_shopConfig = null; + for (int j = 0; j < this.shops.size(); j++) { + ShopConfig shopConfig = this.shops.get(j); + if (cur_shop.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + + TradeInfo tradeInfo = parseTradeInfo(tradeInfoString, cur_shopConfig, cur_topic); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|未知,将加入异常处理队列时间->{}", + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("API返回订单数据:{}", tradeInfoString); + + continue; + } + + // 将可插入订单发送到订单处理中心 + if ("taobao_trade_TradeBuyerPay".equals(tradeInfo.trade_type) + || "taobao_trade_TradeMemoModified".equals(tradeInfo.trade_type) + || "taobao_trade_TradeBuyerStepPay".equals(tradeInfo.trade_type)) { + if ("".equals(tradeInfo.pay_time) && !"nopaid".equals(tradeInfo.type)) { + logger.info("[ {} ] :付款时间为空,放弃处理,订单详情:{}", tradeInfo.tid, tradeInfoString); + } else { + if (("taobao_trade_TradeBuyerPay".equals(tradeInfo.trade_type) + && "WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) + || "taobao_trade_TradeMemoModified".equals(tradeInfo.trade_type)) { + // logger.info("[" + + // logTitle + "]最后修改时间|" + + // trades[i].tid + " + // :"+trades[i].modified); + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + logger.info("消息处理成功|[ {} ]:[ {} ] | [ {} ],[ {} ],已转交数据处理中心", + tradeInfo.trade_type, tradeInfo.shop_code, tradeInfo.seller_nick, + tradeInfo.tid); + } else if ("taobao_trade_TradeBuyerStepPay".equals(tradeInfo.trade_type)) { + // + OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + logger.info("消息处理成功,预售订单|[ {} ]:[ {} ] | [ {} ],[ {} ],已转交数据处理中心", + tradeInfo.trade_type, tradeInfo.shop_code, tradeInfo.seller_nick, + tradeInfo.tid); + } else { + logger.info("不符合条件的订单,放弃处理"); + logger.info("批量处理接口API返回订单数据:{}", tradeInfoString); + } + + } + } else { + logger.info("消息头为未处理的类型"); + logger.info("批量处理接口API返回订单数据:{}", tradeInfoString); + } + for (int i = 0; i < batch.size(); i++) { + Batch bt = batch.get(i); + if (cur_topic.equals(bt.topic) && cur_tid == bt.tid) { + batch.remove(i); + break; + } + } + } else if (json.has("error_response")) { + logger.info("异常订单返回结果:{}", tradeInfoString); + logger.info("批量处理接口API返回订单数据:{}", tradeInfoString); + if (tradeInfoString.indexOf("invalid-sessionkey") > -1) { + sessionkeysum++; + } + } else { + logger.info("异常订单返回结果:{}", tradeInfoString); + logger.info("批量处理接口API返回订单数据:{}", tradeInfoString); + } + } + } + } + + } catch (ApiException e) { + logger.error(this, e); + } catch (JSONException e) { + logger.error("error:JSON解析错误,{}\n{},时间->{}", e.getMessage(), trade_fullinfo_get_response, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.error(this, e); + } catch (Exception e) { + logger.error("error:其他异常,{}\n{},时间->{}", e.getMessage(), trade_fullinfo_get_response, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.error(this, e); + } finally { + try { + // 将失败的订单加入异常处理队列 + boolean allDeleteFlag = false; + if (sessionkeysum == batch.size()) { + allDeleteFlag = true; + } + String errorSessionKeyCode = ""; + for (int i = batch.size() - 1; i >= 0; i--) { + for (int j = 0; j < shops.size(); j++) { + if (batch.get(i).seller_nick.equals(shops.get(j).name) + && shops.get(j).order_sync_flag == 2) { + batch.get(i).sessionKey = shops.get(j).session_key; + batch.get(i).code = shops.get(j).code; + } + } + if (allDeleteFlag) { + OrderSyncs.updateShopStatus(batch.get(i).code, batch.get(i).seller_nick); + batch.remove(i); + continue; + } + if (errorSessionKeyCode.indexOf(batch.get(i).code) == -1) { + if (checkShopSessionKey(api_url, app_key, app_secret, batch.get(i).sessionKey)) { + errorSessionKeyCode = errorSessionKeyCode + " " + batch.get(i).code; + OrderSyncs.updateShopStatus(batch.get(i).code, batch.get(i).seller_nick); + batch.remove(i); + continue; + } + } else { + OrderSyncs.updateShopStatus(batch.get(i).code, batch.get(i).seller_nick); + batch.remove(i); + continue; + } + + Batch bt = batch.get(i); + MsgInfo msgInfo = new MsgInfo(bt.topic, bt.tid, bt.seller_nick, ++bt.exception_record); + if (msgInfo.exception_record == 1 && ("taobao_trade_TradeBuyerPay".equals(msgInfo.topic) + || "taobao_trade_TradeBuyerStepPay".equals(msgInfo.topic))) { + // 调用方法写入异常信息表 + ExceptionMessage em = new ExceptionMessage(); + em.msgInfo = msgInfo; + em.orderType = 1; + if (!recordExceptionOrders(em)) { + msgInfo.exception_record--; + } + } + exceptionMsgQueue.add(msgInfo); + logger.info("新订单|[ {} ]加入异常处理订单", msgInfo.tid); + + } + batch.clear(); + } catch (Exception e2) { + logger.error(this, e2); + } finally { + String tids = ""; + if (batch.size() > 0) { + for (int i = 0; i < batch.size(); i++) { + tids = tids + batch.get(i).tid + ","; + } + + } + // TODO 监控程序需要特别注意的地方 + logger.info("批量接口订单加入异常订单失败的单号|[ {} ]", tids); + } + + } + + } + + } + + /* + * private boolean getTradeRateByOid(String topic,long tid,long oid,String + * seller_nick){ boolean res = false; String tradeInfoString = ""; try { // + * 读取session_key ShopConfig cur_shopConfig = null; for (int i = 0; i < + * this.shops.size(); i++) { ShopConfig shopConfig = this.shops.get(i); if + * (seller_nick.equals(shopConfig.name)) { cur_shopConfig = shopConfig; break; } + * } if (cur_shopConfig == null) { logger.info("[" + logTitle + "]error:店铺:" + + * seller_nick + "配置不存在,订单" + ("主订单号|")+tid + "需人工处理!"); return true; } + * TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + * TmallTraderateFeedsGetRequest req = new TmallTraderateFeedsGetRequest(); + * req.setChildTradeId(oid); TmallTraderateFeedsGetResponse rsp = + * client.execute(req, cur_shopConfig.session_key); + * System.out.println(rsp.getBody()); } catch (Exception e) { + * + * } + * + * + * return res; } + */ + /** + * getTradeFullInfoByTid 调用API接口,根据订单号获取订单详情 + * + * @param long tid + * @param String seller_nick + * @return true/false + */ + private String getTradeFullInfoByTid(String topic, long tid, String seller_nick) { + String tradeInfoStr = ""; + TradeInfo tradeInfo = null; + try { + // 读取session_key + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", seller_nick, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + return "1"; + } + // API查询订单详细信息 + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields( + "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,orders.divide_order_fee,orders.part_mjz_discount,orders.sku_id,orders.num_iid,orders.oid,seller_flag" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee,modified"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, cur_shopConfig.session_key); + tradeInfoStr = rsp.getBody(); + if (null == rsp.getErrorCode() || "".equals(rsp.getErrorCode())) { + OrderSyncs.submitLog.ychLogQueue.add(String.valueOf(tid)); + } + tradeInfo = parseTradeInfo(tradeInfoStr, cur_shopConfig, topic); + + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("[ {} ] 返回订单:{}", seller_nick, tradeInfoStr); + return "2" + tradeInfoStr; + } + + if (("taobao_trade_TradeBuyerPay".equals(topic) && "WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) + || "taobao_trade_TradeMemoModified".equals(topic) + || "taobao_trade_TradeBuyerStepPay".equals(topic)) { + if ("".equals(tradeInfo.pay_time) && !"nopaid".equals(tradeInfo.type)) { + logger.info("[ {} ] :付款时间为空,放弃处理,订单详情:{}", tid, tradeInfoStr); + } else { + if ("taobao_trade_TradeBuyerPay".equals(topic) || "taobao_trade_TradeMemoModified".equals(topic)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + + logger.info("消息处理成功|[ {} ]:[ {} ],[ {} ],已转交数据处理中心", tradeInfo.trade_type, + tradeInfo.seller_nick, tradeInfo.tid); + } else if ("taobao_trade_TradeBuyerStepPay".equals(topic)) { + + OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + logger.info("消息处理成功,预售订单|[ {} ]:[ {} ],[ {} ],已转交数据处理中心", tradeInfo.trade_type, + tradeInfo.seller_nick, tradeInfo.tid); + } + + } + + return "1"; + } + return "1"; + } catch (ApiException e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } catch (Exception e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopConfig shopConfig, String topic) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = new JSONObject(jsonString); + + if (json.has("trade_fullinfo_get_response")) { + JSONObject trade_fullinfo_get_response = json.getJSONObject("trade_fullinfo_get_response"); + JSONObject trade = trade_fullinfo_get_response.getJSONObject("trade"); + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + tradeInfo.seller_nick = shopConfig.name; + tradeInfo.trade_type = topic; + tradeInfo.tid = trade.has("tid") ? trade.getString("tid") : ""; + // tradeInfo.tid = (Long.valueOf(tradeInfo.tid) + + // count_pressure) + ""; + // count_pressure++; + tradeInfo.status = trade.has("status") ? trade.getString("status") : ""; + tradeInfo.type = trade.has("type") ? trade.getString("type") : ""; + tradeInfo.alipay_no = trade.has("alipay_no") ? trade.getString("alipay_no") : ""; + // tradeInfo.alipay_id = trade.has("alipay_id") ? + // String.valueOf(trade.getLong("alipay_id")) : ""; + tradeInfo.num = 0; + tradeInfo.money = trade.has("payment") ? trade.getString("payment") : "0.0"; + tradeInfo.pay_money = trade.has("payment") ? trade.getString("payment") : "0.0";// 实收实付一致 + tradeInfo.created = trade.has("created") ? trade.getString("created") : ""; + tradeInfo.modified = trade.has("modified") ? trade.getString("modified") : ""; + tradeInfo.pay_time = trade.has("pay_time") ? trade.getString("pay_time") : ""; + tradeInfo.post_fee = trade.has("post_fee") ? trade.getString("post_fee") : "0.0"; + String encrpy_buyer_nick_name = trade.has("buyer_nick") ? trade.getString("buyer_nick") : ""; + String encrpy_name = trade.has("receiver_name") ? trade.getString("receiver_name") : ""; + tradeInfo.receiver_country = trade.has("receiver_country") ? trade.getString("receiver_country") : ""; + if (tradeInfo.receiver_country.equals("")) { + tradeInfo.receiver_country = "中国"; + } + tradeInfo.receiver_state = trade.has("receiver_state") ? trade.getString("receiver_state") : ""; + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + + tradeInfo.receiver_city = trade.has("receiver_city") ? trade.getString("receiver_city") : ""; + tradeInfo.receiver_district = trade.has("receiver_district") ? trade.getString("receiver_district") + : ""; + String encrpy_address = trade.getString("receiver_address"); + String encrpy_mobile = trade.has("receiver_mobile") ? trade.getString("receiver_mobile") : ""; + String encrpy_telephone = trade.has("receiver_phone") ? trade.getString("receiver_phone") : ""; + tradeInfo.receiver_zip = trade.has("receiver_zip") ? trade.getString("receiver_zip") : ""; + tradeInfo.buyer_message = trade.has("buyer_message") ? trade.getString("buyer_message") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + tradeInfo.seller_memo = trade.has("seller_memo") ? trade.getString("seller_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + + tradeInfo.product_fee = trade.has("total_fee") ? trade.getString("total_fee") : "0.0"; + tradeInfo.adjust_fee = trade.has("adjust_fee") ? trade.getString("adjust_fee") : "0.0"; + tradeInfo.discount_fee = trade.has("discount_fee") ? trade.getString("discount_fee") : "0.0"; + tradeInfo.pay_mode_id = 6; + tradeInfo.invoice_type = 0; + // 天猫 + + tradeInfo.seller_flag = trade.has("seller_flag") ? trade.getInt("seller_flag") : 0; + // 密文密码解密 + SecurityClient securityClient = new SecurityClient( + new DefaultTaobaoClient("https://eco.taobao.com/router/rest", app_key, app_secret), + security_key); + // if(securityClient.isEncryptData( tradeInfo.encrpy_address, + // "simple")){ + // tradeInfo.receiver_address = + // securityClient.decrypt(tradeInfo.encrpy_address, "simple", + // shopConfig.session_key); + // } + if (SecurityClient.isEncryptData(encrpy_buyer_nick_name, "simple")) { + tradeInfo.buyer_nick = securityClient.decrypt(encrpy_buyer_nick_name, "simple", + shopConfig.session_key); + tradeInfo.encrpy_buyer_nick_name = encrpy_buyer_nick_name; + } else { + tradeInfo.buyer_nick = encrpy_buyer_nick_name; + tradeInfo.encrpy_buyer_nick_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_telephone, "simple")) { + tradeInfo.receiver_phone = securityClient.decrypt(encrpy_telephone, "simple", + shopConfig.session_key); + tradeInfo.encrpy_telephone = encrpy_telephone; + } else { + tradeInfo.receiver_phone = encrpy_telephone; + tradeInfo.encrpy_telephone = ""; + } + if (SecurityClient.isEncryptData(encrpy_mobile, "phone")) { + tradeInfo.receiver_mobile = securityClient.decrypt(encrpy_mobile, "phone", shopConfig.session_key); + tradeInfo.encrpy_mobile = encrpy_mobile; + } else { + tradeInfo.receiver_mobile = encrpy_mobile; + tradeInfo.encrpy_mobile = ""; + } + if (SecurityClient.isEncryptData(encrpy_name, "simple")) { + tradeInfo.receiver_name = securityClient.decrypt(encrpy_name, "simple", shopConfig.session_key); + tradeInfo.encrpy_name = encrpy_name; + } else { + tradeInfo.receiver_name = encrpy_name; + tradeInfo.encrpy_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_address, "simple")) { + tradeInfo.receiver_address = securityClient.decrypt(encrpy_address, "simple", + shopConfig.session_key); + tradeInfo.encrpy_address = encrpy_address; + } else { + tradeInfo.receiver_address = encrpy_address; + tradeInfo.encrpy_address = ""; + } + // 淘宝平台的新版加密字段 + tradeInfo.oaid = trade.has("oaid") ? trade.getString("oaid") : ""; + + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; + JSONObject orders = trade.getJSONObject("orders"); + JSONArray aOrder = orders.getJSONArray("order"); + tradeInfo.orders = new OrderInfo[aOrder.length()]; + for (int i = 0; i < aOrder.length(); i++) { + JSONObject order = aOrder.getJSONObject(i); + OrderInfo orderInfo = new OrderInfo(); + orderInfo.outer_sku_id = order.has("outer_sku_id") ? order.getString("outer_sku_id") : ""; + orderInfo.outer_iid = order.has("outer_iid") ? order.getString("outer_iid") : ""; + orderInfo.platform_seller_code = (orderInfo.outer_sku_id.equals("") ? orderInfo.outer_iid + : orderInfo.outer_sku_id); + if (orderInfo.platform_seller_code == null) { + orderInfo.platform_seller_code = ""; + } + + orderInfo.num = order.has("num") ? order.getInt("num") : 0; + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = order.has("price") ? order.getString("price") : "0.0"; + // orderInfo.payment = order.has("payment") ? + // order.getString("payment") : "0.0"; + orderInfo.title = order.has("title") ? order.getString("title") : ""; + orderInfo.sku_properties_name = order.has("sku_properties_name") + ? order.getString("sku_properties_name") + : ""; + orderInfo.discount_fee = order.has("discount_fee") ? order.getString("discount_fee") : "0.0"; + orderInfo.total_fee = order.has("total_fee") ? order.getString("total_fee") : "0.0"; + orderInfo.adjust_fee = order.has("adjust_fee") ? order.getString("adjust_fee") : "0.0"; + orderInfo.status = order.has("status") ? order.getString("status") : ""; + orderInfo.payment = orderInfo.divide_order_fee = order.has("divide_order_fee") + ? order.getString("divide_order_fee") + : "0.0"; + orderInfo.part_mjz_discount = order.has("part_mjz_discount") ? order.getString("part_mjz_discount") + : "0.0"; + orderInfo.oid = order.has("oid") ? order.getLong("oid") + "" : ""; + orderInfo.sku_id = order.has("sku_id") ? order.getString("sku_id") : order.getLong("num_iid") + ""; + orderInfo.productItemID_dd = ""; + orderInfo.gift_type = 1; + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } else { + // api接口错误处理 + + if (jsonString.indexOf("invalid-sessionkey") > -1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺授权码过期:[ {} ] | [ {} ]", shopConfig.code, shopConfig.name); + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺从原appkey:[ {} ]删除!", shopConfig.code, shopConfig.name, + app_key); + break; + } + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查", ""); + } + } + return null; + } + + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /* + * 分销----代销 + * + */ + private String getAgentFenXiaoTradeFullInfoByTid(String topic, long fenxiao_id, String seller_nick) { + String tradeInfoStr = ""; + TradeInfo tradeInfo = null; + try { + // 读取session_key + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", seller_nick, fenxiao_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + return "1"; + } + + // API查询订单详细信息 + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + FenxiaoOrdersGetRequest req = new FenxiaoOrdersGetRequest(); + req.setPurchaseOrderId(fenxiao_id); + req.setFields( + "fenxiao_id,tc_order_id,supplier_memo,status,trade_type,alipay_no,distributor_payment,created,modified,pay_time,post_fee,buyer_nick,receiver,memo,order_messages,total_fee,distributor_username," + + "sub_purchase_orders.item_outer_id,sub_purchase_orders.sku_outer_id,sub_purchase_orders.sku_id,sub_purchase_orders.item_id,sub_purchase_orders.num,sub_purchase_orders.price,sub_purchase_orders.distributor_payment," + + "sub_purchase_orders.title,sub_purchase_orders.sku_properties,sub_purchase_orders.fenxiao_id,sub_purchase_orders.tc_discount_fee,sub_purchase_orders.total_fee,sub_purchase_orders.tc_adjust_fee,sub_purchase_orders.status"); + FenxiaoOrdersGetResponse rsp = client.execute(req, cur_shopConfig.session_key); + tradeInfoStr = rsp.getBody(); + logger.info("分销-代销订单返回:{}", tradeInfoStr); + tradeInfo = parseAgentFenXiaoTradeInfo(tradeInfoStr, cur_shopConfig, topic); + + if (tradeInfo == null) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + JSONObject json = new JSONObject(tradeInfoStr); + String result = "淘宝平台故障,请联系软维ERP排查"; + if (json.has("fenxiao_orders_get_response")) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + + logger.info("error:解析订单详情错误!时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return "2" + tradeInfoStr; + } + if ("".equals(tradeInfo.pay_time)) { + logger.info("[ {} ]:付款时间为空,放弃处理", fenxiao_id); + return "1"; + } + tradeInfo.seller_nick = seller_nick; + + if ("WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + if (recatchConfig.type == 1) { + return "4"; + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return "1"; + } catch (ApiException e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } catch (Exception e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } + } + + // 代理 + private TradeInfo parseAgentFenXiaoTradeInfo(String jsonString, ShopConfig shopConfig, String topic) { + try { + + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = new JSONObject(jsonString); + + // api接口错误处理 + if (json.has("error_response")) { + if (jsonString.indexOf("invalid-sessionkey") > -1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ]店铺从原appkey:[ {} ]删除!", shopConfig.code, app_key); + break; + } + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查", ""); + } + } + return null; + } + + JSONObject fenxiao_orders_get_response = json.getJSONObject("fenxiao_orders_get_response"); + JSONObject purchase_orders = fenxiao_orders_get_response.getJSONObject("purchase_orders"); + int total_results = fenxiao_orders_get_response.getInt("total_results"); + if (total_results < 1) { + return null; + } + JSONArray purchase_order_array = purchase_orders.getJSONArray("purchase_order"); + JSONObject trade = purchase_order_array.getJSONObject(0); + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + tradeInfo.trade_type = topic; + tradeInfo.seller_nick = shopConfig.name; + tradeInfo.tid = trade.has("fenxiao_id") ? trade.getLong("fenxiao_id") + "" : ""; + tradeInfo.status = trade.has("status") ? trade.getString("status") : ""; + tradeInfo.type = ""; + tradeInfo.alipay_no = trade.has("alipay_no") ? trade.getString("alipay_no") : ""; + + // tradeInfo.alipay_id = trade.has("alipay_id") ? + // trade.getString("alipay_id") : ""; + tradeInfo.num = 0; + tradeInfo.money = trade.has("distributor_payment") ? trade.getString("distributor_payment") : ""; + tradeInfo.pay_money = trade.has("distributor_payment") ? trade.getString("distributor_payment") : "";// 实收实付一致 + tradeInfo.created = trade.has("created") ? trade.getString("created") : ""; + tradeInfo.modified = trade.has("modified") ? trade.getString("modified") : ""; + tradeInfo.pay_time = trade.has("pay_time") ? trade.getString("pay_time") : ""; + tradeInfo.post_fee = trade.has("post_fee") ? trade.getString("post_fee") : "0.0"; + // tradeInfo.buyer_nick = trade.has("buyer_nick") ? + // trade.getString("buyer_nick") : "";//供应商查询不会返回此字段,只有经销商查询才会返回 + + JSONObject receiver = trade.getJSONObject("receiver"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = receiver.has("state") ? receiver.getString("state") : ""; + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = receiver.has("city") ? receiver.getString("city") : ""; + tradeInfo.receiver_district = receiver.has("district") ? receiver.getString("district") : ""; + tradeInfo.receiver_zip = receiver.has("zip") ? receiver.getString("zip") : ""; + + String encrpy_buyer_nick_name = trade.has("distributor_username") ? trade.getString("distributor_username") + : ""; + + String encrpy_name = receiver.has("name") ? receiver.getString("name") : ""; + String encrpy_address = receiver.getString("address"); + String encrpy_mobile = receiver.has("mobile_phone") ? receiver.getString("mobile_phone") : ""; + String encrpy_telephone = receiver.has("phone") ? receiver.getString("phone") : ""; + + // 密文密码解密 + SecurityClient securityClient = new SecurityClient( + new DefaultTaobaoClient("https://eco.taobao.com/router/rest", app_key, app_secret), + "Z8lJ15F4HA4EhPHbrNlmjIPe7c0jnezbHSFpRhgC0X4="); + if (SecurityClient.isEncryptData(encrpy_buyer_nick_name, "simple")) { + tradeInfo.buyer_nick = securityClient.decrypt(encrpy_buyer_nick_name, "simple", shopConfig.session_key); + tradeInfo.encrpy_buyer_nick_name = encrpy_buyer_nick_name; + } else { + tradeInfo.buyer_nick = encrpy_buyer_nick_name; + tradeInfo.encrpy_buyer_nick_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_telephone, "simple")) { + tradeInfo.receiver_phone = securityClient.decrypt(encrpy_telephone, "simple", shopConfig.session_key); + tradeInfo.encrpy_telephone = encrpy_telephone; + } else { + tradeInfo.receiver_phone = encrpy_telephone; + tradeInfo.encrpy_telephone = ""; + } + if (SecurityClient.isEncryptData(encrpy_mobile, "phone")) { + tradeInfo.receiver_mobile = securityClient.decrypt(encrpy_mobile, "phone", shopConfig.session_key); + tradeInfo.encrpy_mobile = encrpy_mobile; + } else { + tradeInfo.receiver_mobile = encrpy_mobile; + tradeInfo.encrpy_mobile = ""; + } + if (SecurityClient.isEncryptData(encrpy_name, "simple")) { + tradeInfo.receiver_name = securityClient.decrypt(encrpy_name, "simple", shopConfig.session_key); + tradeInfo.encrpy_name = encrpy_name; + } else { + tradeInfo.receiver_name = encrpy_name; + tradeInfo.encrpy_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_address, "simple")) { + tradeInfo.receiver_address = securityClient.decrypt(encrpy_address, "simple", shopConfig.session_key); + tradeInfo.encrpy_address = encrpy_address; + } else { + tradeInfo.receiver_address = encrpy_address; + tradeInfo.encrpy_address = ""; + } + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\"", ""); + // 去双引号 + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\"", ""); + // 去双引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\'", ""); + // 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; + + // 淘宝平台的新版加密字段 + tradeInfo.oaid = receiver.has("oaid") ? receiver.getString("oaid") : ""; + + tradeInfo.buyer_message = trade.has("memo") ? trade.getString("memo") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + + tradeInfo.seller_memo = trade.has("supplier_memo") ? trade.getString("supplier_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + /* + * // 包括买家留言,卖家留言,代销商留言 if (trade.has("order_messages")) { JSONObject + * order_messages = trade.getJSONObject("order_messages"); JSONArray messages = + * order_messages.getJSONArray("order_message"); String mss = ""; for (int i = + * 0; i < messages.length(); i++) { if + * ("供应商留言".equals(messages.getJSONObject(i).getString( "message_title"))) { + * tradeInfo.seller_memo = messages.getJSONObject(i).getString("message_title") + * + ":" + messages.getJSONObject(i).getString("message_time") + "," + + * messages.getJSONObject(i).getString("message_content") + "。"; } mss += + * messages.getJSONObject(i).getString("message_title") + ":" + + * messages.getJSONObject(i).getString("message_time") + "," + + * messages.getJSONObject(i).getString("message_content") + "。"; } + * tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + * tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + * } + */ + + tradeInfo.product_fee = trade.has("total_fee") ? trade.getString("total_fee") : "0.0"; + tradeInfo.adjust_fee = trade.has("adjust_fee") ? trade.getString("adjust_fee") : "0.0"; + tradeInfo.discount_fee = trade.has("discount_fee") ? trade.getString("discount_fee") : "0.0"; + tradeInfo.pay_mode_id = 6; + tradeInfo.invoice_type = 0; + // 天猫供销平台 + + // 只针对于天猫供销平台的订单相应信息 + // tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + FenxiaoInfo fxInfo = new FenxiaoInfo(); + fxInfo.distributor_username = tradeInfo.buyer_nick; + fxInfo.buyer_payment = tradeInfo.money; + fxInfo.tc_order_id = trade.has("tc_order_id") ? trade.getLong("tc_order_id") + "" : ""; + // fxInfo.tc_order_id = tradeInfo.tid; + fxInfo.trade_type = 1; + fxInfo.status = tradeInfo.status; + tradeInfo.fenxiaoInfo = fxInfo; + + JSONObject orders = trade.getJSONObject("sub_purchase_orders"); + JSONArray aOrder = orders.getJSONArray("sub_purchase_order"); + tradeInfo.orders = new OrderInfo[0]; + + for (int i = 0; i < aOrder.length(); i++) { + JSONObject order = aOrder.getJSONObject(i); + String status = order.has("status") ? order.getString("status") : ""; + /** + * 如果子条目的状态不是待发货,则不写入订单 + */ + if (!"WAIT_SELLER_SEND_GOODS".equals(status)) { + continue; + } + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.outer_sku_id = order.has("sku_outer_id") ? order.getString("sku_outer_id") : ""; + orderInfo.outer_iid = order.has("item_outer_id") ? order.getString("item_outer_id") : ""; + orderInfo.platform_seller_code = (orderInfo.outer_sku_id.equals("") ? orderInfo.outer_iid + : orderInfo.outer_sku_id); + + orderInfo.num = order.has("num") ? order.getInt("num") : 0; + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = order.has("price") ? order.getString("price") : "0.0"; + orderInfo.divide_order_fee = orderInfo.payment = order.has("distributor_payment") + ? order.getString("distributor_payment") + : "0.0"; + orderInfo.title = order.has("title") ? order.getString("title") : ""; + orderInfo.sku_properties_name = order.has("sku_properties") ? order.getString("sku_properties") : ""; + orderInfo.discount_fee = order.has("tc_discount_fee") + ? ((double) order.getLong("tc_discount_fee") / 100) + "" + : "0.0"; + orderInfo.total_fee = order.has("total_fee") ? order.getString("total_fee") : "0.0"; + orderInfo.adjust_fee = order.has("tc_adjust_fee") ? ((double) order.getLong("tc_adjust_fee") / 100) + "" + : "0.0"; + orderInfo.status = order.has("status") ? order.getString("status") : ""; + orderInfo.order_buyer_payment = order.has("buyer_payment") ? order.getString("buyer_payment") : "0.0"; + orderInfo.oid = order.has("fenxiao_id") ? order.getLong("fenxiao_id") + "" : ""; + orderInfo.sku_id = order.has("sku_id") ? order.getLong("sku_id") + "" : order.getLong("item_id") + ""; + orderInfo.productItemID_dd = ""; + orderInfo.gift_type = 1; + // tradeInfo.orders[i] = orderInfo; + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = orderInfo; + } + /** + * 如果订单中所有的子条目都不符合发货,那么订单不写入系统 在正常天猫供销平台系统不出问题的情况下,补抓单可能会遇到这种情况 + */ + if (tradeInfo.orders.length == 0) { + return null; + } + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * 解析分销-经销订单 + * + * @author Lewis + * + */ + private String getDealerFenXiaoTradeFullInfoByTid(String topic, long fenxiao_id, String seller_nick) { + String tradeInfoStr = ""; + TradeInfo tradeInfo = null; + try { + // 读取session_key + ShopConfig cur_shopConfig = null; + for (int i = 0; i < this.shops.size(); i++) { + ShopConfig shopConfig = this.shops.get(i); + if (seller_nick.equals(shopConfig.name)) { + cur_shopConfig = shopConfig; + break; + } + } + if (cur_shopConfig == null) { + logger.info("error:店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!时间->{}", seller_nick, fenxiao_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + return "1"; + } + + // API查询订单详细信息 + TaobaoClient client = new DefaultTaobaoClient(api_url, app_key, app_secret); + FenxiaoDealerRequisitionorderQueryRequest req = new FenxiaoDealerRequisitionorderQueryRequest(); + req.setDealerOrderIds(String.valueOf(fenxiao_id)); + req.setFields( + "dealer_order_id,supplier_memo,pay_time,alipay_no,applier_nick,refuse_reason_supplier,refuse_reason_applier,close_reason,quantity_count,total_price,applied_time,modified_time,audit_time_supplier,audit_time_applier,delivered_quantity_count,order_status,logistics_fee,pay_type,logistics_type," + + "receiver.name,receiver.phone,receiver.mobile_phone,receiver.mobile_phone,receiver.address,receiver.district,receiver.city,receiver.zip,receiver.state,receiver.card_id,rebate_fee,dealer_order_details.sku_number,dealer_order_details.dealer_detail_id,dealer_order_details.product_title," + + "dealer_order_details.sku_id,dealer_order_details.sku_spec,dealer_order_details.sku_number,dealer_order_details.original_price,dealer_order_details.final_price,dealer_order_details.quantity,dealer_order_details.price_count,dealer_order_details.is_deleted"); + FenxiaoDealerRequisitionorderQueryResponse rsp = client.execute(req, cur_shopConfig.session_key); + + tradeInfoStr = rsp.getBody(); + logger.info("分销-经销订单返回:{}", tradeInfoStr); + tradeInfo = parseDealerFenXiaoTradeInfo(tradeInfoStr, cur_shopConfig, topic); + + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + + JSONObject json = new JSONObject(tradeInfoStr); + String result = "淘宝平台故障,请联系软维ERP排查"; + if (json.has("fenxiao_dealer_requisitionorder_query_response")) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + + logger.info("error:解析订单详情错误!时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return "2" + tradeInfoStr; + } + if ("".equals(tradeInfo.pay_time)) { + logger.info("[ {} ]:付款时间为空,放弃处理,时间->{}", fenxiao_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return "1"; + } + tradeInfo.seller_nick = seller_nick; + + if ("WAIT_FOR_SUPPLIER_DELIVER".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return "1"; + } catch (ApiException e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } catch (Exception e) { + logger.error(this, e); + logger.info("API返回订单数据:{}", tradeInfoStr); + + return "3" + e.getMessage(); + } + } + + private TradeInfo parseDealerFenXiaoTradeInfo(String jsonString, ShopConfig shopConfig, String topic) { + try { + + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = new JSONObject(jsonString); + + // api接口错误处理 + if (json.has("error_response")) { + if (jsonString.indexOf("invalid-sessionkey") > -1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int i = 0; i < shops.size(); i++) { + ShopConfig sc = shops.get(i); + if (shopConfig.code.equals(sc.code)) { + shops.remove(i); + logger.info("店铺配置更新:[ {} ]店铺从原appkey:[ {} ]删除!", shopConfig.code, app_key); + break; + } + } + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "淘宝平台故障,请联系软维ERP排查", ""); + } + } + return null; + } + + JSONObject fenxiao_dealer_requisitionorder_query_response = json + .getJSONObject("fenxiao_dealer_requisitionorder_query_response"); + JSONObject dealer_orders = fenxiao_dealer_requisitionorder_query_response.getJSONObject("dealer_orders"); + JSONArray dealer_order = dealer_orders.getJSONArray("dealer_order"); + if (dealer_order.length() < 1) { + return null; + } + JSONObject trade = dealer_order.getJSONObject(0); + + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopConfig, recatchConfig); + + tradeInfo.trade_type = topic; + tradeInfo.tid = trade.has("dealer_order_id") ? trade.getLong("dealer_order_id") + "" : ""; + tradeInfo.status = trade.has("order_status") ? trade.getString("order_status") : ""; + tradeInfo.type = ""; + tradeInfo.alipay_no = trade.has("alipay_no") ? trade.getString("alipay_no") : ""; + String logistics_type = trade.has("logistics_type") ? trade.getString("logistics_type") : ""; + if ("SELF_PICKUP".equals(logistics_type)) { + tradeInfo.delivery_mode_id = 10; + } else { + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + } + + // tradeInfo.alipay_id = trade.has("alipay_id") ? + // trade.getString("alipay_id") : ""; + tradeInfo.num = 0; + tradeInfo.money = trade.has("total_price") ? trade.getString("total_price") : ""; + tradeInfo.pay_money = trade.has("total_price") ? trade.getString("total_price") : "";// 实收实付一致 + tradeInfo.created = trade.has("applied_time") ? trade.getString("applied_time") : ""; + tradeInfo.modified = trade.has("modified_time") ? trade.getString("modified_time") : ""; + tradeInfo.pay_time = trade.has("pay_time") ? trade.getString("pay_time") : ""; + tradeInfo.post_fee = trade.has("logistics_fee") ? trade.getString("logistics_fee") : "0.0"; + // tradeInfo.buyer_nick = trade.has("buyer_nick") ? + // trade.getString("buyer_nick") : "";//供应商查询不会返回此字段,只有经销商查询才会返回 + + JSONObject receiver = trade.getJSONObject("receiver"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = receiver.has("state") ? receiver.getString("state") : ""; + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = receiver.has("city") ? receiver.getString("city") : ""; + tradeInfo.receiver_district = receiver.has("district") ? receiver.getString("district") : ""; + tradeInfo.receiver_zip = receiver.has("zip") ? receiver.getString("zip") : ""; + + String encrpy_buyer_nick_name = trade.has("applier_nick") ? trade.getString("applier_nick") : ""; + String encrpy_name = receiver.has("name") ? receiver.getString("name") : ""; + String encrpy_address = receiver.getString("address"); + String encrpy_mobile = receiver.has("mobile_phone") ? receiver.getString("mobile_phone") : ""; + String encrpy_telephone = receiver.has("phone") ? receiver.getString("phone") : ""; + // 密文密码解密 + SecurityClient securityClient = new SecurityClient( + new DefaultTaobaoClient("https://eco.taobao.com/router/rest", app_key, app_secret), + "Z8lJ15F4HA4EhPHbrNlmjIPe7c0jnezbHSFpRhgC0X4="); + // if(securityClient.isEncryptData( tradeInfo.encrpy_address, + // "simple")){ + // tradeInfo.receiver_address = + // securityClient.decrypt(tradeInfo.encrpy_address, "simple", + // shopConfig.session_key); + // } + if (SecurityClient.isEncryptData(encrpy_buyer_nick_name, "simple")) { + tradeInfo.buyer_nick = securityClient.decrypt(encrpy_buyer_nick_name, "simple", shopConfig.session_key); + tradeInfo.encrpy_buyer_nick_name = encrpy_buyer_nick_name; + } else { + tradeInfo.buyer_nick = encrpy_buyer_nick_name; + tradeInfo.encrpy_buyer_nick_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_telephone, "simple")) { + tradeInfo.receiver_phone = securityClient.decrypt(encrpy_telephone, "simple", shopConfig.session_key); + tradeInfo.encrpy_telephone = encrpy_telephone; + } else { + tradeInfo.receiver_phone = encrpy_telephone; + tradeInfo.encrpy_telephone = ""; + } + if (SecurityClient.isEncryptData(encrpy_mobile, "phone")) { + tradeInfo.receiver_mobile = securityClient.decrypt(encrpy_mobile, "phone", shopConfig.session_key); + tradeInfo.encrpy_mobile = encrpy_mobile; + } else { + tradeInfo.receiver_mobile = encrpy_mobile; + tradeInfo.encrpy_mobile = ""; + } + if (SecurityClient.isEncryptData(encrpy_name, "simple")) { + tradeInfo.receiver_name = securityClient.decrypt(encrpy_name, "simple", shopConfig.session_key); + tradeInfo.encrpy_name = encrpy_name; + } else { + tradeInfo.receiver_name = encrpy_name; + tradeInfo.encrpy_name = ""; + } + if (SecurityClient.isEncryptData(encrpy_address, "simple")) { + tradeInfo.receiver_address = securityClient.decrypt(encrpy_address, "simple", shopConfig.session_key); + tradeInfo.encrpy_address = encrpy_address; + } else { + tradeInfo.receiver_address = encrpy_address; + tradeInfo.encrpy_address = ""; + } + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; + + // tradeInfo.buyer_message = trade.has("memo") ? + // trade.getString("memo") : ""; + // tradeInfo.buyer_message = + // tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + // tradeInfo.buyer_message = + // tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + + tradeInfo.seller_memo = trade.has("supplier_memo") ? trade.getString("supplier_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + + tradeInfo.product_fee = tradeInfo.money; + tradeInfo.adjust_fee = "0.0"; + tradeInfo.discount_fee = trade.has("rebate_fee") ? trade.getString("rebate_fee") : "0.0"; + tradeInfo.pay_mode_id = 6; + tradeInfo.invoice_type = 0; + // 天猫供销平台 + + // 只针对于天猫供销平台的订单相应信息 + // tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + FenxiaoInfo fxInfo = new FenxiaoInfo(); + fxInfo.distributor_username = tradeInfo.buyer_nick; + fxInfo.buyer_payment = tradeInfo.money; + fxInfo.tc_order_id = trade.has("dealer_order_id") ? trade.getLong("dealer_order_id") + "" : ""; + fxInfo.trade_type = 2; + fxInfo.status = tradeInfo.status; + tradeInfo.fenxiaoInfo = fxInfo; + + JSONObject orders = trade.getJSONObject("dealer_order_details"); + JSONArray aOrder = orders.getJSONArray("dealer_order_detail"); + // tradeInfo.orders = new OrderInfo[aOrder.length()]; + tradeInfo.orders = new OrderInfo[0]; + + for (int i = 0; i < aOrder.length(); i++) { + JSONObject order = aOrder.getJSONObject(i); + boolean is_deleted = order.getBoolean("is_deleted"); + /** + * 如果子条目标注为is_deleted 为true,说明子条目已经删除,则不添加到订单中 + */ + if (is_deleted) { + continue; + } + OrderInfo orderInfo = new OrderInfo(); + String original_price = order.has("original_price") ? order.getString("original_price") : "0.0"; + orderInfo.outer_sku_id = order.has("sku_number") ? order.getString("sku_number") : ""; + orderInfo.outer_iid = ""; + orderInfo.platform_seller_code = (orderInfo.outer_sku_id.equals("") ? orderInfo.outer_iid + : orderInfo.outer_sku_id); + + orderInfo.num = order.has("quantity") ? order.getInt("quantity") : 0; + tradeInfo.num += orderInfo.num;// 计算订单总数量price_count + orderInfo.divide_order_fee = orderInfo.payment = order.has("price_count") + ? order.getString("price_count") + : "0.0"; + orderInfo.price = order.has("final_price") ? order.getString("final_price") : "0.0"; + orderInfo.title = order.has("product_title") ? order.getString("product_title") : ""; + orderInfo.sku_properties_name = order.has("sku_spec") ? order.getString("sku_spec") : ""; + orderInfo.discount_fee = (Double.valueOf(original_price) - Double.valueOf(orderInfo.price)) + * orderInfo.num + ""; + orderInfo.total_fee = orderInfo.divide_order_fee; + orderInfo.adjust_fee = "0.0"; + orderInfo.status = ""; + orderInfo.order_buyer_payment = orderInfo.price; + orderInfo.oid = order.has("dealer_detail_id") ? order.getLong("dealer_detail_id") + "" : ""; + orderInfo.sku_id = order.has("sku_id") ? order.getLong("sku_id") + "" : order.getLong("item_id") + ""; + orderInfo.productItemID_dd = ""; + orderInfo.gift_type = 1; + // tradeInfo.orders[i] = orderInfo; + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = orderInfo; + } + /** + * 如果订单中所有的子条目都被删除,那么订单不写入系统 在正常天猫供销平台系统不出问题的情况下,补抓单可能会遇到这种情况 + */ + if (tradeInfo.orders.length == 0) { + return null; + } + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + // 异常数量线程 + private class ExceptionQueueThread extends Thread { + @Override + public void run() { + try { + logger.info("消息处理异常队列总数:新订单及修改备注消息队列异常数:[ {} ],退款消息队列异常数:[ {} ]", exceptionMsgQueue.size(), + exceptionMsgQueue_refund.size()); + // 新订单及修改备注消息 + while (exceptionMsgQueue.size() > 0) { + MsgInfo msgInfo = exceptionMsgQueue.get(0); + msgQueue.add(msgInfo); + exceptionMsgQueue.remove(0); + } + // while (exceptionMsgQueue_s.size() > 0) { + // MsgInfo msgInfo = exceptionMsgQueue_s.get(0); + // msgQueue_s.add(msgInfo); + // exceptionMsgQueue_s.remove(0); + // } + // 退款消息 + while (exceptionMsgQueue_refund.size() > 0) { + RefundMsgInfo refundMsgInfo = exceptionMsgQueue_refund.get(0); + msgQueue_refund.add(refundMsgInfo); + exceptionMsgQueue_refund.remove(0); + } + /** + * 分销-代销消息 + */ + while (exceptionAgentFenXiaoMsgQueue.size() > 0) { + MsgInfo agentFenXiaoMsgInfo = exceptionAgentFenXiaoMsgQueue.get(0); + msgQueue_fenxiao_agent.add(agentFenXiaoMsgInfo); + exceptionAgentFenXiaoMsgQueue.remove(0); + } + /** + * 分销-经销消息 + */ + while (exceptionDealerFenXiaoMsgQueue.size() > 0) { + MsgInfo dealerFenXiaoMsgInfo = exceptionDealerFenXiaoMsgQueue.get(0); + msgQueue_fenxiao_dealer.add(dealerFenXiaoMsgInfo); + exceptionDealerFenXiaoMsgQueue.remove(0); + } + /** + * 买家退货给卖家消息 + */ + while (exceptionMsgQueue_refund_returngoods.size() > 0) { + RefundMsgInfo refundReturnGoodsMsgInfo = exceptionMsgQueue_refund_returngoods.get(0); + msgQueue_refund_returngoods.add(refundReturnGoodsMsgInfo); + exceptionMsgQueue_refund_returngoods.remove(0); + } + /** + * 买家退货给卖家消息 + */ + while (exceptionMsgQueue_refundClosed.size() > 0) { + RefundMsgInfo refundClosedMsgInfo = exceptionMsgQueue_refundClosed.get(0); + msgQueue_refundClosed.add(refundClosedMsgInfo); + exceptionMsgQueue_refundClosed.remove(0); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 分销订单重试3次,超过3次放弃处理 + * + * @param content + */ + /* + * private void loop_fenXiao(String content) { if (count_fenxiao >= 3) { // + * 错误重试次数超过3次,放弃处理此消息,不含初始处理的1次 logger.info("[" + logTitle + "]分销订单处理重试超限,放弃处理|" + * + content); msgQueue_fenxiao.remove(0); count_fenxiao = 0; flag_check_fenXiao + * = true; } else { count_fenxiao += 1; logger.info("分销评价订单第" + count_fenxiao + + * "次重试|" + content); } } + */ + /* + * (确认无用的话记得删除) public class ShopMsg{ private String delivery_score; private + * String service_score; private String item_score; private String shop_code; + * private String shop_name; private String platform_code; private String + * company_code; private String modefied; } + */ + // 冒泡排序 + private void sort(TradeInfo[] trades) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + for (int i = 0; i < trades.length; i++) { + for (int j = i; j < trades.length; j++) { + if ("".equals(trades[i].modified)) { + trades[i].modified = "1970-1-1 00:00:00"; + } + if ("".equals(trades[j].modified)) { + trades[j].modified = "1970-1-1 00:00:00"; + } + if (sdf.parse(trades[i].modified).after(sdf.parse(trades[j].modified))) { + TradeInfo tmp = trades[i]; + trades[i] = trades[j]; + trades[j] = tmp; + } + } + } + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * 记录异常订单到数据库,对于多次尝试失败的订单也只记录一次 + * + * @param em + * @return + */ + private boolean recordExceptionOrders(ExceptionMessage em) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + try { + conn = dbpc.getConnection(); + // conn.setAutoCommit(false); + String sql = "insert into tb_problem_order(shop_name,platform_order_code,problem_detail,type,status) values(?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, em.msgInfo.seller_nick); + ps.setString(2, em.msgInfo.tid + ""); + ps.setString(3, em.errorMessage); + ps.setInt(4, em.orderType); + ps.setInt(5, 1); + if (ps.executeUpdate() == 0) { + return false; + } + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + // try { + // conn.setAutoCommit(true); + // } catch (SQLException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + // 读取xls表格 + // private boolean initFilexls() { + // boolean res = false; + // jxl.Workbook readwb = null; + // try { + // InputStream instream = new FileInputStream("trade.xls"); + // + // readwb = Workbook.getWorkbook(instream); + // Sheet readsheet = readwb.getSheet(0); + // // int rsColumns = readsheet.getColumns(); + // int rsRows = readsheet.getRows(); + // for (int i = 1; i < rsRows - 1; i++) { + // Cell cell = readsheet.getCell(2, i); + // String platform_code = cell.getContents(); + // MsgInfo msgInfo = new MsgInfo("taobao_trade_TradeBuyerPay", + // Long.valueOf(platform_code), "膳魔师新实专卖店", 0); + // msgQueue.add(msgInfo); + // } + // res = true; + // } catch (Exception e) { + // logger.error(this, e); + // } finally { + // readwb.close(); + // } + // return res; + // } + + /** + * getShopRemainShowcaseInfo(检查session key是否有效) 调用淘宝API接口 + * + * @throws ApiException + * + */ + private boolean checkShopSessionKey(String api_url, String appkey, String secret, String sessionKey) { + + try { + TaobaoClient client = new DefaultTaobaoClient("https://gw.api.taobao.com/router/rest", appkey, secret); + RefundsReceiveGetRequest req = new RefundsReceiveGetRequest(); + req.setFields("refund_id"); + req.setStartModified(new Date()); + req.setEndModified(new Date()); + RefundsReceiveGetResponse rsp = client.execute(req, sessionKey); + String jsonString = rsp.getBody(); + if (jsonString.indexOf("invalid-sessionkey") > -1) { + return true; + } + } catch (ApiException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return false; + + } + + /** + * + * @title: getShopPlatFormAccount + * @description: 根据平台订单号查询店铺platform_account + * @param tid + * @return + */ + private String getShopPlatFormAccount(String tid) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + if ("0".equals(tid)) { + return ""; + } + String sql = "SELECT ts.platform_account,tso.platform_code FROM tb_shop ts,tb_sale_order tso WHERE ts.`code` = tso.shop_code " + + "AND ts.platform_code IN(\"001\",\"002\",\"012\") AND tso.platform_code = ?"; + conn = dbpc.getConnection(); + ps = conn.prepareStatement(sql); + ps.setString(1, tid); + rs = ps.executeQuery(); + if (rs.next()) { + return rs.getString("platform_account") == null ? "" : rs.getString("platform_account"); + } + return ""; + + } catch (Exception e) { + logger.error(this, e); + return "error"; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + conn = null; + } + dbpc = null; + } + + } + +} diff --git a/src/com/since/emp/service/ApiVip.java b/src/com/since/emp/service/ApiVip.java new file mode 100644 index 0000000..3edfa0c --- /dev/null +++ b/src/com/since/emp/service/ApiVip.java @@ -0,0 +1,1235 @@ +package com.since.emp.service; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.newplatform.service.Transform; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; + +import vipapis.marketplace.delivery.GetOrdersResponse; + +/** + * 唯品会API请求接口默认设置连接超时时长为5秒,读超时时长为30秒,提供显示设置方法,目前调用未更改 + * + * @description + * @author Lewis + * @file_name ApiVip.java + * @date 2019年4月23日 + */ +public class ApiVip { + private static final Logger logger = LogManager.getLogger(ApiVip.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private List payServiceTypeDic; + + private Vector refundQueue; + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + // private Vector exceptionOrderQueue; + + /* + * public class ShopOrderInfo { String refundId; String tid; ShopConfig + * shopConfig; String app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig,String app_key, String + * app_secret) { this.tid = tid; this.shopConfig = shopConfig; this.app_key = + * app_key; this.app_secret = app_secret; } } + */ + + private class Dic { + String code; + String name; + + public Dic(String code, String name) { + this.code = code; + this.name = name; + } + } + + private void initDic() { + payServiceTypeDic = Collections.synchronizedList(new ArrayList()); + payServiceTypeDic.add(new Dic("微信支付", "8")); + } + + public ApiVip(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + this.initDic(); + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(platConfig.apps.get(0).shops.get(0)); + // recatchOrderThread.start(); + threadPool.execute(recatchOrderThread); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + // ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + // platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + // platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", platConfig.apps.get(0).shops.get(0).code, + platConfig.apps.get(0).shops.get(0).name, recatchConfig.orderId); + for (int i = 0; i < platConfig.apps.size(); i++) { + AppConfig cur_appConfig = platConfig.apps.get(i); + for (int j = 0; j < cur_appConfig.shops.size(); j++) { + ShopConfig cur_shopConfig = cur_appConfig.shops.get(j); + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(cur_shopConfig); + // recatchOrderThread.start(); + threadPool.execute(recatchOrderThread); + } + } + + } + + } else { + // 实例化售后队列 + refundQueue = new Vector(); + // 启动售后队列处理线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize()+1); + GetRefundInfoThread grt = new GetRefundInfoThread(); + // grt.start(); + scheduledThreadPool.scheduleAtFixedRate(grt, 0, 500, TimeUnit.MILLISECONDS); + + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize()+1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ]", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + private ThreadPoolExecutor threadPool; + // ExecutorService cachedThreadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + // UpdateTokenThread updateTokenThread = new UpdateTokenThread(); + // threadPool.execute(updateTokenThread); + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == -1) {// TODO 设置为-1表示api暂不启动自动登记售后的功能 + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } + + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 根据订单生成时间获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client = new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(appConfig.key); + invocationContext.setAppSecret(appConfig.secret); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setAccessToken(shopConfig.session_key); + invocationContext.setLanguage("en"); + vipapis.marketplace.delivery.GetOrdersRequest request1 = new vipapis.marketplace.delivery.GetOrdersRequest(); + java.util.HashSet status2 = new java.util.HashSet(); + status2.add("10");// 订单状态. 10:订单已审核, 22:订单已发货, 25:已签收, , 70:已拒收, 97:订单已取消 + request1.setStatus(status2); + + // java.util.HashSet order_ids3 = new java.util.HashSet(); + // order_ids3.add("value"); + // request1.setOrder_ids(order_ids3); + // request1.setIs_export("is_export"); + request1.setQuery_start_time(time_start);// 查询时间段的开始时间 + request1.setQuery_end_time(time_end);// 查询时间段的结束时间 + request1.setDate_type(0);// 查询时间类型,默认按修改时间查询。1为按订单创建时间查询;其它数字为按订单最后修改时间,抓单按照最后修改时间 + request1.setLimit(page_rows);// 每页数量,默认50 最大200 + request1.setPage(page_now);// 页数 + GetOrdersResponse response = client.getOrders(request1); + String jsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(response); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.error(this, e); + logger.info("异常订单返回结果:{}", e); + // 处理唯品会的平台错误 + String error_msg = e.getReturnCode(); + if ("vipapis.oauth-invalidate-failure".equals(error_msg)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + + // JSONObject order_search_response = + // json.getJSONObject("jingdong_pop_order_search_responce"); + // JSONObject order_search = + // order_search_response.getJSONObject("searchorderinfo_result"); + int totalCount = json.getInt("total"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.errFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray tradeList = json.getJSONArray("orders"); + for (int i = 0; i < tradeList.length(); i++) { + JSONObject order = tradeList.getJSONObject(i); + String order_id = order.getString("order_id"); + // orderQueue.add(new ShopOrderInfo(orderCode, + // shopConfig,appConfig.key,appConfig.secret)); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, + new ShopOrderInfo(order_id, shopConfig, appConfig.key, appConfig.secret)); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", order_id, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单|:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + // 等待出库 的订单 + if ("10".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("25".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } else { + logger.info("未处理的订单类型!"); + } + // else if ("FINISHED_L".equals(tradeInfo.status)) { + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + // } + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每页数量,默认50 最大200 + + public RecatchOrderThread(ShopConfig shopConfig) { + this.shopConfig = shopConfig; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + time_start = recatchConfig.starTime; + time_end = recatchConfig.endTime; + logger.info("[ {} ] | [ {} ] 根据订单生成时间获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + + vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client = new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(platConfig.apps.get(0).key); + invocationContext.setAppSecret(platConfig.apps.get(0).secret); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setAccessToken(shopConfig.session_key); + // invocationContext.setLanguage("zh"); + vipapis.marketplace.delivery.GetOrdersRequest request1 = new vipapis.marketplace.delivery.GetOrdersRequest(); + java.util.HashSet status2 = new java.util.HashSet(); + status2.add("10");// 订单状态. 10:订单已审核, 22:订单已发货, 25:已签收, , 70:已拒收, 97:订单已取消 + request1.setStatus(status2); + // request1.setIs_export("is_export"); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + request1.setQuery_start_time(time_start);// 查询时间段的开始时间 + request1.setQuery_end_time(time_end);// 查询时间段的结束时间 + } + if (recatchConfig.type == 1) { + java.util.HashSet order_ids3 = new java.util.HashSet(); + order_ids3.add(recatchConfig.orderId); + request1.setOrder_ids(order_ids3); + + } + request1.setDate_type(1);// 查询时间类型,默认按修改时间查询。1为按订单创建时间查询;其它数字为按订单最后修改时间 + request1.setLimit(page_rows);// 每页数量,默认50 最大200 + request1.setPage(page_now);// 页数 + GetOrdersResponse response = client.getOrders(request1); + String jsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(response); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + + parseOrderList(jsonString); + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.error(this, e); + // 处理唯品会的平台错误 + String error_msg = e.getReturnCode(); + if ("vipapis.oauth-invalidate-failure".equals(error_msg)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "平安好医生平台故障,请联系软维ERP排查", ""); + } + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } else { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + } catch (Exception e) { + logger.error(this, e); + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "唯品会平台故障,请联系软维ERP排查", ""); + } + } + + } + + /** + * parseOrderList 解析唯品会返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + + try { + JSONObject json = new JSONObject(jsonString); + int totalCount = json.getInt("total"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "未查询到未发货订单!", ""); + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 将订单移至队列,等待获取详细信息 + JSONArray tradeList = json.getJSONArray("orders"); + for (int i = 0; i < tradeList.length(); i++) { + JSONObject order = tradeList.getJSONObject(i); + String order_id = order.getString("order_id"); + // orderQueue.add(new ShopOrderInfo(orderCode, + // shopConfig,appConfig.key,appConfig.secret)); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, new ShopOrderInfo(order_id, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret)); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "唯品会平台故障,请联系软维ERP排查", ""); + } + logger.info("[ {} ] | [ {} ] error:订单|[ {} ]解析订单详情错误!时间->{}", shopConfig.code, shopConfig.name, + order_id, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单|:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", ""); + } + continue; + } + // 等待出库 的订单 + if ("10".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("25".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + // else if ("FINISHED_L".equals(tradeInfo.status)) { + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + // } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + if (this.page_count == this.page_now) { + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end; + } + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject trade = new JSONObject(jsonString); + + // 订单 + // 将订单需要的信息写入tradeInfo + tradeInfo = Transform.transform2TradeInfo(tradeInfo, shopOrderInfo.shopConfig, recatchConfig); + + tradeInfo.tid = trade.getString("order_id"); + tradeInfo.status = trade.getString("status");// 订单状态. 10:订单已审核, 22:订单已发货, 25:已签收, , 70:已拒收, 97:订单已取消 + tradeInfo.num = 0; + tradeInfo.discount_fee = (Double.valueOf(trade.getString("discount_fee")) + + Double.valueOf(trade.getString("ex_discount_fee"))) + ""; + tradeInfo.money = trade.getString("payable_fee"); + tradeInfo.pay_money = tradeInfo.money; + tradeInfo.product_fee = trade.getString("total_fee"); + tradeInfo.created = trade.getString("created"); + // tradeInfo.pay_time = orderDetail.getString("paymentConfirmTime"); + tradeInfo.pay_time = trade.has("store_add_time") ? trade.getString("store_add_time") : "到付订单"; + // tradeInfo.platform_modify_time = orderDetail.getString("modified"); + tradeInfo.post_fee = trade.getString("post_fee"); + tradeInfo.buyer_nick = trade.getString("receiver_name"); + // tradeInfo.alipay_id = orderDetail.getString("pin"); + tradeInfo.receiver_name = trade.getString("receiver_name"); + tradeInfo.receiver_country = trade.getString("country_id"); + if ("CN".equals(tradeInfo.receiver_country)) { + tradeInfo.receiver_country = "中国"; + } else {// 其他国家不做处理 + return null; + } + tradeInfo.receiver_state = trade.has("receiver_state") ? trade.getString("receiver_state") : ""; + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + tradeInfo.receiver_city = trade.has("receiver_city") ? trade.getString("receiver_city") : ""; + tradeInfo.receiver_district = trade.has("receiver_district") ? trade.getString("receiver_district") : ""; + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_address = trade.getString("receiver_address"); + tradeInfo.receiver_mobile = trade.has("receiver_mobile") ? trade.getString("receiver_mobile") : ""; + tradeInfo.receiver_phone = trade.has("receiver_phone") ? trade.getString("receiver_phone") : ""; + tradeInfo.buyer_message = trade.has("remark") ? trade.getString("remark") : ""; + tradeInfo.seller_memo = trade.has("vendor_memo") ? trade.getString("vendor_memo") : ""; + tradeInfo.adjust_fee = "0"; + + String payServiceType = trade.has("pay_type") ? trade.getString("pay_type") : "-1"; + String dicname = getDicName(payServiceTypeDic, payServiceType); + tradeInfo.pay_mode_id = dicname.equals("") ? 14 : Integer.parseInt(dicname); + tradeInfo.type = ""; + + // 唯品会 + + // 发票 + // tradeInfo.invoice_type = + // orderDetail.getString("invoiceInfo").indexOf("不需要开具发票") >-1 ? 0 : + // 1; + String invoice_type = trade.getString("invoice_type"); + /** + * 唯品会发票类型;发票类型0-不开发票1-纸质个人发票2-纸质公司发票3-电子发票 + */ + + tradeInfo.invoice_content = ""; + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + tradeInfo.tax_id = ""; + if ("电子发票".equals(invoice_type)) { + tradeInfo.invoice_type = 4; + tradeInfo.invoice_title = trade.getString("invoice_title"); + tradeInfo.tax_id = trade.getString("tax_pay_no"); + } + if ("纸质个人发票".equals(invoice_type) || "纸质公司发票".equals(invoice_type)) { + tradeInfo.invoice_type = 6; + tradeInfo.invoice_title = trade.getString("invoice_title"); + tradeInfo.tax_id = trade.getString("tax_pay_no"); + } + + tradeInfo.invoice_money = trade.getString("invoice_amount"); + + // 获取商品信息 + String orderString = getDetailOrder(shopOrderInfo); + JSONArray order = new JSONArray(orderString); + JSONObject order_products = order.getJSONObject(0);// getJSONArray("order_products"); + JSONArray orderList = order_products.getJSONArray("order_products"); + // 商品 + tradeInfo.orders = new OrderInfo[orderList.length()]; + for (int i = 0; i < orderList.length(); i++) { + JSONObject item = orderList.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outer_sku_id") ? item.getString("outer_sku_id") : ""; + orderInfo.num = Integer.valueOf(item.getString("num")); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getString("price"); + orderInfo.total_fee = Double.valueOf(orderInfo.price) * orderInfo.num + ""; + orderInfo.payment = item.getString("goods_line_money"); + orderInfo.title = item.getString("title"); + orderInfo.sku_id = item.getString("sku_id"); + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + orderInfo.discount_fee = item.getString("all_subtotal"); + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private String getDetailOrder(ShopOrderInfo shopOrderInfo) { + try { + vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client = new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(shopOrderInfo.app_key); + invocationContext.setAppSecret(shopOrderInfo.app_secret); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setAccessToken(shopOrderInfo.shopConfig.session_key); + // invocationContext.setLanguage("zh"); + java.util.HashSet order_ids1 = new java.util.HashSet(); + order_ids1.add(shopOrderInfo.tid); + String orderString = new GsonBuilder().disableHtmlEscaping().create() + .toJson(client.getOrderDetail(order_ids1)); + logger.info("[ {} ] | [ {} ] 订单:[ {} ]返回的商品信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, orderString); + return orderString; + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.error(this, e); + // 处理唯品会的平台错误 + String error_msg = e.getReturnCode(); + if ("vipapis.oauth-invalidate-failure".equals(error_msg)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return null; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * 唯品会获取售后订单线程 + * + * @author Lewis 2018年11月15日 GetRefundThread + */ + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数1-50 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + // this.refund_status = refund_status; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页,退款状态为1", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + + vipapis.marketplace.asc.AscServiceHelper.AscServiceClient client = new vipapis.marketplace.asc.AscServiceHelper.AscServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(appConfig.key); + invocationContext.setAppSecret(appConfig.secret); + invocationContext.setAccessToken(shopConfig.session_key); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setLanguage("en"); + vipapis.marketplace.asc.GetAscsRequest request1 = new vipapis.marketplace.asc.GetAscsRequest(); + request1.setQuery_start_time(time_start); + request1.setQuery_end_time(time_end); + request1.setAsc_status((byte) 0); + request1.setLimit(page_rows); + request1.setPage(page_now); + String jsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(client.getAscs(request1)); + + logger.info("[ {} ] | [ {} ] 返回售后订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.error(this, e); + // 处理唯品会的平台错误 + String error_msg = e.getReturnCode(); + if ("vipapis.oauth-invalidate-failure".equals(error_msg)) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析拼多多返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + JSONArray ascs = json.getJSONArray("ascs"); + if (ascs.length() < 1) { + shopConfig.refundErrFlag = false; + return; + } + int totalCount = ascs.length(); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + + // 将订单移至队列,等待获取详细信息 + for (int i = 0; i < ascs.length(); i++) { + JSONObject refundOrder = ascs.getJSONObject(i); + JSONObject asc_brief = refundOrder.getJSONObject("asc_brief"); + String refundId = asc_brief.getString("asc_sn");// 售后单号 + refundQueue.add(new ShopOrderInfo(refundId, shopConfig, appConfig.key, appConfig.secret)); + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } catch (JSONException e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + /** + * GetOrderInfoThread 获取订单详情线程 + * + * @author Carl + * + */ + private class GetRefundInfoThread extends Thread { + @Override + public void run() { + try { + // while (true) { + if (refundQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = (ShopOrderInfo) refundQueue.get(0); + logger.info("[ {} ] | [ {} ] 获取退款订单详情|[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + if (getRefundInfo(shopOrderInfo)) {// 如果队列中订单有问题,订单已查询到,可以排除系统级错误,不断重试,并不会影响其他线程 + logger.info("[ {} ] | [ {} ] 获取退款订单详情成功|[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + logger.info("[ {} ] | [ {} ] 获取退款订单处理失败|[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } + refundQueue.remove(0); + logger.info("[ {} ] | [ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, refundQueue.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + private boolean getRefundInfo(ShopOrderInfo shopOrderInfo) { + + try { + vipapis.marketplace.asc.AscServiceHelper.AscServiceClient client = new vipapis.marketplace.asc.AscServiceHelper.AscServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(shopOrderInfo.app_key); + invocationContext.setAppSecret(shopOrderInfo.app_secret); + invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setLanguage("en"); + vipapis.marketplace.asc.GetAscInfoRequest request1 = new vipapis.marketplace.asc.GetAscInfoRequest(); + request1.setAsc_sn(shopOrderInfo.tid); + String jsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(client.getAscInfo(request1)); + + RefundInfo refundInfo = parseRefundInfo(jsonString, shopOrderInfo.shopConfig); + if (refundInfo == null) { + logger.info("[ {} ] | [ {} ] error:售后订单|[ {} ]解析订单详情错误!" + "时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // return false; + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + return false; + } + return true; + + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.error(this, e); + // 处理唯品会的平台错误 + String error_msg = e.getReturnCode(); + if ("vipapis.oauth-invalidate-failure".equals(error_msg)) { + logger.info("店铺:[ {} ] [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } + } + + private RefundInfo parseRefundInfo(String jsonString, ShopConfig shopConfig) throws Exception { + RefundInfo refundInfo = new RefundInfo(); + try { + JSONObject json = new JSONObject(jsonString); + JSONObject asc_brief = json.getJSONObject("asc_brief"); + refundInfo.company_code = shopConfig.company_code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.shop_code = shopConfig.code; + refundInfo.tid = asc_brief.has("order_id") ? asc_brief.getString("order_id") : ""; + refundInfo.refund_id = asc_brief.has("asc_sn") ? asc_brief.getString("asc_sn") : ""; + refundInfo.bill_type = 2; + refundInfo.desc = asc_brief.has("remark") ? asc_brief.getString("remark") : ""; + refundInfo.reason = json.has("return_reason") ? json.getString("return_reason") : ""; + refundInfo.platform_code = shopConfig.platformCode; + return refundInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + + } + + private String getDicName(List dics, String code) throws Exception { + for (int i = 0; i < dics.size(); i++) { + Dic dic = dics.get(i); + if (code.equals(dic.code)) { + return dic.name; + } + } + return ""; + } + + /** + * 唯品会授权码自动刷新线程 授权码的有效期为90天,刷新码的有效期为一年 + * + * @author Lewis 2018年11月12日 UpdateTokenThread + */ + + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 2 * 60 * 60 * 1000) && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于两个个小时的话更新 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String app_key = um.app_key; + String app_secret = um.app_secret; + String refresh_token = um.refresh_token; + try { + vipapis.oauth.OauthServiceHelper.OauthServiceClient client = new vipapis.oauth.OauthServiceHelper.OauthServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext = com.vip.osp.sdk.context.InvocationContext.Factory + .getInstance(); + invocationContext.setAppKey(app_key); + invocationContext.setAppSecret(app_secret); + invocationContext.setAppURL(platConfig.api_url); + invocationContext.setLanguage("en"); + vipapis.oauth.RefreshTokenRequest request1 = new vipapis.oauth.RefreshTokenRequest(); + request1.setRefresh_token(refresh_token); + request1.setClient_id(app_key); + request1.setClient_secret(app_secret); + request1.setRequest_client_ip("192.168.1.172");// 此配置必传,但是唯品会并不会校验正确性 + String result = new GsonBuilder().disableHtmlEscaping().create() + .toJson(client.refreshToken(request1)); + org.json.JSONObject json = new org.json.JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ] | [ {} ],刷新码到期,放弃刷新", shop_code, shop_name); + } + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_code, shop_name, result); + } + } catch (com.vip.osp.sdk.exception.OspException e) { + logger.info("店铺:[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } catch (Exception e) { + logger.info("店铺:[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } + + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code, shop_name); + } else { + logger.info("店铺:[ {} ] | [ {} ],刷新令牌成功,已写入数据库!", shop_code, shop_name); + } + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } +} diff --git a/src/com/since/emp/service/DataParse.java b/src/com/since/emp/service/DataParse.java new file mode 100644 index 0000000..17f2231 --- /dev/null +++ b/src/com/since/emp/service/DataParse.java @@ -0,0 +1,7991 @@ +package com.since.emp.service; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.ibm.icu.text.CharsetDetector; +import com.ibm.icu.text.CharsetMatch; +import com.since.emp.service.csv.BaseFileField; +import com.since.emp.service.csv.EasyFileField; +import com.since.emp.service.csv.StandardFileField; +import com.since.emp.service.csv.constants.Constants; +import com.since.emp.service.csv.constants.CsvDataTypeEnum; +import com.since.emp.util.*; +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.AgentStorage; +import com.since.emp.base.Basket; +import com.since.emp.base.Commodity; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.EntrustOrder; +import com.since.emp.base.FenxiaoInfo; +import com.since.emp.base.GiftNum; +import com.since.emp.base.IniReader; +import com.since.emp.base.Item; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.Rule; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.TraderateInfo; +import com.since.emp.base.aftersale.ChangLogisticsAddressInfo; +import com.since.emp.base.aftersale.ChangLogisticsAddressOrder; +import com.since.emp.base.aftersale.RefundColseEntity; +import com.since.emp.base.aftersale.TbDeliveryOrder; +import com.since.emp.base.aftersale.TbInvoice; +import com.since.emp.base.aftersale.TbSaleOrder; +import com.since.emp.base.aftersale.TbSaleOrderItems; +import com.since.emp.base.aftersale.TbSubSaleOrder; +import com.since.emp.base.aftersale.TbSubSaleOrderItems; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; + +import jxl.Sheet; +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; +import net.spy.memcached.MemcachedClient; + +import javax.sound.sampled.Line; + +/** + * DataParse 数据解析 + * + * @author jue + */ +public class DataParse { + private static final Logger logger = LogManager.getLogger(DataParse.class); + // 对于指定平台,商品编码为空的订单,要标记为删除 + private static Map nullCommodityPlatformSpecialDealMap = new HashMap(); + + /** + * 订单处理队列 + */ + public Vector tradeQueue; + + /** + * 预售订单处理队列 + */ + public Vector pretradeQueue; + + /** + * + */ + public Vector tradeQueue_Success; + + private Vector exceptionTradeQueue; + public boolean flag_check_exist = false; + public boolean flag_check_exception = false; + private MemcachedClient mcc = null; + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + Vector activityUpdateQueue;// 更新数据库活动商品已送数量 + private static Lock lock;// 线程锁 + private static Lock presale_lock;// 预售订单处理线程锁 + + private String stopStartTime;// 定时同步停止同步的起始时间 + private String stopEndTime;// 定时同步停止同步的结束时间 + + private String plg_url; + + static { + Init(); + } + + private static void Init() { + lock = new ReentrantLock();// 获得锁 + presale_lock = new ReentrantLock();// 实例化线程锁 + } + + public void start() { + try { + // 024:快团团平台,026:群接龙平台 + nullCommodityPlatformSpecialDealMap.put("024", ""); + nullCommodityPlatformSpecialDealMap.put("026", ""); + mcc = OrderSyncs.MemcacheInit(DataParse.class.getName()); + tradeQueue = new Vector(); + pretradeQueue = new Vector(); + tradeQueue_Success = new Vector(); + activityUpdateQueue = new Vector(); + exceptionTradeQueue = new Vector(); + threadPool = ThreadPool.getInstance(); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + TradeParseSuccessThread tpst = new TradeParseSuccessThread(); + scheduledThreadPool.scheduleAtFixedRate(tpst, 0, 100, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + TradeParseThread tpt = new TradeParseThread(); + + scheduledThreadPool.scheduleAtFixedRate(tpt, 0, 50, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + PretradeParseThread ppt = new PretradeParseThread(); + scheduledThreadPool.scheduleAtFixedRate(ppt, 0, 50, TimeUnit.MILLISECONDS); + scheduledThreadPool = ScheduledThreadPool.getInstance(); + + ActivityUpdateThread aut = new ActivityUpdateThread(); + scheduledThreadPool.scheduleAtFixedRate(aut, 0, 100, TimeUnit.MILLISECONDS); + /** + * 异常订单检查线程 + */ + scheduledThreadPool = ScheduledThreadPool.getInstance(); + ExceptionTradeQueueThread etqt = new ExceptionTradeQueueThread(); + scheduledThreadPool.scheduleAtFixedRate(etqt, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + IniReader iniReader = new IniReader("config_all.ini"); + plg_url = iniReader.getValue("path", "plg_url"); + stopStartTime = iniReader.getValue("storageUpdateTime", "stopStartTime"); + stopEndTime = iniReader.getValue("storageUpdateTime", "stopEndTime"); + } catch (Exception e) { + logger.error(this, e); + } + + logger.info("数据处理线程启动"); + } + + private class TradeParseThread extends Thread { + @Override + public void run() { + try { + if (tradeQueue.size() > 0) { + int count = tradeQueue.size(); + if (count > 20) { + count = 20; + } + // 用两个map存储是防止并发数量大于设计量(20个线程) + Map map_002 = new ConcurrentHashMap();// 存储淘宝平台订单 + Map map_other = new ConcurrentHashMap(); // 存储其他平台订单 + for (int i = 0; i < count; i++) { + TradeInfo tradeInfo = tradeQueue.get(0); + if ("002".equals(tradeInfo.platform_code)) { + if ("taobao_trade_TradeBuyerPay".equals(tradeInfo.trade_type) + || "taobao_fenxiao_FxOrderPaid".equals(tradeInfo.trade_type)) { + String key = tradeInfo.company_code + "," + tradeInfo.shop_code + "," + tradeInfo.tid; + map_002.put(key, tradeInfo); + + } else if ("taobao_trade_TradeMemoModified".equals(tradeInfo.trade_type)) { + TradeMemoModify tradeMemoModify = new TradeMemoModify(tradeInfo); + threadPool.execute(tradeMemoModify); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + } + } else { + String key = tradeInfo.company_code + "," + tradeInfo.shop_code + "," + tradeInfo.tid; + map_other.put(key, tradeInfo); + } + tradeQueue.remove(0); + } + for (Map.Entry entry : map_002.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + TradeProcessThread tpt = new TradeProcessThread(tradeInfo, mcc); + threadPool.execute(tpt); + } + for (Map.Entry entry : map_other.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + logger.info("处理订单数据 [ {} ] ", tradeInfo.tid); + TradeProcessThread tpt = new TradeProcessThread(tradeInfo, mcc); + threadPool.execute(tpt); + } + logger.info("新订单待写库队列总数: [ {} ] ", tradeQueue.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + /** + * 预售订单处理线程 + */ + private class PretradeParseThread extends Thread { + @Override + public void run() { + try { + if (pretradeQueue.size() > 0) { + TradeInfo tradeInfo = pretradeQueue.get(0); + pretradeQueue.remove(0); + if (!pretradeProcess(tradeInfo)) { + pretradeQueue.add(tradeInfo); + } + } + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + /** + * pretradeProcess 预售订单处理 + * + * @param tradeInfo 订单 + * @return + */ + public boolean pretradeProcess(TradeInfo tradeInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + // boolean found; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + String result = insertPretradeTransaction(tradeInfo, conn, ps, rs); + // over表示是预售商品,但是赠品已送完,true表示写入成功,false表示异常,repeat表示订单重复 + if ("true".equals(result)) { + logger.info("预售订单写入成功| [ {} ] ", tradeInfo.tid); + return true; + } else if ("over".equals(result)) { + logger.info("预售订单超出赠品限额或不符合规则,不做处理| [ {} ] ", tradeInfo.tid); + return true; + } else { + logger.info("预售订单事务执行异常,回滚| [ {} ] ", tradeInfo.tid); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + return false; + } + // } + } catch (Exception e) { + try { + logger.info("预售订单事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + e1.printStackTrace(); + logger.info("回滚执行失败|{}", e.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 预售订单处理方法 + */ + private String insertPretradeTransaction(TradeInfo tradeInfo, DruidPooledConnection conn, PreparedStatement ps, + ResultSet rs) { + + String sql = ""; + try { + presale_lock.lock(); + if (!"".equals(tradeInfo.orders[0].platform_seller_code)) { + String company_code = tradeInfo.company_code; + String platform_seller_code = tradeInfo.orders[0].platform_seller_code; + String key = company_code + "_c" + platform_seller_code; + /** + * memcached不支持key中有空格,如果key的值中存在空格,对key进行base64编码,作为新的key存入memcached + */ + if (key.indexOf(" ") > -1) { + key = base64Encode(key); + } + + /** + * 如果更新存储的键值对,同时更新掉订单写入方法:inserttradeTransaction中的存储的键值对相应的 + */ + if (mcc == null || (mcc.get(key) == null)) { + int kind = 0; + int commodity_class = 0; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + company_code + "' and a.platform_seller_code= '" + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind"); + commodity_class = rs.getInt("class"); + if (rs.getString("name") != null) { + tradeInfo.brand = rs.getString("name"); + } + tradeInfo.orders[0].commodity_code = rs.getString("code") == null ? "" : rs.getString("code"); + tradeInfo.orders[0].commodity_class = commodity_class; + if ("".equals(tradeInfo.orders[0].commodity_code)) { + return "over"; + } + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("brand", tradeInfo.brand); + map.put("kind", String.valueOf(kind)); + map.put("code", tradeInfo.orders[0].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key, 0, jsonStr); + } + } else { + logger.info("数据库未查询到|[ {} ] 记录,不处理预售订单", platform_seller_code); + return "over"; + } + + } else { + String jsonStr = (String) mcc.get(key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + // String kind = (String) json.get("kind"); + // String brand = json.get("brand").toString(); + tradeInfo.orders[0].commodity_code = json.get("code") == null ? "" : (String) json.get("code"); + if ("".equals(tradeInfo.orders[0].commodity_code)) { + return "over"; + } + } + } else { + return "over"; + } + + // 获取活动规则 + // 预售活动的判断要以订单的创建时间为判断基础 + List rules = Collections.synchronizedList(new ArrayList()); + sql = "select b.gift_activity_code,a.name as activity_name,a.shop_code,a.company_code,b.begin_time,b.end_time," + + "b.code as rule_code,b.name as rule_name,b.seq as rule_seq," + + "b.apply_object as rule_apply_object,b.pre_sale_flag as rule_pre_sale_flag," + + "b.pay_money as rule_pay_money,b.promotion_mode as rule_promotion_mode," + + "b.any_commodity as rule_any_commodity,b.any_number as rule_any_number," + + "b.appoint_commodity as rule_appoint_commodity,b.gift_mode as rule_gift_mode," + + "b.delivery_type_id as rule_delivery_type_id," + + "b.superposition_mode as rule_superposition_mode," + + "b.gift_limit_condition as rule_gift_limit_condition,b.limit_number as rule_limit_number," + + "b.gift_current as rule_gift_current,b.order_current as rule_order_current," + + "b.gift_commodity as rule_gift_commodity,b.presell_begin_time as rule_presell_begin_time," + + "b.presell_end_time as rule_presell_end_time " + + "from tb_gift_activity a,tb_gift_activity_rule b where a.status = 2 and " + + "b.gift_activity_code = a.code and b.begin_time<=? and b.end_time>=? and " + + "a.shop_code=? and b.pre_sale_flag=3 and presell_sort = 1 and apply_object = '2' order by b.gift_activity_code,b.seq desc"; + // 预售排序:1:付定金时间,2:付尾款时间 + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.pay_time); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, tradeInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + Rule rule = new Rule(); + rule.gift_activity_code = rs.getString("gift_activity_code"); + rule.activity_name = rs.getString("activity_name"); + rule.activity_shop_code = rs.getString("shop_code"); + rule.activity_company_code = rs.getString("company_code"); + rule.activity_begin_time = rs.getString("begin_time"); + rule.activity_end_time = rs.getString("end_time"); + rule.rule_code = rs.getString("rule_code"); + rule.rule_name = rs.getString("rule_name"); + rule.rule_seq = rs.getInt("rule_seq"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_pre_sale_flag = rs.getInt("rule_pre_sale_flag"); + rule.rule_pay_money = rs.getString("rule_pay_money"); + rule.rule_gift_mode = rs.getString("rule_gift_mode"); + rule.rule_promotion_mode = rs.getString("rule_promotion_mode"); + rule.rule_any_commodity = rs.getString("rule_any_commodity") == null ? "" + : rs.getString("rule_any_commodity"); + rule.rule_any_number = rs.getString("rule_any_number") == null ? "" : rs.getString("rule_any_number"); + rule.rule_appoint_commodity = rs.getString("rule_appoint_commodity") == null ? "" + : rs.getString("rule_appoint_commodity"); + rule.rule_delivery_type_id = rs.getInt("rule_delivery_type_id"); + rule.rule_superposition_mode = rs.getString("rule_superposition_mode"); + rule.rule_gift_limit_condition = rs.getString("rule_gift_limit_condition"); + rule.rule_limit_number = rs.getString("rule_limit_number") == null ? "" + : rs.getString("rule_limit_number"); + rule.rule_gift_current = rs.getInt("rule_gift_current"); + rule.rule_order_current = rs.getInt("rule_order_current"); + rule.rule_gift_commodity = rs.getString("rule_gift_commodity") == null ? "" + : rs.getString("rule_gift_commodity"); + rule.rule_presell_begin_time = rs.getString("rule_presell_begin_time") == null ? "" + : rs.getString("rule_presell_begin_time"); + rule.rule_presell_end_time = rs.getString("rule_presell_end_time") == null ? "" + : rs.getString("rule_presell_end_time"); + rules.add(rule); + } + + if (tradeInfo.orders.length == 1) {// 预售订单的子条目只可能为1 + OrderInfo orderInfo = tradeInfo.orders[0]; + if ("".equals(orderInfo.commodity_code)) { + logger.info("预售订单商品编码为空!"); + return "over"; + } + + String seq_fit_rules = "";// 对于有排序要求的记录符合的活动编码,其他规则不再赠送. + int seq_num_rules = 0;// 对于有排序要求的活动,而订单中由于高优先级的活动中赠品送完,这部分未配送赠品的又符合低优先级的活动,对该部分做记录并配送低优先级活动赠品 + for (int i = 0; i < rules.size(); i++) { + Rule rule = rules.get(i); + // 有顺序的规则,判断是否送过,如已经送过,则直接跳过 + if (rule.rule_seq > 0) { + if (seq_fit_rules.indexOf(rule.gift_activity_code) >= 0) { + continue; + } + } + + if (rule.rule_apply_object.equals("1") || rule.rule_promotion_mode.equals("2")) {// 预售订单只针对于商品且为促销方式为任意多件的,如果针对于订单则活动规则有误 + logger.info("预售订单活动无适用对象为订单的活动,活动规则建立错误!"); + continue; + } + + if (!"".equals(rule.rule_presell_begin_time) && !"".equals(rule.rule_presell_end_time)) {// 指定的预售开始时间和结束时间不为空 + if (tradeInfo.pay_time.compareTo(rule.rule_presell_begin_time) < 0 + || tradeInfo.pay_time.compareTo(rule.rule_presell_end_time) > 0) {// 预售订单不在指定的时间范围内 + logger.info("预售订单不在指定活动时间范围内!"); + continue; + } + } + + if (orderInfo.num < Integer.parseInt(rule.rule_any_number)) {// 订单中的商品数量不满足赠送条件 + logger.info("预售订单不满足活动条件!"); + continue; + } + + int num = 1;// 需要赠送的赠品份数 + String any_commodity = rule.rule_any_commodity; + String[] commodity_codes = any_commodity.trim().split("\\|"); + for (String commodity_code : commodity_codes) {// 遍历出所有指定的商品编码 + if (commodity_code.equals(orderInfo.commodity_code)) {// 商品满足活动条件 + // 限额条件:1:不限,2:订单,3:赠品 + // 订单查重 + String duplicate_checking_sql = "select 1 from tb_presale_order where platform_code=? and shop_code=? and rule_code =? limit 1"; + ps = conn.prepareStatement(duplicate_checking_sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, rule.rule_code); + rs = ps.executeQuery(); + + if (rs.next()) { + logger.info("预售订单已存在| [ {} ]", tradeInfo.tid); + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + continue; + } + + if (rule.rule_gift_limit_condition.equals("1")) {// 不限额 + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + if (rule.rule_superposition_mode.equals("1")) {// 限订单 不叠加 + num = 1;// 赠品份数 + } else if ("2".equals(rule.rule_superposition_mode)) {// 限订单叠加,叠加情况下赠送的赠品数量需要计算数量 + num = (int) Math.floor(orderInfo.num / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数; + } + + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + // 记录预售订单 + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } else if (rule.rule_gift_limit_condition.equals("2") + && rule.rule_order_current < Integer.parseInt(rule.rule_limit_number) + && rule.rule_gift_mode.equals("2")) {// 限额条件为限订单,赠送方式为赠送赠品, + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + // 计算赠品份数 + if (rule.rule_superposition_mode.equals("1")) {// 限订单 不叠加 + num = 1;// 赠品份数 + } else if (rule.rule_superposition_mode.equals("2")) {// 限订单叠加,叠加情况下赠送的赠品数量需要计算数量 + num = (int) Math.floor(orderInfo.num / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数; + } + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + // 记录预售订单 + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update = "update tb_gift_activity_rule set order_current=" + + (rule.rule_order_current + 1) + " where code='" + rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新已送订单数量 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + logger.info("该限订单的预售订单 [ {} ] 订单已成功记录到预售单表,且已成功更新数据库中已赠送赠品数量!", tradeInfo.tid); + } else if (rule.rule_gift_limit_condition.equals("3")// 限赠品 + && rule.rule_gift_current < Integer.parseInt(rule.rule_limit_number) + && rule.rule_gift_mode.equals("2")) {// 限额条件为限赠品,赠送方式为赠品 + logger.info("预售订单符合活动规则:{}——{}", rule.activity_name, rule.rule_name); + if (rule.rule_superposition_mode.equals("1")) {// 不叠加 + num = 1; + } else if (rule.rule_superposition_mode.equals("2")) {// 叠加 + if ((rule.rule_gift_current + orderInfo.num) > Integer + .parseInt(rule.rule_limit_number)) { + num = (Integer.parseInt(rule.rule_limit_number) - rule.rule_gift_current); + seq_num_rules = rule.rule_gift_current + orderInfo.num + - Integer.parseInt(rule.rule_limit_number); + } else { + num = orderInfo.num; + } + } + + // 记录赠品信息 + Map giftMap = new HashMap(); + giftMap.put(num, rule.rule_gift_commodity); + Gson gn = new GsonBuilder().disableHtmlEscaping().create(); + String giftCommodityInfo = gn.toJson(giftMap); + String sql_presale = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update = "update tb_gift_activity_rule set gift_current=" + + (rule.rule_gift_current + num) + " where code='" + rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update); + if (ps.executeUpdate() == 0) { + return "false"; + } + + // 记录预售订单 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + + if (seq_num_rules > 0) { + int num_rule = 0; + for (int j = 0; j < rules.size(); j++) { + Rule rule_rule = rules.get(j); + // 相同的规则 + if (rule_rule.rule_seq < rule.rule_seq && rule_rule.rule_seq > 0 + && (!rule_rule.rule_code.equals(rule.rule_code)// 不同的规则编号 + && rule_rule.rule_any_number.equals(rule.rule_any_number)// 指定的购买件数相同 + && rule_rule.rule_pre_sale_flag == rule.rule_pre_sale_flag// 预售 + && rule_rule.rule_presell_begin_time + .equals(rule.rule_presell_begin_time)// 相同的预售开始时间 + && rule_rule.rule_presell_end_time + .equals(rule.rule_presell_end_time)// 相同的预售结束时间 + && rule_rule.rule_gift_limit_condition + .equals(rule.rule_gift_limit_condition)// 相同的限额方式 + && "2".equals(rule_rule.rule_gift_mode))) { + if (seq_num_rules > Integer.parseInt(rule_rule.rule_limit_number)) { + num_rule = Integer.parseInt(rule_rule.rule_limit_number); + seq_num_rules = seq_num_rules - num_rule; + } else { + num_rule = seq_num_rules; + seq_num_rules = -1; + } + + // 记录预售单 + // 记录赠品信息 + Map nextGiftMap = new HashMap(); + nextGiftMap.put(num_rule, rule_rule.rule_gift_commodity); + Gson next_gn = new GsonBuilder().disableHtmlEscaping().create(); + String next_giftCommodityInfo = next_gn.toJson(nextGiftMap); + String sql_presale_rule = "insert into tb_presale_order (platform_code,pay_time,rule_code,shop_code,gift_commodity) values (?,?,?,?,?)"; + ps = conn.prepareStatement(sql_presale_rule); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.pay_time); + ps.setString(3, rule_rule.rule_code); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, next_giftCommodityInfo); + if (ps.executeUpdate() == 0) { + return "false"; + } + // 更新数据库规则已送赠品数量 + String sql_rule_update_rule = "update tb_gift_activity_rule set gift_current=" + + num_rule + " where code='" + rule_rule.rule_code + "'"; + ps = conn.prepareStatement(sql_rule_update_rule); + if (ps.executeUpdate() == 0) { + return "false"; + } + if (seq_num_rules < 0) { + return "true"; + } + } + } + } + } + } + } + } + + } + } else { + logger.info("预售订单| [ {} ] 不符合规则,请检查!", tradeInfo.tid); + } + return "over"; + } catch (SQLException e) { + logger.error(this, e); + return "false"; + } catch (Exception e) { + logger.error(this, e); + return "false"; + } finally { + presale_lock.unlock();// 释放锁 + } + } + + /** + * 对于未检测未出库售后订单处理 + * + * @param refundInfo + * @return + * @throws Exception + */ + public boolean isStorageOut(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String sale_order_code, + String company_code, int aftersale_seq, boolean storageFlag, int aftersale_number, int aftersale_reason_id, + int entrust_issuccess, RefundInfo refundInfo, String entrust_msg) throws Exception { // 未检测,未发货,未出库 + // 更新发票状态 + String sql = ""; + sql = "select status from tb_invoice where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + rs = ps.executeQuery(); + while (rs.next()) { + sql = "update tb_invoice set status=4 where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + + // 更新售后状态 + String aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg) values(?,?,?,?,0,?,?,?,?,4,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setString(9, entrust_msg); + if (ps.executeUpdate() == 0) { + return false; + } + + // 更新订单表 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? , aftersale_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 3); + ps.setInt(2, aftersale_seq + 1); + ps.setInt(3, aftersale_number + 1); + ps.setString(4, sale_order_code); + if (ps.executeUpdate() == 0) { + return false; + } + + logger.info("退款订单 [ {} ] 处理成功!", refundInfo.tid); + return true; + } + + /** + * 处理补偿和换货的售后订单,如果售后订单未发货,则锁定 + * + * @param conn + * @param ps + * @param rs + * @param last_aftersale_order_code + * @throws Exception + * @date 2019-10-10 + */ + private void lockCompensateAndExchangeGoodsOrder(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + String last_aftersale_order_code) throws Exception { + ResultSet rs1 = null; + try { + String sql = "SELECT code as sale_order_code,aftersale_seq FROM tb_sale_order WHERE aftersale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, last_aftersale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + boolean is_storage_out = false;// 订单未出库 + String sale_order_code = rs.getString("sale_order_code"); + int aftersale_seq = rs.getInt("aftersale_seq"); + sql = "SELECT status FROM tb_storage_out_order WHERE sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + rs1 = ps.executeQuery(); + if (rs1.next()) { + int status = rs1.getInt("status"); + if (status >= 4) { + is_storage_out = true;// 已出库 + } + } + // 如果是未出库,则锁定该单 + if (!is_storage_out) { + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 2); + ps.setInt(2, aftersale_seq + 1); + ps.setString(3, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new SQLException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + + } + } finally { + // 关闭rs1 + if (rs1 != null) { + try { + rs1.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs1 = null; + } + } + + } + + /* + * 退款取消订单处理 + * + * 买家撤销退款申请后,系统自动将售后取消,并同步将订单的锁定状态恢复到正常状态 + * 店铺运营管理中新增“售后自动关闭”开关,与自动退款一样,必须在售后自动登记开启时,才能设置 1.获取到撤销退款申请后,在系统中寻找自动登记的售后单, + * 2.如果找到售后单,判断售后单是否过审核,已过审核的不处理,未过审核的可以进行撤销操作 3.撤销操作包括:关闭售后单(含链路)、解除订单的锁定状态 + * 开关字段:auto_cancel_aftersale_flag + */ + public boolean updateRefundClosedOrder(RefundInfo refundClosedInfo) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + boolean found = false; + try { + List list = new ArrayList(); + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "SELECT a.code as aftersale_code,b.code as sale_order_code " + + "FROM tb_aftersale_order a, tb_sale_order b " + + "WHERE a.del_flag = 1 AND a. STATUS = 1 AND b.del_flag = 2 AND a.platform_refund_code = ? AND b.platform_code = ?" + + "AND a.sale_order_code = b. CODE AND a.company_code = b.company_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundClosedInfo.refund_id); + ps.setString(2, refundClosedInfo.tid); + rs = ps.executeQuery(); + while (rs.next()) { + found = true; + RefundColseEntity refundColseEntity = new RefundColseEntity(); + refundColseEntity.aftersale_code = rs.getString("aftersale_code"); + refundColseEntity.sale_order_code = rs.getString("sale_order_code"); + list.add(refundColseEntity); + } + if (!found) { + logger.info("取消退款订单 [ {} ] 没有找到正在售后的对应销售单,放弃处理", refundClosedInfo.tid); + return true; + } + for (int i = 0; i < list.size(); i++) { + /* + * 将销售单的状态从锁定改为正常 + */ + RefundColseEntity refundColseEntity = list.get(i); + sql = "update tb_sale_order set del_flag=1,aftersale_order_flag=1 where code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundColseEntity.sale_order_code); + ps.setString(2, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + /* + * 将售后单的状态由正常改为删除状态 + */ + sql = "update tb_aftersale_order set del_flag=2 where code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refundColseEntity.aftersale_code); + ps.setString(2, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + /* + * 将审核表的链路信息改为取消售后 + */ + sql = "insert into tb_aduit (aduit_user_id,module_code,sale_order_code,company_code)" + + " values (?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 0); + ps.setString(2, "07010202"); + ps.setString(3, refundColseEntity.sale_order_code); + ps.setString(4, refundClosedInfo.company_code); + if (ps.executeUpdate() == 0) { + logger.info("取消退款订单 [ {} ] 处理失败", refundClosedInfo.tid); + throw new RuntimeException(); + } + } + logger.info("取消退款订单 [ {} ] 处理完成", refundClosedInfo.tid); + return true; + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("取消退款订单事务执行异常,回滚| [ {} ]:{}", refundClosedInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + public boolean logisticsAddressChanged(ChangLogisticsAddressInfo changLogisticsAddressInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + boolean foundRs = false;// 根据平台单号是否查询到符合条件的系统订单 + List changLogisticsAddressOrderList = new ArrayList(); + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + // 业务代码 + if (changLogisticsAddressInfo.company_type == 2) { // company_type:企业类型 1:后台管理公司,2:经销商,3:供应商 + sql = "select a.code as sale_order_code,a.entrust_type, a.company_code,a.obm_company_code, invoice_type, b.storage_code,c.platform_code as platformCode, " + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.company_code=b.company_code,tb_shop c " + + "where a.shop_code=c.code and a.aftersale_order_flag=1 and a.platform_code = ? and a.del_flag=1 and a.status>-1 and a.origin is null and a.shop_code = ? and a.aftersale_seq=0 and a.aftersale_number=0 order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(changLogisticsAddressInfo.tid)); + ps.setString(2, changLogisticsAddressInfo.shop_code); + rs = ps.executeQuery(); + } + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select a.code as sale_order_code,a.entrust_type, a.company_code,a.obm_company_code, invoice_type, b.storage_code,c.platform_code as platformCode," + + "case when a.status = 1 then 1 when a.status = 2 then 2 when a.status = 3 then 3 when a.status = 4 and b.status = 1 then 4 when a.status = 4 and b.status = 2 then 5 when a.status = 4 and b.status = 3 then 6 when a.status = 4 and b.status = 4 then 7 end as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.obm_company_code=b.obm_company_code,tb_shop c " + + "where a.shop_code=c.code and a.aftersale_order_flag=1 and a.platform_code = ? and a.del_flag=1 and a.status>-1 and a.origin is null and a.shop_code = ? and a.aftersale_seq=0 and a.aftersale_number=0 order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(changLogisticsAddressInfo.tid));// 退款单对应的销售单订单编码 + ps.setString(2, changLogisticsAddressInfo.shop_code);// 店铺编码 + rs = ps.executeQuery(); + } + + while (rs.next()) { + foundRs = true; + // 如果是改单和拆单 + ChangLogisticsAddressOrder changLogisticsAddressOrder = new ChangLogisticsAddressOrder();// 售后订单 + changLogisticsAddressOrder.sale_order_code = rs.getString("sale_order_code"); + changLogisticsAddressOrder.platform_code = rs.getString("platformCode"); + changLogisticsAddressOrder.entrust_type = rs.getInt("entrust_type"); + changLogisticsAddressOrder.company_code = rs.getString("company_code") == null ? "" + : rs.getString("company_code"); + changLogisticsAddressOrder.sale_order_code = rs.getString("sale_order_code"); + changLogisticsAddressOrder.obm_company_code = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + changLogisticsAddressOrder.invoice_type = rs.getInt("invoice_type"); + changLogisticsAddressOrder.orderStatus = rs.getInt("orderStatus"); + changLogisticsAddressOrder.storage_code = rs.getString("storage_code") == null ? "" + : rs.getString("storage_code"); + changLogisticsAddressOrderList.add(changLogisticsAddressOrder); + } + if (!foundRs) { + logger.info("未查询到符合条件的修改地址订单,放弃处理| [ {} ] ", changLogisticsAddressInfo.tid); + return true; + } + + for (int i = 0; i < changLogisticsAddressOrderList.size(); i++) { + ChangLogisticsAddressOrder changLogisticsAddressOrder = changLogisticsAddressOrderList.get(i); + /** + * obmFlag true为品牌商或品牌商代发,false为经销商自有 + */ + boolean obmFlag = false; + if (!"".equals(changLogisticsAddressOrder.obm_company_code)) { + obmFlag = true; + } + /** + * 当订单为委外订单时判断是否拦截 + */ + int entrust_issuccess = 0; + String entrust_msg = ""; + if (changLogisticsAddressOrder.entrust_type == 2 && changLogisticsAddressOrder.orderStatus < 7) {// 属于委外订单且订单未发货 + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,logistics_company_code from tb_storage where logistics_company_code is not null and company_code=?"; + ps = conn.prepareStatement(sql); + if (obmFlag) { + ps.setString(1, changLogisticsAddressOrder.obm_company_code); + } else { + ps.setString(1, changLogisticsAddressOrder.company_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("code") == null ? "" : rs.getString("code"); + String logistics_company_code = rs.getString("logistics_company_code") == null ? "" + : rs.getString("logistics_company_code"); + /** + * 品牌商为空说明为经销商的自发订单 + */ + if (storage_code.equals(changLogisticsAddressOrder.storage_code) + && "PLG".equals(logistics_company_code)) { + /* + * 弃用老版本接口 2019-10-17 String param = "djbh=" + + * changLogisticsAddressOrder.sale_order_code + + * "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; HttpRequest httpRequest = new + * HttpRequest(); String resultStr = httpRequest.sendGet(plg_url, param, + * DataParse.class.getName()); + * + * + * //如果接口异常,放弃处理 + * + * + * if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + * entrust_issuccess = 1; entrust_msg = "PLG服务器连接失败|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); break; } + * JSONObject json = new JSONObject(resultStr); String isSuccess = + * json.getString("isSuccess"); entrust_msg = json.getString("result"); + * entrust_msg = isSuccess + "|" + entrust_msg + "|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); if + * ("100".equals(isSuccess)) { entrust_issuccess = 1; break; } entrust_issuccess + * = 2; + */ + /** + * 启用新版接口 2019-10-17 + */ + + HashMap resultMap = sendInterceptToPLG( + changLogisticsAddressOrder.sale_order_code); + if (!resultMap.containsKey("result")) { + entrust_issuccess = 1; + entrust_msg = "PLG服务器连接失败|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + break; + } + boolean resultFlag = Boolean.valueOf(resultMap.get("flag")); + String result = resultMap.get("result"); + if (!resultFlag) { + entrust_msg = result + "|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + entrust_issuccess = 1; + break; + } + entrust_issuccess = 2; + + } + } + } + // 锁定订单 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 2); + ps.setInt(2, 1); + ps.setString(3, changLogisticsAddressOrder.sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 生成新售后详单 + + /** + * 分经销商和品牌商两种情况处理 + */ + if (changLogisticsAddressOrder.orderStatus >= 5) {// 对于有出库单表的订单,商品以出库单详表为准,如果还未出库,则以销售单详表为主 + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.obm_company_code); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.company_code); + rs = ps.executeQuery(); + } + } else { + if (changLogisticsAddressInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,money,gift from tb_sale_order_items where sale_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.obm_company_code); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,money,gift from tb_sale_order_items where sale_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressOrder.company_code); + rs = ps.executeQuery(); + } + } + + int num = 0; + String code = ""; + String commodity_code = ""; + int quantity = 0; + int left_quantity = 0; + double money = 0.0; + int gift = 0; + while (rs.next()) { + num++; + code = rs.getString("code"); + if (changLogisticsAddressInfo.company_type == 3) { + commodity_code = rs.getString("obm_commodity_code"); + } else { + commodity_code = rs.getString("commodity_code"); + } + quantity = rs.getInt("quantity"); + if (changLogisticsAddressOrder.orderStatus >= 5) { + left_quantity = rs.getInt("left_quantity"); + } else { + left_quantity = quantity; + } + + money = rs.getDouble("money"); + gift = rs.getInt("gift"); + sql = "insert into tb_aftersale_order_items(code,commodity_code,quantity,left_quantity,money,gift,original_sale_order_code,company_code) values(?,?,?,?,?,?,?,?) "; + ps = conn.prepareStatement(sql); + ps.setString(1, code); + ps.setString(2, commodity_code); + ps.setInt(3, quantity); + ps.setInt(4, left_quantity); + ps.setDouble(5, money); + ps.setInt(6, gift); + ps.setString(7, changLogisticsAddressOrder.sale_order_code); + // if (obmFlag) { + // ps.setString(8, ro.obm_company_code); + // } else { + ps.setString(8, changLogisticsAddressOrder.company_code); + // } + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + if (num <= 0) { + logger.info("修改收货地址订单| [ {} ] 出库单及销售单详单都未找到该订单,不添加当前商品信息!", changLogisticsAddressInfo.tid); + } + // 生成新售后单 + String aftersale_order_code = ""; + aftersale_order_code = "SH" + 1 + "_" + changLogisticsAddressOrder.sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,entrust_issuccess,status,entrust_msg,aftersale_type_id) values(?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + ps.setInt(2, 4);// 售后诉求id(1:退款2:退货3:换货4:改单5:补货6:换票7:补票8:补偿9:并单10:拆单11:取消售后单) + ps.setInt(3, 10); + ps.setString(4, changLogisticsAddressOrder.sale_order_code); + ps.setInt(5, 0); + ps.setString(6, changLogisticsAddressOrder.company_code); + ps.setString(7, "自动更新地址:" + changLogisticsAddressInfo.receiver_address); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setInt(9, 2); + ps.setString(10, entrust_msg); + ps.setInt(11, 4);// 售后类型id(1:退款2:退货3:换货4:改单5:补货6:换票7:补票8:补偿9:并单10:拆单11:拦截售后订单) + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + // 生成新售后单表,复制销售单表,销售单详表,快递单表,财务单表,发票表(如果有)委外订单生成新的出库单,出库单详表 + boolean hasNullCommodityCode = false;// 销售单详表中是否有空商品 + // 销售单详表 + List TbSaleOrderItemsList = new ArrayList(); + sql = "select commodity_code,obm_commodity_code,quantity,unit_price,money,commodity_title,account,total_fee,adjust_fee,gift,sale_order_code,sku_message,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,obm_company_code,outer_id " + + " from tb_sale_order_items where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + TbSaleOrderItems tbSaleOrderItems = new TbSaleOrderItems(); + tbSaleOrderItems.commodityCode = rs.getString("commodity_code") == null ? "" + : rs.getString("commodity_code"); + tbSaleOrderItems.obmCommodityCode = rs.getString("obm_commodity_code") == null ? "" + : rs.getString("obm_commodity_code"); + if (changLogisticsAddressInfo.company_type == 3 && "".equals(tbSaleOrderItems.obmCommodityCode)) {// 对于品牌商,品牌商商品编码为空,则不再处理 + hasNullCommodityCode = true; + break; + } + if (changLogisticsAddressInfo.company_type == 2 && "".equals(tbSaleOrderItems.commodityCode)) {// 对于经销商,商品编码为空,则不再处理 + hasNullCommodityCode = true; + break; + } + + tbSaleOrderItems.quantity = rs.getInt("quantity"); + tbSaleOrderItems.unitPrice = rs.getString("unit_price") == null ? -1 : rs.getDouble("unit_price"); + tbSaleOrderItems.money = rs.getString("money") == null ? -1 : rs.getDouble("money"); + tbSaleOrderItems.commodityTitle = rs.getString("commodity_title"); + tbSaleOrderItems.account = rs.getString("account") == null ? -1 : rs.getDouble("account"); + tbSaleOrderItems.totalFee = rs.getString("total_fee") == null ? -1 : rs.getDouble("total_fee"); + tbSaleOrderItems.adjustFee = rs.getString("adjust_fee") == null ? -1 : rs.getDouble("adjust_fee"); + tbSaleOrderItems.gift = rs.getInt("gift"); + tbSaleOrderItems.saleOrderCode = rs.getString("sale_order_code"); + tbSaleOrderItems.skuMessage = rs.getString("sku_message"); + tbSaleOrderItems.itemId = rs.getString("item_id"); + tbSaleOrderItems.productItemId = rs.getString("product_item_id"); + tbSaleOrderItems.companyCode = rs.getString("company_code"); + tbSaleOrderItems.divideOrderFee = rs.getString("divide_order_fee") == null ? -1 + : rs.getDouble("divide_order_fee"); + tbSaleOrderItems.partMjzDiscount = rs.getString("part_mjz_discount") == null ? -1 + : rs.getDouble("part_mjz_discount"); + tbSaleOrderItems.oid = rs.getString("oid"); + tbSaleOrderItems.obmCompanyCode = rs.getString("obm_company_code"); + tbSaleOrderItems.outer_id = rs.getString("outer_id") == null ? "" : rs.getString("outer_id"); + TbSaleOrderItemsList.add(tbSaleOrderItems); + } + if (!hasNullCommodityCode) { + /* + * 生成新的系统单号 + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String order_code = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).split(" ")[0] + .replaceAll("-", ""); + String new_sale_order = createOrderCode(conn, ps, rs, order_code, "sh_002", + changLogisticsAddressInfo.tid); + new_sale_order = "SH" + new_sale_order; + + for (int j = 0; j < TbSaleOrderItemsList.size(); j++) { + TbSaleOrderItems tbSaleOrderItems = TbSaleOrderItemsList.get(j); + sql = "insert into tb_sale_order_items(code,commodity_code,obm_commodity_code,quantity,unit_price,money,commodity_title,account,total_fee,adjust_fee,gift,sale_order_code,sku_message,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,obm_company_code,outer_id) " + + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order + "_" + (j + 1)); + ps.setString(2, tbSaleOrderItems.commodityCode); + ps.setString(3, tbSaleOrderItems.obmCommodityCode); + ps.setInt(4, tbSaleOrderItems.quantity); + if (tbSaleOrderItems.unitPrice == -1) { + ps.setString(5, null); + } else { + ps.setDouble(5, tbSaleOrderItems.unitPrice); + } + if (tbSaleOrderItems.money == -1) { + ps.setString(6, null); + } else { + ps.setDouble(6, tbSaleOrderItems.money); + } + ps.setString(7, tbSaleOrderItems.commodityTitle); + if (tbSaleOrderItems.account == -1) { + ps.setString(8, null); + } else { + ps.setDouble(8, tbSaleOrderItems.account); + } + if (tbSaleOrderItems.totalFee == -1) { + ps.setString(9, null); + } else { + ps.setDouble(9, tbSaleOrderItems.totalFee); + } + if (tbSaleOrderItems.adjustFee == -1) { + ps.setString(10, null); + } else { + ps.setDouble(10, tbSaleOrderItems.adjustFee); + } + ps.setInt(11, tbSaleOrderItems.gift); + ps.setString(12, new_sale_order); + ps.setString(13, tbSaleOrderItems.skuMessage); + ps.setString(14, tbSaleOrderItems.itemId); + ps.setString(15, tbSaleOrderItems.productItemId); + ps.setString(16, tbSaleOrderItems.companyCode); + if (tbSaleOrderItems.divideOrderFee == -1) { + ps.setString(17, null); + } else { + ps.setDouble(17, tbSaleOrderItems.divideOrderFee); + } + ps.setDouble(18, tbSaleOrderItems.partMjzDiscount); + ps.setString(19, tbSaleOrderItems.oid); + ps.setString(20, tbSaleOrderItems.obmCompanyCode); + ps.setString(21, tbSaleOrderItems.outer_id); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + + } + + // 处理销售单表 + TbSaleOrder tbSaleOrder = new TbSaleOrder(); + List tbSaleOrderList = new ArrayList(); + sql = "select code,platform_code,pay_account,pay_no,platform_status,platform_type,step_status,cod_status,brand_list,quantity ,money ,status ,type ,sale_note,original_sale_order_code,receivables_difference,buyer_nick_name ,buyer_name ,buyer_address,buyer_telephone ,buyer_email ,platform_create_time ,platform_consign_time ,platform_end_time ,platform_modify_time ,buyer_message ,seller_note,pay_money, receivables_money ,total_fee ,adjust_fee ,discount_fee,pay_time,aftersale_order_code,aftersale_order_flag, aftersale_number,invoice_type, pay_mode_id,del_flag,user_id,create_time,shop_code,origin,trade_mode_id,aftersale_seq,cur_delivery_order_code,cur_money,cur_quantity,lock_reason_id,lock_note,cur_invoice_type,company_code,basket_code,write_back_status,write_back_reason,last_aftersale_order_code,storage_code,encrpy_buyer_nick_name,entrust_type,entrust_status,entrust_time,seller_flag,obm_company_code,dealer_purchase_order_code,pre_money,pre_money_voucher,order_splite,invoice_status,obm_storage_code,new_sale_order_code " + + " from tb_sale_order where code=? and shop_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + ps.setString(2, changLogisticsAddressInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + + tbSaleOrder.code = rs.getString("code"); + tbSaleOrder.platformCode = rs.getString("platform_code"); + tbSaleOrder.payAccount = rs.getString("pay_account"); + tbSaleOrder.payNo = rs.getString("pay_no"); + tbSaleOrder.platformStatus = rs.getString("platform_status"); + tbSaleOrder.platformType = rs.getString("platform_type"); + tbSaleOrder.stepStatus = rs.getString("step_status"); + tbSaleOrder.codStatus = rs.getString("cod_status"); + tbSaleOrder.brandList = rs.getString("brand_list"); + tbSaleOrder.quantity = rs.getInt("quantity"); + tbSaleOrder.money = rs.getString("money") == null ? -1 : rs.getDouble("money"); + tbSaleOrder.status = rs.getInt("status"); + tbSaleOrder.type = rs.getInt("type"); + tbSaleOrder.saleNote = rs.getString("sale_note"); + tbSaleOrder.originalSaleOrderCode = rs.getString("original_sale_order_code"); + tbSaleOrder.receivablesDifference = rs.getString("receivables_difference") == null ? -1 + : rs.getDouble("receivables_difference"); + tbSaleOrder.buyerNickName = rs.getString("buyer_nick_name"); + tbSaleOrder.buyerName = rs.getString("buyer_name"); + tbSaleOrder.buyerAddress = rs.getString("buyer_address"); + tbSaleOrder.buyerTelephone = rs.getString("buyer_telephone"); + tbSaleOrder.buyerEmail = rs.getString("buyer_email"); + tbSaleOrder.platformCreateTime = rs.getString("platform_create_time"); + tbSaleOrder.platformConsignTime = rs.getString("platform_consign_time"); + tbSaleOrder.platformEndTime = rs.getString("platform_end_time"); + tbSaleOrder.platformModifyTime = rs.getString("platform_modify_time"); + tbSaleOrder.buyerMessage = rs.getString("buyer_message"); + tbSaleOrder.sellerNote = rs.getString("seller_note"); + tbSaleOrder.payMoney = rs.getString("pay_money") == null ? -1 : rs.getDouble("pay_money"); + tbSaleOrder.receivablesMoney = rs.getString("receivables_money") == null ? -1 + : rs.getDouble("receivables_money"); + tbSaleOrder.totalFee = rs.getString("total_fee") == null ? -1 : rs.getDouble("total_fee"); + tbSaleOrder.adjustFee = rs.getString("adjust_fee") == null ? -1 : rs.getDouble("adjust_fee"); + tbSaleOrder.discountFee = rs.getString("discount_fee") == null ? -1 + : rs.getDouble("discount_fee"); + tbSaleOrder.payTime = rs.getString("pay_time"); + tbSaleOrder.aftersaleOrderCode = rs.getString("aftersale_order_code"); + tbSaleOrder.aftersaleOrderFlag = rs.getInt("aftersale_order_flag"); + tbSaleOrder.aftersaleNumber = rs.getInt("aftersale_number"); + tbSaleOrder.invoiceType = rs.getInt("invoice_type"); + tbSaleOrder.payModeId = rs.getString("pay_mode_id"); + tbSaleOrder.delFlag = rs.getInt("del_flag"); + tbSaleOrder.userId = rs.getString("user_id") == null ? -1 : rs.getInt("user_id"); + tbSaleOrder.createTime = rs.getString("create_time"); + tbSaleOrder.shopCode = rs.getString("shop_code"); + tbSaleOrder.origin = rs.getString("origin") == null ? -1 : rs.getInt("origin"); + tbSaleOrder.tradeModeId = rs.getInt("trade_mode_id"); + tbSaleOrder.aftersaleSeq = rs.getInt("aftersale_seq"); + tbSaleOrder.curDeliveryOrderCode = rs.getString("cur_delivery_order_code"); + tbSaleOrder.curMoney = rs.getDouble("cur_money"); + tbSaleOrder.curQuantity = rs.getInt("cur_quantity"); + tbSaleOrder.lockReasonId = rs.getInt("lock_reason_id"); + tbSaleOrder.lockNote = rs.getString("lock_note"); + tbSaleOrder.curInvoiceType = rs.getInt("cur_invoice_type"); + tbSaleOrder.companyCode = rs.getString("company_code"); + tbSaleOrder.basketCode = rs.getString("basket_code"); + tbSaleOrder.writeBackStatus = rs.getInt("write_back_status"); + tbSaleOrder.writeBackReason = rs.getString("write_back_reason"); + tbSaleOrder.lastAftersaleOrderCode = rs.getString("last_aftersale_order_code"); + tbSaleOrder.storageCode = rs.getString("storage_code"); + tbSaleOrder.encrpyBuyerNickName = rs.getString("encrpy_buyer_nick_name"); + tbSaleOrder.entrustType = rs.getInt("entrust_type"); + tbSaleOrder.entrustStatus = rs.getInt("entrust_status"); + tbSaleOrder.entrustTime = rs.getString("entrust_time"); + tbSaleOrder.sellerFlag = rs.getInt("seller_flag"); + tbSaleOrder.obmCompanyCode = rs.getString("obm_company_code"); + tbSaleOrder.dealerPurchaseOrderCode = rs.getString("dealer_purchase_order_code"); + tbSaleOrder.preMoney = rs.getDouble("pre_money"); + tbSaleOrder.preMoneyVoucher = rs.getString("pre_money_voucher"); + tbSaleOrder.orderSplite = rs.getString("order_splite") == null ? -1 : rs.getInt("order_splite"); + tbSaleOrder.invoiceStatus = rs.getString("invoice_status") == null ? -1 + : rs.getInt("invoice_status"); + tbSaleOrder.obmStorageCode = rs.getString("obm_storage_code"); + tbSaleOrder.newSaleOrderCode = rs.getString("new_sale_order_code"); + } + + sql = "insert into tb_sale_order(code,platform_code,pay_account,pay_no,platform_status,platform_type,step_status,cod_status,brand_list,quantity ,money ,status ,type ,sale_note,original_sale_order_code,receivables_difference,buyer_nick_name ,buyer_name ,buyer_address,buyer_telephone ,buyer_email ,platform_create_time ,platform_consign_time ,platform_end_time ,platform_modify_time ,buyer_message ,seller_note,pay_money, receivables_money ,total_fee ,adjust_fee ,discount_fee,pay_time,aftersale_order_code,aftersale_order_flag, aftersale_number,invoice_type, pay_mode_id,del_flag,user_id,create_time,shop_code,origin,trade_mode_id,aftersale_seq,cur_delivery_order_code,cur_money,cur_quantity,lock_reason_id,lock_note,cur_invoice_type,company_code,basket_code,write_back_status,write_back_reason,last_aftersale_order_code,storage_code,encrpy_buyer_nick_name,entrust_type,entrust_status,entrust_time,seller_flag,obm_company_code,dealer_purchase_order_code,pre_money,pre_money_voucher,order_splite,invoice_status,obm_storage_code,new_sale_order_code) " + + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order); + ps.setString(2, tbSaleOrder.platformCode); + ps.setString(3, tbSaleOrder.payAccount); + ps.setString(4, tbSaleOrder.payNo); + ps.setString(5, tbSaleOrder.platformStatus); + ps.setString(6, tbSaleOrder.platformType); + ps.setString(7, tbSaleOrder.stepStatus); + ps.setString(8, tbSaleOrder.codStatus); + ps.setString(9, tbSaleOrder.brandList); + ps.setInt(10, tbSaleOrder.quantity); + if (tbSaleOrder.money == -1) { + ps.setString(11, null); + } else { + ps.setDouble(11, tbSaleOrder.money); + } + ps.setInt(12, -1); + ps.setInt(13, tbSaleOrder.type); + ps.setString(14, tbSaleOrder.saleNote); + ps.setString(15, new_sale_order); + if (tbSaleOrder.receivablesDifference == -1) { + ps.setString(16, null); + } else { + ps.setDouble(16, tbSaleOrder.receivablesDifference); + } + ps.setString(17, tbSaleOrder.buyerNickName); + ps.setString(18, tbSaleOrder.buyerName); + ps.setString(19, tbSaleOrder.buyerAddress); + ps.setString(20, tbSaleOrder.buyerTelephone); + ps.setString(21, tbSaleOrder.buyerEmail); + ps.setString(22, tbSaleOrder.platformCreateTime); + ps.setString(23, tbSaleOrder.platformConsignTime); + ps.setString(24, tbSaleOrder.platformEndTime); + ps.setString(25, tbSaleOrder.platformModifyTime); + ps.setString(26, tbSaleOrder.buyerMessage); + ps.setString(27, tbSaleOrder.sellerNote); + if (tbSaleOrder.payMoney == -1) { + ps.setString(28, null); + } else { + ps.setDouble(28, tbSaleOrder.payMoney); + } + if (tbSaleOrder.receivablesMoney == -1) { + ps.setString(29, null); + } else { + ps.setDouble(29, tbSaleOrder.receivablesMoney); + } + if (tbSaleOrder.totalFee == -1) { + ps.setString(30, null); + } else { + ps.setDouble(30, tbSaleOrder.totalFee); + } + if (tbSaleOrder.adjustFee == -1) { + ps.setString(31, null); + } else { + ps.setDouble(31, tbSaleOrder.adjustFee); + } + if (tbSaleOrder.discountFee == -1) { + ps.setString(32, null); + } else { + ps.setDouble(32, tbSaleOrder.discountFee); + } + ps.setString(33, tbSaleOrder.payTime); + ps.setString(34, aftersale_order_code); + ps.setInt(35, 1); + ps.setInt(36, 0); + ps.setInt(37, tbSaleOrder.invoiceType); + ps.setString(38, tbSaleOrder.payModeId); + ps.setInt(39, 1); + if (tbSaleOrder.userId == -1) { + ps.setString(40, null); + } else { + ps.setDouble(40, tbSaleOrder.userId); + } + ps.setString(41, sdf.format(new Date())); + ps.setString(42, tbSaleOrder.shopCode); + ps.setDouble(43, 4);// 订单来源为改单 + ps.setInt(44, tbSaleOrder.tradeModeId); + ps.setInt(45, 0); + ps.setString(46, "PS" + new_sale_order); + ps.setDouble(47, tbSaleOrder.curMoney); + ps.setInt(48, tbSaleOrder.curQuantity); + ps.setInt(49, tbSaleOrder.lockReasonId); + ps.setString(50, tbSaleOrder.lockNote); + ps.setInt(51, tbSaleOrder.curInvoiceType); + ps.setString(52, tbSaleOrder.companyCode); + ps.setString(53, tbSaleOrder.basketCode); + ps.setInt(54, tbSaleOrder.writeBackStatus); + ps.setString(55, tbSaleOrder.writeBackReason); + ps.setString(56, tbSaleOrder.lastAftersaleOrderCode); + ps.setString(57, tbSaleOrder.storageCode); + ps.setString(58, tbSaleOrder.encrpyBuyerNickName); + ps.setInt(59, 1); + ps.setInt(60, 1); + ps.setString(61, null); + ps.setInt(62, tbSaleOrder.sellerFlag); + ps.setString(63, tbSaleOrder.obmCompanyCode); + ps.setString(64, tbSaleOrder.dealerPurchaseOrderCode); + ps.setDouble(65, tbSaleOrder.preMoney); + ps.setString(66, tbSaleOrder.preMoneyVoucher); + if (tbSaleOrder.orderSplite == -1) { + ps.setString(67, null); + } else { + ps.setDouble(67, tbSaleOrder.orderSplite); + } + if (tbSaleOrder.invoiceStatus == -1) { + ps.setString(68, null); + } else { + ps.setDouble(68, tbSaleOrder.invoiceStatus); + } + ps.setString(69, tbSaleOrder.obmStorageCode); + ps.setString(70, tbSaleOrder.newSaleOrderCode); + + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + + // 快递单表 + TbDeliveryOrder tbDeliveryOrder = new TbDeliveryOrder(); + sql = "select cost,delivery_mode_code from tb_delivery_order where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbDeliveryOrder.cost = rs.getString("cost") == null ? -1 : rs.getDouble("cost"); + tbDeliveryOrder.deliveryModeCode = rs.getInt("delivery_mode_code"); + } + + sql = "insert into tb_delivery_order (code,sale_order_code,cost,country,state,city,district,post_code,delivery_mode_code,company_code,name,mobile,address,telephone,encrpy_name,encrpy_mobile,encrpy_address,encrpy_telephone,obm_company_code,aftersale_order_code,oaid) " + + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, "PS" + new_sale_order); + ps.setString(2, new_sale_order); + if (tbDeliveryOrder.cost == -1) { + ps.setString(3, null); + } else { + ps.setDouble(3, tbDeliveryOrder.cost); + } + ps.setString(4, changLogisticsAddressInfo.receiver_country); + ps.setString(5, changLogisticsAddressInfo.receiver_state); + ps.setString(6, changLogisticsAddressInfo.receiver_city); + ps.setString(7, changLogisticsAddressInfo.receiver_district); + ps.setString(8, changLogisticsAddressInfo.receiver_zip); + ps.setInt(9, tbDeliveryOrder.deliveryModeCode); + ps.setString(10, changLogisticsAddressOrder.company_code); + ps.setString(11, changLogisticsAddressInfo.receiver_name); + ps.setString(12, changLogisticsAddressInfo.receiver_mobile); + ps.setString(13, changLogisticsAddressInfo.receiver_address); + ps.setString(14, changLogisticsAddressInfo.receiver_phone); + ps.setString(15, changLogisticsAddressInfo.encrpy_name); + ps.setString(16, changLogisticsAddressInfo.encrpy_mobile); + ps.setString(17, changLogisticsAddressInfo.encrpy_address); + ps.setString(18, changLogisticsAddressInfo.encrpy_telephone); + ps.setString(19, changLogisticsAddressOrder.obm_company_code); + ps.setString(20, aftersale_order_code); + ps.setString(21, changLogisticsAddressInfo.oaid); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + // 发票表 + if (changLogisticsAddressOrder.invoice_type == 2) { + TbInvoice tbInvoice = new TbInvoice(); + sql = "select title,content,owner_flag,money,TAX_msg,type_id,create_time,supplier_code,tax,del_flag,company_code,TAX_id,telephone,address,account,bank_of_deposit,note,obm_company_code,obm_settlement_order_code,print_mode,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email,electronic_code,check_code,pdf_url" + + " from tb_invoice where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbInvoice.title = rs.getString("title"); + tbInvoice.content = rs.getString("content"); + tbInvoice.ownerFlag = rs.getInt("owner_flag"); + tbInvoice.money = rs.getDouble("money"); + tbInvoice.taxMsg = rs.getString("TAX_msg"); + tbInvoice.typeId = rs.getInt("type_id"); + tbInvoice.supplierCode = rs.getString("supplier_code"); + tbInvoice.tax = rs.getDouble("tax"); + tbInvoice.companyCode = rs.getString("company_code"); + tbInvoice.taxId = rs.getString("TAX_id"); + tbInvoice.telephone = rs.getString("telephone"); + tbInvoice.address = rs.getString("address"); + tbInvoice.account = rs.getString("account"); + tbInvoice.bankOfDeposit = rs.getString("bank_of_deposit"); + tbInvoice.note = rs.getString("note"); + tbInvoice.obmCompanyCode = rs.getString("obm_company_code"); + tbInvoice.obmSettlementOrderCode = rs.getString("obm_settlement_order_code"); + tbInvoice.printMode = rs.getInt("print_mode"); + tbInvoice.addressTelephone = rs.getString("address_telephone"); + tbInvoice.bankOfDepositAccountNumber = rs.getString("bank_of_deposit_account_number"); + tbInvoice.receiveTelephone = rs.getString("receive_telephone"); + tbInvoice.receiveEmail = rs.getString("receive_email"); + tbInvoice.electronicCode = rs.getString("electronic_code"); + tbInvoice.checkCode = rs.getString("check_code"); + tbInvoice.pdfUrl = rs.getString("pdf_url"); + } + + sql = "insert into tb_invoice (code,type,title,content,owner_flag,status,money,TAX_msg,sale_order_code,type_id,user_id,create_time,supplier_code,tax,del_flag,company_code,TAX_id,telephone,address,account,bank_of_deposit,note,obm_company_code,obm_settlement_order_code,print_mode,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email,electronic_code,check_code,pdf_url)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, "FP" + new_sale_order + "_1"); + ps.setInt(2, 1); + ps.setString(3, tbInvoice.title); + ps.setString(4, tbInvoice.content); + ps.setInt(5, tbInvoice.ownerFlag); + ps.setInt(6, 1); + ps.setDouble(7, tbInvoice.money); + ps.setString(8, tbInvoice.taxMsg); + ps.setString(9, new_sale_order); + ps.setInt(10, tbInvoice.typeId); + ps.setInt(11, 0); + ps.setString(12, sdf.format(new Date())); + ps.setString(13, tbInvoice.supplierCode); + ps.setDouble(14, tbInvoice.tax); + ps.setInt(15, 1); + ps.setString(16, tbInvoice.companyCode); + ps.setString(17, tbInvoice.taxId); + ps.setString(18, tbInvoice.telephone); + ps.setString(19, tbInvoice.address); + ps.setString(20, tbInvoice.account); + ps.setString(21, tbInvoice.bankOfDeposit); + ps.setString(22, tbInvoice.note); + ps.setString(23, tbInvoice.obmCompanyCode); + ps.setString(24, tbInvoice.obmSettlementOrderCode); + ps.setInt(25, tbInvoice.printMode); + ps.setString(26, tbInvoice.addressTelephone); + ps.setString(27, tbInvoice.bankOfDepositAccountNumber); + ps.setString(28, tbInvoice.receiveTelephone); + ps.setString(29, tbInvoice.receiveEmail); + ps.setString(30, tbInvoice.electronicCode); + ps.setString(31, tbInvoice.checkCode); + ps.setString(32, tbInvoice.pdfUrl); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + } + // 处理天猫供销平台订单 + if ("012".equals(changLogisticsAddressOrder.platform_code)) { + // 天猫供销平台主表 + TbSubSaleOrder tbSubSaleOrder = new TbSubSaleOrder(); + sql = "select tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code from tb_sub_sale_order where sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + tbSubSaleOrder.tcOrderId = rs.getString("tc_order_id"); + tbSubSaleOrder.distributorUsername = rs.getString("distributor_username"); + tbSubSaleOrder.tradeType = rs.getInt("trade_type"); + tbSubSaleOrder.buyerPayment = rs.getDouble("buyer_payment"); + tbSubSaleOrder.status = rs.getString("status"); + tbSubSaleOrder.companyCode = rs.getString("company_code"); + } + sql = "insert into tb_sub_sale_order (code,tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code) values(?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order); + ps.setString(2, tbSubSaleOrder.tcOrderId); + ps.setString(3, tbSubSaleOrder.distributorUsername); + ps.setInt(4, tbSubSaleOrder.tradeType); + ps.setDouble(5, tbSubSaleOrder.buyerPayment); + ps.setString(6, tbSubSaleOrder.status); + ps.setString(7, tbSubSaleOrder.companyCode); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + // 天猫供销平台子表 + List tbSubSaleOrderItemsList = new ArrayList(); + sql = "select status,buyer_payment,discount_fee,tc_discountFee,tc_adjust_fee,company_code from tb_sub_sale_order_items where code like ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, changLogisticsAddressOrder.sale_order_code + "_%"); + rs = ps.executeQuery(); + while (rs.next()) { + TbSubSaleOrderItems tbSubSaleOrderItems = new TbSubSaleOrderItems(); + tbSubSaleOrderItems.status = rs.getString("status"); + tbSubSaleOrderItems.buyerPayment = rs.getDouble("buyer_payment"); + tbSubSaleOrderItems.discountFee = rs.getDouble("discount_fee"); + tbSubSaleOrderItems.tcDiscountFee = rs.getDouble("tc_discountFee"); + tbSubSaleOrderItems.tcAdjustFee = rs.getDouble("tc_adjust_fee"); + tbSubSaleOrderItems.companyCode = rs.getString("company_code"); + tbSubSaleOrderItemsList.add(tbSubSaleOrderItems); + } + for (int j = 0; j < tbSubSaleOrderItemsList.size(); j++) { + TbSubSaleOrderItems tbSubSaleOrderItems = tbSubSaleOrderItemsList.get(j); + sql = "insert into tb_sub_sale_order_items (code,status,buyer_payment,tc_discount_fee,discount_fee,tc_adjust_fee,company_code) values(?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, new_sale_order + "_" + (j + 1)); + ps.setDouble(2, tbSubSaleOrderItems.buyerPayment); + ps.setDouble(3, tbSubSaleOrderItems.tcDiscountFee); + ps.setDouble(4, tbSubSaleOrderItems.discountFee); + ps.setDouble(5, tbSubSaleOrderItems.tcAdjustFee); + ps.setDouble(6, tbSubSaleOrderItems.tcAdjustFee); + ps.setString(7, tbSubSaleOrderItems.companyCode); + if (ps.executeUpdate() == 0) { + throw new RuntimeException(); + } + } + } + } + } + logger.info("订单| [ {} ] 收货地址修改登记完成!", changLogisticsAddressInfo.tid); + return true; + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("修改收货地址订单事务执行异常,回滚| [ {} ] :{}", changLogisticsAddressInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * 处理提交OMS接口请求 + * + * @param tid + * @return + */ + public boolean getOMSResult(String tid) throws Exception { + String param = "djbh=" + tid + "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; + HttpRequest httpRequest = new HttpRequest(); + String resultStr = httpRequest.sendGet(plg_url, param, DataParse.class.getName()); + /** + * 如果接口异常,放弃处理 + */ + if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + return false; + } + JSONObject json = new JSONObject(resultStr); + String isSuccess = json.getString("isSuccess"); + return !"100".equals(isSuccess) && !"103".equals(isSuccess); + } + + public HashMap sendInterceptToPLG(String orderId) { + HashMap returnMap = new HashMap(); + try { + String key = "JnNBxiJ"; + String warehouseCode = "PLGBF"; + // 验证内容:orderId+作废时间(yyyyMMddHHmm)+key+ warehouseCode + // Key= JnNBxiJ 作废时间=接口调用时间支持±1分钟的误差 加密算法为md5,加密后的md5值要大写 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + String cancelTime = sdf.format(new Date()); + MD5Util md5 = new MD5Util(); + String sourceToken = orderId + cancelTime + key + warehouseCode; + String token = md5.MD5(sourceToken).toUpperCase(); + HashMap map = new HashMap(); + map.put("token", token); + map.put("orderId", orderId); + map.put("warehouseCode", warehouseCode); + // map.put("cancelReason", "客户取消"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + HttpRequest httpRequest = new HttpRequest(); + + String result = httpRequest.sendPost(plg_url, json, 2, DataParse.class.getName()); + logger.info("PLG拦截接口返回信息| {}", result); + HashMap resultMap = gson.fromJson(result, new TypeToken>() { + }.getType()); + boolean flag = false; + int code = -1; + if (resultMap.containsKey("flag")) { + String resultFlag = resultMap.get("flag"); + if ("success".equals(resultFlag)) { + flag = true; + } + } + if (resultMap.containsKey("code")) { + code = Integer.valueOf(resultMap.get("code")); + } + + returnMap.put("result", result); + if ((code >= 0 && flag) || code == -2) { + returnMap.put("flag", "true"); + } else { + returnMap.put("flag", "flase"); + } + } catch (Exception e) { + logger.info("PLG拦截订单调用接口执行异常,订单号| [ {} ] :{}", orderId, e.toString()); + } + + return returnMap; + } + + /** + * 更新买家发货给卖家的退货单的快递编码 + * + * @param refund_id + * @param sid + * @return + */ + public boolean insertRefundDeliveryCode(String refund_id, String sid, String company_code) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + String aftersale_code = ""; + String obm_company_code = ""; + String sql = ""; + conn = dbpc.getConnection(); + sql = "select a.company_code,a.obm_company_code,b.code from tb_sale_order a,tb_aftersale_order b,tb_shop c where a.code=b.sale_order_code and a.shop_code=c.code and c.auto_aftersale_flag=2 and b.platform_refund_code=? and b.company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, refund_id); + ps.setString(2, company_code); + rs = ps.executeQuery(); + if (rs.next()) { + aftersale_code = rs.getString("code"); + company_code = rs.getString("company_code") == null ? "" : rs.getString("company_code"); + obm_company_code = rs.getString("obm_company_code") == null ? "" : rs.getString("obm_company_code"); + if (aftersale_code == null || "".equals(aftersale_code)) { + logger.info("买家退货给卖家订单| [ {} ] 查询到售后单编码为空,为异常数据!", refund_id); + return true; + } + } else { + logger.info("买家退货给卖家订单| [ {} ] 对应的售后单号未登记售后单,放弃处理!", refund_id); + return true; + } + /** + * 查询售后单是否已经登记过退货单号 flag:true已经登记过,false:未登记过 + */ + sql = "update tb_aftersale_order set platform_refund_delivery_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sid); + ps.setString(2, aftersale_code); + if (ps.executeUpdate() == 0) { + logger.info("买家退货给卖家订单| [ {} ] 登记失败!", refund_id); + return false; + } + logger.info("买家退货给卖家订单| [ {} ] 登记成功!", refund_id); + return true; + } catch (SQLException e) { + logger.error(this, e); + logger.info("买家退款给卖家订单| [ {} ] (退款单号)登记异常:{}", refund_id, e.toString()); + return false; + } catch (Exception e) { + logger.error(this, e); + logger.info("买家退款给卖家订单| [ {} ] (退款单号)登记异常:{}", refund_id, e.toString()); + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * 该方法将差评写入数据库 + * + * @param traderateInfo + * @return + */ + + public boolean badTag(TraderateInfo traderateInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + String sql = ""; + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "insert into tb_rate_bad (platform_code,shop_code,buyer_nick_name,rate_type,add_flag,num_iid,product_title,rate_content,key_word,company_code,rate_time)" + + " values (?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, traderateInfo.tid); + ps.setString(2, traderateInfo.shop_code); + ps.setString(3, traderateInfo.buyer_nick); + ps.setString(4, traderateInfo.rate_type); + ps.setInt(5, traderateInfo.add_flag); + ps.setLong(6, traderateInfo.num_iid); + ps.setString(7, traderateInfo.item_title); + ps.setString(8, traderateInfo.rate_content); + ps.setString(9, traderateInfo.key_word); + ps.setString(10, traderateInfo.company_code); + ps.setString(11, traderateInfo.rate_time); + return ps.executeUpdate() != 0; + } catch (SQLException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * emp自检程序 + * + * @param shopCode + * @param companyCode + * @param tid + * @param pay_time + * @return + */ + public boolean emp_check(String shopCode, String companyCode, String tid, String pay_time) { + File file = new File("TradeCheck.xls"); + boolean found = false; + int count = 0; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + // conn = OrderSync.dbUtil.getDbConn(); + try { + conn = dbpc.getConnection(); + sql = "select 1 from tb_sale_order where platform_code=? and shop_code=? and company_code=? limit 1"; + ps = conn.prepareStatement(sql); + ps.setString(1, tid); + ps.setString(2, shopCode); + ps.setString(3, companyCode); + rs = ps.executeQuery(); + if (rs.next()) { + found = true; + flag_check_exist = true; + return false; + } + if (!found) { + logger.info("未写入新订单| [ {} ] ,付款时间|{}", tid, pay_time); + } + + if (file.exists()) { + Workbook readwb = null; + InputStream instream = new FileInputStream(file); + readwb = Workbook.getWorkbook(instream); + Sheet readsheet = readwb.getSheet(0); + count = readsheet.getRows(); + + } else { + WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(file)); + // 创建新的一页 + WritableSheet sheet = wwb.createSheet("TradeCheck", 0); + // 创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容 + Label xuhao = new Label(0, 0, "序号"); + sheet.addCell(xuhao); + Label id = new Label(1, 0, "TID"); + sheet.addCell(id); + Label shopcode = new Label(2, 0, "ShopCode"); + sheet.addCell(shopcode); + Label paytime = new Label(3, 0, "pay_time"); + sheet.addCell(paytime); + + wwb.write(); + wwb.close(); + count++; + } + + Workbook readwb = Workbook.getWorkbook(file); + WritableWorkbook wwb = Workbook.createWorkbook(file, readwb); + // 读取第一张工作表 + WritableSheet sheet = wwb.getSheet(0); + + sheet.addCell(new Label(0, count, String.valueOf(count))); + sheet.addCell(new Label(1, count, tid)); + sheet.addCell(new Label(2, count, shopCode)); + sheet.addCell(new Label(3, count, pay_time)); + wwb.write(); + wwb.close(); + readwb.close(); + return true; + } catch (Exception e) { + logger.error(this, e); + flag_check_exception = true; + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + private class TradeMemoModify extends Thread { + public TradeInfo tradeInfo; + + public TradeMemoModify(TradeInfo tradeInfo) { + this.tradeInfo = tradeInfo; + } + + private int modify_error_loop = 3; + + @Override + public void run() { + try { + if (!tradeMemoModify()) { + logger.info("修改订单备注信息失败!"); + for (int i = 0; i < modify_error_loop; i++) { + if (!tradeMemoModify()) { + logger.info("修改订单备注信息失败!第:{}次重试", i + 1); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + logger.error(this, e); + } + } else {// 如果有异常,最多重试三次,只要其中一次成功,跳出 + break; + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * TradeMemoModify修改订单处理 + * + * @param tradeInfo + * @return + */ + private boolean tradeMemoModify() { + boolean res = false; + // Connection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + + if (modifyTransaction(conn, ps)) { + logger.info("订单修改成功| [ {} ] ", tradeInfo.tid); + res = true; + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("订单修改事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + private boolean modifyTransaction(DruidPooledConnection conn, PreparedStatement ps) throws Exception { + String sql = ""; + sql = "update tb_sale_order set buyer_message =?,seller_note =? where platform_code =? and shop_code=? and company_code=?;"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.buyer_message); + ps.setString(2, tradeInfo.seller_memo); + ps.setString(3, tradeInfo.tid); + ps.setString(4, tradeInfo.shop_code); + ps.setString(5, tradeInfo.company_code); + ps.executeUpdate(); + return true; + } + } + + /** + * TradeParseSuccessThread 订单队列处理线程 + * + * @author Lewis + */ + private class TradeParseSuccessThread extends Thread { + @Override + public void run() { + try { + if (tradeQueue_Success.size() > 0) { + TradeInfo tradeInfo = tradeQueue_Success.get(0); + logger.info("处理交易成功订单数据 [ {} ] ,所属店铺:{}", tradeInfo.tid, tradeInfo.shop_code); + if (tradeSuccess(tradeInfo)) { + tradeQueue_Success.remove(0); + } else { + loop(tradeInfo); + } + logger.info("交易成功订单待写库队列总数: [ {} ] ", tradeQueue_Success.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + + private void loop(TradeInfo tradeInfo) throws Exception { + if (tradeInfo.retry_times >= 5) { + // 错误重试次数超过5次,放弃处理此消息,不含初始处理的1次 + logger.info("交易成功订单处理重试超限,放弃处理| [ {} ] ", tradeInfo.tid); + tradeQueue_Success.remove(0); + } else { + tradeInfo.retry_times += 1; + logger.info("交易成功订单第 [ {} ] 次处理失败,将于 [ {} ] 分钟后重试| [ {} ] " + tradeInfo.retry_times, + tradeInfo.retry_times - 1, tradeInfo.tid); + try { + Thread.sleep(1000 * 60 * (tradeInfo.retry_times - 1)); + } catch (InterruptedException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + } + + /** + * TradeSuccess交易成功订单处理 + * + * @param tradeInfo + * @return + */ + public synchronized boolean tradeSuccess(TradeInfo tradeInfo) { + boolean res = false; + String sql = ""; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + + if (successTransaction(tradeInfo, conn, ps, rs)) { + logger.info("交易成功订单处理成功 [ {} ] ", tradeInfo.tid); + res = true; + } else { + res = false; + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("交易成功订单处理事务执行异常,回滚| [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败|{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + private boolean successTransaction(TradeInfo tradeInfo, Connection conn, PreparedStatement ps, ResultSet rs) + throws Exception { + // sql = "UPDATE tb_sale_order SET buyer_message =?,seller_note =? WHERE + // platform_code =?;"; + String sql = ""; + boolean found = false; + String order_code = ""; + sql = "select s.code " + " from tb_sale_order s ,tb_shop sh,tb_finance_order f,tb_storage_out_order st" + + " where sh.code =s.shop_code and s.code = st.sale_order_code and st.code = f.order_code and s.platform_code = ? and s.shop_code =? and s.company_code = ? and f.status = 1 and f.type = 1 and f.sub_type = 1 and f.order_type = 5"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.shop_code); + ps.setString(3, tradeInfo.company_code); + rs = ps.executeQuery(); + while (rs.next()) { + order_code = rs.getString("code"); + found = true; + } + if (!found) { + logger.info("交易成功订单未找到,放弃处理 [ {} ] ", tradeInfo.tid); + return true; + } + // order_code = "CK" + order_code; + sql = "update tb_finance_order set received_payments_type = ?,status = ?,note=? where order_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 1); + ps.setInt(2, 2); + ps.setString(3, "自动回款"); + ps.setString(4, "CK" + order_code); + if (ps.executeUpdate() == 0) { + return false; + } + sql = "insert into tb_aduit (aduit_user_id,module_code,sale_order_code,finance_order_code,storage_out_order_code,company_code)" + + " values (?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 0); + ps.setString(2, "03040101"); + ps.setString(3, order_code); + ps.setString(4, "CWCK" + order_code); + ps.setString(5, "CK" + order_code); + ps.setString(6, tradeInfo.company_code); + return ps.executeUpdate() != 0; + } + + /** + * memcache初始化统一调用ordersyncs的memcacheInit方法获取实例 + * + * @author Lewis + */ + + public class TradeProcessThread extends Thread { + TradeInfo tradeInfo; + MemcachedClient mcc; + + public TradeProcessThread(TradeInfo tradeInfo, MemcachedClient mcc) { + this.tradeInfo = tradeInfo; + this.mcc = mcc; + } + + @Override + public void run() { + try { + TradeInfo tradeInfoUseWhileException = (TradeInfo) tradeInfo.deepClone();// 备份订单信息,用于订单写入异常时回滚 + if (tradeProcess()) { + return; + } + + if (tradeInfoUseWhileException.trade_type2 == 0) { + logger.info("订单| [ {} ] 写入失败,加入异常处理订单", tradeInfoUseWhileException.tid); + exceptionTradeQueue.add(tradeInfoUseWhileException); + } else if (tradeInfo.trade_type2 == 2) { + + /** + * 将未写入订单重新写入 此处分为 csv 文件 和 excel 文件 + */ + String msg = "订单写入异常"; + if (tradeInfoUseWhileException.out_path.endsWith(Constants.CSV_FILE_SUFFIX)) { + writeCsvErrorFile(tradeInfoUseWhileException, msg); + } else { + + recordErrorReplenishTrade(tradeInfo, msg); + String[] out_paths = tradeInfo.out_path.split("/"); + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, "失败", + out_paths[out_paths.length - 1]); + } + + } else if (tradeInfo.trade_type2 == 1) { + String msg = "订单写入异常"; + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, msg, ""); + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * tradeProcess 新订单处理 + * + * @return + */ + public boolean tradeProcess() { + // boolean found; + boolean res = false; + String sql = ""; + /* + * 暂时弃用jdbc连接 + * + * Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; + * conn = OrderSyncs.dbUtil.getDbConn(); if (conn == null) { return res; } + */ + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + // 查询订单是否已存在 + boolean found = false;// 用于判断订单是否存在的开关 + // 检查普通订单 + if (!"".equals(tradeInfo.tid)) { + sql = "SELECT 1 FROM tb_shop ts, tb_sale_order tso WHERE ts. CODE = tso.shop_code AND tso.platform_code = ? AND ts.platform_code = ? LIMIT 1;"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.tid); + ps.setString(2, tradeInfo.platform_code); + rs = ps.executeQuery(); + if (rs.next()) { + found = true; + } + } + if (found) { + logger.info("新订单已存在 [ {} ] ", tradeInfo.tid); + /** + * 将未写入订单重新写入Excel表 + */ + if (tradeInfo.trade_type2 == 2) { + String msg = "订单已存在"; + if (tradeInfo.out_path.endsWith(Constants.CSV_FILE_SUFFIX)) { + writeCsvErrorFile(tradeInfo, msg); + } else { + recordErrorReplenishTrade(tradeInfo, msg); + String[] out_paths = tradeInfo.out_path.split("/"); + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, "失败", + out_paths[out_paths.length - 1]); + } + + } + if (tradeInfo.trade_type2 == 1) { + String msg = "订单已存在"; + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, msg, ""); + } + + res = true; + } else { + if (insertTradeTransaction(tradeInfo, conn, ps, rs)) { + logger.info("新订单写入成功| [ {} ] 时间->{}", tradeInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + if (tradeInfo.trade_type2 == 1) { + String msg = "订单写入成功"; + OrderSyncs.updateReplenishResult(conn, ps, tradeInfo.replenish_code, msg, ""); + } + /** + * 将新订单加入库存修改的队列 + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String now = sdf.format(new Date()); + if (now.compareTo(stopStartTime) < 0 || now.compareTo(stopEndTime) >= 0) { + OrderSyncs.storageUpdate.ImmediateUpdateQueue.add(tradeInfo); + } + + res = true; + } else { + logger.info("新订单事务执行异常,回滚 [ {} ] ", tradeInfo.tid); + conn.rollback(); + res = false; + } + } + } catch (Exception e) { + logger.error(this, e); + try { + logger.info("新订单事务执行异常,回滚 [ {} ] :{}", tradeInfo.tid, e.toString()); + logger.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + logger.error(this, e1); + logger.info("回滚执行失败{}", e1.toString()); + } catch (Exception e1) { + logger.error(this, e1); + logger.info("回滚执行失败{}", e1.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + return res; + } + + /** + * insertTradeTransaction 事务方式新增订单数据 + * + * @param TradeInfo tradeInf + * @param Connection conn + * @param PreparedStatement ps + * @throws Exception + */ + + private boolean insertTradeTransaction(TradeInfo originalTradeInfo, DruidPooledConnection conn, + PreparedStatement ps, ResultSet rs) { + TradeInfo copyTradeInfo = null; + try { + // 锁单原因 + String liveStreamLockTradeReason = ""; + /** + * 深拷贝originalTradeInfo,保持事务回退时originalTradeInfo的内容不变 + * + */ + String activity_mcc_key = "_sa_V2.0_";// 当前店铺中所有的活动规则信息 + String rule_mcc_key = "_sr_V2.0_";// 每一条活动规则 + copyTradeInfo = originalTradeInfo; + // 生成系统订单号 + String sql = ""; + String[] a = copyTradeInfo.pay_time.split(" "); + String order_code = a[0].replaceAll("-", ""); + + if ("".equals(tradeInfo.pay_time)) { + order_code = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).split(" ")[0] + .replaceAll("-", ""); + } + // 生成订单号 + order_code = createOrderCode(conn, ps, rs, order_code, tradeInfo.platform_code, tradeInfo.tid); + // 补录订单单号头 + if (tradeInfo.trade_type2 != 0) { + order_code = order_code.replace("XT", "XTBL"); + } + if ("".equals(tradeInfo.tid)) { + tradeInfo.tid = order_code; + } + + if ("".equals(order_code)) { + logger.info("新订单系统单号生成异常!"); + return false; + } + /* + * 对于快团团和群接龙的订单,根据tb_commodity_shop_sku表查到的数据,不能写入memcached缓存 + * 否则在商品修改了之后,缓存数据不会被清除,会引起数据不一致的情况发生 + */ + boolean commodityCodeUnput2CacheFlag = false; + // 补款分流判断 + int type_kind = 0;// 如果判断订单商品全部属于补款,则将值改为4 + if ((copyTradeInfo.orders.length == 1)) { + liveStreamLockTradeReason = checkTradeLockReason(liveStreamLockTradeReason, + copyTradeInfo.shopMessage.getOrder_sync_lock_keyword(), copyTradeInfo.orders[0].title); + // try { + // 将商品跟淘宝平台一样分配 + if (!"001".equals(copyTradeInfo.platform_code) && !"002".equals(copyTradeInfo.platform_code) + && !"012".equals(copyTradeInfo.platform_code)) { + copyTradeInfo.orders[0].divide_order_fee = copyTradeInfo.money; + copyTradeInfo.orders[0].part_mjz_discount = copyTradeInfo.discount_fee; + } + + if (!"".equals(copyTradeInfo.orders[0].platform_seller_code)) { + String platform_seller_code = copyTradeInfo.orders[0].platform_seller_code; + String key = copyTradeInfo.company_code + "_c" + platform_seller_code; + + /** + * memcached不支持key中有空格,如果key的值中存在空格,对key进行base64编码,作为新的key存入memcached + */ + if (key.indexOf(" ") > -1) { + key = base64Encode(key); + } + + /** + * 如果更新存储的键值对,同时更新掉预售订单写入方法:insertPretradeTransaction中的存储的键值对相应的 + */ + if (mcc == null || (mcc.get(key) == null)) { + // 商品形态(1:实物2:虚物 3:服务 4:补价 5:包材) + int kind = 0; + int commodity_class = 0; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + copyTradeInfo.company_code + "' and a.platform_seller_code= '" + + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind");// 商品形态(1:实物2:虚物 3:服务 4:补价 5:包材) + commodity_class = rs.getInt("class");// 商品种类(1:单品 2:组合 3:配件) + if (rs.getString("name") != null) { + copyTradeInfo.brand = rs.getString("name");// 品牌名称 + } + copyTradeInfo.orders[0].commodity_code = rs.getString("code") == null ? "" + : rs.getString("code");// 商品编码 + copyTradeInfo.orders[0].commodity_class = commodity_class; + if ("".equals(copyTradeInfo.orders[0].commodity_code)) { + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, 0, commodityCodeUnput2CacheFlag); + } + } + if (mcc != null && !commodityCodeUnput2CacheFlag) { + Map map = new ConcurrentHashMap(); + map.put("brand", copyTradeInfo.brand); + map.put("kind", String.valueOf(kind)); + map.put("code", copyTradeInfo.orders[0].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key, 0, jsonStr); + } + + if (kind == 4) { + type_kind = 4; + logger.info("查询数据库成功,商品 [ {} ] 为补款商品,已添加到memcache", platform_seller_code); + } + } else { + copyTradeInfo.orders[0].commodity_code = ""; + copyTradeInfo.orders[0].commodity_class = 1; + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, 0, commodityCodeUnput2CacheFlag); + } + logger.info("数据库未查询到 [ {} ] 记录,不添加memcache!", platform_seller_code); + } + + } else { + String jsonStr = (String) mcc.get(key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + String kind = (String) json.get("kind"); + String brand = json.get("brand").toString(); + copyTradeInfo.orders[0].commodity_code = json.get("code") == null ? "" + : (String) json.get("code"); + copyTradeInfo.orders[0].commodity_class = Integer + .valueOf((String) json.get("commodity_class")); + if ("".equals(copyTradeInfo.orders[0].commodity_code)) { + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, 0, commodityCodeUnput2CacheFlag); + } + } + copyTradeInfo.brand = brand; + if (Integer.valueOf(kind) == 4) { + logger.info("查询memcache成功,商品 [ {} ] 为补款商品", platform_seller_code); + type_kind = 4; + } + } + } else { + copyTradeInfo.orders[0].commodity_code = ""; + copyTradeInfo.orders[0].commodity_class = 1; + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, 0, commodityCodeUnput2CacheFlag); + } + + } + + } else if (copyTradeInfo.orders.length > 1) { + double orders_discount_fee = 0; + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo order = copyTradeInfo.orders[i]; + liveStreamLockTradeReason = checkTradeLockReason(liveStreamLockTradeReason, + copyTradeInfo.shopMessage.getOrder_sync_lock_keyword(), order.title); + // 将商品跟淘宝平台一样分配 + if (!"001".equals(copyTradeInfo.platform_code) && !"002".equals(copyTradeInfo.platform_code) + && !"012".equals(copyTradeInfo.platform_code)) { + if (i < copyTradeInfo.orders.length - 1) { + order.part_mjz_discount = (Double.valueOf(copyTradeInfo.discount_fee) * (Math.round( + Double.valueOf(order.total_fee) / Double.valueOf(copyTradeInfo.product_fee) * 100) + / 100.0)) + ""; + order.divide_order_fee = order.payment; + orders_discount_fee = orders_discount_fee + Double.valueOf(order.part_mjz_discount); + } + if (i == copyTradeInfo.orders.length - 1) { + order.part_mjz_discount = (Double.valueOf(copyTradeInfo.discount_fee) + - orders_discount_fee) + ""; + order.divide_order_fee = order.payment; + } + } + + if (!"".equals(order.platform_seller_code)) { + String company_code = copyTradeInfo.company_code; + String platform_seller_code = order.platform_seller_code; + String key = company_code + "_c" + platform_seller_code; + + /** + * memcached不支持key中有空格,如果key的值中存在空格,对key进行base64编码,作为新的key存入memcached + */ + if (key.indexOf(" ") > -1) { + key = base64Encode(key); + } + + if (mcc == null || (mcc.get(key) == null)) { + int kind = 0; + int commodity_class = 0; + String brand = ""; + sql = "select a.code,a.kind,b.name,a.class from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + company_code + "' and a.platform_seller_code= '" + platform_seller_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + kind = rs.getInt("kind"); + commodity_class = rs.getInt("class"); + if (rs.getString("name") != null) { + brand = rs.getString("name"); + } + copyTradeInfo.orders[i].commodity_code = rs.getString("code") == null ? "" + : rs.getString("code"); + copyTradeInfo.orders[i].commodity_class = commodity_class; + if ("".equals(copyTradeInfo.orders[i].commodity_code)) { + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap + .containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, i, + commodityCodeUnput2CacheFlag); + } + } + if (copyTradeInfo.brand.length() == 0) { + copyTradeInfo.brand = brand; + } else { + if (copyTradeInfo.brand.indexOf(brand) == -1) { + copyTradeInfo.brand = copyTradeInfo.brand + " " + brand; + } + } + if (mcc != null && !commodityCodeUnput2CacheFlag) { + Map map = new ConcurrentHashMap(); + map.put("brand", brand); + map.put("kind", String.valueOf(kind)); + map.put("code", copyTradeInfo.orders[i].commodity_code); + map.put("commodity_class", String.valueOf(commodity_class)); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(key, 0, jsonStr); + } + + } else { + copyTradeInfo.orders[i].commodity_code = ""; + copyTradeInfo.orders[i].commodity_class = 1; + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, i, commodityCodeUnput2CacheFlag); + } + + logger.info("数据库未查询到 [ {} ] 记录,不添加memcache!", platform_seller_code); + } + } else { + String jsonStr = (String) mcc.get(key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + String brand = json.getString("brand"); + copyTradeInfo.orders[i].commodity_code = json.getString("code") == null ? "" + : json.getString("code"); + copyTradeInfo.orders[i].commodity_class = Integer + .valueOf((String) json.get("commodity_class")); + if ("".equals(copyTradeInfo.orders[i].commodity_code)) { + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, i, commodityCodeUnput2CacheFlag); + } + } + if (copyTradeInfo.brand.length() == 0) { + copyTradeInfo.brand = brand; + } else { + if (copyTradeInfo.brand.indexOf(brand) == -1) { + copyTradeInfo.brand = copyTradeInfo.brand + " " + brand; + } + } + } + } else { + copyTradeInfo.orders[i].commodity_code = ""; + copyTradeInfo.orders[i].commodity_class = 1; + copyTradeInfo.null_code = true; + if (nullCommodityPlatformSpecialDealMap.containsKey(copyTradeInfo.platform_code)) { + setCommodityCode(conn, ps, rs, copyTradeInfo, i, commodityCodeUnput2CacheFlag); + } + } + } + } + + String shop_code = copyTradeInfo.shop_code; + String activity_key = copyTradeInfo.company_code + activity_mcc_key + shop_code; + + // 122_sa_V2.0_20180224211 + List rules = Collections.synchronizedList(new ArrayList()); + if (mcc == null || (mcc.get(activity_key) == null)) { + sql = "select b.gift_activity_code,a.name as activity_name,a.shop_code,a.company_code,b.begin_time,b.end_time," + + "b.code as rule_code,b.name as rule_name,b.seq as rule_seq," + + "b.apply_object as rule_apply_object,b.pre_sale_flag as rule_pre_sale_flag," + + "b.pay_money as rule_pay_money,b.promotion_mode as rule_promotion_mode," + + "b.any_commodity as rule_any_commodity,b.any_number as rule_any_number," + + "b.appoint_commodity as rule_appoint_commodity,b.gift_mode as rule_gift_mode," + + "b.delivery_type_id as rule_delivery_type_id," + + "b.superposition_mode as rule_superposition_mode," + + "b.gift_limit_condition as rule_gift_limit_condition," + + "b.limit_number as rule_limit_number,b.gift_current as rule_gift_current," + + "b.order_current as rule_order_current,b.presell_sort as rule_presell_sort," + + "b.gift_commodity as rule_gift_commodity," + + "b.presell_begin_time as rule_presell_begin_time," + + "b.presell_end_time as rule_presell_end_time " + + "from tb_gift_activity a,tb_gift_activity_rule b where a.status = 2 " + + "and b.gift_activity_code = a.code and a.shop_code=? order by b.gift_activity_code,b.seq desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, copyTradeInfo.shop_code); + rs = ps.executeQuery(); + while (rs.next()) { + Rule rule = new Rule(); + rule.gift_activity_code = rs.getString("gift_activity_code"); + rule.activity_name = rs.getString("activity_name"); + rule.activity_shop_code = rs.getString("shop_code"); + rule.activity_company_code = rs.getString("company_code"); + rule.activity_begin_time = rs.getString("begin_time"); + rule.activity_end_time = rs.getString("end_time"); + rule.rule_code = rs.getString("rule_code"); + rule.rule_name = rs.getString("rule_name"); + rule.rule_seq = rs.getInt("rule_seq"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_pre_sale_flag = rs.getInt("rule_pre_sale_flag"); + rule.rule_pay_money = rs.getString("rule_pay_money"); + rule.rule_gift_mode = rs.getString("rule_gift_mode"); + if ("1".equals(rule.rule_apply_object) && rule.rule_pay_money == null) { + rule.rule_pay_money = "0"; + if ("2".equals(rule.rule_gift_mode)) { + rule.rule_gift_mode = "1"; + } + } + rule.rule_promotion_mode = rs.getString("rule_promotion_mode"); + rule.rule_any_commodity = rs.getString("rule_any_commodity") == null ? "" + : rs.getString("rule_any_commodity"); + rule.rule_any_number = rs.getString("rule_any_number") == null ? "" + : rs.getString("rule_any_number"); + rule.rule_appoint_commodity = rs.getString("rule_appoint_commodity") == null ? "" + : rs.getString("rule_appoint_commodity"); + rule.rule_delivery_type_id = rs.getInt("rule_delivery_type_id"); + rule.rule_superposition_mode = rs.getString("rule_superposition_mode"); + rule.rule_gift_limit_condition = rs.getString("rule_gift_limit_condition"); + rule.rule_limit_number = rs.getString("rule_limit_number"); + rule.rule_gift_current = rs.getInt("rule_gift_current"); + rule.rule_order_current = rs.getInt("rule_order_current"); + rule.rule_presell_sort = rs.getInt("rule_presell_sort"); + rule.rule_gift_commodity = rs.getString("rule_gift_commodity") == null ? "" + : rs.getString("rule_gift_commodity"); + rule.rule_presell_begin_time = rs.getString("rule_presell_begin_time") == null ? "" + : rs.getString("rule_presell_begin_time"); + rule.rule_presell_end_time = rs.getString("rule_presell_end_time") == null ? "" + : rs.getString("rule_presell_end_time"); + rules.add(rule); + /* + * 对于赠品数量有限额的活动条目,将该条目单独存入memcached + */ + if (mcc != null && ("2".equals(rule.rule_gift_limit_condition) + || "3".equals(rule.rule_gift_limit_condition))) { + // 记录添加到memcache + + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = rule.rule_order_current; + gn.gift_current = rule.rule_gift_current; + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + + mcc.add(rule_key, 0, jsonStr);// 此处memcache不能用set方法,set包含add和replace,在并发时会覆盖掉已经写入的rule_key的数据,造成数据错误 + } + } + if (mcc != null) { + // 将查询到的店铺活动的集合转化为json对象放入memcache + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonArray = gson.toJson(rules); + mcc.set(activity_key, 0, jsonArray); + } + } else { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = (String) mcc.get(activity_key); + rules = gson.fromJson(jsonStr, new TypeToken>() { + }.getType()); + } + + // String o1g1_fit_rules = "";// 记录符合的规则,对于一单只送1只的规则,防止多次赠送 + // String order_limit_fit_rules = "";// 记录符合的规则,对于单数限制的规则,一单计数只加1,防止多加 + String seq_fit_rules = "";// 对于有排序要求的记录符合的活动编码,其他规则不再赠送. + int seq_nextnum_rules = 0;// 对于有排序要求的活动,而订单中由于高优先级的活动中赠品送完,这部分未配送赠品的又符合低优先级的活动,对该部分做记录并配送低优先级活动赠品 + double seq_nextmoney_rules = 0.0;// 对于有排序要求的活动,高优先级不够送的,记录下来,查询有没有低优先级,有的话用低优先级继续送 + // 插入商品 + // int n = 0;// 用于计数赠品赠送的次数 + // int gift_num = 0;// 临时存储赠品数量 + // OrderInfo [] giftArray = {};// 临时存储赠品相关信息 + // boolean f = false;// 判断是否有赠品加入订单 + int delivery_type_id = copyTradeInfo.delivery_mode_id;// 记录快递公司编码,定时查询数据库 + String state = "";// 记录不包邮地区 + int orders_Length = copyTradeInfo.orders.length; + + /******************************** 新活动处理逻辑begin ********************************/ + // 将订单中的商品信息滤重 + Map tradeCommodityInfo = new HashMap();// 订单商品信息 + for (int i = 0; i < orders_Length; i++) { + String commodity_code = copyTradeInfo.orders[i].commodity_code; + if ("".equals(commodity_code)) { + continue; + } + String commodity_num = String.valueOf(copyTradeInfo.orders[i].num); + if (tradeCommodityInfo.containsKey(commodity_code)) { + String commodity_number = tradeCommodityInfo.get(commodity_code); + commodity_number = String + .valueOf(Integer.parseInt(commodity_number) + Integer.parseInt(commodity_num)); + tradeCommodityInfo.put(commodity_code, commodity_number); + } else { + tradeCommodityInfo.put(commodity_code, commodity_num); + } + } + // 遍历所有活动中指定的规则 + for (int i = 0; i < rules.size(); i++) { + Rule rule = rules.get(i); + // 判断订单付款时间是否在活动范围内 + if (!(copyTradeInfo.pay_time.compareTo(rule.activity_begin_time) >= 0 + && copyTradeInfo.pay_time.compareTo(rule.activity_end_time) <= 0)) { + continue; + } + // 判断是否符合预售条件 + if ("002".equals(copyTradeInfo.platform_code) || "005".equals(copyTradeInfo.platform_code) + || "003".equals(copyTradeInfo.platform_code)) { + if (rule.rule_pre_sale_flag == 2 && "step".equals(copyTradeInfo.type)) { + continue; + } + if (rule.rule_pre_sale_flag == 3 && !("step".equals(copyTradeInfo.type))) { + continue; + } + } + // 有顺序的规则,判断是否送过,如已经送过,则直接跳过 + if (rule.rule_seq > 0) { + if (seq_fit_rules.indexOf(rule.gift_activity_code) >= 0) { + continue; + } + } + // 判断送顺丰包邮时,不包邮地区直接跳过 + if (rule.rule_gift_mode.equals("3") && state.indexOf(copyTradeInfo.receiver_state) >= 0) { + continue; + } + + int gift_copies = 0;// 用于记录要赠送的赠品份数 + boolean rule_flag = false;// 用于判断是否满足活动规则 + // 适用对象为商品 + Map ruleAppointCommodityInfo = new HashMap<>(); + if (rule.rule_apply_object.equals("2") && rule.rule_promotion_mode.equals("2")) { + ruleAppointCommodityInfo = getCommodityInfo(rule.rule_appoint_commodity);// 活动方式为指定搭配时指定的商品信息 + } + + Map giftCommodityInfo = new HashMap<>(); + if (rule.rule_gift_mode.equals("2")) { + giftCommodityInfo = getCommodityInfo(rule.rule_gift_commodity);// 活动赠品信息 + } + + /** + * 适用对象为订单时处理逻辑 + */ + if (rule.rule_apply_object.equals("1")) {// 适用对象为订单 + // 判断是否满足活动规则 + if (Double.parseDouble(copyTradeInfo.pay_money) >= Double.parseDouble(rule.rule_pay_money)) { + if (rule.rule_superposition_mode.equals("1")) {// 不叠加 + gift_copies = 1;// 满足活动条件则赠送一份赠品 + } else if (rule.rule_superposition_mode.endsWith("2")) {// 叠加 + // 计算需要叠加的份数 默认倍数为1份 + gift_copies = (int) Math.floor(Double.parseDouble(copyTradeInfo.pay_money) + / Double.parseDouble(rule.rule_pay_money)); + } + + if (rule.rule_gift_limit_condition.equals("1")) {// 不限额 + + if (rule.rule_gift_mode.equals("2")) {// 配送赠品 + + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + // 订单限额 + // 同步方法查询订单限额 + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if ((Double.parseDouble(copyTradeInfo.pay_money) >= Double + .parseDouble(rule.rule_pay_money)) + && (order_current < Integer.parseInt(rule.rule_limit_number))) { + /** + * 2 订单 送赠品 订单限额 不叠加 + */ + if (rule.rule_gift_mode.equals("2")) {// 配送赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + activityUpdateQueue.add(gn); + + rule.rule_order_current = rule.rule_order_current + 1; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else if (rule.rule_gift_limit_condition.equals("3")) {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + + if ((Double.parseDouble(copyTradeInfo.pay_money) >= Double + .parseDouble(rule.rule_pay_money)) + && (gift_current < Integer.parseInt(rule.rule_limit_number))) { + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) {// 已赠送的赠品数+需赠送赠品数>赠品限额 + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current;// 当前级别赠送的礼品数为剩余的赠品数 + seq_nextmoney_rules = Double.parseDouble(copyTradeInfo.pay_money) + - gift_copies * Double.parseDouble(rule.rule_pay_money);// 超出的钱数 + } + + /** + * 适用对象为订单,配送赠品 + */ + if (rule.rule_gift_mode.equals("2")) {// 送赠品 + // 配送赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 对于有优先级排序的,高优先级没有送够赠品的,低优先级补上 + if (seq_nextmoney_rules > 0.0) {// 查询出符合的规则 + String sql_rule = "select code,limit_number,gift_activity_code,name,pay_money,gift_commodity from tb_gift_activity_rule " + + "where gift_activity_code=? and superposition_mode = 2 and apply_object = ? and pre_sale_flag=? " + + "and seq>0 and seq= rs_rule.getDouble("pay_money")) { + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (((int) Math.floor(seq_nextmoney_rules + / rs_rule.getDouble("pay_money"))) > rs_rule + .getInt("rule_limit_number")) {// 需要赠送的赠品数>大于当前级别的限额数,将本级别的赠品全额赠送, + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextmoney_rules = seq_nextnum_rules - gift_copies + * (rs_rule.getDouble("pay_money"));// 记录超出的数量 + } else { + gift_copies = (int) Math.floor(seq_nextmoney_rules + / rs_rule.getDouble("pay_money")); + seq_nextmoney_rules = -1.0; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rule.activity_name, rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs.getString("gift_commodity")); + // 配送赠品 + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping() + .create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule, 0, jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextmoney_rules < 0.0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + } + } else { + break;// 活动规则不相同,不再看更小优先级的活动 + } + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + } + } + } + } finally { + lock.unlock(); + } + } + } + } + + /** + * 适用对象为商品的处理逻辑 + */ + if (rule.rule_apply_object.equals("2")) { + + if (rule.rule_promotion_mode.equals("1")) {// 活动方式为任意多件 + int result = 0; + String any_commodity = rule.rule_any_commodity; + String[] commodity_codes = any_commodity.trim().split("\\|"); + for (String commodity_code : commodity_codes) {// 遍历出所有指定的商品编码 + for (Entry tradeInfo : tradeCommodityInfo.entrySet()) {// 遍历订单中所有的商品 + // if (o1g1_fit_rules.indexOf(rule.rule_code) >= 0) { + // continue;// 一单只送一只,不再赠送! + // } + if (commodity_code.equals(tradeInfo.getKey())) {// 订单中的商品包含的有指定的商品且数量满足所要求的任意件数 + int temp = Integer.parseInt(tradeInfo.getValue()); + result = result + temp; + } + } + } + + if (result < Integer.parseInt(rule.rule_any_number)) { + continue; + } + + if (rule.rule_superposition_mode.equals("1")) {// 不叠加 + gift_copies = 1;// + } else if (rule.rule_superposition_mode.equals("2")) {// 叠加 + gift_copies = (int) Math.floor(result / Integer.parseInt(rule.rule_any_number));// 计算需要赠送的赠品份数 + } + + if (rule.rule_pre_sale_flag == 1 || rule.rule_pre_sale_flag == 2 + || (rule.rule_pre_sale_flag == 3 && rule.rule_presell_sort == 2)) {// 全部、非预售以及付尾款的预售 + // 配送赠品 + if (rule.rule_gift_limit_condition.equals("1")) {// 不限 + /** + * 任意多件 赠送赠品 不限额 不叠加 + * + */ + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + // 同步方法查询订单限额 + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if ((order_current < Integer.parseInt(rule.rule_limit_number))) { + /** + * 任意多件 赠送赠品 限订单 不叠加 + * + */ + + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 若一个订单中有多个商品满足活动 防止多加已送订单数 + // if (o1g1_fit_rules.indexOf(rule.rule_code) > -1) { + // lock.unlock(); + // continue; + // } + + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + activityUpdateQueue.add(gn); + + // rule.rule_order_current = rule.rule_order_current + 1; + // o1g1_fit_rules = "".equals(o1g1_fit_rules) ? rule.rule_code + // : o1g1_fit_rules + "," + rule.rule_code; + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + if (gift_current < Integer.parseInt(rule.rule_limit_number)) { + + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) {// 当前优先级赠品不够赠送 + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current;// 将当前级别可赠送的赠品赠送 + seq_nextnum_rules = gift_current + gift_copies + - Integer.parseInt(rule.rule_limit_number); + // 下一级别需要赠送的赠品数 = + } + /** + * 任意多件 赠送赠品 限赠品 叠加 + * + */ + if (rule.rule_gift_mode.equals("2")) {// 赠送方式赠品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 高优先级不够送,用低优先级配送 + if (seq_nextnum_rules > 0) { + String sql_rule = "select code,any_commodity,any_number,rule_limit_number,gift_activity_code,name,gift_commodity from tb_gift_activity_rule where promotion_mode = 1 and gift_activity_code=? and apply_object = ? and pre_sale_flag=? and seq>0 and seq last_commodity_map = new HashMap(); + Map next_commodity_map = new HashMap(); + for (int k = 0; k < commodity_codes.length; k++) { + last_commodity_map.put(commodity_codes[k], ""); + } + for (int j = 0; j < next_commodity_codes.length; j++) { + next_commodity_map.put(next_commodity_codes[j], ""); + } + Gson gson_to_json = new GsonBuilder().disableHtmlEscaping() + .create(); + if (gson_to_json.toJson(last_commodity_map) + .equals(gson_to_json.toJson(next_commodity_map)) + && rs_rule.getString("any_number") + .equals(rule.rule_any_number)) {// 比较另个规则是否相同 + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (seq_nextnum_rules > rs_rule + .getInt("rule_limit_number")) { + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextnum_rules = seq_nextnum_rules - gift_copies;// 记录超出的数量 + } else { + gift_copies = seq_nextnum_rules; + seq_nextnum_rules = -1; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rule.activity_name, rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs_rule.getString("gift_commodity")); + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping() + .create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule, 0, jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextnum_rules < 0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + } else { + break; + } + + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + } + } + } + } finally { + lock.unlock();// 释放锁 + } + } + + } else if (rule.rule_pre_sale_flag == 3 && rule.rule_presell_sort == 1) {// 预售订单 + String sql_presale = "select gift_commodity from tb_presale_order where platform_code=? and rule_code=? and shop_code=?"; + ps = conn.prepareStatement(sql_presale); + ps.setString(1, copyTradeInfo.tid); + ps.setString(2, rule.rule_code); + ps.setString(3, copyTradeInfo.shop_code); + rs = ps.executeQuery(); + if (rs.next()) { + String giftCommodityStr = rs.getString("gift_commodity"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + Map giftMap = gson.fromJson(giftCommodityStr, + new TypeToken>() { + }.getType()); + + for (Map.Entry giftStr : giftMap.entrySet()) { + gift_copies = giftStr.getKey(); + } + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } + } + // } + + } else if (rule.rule_promotion_mode.equals("2")) {// 活动方式为指定搭配 + // 促销方式为指定搭配 + int count = 0;// 统计指定商品与订单商品对比的次数 + int tradeInfo_length = tradeCommodityInfo.keySet().size();// 第二个map的长度 + for (Map.Entry appoint : ruleAppointCommodityInfo.entrySet()) { + for (Map.Entry tradeInfo : tradeCommodityInfo.entrySet()) { + int temp = 0; + if (appoint.getKey().equals(tradeInfo.getKey())) { + temp = (int) Math.floor(Integer.parseInt(tradeInfo.getValue()) + / Integer.parseInt(appoint.getValue())); + if (temp == 0) { + rule_flag = true; + break; + } + + if (gift_copies == 0) { + gift_copies = temp; + break;// 若有商品 退出本次循环 开始循环下一件商品 + } else { + if (gift_copies > temp) { + gift_copies = temp; + } + } + + } + count++; + if (temp != 0) { + count = 0; + break; + } + } + if (count == tradeInfo_length) {// 说明第二个map循环了一遍都没有找到该商品 + gift_copies = 0; + break; + } + if (rule_flag) { + gift_copies = 0; + break; + } + } + + if (gift_copies >= 1) {// 满足活动要求 + /** + * 指定搭配 赠送赠品 不限 叠加 + */ + if (rule.rule_superposition_mode.equals("1")) { + gift_copies = 1; + } + if (rule.rule_gift_limit_condition.equals("1")) {// 限额条件为不限 + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + + } else if (rule.rule_gift_limit_condition.equals("2")) {// 限订单 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int order_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_order_current_sql = "select order_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_order_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + order_current = rs.getInt("order_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + order_current = (int) json.get("order_current"); + } + + if (order_current < Integer.parseInt(rule.rule_limit_number)) { + + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新memcache中已送订单数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.order_current = order_current + 1; + gn.type = 1; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + activityUpdateQueue.add(gn); + rule.rule_order_current = rule.rule_order_current + 1; + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + } + } + } finally { + lock.unlock();// 释放锁 + } + } else {// 限赠品 + try { + lock.lock();// 活动判断开始前获得锁 + String rule_key = copyTradeInfo.shop_code + rule_mcc_key + rule.rule_code; + int gift_current = Integer.parseInt(rule.rule_limit_number);// 获取限额数量 + if (mcc == null || (mcc.get(rule_key) == null)) { + if (mcc == null) { + logger.info("活动判断中memcache为null,请确认是否正常"); + } else { + logger.info("活动判断中memcache不包含{},请确认是否正常", rule_key); + } + String query_gift_current_sql = "select gift_current from tb_gift_activity_rule where code=?"; + ps = conn.prepareStatement(query_gift_current_sql); + ps.setString(1, rule.rule_code); + rs = ps.executeQuery(); + if (rs.next()) { + gift_current = rs.getInt("gift_current"); + } else { + logger.info("活动:{}的规则没有找到!", rule.activity_name); + continue; + } + } else { + String jsonStr = (String) mcc.get(rule_key); + JSONObject json = new JSONObject(jsonStr); + gift_current = (int) json.get("gift_current"); + } + + if (gift_current < Integer.parseInt(rule.rule_limit_number)) { + + if (gift_current + gift_copies > Integer.parseInt(rule.rule_limit_number)) { + gift_copies = Integer.parseInt(rule.rule_limit_number) - gift_current; + seq_nextnum_rules = gift_current + gift_copies + - Integer.parseInt(rule.rule_limit_number); + } + if (rule.rule_gift_mode.equals("2")) {// 赠送礼品 + distributionGift(giftCommodityInfo, copyTradeInfo, gift_copies, rule, + rule.rule_name); + } else {// 赠送快递 + delivery_type_id = rule.rule_delivery_type_id; + } + + // 更新数据库中已赠送的赠品数量 + GiftNum gn = new GiftNum(); + gn.rule_code = rule.rule_code; + gn.gift_current = gift_current + gift_copies; + gn.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(gn); + mcc.set(rule_key, 0, jsonStr); + } + + activityUpdateQueue.add(gn); + rule.rule_gift_current = rule.rule_gift_current + gift_copies; + // 高优先级不够 低优先级赠送 + if (rule.rule_seq > 0) { + String flag = seq_fit_rules.length() == 0 ? "" : ","; + seq_fit_rules += flag + rule.gift_activity_code; + // 高优先级不够送,用低优先级配送 + if (seq_nextnum_rules > 0) { + String sql_rule = "select code,appoint_commodity,rule_limit_number,gift_activity_code,name,gift_commodity from tb_gift_activity_rule where promotion_mode = 1 and gift_activity_code=? and apply_object = ? and pre_sale_flag=? and seq>0 and seq next_appoint_commodityInfo = getCommodityInfo( + rs_rule.getString("appoint_commodity")); + Gson gson_to_json = new GsonBuilder().disableHtmlEscaping() + .create(); + if (gson_to_json.toJson(ruleAppointCommodityInfo).equals( + gson_to_json.toJson(next_appoint_commodityInfo))) {// 比较两次规则是否相同 + // 比较另个规则是否相同 + String rule_key_rule = copyTradeInfo.shop_code + + rule_mcc_key + rs_rule.getString("code"); + if (seq_nextnum_rules > rs_rule + .getInt("rule_limit_number")) { + gift_copies = rs_rule.getInt("rule_limit_number"); + seq_nextnum_rules = seq_nextnum_rules - gift_copies;// 记录超出的数量 + } else { + gift_copies = seq_nextnum_rules; + seq_nextnum_rules = -1; + } + logger.info("高优先级赠品不够,符合低优先级活动规则:{}——{}", + rs_rule.getString("code"), + rs_rule.getString("name")); + Map nextGiftCommodityInfo = getCommodityInfo( + rs_rule.getString("gift_commodity")); + distributionGift(nextGiftCommodityInfo, copyTradeInfo, + gift_copies, rule, rs_rule.getString("name")); + GiftNum gn_rule = new GiftNum(); + gn_rule.rule_code = rs_rule.getString("code"); + gn_rule.gift_current = gift_copies; + gn_rule.type = 2; + if (mcc != null) { + Gson gson = new GsonBuilder().disableHtmlEscaping() + .create(); + String jsonStr = gson.toJson(gn_rule); + mcc.set(rule_key_rule, 0, jsonStr); + } + activityUpdateQueue.add(gn_rule); + if (seq_nextnum_rules < 0) { + break;// 如果seq_next_rules小于0则不再查看更小优先级的活动 + } + + } else { + break; + } + + } + // 关闭结果集 + if (rs_rule != null) { + try { + rs_rule.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_rule = null; + } + + } + } + + } + } finally { + lock.unlock(); + } + } + } + } + } + } + + // TODO + /** + * 订单拆单判断,分为自发订单,代发订单,自发代发混合订单的拆单,其根本是根据发货公司和发货的仓库不同来区分 + * 使用ArrayList集合存储订单数据,但是集合的第一个位置存储原单信息,如果有拆分订单则往后排 + * + * 保证原单的所有信息不变,以保证订单插入事务执行异常回滚后原订单重试时所有信息一致 + */ + List tradeList = Collections.synchronizedList(new ArrayList()); + + // 代发品牌商公司编码map集合 + copyTradeInfo.obm_company_code_map = new HashMap(); + /** + * 当公司为品牌商时,将商品从commodity_code改为obm_commodity_code + */ + if (copyTradeInfo.company_type == 3) { + copyTradeInfo.obm_company_code = copyTradeInfo.company_code; + // obm_company_code = tradeInfo.company_code;/ + /** + * 将查到的品牌商对应商品写入原订单 + */ + for (int j = 0; j < copyTradeInfo.orders.length; j++) { + copyTradeInfo.orders[j].obm_commodity_code = copyTradeInfo.orders[j].commodity_code; + copyTradeInfo.orders[j].storage_code = copyTradeInfo.storage_code; + copyTradeInfo.orders[j].obm_company_code = copyTradeInfo.obm_company_code; + copyTradeInfo.orders[j].agent_type = 1; + } + copyTradeInfo.omsOwnFlag = true;// 品牌商自有店铺 + } + /** + * 当公司为经销商时, 循环判断订单各个商品是代发还是自发 + */ + boolean zg = true;// 标记商品是否够发 + if (copyTradeInfo.company_type == 2) {// 普通用户公司 + int ordersLength = copyTradeInfo.orders.length; + int agentCount = 0;// 记录订单中代发商品的数量,当代发数量等于商品数量,则代发,否则订单所属公司的店铺发货 + for (int i = 0; i < ordersLength; i++) { + OrderInfo orderInfo = copyTradeInfo.orders[i]; + sql = "select a.obm_company_code,b.obm_commodity_code,a.obm_storage_code,smart_allot_storage_flag " + + "from tb_obm_agent_shop a,tb_obm_agent_commodity b " + + "where a.shop_code=? and a.company_code=? and b.commodity_code=? and a.status=2 and b.status=2 and " + + "b.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, copyTradeInfo.shop_code); + ps.setString(2, copyTradeInfo.company_code); + ps.setString(3, orderInfo.commodity_code); + rs = ps.executeQuery(); + if (rs.next()) { + agentCount++; + copyTradeInfo.orders[i].obm_commodity_code = rs.getString("obm_commodity_code") == null ? "" + : rs.getString("obm_commodity_code"); + copyTradeInfo.orders[i].agent_type = 2; + copyTradeInfo.orders[i].obm_company_code = rs.getString("obm_company_code"); + copyTradeInfo.orders[i].storage_code = rs.getString("obm_storage_code"); + copyTradeInfo.orders[i].smart_allot_storage_flag = rs.getInt("smart_allot_storage_flag"); + copyTradeInfo.obm_company_code_map.put(copyTradeInfo.orders[i].obm_company_code, ""); + logger.info("订单[ {} ]:商品:{}为代发商品,所属店铺:{},所属企业:{},品牌商企业:{},品牌商商品:{},参与智能分仓:{}", + copyTradeInfo.tid, orderInfo.commodity_code, copyTradeInfo.shop_code, + copyTradeInfo.company_code, copyTradeInfo.orders[i].obm_company_code, + copyTradeInfo.orders[i].obm_commodity_code, + copyTradeInfo.orders[i].smart_allot_storage_flag == 1 ? "是" : "否"); + // 公司 商店 商品 + String sql2 = "select _getUnsendQuantity(?,?,?)"; + ps = conn.prepareStatement(sql2); + ps.setString(1, copyTradeInfo.orders[i].obm_company_code); + ps.setString(2, copyTradeInfo.shop_code); + ps.setString(3, copyTradeInfo.orders[i].obm_commodity_code); + + // 未发货 + int wfh = 0; + rs = ps.executeQuery(); + if (rs.next()) { + wfh = rs.getInt(1); + logger.info("订单[ {} ]:品牌商企业:{},品牌商商品:{},未发货量为:{}", copyTradeInfo.tid, + copyTradeInfo.orders[i].obm_company_code, + copyTradeInfo.orders[i].obm_commodity_code, wfh); + // 公司 商店 商品 未发货量 + String sql1 = "select _getSaleableQuantity(?,?,?,?) "; + ps = conn.prepareStatement(sql1); + ps.setString(1, copyTradeInfo.orders[i].obm_company_code); + ps.setString(2, copyTradeInfo.shop_code); + ps.setString(3, copyTradeInfo.orders[i].obm_commodity_code); + ps.setInt(4, wfh); + rs = ps.executeQuery(); + + if (rs.next()) { + copyTradeInfo.orders[i].zongshuliang = rs.getInt(1); + } + if (copyTradeInfo.orders[i].zongshuliang < copyTradeInfo.orders[i].num) { + zg = false; + logger.info("订单[ {} ]:品牌商企业:{},品牌商商品:{},可售量为:{},订单中商品数量为:{},不能满足发货要求", + copyTradeInfo.tid, copyTradeInfo.orders[i].obm_company_code, + copyTradeInfo.orders[i].obm_commodity_code, + copyTradeInfo.orders[i].zongshuliang, copyTradeInfo.orders[i].num); + } else { + logger.info("订单[ {} ]:品牌商企业:{},品牌商商品:{},可售量为:{},订单中商品数量为:{},可以满足发货要求", + copyTradeInfo.tid, copyTradeInfo.orders[i].obm_company_code, + copyTradeInfo.orders[i].obm_commodity_code, + copyTradeInfo.orders[i].zongshuliang, copyTradeInfo.orders[i].num); + } + + } + + } else { + /** + * 如果没有查询到代发关系,那么该商品即为自发 + */ + copyTradeInfo.orders[i].agent_type = 1; + copyTradeInfo.orders[i].storage_code = copyTradeInfo.storage_code; + } + } + /** + * agentCount == giftArrayLength全部商品为代发 agentCount == 0全部商品为自发 + * + */ + if (agentCount == ordersLength) {// 代发 + copyTradeInfo.obm_flag = 1; + } + if (agentCount == 0) { + copyTradeInfo.obm_flag = 0;// 自发 + } + if (agentCount > 0 && agentCount < ordersLength) { + copyTradeInfo.obm_flag = 2;// 混合 + } + } + + /** + * 为方便库存同步,需要将tradeInfo的订单中商品编码写值,在库存同步没有变结构的情况下,先将copyTradeInfo赋值给tradeInfo,后期需要删掉 + * + */ + tradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + + /** + * 销售单免审核分流判断 + */ + int sale_template_type = 0;// 销售模板类型 + int sale_template_type_bak = 0;// 销售模板类型 + int sale_order_no_audit = 0;// 销售单免审核 + int sale_order_no_audit_bak = 0;// 销售单免审核 + int sale_order_3_no_audit = 0;// 销售单三无免审核 + int sale_order_3_no_audit_bak = 0;// 销售单三无免审核 + int smart_allot_storage = 0;// 智能分仓开关,1:关闭,2:开启 + int auto_split = 0;// 自动拆单开关,1:关闭,2:开启 + int smart_allot_storage_code_num = 0;// 参与分仓发货的仓库编号串,数据库为字符串,转换为int放入memcache,1:关闭,2:开启 + + if (copyTradeInfo.obm_flag == 2 // 混合 + || (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() > 1)) { + smart_allot_storage = 2; + auto_split = 2; + smart_allot_storage_code_num = 2; + logger.info("订单[ {} ]:为混合发货订单(包括(自发+代发)和多品牌商代发两种情况),走强制拆单流程", copyTradeInfo.tid); + } + if (copyTradeInfo.obm_flag == 0 // 自发 + || (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() == 1)) { + String company_code = ""; + if (copyTradeInfo.obm_flag == 0) { + /** + * 包括品牌商自发和经销商自发 + */ + company_code = copyTradeInfo.company_code; + logger.info("订单[ {} ]:为自发订单(包括经销商自发和品牌商自发)", copyTradeInfo.tid); + } + if (copyTradeInfo.obm_flag == 1 && copyTradeInfo.obm_company_code_map.size() == 1) { + company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.smart_allot_storage_flag = copyTradeInfo.orders[0].smart_allot_storage_flag; + logger.info("订单[ {} ]:为单品牌商代发订单,参与智能分仓:{}", copyTradeInfo.tid, + copyTradeInfo.smart_allot_storage_flag == 1 ? "是" : "否"); + } + String sale_key = company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs.getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs.getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs.getString("smart_allot_storage_code_list") == null + ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + logger.info("订单[ {} ]:智能分仓企业配置:{}", copyTradeInfo.tid, jsonStr); + if (mcc != null) { + // 写入memcache + mcc.set(sale_key, 0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + logger.info("订单[ {} ]:智能分仓企业配置:{}", copyTradeInfo.tid, jsonStr); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json.get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json.get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + } + + // 查询可销售数量 + + /** + * 需要保证tradeInfo的值不变,在出现异常时,事务回退,再次尝试写入时才能保证订单的正确性 + */ + + copyTradeInfo.trade_key = "原订单"; + /** + * 可能存在有赠品的情况,要更新原单商品数量 + */ + tradeList.add(copyTradeInfo); + + /** + * 智能拆分订单 + * + */ + if (smart_allot_storage == 2) { + + /** + * 设置的智能分仓的仓库 + */ + if (smart_allot_storage_code_num == 2) { + /** + * 自动拆分 + */ + if (auto_split == 2) { + /** + * 单独循环每个商品的库存,对于任何仓库都没有库存的商品要加入到tradeList里面,因此不能在判断代发关系循环时 将产品的库存查出 + * + * 使用临时集合存储订单信息以匹配仓库,如果是全部是自发的商品或者全部(包括经销商自发和品牌商自发) 是代发的商品,那么集合只会有一个元素。 + * 如果是混合发货,则先将自发商品和代发商品区分出来,放在不同的下标元素中 + * + */ + List temporaryTradeInfoList = Collections + .synchronizedList(new ArrayList()); + /** + * 查询每个商品可以发货的仓库 + */ + int orderLength_1 = copyTradeInfo.orders.length; + for (int k = 0; k < orderLength_1; k++) { + + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[k]; + String delivery_storage_company_code = ""; + String delivery_storage_commodity_code = ""; + // boolean has_freeze_quantity = false; + + boolean is_found = false; + int order_count = 0;// 在一个商品有多个仓库的情况下,只有第一次循环采取添加子订单到temporaryTradeInfo + int commodity_class = 0; + int commodity_quantity = 1;// 加入有组合商品,组合中单品的数量 + + /** + * order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + */ + // int order_type = 0; + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + delivery_storage_orderInfo.order_type = 1; + delivery_storage_company_code = copyTradeInfo.company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.commodity_code; + } + if (copyTradeInfo.company_type == 3) { + delivery_storage_orderInfo.order_type = 2; + delivery_storage_company_code = copyTradeInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + } + /** + * tradeInfo.obm_flag == 1 代发订单,根据上面判断代发关系查询代发品牌商公司编码 + */ + if (copyTradeInfo.obm_flag == 1) { + delivery_storage_orderInfo.order_type = 3; + delivery_storage_company_code = delivery_storage_orderInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + /** + * tradeInfo.obm_flag == 2 代发和自发的混合订单,要分别判断每个商品是代发还是自发 + */ + if (copyTradeInfo.obm_flag == 2) { + if (delivery_storage_orderInfo.agent_type == 1) { + delivery_storage_orderInfo.order_type = 4; + delivery_storage_company_code = copyTradeInfo.company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.commodity_code; + } + if (delivery_storage_orderInfo.agent_type == 2) { + delivery_storage_orderInfo.order_type = 5; + delivery_storage_company_code = delivery_storage_orderInfo.obm_company_code; + delivery_storage_commodity_code = delivery_storage_orderInfo.obm_commodity_code; + } + } + + // 如果 指定仓 + if (delivery_storage_orderInfo.smart_allot_storage_flag == 2) { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, commodity_quantity, + order_count, copyTradeInfo); + logger.info("订单[ {} ]:商品:{}不参与智能分仓,进入代发配置的默认发货仓库:{}", copyTradeInfo.tid, + delivery_storage_commodity_code, delivery_storage_orderInfo.storage_code); + continue; + } + + // 订单商品拆分 单商品查询可销售数量 不够 进默认,可以就智能分 + if ((copyTradeInfo.orders[k].num <= copyTradeInfo.orders[k].zongshuliang + && copyTradeInfo.orders[k].agent_type == 2) + || copyTradeInfo.orders[k].agent_type == 1) { + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (delivery_storage_orderInfo.order_type == 3 + || delivery_storage_orderInfo.order_type == 5) { + String osop_key = delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key, 0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + obm_storage_open_percent = (double) json.get("obm_storage_open_percent"); + } + } + + /** + * 空编码商品直接放默认仓库 + */ + + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_commodity_code); + ps.setString(2, delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + + sql = "select a.storage_code,sum(a.quantity) as quantity,b.smart_allot_storage_join " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.quantity>0 and a.storage_code=b.code " + + "group by a.storage_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, delivery_storage_commodity_code); + ps.setString(2, delivery_storage_company_code); + + } + + /// 种类(1:单品 2:组合 3:配件) + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + sql = "select tem2.storage_code,tem2.freeze_quantity as quantity,tem2.commodity_quantity,ts.smart_allot_storage_join from ( " + + "select tem1.storage_code,tem1.quantity,tem1.commodity_quantity,tem1.freeze_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + "where tem2.storage_code = ts.code " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_commodity_code); + ps.setString(3, delivery_storage_company_code); + ps.setString(4, delivery_storage_commodity_code); + ps.setString(5, delivery_storage_company_code); + ps.setString(6, delivery_storage_company_code); + } + rs = ps.executeQuery(); + while (rs.next()) { + is_found = true; + String storage_code = rs.getString("storage_code"); + int quantity = rs.getInt("quantity"); + + /** + * 对于品牌商库存有开放度,该值默认为1(经销商统一为1) + */ + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + logger.info("订单[ {} ]:品牌商商品:{},品牌商库存开放度:{}", copyTradeInfo.tid, + delivery_storage_commodity_code, obm_storage_open_percent); + + int smart_allot_storage_join = rs.getInt("smart_allot_storage_join"); + + temporaryTradeInfoList = getSmartAllotAutoSplitStorageFound( + delivery_storage_company_code, storage_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, quantity, + commodity_quantity, smart_allot_storage_join, order_count, + copyTradeInfo); + order_count++; + } + if (!is_found) { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, + commodity_quantity, order_count, copyTradeInfo); + } + logger.info("订单[ {} ]:商品:{}没有查询到库存信息,进入默认发货仓库.", copyTradeInfo.tid, + delivery_storage_commodity_code); + } else { + temporaryTradeInfoList = getSmartAllotAutoSplitStorageNotFound( + delivery_storage_company_code, delivery_storage_orderInfo, + temporaryTradeInfoList, delivery_storage_commodity_code, commodity_quantity, + order_count, copyTradeInfo); + logger.info("订单[ {} ]:商品:{}不参与智能分仓,进入代发配置的默认发货仓库:{}", copyTradeInfo.tid, + delivery_storage_commodity_code, delivery_storage_orderInfo.storage_code); + + } + + } + /** + * 根据订单判断各商品的发货仓库,并拆单 + */ + for (int i = 0; i < temporaryTradeInfoList.size(); i++) { + // 订单商品拆分 单商品查询可销售数量 不够 进默认,可以就智能分 + + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + String temporary_delivery_storage_company_code = ""; + if (temporaryTradeInfo.obm_flag == 0 && temporaryTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.obm_flag == 1 + || (temporaryTradeInfo.obm_flag == 0 && temporaryTradeInfo.company_type == 3)) { + temporary_delivery_storage_company_code = temporaryTradeInfo.obm_company_code; + } + + String sale_key = temporary_delivery_storage_company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + temporary_delivery_storage_company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs + .getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs + .getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs + .getString("smart_allot_storage_code_list") == null ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + if (mcc != null) { + // 写入memcache + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(sale_key, 0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json + .get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json + .get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + /** + * 已经按公司分好的订单,需要根据不同公司的设置区分是否拆分订单 + */ + if (smart_allot_storage == 2) { + if (smart_allot_storage_code_num == 2) { + /** + * 设置了智能分仓,按智能分仓判断由那个仓库发货 + */ + if (auto_split == 2) { + logger.info("订单[ {} ]:子订单拆单---准备开始智能分仓(包含拆分订单)", copyTradeInfo.tid); + /** + * 智能拆单开启,自动拆单 + */ + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.storage_code = storage_code; + tradeList = recordTrade(tradeList, temporaryTradeInfo, + trade_key); + logger.info("订单[ {} ]:子订单拆单---配送区域仓库可以发货,仓库编码:{}", + copyTradeInfo.tid, storage_code); + continue;// 如果配送区域仓库可以发货,那么将跳过这个子订单,并判断下一个 + } + } + } + } + /** + * 走到这里说明默认仓库不能发货,如果tradeInfo的map包含默认仓库的话 然后遍历所有的仓库,找到可以发所有货的仓库 + */ + boolean has_other_storage = false; + for (Map.Entry> entry_storage_codes : temporaryTradeInfo.storage_map + .entrySet()) { + String commodity_key = entry_storage_codes.getKey(); + ArrayList commodity_list = entry_storage_codes.getValue(); + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c2 = commodity_list.get(j); + if (c2.flag && c2.smart_allot_storage_join == 2) { + count++; + } + } + String storage_code = commodity_key.split("_cs")[1]; + if (count == temporaryTradeInfo.orders.length) { + has_other_storage = true; + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.storage_code = storage_code; + logger.info( + "订单[ {} ]:子订单拆单---配送区域不能满足发货要求,随机选择其他可以满足发货条件的仓库之一,仓库编码:{}", + copyTradeInfo.tid, storage_code); + tradeList = recordTrade(tradeList, temporaryTradeInfo, + trade_key); + break; + } + } + } + /** + * 如果在非配送区域的发货仓库找到可以全部发货的仓库,则循环下一个子订单 + */ + if (has_other_storage) { + continue; + } + /** + * 走到这里说明没有没有仓库可以将此子订单的所有商品一次发货,需要拆单 需要将所有仓库根据订单商品的相关性排序,选出相关性最高的一个仓库发货, + * 然后从map删除该仓库,并将已经匹配的商品从暂用的订单商品中删除掉 并根据剩下的仓库和订单商品再进行相关性排序, + * 直到所有的商品都找到仓库或者没有仓库能匹配发货的商品到默认仓库去 + */ + do { + HashMap> commodity_map = selectStorage( + temporaryTradeInfo); + Iterator>> it = commodity_map + .entrySet().iterator(); + if (it.hasNext()) { + Map.Entry> entry = it.next(); + String storage_code = entry.getKey().split("_cs")[1]; + ArrayList commodity_list = entry.getValue(); + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c5 = commodity_list.get(j); + String commodity_code = c5.commodity_code; + int[] index = {}; + boolean found_commodity = false; + for (int k = 0; k < temporaryTradeInfo.orders.length; k++) { + if (temporaryTradeInfo.orders[k].order_type == 1 + || temporaryTradeInfo.orders[k].order_type == 4) { + if (commodity_code.equals( + temporaryTradeInfo.orders[k].commodity_code)) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.orders[k].storage_code = storage_code; + logger.info( + "订单[ {} ]:子订单拆单---智能分仓:无仓库满足全部商品一起发货的要求,商品:{}放入仓库编码:{}", + copyTradeInfo.tid, commodity_code, + storage_code); + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, + temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + index = Arrays.copyOf(index, index.length + 1); + index[index.length - 1] = k; + found_commodity = true; + } + } + if (temporaryTradeInfo.orders[k].order_type == 2 + || temporaryTradeInfo.orders[k].order_type == 3 + || temporaryTradeInfo.orders[k].order_type == 5) { + if (commodity_code.equals( + temporaryTradeInfo.orders[k].obm_commodity_code)) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + storage_code; + temporaryTradeInfo.orders[k].storage_code = storage_code; + logger.info( + "订单[ {} ]:子订单拆单---智能分仓:无仓库满足全部商品一起发货的要求,商品:{}放入仓库编码:{}", + copyTradeInfo.tid, commodity_code, + storage_code); + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, + temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + index = Arrays.copyOf(index, index.length + 1); + index[index.length - 1] = k; + found_commodity = true; + } + } + } + /** + * 删除map中的已经用过的仓库,删除temporaryTradeInfo中已经有仓库的商品 + */ + if (found_commodity) { + for (int k = index.length - 1; k >= 0; k--) { + temporaryTradeInfo.orders[index[k]] = temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1]; + temporaryTradeInfo.orders = Arrays.copyOf( + temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length - 1); + } + } + } + temporaryTradeInfo.storage_map + .remove(temporary_delivery_storage_company_code + "_cs" + + storage_code); + } else { + /** + * 如果返回的map没有值,说明订单中的商品已经查不到仓库发货,只能走默认仓库 + */ + for (int k = 0; k < temporaryTradeInfo.orders.length; k++) { + String trade_key = temporary_delivery_storage_company_code + + "_ts" + temporaryTradeInfo.orders[k].storage_code; + logger.info("订单[ {} ]:子订单拆单---智能分仓:智能分仓无其他可选仓库,放入默认仓库,仓库编码:{}", + copyTradeInfo.tid, + temporaryTradeInfo.orders[k].storage_code); + tradeList = recordOrder(tradeList, trade_key, + temporaryTradeInfo, temporaryTradeInfo.orders[k], + temporaryTradeInfo.orders[k].order_type); + } + /** + * 将数组置为0 + */ + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + 0); + } + } while (temporaryTradeInfo.orders.length > 0); + } else { + /** + * 设置了智能分仓仓库,但是不拆分订单,首先查询配送区域内仓库,如果可以发货则由配送区域内发货,如果配送区域仓库内无货,则查询选择的分仓仓库,如果有仓库由货则由该仓库发货, + * 否则放到默认仓库发货 + */ + /** + * 如果是有空商品,区域仓库不能发货那么久直接去默认仓库 + */ + logger.info("订单[ {} ]:子订单拆单---准备开始智能分仓,不拆分订单", copyTradeInfo.tid); + if (temporaryTradeInfo.null_code) { + tradeList.add(temporaryTradeInfo); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + tradeList.add(temporaryTradeInfo); + logger.info("订单[ {} ]:子订单拆单---配送区域仓库可以发货,仓库编码:{}", + copyTradeInfo.tid, storage_code); + continue;// 如果配送区域仓库可以发货,那么将跳过这个子订单,并判断下一个 + } + } + } + } + /** + * 走到这里说明默认仓库不能发货,如果tradeInfo的map包含默认仓库的话 然后遍历所有的仓库,找到可以发所有货的仓库 + */ + + for (Map.Entry> entry_storage_codes : temporaryTradeInfo.storage_map + .entrySet()) { + String commodity_key = entry_storage_codes.getKey(); + ArrayList commodity_list = entry_storage_codes + .getValue(); + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + Commodity c2 = commodity_list.get(j); + if (c2.flag && c2.smart_allot_storage_join == 2) { + count++; + } + } + String storage_code = commodity_key.split("_cs")[1]; + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + // tradeList.add(temporaryTradeInfo); + logger.info( + "订单[ {} ]:子订单拆单---配送区域不能满足发货要求,随机选择其他可以满足发货条件的仓库之一,仓库编码:{}", + copyTradeInfo.tid, storage_code); + break; + } + } + } + tradeList.add(temporaryTradeInfo); + } + } + } else { + /** + * 未设置智能分仓,查询配送区域仓库,不能发货的话走默认仓库 + */ + logger.info("订单[ {} ]:子订单拆单---未设置智能分仓,查询配送区域,不满足走默认仓库流程", copyTradeInfo.tid); + if (temporaryTradeInfo.null_code) { + tradeList.add(temporaryTradeInfo); + } else { + String[] storage_codes = {};// 记录订单所属发货区域 + + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + /** + * 根据目前的数据结构,配送区域最多只能查出一个仓库,所以查询的仓库结果是有一个或者没有 + */ + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + String storage_key = temporary_delivery_storage_company_code + "_cs" + + storage_code; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map + .get(storage_key); + /** + * 如果默认仓库的商品子条目数量等于temporaryTradeInfo中的商品子条目,那么每个商品的可代发标志都 + * 为true的话,则默认仓库可以发货 + */ + if (commodity_list.size() == temporaryTradeInfo.orders.length) { + int count = 0; + for (int j = 0; j < commodity_list.size(); j++) { + if (commodity_list.get(j).flag) { + count++; + } + } + if (count == temporaryTradeInfo.orders.length) { + temporaryTradeInfo.storage_code = storage_code; + logger.info("订单[ {} ]:子订单拆单---配送区域仓库可以发货,仓库编码:{}", + copyTradeInfo.tid, storage_code); + // tradeList.add(temporaryTradeInfo); + } + } + } + } + tradeList.add(temporaryTradeInfo); + } + } + } else { + /** + * 未开启智能分仓,直接到默认仓库 + */ + logger.info("订单[ {} ]:子订单拆单---未设置智能分仓,走默认仓库流程", copyTradeInfo.tid); + tradeList.add(temporaryTradeInfo); + } + // } + } + } else { + logger.info("订单[ {} ]:准备开始智能分仓,不拆分订单", copyTradeInfo.tid); + /** + * 判断可销售数量是否足够,不够的进入默认仓(缺货仓),足够的继续 + */ + + if ((zg && copyTradeInfo.orders[0].agent_type == 2) + || copyTradeInfo.orders[0].agent_type == 1) { + + /** + * 设置了智能分仓仓库,但是不拆分订单,首先查询配送区域内仓库,如果可以发货则由配送区域内发货,如果配送区域仓库内无货,则查询选择的分仓仓库,如果有仓库由货则由该仓库发货, + * 否则放到默认仓库发货 + */ + + String temporary_delivery_storage_company_code = ""; + boolean obm_order_flag = false; + + /** + * 如果是有空商品,区域仓库不能发货那么久直接去默认仓库 + */ + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = copyTradeInfo.company_code; + } + if (copyTradeInfo.company_type == 3) { + temporary_delivery_storage_company_code = copyTradeInfo.obm_company_code; + obm_order_flag = true; + } + } + // if (copyTradeInfo.obm_flag == 2) { + // fixed_flag = true; + // } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + temporary_delivery_storage_company_code = copyTradeInfo.orders[0].obm_company_code; + obm_order_flag = true; + /** + * 更新纯代发订单的订单信息 + */ + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + } + } + + if (copyTradeInfo.null_code || copyTradeInfo.smart_allot_storage_flag == 2) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:不参与智能分仓或者有空商品,进默认仓库", copyTradeInfo.tid); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + + Map agentStorageMap = new ConcurrentHashMap(); + Map commodity_map = new HashMap(); + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (obm_order_flag) { + if (copyTradeInfo.obm_flag == 1) { + String osop_key = temporary_delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key, 0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", + temporary_delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + obm_storage_open_percent = (double) json + .get("obm_storage_open_percent"); + } + } + } + + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[i]; + + boolean has_freeze_quantity = false;// true:有冻结库存,false:没有冻结库存 + int commodity_class = 0; + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + sql = "select storage_code,sum(a.quantity) as quantity,b.smart_allot_storage_join " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.quantity>0 and a.storage_code=b.code " + + "group by a.storage_code"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, temporary_delivery_storage_company_code); + } + } + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + sql = "select tem2.storage_code,tem2.freeze_quantity as quantity,ts.smart_allot_storage_join,tem2.commodity_quantity from ( " + + "select tem1.storage_code,tem1.quantity,tem1.commodity_quantity,tem1.freeze_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + "where tem2.storage_code = ts.code " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(3, temporary_delivery_storage_company_code); + ps.setString(4, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(5, temporary_delivery_storage_company_code); + ps.setString(6, temporary_delivery_storage_company_code); + } else { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.commodity_code); + ps.setString(3, temporary_delivery_storage_company_code); + ps.setString(4, delivery_storage_orderInfo.commodity_code); + ps.setString(5, temporary_delivery_storage_company_code); + ps.setString(6, temporary_delivery_storage_company_code); + } + } + /** + * 只有没有冻结库存的才查询普通库存 + */ + rs = ps.executeQuery(); + if (rs.next()) { + do { + int commodity_quantity = 1; + int quantity = rs.getInt("quantity"); + String storage_code = rs.getString("storage_code"); + + /** + * 防止订单中有重复的商品,对于重复商品数量要计数累加去对比库存是否可以发货 + */ + int commodity_num = 0; + String key = ""; + if (obm_order_flag) { + key = storage_code + "_sc" + + delivery_storage_orderInfo.obm_commodity_code; + } else { + key = storage_code + "_sc" + + delivery_storage_orderInfo.commodity_code; + } + if (commodity_map.containsKey(key)) { + commodity_num = commodity_map.get(key) + + delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } else { + commodity_num = delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } + + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + logger.info("订单[ {} ]:品牌商商品:{},品牌商库存开放度:{}", copyTradeInfo.tid, + obm_order_flag ? delivery_storage_orderInfo.obm_commodity_code + : delivery_storage_orderInfo.commodity_code, + obm_storage_open_percent); + + if (quantity >= commodity_num) { + if (agentStorageMap.containsKey(storage_code)) { + AgentStorage as = new AgentStorage(); + as = agentStorageMap.get(storage_code); + as.count++; + as.smart_allot_storage_join = rs + .getInt("smart_allot_storage_join"); + agentStorageMap.put(storage_code, as); + } else { + AgentStorage as = new AgentStorage(); + as.count++; + as.smart_allot_storage_join = rs + .getInt("smart_allot_storage_join"); + agentStorageMap.put(storage_code, as); + } + } + } while (rs.next()); + } else { + /** + * 如果存在某个商品查不到库存的情况,则将map清空 + */ + agentStorageMap.clear(); + break; + } + // } + + } + /** + * 如果agentStorageMap为空,那么没有仓库可以发货,直接放到默认仓库 + */ + if (agentStorageMap.size() == 0) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:没有仓库满足发货条件,进入默认发货仓库.", copyTradeInfo.tid, + copyTradeInfo.storage_code); + + } + if (agentStorageMap.size() > 0) { + // 查询OMS设置的订单所在区域的代发仓库 + storage_codes = queryAreaStorage(conn, ps, rs, + temporary_delivery_storage_company_code, copyTradeInfo.receiver_country, + copyTradeInfo.receiver_state, copyTradeInfo.receiver_city, + copyTradeInfo.receiver_district); + boolean area_storage_falg = true; + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + if (agentStorageMap.containsKey(storage_code)) { + AgentStorage as = new AgentStorage(); + as = agentStorageMap.get(storage_code); + if (as.count == copyTradeInfo.orders.length) { + copyTradeInfo.storage_code = storage_code; + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:配送区域仓库可以发货,仓库编码:{}", copyTradeInfo.tid, + storage_code); + } else { + area_storage_falg = false; + } + } else { + area_storage_falg = false; + } + } else { + area_storage_falg = false; + } + /** + * 如果配送区域不能发货,查询其他仓库 + */ + if (!area_storage_falg) { + Iterator> it = agentStorageMap.entrySet() + .iterator(); + String storage_code = ""; + if (it.hasNext()) { + do { + Entry entry = it.next(); + AgentStorage as = new AgentStorage(); + storage_code = entry.getKey(); + as = entry.getValue(); + if (as.count == copyTradeInfo.orders.length + && as.smart_allot_storage_join == 2) { + copyTradeInfo.storage_code = storage_code; + break; + } + } while (it.hasNext()); + } + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:配送区域不能满足发货要求,随机选择其他可以满足发货条件的仓库之一,仓库编码:{}", + copyTradeInfo.tid, storage_code); + } + } + } + + } else { + /** + * 商品总数量 不足订单中的商品数量 只走默认仓库 代发订单如果是一家供应商代发,走代发订单 + */ + // TODO 此处代码存在业务判断逻辑问题,不会有copyTradeInfo.obm_company_code_map.size() > + // 1的进入这里(即多品牌商代发),因为已经走了强制拆单逻辑.等代发逻辑修改同步修改此处代码 + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:自发走默认仓逻辑,仓库编码:{},此行代码不会被执行", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:代发走默认仓逻辑,仓库编码:{}", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } else { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:混合代发走默认仓逻辑,仓库编码:{},此行代码不会被执行", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + } + + } + + } + } else { + // 判断 可销售数量是否足够 不够 放入默认仓 + if ((zg && copyTradeInfo.orders[0].agent_type == 2) + || copyTradeInfo.orders[0].agent_type == 1) { + + /** + * 没有设置智能分仓仓库,如果配送区域内仓库有货则由该仓库发货,否则由默认仓库发货 + */ + String temporary_delivery_storage_company_code = ""; + boolean obm_order_flag = false; + if (copyTradeInfo.obm_flag == 0) { + if (copyTradeInfo.company_type == 2) { + temporary_delivery_storage_company_code = copyTradeInfo.company_code; + } + if (copyTradeInfo.company_type == 3) { + temporary_delivery_storage_company_code = copyTradeInfo.obm_company_code; + obm_order_flag = true; + } + } + // if (copyTradeInfo.obm_flag == 2) { + // fixed_flag = true; + // } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + temporary_delivery_storage_company_code = copyTradeInfo.orders[0].obm_company_code; + obm_order_flag = true; + /** + * 更新纯代发订单的订单信息 + */ + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + } + } + + /** + * 查询品牌商库存开放度 + */ + double obm_storage_open_percent = 1;// 品牌商库存开放度 + /** + * 使用memcache查询品牌商库存开放度 + */ + if (obm_order_flag) { + if (copyTradeInfo.obm_flag == 1) { + String osop_key = temporary_delivery_storage_company_code + "_osop"; + if (mcc == null || (mcc.get(osop_key) == null)) { + sql = "select storage_open_percent from tb_config where company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + rs = ps.executeQuery(); + if (rs.next()) { + obm_storage_open_percent = rs.getDouble("storage_open_percent"); + /** + * 当mcc不为空时,将查询结果写入memcache + */ + if (mcc != null) { + Map map = new ConcurrentHashMap(); + map.put("obm_storage_open_percent", obm_storage_open_percent); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(osop_key, 0, jsonStr); + } + } else { + logger.info("查询品牌商库存开放度中{}的记录没有找到!", + temporary_delivery_storage_company_code); + } + + } else { + String jsonStr = (String) mcc.get(osop_key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + obm_storage_open_percent = (double) json.get("obm_storage_open_percent"); + } + } + } + + if (copyTradeInfo.null_code || copyTradeInfo.smart_allot_storage_flag == 2) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:不参与智能分仓或者有空商品,进默认仓库", copyTradeInfo.tid); + } else { + /** + * 根据配置判断发货仓库 + */ + String[] storage_codes = {};// 记录订单所属发货区域 + storage_codes = queryAreaStorage(conn, ps, rs, temporary_delivery_storage_company_code, + copyTradeInfo.receiver_country, copyTradeInfo.receiver_state, + copyTradeInfo.receiver_city, copyTradeInfo.receiver_district); + if (storage_codes.length > 0) { + String storage_code = storage_codes[0];// 配送区域的默认发货仓库 + int area_storage = 0; + Map commodity_map = new HashMap(); + for (int i = 0; i < copyTradeInfo.orders.length; i++) { + OrderInfo delivery_storage_orderInfo = copyTradeInfo.orders[i]; + int commodity_class = 0; + if (delivery_storage_orderInfo.gift_type == 2) { + sql = "select class from tb_commodity where code=? and company_code=? and status=2 and del_flag=1"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, copyTradeInfo.obm_company_code); + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, copyTradeInfo.company_code); + } + rs = ps.executeQuery(); + if (rs.next()) { + commodity_class = rs.getInt("class"); + delivery_storage_orderInfo.commodity_class = commodity_class;// 在这里查询到赠品属于单品或者组合,在下面委外订单需要拆组合时就不用再次判断 + } + } + if (delivery_storage_orderInfo.commodity_class == 1 || commodity_class == 1) { + + sql = "select quantity from ( " + "select sum(quantity) as quantity " + + "from tb_commodity_position a,tb_storage b " + + "where a.commodity_code=? and a.company_code=? and a.company_code=b.company_code and a.storage_code=b.code and b.code=?) tem1 " + + "where tem1.quantity>=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setString(1, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(2, copyTradeInfo.obm_company_code); + ps.setString(3, storage_code); + ps.setInt(4, delivery_storage_orderInfo.num); + + } else { + ps.setString(1, delivery_storage_orderInfo.commodity_code); + ps.setString(2, copyTradeInfo.company_code); + ps.setString(3, storage_code); + ps.setInt(4, delivery_storage_orderInfo.num); + } + } + if (delivery_storage_orderInfo.commodity_class == 2 || commodity_class == 2) { + + sql = "select tem2.commodity_quantity,tem2.freeze_quantity as quantity from ( " + + "select tem1.storage_code,tem1.quantity,tem1.freeze_quantity,tem1.commodity_quantity from ( " + + "SELECT tcp.commodity_code,tcp.storage_code,sum(tcp.quantity) as quantity,tbc.commodity_quantity,floor(sum(tcp.quantity)/tbc.commodity_quantity) as freeze_quantity " + + "FROM tb_group_commodity tbc " + + "LEFT JOIN tb_commodity_position tcp ON tcp.commodity_code = tbc.commodity_code " + + "AND tcp.company_code = tbc.company_code " + + "AND tcp.quantity>=(tbc.commodity_quantity*?) " + + "WHERE tbc.group_code = ? " + "and tbc.company_code = ? " + + "group by tcp.commodity_code,tcp.storage_code " + + "order by round(sum(tcp.quantity)/tbc.commodity_quantity,2)) tem1 " + + "where tem1.quantity>0 " + "group by tem1.storage_code " + + "having count(storage_code) = (select count(*) from tb_group_commodity tgc2 where tgc2.group_code = ? and tgc2.company_code = ?) " + + ") tem2 ,tb_storage ts " + + "where tem2.storage_code = ts.code and ts.code=? " + + "and ts.company_code=?"; + ps = conn.prepareStatement(sql); + if (obm_order_flag) { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(3, copyTradeInfo.obm_company_code); + ps.setString(4, delivery_storage_orderInfo.obm_commodity_code); + ps.setString(5, copyTradeInfo.obm_company_code); + ps.setString(6, storage_code); + ps.setString(7, copyTradeInfo.obm_company_code); + } else { + ps.setInt(1, delivery_storage_orderInfo.num); + ps.setString(2, delivery_storage_orderInfo.commodity_code); + ps.setString(3, copyTradeInfo.company_code); + ps.setString(4, delivery_storage_orderInfo.commodity_code); + ps.setString(5, copyTradeInfo.company_code); + ps.setString(6, storage_code); + ps.setString(7, copyTradeInfo.company_code); + } + } + rs = ps.executeQuery(); + if (rs.next()) { + + int quantity = rs.getInt("quantity"); + /** + * 对于品牌商库存有开放度,该值默认为1(经销商统一为1) + */ + int commodity_quantity = 1; + + /** + * 防止订单中有重复的商品,对于重复商品数量要计数累加去对比库存是否可以发货 + */ + int commodity_num = 0; + String key = ""; + if (obm_order_flag) { + key = storage_code + "_sc" + + delivery_storage_orderInfo.obm_commodity_code; + } else { + key = storage_code + "_sc" + delivery_storage_orderInfo.commodity_code; + } + if (commodity_map.containsKey(key)) { + commodity_num = commodity_map.get(key) + + delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } else { + commodity_num = delivery_storage_orderInfo.num * commodity_quantity; + commodity_map.put(key, commodity_num); + } + + // quantity = (quantity - + // freeze_quantity) > 0 ? quantity - + // freeze_quantity + // : 0; + quantity = (int) Math.floor(quantity * obm_storage_open_percent); + if (quantity >= commodity_num) { + area_storage++; + } + } + // } + } + if (area_storage == copyTradeInfo.orders.length) { + copyTradeInfo.storage_code = storage_code; + } + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:配送区域仓库可以发货,仓库编码:{}", copyTradeInfo.tid, storage_code); + } else { + /** + * 没有配置区域发货仓库,走默认仓库 + */ + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:没有配置发货区域,放入默认仓库,仓库编码:{}", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + } + } else { + /** + * 商品总数量 不足订单中的商品数量 只走默认仓库 代发订单如果是一家供应商代发,走代发订单 + */ + // TODO 此处代码存在业务判断逻辑问题,不会有copyTradeInfo.obm_company_code_map.size() > + // 1的进入这里(即多品牌商代发),因为已经走了强制拆单逻辑.等代发逻辑修改同步修改此处代码 + + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:自发走默认仓逻辑,仓库编码:{},此行代码不会被执行", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:代发走默认仓逻辑,仓库编码:{}", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } else { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:混合代发走默认仓逻辑,仓库编码:{},此行代码不会被执行", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + } + + } + } + + } else { + /** + * 非智能拆单,只走默认仓库 混合订单及自发订单走自发订单 代发订单如果是一家供应商代发,走代发订单,否则走自发订单 + * + */ + if (copyTradeInfo.obm_flag == 0) { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:自发走默认仓逻辑,仓库编码:{}", copyTradeInfo.tid, copyTradeInfo.storage_code); + } + if (copyTradeInfo.obm_flag == 1) { + if (copyTradeInfo.obm_company_code_map.size() == 1) { + copyTradeInfo.storage_code = copyTradeInfo.orders[0].storage_code; + copyTradeInfo.obm_company_code = copyTradeInfo.orders[0].obm_company_code; + copyTradeInfo.company_type = 3; + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:代发走默认仓逻辑,仓库编码:{}", copyTradeInfo.tid, copyTradeInfo.storage_code); + } else { + tradeList.add(copyTradeInfo); + logger.info("订单[ {} ]:混合代发走默认仓逻辑,仓库编码:{},此行代码不会被执行", copyTradeInfo.tid, + copyTradeInfo.storage_code); + } + } + } + + /** + * order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + */ + + String sale_key = copyTradeInfo.company_code + "_cc"; + if (mcc == null || (mcc.get(sale_key) == null)) { + sql = "select sale_template_type,sale_order_no_audit,sale_order_3_no_audit,smart_allot_storage,smart_allot_storage_code_list,auto_split from tb_config where company_code = '" + + copyTradeInfo.company_code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + sale_template_type_bak = sale_template_type = rs.getInt("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = rs.getInt("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = rs.getInt("sale_order_3_no_audit"); + smart_allot_storage = rs.getInt("smart_allot_storage"); + auto_split = rs.getInt("auto_split"); + String smart_allot_storage_code_list = rs.getString("smart_allot_storage_code_list") == null + ? "" + : rs.getString("smart_allot_storage_code_list"); + if ("".equals(smart_allot_storage_code_list)) { + smart_allot_storage_code_num = 1; + } else { + smart_allot_storage_code_num = 2; + } + if (mcc != null) { + // 写入memcache + Map map = new ConcurrentHashMap(); + map.put("sale_template_type", sale_template_type); + map.put("sale_order_no_audit", sale_order_no_audit); + map.put("sale_order_3_no_audit", sale_order_3_no_audit); + map.put("smart_allot_storage", smart_allot_storage); + map.put("auto_split", auto_split); + map.put("smart_allot_storage_code_num", smart_allot_storage_code_num); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = gson.toJson(map); + mcc.set(sale_key, 0, jsonStr); + } + } + } else { + String jsonStr = (String) mcc.get(sale_key); + org.json.JSONObject json = new org.json.JSONObject(jsonStr); + sale_template_type_bak = sale_template_type = (int) json.get("sale_template_type"); + sale_order_no_audit_bak = sale_order_no_audit = (int) json.get("sale_order_no_audit"); + sale_order_3_no_audit_bak = sale_order_3_no_audit = (int) json.get("sale_order_3_no_audit"); + smart_allot_storage = json.getInt("smart_allot_storage"); + auto_split = json.getInt("auto_split"); + smart_allot_storage_code_num = json.getInt("smart_allot_storage_code_num"); + } + + int tradeListSize = tradeList.size(); + + /** + * true为拆分订单,false为没有拆分的订单 + */ + boolean separate_flag = false; + /** + * 记录tradeMap循环的次数,拆分订单当tradeMapLoopCount>1才开始判断货篮 + */ + int tradeListLoopCount = 0; + /** + * tradeMapSize==1表示只有原单,没有拆单,当tradeMapSize>1表示有拆单 + */ + if (tradeListSize > 2) { + separate_flag = true; + } + /** + * 如果是没有拆单的订单,要将tradeList.get(1)中的obm_company_code,company_type,obm_flag,storage_code给原单 + */ + if (!separate_flag) { + // tradeList.get(0).obm_flag = tradeList.get(1).obm_flag; + tradeList.get(0).company_type = tradeList.get(1).company_type; + tradeList.get(0).obm_company_code = tradeList.get(1).obm_company_code; + tradeList.get(0).storage_code = tradeList.get(1).storage_code; + } + + /** + * 用于拆分发票,混合订单只有其中的自发商品放入发票 + */ + int invoice_count = 0; + /** + * 记录拆分订单的金额 + */ + for (int l = 0; l < tradeListSize; l++) { + tradeListLoopCount++; + TradeInfo trade3 = tradeList.get(l); + OrderInfo[] order3 = null; + order3 = trade3.orders; + /** + * 重置公司配置信息 + */ + sale_template_type = sale_template_type_bak; + sale_order_no_audit = sale_order_no_audit_bak; + sale_order_3_no_audit = sale_order_3_no_audit_bak; + /** + * 如果是补款订单,那么只走标注模式 + */ + if (type_kind == 4) { + sale_template_type = 2; + sale_order_no_audit = 1; + sale_order_3_no_audit = 1; + } + /** + * 如果订单中有商品编码为空,那么只能走标准模式 + */ + if (trade3.null_code) { + sale_template_type = 0; + } + /** + * 如果是拆单的原单,统一标记为标准模式 + */ + if (separate_flag && tradeListLoopCount == 1) { + sale_template_type = 0; + } + /** + * 将发票分配到一张订单,只有拆分订单才做此操作 运费也放到同一张订单上 + */ + if (separate_flag && copyTradeInfo.invoice_type != 0) { + if (copyTradeInfo.obm_flag == 0 || copyTradeInfo.obm_flag == 1) { + if (tradeListLoopCount > 2) { + trade3.invoice_type = 0; + } + } + if (copyTradeInfo.obm_flag == 2 && tradeListLoopCount > 1) { + if (trade3.company_type == 3) { + trade3.invoice_type = 0; + } + if (invoice_count != 0 && trade3.company_type == 2) { + trade3.invoice_type = 0; + } + if (invoice_count == 0 && trade3.company_type == 2) { + invoice_count++; + } + } + } + /** + * 将运费发到拆分订单的第一个子单,不区分自发和代发 + */ + if (separate_flag) { + if (tradeListLoopCount > 2) { + trade3.post_fee = "0"; + } + } + + // 货篮分流 + boolean flag_basket = true;// 用于判断货篮订单插入还是普通订单插入,免审订单类似于货篮订单,可用该字段做判断 + boolean flag_audit_3 = false;// 用于判断免审订单是否可以直接到待开发票环节,状态为3 + boolean flag_audit_4 = false;// 用于判断免审订单是否可以直接到打单环节,状态为4 + String basket_code = "";// 记录订单所属货篮编码 + if ((!(separate_flag && tradeListLoopCount == 1)) && (!(trade3.obm_flag == 1 + && (sale_template_type == 2 || (sale_template_type == 1 && sale_order_no_audit == 1))))) { + if (((trade3.invoice_type == 0) + && (("".equals(trade3.buyer_message) || (trade3.buyer_message == null))) + && (("".equals(trade3.seller_memo)) || (trade3.seller_memo == null))) + || (trade3.obm_flag == 1 && sale_template_type == 1 && sale_order_no_audit == 2 + && sale_order_3_no_audit == 1)) { + + /** + * 根据订单的类型传入company_code + */ + String basket_key = ""; + if (trade3.company_type == 2) { + basket_key = trade3.company_code + "_cb"; + } + if (trade3.company_type == 3) { + basket_key = trade3.obm_company_code + "_cb"; + } + + List baskets = Collections.synchronizedList(new ArrayList()); + if (mcc == null || (mcc.get(basket_key) == null)) { + sql = "select code from tb_basket where status=2 and company_code=?"; + ps = conn.prepareStatement(sql); + if (trade3.company_type == 2) { + ps.setString(1, trade3.company_code); + } + if (trade3.company_type == 3) { + ps.setString(1, trade3.obm_company_code); + } + rs = ps.executeQuery(); + while (rs.next()) { + Basket b = new Basket(); + b.code = rs.getString("code"); + baskets.add(b); + } + + for (int i = 0; i < baskets.size(); i++) { + sql = "select b.basket_code,b.commodity_code,b.quantity from " + + "tb_basket a, tb_basket_config b where a.status=2 and a.company_code=b.company_code and a.code=b.basket_code and b.basket_code='" + + baskets.get(i).code + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + + // 生成条目数组 + baskets.get(i).b_num = 0; + while (rs.next()) { + baskets.get(i).items = Arrays.copyOf(baskets.get(i).items, + baskets.get(i).items.length + 1); + baskets.get(i).items[baskets.get(i).items.length - 1] = new Item(); + baskets.get(i).items[baskets.get(i).items.length - 1].basket_code = rs + .getString("basket_code"); + baskets.get(i).items[baskets.get(i).items.length - 1].commodity_code = rs + .getString("commodity_code"); + baskets.get(i).items[baskets.get(i).items.length - 1].quantity = rs + .getInt("quantity"); + baskets.get(i).b_num += rs.getInt("quantity"); + } + } + if (mcc != null) { + Map> map = new ConcurrentHashMap>(); + map.put("basket", baskets); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonArray = gson.toJson(baskets); + mcc.set(basket_key, 0, jsonArray); + } + + } else { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String jsonStr = (String) mcc.get(basket_key); + baskets = gson.fromJson(jsonStr, new TypeToken>() { + }.getType()); + } + + // 循环处理各货篮,只要有匹配的即可退出 + for (int i = 0; i < baskets.size(); i++) { + int count = 0;// 计数器,用于判断订单与货篮中货物完全匹配的个数 + if (trade3.num == baskets.get(i).b_num) { + for (int j = 0; j < baskets.get(i).items.length; j++) { + baskets.get(i).items[j].t_num = 0; + for (int k = 0; k < order3.length; k++) { + // 判断订单商品编码是否为空 + if (trade3.company_type == 2) { + if (order3[k].commodity_code == null + || "".equals(order3[k].commodity_code)) { + continue; + } + if (order3[k].commodity_code + .equals(baskets.get(i).items[j].commodity_code)) { + baskets.get(i).items[j].t_num += order3[k].num; + } + } + if (trade3.company_type == 3) { + if (order3[k].obm_commodity_code == null + || "".equals(order3[k].obm_commodity_code)) { + continue; + } + if (order3[k].obm_commodity_code + .equals(baskets.get(i).items[j].commodity_code)) { + baskets.get(i).items[j].t_num += order3[k].num; + } + } + + } + } + for (int j = 0; j < baskets.get(i).items.length; j++) { + if (baskets.get(i).items[j].quantity == baskets.get(i).items[j].t_num) { + count++; + } + } + if (count == baskets.get(i).items.length) { + flag_basket = false; + basket_code = baskets.get(i).code; + break; + } + } + } + } + } + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,company_code from tb_storage where logistics_company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "PLG"); + rs = ps.executeQuery(); + while (rs.next()) { + String entrust_storage_code = rs.getString("code"); + String entrust_companyCode = rs.getString("company_code"); + if (entrust_storage_code == null || entrust_companyCode == null) { + continue; + } + if (trade3.company_type == 2) { + if (trade3.obm_flag == 0) { + if (separate_flag && tradeListLoopCount > 1) { + if (trade3.company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + if (!separate_flag) { + // trade3.storage_code = + // tradeList.get(1).storage_code; + if (trade3.company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + } + } + if (trade3.company_type == 3) { + if (separate_flag && tradeListLoopCount > 1) { + if (trade3.obm_company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + if (!separate_flag) { + if (trade3.obm_company_code.equals(entrust_companyCode) + && trade3.storage_code.equals(entrust_storage_code)) { + trade3.entrust_type = 2; + break; + } + } + } + } + + // 插入销售单详表 + if (separate_flag && tradeListLoopCount > 1) { + trade3.money = trade3.pay_money = "0"; + trade3.discount_fee = "0"; + } + // int order_count = 0; + int order3_length = order3.length; + for (int i = 0; i < order3_length; i++) { + OrderInfo orderInfo3 = order3[i]; + // order_count ++; + /** + * 如果是拆分订单的话计算拆分金额 + */ + if (separate_flag && tradeListLoopCount > 1) { + /** + * 淘宝平台已经计算好了orderInfo3.divide_order_fee,其他平台由 + */ + +// trade3.pay_money = trade3.money = Double.valueOf(trade3.money) +// + (Double.valueOf(orderInfo3.payment) + Double.valueOf(orderInfo3.divide_order_fee)) +// + ""; + trade3.pay_money = trade3.money = (Double.valueOf(trade3.money) + + Double.valueOf(orderInfo3.payment)) + ""; + trade3.discount_fee = Double.valueOf(trade3.discount_fee) + + (Double.valueOf(orderInfo3.discount_fee) + + Double.valueOf(orderInfo3.part_mjz_discount)) + + ""; + } + /** + * 执行订单详情插入操作 + */ + sql = "insert into tb_sale_order_items (code,sale_order_code,commodity_code,quantity,unit_price,money,commodity_title,Sku_message,account,total_fee,adjust_fee,item_id,product_item_id,company_code,divide_order_fee,part_mjz_discount,oid,gift,obm_commodity_code,obm_company_code,outer_id)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1) + "_" + (i + 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } + if (trade3.omsOwnFlag) { + ps.setString(3, null); + } else { + ps.setString(3, orderInfo3.commodity_code); + } + ps.setInt(4, orderInfo3.num); + ps.setDouble(5, Double.parseDouble(orderInfo3.price)); + ps.setDouble(6, Double.parseDouble(orderInfo3.payment)); + ps.setString(7, orderInfo3.title); + ps.setString(8, orderInfo3.sku_properties_name); + ps.setDouble(9, Double.parseDouble(orderInfo3.discount_fee)); + ps.setDouble(10, Double.parseDouble(orderInfo3.total_fee)); + ps.setDouble(11, Double.parseDouble(orderInfo3.adjust_fee)); + if ("".equals(orderInfo3.sku_id) || orderInfo3.sku_id == null) { + ps.setString(12, null); + } else { + ps.setString(12, orderInfo3.sku_id); + } + ps.setString(13, + ("".equals(orderInfo3.productItemID_dd) || orderInfo3.productItemID_dd == null) ? null + : orderInfo3.productItemID_dd); + if (trade3.omsOwnFlag) { + ps.setString(14, null); + } else { + ps.setString(14, trade3.company_code); + } + ps.setDouble(15, Double.parseDouble(orderInfo3.divide_order_fee)); + ps.setDouble(16, Double.parseDouble(orderInfo3.part_mjz_discount)); + ps.setString(17, orderInfo3.oid); + ps.setInt(18, orderInfo3.gift_type); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + if (trade3.obm_flag == 1) { + ps.setString(19, orderInfo3.obm_commodity_code); + } + if (trade3.omsOwnFlag) { + ps.setString(19, orderInfo3.commodity_code); + } + ps.setString(20, trade3.obm_company_code); + } else { + ps.setString(19, null); + ps.setString(20, null); + } + ps.setString(21, orderInfo3.platform_seller_code); + if (ps.executeUpdate() == 0) { + return false; + } + + // 如果是天猫分销平台的订单,同时写入tb_sub_sale_order_items + if ("012".equals(trade3.platform_code)) { + sql = "insert into tb_sub_sale_order_items (code,status,buyer_payment,company_code)" + + " values (?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1) + "_" + (i + 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, order_code + "_" + (i + 1)); + ps.setString(2, order_code); + } + ps.setString(2, orderInfo3.order_200_status); + ps.setDouble(3, Double.parseDouble(orderInfo3.order_buyer_payment)); + ps.setString(4, trade3.company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + + /** + * 统一处理订单的buyer_nick、receiver_name、receiver_adderss可能出现的emoji表情 + * 如果有emoji表情,移除emoji, 1.receiver_adderss不可能只有emoji组成 + * 2.receiver_name如果全部是emoji,移除后改为两个英文的??代替 3.buyer_nick如果全部为emoji,移除后置为空字符串 + */ + // 收货地址 + boolean hasReceiverAdressEmoji = EmojiFilterUtil.containsEmoji(trade3.receiver_address); + if (hasReceiverAdressEmoji) { + trade3.receiver_address = EmojiFilterUtil.filterEmoji(trade3.receiver_address).trim(); + } else { + trade3.receiver_address = trade3.receiver_address; + } + // 购买人昵称 + trade3.buyer_nick = trade3.buyer_nick == null ? "" : trade3.buyer_nick;// 如果存在null值,将null改为空字符串 + boolean hasBuyerNickEmoji = EmojiFilterUtil.containsEmoji(trade3.buyer_nick); + if (hasBuyerNickEmoji) { + trade3.buyer_nick = EmojiFilterUtil.filterEmoji(trade3.buyer_nick).trim(); + } else { + trade3.buyer_nick = trade3.buyer_nick; + } + // 收货人姓名 + trade3.receiver_name = trade3.receiver_name == null ? "" : trade3.receiver_name;// 如果存在null值,将null改为空字符串 + boolean hasReceiverNameEmoji = EmojiFilterUtil.containsEmoji(trade3.receiver_name); + if (hasReceiverNameEmoji) { + trade3.receiver_name = EmojiFilterUtil.filterEmoji(trade3.receiver_name).trim(); + if ("".equals(trade3.receiver_name)) { + trade3.receiver_name = "??"; + } + } else { + trade3.receiver_name = trade3.receiver_name; + } + + if (!flag_basket) { + logger.info("货篮判断成功| [ {} ] ,属于货篮:{}", trade3.tid, basket_code); + // 插入符合货篮条件的订单 + sql = "insert into tb_sale_order (code,original_sale_order_code,platform_code,pay_account,pay_no,platform_status,platform_type,brand_list,quantity,money" + + ",type,buyer_nick_name,platform_create_time,buyer_message,seller_note,pay_money,total_fee,adjust_fee,discount_fee,pay_time,platform_modify_time,invoice_type,pay_mode_id" + + ",shop_code,company_code,trade_mode_id,cur_delivery_order_code,cur_money,cur_quantity,cur_invoice_type,status,basket_code,storage_code,encrpy_buyer_nick_name,seller_flag,obm_company_code,entrust_type,del_flag,order_splite,obm_storage_code,lock_reason_id,lock_note)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + ps.setString(2, order_code); + } + ps.setString(3, trade3.tid); + ps.setString(4, null);// 原来存值为tradeInfo.alipay_id + ps.setString(5, trade3.alipay_no); + ps.setString(6, trade3.status); + ps.setString(7, trade3.type); + ps.setString(8, trade3.brand); + ps.setInt(9, trade3.num); + ps.setDouble(10, Double.parseDouble(trade3.money)); + if (type_kind == 4) { + ps.setInt(11, 5); + } else { + ps.setInt(11, 1); + } + + ps.setString(12, trade3.buyer_nick); + ps.setString(13, trade3.created); + ps.setString(14, trade3.buyer_message); + ps.setString(15, trade3.seller_memo); + ps.setDouble(16, Double.parseDouble(trade3.pay_money)); + ps.setDouble(17, Double.parseDouble(trade3.product_fee)); + ps.setDouble(18, Double.parseDouble(trade3.adjust_fee)); + ps.setDouble(19, Double.parseDouble(trade3.discount_fee)); + ps.setString(20, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + ps.setString(21, trade3.platform_modify_time); + ps.setInt(22, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(23, trade3.pay_mode_id); + ps.setString(24, trade3.shop_code); + if (trade3.omsOwnFlag) { + ps.setString(25, null); + } else { + ps.setString(25, trade3.company_code); + } + ps.setInt(26, 1); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(27, "PS" + order_code); + } else { + ps.setString(27, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(27, "PS" + order_code); + } + ps.setDouble(28, Double.parseDouble(trade3.pay_money)); + ps.setInt(29, trade3.num); + ps.setInt(30, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(31, 4); + ps.setString(32, basket_code); + // order_type取值为1:自发订单-经销商自发商品,2:自发订单-品牌商自发商品,3:代发订单-全部代发商品,4:混合订单-经销商自发商品,5:混合订单-品牌商代发商品 + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(33, null); + ps.setString(36, trade3.obm_company_code); + ps.setString(40, trade3.storage_code); + + } else { + ps.setString(33, trade3.storage_code); + ps.setString(36, null); + ps.setString(40, null); + } + ps.setString(34, trade3.encrpy_buyer_nick_name); + ps.setInt(35, trade3.seller_flag); + + if (trade3.entrust_type == 2) { + ps.setInt(37, 2); + } else { + ps.setInt(37, 1); + } + boolean lockFlag = false; + if (trade3.delFlag || (separate_flag && tradeListLoopCount == 1) + || (trade3.trade_type2 == 2 && "是".equals(trade3.test_flag))) { + + ps.setInt(38, 3); + } else if (trade3.shopMessage.getOrder_sync_lock_flag() == 2 + && (!"".equals(liveStreamLockTradeReason))) { + lockFlag = true;// 只要状态为锁定,后面的lock_reason_id和lock_note必须写入值 + ps.setInt(38, 2); + } else { + ps.setInt(38, 1); + } + if (separate_flag) { + ps.setInt(39, 1); + } else { + ps.setString(39, null); + } + if (lockFlag) { + ps.setInt(41, 4); + ps.setString(42, "符合店铺直播锁定关键字:" + liveStreamLockTradeReason); + } else { + ps.setInt(41, 1); + ps.setString(42, ""); + } + + if (ps.executeUpdate() == 0) { + return false; + } + } + // 执行普通订单的后续操作 + if (flag_basket) { + // 插入不符合货篮条件的订单 + sql = "insert into tb_sale_order (code,original_sale_order_code,platform_code,pay_account,pay_no,platform_status,platform_type,brand_list,quantity,money" + + ",type,buyer_nick_name,platform_create_time,buyer_message,seller_note,pay_money,total_fee,adjust_fee,discount_fee,pay_time,platform_modify_time,invoice_type,pay_mode_id" + + ",shop_code,company_code,trade_mode_id,cur_delivery_order_code,cur_money,cur_quantity,cur_invoice_type,status,storage_code,encrpy_buyer_nick_name,seller_flag,obm_company_code,entrust_type,entrust_time,del_flag,order_splite,invoice_status,obm_storage_code,lock_reason_id,lock_note)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + ps.setString(2, order_code); + } + ps.setString(3, trade3.tid); + ps.setString(4, null);// 原来存值为tradeInfo.alipay_id + ps.setString(5, trade3.alipay_no); + ps.setString(6, trade3.status); + ps.setString(7, trade3.type); + ps.setString(8, trade3.brand); + ps.setInt(9, trade3.num); + ps.setDouble(10, Double.parseDouble(trade3.money)); + if (type_kind == 4) { + ps.setInt(11, 5); + } else { + ps.setInt(11, 1); + } + ps.setString(12, trade3.buyer_nick); + ps.setString(13, trade3.created); + ps.setString(14, trade3.buyer_message); + ps.setString(15, trade3.seller_memo); + ps.setDouble(16, Double.parseDouble(trade3.pay_money)); + ps.setDouble(17, Double.parseDouble(trade3.product_fee)); + ps.setDouble(18, Double.parseDouble(trade3.adjust_fee)); + ps.setDouble(19, Double.parseDouble(trade3.discount_fee)); + ps.setString(20, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + ps.setString(21, trade3.platform_modify_time); + ps.setInt(22, trade3.invoice_type > 0 ? 2 : 1); + ps.setInt(23, trade3.pay_mode_id); + ps.setString(24, trade3.shop_code); + if (trade3.omsOwnFlag) {// 如果omsOwnFlag为true,表示是天猫供销平台或者OMS取到的订单,公司编码写null + ps.setString(25, null); + } else { + ps.setString(25, trade3.company_code); + } + ps.setInt(26, 1); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(27, "PS" + order_code); + } else { + ps.setString(27, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(27, "PS" + order_code); + } + ps.setDouble(28, Double.parseDouble(trade3.pay_money)); + ps.setInt(29, trade3.num); + ps.setInt(30, trade3.invoice_type > 0 ? 2 : 1); + if (sale_template_type == 1) { + if (sale_order_no_audit == 2) { + if (sale_order_3_no_audit == 2) { + if ((trade3.invoice_type == 0) + && (("".equals(trade3.buyer_message) || (trade3.buyer_message == null))) + && (("".equals(trade3.seller_memo)) || (trade3.seller_memo == null))) { + ps.setInt(31, 4); + flag_basket = false; + flag_audit_4 = true; + } else { + ps.setInt(31, 1); + } + } else { + /** + * date2018-06-21 不管有没有发票,全部都走到打单去 + */ + + ps.setInt(31, 4); + flag_basket = false; + flag_audit_4 = true; + } + } else { + ps.setInt(31, 1); + } + } else { + ps.setInt(31, 1); + } + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(32, null); + ps.setString(35, trade3.obm_company_code); + ps.setString(41, trade3.storage_code); + } else { + ps.setString(32, trade3.storage_code); + ps.setString(35, null); + ps.setString(41, null); + } + ps.setString(33, trade3.encrpy_buyer_nick_name); + ps.setInt(34, trade3.seller_flag); + if (trade3.entrust_type == 2) { + ps.setInt(36, 2); + } else { + ps.setInt(36, 1); + } + if (trade3.entrust_type == 2 && flag_basket == false && flag_audit_4) { + ps.setString(37, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else { + ps.setString(37, null); + } + boolean lockFlag = false; + if (trade3.delFlag || (separate_flag && tradeListLoopCount == 1) + || (trade3.trade_type2 == 2 && "是".equals(trade3.test_flag))) { + ps.setInt(38, 3); + } else if (trade3.shopMessage.getOrder_sync_lock_flag() == 2 + && (!"".equals(liveStreamLockTradeReason))) { + lockFlag = true; + ps.setInt(38, 2); + } else { + ps.setInt(38, 1); + } + if (separate_flag) { + ps.setInt(39, 1); + } else { + ps.setString(39, null); + } + if (trade3.invoice_type > 0) { + ps.setInt(40, 1); + } else { + ps.setString(40, null); + } + if (lockFlag) { + ps.setInt(42, 4); + ps.setString(43, "符合店铺直播锁定关键字:" + liveStreamLockTradeReason); + } else { + ps.setInt(42, 1); + ps.setString(43, ""); + } + if (ps.executeUpdate() == 0) { + return false; + } + + } + // 对于天猫供销平台订单,同时写入tb_sub_sale_order + if ("012".equals(trade3.platform_code)) { + FenxiaoInfo fxInfo = trade3.fenxiaoInfo; + sql = "insert into tb_sub_sale_order (code,tc_order_id,distributor_username,trade_type,buyer_payment,status,company_code)" + + " values (?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, order_code); + } else { + ps.setString(1, order_code + "_" + (tradeListLoopCount - 1)); + } + + } else { + ps.setString(1, order_code); + } + ps.setString(2, fxInfo.tc_order_id); + ps.setString(3, fxInfo.distributor_username); + ps.setInt(4, fxInfo.trade_type); + ps.setString(5, fxInfo.buyer_payment); + ps.setString(6, fxInfo.status); + ps.setString(7, trade3.obm_company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + // 插入发票 + if (trade3.invoice_type > 0) { + sql = "insert into tb_invoice (code,type,title,content,money,TAX_msg,sale_order_code,type_id,company_code,status,obm_company_code,TAX_id,address_telephone,bank_of_deposit_account_number,receive_telephone,receive_email,bank_of_deposit,encrypt_title,encrypt_bank_account,encrypt_receive_telephone,encrypt_receive_email)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "FP" + order_code + "_1"); + } else { + ps.setString(1, "FP" + order_code + (tradeListLoopCount - 1) + "_1"); + } + + } else { + ps.setString(1, "FP" + order_code + "_1"); + } + ps.setInt(2, 1); + ps.setString(3, trade3.invoice_title); + ps.setString(4, trade3.invoice_content); + ps.setDouble(5, Double.parseDouble(trade3.invoice_money)); + ps.setString(6, trade3.invoice_taxmsg); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(7, order_code); + } else { + ps.setString(7, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(7, order_code); + } + ps.setInt(8, trade3.invoice_type); + ps.setString(9, trade3.company_code); + if (flag_audit_4) { + ps.setInt(10, 2); + } else { + ps.setInt(10, 1); + } + if (trade3.company_type == 3 && trade3.obm_flag == 0) { + ps.setString(11, trade3.obm_company_code); + } else { + ps.setString(11, null); + } + ps.setString(12, trade3.tax_id); + ps.setString(13, trade3.address_telephone); + ps.setString(14, trade3.bank_of_deposit_account_number); + ps.setString(15, trade3.invoice_phone); + ps.setString(16, trade3.invoice_email); + ps.setString(17, trade3.bank_of_deposit); + ps.setString(18, trade3.encrypt_invoice_title); + ps.setString(19, trade3.encrypt_bank_account); + ps.setString(20, trade3.encrypt_invoice_phone); + ps.setString(21, trade3.encrypt_invoice_email); + if (ps.executeUpdate() == 0) { + return false; + } + } + // 插入配送单 + sql = "insert into tb_delivery_order (code,sale_order_code,cost,country,state,city,district,post_code,delivery_mode_code,company_code,name,mobile,address,telephone,encrpy_name,encrpy_mobile,encrpy_address,encrpy_telephone,obm_company_code,oaid)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "PS" + order_code); + ps.setString(2, order_code); + } else { + ps.setString(1, "PS" + order_code + "_" + (tradeListLoopCount - 1)); + ps.setString(2, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "PS" + order_code); + ps.setString(2, order_code); + } + + ps.setDouble(3, Double.parseDouble(trade3.post_fee)); + ps.setString(4, trade3.receiver_country); + ps.setString(5, trade3.receiver_state); + ps.setString(6, trade3.receiver_city); + ps.setString(7, trade3.receiver_district); + ps.setString(8, trade3.receiver_zip); + ps.setInt(9, delivery_type_id); + if (trade3.omsOwnFlag) { + ps.setString(10, null); + } else { + ps.setString(10, trade3.company_code); + } + ps.setString(11, trade3.receiver_name); + ps.setString(12, trade3.receiver_mobile); + ps.setString(13, trade3.receiver_address); + ps.setString(14, trade3.receiver_phone); + ps.setString(15, trade3.encrpy_name); + ps.setString(16, trade3.encrpy_mobile); + ps.setString(17, trade3.encrpy_address); + ps.setString(18, trade3.encrpy_telephone); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(19, trade3.obm_company_code); + } else { + ps.setString(19, null); + } + ps.setString(20, trade3.oaid); + if (ps.executeUpdate() == 0) { + return false; + } + /** + * 如果是拆分订单,则原单只插入上述部分 + */ + if (separate_flag && tradeListLoopCount == 1) { + continue; + } + // 执行货篮订单的后续操作/三无订单及全免审中无票订单 + if (flag_basket == false) { + // 插入出库单 + sql = "insert into tb_storage_out_order (code,brand_list,status,quantity,type,sale_order_code,company_code,storage_code,obm_company_code)" + + " values (?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "CK" + order_code); + } + ps.setString(2, trade3.brand); + if (flag_audit_4 || flag_audit_3) { + if (flag_audit_4) { + ps.setInt(3, 1); + } else { + ps.setInt(3, -1); + } + } else { + ps.setInt(3, 1); + } + ps.setInt(4, trade3.num); + if (flag_audit_4 || flag_audit_3) { + ps.setInt(5, 1); + } else { + ps.setInt(5, 3); + } + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(6, order_code); + } else { + ps.setString(6, order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(6, order_code); + } + // ps.setString(6, order_code); + if (trade3.omsOwnFlag) { + ps.setString(7, null); + } else { + ps.setString(7, trade3.company_code); + } + ps.setString(8, trade3.storage_code); + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + ps.setString(9, trade3.obm_company_code); + } else { + ps.setString(9, null); + } + if (ps.executeUpdate() == 0) { + return false; + } + + /** + * 只有当委外订单时插入出库单详表 + */ + if (trade3.entrust_type == 2) { + /** + * 如果是单品直接插入 + */ + int storage_out_id = 0; + for (int i = 0; i < order3.length; i++) { + OrderInfo orderInfo3 = order3[i]; + + /** + * 是经销商订单 + */ + if (trade3.company_type == 2) { + // int commodity_class = 0; + // /** + // * 当商品为赠品时,查询商品的属性为单品还是组合 + // */ + /** + * 如果是单品,直接插入 + */ + if (orderInfo3.commodity_class == 1) { + sql = "insert into tb_storage_out_order_items (code,commodity_code,quantity,gift,storage_out_order_code,left_quantity,money,company_code)" + + " values (?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + "_" + + (++storage_out_id)); + } + + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setString(2, orderInfo3.commodity_code); + ps.setInt(3, orderInfo3.num); + ps.setInt(4, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(5, "CK" + order_code); + } else { + ps.setString(5, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(5, "CK" + order_code); + } + ps.setInt(6, orderInfo3.num); + ps.setDouble(7, Double.valueOf(orderInfo3.payment)); + ps.setString(8, trade3.company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + /** + * 如果是组合 + */ + if (orderInfo3.commodity_class == 2) { + Map commodity_codes_map = new HashMap(); + sql = "select commodity_code,commodity_quantity,commodity_price,adjust_price,adjust_begin_time,adjust_end_time from tb_group_commodity where group_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.commodity_code); + ps.setString(2, trade3.company_code); + rs = ps.executeQuery(); + while (rs.next()) { + EntrustOrder eo = new EntrustOrder(); + String commodity_code = rs.getString("commodity_code"); + eo.commodity_quantity = rs.getInt("commodity_quantity"); + eo.commodity_price = rs.getDouble("commodity_price"); + eo.adjust_price = rs.getDouble("adjust_price"); + eo.adjust_begin_time = rs.getString("adjust_begin_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_begin_time"); + eo.adjust_end_time = rs.getString("adjust_end_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_end_time"); + commodity_codes_map.put(commodity_code, eo); + } + for (Map.Entry entry_commodity_codes : commodity_codes_map + .entrySet()) { + String commodity_code = entry_commodity_codes.getKey(); + EntrustOrder eo = entry_commodity_codes.getValue(); + sql = "insert into tb_storage_out_order_items (code,commodity_code,quantity,gift,storage_out_order_code,left_quantity,money,company_code,original_commodity_code)" + + " values (?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + + "_" + (++storage_out_id)); + } + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + ps.setString(2, commodity_code); + ps.setInt(3, orderInfo3.num * eo.commodity_quantity); + ps.setInt(4, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(5, "CK" + order_code); + } else { + ps.setString(5, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(5, "CK" + order_code); + } + + ps.setInt(6, orderInfo3.num); + if (orderInfo3.gift_type == 2) { + ps.setDouble(7, 0.0); + } else { + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()); + if (now.compareTo(eo.adjust_begin_time) > 0 + && now.compareTo(eo.adjust_end_time) < 0) { + ps.setDouble(7, + eo.adjust_price * eo.commodity_quantity * orderInfo3.num); + } else { + ps.setDouble(7, eo.commodity_price * eo.commodity_quantity + * orderInfo3.num); + } + } + ps.setString(8, trade3.company_code); + ps.setString(9, orderInfo3.commodity_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + + } + /** + * 如果是供应商,其中拆分订单品牌商代发的分订单的company_type==3,但是obm_flag为代发 + */ + if (trade3.company_type == 3) { + // int commodity_class = 0; + // /** + // * 当商品为赠品时,查询商品的属性为单品还是组合 + // */ + if (orderInfo3.commodity_class == 1) { + sql = "insert into tb_storage_out_order_items (code,quantity,gift,storage_out_order_code,left_quantity,money,obm_company_code,obm_commodity_code,company_code,commodity_code)" + + " values (?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + "_" + + (++storage_out_id)); + } + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setInt(2, orderInfo3.num); + ps.setInt(3, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(4, "CK" + order_code); + } else { + ps.setString(4, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(4, "CK" + order_code); + } + + ps.setInt(5, orderInfo3.num); + ps.setDouble(6, Double.valueOf(orderInfo3.payment)); + ps.setString(7, trade3.obm_company_code); + ps.setString(8, orderInfo3.obm_commodity_code); + if (trade3.obm_flag == 1) { + ps.setString(9, trade3.company_code); + ps.setString(10, orderInfo3.commodity_code); + } else { + ps.setString(9, null); + ps.setString(10, null); + } + + if (ps.executeUpdate() == 0) { + return false; + } + } + if (orderInfo3.commodity_class == 2) { + Map commodity_codes_map = new HashMap(); + if (trade3.obm_flag != 1) { + sql = "SELECT " + " commodity_code AS obm_commodity_code, " + + " commodity_quantity, " + " commodity_price, " + + " adjust_price, " + " adjust_begin_time, " + + " adjust_end_time, " + " commodity_code " + "FROM " + + " tb_group_commodity " + "WHERE " + " group_code = ? " + + "AND company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.obm_commodity_code); + ps.setString(2, trade3.obm_company_code); + } else { + sql = "SELECT " + " tgc.commodity_code AS obm_commodity_code, " + + " tgc.commodity_quantity, " + " tgc.commodity_price, " + + " tgc.adjust_price, " + " tgc.adjust_begin_time, " + + " tgc.adjust_end_time, " + " toac.commodity_code " + "FROM " + + " tb_group_commodity tgc, " + " tb_obm_agent_commodity toac, " + + " tb_obm_agent_shop toas " + "WHERE " + " tgc.group_code = ? " + + "AND tgc.company_code = ? " + + "AND tgc.commodity_code = toac.obm_commodity_code " + + "AND toac.obm_agent_shop_code = toas. code " + + "AND toas.shop_code = ?" + + "AND toas.obm_company_code = toac.obm_company_code " + + "AND toas.company_code = toac.company_code " + + "AND toac. STATUS = 2 " + "AND toas. STATUS = 2 " + + "AND toac.del_flag=1"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo3.obm_commodity_code); + ps.setString(2, trade3.obm_company_code); + ps.setString(3, trade3.shop_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + EntrustOrder eo = new EntrustOrder(); + String obm_commodity_code = rs.getString("obm_commodity_code"); + if (trade3.obm_flag == 1) { + eo.commodity_code = rs.getString("commodity_code"); + } + eo.commodity_quantity = rs.getInt("commodity_quantity"); + eo.commodity_price = rs.getDouble("commodity_price"); + eo.adjust_price = rs.getDouble("adjust_price"); + eo.adjust_begin_time = rs.getString("adjust_begin_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_begin_time"); + eo.adjust_end_time = rs.getString("adjust_end_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("adjust_end_time"); + commodity_codes_map.put(obm_commodity_code, eo); + } + + for (Map.Entry entry_commodity_codes : commodity_codes_map + .entrySet()) { + EntrustOrder eo = entry_commodity_codes.getValue(); + String obm_commodity_code = entry_commodity_codes.getKey(); + sql = "insert into tb_storage_out_order_items (code,quantity,gift,storage_out_order_code,left_quantity,money,obm_company_code,obm_commodity_code,company_code,commodity_code,original_commodity_code,original_obm_commodity_code)" + + " values (?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } else { + ps.setString(1, "CK" + order_code + "_" + (tradeListLoopCount - 1) + + "_" + (++storage_out_id)); + } + + } else { + ps.setString(1, "CK" + order_code + "_" + (++storage_out_id)); + } + + ps.setInt(2, orderInfo3.num * eo.commodity_quantity); + ps.setInt(3, orderInfo3.gift_type); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(4, "CK" + order_code); + } else { + ps.setString(4, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(4, "CK" + order_code); + } + ps.setInt(5, orderInfo3.num * eo.commodity_quantity); + if (orderInfo3.gift_type == 2) { + ps.setDouble(6, 0.0); + } else { + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date()); + if (now.compareTo(eo.adjust_begin_time) > 0 + && now.compareTo(eo.adjust_end_time) < 0) { + ps.setDouble(6, + eo.adjust_price * eo.commodity_quantity * orderInfo3.num); + } else { + ps.setDouble(6, eo.commodity_price * eo.commodity_quantity + * orderInfo3.num); + } + } + ps.setString(7, trade3.obm_company_code); + ps.setString(8, obm_commodity_code); + if (trade3.obm_flag == 1) { + ps.setString(9, trade3.company_code); + ps.setString(10, eo.commodity_code); + ps.setString(11, orderInfo3.commodity_code); + } else { + ps.setString(9, null); + ps.setString(10, null); + ps.setString(11, null); + } + ps.setString(12, orderInfo3.obm_commodity_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + } + } + } + } + // if (!(agentFlag || omsOwnFlag)) {//代发和天猫供销平台不插入财务 + // 插入财务单 + sql = "insert into tb_finance_order (code,brand_list,quantity,money,status,type,sub_type,pay_time,order_type,order_code,company_code,platform_pay,obm_company_code)" + + " values (?,?,?,?,-1,1,1,?,5,?,?,?,?)"; + ps = conn.prepareStatement(sql); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(1, "CWCK" + order_code); + } else { + ps.setString(1, "CWCK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(1, "CWCK" + order_code); + } + ps.setString(2, trade3.brand); + ps.setInt(3, trade3.num); + ps.setString(4, trade3.money); + ps.setString(5, trade3.pay_time.length() == 0 ? null : trade3.pay_time); + if (separate_flag) { + if (tradeListLoopCount == 1) {// 说明是原单 + ps.setString(6, "CK" + order_code); + } else { + ps.setString(6, "CK" + order_code + "_" + (tradeListLoopCount - 1)); + } + } else { + ps.setString(6, "CK" + order_code); + } + + if (trade3.obm_flag == 1 || trade3.omsOwnFlag) { + if (trade3.obm_flag == 1) { + ps.setString(7, trade3.company_code); + ps.setString(9, trade3.obm_company_code); + } + if (trade3.omsOwnFlag) { + ps.setString(7, null); + ps.setString(9, trade3.obm_company_code); + } + } else { + ps.setString(7, trade3.company_code); + ps.setString(9, null); + } + ps.setDouble(8, Double.valueOf(trade3.money) * trade3.pay_percent); + if (ps.executeUpdate() == 0) { + return false; + } + } + /** + * 如果是未拆分订单,只执行原单插入,后面的订单不执行操作 + */ + if (!separate_flag) { + break; + } + } + + return true; + } catch (Exception e) { + logger.error(this, e); + if (giveBackGiftNumber(copyTradeInfo)) { + logger.info("订单 [ {} ] :归还赠品/订单成功!", copyTradeInfo.tid); + } else { + logger.info("订单 [ {} ] :归还赠品/订单失败!", copyTradeInfo.tid); + } + return false; + } + } + + /** + * @Description: 检查商品标题,是否需要根据商家的配置锁单 @Title: checkTradeLockReason @author + * Lewis @param keyWords @param title @throws + */ + private String checkTradeLockReason(String LockReason, String keyWords, String title) { + StringBuffer reason = new StringBuffer(LockReason); + for (;;) { + keyWords = keyWords.trim(); + if (keyWords.startsWith(",")) { + keyWords = keyWords.substring(1, keyWords.length()); + } else { + break; + } + } + String[] keyWordsArr = keyWords.split(","); + for (int i = 0; i < keyWordsArr.length; i++) { + String keyWord = keyWordsArr[i]; + if ("".equals(keyWord.trim())) { + continue; + } + if ((title.indexOf(keyWordsArr[i]) > -1) && (reason.indexOf(keyWordsArr[i]) == -1)) { + reason.append(keyWord); + } + } + return reason.toString(); + } + + /** + * @param giftCommodityInfo 赠品 + * @param copyTradeInfo 订单 + * @param gift_copies 赠品份数 + * @param rule 活动规则 + * @title: distributionGift + * @description: 配送赠品 + */ + private void distributionGift(Map giftCommodityInfo, TradeInfo copyTradeInfo, int gift_copies, + Rule rule, String rulename) throws Exception { + logger.info("订单 [ {} ] 符合活动规则:{}——{}", copyTradeInfo.tid, rule.activity_name, rule.rule_name); + for (Map.Entry entry : giftCommodityInfo.entrySet()) { + copyTradeInfo.orders = Arrays.copyOf(copyTradeInfo.orders, copyTradeInfo.orders.length + 1); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1] = new OrderInfo(); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].commodity_code = entry.getKey(); + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].num = gift_copies + * Integer.parseInt(entry.getValue());// 获取赠品的数量 + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].cid = rule.rule_apply_object; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].discount_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].payment = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].price = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_type = 2; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].title = rule.activity_name + "——" + rulename; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].sku_properties_name = ""; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].total_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].adjust_fee = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].oid = ""; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].order_buyer_payment = "0"; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].rule_code = rule.rule_code; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_activity_code = rule.gift_activity_code; + copyTradeInfo.orders[copyTradeInfo.orders.length - 1].gift_copies = gift_copies; + copyTradeInfo.num += (gift_copies * Integer.parseInt(entry.getValue()));// 计算订单总数量 + } + } + + /** + * @param tradeInfo + * @return boolean + * @title: giveBackGiftNumber // TODO + * @description: 发生异常时, + * 归还数据库中已赠送出去的赠品/订单数量(对于不限量的规则不予处理,对于有限额的规则,先归还memcached,再更新数据库) + * 1.订单满足多个规则,分别归还赠品/订单数量 2.订单满足一个规则,直接归还赠品/订单数量 + */ + public boolean giveBackGiftNumber(TradeInfo tradeInfo) { + try { + + Map map = new HashMap();// 存放规则及其需要归还的赠品/订单数量 + for (OrderInfo orderInfo : tradeInfo.orders) { + if (orderInfo.gift_type == 2) {// 该商品为赠品 + String activity_rule = orderInfo.gift_activity_code + orderInfo.rule_code; + if (map.containsKey(activity_rule)) { + continue; + } else { + map.put(activity_rule, orderInfo); + String rule_key = tradeInfo.shop_code + "_sr_V2.0_" + orderInfo.rule_code; + String rule = (String) mcc.get(rule_key); + GiftNum giftNum = new GsonBuilder().disableHtmlEscaping().create().fromJson(rule, + GiftNum.class); + if (1 == giftNum.type) {// 限订单 + logger.info("订单 [ {} ] 活动规则是限订单,将开始归还订单数量!", tradeInfo.tid); + giftNum.order_current = giftNum.order_current - 1; + mcc.set(rule_key, 0, new GsonBuilder().disableHtmlEscaping().create().toJson(giftNum)); + activityUpdateQueue.add(giftNum); + } else if (2 == giftNum.type) { + logger.info("订单 [ {} ] 活动规则是限赠品,将开始归还赠品数量!", tradeInfo.tid); + giftNum.gift_current = giftNum.gift_current - orderInfo.gift_copies; + mcc.set(rule_key, 0, new GsonBuilder().disableHtmlEscaping().create().toJson(giftNum)); + activityUpdateQueue.add(giftNum); + } + } + } + } + return true; + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + } + + /** + * 错误的订单数据写入 错误文件 + * + * @param tradeInfo + */ + private synchronized void writeCsvErrorFile(TradeInfo tradeInfo, String msg) { + String writePath = tradeInfo.out_path; + File readFile = new File(tradeInfo.export_file_path); + BufferedReader reader = null; + BaseFileField baseFileField; + try { + Charset charset = checkFile(readFile, tradeInfo.replenish_code); + if (charset == null) { + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, "失败", "请上传官方支持的编码文件!"); + throw new Exception("请上传官方支持的编码文件"); + } + + reader = new BufferedReader(new InputStreamReader(new FileInputStream(readFile), charset)); + // 获取第一行 取得上传类型 + String type = reader.readLine(); + String fileType = type.split(Constants.CSV_FILE_PATTERN, -1)[0]; + if (Objects.equals(fileType, "简易")) { + baseFileField = new EasyFileField(); + + } else if (Objects.equals(fileType, "")) { + baseFileField = new StandardFileField(); + // 不做处理 + } else { + return; + } + // 写入错误数据 + baseFileField.writeErrorToCsv(tradeInfo, charset, msg); + if (writePath.contains("/")) { + writePath = writePath.substring(writePath.lastIndexOf("/")); + } + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, "失败", writePath); + } catch (Exception e) { + e.printStackTrace(); + OrderSyncs.updateReplenishResult(tradeInfo.replenish_code, "写入错误文件异常!", ""); + logger.error("写入文件出错!"); + } finally { + CloseUtil.close(reader); + } + } + + private Charset checkFile(File file, String code) throws Exception { + if (!file.isFile()) { + OrderSyncs.updateReplenishResult(code, "文件解析错误!", ""); + throw new Exception("未读取到数据源文件!"); + } + + // 获取所有字符集 匹配文件的字符集 + CharsetDetector charsetDetector = new CharsetDetector(); + byte[] bytes = Files.readAllBytes(Paths.get(file.getPath())); + charsetDetector.setText(bytes); + CharsetMatch match = charsetDetector.detect(); + for (Map.Entry stringCharsetEntry : Charset.availableCharsets().entrySet()) { + if (Objects.equals(stringCharsetEntry.getKey(), match.getName())) { + return stringCharsetEntry.getValue(); + } + } + return null; + } + + public synchronized boolean recordErrorReplenishTrade(TradeInfo tradeInfo, String msg) { + try { + ExcelCopyUtil excelCopyUtil = new ExcelCopyUtil(); + for (int i = 0; i < tradeInfo.orders.length; i++) { + excelCopyUtil.copyTemplate(tradeInfo.export_file_path, tradeInfo.row_num + i, tradeInfo.out_path, msg); + } + + /* + * // OrderSyncs.copyFile(new File(tradeInfo.out_path),new // + * File(tradeInfo.out_path)); int titleRowNum = 2;//标题占的行数 FileInputStream fis = + * new FileInputStream(tradeInfo.export_file_path + tradeInfo.out_path); // + * FileInputStream fis = new FileInputStream("orders2.xlsx"); XSSFWorkbook xw = + * new XSSFWorkbook(fis); XSSFSheet xs = xw.getSheetAt(0); + * + * int rowLength = xs.getLastRowNum() + 1; + * + * xs.createRow(rowLength); if (tradeInfo.templateStatus == 1) { for (int i = 0; + * i < 14; i++) { xs.getRow(rowLength).createCell(i); + * xs.getRow(rowLength).getCell(i).getCellStyle().setLocked(false); } + * xs.getRow(rowLength).getCell(0).setCellValue(tradeInfo.row_num - + * titleRowNum); + * xs.getRow(rowLength).getCell(1).setCellValue(tradeInfo.shop_code); + * xs.getRow(rowLength).getCell(2).setCellValue(tradeInfo.tid); + * xs.getRow(rowLength).getCell(3).setCellValue(tradeInfo.pay_time); + * xs.getRow(rowLength).getCell(4).setCellValue(tradeInfo.receiver_name); + * xs.getRow(rowLength).getCell(5).setCellValue(tradeInfo.receiver_mobile); + * xs.getRow(rowLength).getCell(6).setCellValue(tradeInfo.receiver_address); + * xs.getRow(rowLength).getCell(7).setCellValue(tradeInfo.buyer_message); + * xs.getRow(rowLength).getCell(8).setCellValue(tradeInfo.seller_memo); for (int + * i = 0; i < tradeInfo.orders.length; i++) { if (i > 0) { + * xs.createRow(rowLength + i); } + * + * xs.getRow(rowLength + i).createCell(0); xs.getRow(rowLength + + * i).getCell(0).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(9); xs.getRow(rowLength + + * i).getCell(9).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(10); xs.getRow(rowLength + + * i).getCell(10).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(11); xs.getRow(rowLength + + * i).getCell(11).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).getCell(0).setCellValue(++tradeInfo.row_num - titleRowNum); + * xs.getRow(rowLength + + * i).getCell(9).setCellValue(tradeInfo.orders[i].platform_seller_code); + * xs.getRow(rowLength + i).getCell(10).setCellValue(tradeInfo.orders[i].num); + * xs.getRow(rowLength + i).getCell(11).setCellValue(tradeInfo.orders[i].price); + * } xs.getRow(rowLength).getCell(12).setCellValue(msg); + * + * + * } else if (tradeInfo.templateStatus == 2) { for (int i = 0; i < 21; i++) { + * xs.getRow(rowLength).createCell(i); + * xs.getRow(rowLength).getCell(i).getCellStyle().setLocked(false); } + * + * xs.getRow(rowLength).getCell(0).setCellValue(tradeInfo.row_num - + * titleRowNum); + * xs.getRow(rowLength).getCell(1).setCellValue(tradeInfo.shop_code); + * xs.getRow(rowLength).getCell(2).setCellValue(tradeInfo.tid); + * xs.getRow(rowLength).getCell(3).setCellValue(tradeInfo.product_fee); + * xs.getRow(rowLength).getCell(4).setCellValue(tradeInfo.num); + * xs.getRow(rowLength).getCell(5).setCellValue(tradeInfo.money); + * xs.getRow(rowLength).getCell(6).setCellValue(tradeInfo.discount_fee); + * xs.getRow(rowLength).getCell(7).setCellValue(tradeInfo.pay_time); + * xs.getRow(rowLength).getCell(8).setCellValue(tradeInfo.created); + * xs.getRow(rowLength).getCell(9).setCellValue(tradeInfo.receiver_name); + * xs.getRow(rowLength).getCell(10).setCellValue(tradeInfo.receiver_phone); + * xs.getRow(rowLength).getCell(11).setCellValue(tradeInfo.receiver_mobile); + * xs.getRow(rowLength).getCell(12).setCellValue(tradeInfo.receiver_state); + * xs.getRow(rowLength).getCell(13).setCellValue(tradeInfo.receiver_city); + * xs.getRow(rowLength).getCell(14).setCellValue(tradeInfo.receiver_district); + * xs.getRow(rowLength).getCell(15).setCellValue(tradeInfo.receiver_address); + * xs.getRow(rowLength).getCell(16).setCellValue(tradeInfo.receiver_zip); + * xs.getRow(rowLength).getCell(17).setCellValue(tradeInfo.post_fee); + * xs.getRow(rowLength).getCell(18).setCellValue(tradeInfo.invoice_type); + * xs.getRow(rowLength).getCell(19).setCellValue(tradeInfo.invoice_content); + * xs.getRow(rowLength).getCell(20).setCellValue(tradeInfo.tax_id); + * xs.getRow(rowLength).getCell(21).setCellValue(tradeInfo.invoice_taxmsg); + * xs.getRow(rowLength).getCell(22).setCellValue(tradeInfo.invoice_email); + * xs.getRow(rowLength).getCell(23).setCellValue(tradeInfo.invoice_phone); + * xs.getRow(rowLength).getCell(24).setCellValue(tradeInfo.address_telephone); + * xs.getRow(rowLength).getCell(25).setCellValue(tradeInfo. + * bank_of_deposit_account_number); + * xs.getRow(rowLength).getCell(26).setCellValue(tradeInfo.invoice_money); + * xs.getRow(rowLength).getCell(27).setCellValue(tradeInfo.status); + * xs.getRow(rowLength).getCell(28).setCellValue(tradeInfo.title); + * xs.getRow(rowLength).getCell(29).setCellValue(tradeInfo.type); + * xs.getRow(rowLength).getCell(30).setCellValue(tradeInfo.buyer_message); + * xs.getRow(rowLength).getCell(31).setCellValue(tradeInfo.seller_memo); + * xs.getRow(rowLength).getCell(32).setCellValue(tradeInfo.test_flag); + * + * for (int i = 0; i < tradeInfo.orders.length; i++) { if (i > 0) { + * xs.createRow(rowLength + i); } + * + * xs.getRow(rowLength + i).createCell(0); xs.getRow(rowLength + + * i).getCell(0).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(34); xs.getRow(rowLength + + * i).getCell(34).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(35); xs.getRow(rowLength + + * i).getCell(35).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(36); xs.getRow(rowLength + + * i).getCell(36).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(37); xs.getRow(rowLength + + * i).getCell(37).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(38); xs.getRow(rowLength + + * i).getCell(38).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).getCell(0).setCellValue(++tradeInfo.row_num - titleRowNum); + * xs.getRow(rowLength + + * i).getCell(34).setCellValue(tradeInfo.orders[i].platform_seller_code); + * xs.getRow(rowLength + i).getCell(35).setCellValue(tradeInfo.orders[i].title); + * xs.getRow(rowLength + i).getCell(36).setCellValue(tradeInfo.orders[i].price); + * xs.getRow(rowLength + i).getCell(37).setCellValue(tradeInfo.orders[i].num); + * xs.getRow(rowLength + + * i).getCell(38).setCellValue(tradeInfo.orders[i].divide_order_fee); } + * + * xs.getRow(rowLength).getCell(39).setCellValue(msg); + * + * } else if (tradeInfo.templateStatus == 3) { + * + * for (int i = 0; i < 40; i++) { xs.getRow(rowLength).createCell(i); + * xs.getRow(rowLength).getCell(i).getCellStyle().setLocked(false); } + * + * xs.getRow(rowLength).getCell(0).setCellValue(tradeInfo.row_num - + * titleRowNum); + * xs.getRow(rowLength).getCell(1).setCellValue(tradeInfo.shop_code); + * xs.getRow(rowLength).getCell(2).setCellValue(tradeInfo.tid); + * xs.getRow(rowLength).getCell(3).setCellValue(tradeInfo.product_fee); + * xs.getRow(rowLength).getCell(4).setCellValue(tradeInfo.num); + * xs.getRow(rowLength).getCell(5).setCellValue(tradeInfo.money); + * xs.getRow(rowLength).getCell(6).setCellValue(tradeInfo.discount_fee); + * xs.getRow(rowLength).getCell(7).setCellValue(tradeInfo.pay_time); + * xs.getRow(rowLength).getCell(8).setCellValue(tradeInfo.created); + * xs.getRow(rowLength).getCell(9).setCellValue(tradeInfo.receiver_name); + * xs.getRow(rowLength).getCell(10).setCellValue(tradeInfo.receiver_phone); + * xs.getRow(rowLength).getCell(11).setCellValue(tradeInfo.receiver_mobile); + * xs.getRow(rowLength).getCell(12).setCellValue(tradeInfo.receiver_state); + * xs.getRow(rowLength).getCell(13).setCellValue(tradeInfo.receiver_city); + * xs.getRow(rowLength).getCell(14).setCellValue(tradeInfo.receiver_district); + * xs.getRow(rowLength).getCell(15).setCellValue(tradeInfo.receiver_address); + * xs.getRow(rowLength).getCell(16).setCellValue(tradeInfo.receiver_zip); + * xs.getRow(rowLength).getCell(17).setCellValue(tradeInfo.post_fee); + * xs.getRow(rowLength).getCell(18).setCellValue(tradeInfo.invoice_type); + * xs.getRow(rowLength).getCell(19).setCellValue(tradeInfo.invoice_content); + * xs.getRow(rowLength).getCell(20).setCellValue(tradeInfo.tax_id); + * xs.getRow(rowLength).getCell(21).setCellValue(tradeInfo.invoice_taxmsg); + * xs.getRow(rowLength).getCell(22).setCellValue(tradeInfo.invoice_email); + * xs.getRow(rowLength).getCell(23).setCellValue(tradeInfo.invoice_phone); + * xs.getRow(rowLength).getCell(24).setCellValue(tradeInfo.address_telephone); + * xs.getRow(rowLength).getCell(25).setCellValue(tradeInfo. + * bank_of_deposit_account_number); + * xs.getRow(rowLength).getCell(26).setCellValue(tradeInfo.invoice_money); + * xs.getRow(rowLength).getCell(27).setCellValue(tradeInfo.status); + * xs.getRow(rowLength).getCell(28).setCellValue(tradeInfo.title); + * xs.getRow(rowLength).getCell(29).setCellValue(tradeInfo.type); + * xs.getRow(rowLength).getCell(30).setCellValue(tradeInfo.buyer_message); + * xs.getRow(rowLength).getCell(31).setCellValue(tradeInfo.seller_memo); + * xs.getRow(rowLength).getCell(32).setCellValue(tradeInfo.test_flag); + * + * for (int i = 0; i < tradeInfo.orders.length; i++) { if (i > 0) { + * xs.createRow(rowLength + i); } + * + * xs.getRow(rowLength + i).createCell(0); xs.getRow(rowLength + + * i).getCell(0).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(34); xs.getRow(rowLength + + * i).getCell(34).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(35); xs.getRow(rowLength + + * i).getCell(35).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(36); xs.getRow(rowLength + + * i).getCell(36).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(37); xs.getRow(rowLength + + * i).getCell(37).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).createCell(38); xs.getRow(rowLength + + * i).getCell(38).getCellStyle().setLocked(false); xs.getRow(rowLength + + * i).getCell(0).setCellValue(++tradeInfo.row_num - titleRowNum); + * xs.getRow(rowLength + + * i).getCell(34).setCellValue(tradeInfo.orders[i].platform_seller_code); + * xs.getRow(rowLength + i).getCell(35).setCellValue(tradeInfo.orders[i].title); + * xs.getRow(rowLength + i).getCell(36).setCellValue(tradeInfo.orders[i].price); + * xs.getRow(rowLength + i).getCell(37).setCellValue(tradeInfo.orders[i].num); + * xs.getRow(rowLength + + * i).getCell(38).setCellValue(tradeInfo.orders[i].divide_order_fee); } + * xs.getRow(rowLength).getCell(39).setCellValue(msg); } + * + * + * + * + * + * + * FileOutputStream fos = new FileOutputStream(tradeInfo.export_file_path + + * tradeInfo.out_path); // FileOutputStream fos = new + * FileOutputStream("orders2.xlsx"); xw.write(fos); xw.close(); fis.close(); + * fos.close(); + */ + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } + + } + + /** + * 查询配送区域的仓库 + * + * @param conn + * @param ps + * @param rs + * @param temporary_delivery_storage_company_code + * @param receiver_country + * @param receiver_state + * @param receiver_city + * @param receiver_district + * @return + * @throws Exception + */ + private String[] queryAreaStorage(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + String temporary_delivery_storage_company_code, String receiver_country, String receiver_state, + String receiver_city, String receiver_district) throws Exception { + /** + * 根据配置判断发货仓库 + */ + boolean provinceFlag = false;// 省级是否查询到仓库,false为未查到,true为查到 + boolean cityFlag = false;// 市级是否查询到仓库,false为未查到,true为一个或多个符合的结果,循环处理只要有合适的就退出循环,如果所有符合的仓库都不能发货,则去找库龄最长的仓库 + String[] storage_codes = {};// 记录订单所属发货区域 + int provinceNum = 0; + Map provinceStorageMap = new ConcurrentHashMap(); + + // 查询OMS设置的订单所在区域的代发仓库 + String sql = "select c.storage_code,d.name from (select a.storage_code,a.province_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=1 and a.country_code=b.code and a.company_code=? and b.name=? and (a.city_code is null or a.city_code='')) c left join tb_admin_dic d " + + "on c.province_code=d.code and d.type=2"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_country); + rs = ps.executeQuery(); + while (rs.next()) { + provinceNum++; + String storage_code = rs.getString("storage_code"); + String province_name = rs.getString("name") == null ? "" : rs.getString("name"); + provinceStorageMap.put(province_name, storage_code); + } + if (provinceNum == 1) { + Iterator> it = provinceStorageMap.entrySet().iterator(); + Map.Entry entry = it.next(); + String province_name = entry.getKey(); + String storage_code = entry.getValue(); + if ((null == province_name || "".equals(province_name)) + || (null != province_name && receiver_state.equals(province_name))) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + provinceFlag = true; + } + } + if (provinceNum > 1) { + Iterator> it = provinceStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String province_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != province_name && receiver_state.equals(province_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + provinceFlag = true; + break;// 只要有省份匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + + if (!provinceFlag) { + Map cityStorageMap = new ConcurrentHashMap(); + int cityNum = 0; + sql = "select c.storage_code,d.name from (select a.storage_code,a.city_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=2 and a.province_code=b.code and a.company_code=? and b.name=? and (a.district_code is null or a.district_code='')) c left join tb_admin_dic d " + + "on c.city_code=d.code and d.type=3"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_state); + rs = ps.executeQuery(); + while (rs.next()) { + cityNum++; + String storage_code = rs.getString("storage_code"); + String city_name = rs.getString("name"); + cityStorageMap.put(city_name, storage_code); + } + if (cityNum == 1) { + Iterator> it = cityStorageMap.entrySet().iterator(); + Map.Entry entry = it.next(); + String city_name = entry.getKey(); + String storage_code = entry.getValue(); + if ((null == city_name || "".equals(city_name)) + || (null != city_name && receiver_city.equals(city_name))) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + cityFlag = true; + } + } + if (cityNum > 1) { + Iterator> it = cityStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String city_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != city_name && receiver_city.equals(city_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + cityFlag = true; + break;// 只要有市匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + } + if (!cityFlag) { + Map districtStorageMap = new ConcurrentHashMap(); + sql = "select c.storage_code,d.name from (select a.storage_code,a.district_code " + + "from tb_storage_area a, tb_admin_dic b " + + "where b.type=3 and a.city_code=b.code and a.company_code=? and b.name=?) c left join tb_admin_dic d " + + "on c.district_code=d.code and d.type=4"; + ps = conn.prepareStatement(sql); + ps.setString(1, temporary_delivery_storage_company_code); + ps.setString(2, receiver_city); + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("storage_code"); + String district_name = rs.getString("name"); + districtStorageMap.put(district_name, storage_code); + } + Iterator> it = districtStorageMap.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String district_name = entry.getKey(); + String storage_code = entry.getValue(); + if (null != district_name && receiver_district.equals(district_name)) { + storage_codes = Arrays.copyOf(storage_codes, storage_codes.length + 1); + storage_codes[storage_codes.length - 1] = storage_code; + break;// 只要有区县匹配成功则跳出循环,该仓库既是订单所属区域发货仓库 + } + } + } + return storage_codes; + } + + private List recordOrder(List tradeList, String trade_key, TradeInfo tradeInfo, + OrderInfo delivery_storage_orderInfo, int order_type) throws Exception { + boolean is_found = false; + for (int i = 0; i < tradeList.size(); i++) { + TradeInfo trade2 = tradeList.get(i); + if (trade2.trade_key.equals(trade_key)) { + if ("".equals(delivery_storage_orderInfo.commodity_code) && (order_type == 1 || order_type == 4)) { + trade2.null_code = true; + } + if ("".equals(delivery_storage_orderInfo.obm_commodity_code) + && (order_type == 2 || order_type == 3 || order_type == 5)) { + trade2.null_code = true; + } + trade2.num = trade2.num + delivery_storage_orderInfo.num; + trade2.orders = Arrays.copyOf(trade2.orders, trade2.orders.length + 1); + trade2.orders[trade2.orders.length - 1] = (OrderInfo) delivery_storage_orderInfo.deepClone(); + tradeList.set(i, trade2); + is_found = true; + } + } + + if (!is_found) { + TradeInfo trade2 = new TradeInfo(); + trade2 = (TradeInfo) tradeInfo.deepClone(); + trade2.trade_key = trade_key; + /** + * 对于原单有商品的订单,tradeInfo.null_code为true,但是拆分订单不一定每个商品都为空,所以在写入子订单时应该把trade2.null_code先改为false,如果 + * 子订单中有商品为空,那么下面在将该值改为true + */ + trade2.null_code = false; + /** + * 将仓库记入订单 + */ + trade2.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 记入子订单中商品总数量 + */ + trade2.num = delivery_storage_orderInfo.num; + /** + * 当商品为3:代发订单-全部代发商品,5:混合订单-品牌商代发商品时,拆分后的订单就是品牌商订单,但是obm_flag标志是代发订单 + */ + + if ("".equals(delivery_storage_orderInfo.commodity_code) && (order_type == 1 || order_type == 4)) { + trade2.null_code = true; + } + if ("".equals(delivery_storage_orderInfo.obm_commodity_code) + && (order_type == 2 || order_type == 3 || order_type == 5)) { + trade2.null_code = true; + } + /** + * 代发订单更新订单信息 + */ + if (order_type == 2) { + trade2.obm_company_code = delivery_storage_orderInfo.obm_company_code; + trade2.company_type = 3; + trade2.obm_flag = 0; + } + if (order_type == 3 || order_type == 5) { + trade2.obm_company_code = delivery_storage_orderInfo.obm_company_code; + trade2.company_type = 3; + trade2.obm_flag = 1; + } + + /** + * order_type==4上面将tradeInfo.obm_flag设为2-混合订单,此处拆开将obm_flag设为0-自发订单 + */ + if (order_type == 4 || order_type == 1) { + trade2.obm_flag = 0; + trade2.obm_company_code = ""; + } + trade2.orders = new OrderInfo[1]; + trade2.orders[0] = (OrderInfo) delivery_storage_orderInfo.deepClone(); + tradeList.add(trade2); + } + + return tradeList; + } + + private List recordTrade(List tradeList, TradeInfo temporaryTradeInfo, String trade_key) + throws Exception { + boolean is_found = false; + temporaryTradeInfo.trade_key = trade_key; + for (int i = 0; i < tradeList.size(); i++) { + TradeInfo trade2 = tradeList.get(i); + if (trade2.trade_key.equals(trade_key)) { + trade2.num = trade2.num + temporaryTradeInfo.num; + int ordersLength = trade2.orders.length; + trade2.orders = Arrays.copyOf(trade2.orders, trade2.orders.length + temporaryTradeInfo.orders.length); + System.arraycopy(temporaryTradeInfo.orders, 0, trade2.orders, ordersLength, + temporaryTradeInfo.orders.length); + tradeList.set(i, trade2); + is_found = true; + } + } + if (!is_found) { + tradeList.add(temporaryTradeInfo); + } + return tradeList; + } + + private HashMap> selectStorage(TradeInfo temporaryTradeInfo) throws Exception { + HashMap> commodity_map = temporaryTradeInfo.storage_map; + OrderInfo[] orders = temporaryTradeInfo.orders; + int count = 0; + // HashMap> storage_commodity = new + // HashMap>(); + for (Map.Entry> entry_commodity_codes : commodity_map.entrySet()) { + int temporary_count = 0; + String storage_key = entry_commodity_codes.getKey(); + ArrayList commodity_list = entry_commodity_codes.getValue(); + HashMap> temporary_storage_commodity = new HashMap>(); + for (int i = 0; i < commodity_list.size(); i++) { + Commodity c3 = commodity_list.get(i); + for (int j = 0; j < orders.length; j++) { + OrderInfo order4 = orders[j]; + if (order4.order_type == 1 || order4.order_type == 4) { + if (c3.flag && c3.commodity_code.equals(orders[j].commodity_code) + && c3.smart_allot_storage_join == 2) { + temporary_count++; + if (temporary_storage_commodity.containsKey(storage_key)) { + ArrayList list = temporary_storage_commodity.get(storage_key); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } else { + ArrayList list = new ArrayList(); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } + } + } + if (order4.order_type == 2 || order4.order_type == 3 || order4.order_type == 5) { + if (c3.flag && c3.commodity_code.equals(orders[j].obm_commodity_code) + && c3.smart_allot_storage_join == 2) { + temporary_count++; + if (temporary_storage_commodity.containsKey(storage_key)) { + ArrayList list = temporary_storage_commodity.get(storage_key); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } else { + ArrayList list = new ArrayList(); + list.add(c3); + temporary_storage_commodity.put(storage_key, list); + break; + } + } + } + } + } + if (temporary_count >= count) { + count = temporary_count; + commodity_map = temporary_storage_commodity; + } + } + return commodity_map; + } + + /** + * 生成订单单号 + * + * @param conn + * @param ps + * @param rs + * @param order_code + * @param platform_code 正常抓单线程传入的是平台编码,买家退货给卖家处理线程传入的值为退款单号 + * @param tid 正常抓单线程传入的是订单号,买家退货给卖家传入的值为快递单号 + * @return + */ + private String createOrderCode(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String order_code, + String platform_code, String tid) { + String sql = ""; + int seq = 0;// 流水号 + try { + String unique_index = platform_code + "_" + tid; + sql = "insert into tb_seq (platform_code) values (?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, unique_index); + if (ps.executeUpdate() == 0) { + return ""; + } + sql = "select id from tb_seq where platform_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, unique_index); + rs = ps.executeQuery(); + if (rs.next()) { + seq = rs.getInt("id"); + } + order_code = "XT" + order_code + seq; + return order_code; + } catch (SQLException e) { + logger.error(this, e); + return ""; + } catch (Exception e) { + logger.error(this, e); + return ""; + } + } + + /** + * + * @Title: setCommodityCode + * @Description: 设置商品的编码和类目 + * @author Lewis + * @param conn + * @param ps + * @param rs + * @param copyTradeInfo + * @param i tradeInfo中的orders序号 + * @param commodityCodeUnput2CacheFlag + * @throws Exception + */ + private void setCommodityCode(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + TradeInfo copyTradeInfo, int i, boolean commodityCodeUnput2CacheFlag) throws Exception { + String skuId = copyTradeInfo.orders[i].sku_id == null ? "" : copyTradeInfo.orders[i].sku_id; + Map map = getCommodityCodeBySkuId(conn, ps, rs, copyTradeInfo.shop_code, skuId); + if (map.size() == 0) { + copyTradeInfo.delFlag = true; + } else { + copyTradeInfo.orders[i].commodity_code = map.get("commodityCode"); + copyTradeInfo.orders[i].commodity_class = Integer.valueOf(map.get("commodityClass")); + commodityCodeUnput2CacheFlag = true; + } + } + + /** + * + * @Title: getCommodityCodeBySkuId + * @Description: 通过平台的skuId查询出commodityCode + * @author Lewis + * @return String 商品编码 + * @throws Exception + */ + private Map getCommodityCodeBySkuId(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + String shopCode, String skuId) throws Exception { + Map map = new HashMap(); + String sql = "SELECT " + "tcss.commodity_code,tc.class as commodityClass " + + "FROM tb_commodity_shop_sku tcss INNER JOIN tb_commodity tc " + "ON tcss.commodity_code=tc.code " + + "WHERE shop_code=? " + "AND item_id=?;"; + ps = conn.prepareStatement(sql); + ps.setString(1, shopCode); + ps.setString(2, skuId); + rs = ps.executeQuery(); + if (rs.next()) { + String commodityCode = rs.getString("commodity_code"); + int commodityClass = rs.getInt("commodityClass"); + map.put("commodityClass", String.valueOf(commodityClass)); + map.put("commodityCode", commodityCode); + } + return map; + } + + /** + * 智能分仓库存查询,temporaryTradeInfoList已经不为空 + * + * @throws Exception + */ + private List getSmartAllotAutoSplitStorageFound(String delivery_storage_company_code, + String storage_code, OrderInfo delivery_storage_orderInfo, List temporaryTradeInfoList, + String delivery_storage_commodity_code, int quantity, int commodity_quantity, int smart_allot_storage_join, + int order_count, TradeInfo copyTradeInfo) throws Exception { + String storage_key = delivery_storage_company_code + "_cs" + storage_code; + if (delivery_storage_orderInfo.order_type == 1 || delivery_storage_orderInfo.order_type == 2) { + if (temporaryTradeInfoList.size() > 0) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(0); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + boolean has_commodity = false; + int commodity_list_size = commodity_list.size(); + for (int i = 0; i < commodity_list_size; i++) { + Commodity c1 = commodity_list.get(i); + if (c1.commodity_code.equals(delivery_storage_commodity_code)) { + has_commodity = true; + c1.flag = c1.storage_commodity_quantity >= c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + if (order_count == 0) { + c1.order_commodity_quantity = c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + } + // c1.storage_commodity_quantity += quantity; + commodity_list.set(i, c1);// 重设c1的值 + if (order_count == 0) { + commodity_list.add(c1);// 对于重复的商品新增一个c1对象,表示commodity_list中的商品子条目数和copyTradeInfo中是一致的 + } + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + if (!has_commodity) { + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.storage_commodity_quantity = quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + /** + * 将copyTradeInfo.orders重置 + */ + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + if (delivery_storage_orderInfo.order_type == 4 || delivery_storage_orderInfo.order_type == 5 + || delivery_storage_orderInfo.order_type == 3) { + boolean has_company = false; + if (temporaryTradeInfoList.size() > 0) { + int temporaryTradeInfoListSize = temporaryTradeInfoList.size(); + for (int i = 0; i < temporaryTradeInfoListSize; i++) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + + String temporaryCompanyCode = ""; + if (temporaryTradeInfo.company_type == 2) { + temporaryCompanyCode = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.company_type == 3) { + temporaryCompanyCode = temporaryTradeInfo.obm_company_code; + } + if (temporaryCompanyCode.equals(delivery_storage_company_code)) { + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + + has_company = true; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + boolean has_commodity = false; + int commodity_list_size = commodity_list.size(); + for (int j = 0; j < commodity_list_size; j++) { + Commodity c1 = commodity_list.get(j); + if (c1.commodity_code.equals(delivery_storage_commodity_code)) { + has_commodity = true; + c1.flag = c1.storage_commodity_quantity >= c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + if (order_count == 0) { + c1.order_commodity_quantity = c1.order_commodity_quantity + + delivery_storage_orderInfo.num * commodity_quantity; + } + // c1.storage_commodity_quantity += + // quantity; + commodity_list.set(j, c1);// 重设c1的值 + if (order_count == 0) { + commodity_list.add(c1);// 对于重复的商品新增一个c1对象,表示commodity_list中的商品自条目数和copyTradeInfo中是一致的 + } + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + if (!has_commodity) { + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + /** + * 如果没有这个仓库,则新增 + */ + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + } + } + /** + * 如果没找到这家公司或者temporaryTradeInfoList是初始化状态,则新增 + */ + if (!has_company || temporaryTradeInfoList.isEmpty()) { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + + temporaryTradeInfo.obm_company_code = "";// 初始化obm_company_code + temporaryTradeInfo.obm_flag = 0; + temporaryTradeInfo.company_type = 2; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 如果是order_type == 5的子条目,需要更新obm_company_code + */ + if (delivery_storage_orderInfo.order_type == 5 || delivery_storage_orderInfo.order_type == 3) { + temporaryTradeInfo.obm_company_code = delivery_storage_company_code; + temporaryTradeInfo.obm_flag = 1; + temporaryTradeInfo.company_type = 3; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + } + + /** + * 对于order_type == 4或者order_type == 5的条目都要清空orders, + * 并将delivery_storage_orderInfo写入orders,orders从copyTradeInfo拷贝过来是有值的,所以要缩容至1 + * 以写入delivery_storage_orderInfo + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num * commodity_quantity; + c1.flag = quantity >= c1.order_commodity_quantity; + c1.smart_allot_storage_join = smart_allot_storage_join; + c1.storage_commodity_quantity = quantity; + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + return temporaryTradeInfoList; + } + + /** + * 智能分仓库存查询,temporaryTradeInfoList为空 + * + * @throws Exception + */ + private List getSmartAllotAutoSplitStorageNotFound(String delivery_storage_company_code, + OrderInfo delivery_storage_orderInfo, List temporaryTradeInfoList, + String delivery_storage_commodity_code, int commodity_quantity, int order_count, TradeInfo copyTradeInfo) + throws Exception { + + /** + * 未查询到商品库存的商品不再写入tradelist,包括未查到库存或者空编码商品,并且发货仓库为默认仓库, + * 其中商品为空的情况,将tradeInfo.null_code改为true + */ + + String storage_key = delivery_storage_company_code + "_cs" + delivery_storage_orderInfo.storage_code; + if (delivery_storage_orderInfo.order_type == 1 || delivery_storage_orderInfo.order_type == 2) { + if (temporaryTradeInfoList.size() > 0) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(0); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 如果这个map已经包含了这个商品说明这个订单中有两个相同的商品但是在不同的tradeInfo.orders 一般平台不会出现此种情况,属于特殊处理的情况 + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } else { + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + if (order_count == 0) { + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } else { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.storage_commodity_quantity = 0; + c1.flag = false; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + /** + * 将copyTradeInfo.orders重置 + */ + + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + if (delivery_storage_orderInfo.order_type == 4 || delivery_storage_orderInfo.order_type == 5 + || delivery_storage_orderInfo.order_type == 3) { + boolean has_company = false; + if (temporaryTradeInfoList.size() > 0) { + int temporaryTradeInfoListSize = temporaryTradeInfoList.size(); + for (int i = 0; i < temporaryTradeInfoListSize; i++) { + TradeInfo temporaryTradeInfo = temporaryTradeInfoList.get(i); + + String temporaryCompanyCode = ""; + if (temporaryTradeInfo.company_type == 2) { + temporaryCompanyCode = temporaryTradeInfo.company_code; + } + if (temporaryTradeInfo.company_type == 3) { + temporaryCompanyCode = temporaryTradeInfo.obm_company_code; + } + if (temporaryCompanyCode.equals(delivery_storage_company_code)) { + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + + has_company = true; + if (temporaryTradeInfo.storage_map.containsKey(storage_key)) { + ArrayList commodity_list = temporaryTradeInfo.storage_map.get(storage_key); + /** + * 查不到库存的商品可能是没有库存,或者是为空编码商品 + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } else { + /** + * 如果没有这个仓库,则新增 + */ + ArrayList commodity_list = new ArrayList(); + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.smart_allot_storage_join = 0; + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, + temporaryTradeInfo.orders.length + 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length + - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.num += delivery_storage_orderInfo.num; + } + } + } + } + /** + * 如果没找到这家公司或者temporaryTradeInfoList是初始化状态,则新增 + */ + if (!has_company || temporaryTradeInfoList.isEmpty()) { + TradeInfo temporaryTradeInfo = new TradeInfo(); + temporaryTradeInfo = (TradeInfo) copyTradeInfo.deepClone(); + /** + * 编码为空的商品,null_code为true + */ + if ("".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = true; + } + /** + * 将订单的null_code标志重置,当有空商品时改变其值,当第一个子条目添加时,如果商品为空,那么原单已经将null_code写为空了 + * 所以当该子条目不为空时,要将null_code重置为false + */ + if (!"".equals(delivery_storage_commodity_code)) { + temporaryTradeInfo.null_code = false; + } + temporaryTradeInfo.obm_company_code = "";// 初始化obm_company_code + temporaryTradeInfo.obm_flag = 0; + temporaryTradeInfo.company_type = 2; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + /** + * 如果是order_type == 5的子条目,需要更新obm_company_code + */ + if (delivery_storage_orderInfo.order_type == 5 || delivery_storage_orderInfo.order_type == 3) { + temporaryTradeInfo.obm_company_code = delivery_storage_company_code; + temporaryTradeInfo.obm_flag = 1; + temporaryTradeInfo.company_type = 3; + temporaryTradeInfo.storage_code = delivery_storage_orderInfo.storage_code; + } + /** + * 对于order_type == 4或者order_type == 5的条目都要清空orders, + * 并将delivery_storage_orderInfo写入orders,orders从copyTradeInfo拷贝过来是有值的,所以要缩容至1 + * 以写入delivery_storage_orderInfo + */ + Commodity c1 = new Commodity(); + c1.commodity_code = delivery_storage_commodity_code; + c1.flag = false; + c1.storage_commodity_quantity = 0; + c1.order_commodity_quantity = delivery_storage_orderInfo.num; + c1.smart_allot_storage_join = 0; + temporaryTradeInfo.orders = Arrays.copyOf(temporaryTradeInfo.orders, 1); + temporaryTradeInfo.orders[temporaryTradeInfo.orders.length - 1] = delivery_storage_orderInfo; + temporaryTradeInfo.storage_map = new HashMap>(); + ArrayList commodity_list = new ArrayList(); + commodity_list.add(c1); + temporaryTradeInfo.storage_map.put(storage_key, commodity_list); + temporaryTradeInfo.num = delivery_storage_orderInfo.num; + temporaryTradeInfoList.add(temporaryTradeInfo); + } + } + return temporaryTradeInfoList; + } + + /** + * @param str + * @return commodity + * @title: getCommodityInfo + * @description: 解析从数据库中拿到的商品信息 + */ + private Map getCommodityInfo(String str) throws Exception { + boolean hasComma = str.contains(","); + boolean hasVerticalLine = str.contains("|"); + Map commodity = new HashMap(); + if (hasComma) {// 包含逗号,商品有多个种类 + String[] code = str.split(","); + for (int i = 0; i < code.length; i++) { + if (hasVerticalLine) {// 有竖线,数据正常 + String[] commodityStr = code[i].split("\\|"); + commodity.put(commodityStr[0], commodityStr[1]); + } else {// 无竖线,数据异常 + logger.info("活动规则未指定赠品或赠品信息异常!"); + } + } + return commodity; + } else {// 不包含逗号,商品只有一种或数据异常 + if (hasVerticalLine) {// 有竖线,只有一个商品 + String[] commodityStr = str.split("\\|"); + commodity.put(commodityStr[0], commodityStr[1]); + } else {// 无竖线,数据异常 + logger.info("活动规则未指定赠品或赠品信息异常!"); + } + return commodity; + } + } + + /** + * 活动数量更新线程 + * + * @author Lewis + */ + private class ActivityUpdateThread extends Thread { + @Override + public void run() { + try { + if (activityUpdateQueue.size() > 0) { + GiftNum gn = activityUpdateQueue.get(0); + if (activityUpdate(gn)) { + activityUpdateQueue.remove(0); + } + + logger.info("待更新赠品数量队列总数: [ {} ] ", activityUpdateQueue.size()); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + + private synchronized boolean activityUpdate(GiftNum gn) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + if (gn.type == 1) { + String sql = "update tb_gift_activity_rule set order_current =? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.order_current); + ps.setString(2, gn.rule_code); + } else if (gn.type == 2) { + String sql = "update tb_gift_activity_rule set gift_current =? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.gift_current); + ps.setString(2, gn.rule_code); + } else { + String sql = "update tb_gift_activity_rule set order_current =?,gift_current=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, gn.order_current); + ps.setInt(2, gn.gift_current); + ps.setString(3, gn.rule_code); + } + if (ps.executeUpdate() == 0) { + return false; + } + logger.info("赠品数量更新数据库成功:{},{},{},{}", gn.rule_code, gn.type, gn.order_current, gn.gift_current); + return true; + } catch (SQLException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + } + + /** + * 异常订单处理线程 + * + * @author Lewis + */ + private class ExceptionTradeQueueThread extends Thread { + @Override + public void run() { + try { + logger.info("新订单待写库异常队列总数: [ {} ] ", exceptionTradeQueue.size()); + // 新订单及修改备注消息 + while (exceptionTradeQueue.size() > 0) { + TradeInfo tradeInfo = exceptionTradeQueue.get(0); + tradeQueue.add(tradeInfo); + exceptionTradeQueue.remove(0); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + + } + + private String base64Encode(String text) throws Exception { + Base64.Encoder encoder = Base64.getEncoder(); + byte[] textByte = text.getBytes("UTF-8"); + text = encoder.encodeToString(textByte); + return text; + } +} diff --git a/src/com/since/emp/service/OrderSync.java b/src/com/since/emp/service/OrderSync.java new file mode 100644 index 0000000..98209ac --- /dev/null +++ b/src/com/since/emp/service/OrderSync.java @@ -0,0 +1,425 @@ +package com.since.emp.service; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.since.emp.newplatform.service.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.queue.order.CheckTradeQueueThread; + +public class OrderSync extends OrderSyncs { + private static final Logger logger = LogManager.getLogger(OrderSync.class); + private static String config_filename = "config_all.ini"; + private static String storageUpdateTime;// 库存同步更新间隔时间(分钟) + private static String coverage;// 抓单统一回退时间,若有值,则统一按此时间,若无值,则按数据库设置的初始化时间 + private static String stopStartTime;// 定时同步停止同步的起始时间 + private static String stopEndTime;// 定时同步停止同步的结束时间 + private static String accessKeyId;// 京东虎符鼎外APPKEY + private static String secretKey;// 京东虎符鼎外APPSERCET + private static String endpoint;// 京东虎符调用地址 + private static String customerId;// 京东虎符客户编号 + + private static ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private static ScheduledThreadPoolExecutor scheduledThreadPool; + + /** + * main + * + * @param args + */ + public static void main(String[] args) { + + recatchConfig = new RecatchConfig();// 平台补抓单 + provinceDic();// 自动登记售后参数 + + // 读取文件配置 + if (!initFileConfig()) { + logger.info("[ 初始化 ] 文件读取配置失败,时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return; + } + logger.info("[ 初始化 ] 文件读取配置成功,时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.error("[ 初始化 ] 数据库读取配置失败,时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.error(OrderSync.class, e); + return; + } + logger.info("[ 初始化 ] 数据库读取配置成功,时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + if (storageUpdateTime == null || "".equals(storageUpdateTime)) { + logger.info("[ 初始化 ] storageUpdateTime为空,请确认已填写!时间->{}", + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, stopStartTime, stopEndTime); + storageUpdate.start(); + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + submitLog = new SubmitLog(); + submitLog.start(); + + refundOrderHandler = new RefundOrderHandler(); + refundOrderHandler.start(); + + //检查新单写入队列是否积压订单,启动后2分钟开始执行,循环周期为1分钟 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + CheckTradeQueueThread ctqt = new CheckTradeQueueThread(); + scheduledThreadPool.scheduleAtFixedRate(ctqt, 2 * 60 * 1000, 1 * 60 * 1000, TimeUnit.MILLISECONDS); + + threadPool = ThreadPool.getInstance(); + // 初始化各平台API类 + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig platConfig = new PlatConfig();// 平台参数实例 + platConfig = config.plats.get(i);// 获取所有平台的的参数 + + if (platConfig.plat_code.equals("002")) { + for (int j = 0; j < platConfig.apps.size(); j++) { + apiTmall = new ApiTmall(platConfig.api_url, platConfig.tmc_url, platConfig.apps.get(j).key, + platConfig.apps.get(j).secret, platConfig.apps.get(j).shops, recatchConfig); + apiTmall.start(); + logger.info("[初始化] [ {} ] app:[ {} ] 启动时间->{} ", platConfig.plat_code, platConfig.apps.get(j).key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + platConfig.apps.get(j).startFlag = true; + } + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + TmallShopMsgUpdate tsmu = new OrderSync().new TmallShopMsgUpdate(platConfig); + scheduledThreadPool.scheduleAtFixedRate(tsmu, 1000, 5 * 60000, TimeUnit.MILLISECONDS); + // timer.schedule(tsmu, 1000, 5 * 60000); + + // } else if (platConfig.plat_code.equals("004")) { + // apiYhd = new ApiYhd(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("006")) { + // apiGome = new ApiGome(platConfig, recatchConfig); + apiGomeNew = new ApiGomeNew(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("005")) { + // apiDangdang = new ApiDangdang(platConfig, recatchConfig); + apiDangDangNew = new ApiDangDangNew(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("003")) { + apiJingdong = new ApiJingdongNew(platConfig, recatchConfig, accessKeyId, secretKey, endpoint, + customerId); + } else if (platConfig.plat_code.equals("011")) { + // apiYouzan = new ApiYouzan(platConfig, recatchConfig); + apiYouZanNew = new ApiYouZanNew(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("014")) { + // apiPinduoduo = new ApiPinduoduo(platConfig, recatchConfig); +// apiPinDuoDuoNew = new ApiPinDuoDuoNew(platConfig, recatchConfig); + ApiPinDuoDuoThirdEdition apiPinDuoDuoThirdEdition = new ApiPinDuoDuoThirdEdition(platConfig, + recatchConfig); + } else if (platConfig.plat_code.equals("015")) { + apiVip = new ApiVip(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("017")) { + // apiWeimob = new ApiWeimob(platConfig, recatchConfig); + apiWeiMobNew = new ApiWeiMobNew(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("018")) { + apiPingan = new ApiPingan(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("019")) { + apiMia = new ApiMia(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("020")) { + // apiYitiao = new ApiYitiao(platConfig, recatchConfig); + apiYiTiaoNew = new ApiYiTiaoNew(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("021")) { + // apiXiaoHongShu = new ApiXiaoHongShu(platConfig, recatchConfig); + apiXiaoHongShuNewThirdEdition = new ApiXiaoHongShuNewThirdEdition(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("022")) { + apiMiHeMall = new ApiMiHeMall(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("023")) { + apiDouDian = new ApiDouDian(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("024")) { + apiKtt = new ApiKtt(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("025")) { + apiKuaiShou = new ApiKuaiShou(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("026")) { + apiQunJieLong = new ApiQunJieLong(platConfig, recatchConfig); + } else if (platConfig.plat_code.equals("027")) { + apiWeiDianFirst = new ApiWeiDianFirst(platConfig, recatchConfig); + } + } + + } + + /** + * @className:TmallShopMsgUpdate + * @description:天猫商城消息更新线程 + * @author:Lewis + * @date:2019年8月6日 上午10:34:11 + */ + private class TmallShopMsgUpdate extends Thread { + PlatConfig platConfig; + + public TmallShopMsgUpdate(PlatConfig platConfig) { + this.platConfig = platConfig; + } + + @Override + public void run() { + platConfig = getAppMessage(platConfig); + for (int i = 0; i < platConfig.apps.size(); i++) { + + if (!platConfig.apps.get(i).startFlag) { + AppConfig appConfig = new AppConfig(); + appConfig = platConfig.apps.get(i); + apiTmall = new ApiTmall(platConfig.api_url, platConfig.tmc_url, appConfig.key, appConfig.secret, + appConfig.shops, recatchConfig); + apiTmall.start(); + logger.info("[ 初始化 ] {} app: {} 启动时间->{}", platConfig.plat_code, appConfig.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + platConfig.apps.get(i).startFlag = true;// 启动该app标记为已启动 + } + } + } + } + + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + coverage = iniReader.getValue("coverTime", "coverage"); + stopStartTime = iniReader.getValue("storageUpdateTime", "stopStartTime"); + stopEndTime = iniReader.getValue("storageUpdateTime", "stopEndTime"); + accessKeyId = iniReader.getValue("hufu", "accessKeyId"); + secretKey = iniReader.getValue("hufu", "secretKey"); + endpoint = iniReader.getValue("hufu", "endpoint"); + customerId = iniReader.getValue("hufu", "customerId"); + + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = Collections.synchronizedList(new ArrayList()); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_code = plat_array[i]; + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + // pc.api_url2 = iniReader.getValue(plat_array[i], "api_url2"); + pc.agent_api_ip = iniReader.getValue(plat_array[i], "agent_api_ip"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.apps = Collections.synchronizedList(new ArrayList()); + pc.updateTokenList = Collections.synchronizedList(new ArrayList()); + config.plats.add(pc); + } + + res = true; + } catch (IOException e) { + logger.error(OrderSync.class, e); + } catch (Exception e) { + logger.error(OrderSync.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + // Connection conn = dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + Statement statement = null; + ResultSet rs = null; + try { + conn = dbpc.getConnection(); + if (config.plats.size() < 1) { + return false; + } + statement = conn.createStatement(); + StringBuffer sql = new StringBuffer().append( + "select c.platform_code,c.code as app_code,a.pay_percent,a.order_sync_lock_flag,a.order_sync_lock_keyword," + + "c.key as app_key," + "c.secret as app_secret,a.company_code as shop_company_code," + + "a.code as shop_code,a.auto_cancel_aftersale_flag,a.auto_update_address_flag," + + "a.delivery_mode_id,a.delivery_area_setting,a.refresh_token,a.expires_time,b.expire_time as endTime," + + "a.platform_code as platformCode,a.del_flag,a.auth_flag,a.order_sync_flag,a.init_time,a.order_sync_modify_time,a.auto_aftersale_flag as auto_aftersale_flag," + + "a.platform_account as shop_name,a.session_key as shop_session_key,a.storage_code,e.type as company_type " + + "from tb_shop a, tb_platform_app c,tb_company_role_relation b,tb_role d,tb_company e " + + "where a.del_flag = 1 and a.app_code = c.code and c.del_flag = 1 and a.company_code=b.company_code and b.role_code=d.code and d.type=1 " + + "and a.app_code = c.code and a.company_code=e.code and a.platform_code in ("); + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig pConfig = new PlatConfig(); + pConfig = config.plats.get(i); + if (i < config.plats.size() - 1) { + sql.append(pConfig.plat_code + ","); + } else { + sql.append(pConfig.plat_code + ")"); + } + } + sql.append(" order by order_sync_modify_time asc"); + rs = statement.executeQuery(sql.toString()); + while (rs.next()) { + // 先判断app是否存在 + String app_code = rs.getString("app_code"); + String platformCode = rs.getString("platformCode"); + String realPlatformCode = platformCode; + String endTime = rs.getString("endTime"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + long endTimeLong = sdf.parse(endTime).getTime(); + long timeNow = System.currentTimeMillis(); + if (timeNow - endTimeLong >= 7 * 24 * 60 * 60 * 1000) { + continue; + } + if ("001".equals(platformCode) || "012".equals(platformCode)) { + platformCode = "002"; + } + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig pc = new PlatConfig(); + pc = config.plats.get(i); + if (pc.plat_code.equals(platformCode)) { + pc.order_sync_modify_time = rs.getString("order_sync_modify_time"); + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.del_flag = rs.getInt("del_flag"); + shopConfig.pay_percent = rs.getDouble("pay_percent"); + shopConfig.auth_flag = rs.getInt("auth_flag"); + shopConfig.order_sync_flag = rs.getInt("order_sync_flag"); + shopConfig.company_type = rs.getInt("company_type"); + shopConfig.auto_aftersale_flag = rs.getInt("auto_aftersale_flag"); + shopConfig.auto_cancel_aftersale_flag = rs.getInt("auto_cancel_aftersale_flag"); + shopConfig.auto_update_address_flag = rs.getInt("auto_update_address_flag"); + shopConfig.order_sync_lock_flag = rs.getInt("order_sync_lock_flag"); + shopConfig.order_sync_lock_keyword = rs.getString("order_sync_lock_keyword") == null ? "" + : rs.getString("order_sync_lock_keyword"); + if ("".equals(coverage)) { + shopConfig.init_time = rs.getInt("init_time"); + } else { + Pattern pattern = Pattern.compile("[0-9]*"); + Matcher isNum = pattern.matcher(coverage); + if (!isNum.matches()) { + shopConfig.init_time = rs.getInt("init_time"); + } else { + shopConfig.init_time = Integer.valueOf(coverage) * 60; + } + } + + shopConfig.storage_code = rs.getString("storage_code") == null ? "" + : rs.getString("storage_code"); + shopConfig.delivery_mode_id = rs.getString("delivery_mode_id") == null ? 2 + : rs.getInt("delivery_mode_id"); + shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" + : rs.getString("delivery_area_setting"); + shopConfig.realPlatformCode = realPlatformCode; + shopConfig.platformCode = platformCode; + if ((shopConfig.del_flag == 1) && (shopConfig.auth_flag == 2) + && (shopConfig.order_sync_flag == 2)) { + for (int j = 0; j < pc.apps.size(); j++) { + AppConfig app_config = pc.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + logger.info("只添加店铺 [ {} ] | [ {} ] 时间->{} ", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = Collections.synchronizedList(new ArrayList()); + appConfig.shops.add(shopConfig); + pc.apps.add(appConfig); + } + } + + // 获取自动更新sessionkey的所需信息 + int del_flag = shopConfig.del_flag; + int auth_flag = shopConfig.auth_flag; + String refresh_token = rs.getString("refresh_token"); + String expires_time = rs.getString("expires_time"); + if (del_flag == 1 && auth_flag == 2 && (refresh_token != null && !"".equals(refresh_token) + && (expires_time != null && !"".equals(expires_time)))) { + UpdateMessage um = new UpdateMessage(); + um.app_key = rs.getString("app_key"); + um.app_secret = rs.getString("app_secret"); + um.refresh_token = refresh_token; + um.expires_time = expires_time; + um.shop_name = rs.getString("shop_name"); + um.shop_code = rs.getString("shop_code"); + pc.updateTokenList.add(um); + } + break; + } + } + + } + res = true; + } catch (Exception e) { + logger.error(OrderSync.class, e); + logger.info("{} 时间->{}", e.toString(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(OrderSync.class, e); + } catch (Exception e) { + logger.error(OrderSync.class, e); + } + rs = null; + } + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(OrderSync.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(OrderSync.class, e); + } + conn = null; + } + dbpc = null; + } + return res; + } +} diff --git a/src/com/since/emp/service/OrderSyncs.java b/src/com/since/emp/service/OrderSyncs.java new file mode 100644 index 0000000..4399df1 --- /dev/null +++ b/src/com/since/emp/service/OrderSyncs.java @@ -0,0 +1,907 @@ +package com.since.emp.service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.net.InetSocketAddress; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import com.since.emp.newplatform.service.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.analysis.AnalysisDataParse; +import com.since.emp.analysis.HandlerRecord; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.RecatchConfig; + +import net.spy.memcached.MemcachedClient; + +/** + * OrderSync 订单同步主类 + * + * @author jue 读取各类配置参数,启动各平台抓单线程 + */ +public class OrderSyncs { + private static Logger logger;// 日志 + public static DataParse dataParse;// 数据解析 + public static SubmitLog submitLog; + public static RefundOrderHandler refundOrderHandler; + public static AnalysisDataParse analysisDataParse; + public static HandlerRecord handlerRecord; + public static ApiTmall apiTmall;// 天猫api接口类 + public static ApiJingdongNew apiJingdong;// 京东api接口类 + public static ApiVip apiVip;// 拼多多接口类 + public static ApiPingan apiPingan;// 平安接口类 + public static ApiMia apiMia;// 蜜芽接口类 + public static ApiMiHeMall apiMiHeMall;// 软维微商城接口类 + public static ApiYiTiaoNew apiYiTiaoNew;// 蜜芽接口类 + public static ApiDangDangNew apiDangDangNew;// 当当api接口类 + public static ApiGomeNew apiGomeNew;// 国美api接口类 + public static ApiPinDuoDuoNew apiPinDuoDuoNew;// 拼多多接口类 + public static ApiWeiMobNew apiWeiMobNew;// 微盟接口类 + public static ApiXiaoHongShuNew apiXiaoHongShuNew;// 蜜芽接口类 + public static ApiXiaoHongShuNewThirdEdition apiXiaoHongShuNewThirdEdition;// 小红书最新 + public static ApiYouZanNew apiYouZanNew;// 有赞api接口类 + public static ApiDouDianNew_Deprecated apiDouDianNew;// 抖音店铺api接口类 + public static ApiKtt apiKtt;//快团团店铺api接口类 + public static ApiDouDian apiDouDian;//抖店铺api接口类 + public static ApiQunJieLong apiQunJieLong;//群接龙店铺api接口类 + //群接龙店铺api接口类 + public static ApiKuaiShou apiKuaiShou; + + public static ApiWeiDianFirst apiWeiDianFirst; + + public static StorageUpdate storageUpdate;// 仓库更新 + public static List stateDic; + static { + ConfigurationSource source; + String relativePath = "log4j2.properties"; + // String filePath = CONFIG_PATH + System.getProperty("file.separator") + + // relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(OrderSyncs.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * app参数类 + */ + public static class AppConfig implements Serializable { + public String code;// EMP内部APP编号 + public String key; // 平台key + public String secret;// 平台密钥 + public List shops;// + public boolean startFlag;// 用于天猫判断该app是否已启动 + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } + } + + /* *//** + * 综合参数类 + *//* + * public static class Config { public String db_host; public String db_port; + * public String db_name; public String db_user; public String db_password; + * public String globe_plats; public List plats; } + */ + + /** + * 平台参数类 + */ + public static class PlatConfig implements Serializable { + // 平台名字 + public String plat_name; + // 平台编号 + public String plat_code; + + public String api_url;// 平台URL + public String api_url2;// 平台URL + public String tmc_url; + public String agent_api_ip;// 京东代理抓单的ip + public String init_time; + public List apps; + public List updateTokenList; + public String order_sync_modify_time; + + @Override + public String toString() { + return "PlatConfig [plat_name=" + plat_name + ", plat_code=" + plat_code + ", api_url=" + api_url + + ", api_url2=" + api_url2 + ", tmc_url=" + tmc_url + ", agent_api_ip=" + agent_api_ip + + ", init_time=" + init_time + ", apps=" + apps + ", updateTokenList=" + updateTokenList + + ", order_sync_modify_time=" + order_sync_modify_time + "]"; + } + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } + } + + /** + * 店铺参数类 + */ + public static class ShopConfig implements Serializable { + + public String code;// 店铺编码 + public String name;// 店铺平台名称 + public String session_key;// 店铺授权码 + public String company_code;// 店铺所属公司编码 + public String brand;// 店铺所售商品品牌 + public int delivery_mode_id;// 店铺快递Id + public String platformCode;// 店铺所属平台编码 + public String realPlatformCode;//真实的店铺所属平台编码,区别上面的platformCode在001,012两个平台会修改为002 + public int del_flag;// 店铺在数据库删除标志 + public int auth_flag;// 店铺授权标志 + public int order_sync_flag;// 店铺抓单标志 + public int init_time;// 初始抓单回退时间(分钟) + public String lastCatchTime;// 上次抓单的开始时间 + public boolean errFlag;// 抓单错误信息标示 + public String storage_code;// 店铺默认发货仓库 + public String lastQueryRefundTime;// 抓取退款订单记录时间 + public boolean refundErrFlag;// 抓取退款订单记录API相关错误 + public int company_type;// 企业类型,1:平台管理公司,2:普通用户公司 3:品牌商公司 + public String delivery_area_setting;// 分区配送快递设置 + public int auto_aftersale_flag;// 自动售后登记 1:不是 , 2:是 + public int auto_cancel_aftersale_flag;// 自动撤销售后 1:不是,2:是 + public int auto_update_address_flag;// 自动改地址 1:不是,2:是 + public double pay_percent;// 计提应付百分比 + public int order_sync_lock_flag;//抓单锁定 1:关,2:开 + public String order_sync_lock_keyword;//抓单锁定商品标题关键字 + + @Override + public String toString() { + return "ShopConfig [code=" + code + ", name=" + name + ", session_key=" + session_key + ", company_code=" + + company_code + ", brand=" + brand + ", delivery_mode_id=" + delivery_mode_id + ", platformCode=" + + platformCode + ", del_flag=" + del_flag + ", auth_flag=" + auth_flag + ", order_sync_flag=" + + order_sync_flag + ", init_time=" + init_time + ", lastCatchTime=" + lastCatchTime + ", errFlag=" + + errFlag + ", storage_code=" + storage_code + ", lastQueryRefundTime=" + lastQueryRefundTime + + ", refundErrFlag=" + refundErrFlag + ", company_type=" + company_type + ", delivery_area_setting=" + + delivery_area_setting + ", auto_aftersale_flag=" + auto_aftersale_flag + + ", auto_cancel_aftersale_flag=" + auto_cancel_aftersale_flag + ", auto_update_address_flag=" + + auto_update_address_flag + ", pay_percent=" + pay_percent + "]"; + } + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } + } + + /* *//** + * 平台补抓单参数类 天猫,一号店,国美,当当 + *//* + * public static class RecatchConfig { public String starTime; public String + * endTime; public String orderId; public String shop_code; public String + * platform_code; public String real_platform_code; public String shopCodes; + * public String hour; public String minute; public String platform_account; + * public int type;//默认值0:抓单程序或者后台补抓单,1:按单号补抓,2:导入文件,3:按时间段补抓 public String + * replenish_code;//补抓条目编号 } + */ + + /** + * 自动刷新sessionkey参数类 + * + * @author Lewis + * + */ + public static class UpdateMessage implements Serializable { + private static final long serialVersionUID = 3660613784163224918L; + public String app_key; + public String app_secret; + public String refresh_token; + public String expires_time; + public String shop_name; + public String shop_code; + + /** + * 串行化为了实现对于tradeInfo的深拷贝,对于object的clone()方式对于tradeInfo下面的orderInfo为浅拷贝,因此选用串行化方式实现深拷贝 + * + * @return + * @throws Exception + */ + public Object deepClone() throws Exception { + // save the object to a byte array + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(this); + out.close(); + + // read a clone of the object from byte array + ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bin); + Object ret = in.readObject(); + in.close(); + + return ret; + } + } + + /* + *//** + * 自动登记售后参数类 + * + * @author Lewis + * + *//* + * public static class RefundInfo { String tid; String refund_id; String + * bill_type; String reason; String shop_code; String company_code; int + * company_type; String desc; String return_delivery_code; } + */ + + public static void provinceDic() { + stateDic = Collections.synchronizedList(new ArrayList()); + stateDic.add(new Dic(2, "黑龙江")); + stateDic.add(new Dic(2, "吉林")); + stateDic.add(new Dic(2, "辽宁")); + stateDic.add(new Dic(2, "河北")); + stateDic.add(new Dic(2, "河南")); + stateDic.add(new Dic(2, "山西")); + stateDic.add(new Dic(2, "山东")); + stateDic.add(new Dic(2, "陕西")); + stateDic.add(new Dic(2, "甘肃")); + stateDic.add(new Dic(2, "四川")); + stateDic.add(new Dic(2, "湖北")); + stateDic.add(new Dic(2, "湖南")); + stateDic.add(new Dic(2, "贵州")); + stateDic.add(new Dic(2, "云南")); + stateDic.add(new Dic(2, "江苏")); + stateDic.add(new Dic(2, "安徽")); + stateDic.add(new Dic(2, "浙江")); + stateDic.add(new Dic(2, "江西")); + stateDic.add(new Dic(2, "福建")); + stateDic.add(new Dic(2, "广东")); + stateDic.add(new Dic(2, "青海")); + stateDic.add(new Dic(2, "海南")); + stateDic.add(new Dic(3, "内蒙古")); + stateDic.add(new Dic(3, "西藏")); + stateDic.add(new Dic(4, "宁夏")); + stateDic.add(new Dic(5, "新疆")); + stateDic.add(new Dic(6, "广西")); + } + + public static class Dic { + int code; + String name; + + public Dic(int code, String name) { + this.code = code; + this.name = name; + } + } + + public synchronized static int getDicCode(List dics, String name) { + for (int i = 0; i < dics.size(); i++) { + Dic dic = dics.get(i); + if (name.equals(dic.name)) { + return dic.code; + } + } + return -1; + } + + public static ShopConfig shopConfig; + public static PlatConfig platConfig; + public static Config config; + public static AppConfig appConfig; + public static RecatchConfig recatchConfig; + + /** + * 获取平台信息 + * + * @param platConfig + * @return + */ + public synchronized static PlatConfig getAppMessage(PlatConfig platConfig) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return platConfig; + // } + try { + conn = dbpc.getConnection(); + // token非增量更新,先清除updateTokenList + platConfig.updateTokenList.clear(); + String order_sync_modify_time = platConfig.order_sync_modify_time == null ? "1970-01-01 00:00:00" + : platConfig.order_sync_modify_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + long order_sync_modify_or = sdf.parse(order_sync_modify_time).getTime(); + // String sql = "select a.company_code as shop_company_code,a.code + // as shop_code,a.app_code,a.storage_code, " + // + "a.delivery_mode_id,a.platform_code as + // platformCode,a.del_flag,a.auth_flag,a.refresh_token,a.expires_time," + // + + // "a.order_sync_flag,a.init_time,a.order_sync_modify_time,a.platform_account + // as shop_name,a.session_key as shop_session_key," + // + "c.key as app_key,c.secret as app_secret" + // + " from tb_shop a,tb_platform_app c" + // + " where a.platform_code=c.platform_code and a.app_code = c.code + // and c.del_flag = 1 and a.platform_code='"+platConfig.plat_code+"' + // " + // + " and + // a.order_sync_modify_time>'"+platConfig.order_sync_modify_time+"' + // order by a.order_sync_modify_time"; + // + " and a.order_sync_modify_time is not null order by + // a.order_sync_modify_time"; + String platform_code = platConfig.plat_code; + /* + * ps = conn.prepareStatement("select * from tb_shop where name='京东'"); rs = + * ps.executeQuery(); + */ + String sql = ""; + if ("002".equals(platform_code)) { + sql = "select a.company_code as shop_company_code,a.code as shop_code,a.delivery_area_setting,a.app_code,a.storage_code,a.delivery_mode_id,a.platform_code as platformCode,a.del_flag,a.auth_flag,a.refresh_token,a.expires_time,a.order_sync_flag,a.init_time,a.order_sync_modify_time,a.platform_account as shop_name,a.session_key as shop_session_key,c.key as app_key,c.secret as app_secret,b.expire_time as endTime,a.platform_account,e.type as company_type,a.auto_aftersale_flag as auto_aftersale_flag,a.auto_cancel_aftersale_flag,a.auto_update_address_flag,a.pay_percent,a.order_sync_lock_flag,a.order_sync_lock_keyword " + + "from tb_shop a left join tb_platform_app c on a.app_code = c.code ,tb_company_role_relation b,tb_role d,tb_company e " + + "where a.platform_code in(001,002,012) and a.order_sync_modify_time is not null and a.company_code=e.code and a.company_code=b.company_code and b.role_code=d.code and d.type=1 " + + "order by a.order_sync_modify_time"; + } else { + sql = "select a.company_code as shop_company_code,a.code as shop_code,a.delivery_area_setting,a.app_code,a.storage_code,a.delivery_mode_id,a.platform_code as platformCode,a.del_flag,a.auth_flag,a.refresh_token,a.expires_time,a.order_sync_flag,a.init_time,a.order_sync_modify_time,a.platform_account as shop_name,a.session_key as shop_session_key,c.key as app_key,c.secret as app_secret,b.expire_time as endTime,a.platform_account,e.type as company_type,a.auto_aftersale_flag as auto_aftersale_flag,a.auto_cancel_aftersale_flag,a.auto_update_address_flag,a.pay_percent,a.order_sync_lock_flag,a.order_sync_lock_keyword " + + "from tb_shop a left join tb_platform_app c on a.app_code = c.code ,tb_company_role_relation b,tb_role d,tb_company e " + + "where a.platform_code = '" + platConfig.plat_code + + "' and a.order_sync_modify_time is not null and a.company_code=e.code and a.company_code=b.company_code and b.role_code=d.code and d.type=1 " + + "order by a.order_sync_modify_time"; + } + + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + + while (rs.next()) { + platConfig.order_sync_modify_time = rs.getString("order_sync_modify_time") == null + ? "1970-01-01 00:00:00" + : rs.getString("order_sync_modify_time"); + + // 先判断app是否存在 + String app_code = rs.getString("app_code"); + Boolean found = false; + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.del_flag = rs.getInt("del_flag"); + shopConfig.auth_flag = rs.getInt("auth_flag"); + shopConfig.pay_percent = rs.getDouble("pay_percent"); + shopConfig.order_sync_flag = rs.getInt("order_sync_flag"); + shopConfig.init_time = rs.getInt("init_time"); + shopConfig.company_type = rs.getInt("company_type"); + shopConfig.auto_aftersale_flag = rs.getInt("auto_aftersale_flag"); + shopConfig.auto_cancel_aftersale_flag = rs.getInt("auto_cancel_aftersale_flag"); + shopConfig.auto_update_address_flag = rs.getInt("auto_update_address_flag"); + shopConfig.order_sync_lock_flag = rs.getInt("order_sync_lock_flag"); + shopConfig.order_sync_lock_keyword = rs.getString("order_sync_lock_keyword") == null ? "" : rs.getString("order_sync_lock_keyword"); + + shopConfig.delivery_mode_id = rs.getString("delivery_mode_id") == null ? 2 : rs.getInt("delivery_mode_id"); + shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" + : rs.getString("delivery_area_setting"); + String platformCode = rs.getString("platformCode"); + shopConfig.realPlatformCode = platformCode; + shopConfig.platformCode = platformCode; + if ("001".equals(shopConfig.platformCode) || "012".equals(shopConfig.platformCode)) { + shopConfig.platformCode = "002"; + } + String storage_code = rs.getString("storage_code"); + if (storage_code == null) { + shopConfig.storage_code = ""; + } else { + shopConfig.storage_code = rs.getString("storage_code"); + } + + /** + * 废除超期7天就关闭店铺的授权和抓单等操作,2018-11-29日停用 + */ + /* + * String platform_account = rs.getString("platform_account"); long endTimeLong + * = sdf.parse(endTime).getTime(); long timeNow = System.currentTimeMillis(); // + * 如果公司的过期时间超过一周,则停止该公司的抓单 String endTime = rs.getString("endTime"); if (timeNow + * - endTimeLong >= 7 * 24 * 60 * 60 * 1000) { for (int i = 0; i < + * platConfig.apps.size(); i++) { AppConfig appCount = platConfig.apps.get(i); + * for (int j = 0; j < appCount.shops.size(); j++) { ShopConfig shopCount = + * appCount.shops.get(j); if (shopConfig.code.equals(shopCount.code)) { // + * 更新tb_shop sql = + * "update tb_shop set auth_flag=1,app_code='',session_key='',order_sync_flag=1,write_back_flag=1,stock_sync_flag=1,expires_in=null,refresh_token=null,auth_time=null,expires_time=null " + * + "where code='" + shopConfig.code + "'"; ps = conn.prepareStatement(sql); // + * 成功与否都继续执行 if (ps.executeUpdate() >= 0) { logger.info("店铺配置更新:" + + * shopConfig.name + "店铺服务逾期超过七天,注销该店铺的注册信息!" + "时间|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } // 关闭该公司的消息授权 + * if ((shopConfig.auth_flag == 2) && ("001".equals(shopConfig.platformCode) || + * "002".equals(shopConfig.platformCode) || + * "012".equals(shopConfig.platformCode))) { if (platform_account != null && + * (!"".equals(platform_account))) { try { TaobaoClient client = new + * DefaultTaobaoClient(platConfig.api_url, appCount.key, appCount.secret); + * TmcUserCancelRequest req = new TmcUserCancelRequest(); + * req.setNick(platform_account); req.setUserPlatform("tbUIC"); + * TmcUserCancelResponse rsp = client.execute(req); if (rsp.getIsSuccess()) { + * logger .info("店铺配置更新:" + shopConfig.name + "店铺服务逾期超过七天,关闭淘宝平台消息服务!" + "时间|" + + * new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date())); } } catch + * (ApiException e) { logger.error(OrderSyncs.class, e); } catch (Exception e) { + * logger.error(OrderSyncs.class, e); } } } // 从内存删除该公司的店铺 platConfig.apps = + * deleteShopMessage(platConfig.plat_code, platConfig.apps, shopConfig.code); + * continue; } } } } + */ + + // 如果查询到的条目订单同步时间大于上次,则更新 + long time = sdf.parse(platConfig.order_sync_modify_time).getTime(); + if (time > order_sync_modify_or) { + if (shopConfig.del_flag == 1) { + if (shopConfig.auth_flag == 2) { + if (shopConfig.order_sync_flag == 2) { + for (int j = platConfig.apps.size() - 1; j >= 0; j--) { + AppConfig app_config = platConfig.apps.get(j); + if (app_code.equals(app_config.code)) { + boolean flag_found = false; + // 找到app判断该app内是否已存在该店铺,存在则先删除再添加 + for (int k = app_config.shops.size() - 1; k >= 0; k--) { + ShopConfig sc = new ShopConfig(); + sc = app_config.shops.get(k); + if (shopConfig.code.equals(sc.code)) {// 更新session_key的店铺 + logger.info("店铺配置更新:[ {} ] | [ {} ] 更新session_key成功!时间->{}", + shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + platConfig.apps.get(j).shops.get(k).lastCatchTime = null; + platConfig.apps.get(j).shops.remove(k);// 确定该店铺在该app里面,更新该店铺信息 + platConfig.apps.get(j).shops.add(shopConfig); + flag_found = true; + } + } + if (!flag_found) { + platConfig.apps.get(j).shops.add(shopConfig);// 新加的店铺 + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺加入appkey:[ {} ] 成功!时间->{}", + shopConfig.code, shopConfig.name, app_config.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + found = true; + break; + } else { + for (int k = app_config.shops.size() - 1; k >= 0; k--) { + ShopConfig sc = new ShopConfig(); + sc = app_config.shops.get(k); + if (shopConfig.code.equals(sc.code)) {// 找到则说明是店铺更改了app,在原app删除掉 + platConfig.apps.get(j).shops.remove(k); + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺从原appkey:[ {} ] 删除!时间->{}", + shopConfig.code, shopConfig.name, app_config.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + if (!("002".equals(platConfig.plat_code))) { + if (platConfig.apps.get(j).shops.size() == 0) { + platConfig.apps.remove(j); + logger.info("店铺配置更新:[ {} ] 中无店铺信息,将该appkey删除!时间->{}", app_config.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } + + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = Collections.synchronizedList(new ArrayList()); + appConfig.shops.add(shopConfig); + platConfig.apps.add(appConfig); + logger.info("店铺配置更新:appkey:[ {} ] 添加到平台[ {} ] 成功!时间->{}", appConfig.key, + platConfig.plat_code, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺加入appkey:[ {} ] 成功!时间->{}", shopConfig.name, + shopConfig.code, appConfig.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } else { + platConfig.apps = deleteShopMessage(platConfig.plat_code, platConfig.apps, + shopConfig.code, shopConfig.name); + } + } else { + platConfig.apps = deleteShopMessage(platConfig.plat_code, platConfig.apps, shopConfig.code, + shopConfig.name); + } + } else { + platConfig.apps = deleteShopMessage(platConfig.plat_code, platConfig.apps, shopConfig.code, + shopConfig.name); + } + } + // 获取自动更新sessionkey的所需信息 + int del_flag = shopConfig.del_flag; + int auth_flag = shopConfig.auth_flag; + String refresh_token = rs.getString("refresh_token"); + String expires_time = rs.getString("expires_time"); + if (del_flag == 1 && auth_flag == 2 && (refresh_token != null && !"".equals(refresh_token) + && (expires_time != null && !"".equals(expires_time)))) { + UpdateMessage um = new UpdateMessage(); + um.app_key = rs.getString("app_key"); + um.app_secret = rs.getString("app_secret"); + um.refresh_token = refresh_token; + um.expires_time = expires_time; + um.shop_name = rs.getString("shop_name"); + um.shop_code = rs.getString("shop_code"); + platConfig.updateTokenList.add(um); + } + } + return platConfig; + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + logger.info("定时更新店铺信息SQL执行失败,信息不做更新,等待下次更新!{}时间->{}", e.toString(), + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + return platConfig; + } catch (ParseException e) { + logger.error(OrderSyncs.class, e); + logger.info("定时更新店铺信息时间解析执行失败,信息不做更新,等待下次更新!{}时间->{}", e.toString(), + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return platConfig; + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + logger.info("定时更新店铺信息时间解析执行失败,信息不做更新,等待下次更新!{}时间->{}", e.toString(), + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return platConfig; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + conn = null; + } + dbpc = null; + } + } + + private static List deleteShopMessage(String plat_code, List apps, String shopCode, + String shopName) { + // 已删除,确认该店铺绑定的app是否还有其他绑定店铺,若无,则删除该app项 + boolean flag = false;// 开关,找到店铺关闭循环 + for (int i = apps.size() - 1; i >= 0; i--) { + AppConfig appEach = new AppConfig(); + appEach = apps.get(i); + for (int j = appEach.shops.size() - 1; j >= 0; j--) { + ShopConfig shopConfigEach = new ShopConfig(); + shopConfigEach = appEach.shops.get(j); + if (shopCode.equals(shopConfigEach.code)) { + logger.info("店铺配置更新:[ {} ] | [ {} ] 店铺从原appkey:[ {} ]删除!时间->{}", shopCode, shopName, appEach.key, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + apps.get(i).shops.remove(j); + flag = true; + break; + } + } + if (!("002".equals(plat_code))) { + if (apps.get(i).shops.size() < 1) { + logger.info("店铺配置更新:[ {} ] | [ {} ], [ {} ] 中无店铺信息,将该appkey删除!时间->{}", shopCode, shopName, + apps.get(i).key, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + apps.remove(i); + } + } + if (flag) { + break; + } + } + return apps; + } + + /** + * 更新商铺状态 + * + * @param shopCode + * @return + */ + public static boolean updateShopStatus(String shopCode, String shopName) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + try { + String expires_time; + String platform_account; + conn = dbpc.getConnection(); + sql = "select expires_time from tb_shop where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, shopCode); + rs = ps.executeQuery(); + if (rs.next()) { + expires_time = rs.getString("expires_time"); + if (expires_time == null) { + expires_time = "1970-01-01 00:00:00"; + } + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if (expires_time.compareTo(now) > 0) { + logger.info("店铺配置更新:[ {} ] | [ {} ] session_key由API查询过期,但数据库查询未到过期时间,不做处理!时间->{}", shopCode, + shopName, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } else { + sql = "update tb_shop set auth_flag=3,order_sync_flag=1,stock_sync_flag=1,auto_aftersale_flag=1,order_sync_modify_time=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, now); + ps.setString(2, shopCode); + if (ps.executeUpdate() == 0) { + return false; + } + logger.info("店铺配置更新:[ {} ] | [ {} ] session_key过期,更新数据库授权为授权过期,抓单,库存更新及售后登记关闭!时间->{}", shopCode, + shopName, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + } else { + logger.info("店铺配置更新:[ {} ] | [ {} ] session_key过期,但数据库未查询到相关店铺信息,不做处理!时间->{}", shopCode, shopName, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + conn = null; + } + dbpc = null; + } + + return false; + } + + /** + * 初始化Memcache + */ + public static synchronized MemcachedClient MemcacheInit(String className) { + MemcachedClient mcc = null; + String url = null; + try { + IniReader iniReader = new IniReader("config_all.ini"); + url = iniReader.getValue("memcache", "url"); + if ("".equals(url)) { + logger.info("[ {} ] 连接:memCache初始化url为空,不使用memcache!时间->{}", className, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + mcc = null; + } else { + /** + * 使用官方的java + */ + /* + String[] servers = { url }; + SockIOPool pool = SockIOPool.getInstance(); + pool.setServers(servers); + pool.initialize();// 初始化 + mcc = new MemCachedClient(); + */ + String[] servers = url.split(":"); + + mcc = new MemcachedClient(new InetSocketAddress(servers[0], Integer.valueOf(servers[1]))); + + logger.info("[ {} ] 连接:memCache初始化成功!连接地址:[ {} ] 时间->{}", className, url, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + return mcc; + } catch (IOException e) { + logger.error(OrderSyncs.class, e); + return null; + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + return null; + } + + } + + /** + * 文件的复制 + * + * @param fromFile + * @param toFile + * @throws IOException + */ + public static void copyFile(File fromFile, File toFile) throws IOException { + FileInputStream ins = new FileInputStream(fromFile); + FileOutputStream out = new FileOutputStream(toFile); + byte[] b = new byte[1024]; + int n = 0; + while ((n = ins.read(b)) != -1) { + out.write(b, 0, n); + } + + ins.close(); + out.close(); + } + + /* + * 重载方法updateReplenishResult,不需要自己创建线程池连接 + */ + public static void updateReplenishResult(DruidPooledConnection conn, PreparedStatement ps, String code, + String result, String out_path) { + String sql = ""; + try { + sql = "update tb_replenish_order set result=?, out_path=?, status=3 where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, result); + ps.setString(2, out_path); + ps.setString(3, code); + ps.executeUpdate(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + } + + /* + * 重载方法updateReplenishResult,需要方法自己创建线程池连接 + */ + public static void updateReplenishResult(String code, String result, String out_path) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + sql = "update tb_replenish_order set result=?, out_path=?, status=3 where code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, result); + ps.setString(2, out_path); + ps.setString(3, code); + ps.executeUpdate(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } finally { + + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(OrderSyncs.class, e); + } catch (Exception e) { + logger.error(OrderSyncs.class, e); + } + conn = null; + } + dbpc = null; + } + } + +} \ No newline at end of file diff --git a/src/com/since/emp/service/ReOrderSync.java b/src/com/since/emp/service/ReOrderSync.java new file mode 100644 index 0000000..1082379 --- /dev/null +++ b/src/com/since/emp/service/ReOrderSync.java @@ -0,0 +1,376 @@ +package com.since.emp.service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collections; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.RecatchConfig; +import com.since.emp.newplatform.service.ApiDangDangNew; +import com.since.emp.newplatform.service.ApiGomeNew; +import com.since.emp.newplatform.service.ApiJingdongNew; +import com.since.emp.newplatform.service.ApiWeiMobNew; +import com.since.emp.newplatform.service.ApiXiaoHongShuNew; +import com.since.emp.newplatform.service.ApiYiTiaoNew; +import com.since.emp.newplatform.service.ApiYouZanNew; + +public class ReOrderSync extends OrderSyncs { + private static final Logger logger = LogManager.getLogger(ReOrderSync.class); + private static String config_filename = "config_all.ini"; + private static PlatConfig platConfig; + private static String storageUpdateTime; + private static Config config; + private static String stopStartTime;// 定时同步停止同步的起始时间 + private static String stopEndTime;// 定时同步停止同步的结束时间 + private static String accessKeyId;// 京东虎符鼎外APPKEY + private static String secretKey;// 京东虎符鼎外APPSERCET + private static String endpoint;// 京东虎符调用地址 + private static String customerId;// 京东虎符客户编号 + + /** + * main + * + * @param args + * @throws SQLException + */ + public static void main(String[] args) { + + provinceDic();// 初始化地址字典 + + recatchConfig = new RecatchConfig(); + config = new Config(); + platConfig = new PlatConfig(); + + boolean flag_1 = true; + if (!initFileConfig()) { + flag_1 = false; + logger.info("[ 初始化 ] 文件读取配置失败"); + return; + } + logger.info("[ 初始化 ] 文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + if (!getConfigFromDB()) { + System.exit(0); + } + } catch (Exception e) { + logger.info("[ 初始化 ] 数据库读取配置失败"); + logger.error(ReOrderSync.class, e); + return; + } + logger.info("[ 初始化 ] 数据库读取配置成功"); + + /* + * if (initFileConfig_p() == false) { flag_1 = false; + * logger.info("[ 初始化 ] 文件读取配置失败"); return; } if (flag_1) { + * logger.info("[ 初始化 ] 文件读取配置成功"); } + */ + /* + * if (recatchConfig.shop_code == null || "".equals(recatchConfig.shop_code)) { + * logger.info("店铺编号不能为空!"); System.exit(0); } + */ + if ((recatchConfig.starTime == null || "".equals(recatchConfig.starTime) || recatchConfig.endTime == null + || "".equals(recatchConfig.endTime)) + && (recatchConfig.orderId == null || "".equals(recatchConfig.orderId))) { + logger.info("补抓单条件不能为空!"); + System.exit(0); + } + + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, stopStartTime, stopEndTime); + storageUpdate.start(); + + boolean flag_2 = false; + + // ArrayList shops = new ArrayList(); + // shops.add(shopConfig); + // platConfig = config.plats.get(0); + appConfig = platConfig.apps.get(0); + if ("002".equals(recatchConfig.platform_code)) { + apiTmall = new ApiTmall(platConfig.api_url, platConfig.tmc_url, appConfig.key, appConfig.secret, + platConfig.apps.get(0).shops, recatchConfig); + logger.info("[ 初始化 ] 002平台, app:{}启动", appConfig.key); + apiTmall.start(); + flag_2 = true; + } else if ("006".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 006平台, app:{}启动", appConfig.key); + apiGomeNew = new ApiGomeNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("005".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 005平台,app:{}启动", appConfig.key); +// apiDangdang = new ApiDangdang(platConfig, recatchConfig); + apiDangDangNew = new ApiDangDangNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("003".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 003平台, app:{}启动", appConfig.key); + apiJingdong = new ApiJingdongNew(platConfig, recatchConfig, accessKeyId, secretKey, endpoint, + customerId); + flag_2 = true; + } else if ("011".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 011平台, app:{}启动", appConfig.key); + apiYouZanNew = new ApiYouZanNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("014".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 014平台, app:{}启动", appConfig.key); + apiPinDuoDuoNew = new ApiPinDuoDuoNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("015".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 015平台, app:{}启动", appConfig.key); + apiVip = new ApiVip(platConfig, recatchConfig); + flag_2 = true; + } else if ("017".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 017平台, app:{}启动", appConfig.key); + apiWeiMobNew = new ApiWeiMobNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("018".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 018平台, app:{}启动", appConfig.key); + apiPingan = new ApiPingan(platConfig, recatchConfig); + flag_2 = true; + } else if ("019".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 019平台, app:{}启动", appConfig.key); + apiMia = new ApiMia(platConfig, recatchConfig); + flag_2 = true; + } else if ("020".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 020平台, app:{}启动", appConfig.key); + apiYiTiaoNew = new ApiYiTiaoNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("021".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 021平台, app:{}启动", appConfig.key); + apiXiaoHongShuNew = new ApiXiaoHongShuNew(platConfig, recatchConfig); + flag_2 = true; + } else if ("022".equals(recatchConfig.platform_code)) { + logger.info("[ 初始化 ] 022平台, app:{}启动", appConfig.key); + apiMiHeMall = new ApiMiHeMall(platConfig, recatchConfig); + flag_2 = true; + } + + if (!flag_2) { + logger.info("店铺未启动,请检查!"); + } + } + + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = Collections.synchronizedList(new ArrayList()); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.agent_api_ip = iniReader.getValue(plat_array[i], "agent_api_ip"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = Collections.synchronizedList(new ArrayList()); + config.plats.add(pc); + } + + recatchConfig.platform_code = iniReader.getValue("parameter", "platformCode"); + recatchConfig.shop_code = iniReader.getValue("parameter", "shopCode"); + recatchConfig.starTime = iniReader.getValue("parameter", "starTime"); + recatchConfig.endTime = iniReader.getValue("parameter", "endTime"); + recatchConfig.orderId = iniReader.getValue("parameter", "orderId"); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + stopStartTime = iniReader.getValue("storageUpdateTime", "stopStartTime"); + stopEndTime = iniReader.getValue("storageUpdateTime", "stopEndTime"); + accessKeyId = iniReader.getValue("hufu", "accessKeyId"); + secretKey = iniReader.getValue("hufu", "secretKey"); + endpoint = iniReader.getValue("hufu", "endpoint"); + customerId = iniReader.getValue("hufu", "customerId"); + + res = true; + } catch (Exception e) { + logger.error(ReOrderSync.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + // Connection conn = dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + Statement statement = null; + boolean found = true; + boolean flag = false; + platConfig.apps = Collections.synchronizedList(new ArrayList()); + appConfig = new AppConfig(); + shopConfig = new ShopConfig(); + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + if (recatchConfig.shop_code.length() > 0) { + String sql = "select a.platform_code,c.code as app_code,c.key as app_key,a.delivery_mode_id,a.delivery_area_setting," + + "c.secret as app_secret,a.company_code as shop_company_code,a.code as shop_code," + + "a.platform_account as shop_name,a.session_key as shop_session_key,a.storage_code,d.type as company_type " + + " from tb_shop a,tb_platform_app c,tb_company d where " + + " a.del_flag = 1 and order_sync_flag=2 and a.company_code=d.code and a.app_code = c.code and c.del_flag = 1" + + " and a.code = '" + recatchConfig.shop_code + "'"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 构造店铺 + String platform_code = rs.getString("platform_code"); +// recatchConfig.real_platform_code = platform_code; + recatchConfig.platform_code = platform_code; + if ("001".equals(recatchConfig.platform_code) || "012".equals(recatchConfig.platform_code)) { + recatchConfig.platform_code = "002"; + } + recatchConfig.platform_account = rs.getString("shop_name"); + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig pc = new PlatConfig(); + + pc = config.plats.get(i); + + if (pc.plat_name.equals(recatchConfig.platform_code)) { + shopConfig = new ShopConfig(); + shopConfig.platformCode = platform_code; + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.storage_code = rs.getString("storage_code"); + shopConfig.company_type = rs.getInt("company_type"); + appConfig.secret = rs.getString("app_secret"); + appConfig.key = rs.getString("app_key"); + if ((rs.getString("delivery_mode_id") == null)) { + shopConfig.delivery_mode_id = 2; + } else { + shopConfig.delivery_mode_id = rs.getInt("delivery_mode_id"); + } + shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" + : rs.getString("delivery_area_setting"); + found = false; + platConfig.api_url = pc.api_url; + platConfig.agent_api_ip = pc.agent_api_ip; + platConfig.apps.add(appConfig); + platConfig.apps.get(0).shops = Collections.synchronizedList(new ArrayList()); + platConfig.apps.get(0).shops.add(shopConfig); + } + } + + } + if (found) { + logger.info("店铺编号未查到,请核对编号是否正确!"); + System.exit(0); + } + flag = true; + return true; + } + if (recatchConfig.platform_code.length() > 0) { + String sql = "select a.platform_code,c.code as app_code,c.key as app_key,a.delivery_mode_id,a.delivery_area_setting," + + "c.secret as app_secret,a.company_code as shop_company_code,a.code as shop_code," + + "a.platform_account as shop_name,a.session_key as shop_session_key,a.storage_code,d.type as company_type " + + " from tb_shop a,tb_platform_app c,tb_company d where " + + " a.del_flag = 1 and order_sync_flag=2 and a.company_code=d.code and a.app_code = c.code and c.del_flag = 1" + // + " and a.company_code = b.company_code and + // a.company_code = '" + "0001" + "'" + " and a.code = '" + + " and c.platform_code = '" + recatchConfig.platform_code + "'"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 构造店铺 +// recatchConfig.real_platform_code = rs.getString("platform_code"); + recatchConfig.platform_account = rs.getString("shop_name"); + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig pc = new PlatConfig(); + + pc = config.plats.get(i); + + if (pc.plat_name.equals(recatchConfig.platform_code)) { + shopConfig = new ShopConfig(); +// shopConfig.platformCode = recatchConfig.real_platform_code; + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.storage_code = rs.getString("storage_code"); + shopConfig.company_type = rs.getInt("company_type"); + appConfig.secret = rs.getString("app_secret"); + appConfig.key = rs.getString("app_key"); + if ((rs.getString("delivery_mode_id") == null)) { + shopConfig.delivery_mode_id = 2; + } else { + shopConfig.delivery_mode_id = rs.getInt("delivery_mode_id"); + } + shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" + : rs.getString("delivery_area_setting"); + found = false; + platConfig.api_url = pc.api_url; + if (!platConfig.apps.contains(appConfig)) { + platConfig.apps.add(appConfig); + platConfig.apps.get(0).shops = Collections + .synchronizedList(new ArrayList()); + } + platConfig.apps.get(0).shops.add(shopConfig); + } + } + + } + + if (found) { + logger.info("平台编号未查到,请核对编号是否正确!"); + System.exit(0); + } + flag = true; + return true; + + } + logger.info("补抓单程序配置中平台单号和店铺单号不能都为空!"); + return false; + } catch (Exception e) { + logger.error(ReOrderSync.class, e); + return false; + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(ReOrderSync.class, e); + } catch (Exception e) { + logger.error(ReOrderSync.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ReOrderSync.class, e); + } catch (Exception e) { + logger.error(ReOrderSync.class, e); + } + conn = null; + } + dbpc = null; + } + } + +} diff --git a/src/com/since/emp/service/RefundOrderHandler.java b/src/com/since/emp/service/RefundOrderHandler.java new file mode 100644 index 0000000..6346f07 --- /dev/null +++ b/src/com/since/emp/service/RefundOrderHandler.java @@ -0,0 +1,1106 @@ +package com.since.emp.service; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.RefundOrder; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.MD5Util; + +public class RefundOrderHandler { + + private static final Logger LOGGER = LogManager.getLogger(RefundOrderHandler.class); + + public Vector refundInfoQueue; + private String plg_url; + + public Vector exceptionRefundInfoQueue; + + public Map exceptionRefundInfoMap; + + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public void start() { + try { + refundInfoQueue = new Vector(); + exceptionRefundInfoQueue = new Vector(); + exceptionRefundInfoMap = new ConcurrentHashMap<>(); + + IniReader iniReader = new IniReader("config_all.ini"); + plg_url = iniReader.getValue("path", "plg_url"); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + + scheduledThreadPool.scheduleAtFixedRate(new RefundOrderHandlerThread(), 0, 100, TimeUnit.MILLISECONDS); + + scheduledThreadPool.scheduleAtFixedRate(new ExceptionRefundOrderHandlerThread(), 0, 5 * 60 * 1000, + TimeUnit.MILLISECONDS); + } catch (Exception e) { + LOGGER.error(this, e); + } + LOGGER.info("退款数据处理线程启动"); + } + + /** + * + * @className:RefundOrderHandlerThread + * @description:正常售后单处理 + * @author:Sunshine + * @date:2020年3月10日 下午4:01:27 + */ + class RefundOrderHandlerThread implements Runnable { + + @Override + public void run() { + while (refundInfoQueue.size() > 0) { + RefundInfo refundInfo = refundInfoQueue.get(0); + if (insertRefundOrder(refundInfo)) { + refundInfoQueue.remove(0); + LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后成功", refundInfo.tid, refundInfo.refund_id); + } else { + refundInfoQueue.remove(0); + // exceptionRefundInfoQueue.add(refundInfo); + if (!exceptionRefundInfoMap.containsKey(refundInfo.refund_id)) { + refundInfo.create_time = System.currentTimeMillis(); + exceptionRefundInfoMap.put(refundInfo.refund_id, refundInfo); + } + + } + LOGGER.info("售后处理待写库队列总数[ {} ]", refundInfoQueue.size()); + } + + } + + } + + /** + * + * @className:ExceptionRefundOrderHandlerThread + * @description:异常售后单处理 + * @author:Sunshine + * @date:2020年3月10日 下午4:02:08 + */ + class ExceptionRefundOrderHandlerThread implements Runnable { + + @Override + public void run() { + + for (Map.Entry refundOrder : exceptionRefundInfoMap.entrySet()) { + RefundInfo refundInfo = refundOrder.getValue(); + if (refundInfo.create_time + 60 * 60 * 1000 * 24 <= System.currentTimeMillis()) { + exceptionRefundInfoMap.remove(refundOrder.getKey()); + LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后超过24小时,放弃处理", refundInfo.tid, refundInfo.refund_id); + } + + if (insertRefundOrder(refundInfo)) { + exceptionRefundInfoMap.remove(refundOrder.getKey()); + LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后成功", refundInfo.tid, refundInfo.refund_id); + } else { + LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后失败,等待下次处理", refundInfo.tid, refundInfo.refund_id); + } + + LOGGER.info("售后处理待写库异常队列总数[ {} ]", exceptionRefundInfoMap.size()); + + } + + // while (exceptionRefundInfoQueue.size() > 0) { + // RefundInfo refundInfo = exceptionRefundInfoQueue.get(0); + // if (refundInfo.create_time + 60 * 60 * 1000 * 24 <= + // System.currentTimeMillis()) { + // exceptionRefundInfoQueue.remove(0); + // LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后超过24小时,放弃处理", refundInfo.tid, + // refundInfo.refund_id); + // } + // // TODO 相同退款单的处理 超过24小时移除 + // if (insertRefundOrder(refundInfo)) { + // exceptionRefundInfoQueue.remove(0); + // LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后成功", refundInfo.tid, + // refundInfo.refund_id); + // } else { + // LOGGER.info("订单 [ {} ] ,退款单编号 [ {} ],处理售后失败,等待下次处理", refundInfo.tid, + // refundInfo.refund_id); + // } + // + // } + + } + + } + + // 售后处理 + public boolean insertRefundOrder(RefundInfo refundInfo) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + List refundList = Collections.synchronizedList(new ArrayList()); + ResultSet rs = null; + ResultSet rs1 = null; + ResultSet rs2 = null; + try { + conn = dbpc.getConnection(); + int origin = 0;// 售后来源(1:换货 2:补货 3:补偿 4:改单 5:并单 6:拆单 7:换票 8:补票) + boolean foundRs = false;// 是否有可登记销售订单 + int countFirst = 0;// 统计第一次循环的结果 + boolean originFlag = false;// 订单是否是改单和拆单 + conn.setAutoCommit(false); + if (refundInfo.company_type == 2) { // company_type:企业类型 1:后台管理公司,2:经销商,3:供应商 + sql = "select a.aftersale_order_flag, a.del_flag, a.status,a.lock_reason_id,c.aftersale_lock_support_flag,b.code as storageOutOrderCode,a.lock_note," + + "a.code as sale_order_code, a.aftersale_seq,a.origin,a.entrust_type, a.company_code,a.pay_money,a.obm_company_code,a.aftersale_number,b.storage_code,b.check_flag,c.auto_refund_flag,a.last_aftersale_order_code, " + + "IFNULL(b.status,0) as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.company_code=b.company_code,tb_shop c " + + "where a.shop_code=c.code and c.auto_aftersale_flag=2 and a.platform_code = ? and a.shop_code = ? order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.tid)); + ps.setString(2, refundInfo.shop_code); + rs = ps.executeQuery(); + } + if (refundInfo.company_type == 3) { + sql = "select a.aftersale_order_flag, a.del_flag, a.status,a.lock_reason_id,c.aftersale_lock_support_flag,b.code as storageOutOrderCode,a.lock_note," + + "a.code as sale_order_code, a.aftersale_seq,a.origin,a.entrust_type, a.company_code,a.pay_money,a.obm_company_code,a.aftersale_number,b.storage_code,b.check_flag,c.auto_refund_flag,a.last_aftersale_order_code, " + + "IFNULL(b.status,0) as orderStatus " + + "from tb_sale_order a left join tb_storage_out_order b on a.code=b.sale_order_code and a.obm_company_code=b.obm_company_code,tb_shop c " + + "where a.shop_code=c.code and c.auto_aftersale_flag=2 and a.platform_code = ? and a.shop_code = ? order by a.create_time desc"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.tid));// 退款单对应的销售单订单编码 + ps.setString(2, refundInfo.shop_code);// 店铺编码 + rs = ps.executeQuery(); + } + + while (rs.next()) { + foundRs = true; + // and a.aftersale_order_flag=1 and a.del_flag=1 and a.status>-1 + int aftersale_order_flag = rs.getInt("aftersale_order_flag"); + int del_flag = rs.getInt("del_flag"); + int status = rs.getInt("status"); + int lock_reason_id = rs.getInt("lock_reason_id"); + int aftersale_lock_support_flag = rs.getInt("aftersale_lock_support_flag"); + // + if (aftersale_order_flag == 1 + && (del_flag == 1 + || ((del_flag == 2) && (lock_reason_id != 1) && (aftersale_lock_support_flag == 2))) + && status > -1) { + + origin = rs.getInt("origin"); + // 售后统计循环次数为0且来源为改单和拆单,改为改单和拆单 + if (countFirst == 0 && (origin == 4 || origin == 6)) { + originFlag = true; + } + // 如果是改单和拆单 + if (originFlag && (origin == 4 || origin == 6)) { + /* + * if (origin == 6) {// 暂时将拆单分出,放弃处理 logger.info("【" + logTitle + + * "】退款订单为拆单订单,放弃处理|" + refundInfo.tid); } else {// 改单的处理 + * + */ + RefundOrder ro = new RefundOrder();// 售后订单 + ro.aftersaleNumber = rs.getInt("aftersale_number"); + ro.checkFlag = rs.getInt("check_flag"); + ro.pay_money = rs.getDouble("pay_money"); + ro.autoRefundFlag = rs.getInt("auto_refund_flag"); + ro.aftersaleSeq = rs.getInt("aftersale_seq"); + ro.orderStatus = rs.getInt("orderStatus"); + ro.saleOrderCode = rs.getString("sale_order_code"); + ro.entrustType = rs.getInt("entrust_type"); + ro.obmCompanyCode = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + ro.companyCode = rs.getString("company_code"); + ro.storageCode = rs.getString("storage_code") == null ? "" : rs.getString("storage_code"); + ro.lastAftersaleOrderCode = rs.getString("last_aftersale_order_code") == null ? "" + : rs.getString("last_aftersale_order_code"); + ro.storageOutOrderCode = rs.getString("storageOutOrderCode") == null ? "" + : rs.getString("storageOutOrderCode"); + ro.lockNote = rs.getString("lock_note") == null ? "" : rs.getString("lock_note"); + refundList.add(ro); + // } + + } + if (originFlag == false && origin == 0) {// 非改单和拆单 + RefundOrder ro = new RefundOrder(); + ro.aftersaleNumber = rs.getInt("aftersale_number"); + ro.checkFlag = rs.getInt("check_flag"); + ro.pay_money = rs.getDouble("pay_money"); + ro.autoRefundFlag = rs.getInt("auto_refund_flag"); + ro.aftersaleSeq = rs.getInt("aftersale_seq"); + ro.orderStatus = rs.getInt("orderStatus"); + ro.saleOrderCode = rs.getString("sale_order_code"); + ro.entrustType = rs.getInt("entrust_type"); + ro.obmCompanyCode = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code"); + ro.companyCode = ""; + ro.storageCode = rs.getString("storage_code") == null ? "" : rs.getString("storage_code"); + ro.lastAftersaleOrderCode = rs.getString("last_aftersale_order_code") == null ? "" + : rs.getString("last_aftersale_order_code"); + ro.storageOutOrderCode = rs.getString("storageOutOrderCode") == null ? "" + : rs.getString("storageOutOrderCode"); + ro.lockNote = rs.getString("lock_note") == null ? "" : rs.getString("lock_note"); + refundList.add(ro); + } + countFirst++; + } + + } + + if (foundRs && countFirst == 0) { + LOGGER.info("退款订单相应系统订单不满足处理条件,放弃处理| [ {} ] ", refundInfo.tid); + return true; + } + + // TODO 对于未找到订单的五分钟处理一次 加入时间超过24小时的放弃处理 + + if (!foundRs) { + // 天猫系 + if ("002".equals(refundInfo.platform_code) || "012".equals(refundInfo.platform_code) + || "001".equals(refundInfo.platform_code)) { + LOGGER.info("退款订单相应系统订单未找到,将加入异常处理队列| [ {} ] ,店铺所属平台编号 [ {} ]", refundInfo.tid, + refundInfo.platform_code); + return false; + } + // 非天猫系 + LOGGER.info("退款订单相应系统订单未找到,放弃处理 [ {} ] ,店铺所属平台编号 [ {} ", refundInfo.tid, refundInfo.platform_code); + return true; + + } + // 通过字典获取匹配的售后诉求的类型 + int aftersale_reason_id = 0;// 售后诉求类型 + refundInfo.reason = refundInfo.reason == null ? "" : refundInfo.reason; + if (refundInfo.reason.equals("")) { + aftersale_reason_id = 99999; + } else { + sql = "select id,name from tb_aftersale_reason_dic where name ='" + refundInfo.reason + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + aftersale_reason_id = rs.getInt("id"); + } else { + sql = "select count(*) as count from tb_aftersale_reason_dic"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + int count = rs.getInt("count"); + sql = "insert into tb_aftersale_reason_dic(id,name) values(?,?)"; + ps = conn.prepareStatement(sql); + ps.setInt(1, count); + ps.setString(2, refundInfo.reason); + if (ps.executeUpdate() == 0) { + LOGGER.info("订单| [ {} ] 插入售后原因表失败!", refundInfo.tid); + return false; + } + aftersale_reason_id = count; + } else { + LOGGER.info("订单| [ {} ] 查询售后原因表失败!", refundInfo.tid); + return false; + } + } + } + + // 对售后登记表的操作 + sql = "select 1 from tb_aftersale_order where platform_refund_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, String.valueOf(refundInfo.refund_id)); + rs = ps.executeQuery(); + if (rs.next()) { + LOGGER.info("订单| [ {} ] 已做过售后登记,放弃处理!", refundInfo.tid); + return true; + } else { + int listSize = refundList.size(); + if (listSize == 0) { + LOGGER.info("订单| [ {} ] 已做过售后登记,放弃处理!", refundInfo.tid); + return true; + } + for (int i = 0; i < listSize; i++) { + RefundOrder ro = new RefundOrder(); + ro = refundList.get(i); + int aftersale_seq = ro.aftersaleSeq; + int orderStatus = ro.orderStatus; + String sale_order_code = ro.saleOrderCode; + boolean storageFlag = false; + + if (orderStatus > 3) { + storageFlag = true; + } + /** + * obmFlag true为品牌商或品牌商代发,false为经销商自有 + */ + boolean obmFlag = false; + if (!"".equals(ro.obmCompanyCode)) { + obmFlag = true; + } + /** + * 当订单为委外订单时判断是否拦截 + */ + int entrust_issuccess = 0; + String entrust_msg = ""; + if (ro.entrustType == 2 && !storageFlag) { + /** + * 判断公司和仓库是否属于委外订单 + */ + sql = "select code,logistics_company_code from tb_storage where logistics_company_code is not null and company_code=?"; + ps = conn.prepareStatement(sql); + if (obmFlag) { + ps.setString(1, ro.obmCompanyCode); + } else { + ps.setString(1, refundInfo.company_code); + } + + rs = ps.executeQuery(); + while (rs.next()) { + String storage_code = rs.getString("code") == null ? "" : rs.getString("code"); + String logistics_company_code = rs.getString("logistics_company_code") == null ? "" + : rs.getString("logistics_company_code"); + /** + * 品牌商为空说明为经销商的自发订单 + */ + + if (storage_code.equals(ro.storageCode) && "PLG".equals(logistics_company_code)) { + /* + * String param = "djbh=" + ro.sale_order_code + + * "&type_dd=CK&type_qx=D&Appkey=VsQMCVsvCqsQ"; HttpRequest httpRequest = new + * HttpRequest(); String resultStr = httpRequest.sendGet(plg_url, param, + * DataParse.class.getName()); + * + * //如果接口异常,放弃处理 + * + * if ("".equals(resultStr) || resultStr.indexOf("\"isSuccess\"") == -1) { + * entrust_issuccess = 1; entrust_msg = "PLG服务器连接失败|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); break; } + * JSONObject json = new JSONObject(resultStr); String isSuccess = + * json.getString("isSuccess"); entrust_msg = json.getString("result"); + * entrust_msg = isSuccess + "|" + entrust_msg + "|" + new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); if + * ("100".equals(isSuccess)) { entrust_issuccess = 1; break; } entrust_issuccess + * = 2; + */ + /** + * 启用新版拦截 2019-10-17 + * + */ + + HashMap resultMap = sendInterceptToPLG(ro.saleOrderCode); + if (!resultMap.containsKey("result")) { + entrust_issuccess = 1; + entrust_msg = "PLG服务器连接失败|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + break; + } + boolean resultFlag = Boolean.valueOf(resultMap.get("flag")); + String result = resultMap.get("result"); + if (!resultFlag) { + entrust_msg = result + "|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + entrust_issuccess = 1; + break; + } + entrust_issuccess = 2; + + } + } + } + + if (aftersale_seq == 0) { // && aftersale_appeal_id == 2 ){ + if (orderStatus >= 1) { + /** + * 分经销商和品牌商两种情况处理 + */ + if (refundInfo.company_type == 3) { + sql = "select code, obm_commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and obm_company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + ps.setString(2, ro.obmCompanyCode); + rs = ps.executeQuery(); + } else { + sql = "select code, commodity_code,quantity,left_quantity,money,gift from tb_storage_out_order_items where storage_out_order_code = ? and company_code = ?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + ps.setString(2, refundInfo.company_code); + rs = ps.executeQuery(); + } + int num = 0; + String code = ""; + String commodity_code = ""; + int quantity = 0; + int left_quantity = 0; + double money = 0.0; + int gift = 0; + while (rs.next()) { + num++; + code = rs.getString("code"); + if (refundInfo.company_type == 3) { + commodity_code = rs.getString("obm_commodity_code"); + } else { + commodity_code = rs.getString("commodity_code"); + } + quantity = rs.getInt("quantity"); + left_quantity = rs.getInt("left_quantity"); + money = rs.getDouble("money"); + gift = rs.getInt("gift"); + + sql = "insert into tb_aftersale_order_items(code,commodity_code,quantity,left_quantity,money,gift,original_sale_order_code,company_code) values(?,?,?,?,?,?,?,?) "; + ps = conn.prepareStatement(sql); + ps.setString(1, code); + ps.setString(2, commodity_code); + ps.setInt(3, quantity); + ps.setInt(4, left_quantity); + ps.setDouble(5, money); + ps.setInt(6, gift); + ps.setString(7, sale_order_code); + // if (obmFlag) { + // ps.setString(8, ro.obm_company_code); + // } else { + ps.setString(8, refundInfo.company_code); + // } + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + if (num <= 0) { + LOGGER.info("退货订单| [ {} ] 出库单未找到该订单,不添加当前商品信息!", refundInfo.tid); + } + } + } + + // 对于退款金额不等于交易金额的订单,可能存在部分退款,不能直接完成退款,只能登记 + if (ro.pay_money != refundInfo.refund_fee) { + LOGGER.info("退款订单| [ {} ] 实付金额与退款金额不一致,只做登记!", refundInfo.tid); + ro.autoRefundFlag = 1; + } + //如果是子订单退款,只做登记 + if (refundInfo.sub_refund_type == 2) { + LOGGER.info("退款订单| [ {} ] 属于子订单退款,只做登记!", refundInfo.tid); + ro.autoRefundFlag = 1; + } + + /** + * 对于已发货订单,未开启自动退款和未发货买家申请的不是退款诉求以及开启了自动自动完成买家申请的不是退款诉求的退款单,只进行登记 + */ + if (orderStatus > 3 || ro.autoRefundFlag != 2 || (orderStatus <= 3 && refundInfo.bill_type != 1) + || (ro.autoRefundFlag == 2 && refundInfo.bill_type != 1)) { + String aftersale_order_code = ""; + aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg) values(?,?,?,?,0,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setInt(9, 1); + ps.setString(10, entrust_msg); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 修改订单表 + + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=?,lock_reason_id=1 where code=?"; + ps = conn.prepareStatement(sql); + if (storageFlag) { + ps.setInt(1, 1); + } else { + ps.setInt(1, 2); + } + ps.setInt(2, aftersale_seq + 1); + ps.setString(3, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + /** + * 新增对于补偿和换货的处理,在锁原单的同时,锁定补偿或换货的新售后销售单, + * 处理逻辑:根据原单从tb_sale_order获取last_aftersale_order_code, + * 然后再从tb_sale_order根据aftersale_order_code=last_aftersale_order_code获取售后销售单, + * 如果售后销售单未出库或者不存在,将该售后销售单锁定 + */ + if (!"".equals(ro.lastAftersaleOrderCode)) { + lockCompensateAndExchangeGoodsOrder(conn, ps, rs, ro.lastAftersaleOrderCode); + } + + LOGGER.info("售后订单| [ {} ] 写入成功!", refundInfo.tid); + } else { + boolean flag = false;// 用于判断结果集是否为空 true:不为空 false:为空 + sql = "select tsooi.code,tsooi.quantity,tsooi.commodity_code,tsooi.obm_commodity_code,tsooi.commodity_position_code,tsooi.company_code,tsooi.obm_company_code from tb_storage_out_order_items tsooi where storage_out_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, "CK" + sale_order_code); + rs = ps.executeQuery(); + int count = 1; + while (rs.next()) { + flag = true; + String storageOutOrderItemCode = rs.getString("code"); + int quantity_out = rs.getInt("quantity");// 出库商品数量 + String commodity_code = rs.getString("commodity_code");// 商品编码 + String commodity_position_code = rs.getString("commodity_position_code");// 商品位置码 + String company_code = rs.getString("company_code");// 企业编码 + String obm_commodity_code = rs.getString("obm_commodity_code") == null ? "" + : rs.getString("obm_commodity_code"); + String obm_company_code = rs.getString("obm_company_code") == null ? "" + : rs.getString("obm_company_code");// 品牌商企业编码 + if (ro.checkFlag == 2 && ro.autoRefundFlag == 2) {// 已检测,已发货 + + int currentQuantity = 0;// 记录当前货位的该商品数量 + String rackCode = "";// 商品的货架 + String positionCode = "";// 商品的货位 + if (orderStatus == 3) {// 商品已配货,则优先放到默认货位,在没有默认货位的情况下放回原货位 + // 查询出库仓的默认退货货架和货位 + sql = "select b.code as rackCode,c.code as positionCode from tb_storage a " + + "left JOIN tb_storage b on a.code=b.parent_code " + + "left JOIN tb_storage c on b.code=c.parent_code " + + "where a.code=? and c.default_flag=2 and a.company_code=?"; + ResultSet rs3 = null; + ps = conn.prepareStatement(sql); + ps.setString(1, ro.storageCode); + if ("".equals(obm_company_code)) { + // 如果不是代发商品 + ps.setString(2, company_code); + } else { + // 如果是代发商品 + ps.setString(2, obm_company_code); + } + rs3 = ps.executeQuery(); + if (rs3.next()) { + rackCode = rs3.getString("rackCode"); + positionCode = rs3.getString("positionCode"); + + sql = "select quantity from tb_commodity_position where position_code =? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, positionCode); + if ("".equals(obm_company_code)) { + // 如果不是代发商品 + ps.setString(2, commodity_code); + ps.setString(3, company_code); + } else { + // 如果是代发商品 + ps.setString(2, obm_commodity_code); + ps.setString(3, obm_company_code); + } + + rs1 = ps.executeQuery(); + if (rs1.next()) {// 对于该货位,已经存在的商品,直接更新数量 + // 更新库存 + int quantity_in = rs1.getInt("quantity");// 仓库现有商品数量 + currentQuantity = quantity_in;// 赋值给currentQuantity,方便库存流水记录用 + sql = "update tb_commodity_position set quantity=? where position_code=? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, quantity_in + quantity_out);// 还库存 + ps.setString(2, positionCode); + if ("".equals(obm_company_code)) { + ps.setString(3, commodity_code); + ps.setString(4, company_code); + } else { + ps.setString(3, obm_commodity_code); + ps.setString(4, obm_company_code); + } + + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } else { + currentQuantity = 0;// 赋值给currentQuantity,方便库存流水记录用 + // 写入库存 + sql = "insert into tb_commodity_position(code,commodity_code,company_code,storage_code,rack_code,position_code,quantity) values (?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + + ps.setString(1, "ZDHKC_" + storageOutOrderItemCode + "_" + count);// 还库存,ZDHKC:自动换库存 + if ("".equals(obm_company_code)) { + ps.setString(2, commodity_code); + ps.setString(3, company_code); + } else { + ps.setString(2, obm_commodity_code); + ps.setString(3, obm_company_code); + } + ps.setString(4, ro.storageCode); + ps.setString(5, rackCode); + ps.setString(6, positionCode); + ps.setInt(7, quantity_out); + + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + // 关闭rs3 + if (rs3 != null) { + try { + rs3.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + rs3 = null; + } + + } else {// 如果没有默认的退货货架货位,还是退回到原来的发货货位 + Map resultMap = returnGoods2OriginPosition(conn, ps, rs1, + commodity_position_code, obm_company_code, company_code, + obm_commodity_code, commodity_code, quantity_out); + currentQuantity = Integer.valueOf(resultMap.get("currentQuantity")); + rackCode = resultMap.get("rackCode"); + positionCode = resultMap.get("positionCode"); + } + } else {// 未配货,商品还在原货架,那么只需要将商品数量还回去就可以了 + Map resultMap = returnGoods2OriginPosition(conn, ps, rs1, + commodity_position_code, obm_company_code, company_code, obm_commodity_code, + commodity_code, quantity_out); + currentQuantity = Integer.valueOf(resultMap.get("currentQuantity")); + rackCode = resultMap.get("rackCode"); + positionCode = resultMap.get("positionCode"); + } + + // 如果还库存成功,写入仓库流水表 + sql = "insert into tb_storage_flow(code,commodity_code,company_code,commodity_model,current_quantity,quantity,type,order_code,storage_code,rack_code,position_code,user_id) values (?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, "ZDHKC_" + storageOutOrderItemCode + "_" + count);// 还库存,ZDHKC:自动换库存 + if ("".equals(obm_company_code)) { + ps.setString(2, commodity_code); + ps.setString(3, company_code); + } else { + ps.setString(2, obm_commodity_code); + ps.setString(3, obm_company_code); + } + ps.setString(4, ""); + ps.setInt(5, currentQuantity); + ps.setInt(6, quantity_out); + ps.setInt(7, 15); + ps.setString(8, ro.storageOutOrderCode); + ps.setString(9, ro.storageCode); + ps.setString(10, rackCode); + ps.setString(11, positionCode); + ps.setInt(12, 0); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 更新发票状态 + sql = "select status from tb_invoice where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + rs2 = ps.executeQuery(); + while (rs2.next()) { + sql = "update tb_invoice set status=4 where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + + // 更新售后状态 + String aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg,aftersale_type_id) values(?,?,?,?,0,?,?,?,?,4,?,1)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setString(9, entrust_msg); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + + // 更新订单表 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? , aftersale_number=?, lock_note=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 3); + ps.setInt(2, aftersale_seq + 1); + ps.setInt(3, ro.aftersaleNumber + 1); + ps.setString(4, ("".equals(ro.lockNote) ? "" : ro.lockNote + "|") + "自动退款"); + ps.setString(5, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + // 日志 + LOGGER.info("售后订单| [ {} ] 更新售后订单状态成功!", refundInfo.tid); + + } else if (ro.checkFlag != 2 && ro.autoRefundFlag == 2) { + if (isStorageOut(conn, ps, rs1, sale_order_code, refundInfo.company_code, aftersale_seq, + storageFlag, ro.aftersaleNumber, aftersale_reason_id, entrust_issuccess, + refundInfo, entrust_msg)) { + // 日志 + LOGGER.info("售后订单| [ {} ] 更新售后订单状态成功!", refundInfo.tid); + return true; + } else { + return false; + } + + } + count++; + } + if (!flag) { + return isStorageOut(conn, ps, rs1, sale_order_code, refundInfo.company_code, aftersale_seq, + storageFlag, ro.aftersaleNumber, aftersale_reason_id, entrust_issuccess, refundInfo, + entrust_msg); + } + + } + + } + } + return true; + + } catch (Exception e) { + LOGGER.error(this, e); + try { + LOGGER.info("售后订单事务执行异常,回滚| [ {} ] :{}", refundInfo.tid, e.toString()); + LOGGER.info("sql执行失败|{}", sql); + conn.rollback(); + } catch (SQLException e1) { + LOGGER.error(this, e); + LOGGER.info("回滚执行失败|{}", e1.toString()); + } catch (Exception e1) { + LOGGER.error(this, e1); + LOGGER.info("回滚执行失败|{}", e1.toString()); + } + return false; + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + rs = null; + } + if (rs1 != null) { + try { + rs1.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + rs1 = null; + } + if (rs2 != null) { + try { + rs2.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + rs2 = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + private Map returnGoods2OriginPosition(DruidPooledConnection conn, PreparedStatement ps, + ResultSet rs1, String commodity_position_code, String obm_company_code, String company_code, + String obm_commodity_code, String commodity_code, int quantity_out) throws Exception { + int currentQuantity = 0; + String rackCode = ""; + String positionCode = ""; + String sql = "select quantity,rack_code,position_code from tb_commodity_position where code =? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, commodity_position_code); + if ("".equals(obm_company_code)) { + // 如果不是代发商品 + ps.setString(2, commodity_code); + ps.setString(3, company_code); + } else { + // 如果是代发商品 + ps.setString(2, obm_commodity_code); + ps.setString(3, obm_company_code); + } + + rs1 = ps.executeQuery(); + if (rs1.next()) { + // 更新库存 + int quantity_in = rs1.getInt("quantity");// 仓库现有商品数量 + currentQuantity = quantity_in;// 赋值给currentQuantity,方便库存流水记录用 + rackCode = rs1.getString("rack_code"); + positionCode = rs1.getString("position_code"); + sql = "update tb_commodity_position set quantity=? where code=? and commodity_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, quantity_in + quantity_out);// 还库存 + ps.setString(2, commodity_position_code); + if ("".equals(obm_company_code)) { + ps.setString(3, commodity_code); + ps.setString(4, company_code); + } else { + ps.setString(3, obm_commodity_code); + ps.setString(4, obm_company_code); + } + + if (ps.executeUpdate() == 0) { + throw new RuntimeException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + Map resultMap = new HashMap(); + resultMap.put("currentQuantity", String.valueOf(currentQuantity)); + resultMap.put("rackCode", rackCode); + resultMap.put("positionCode", positionCode); + return resultMap; + } + + public HashMap sendInterceptToPLG(String orderId) { + HashMap returnMap = new HashMap(); + try { + String key = "JnNBxiJ"; + String warehouseCode = "PLGBF"; + // 验证内容:orderId+作废时间(yyyyMMddHHmm)+key+ warehouseCode + // Key= JnNBxiJ 作废时间=接口调用时间支持±1分钟的误差 加密算法为md5,加密后的md5值要大写 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + String cancelTime = sdf.format(new Date()); + MD5Util md5 = new MD5Util(); + String sourceToken = orderId + cancelTime + key + warehouseCode; + String token = md5.MD5(sourceToken).toUpperCase(); + HashMap map = new HashMap(); + map.put("token", token); + map.put("orderId", orderId); + map.put("warehouseCode", warehouseCode); + // map.put("cancelReason", "客户取消"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + HttpRequest httpRequest = new HttpRequest(); + + String result = httpRequest.sendPost(plg_url, json, 2, DataParse.class.getName()); + LOGGER.info("PLG拦截接口返回信息| {}", result); + HashMap resultMap = gson.fromJson(result, new TypeToken>() { + }.getType()); + boolean flag = false; + int code = -1; + if (resultMap.containsKey("flag")) { + String resultFlag = resultMap.get("flag"); + if ("success".equals(resultFlag)) { + flag = true; + } + } + if (resultMap.containsKey("code")) { + code = Integer.valueOf(resultMap.get("code")); + } + + returnMap.put("result", result); + if ((code >= 0 && flag) || code == -2) { + returnMap.put("flag", "true"); + } else { + returnMap.put("flag", "flase"); + } + } catch (Exception e) { + LOGGER.info("PLG拦截订单调用接口执行异常,订单号| [ {} ] :{}", orderId, e.toString()); + } + + return returnMap; + } + + /** + * 处理补偿和换货的售后订单,如果售后订单未发货,则锁定 + * + * @param conn + * @param ps + * @param rs + * @param last_aftersale_order_code + * @throws Exception + * @date 2019-10-10 + */ + private void lockCompensateAndExchangeGoodsOrder(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, + String last_aftersale_order_code) throws Exception { + ResultSet rs1 = null; + try { + String sql = "SELECT code as sale_order_code,aftersale_seq FROM tb_sale_order WHERE aftersale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, last_aftersale_order_code); + rs = ps.executeQuery(); + while (rs.next()) { + boolean is_storage_out = false;// 订单未出库 + String sale_order_code = rs.getString("sale_order_code"); + int aftersale_seq = rs.getInt("aftersale_seq"); + sql = "SELECT status FROM tb_storage_out_order WHERE sale_order_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + rs1 = ps.executeQuery(); + if (rs1.next()) { + int status = rs1.getInt("status"); + if (status >= 4) { + is_storage_out = true;// 已出库 + } + } + // 如果是未出库,则锁定该单 + if (!is_storage_out) { + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 2); + ps.setInt(2, aftersale_seq + 1); + ps.setString(3, sale_order_code); + if (ps.executeUpdate() == 0) { + throw new SQLException();// 此处不能用return返回,否则会造成数据的不一致 + } + } + + } + } finally { + // 关闭rs1 + if (rs1 != null) { + try { + rs1.close(); + } catch (SQLException e) { + LOGGER.error(this, e); + } catch (Exception e) { + LOGGER.error(this, e); + } + rs1 = null; + } + } + + } + + /** + * 对于未检测未出库售后订单处理 + * + * @param refundInfo + * @return + * @throws Exception + */ + public boolean isStorageOut(DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String sale_order_code, + String company_code, int aftersale_seq, boolean storageFlag, int aftersale_number, int aftersale_reason_id, + int entrust_issuccess, RefundInfo refundInfo, String entrust_msg) throws Exception { // 未检测,未发货,未出库 + // 更新发票状态 + String sql = ""; + sql = "select status from tb_invoice where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + rs = ps.executeQuery(); + while (rs.next()) { + sql = "update tb_invoice set status=4 where sale_order_code=? and company_code=?"; + ps = conn.prepareStatement(sql); + ps.setString(1, sale_order_code); + ps.setString(2, company_code); + if (ps.executeUpdate() == 0) { + return false; + } + } + + // 更新售后状态 + String aftersale_order_code = "SH" + (aftersale_seq + 1) + "_" + sale_order_code; + sql = "insert into tb_aftersale_order(code,aftersale_appeal_id,aftersale_reason_id,sale_order_code,user_id,company_code,first_note,platform_refund_code,entrust_issuccess,status,entrust_msg,aftersale_type_id) values(?,?,?,?,0,?,?,?,?,4,?,1)"; + ps = conn.prepareStatement(sql); + ps.setString(1, aftersale_order_code); + if (storageFlag) { + ps.setInt(2, 2); + } else { + ps.setInt(2, 1); + } + ps.setInt(3, aftersale_reason_id); + ps.setString(4, sale_order_code); + ps.setString(5, refundInfo.company_code); + ps.setString(6, refundInfo.desc); + ps.setString(7, String.valueOf(refundInfo.refund_id)); + if (entrust_issuccess == 0) { + ps.setString(8, null); + } + if (entrust_issuccess == 2) { + ps.setInt(8, 2); + } + if (entrust_issuccess == 1) { + ps.setInt(8, 1); + } + ps.setString(9, entrust_msg); + if (ps.executeUpdate() == 0) { + return false; + } + + // 更新订单表 + sql = "update tb_sale_order set aftersale_order_flag=2 ,del_flag=? , aftersale_seq=? , aftersale_number=? where code=?"; + ps = conn.prepareStatement(sql); + ps.setInt(1, 3); + ps.setInt(2, aftersale_seq + 1); + ps.setInt(3, aftersale_number + 1); + ps.setString(4, sale_order_code); + if (ps.executeUpdate() == 0) { + return false; + } + LOGGER.info("退款订单 [ {} ] 处理成功!", refundInfo.tid); + return true; + } + +} diff --git a/src/com/since/emp/service/ReplenishOrder.java b/src/com/since/emp/service/ReplenishOrder.java new file mode 100644 index 0000000..7ca0956 --- /dev/null +++ b/src/com/since/emp/service/ReplenishOrder.java @@ -0,0 +1 @@ +package com.since.emp.service; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.since.emp.newplatform.service.*; import com.since.emp.service.csv.CsvFileManageThread; import com.since.emp.service.csv.constants.Constants; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.alibaba.druid.pool.DruidPooledConnection; import com.google.gson.Gson; import com.since.emp.base.Config; import com.since.emp.base.DbPoolConnection; import com.since.emp.base.ImportExcelDataInfo; import com.since.emp.base.ImportParams; import com.since.emp.base.IniReader; import com.since.emp.base.OrderInfo; import com.since.emp.base.RecatchConfig; import com.since.emp.base.ReplenishInfo; import com.since.emp.base.ShopMessage; import com.since.emp.base.TradeInfo; import com.since.emp.base.constant.ProvinceConstant; import com.since.emp.base.thread.ScheduledThreadPool; import com.since.emp.base.thread.ThreadPool; import com.since.emp.exception.NoShopException; import com.since.emp.exception.TemplateException; import com.since.emp.util.ParseAddressUtil; public class ReplenishOrder extends OrderSyncs { private static final Logger logger = LogManager.getLogger(ReplenishOrder.class); private static final String EXCEL_XLS = "xls"; private static final String EXCEL_XLSX = "xlsx"; private static String config_filename = "config_all.ini"; private static String storageUpdateTime;// 库存同步更新间隔时间(分钟) private static String coverage;// 抓单统一回退时间,若有值,则统一按此时间,若无值,则按数据库设置的初始化时间 private static String import_file_path;// 导入文件路径 private static String stopStartTime;// 定时同步停止同步的起始时间 private static String stopEndTime;// 定时同步停止同步的结束时间 private static String accessKeyId;// 京东虎符鼎外APPKEY private static String secretKey;// 京东虎符鼎外APPSERCET private static String endpoint;// 京东虎符调用地址 private static String customerId;// 京东虎符客户编号 private static ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 private static ScheduledThreadPoolExecutor scheduledThreadPool; private static boolean readDataFlag = true;// 数据库待处理补录任务是否读取完毕标志 /** * main * * @param args */ public static void main(String[] args) { recatchConfig = new RecatchConfig(); provinceDic(); // 读取文件配置 if (initFileConfig() == false) { logger.info("[ 初始化 ] 文件读取配置失败时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); return; } logger.info("[ 初始化 ] 文件读取配置成功时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 从数据库读取各app及店铺参数 try { getConfigFromDB(); } catch (Exception e) { logger.error("[ 初始化 ] 数据库读取配置失败时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); logger.error(ReplenishOrder.class, e); return; } logger.info("[ 初始化 ] 数据库读取配置成功时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); if (storageUpdateTime == null || "".equals(storageUpdateTime)) { logger.info("[ 初始化 ] storageUpdateTime为空,请确认已填写!时间->{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, stopStartTime, stopEndTime); storageUpdate.start(); // 数据处理类启动 dataParse = new DataParse(); dataParse.start(); submitLog = new SubmitLog(); submitLog.start(); /** * 启动补抓及导入线程 */ // threadPool = ThreadPool.getInstance(); scheduledThreadPool = ScheduledThreadPool.getInstance(); ImportTradesTread it = new ReplenishOrder().new ImportTradesTread(); scheduledThreadPool.scheduleAtFixedRate(it, 0, 10000, TimeUnit.MILLISECONDS); } /** * 补抓单及导入订单定时任务 * * @author Lewis */ private class ImportTradesTread extends Thread { @Override public void run() { try { threadPool = ThreadPool.getInstance(); if (readDataFlag) { readDataFlag = false; DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; PreparedStatement ps = null; ResultSet rs = null; ArrayList importList = new ArrayList(); String replenish_code = ""; try { conn = dbpc.getConnection(); /** * 分别布置在阿里和京东服务器,阿里负责处理除京东外的所有平台,京东服务器只负责京东的单个补抓和按时间补抓 */ String sql = ""; // if (config.plats.size() == 1) { sql = "select a.code,a.shop_code,a.platform_num,a.begin_time,a.end_time," + "a.status,a.in_path,b.platform_code,a.company_code,a.obm_company_code,a.type,c.once_max_replenish_order_count " + "from tb_replenish_order a left join tb_shop b on a.shop_code=b.code left join tb_company c on a.company_code = c.code where a.status=1"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { String shop_code = rs.getString("shop_code") == null ? "" : rs.getString("shop_code"); String code = rs.getString("code"); String platform_code = rs.getString("platform_code") == null ? "" : rs.getString("platform_code"); String platform_num = rs.getString("platform_num") == null ? "" : rs.getString("platform_num"); String begin_time = rs.getString("begin_time") == null ? "" : rs.getString("begin_time"); String end_time = rs.getString("end_time") == null ? "" : rs.getString("end_time"); String in_path = rs.getString("in_path") == null ? "" : rs.getString("in_path"); String company_code = rs.getString("company_code") == null ? "" : rs.getString("company_code"); String obm_company_code = rs.getString("obm_company_code") == null ? "" : rs.getString("obm_company_code"); /** * 将status为1的全部改为2 */ int type = rs.getInt("type"); int once_max_replenish_order_count = rs.getInt("once_max_replenish_order_count"); sql = "update tb_replenish_order set status = 2 where code=" + code; ps = conn.prepareStatement(sql); int result_num = ps.executeUpdate(); if (result_num == 0) { continue; } /** * 更新成功的条目加入集合 */ ImportParams ip = new ImportParams(); ip.code = code; ip.shop_code = shop_code; ip.platform_num = platform_num.trim(); ip.begin_time = begin_time; ip.end_time = end_time; ip.in_path = in_path; ip.platform_code = platform_code; ip.company_code = company_code; ip.obm_company_code = obm_company_code; ip.type = type; ip.once_max_replenish_order_count = once_max_replenish_order_count; importList.add(ip); } readDataFlag = true;// 等所有状态为1的条目更新过之后,就可以允许再次查询了 for (int i = 0; i < importList.size(); i++) { ImportParams ip = importList.get(i); replenish_code = ip.code; if (!"".equals(ip.platform_num) || (!"".equals(ip.begin_time) && !"".equals(ip.end_time))) { RecatchConfig recatchConfig = new RecatchConfig(); recatchConfig.shop_code = ip.shop_code; recatchConfig.starTime = ip.begin_time; recatchConfig.endTime = ip.end_time; recatchConfig.orderId = ip.platform_num; recatchConfig.platform_code = ip.platform_code; recatchConfig.type = ip.type; recatchConfig.once_max_replenish_order_count = ip.once_max_replenish_order_count; if (!"".equals(ip.platform_num)) { recatchConfig.type = 1; } if (!"".equals(ip.begin_time) && !"".equals(ip.end_time)) { recatchConfig.type = ip.type; } recatchConfig.replenish_code = ip.code; if ("001".equals(recatchConfig.platform_code) || "012".equals(recatchConfig.platform_code)) { recatchConfig.platform_code = "002"; } PlatConfig pc1 = new PlatConfig(); pc1 = getConfigFromDB(conn, ps, recatchConfig); if (pc1 == null) { sql = "update tb_replenish_order set result = ?,status=3 where code=" + ip.code; ps = conn.prepareStatement(sql); ps.setString(1, "店铺授权或抓单开关未开启"); ps.executeUpdate(); continue; } if (!"".equals(ip.platform_num) && ("002".equals(ip.platform_code) || "003".equals(ip.platform_code)) && !StringUtils.isNumeric(ip.platform_num)) { sql = "update tb_replenish_order set result = ?,status=3 where code=" + ip.code; ps = conn.prepareStatement(sql); ps.setString(1, "订单号格式错误,应为纯数字"); ps.executeUpdate(); continue; } RecatchOrders ro = new RecatchOrders(pc1, recatchConfig, replenish_code); threadPool.execute(ro); } /** * 如果路径不为空,则为导入操作 csv文件启动csv处理类 */ if (StringUtils.isBlank(ip.in_path)) { return; } if (ip.in_path.endsWith(Constants.CSV_FILE_SUFFIX)) { logger.info("开始解析csv文件..."); CsvFileManageThread thread = new CsvFileManageThread(import_file_path,ip); threadPool.execute(thread); } else if (ip.in_path.endsWith(EXCEL_XLS) || ip.in_path.endsWith(EXCEL_XLSX)) { ImportByExcelThread ibet = new ImportByExcelThread(ip); threadPool.execute(ibet); } } } catch (Exception e) { logger.error(ReplenishOrder.class, e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } rs = null; } if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } ps = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } conn = null; } dbpc = null; } } } catch (Throwable e) { logger.error(ReplenishOrder.class, e); } } private class ImportByExcelThread extends Thread { XSSFWorkbook workbook; ImportParams ip; public ImportByExcelThread(ImportParams ip) { this.ip = ip; } @Override public void run() { importByExcel(); } public synchronized void importByExcel() { // String replenish_code = ip.code; FileInputStream is = null; ImportExcelDataInfo standardMode2ReadExcel = null; ImportExcelDataInfo simpleMode2ReadExcel = null; ImportExcelDataInfo ddMode2ReadExcel = null; ArrayList list = null; ArrayList tradeList; int templateStatus = 0;// 建议模式:1,标准模式:2,滴滴:3 try { File excelFile = new File(import_file_path + ip.in_path); // 创建文件对象 // // 创建文件对象 logger.info("开始导入文件,文件路径:{}", import_file_path + ip.in_path); is = new FileInputStream(excelFile); // 文件流 checkExcelVaild(excelFile); workbook = new XSSFWorkbook(is); String out_path = ip.in_path.trim().replace(".xlsx", "_error.xlsx"); logger.info("错误文件的输出路径:{}", import_file_path + out_path); /** * 将文件复制一份 */ copyFile(new File(import_file_path + ip.in_path), new File(import_file_path + out_path)); /** * 设置当前excel中sheet的下标:0开始 */ Sheet sheet = workbook.getSheetAt(0); // 遍历第一个Sheet // 总行数 int rowLength = sheet.getLastRowNum() + 1; // 工作表的行 Row row = sheet.getRow(0); // 总列数,取第二行的数据 int colLength = sheet.getRow(2).getLastCellNum() + 1; // 得到指定的单元格 Cell cell = row.getCell(0); // 获取0,0坐标的单元格,得到模板的模式 String templateType = cell.getStringCellValue().trim(); if ("简易".equals(templateType)) { templateStatus = 1; simpleMode2ReadExcel = simpleMode2ReadExcel(sheet, row, rowLength, colLength, cell, out_path, ip); list = simpleMode2ReadExcel.getList(); tradeList = simpleMode2ReadExcel.getTradeList(); if (simpleMode2ReadExcel.getErrorRow() > 0) { throw new Exception(); } } else if ("".equals(templateType)) { templateStatus = 2; standardMode2ReadExcel = standardMode2ReadExcel(sheet, row, rowLength, colLength, cell, out_path, ip); list = standardMode2ReadExcel.getList(); tradeList = standardMode2ReadExcel.getTradeList(); if (standardMode2ReadExcel.getErrorRow() > 0) { throw new Exception(); } } else if ("滴滴".equals(templateType)) { templateStatus = 3; ddMode2ReadExcel = ddMode2ReadExcel(sheet, row, rowLength, colLength, cell, out_path, ip); list = ddMode2ReadExcel.getList(); tradeList = ddMode2ReadExcel.getTradeList(); if (ddMode2ReadExcel.getErrorRow() > 0) { throw new Exception(); } } else { throw new TemplateException("没有在第一行的第一个单元格设置类型"); } /** * 读取文件,倒序从表格的底部开始删除没有问题的行 */ int error_count = 0; XSSFWorkbook xw = null; FileInputStream fis = null; XSSFSheet xs = null; FileOutputStream fos = null; try { fis = new FileInputStream(import_file_path + out_path); xw = new XSSFWorkbook(fis); xs = xw.getSheetAt(0); boolean original_falg = false; for (int l = list.size() - 1; l >= 0; l--) { ReplenishInfo ri = list.get(l); if (!ri.error_flag && !original_falg) { removeRow(xs, ri.row_num); } else { error_count++; original_falg = !ri.original_trade; if (!"".equals(ri.error_msg)) { xs.getRow(ri.row_num).createCell(colLength + 1); xs.getRow(ri.row_num).getCell(colLength + 1).setCellValue(ri.error_msg); } } } fos = new FileOutputStream(import_file_path + out_path); xw.write(fos); } catch (Exception e) { e.printStackTrace(); } finally { if (xw != null) { xw.close(); } xw = null; if (fis != null) { fis.close(); } fis = null; if (fos != null) { fos.close(); } fos = null; } int tradeListSize = tradeList.size(); if (tradeListSize == 0) { if (error_count == 0) { if (rowLength <= 3) { OrderSyncs.updateReplenishResult(ip.code, "失败", "文件为空"); } else { OrderSyncs.updateReplenishResult(ip.code, "成功", ""); } } else { OrderSyncs.updateReplenishResult(ip.code, "失败", out_path); } } for (int j = 0; j < tradeListSize; j++) { TradeInfo trade = tradeList.get(j); // 补充设置订单的导入模式 if (templateStatus == 1) { trade.templateStatus = 1; } if (templateStatus == 2) { trade.templateStatus = 2; } if (templateStatus == 3) { trade.templateStatus = 3; } trade.out_path = import_file_path + out_path; trade.export_file_path = import_file_path + ip.in_path; OrderSyncs.dataParse.tradeQueue.add(trade); if (j == tradeListSize - 1) { if (error_count == 0) { OrderSyncs.updateReplenishResult(ip.code, "成功", ""); } else { OrderSyncs.updateReplenishResult(ip.code, "失败", out_path); } } } } catch (NoShopException e) { OrderSyncs.updateReplenishResult(ip.code, e.getMessage(), ""); logger.error(ReplenishOrder.class, e); } catch (TemplateException e) { OrderSyncs.updateReplenishResult(ip.code, e.getMessage(), ""); logger.error(ReplenishOrder.class, e); } catch (FileNotFoundException e) { OrderSyncs.updateReplenishResult(ip.code, "没有找到提交的表格文件,请联系ERP供应商", ""); logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(this, e); switch (templateStatus) { case 1: OrderSyncs.updateReplenishResult(ip.code, "订单表第[" + simpleMode2ReadExcel.getErrorRow() + "]行的数据[" + standardMode2ReadExcel.getErrorTitle() + "]数据异常,请检查后重试!", ""); break; case 2: OrderSyncs.updateReplenishResult(ip.code, "订单表第[" + standardMode2ReadExcel.getErrorRow() + "]行的数据[" + standardMode2ReadExcel.getErrorTitle() + "]数据异常,请检查后重试!", ""); break; case 3: OrderSyncs.updateReplenishResult(ip.code, "订单表第[" + ddMode2ReadExcel.getErrorRow() + "]行的数据[" + standardMode2ReadExcel.getErrorTitle() + "]数据异常,请检查后重试!", ""); break; default: break; } } finally { if (is != null) { try { is.close(); } catch (IOException e) { logger.error(this, e); } } if (workbook != null) { try { workbook.close(); } catch (IOException e) { logger.error(this, e); } } } } } /** * @Description: 解析标准模式的订单模板 * @Title: standardMode2ReadExcel * @author Lewis * @param sheet * @param row * @param rowLength * @param colLength * @param cell * @param out_path * @param ip * @return 封装的对象 */ private ImportExcelDataInfo standardMode2ReadExcel(Sheet sheet, Row row, int rowLength, int colLength, Cell cell, String out_path, ImportParams ip) { ImportExcelDataInfo importExcelDataInfo = new ImportExcelDataInfo(); TradeInfo tradeInfo = null; ArrayList list = new ArrayList(); boolean file_error_flag = false;// 文件中是否有错误 ArrayList tradeList = new ArrayList(); NumberFormat nf = NumberFormat.getInstance(); String errorTitle = ""; // 记录错误行号 int errorRow = 0; try { for (int k = 3; k < rowLength; k++) { row = sheet.getRow(k); errorRow = k + 1; if (null == row) { continue; } /** * 第一行如果没有shop_code,那么属于错误数据,直到有shop_code才能开始写入, * 如果前一行已经有了shop_code,后面没有,那么属于商品子条目 */ // 开始判断当前行 if (null == row.getCell(1) || "BLANK".equals(row.getCell(1).getCellTypeEnum().toString())) { /** * 当前订单为新订单但是没有店铺编号 */ if ("EffectiveValue".equals(checkCellValue(row, 3)) || "EffectiveValue".equals(checkCellValue(row, 4)) || "EffectiveValue".equals(checkCellValue(row, 5)) || "EffectiveValue".equals(checkCellValue(row, 6)) || "EffectiveValue".equals(checkCellValue(row, 7)) || "EffectiveValue".equals(checkCellValue(row, 9)) || "EffectiveValue".equals(checkCellValue(row, 12)) || "EffectiveValue".equals(checkCellValue(row, 13)) || "EffectiveValue".equals(checkCellValue(row, 14)) || "EffectiveValue".equals(checkCellValue(row, 15)) || "EffectiveValue".equals(checkCellValue(row, 17)) || "EffectiveValue".equals(checkCellValue(row, 31))) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "有必填项为空,如果该行是空的,请删除"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; continue; } /** * 当前订单为新订单但是没有店铺编码 */ if (tradeInfo == null || file_error_flag) { ReplenishInfo ri = new ReplenishInfo(); if (tradeInfo == null) { ri.original_trade = true; ri.error_msg = "订单没有店铺编码"; } ri.row_num = k; ri.error_flag = true; list.add(ri); continue; } /** * 没有平台商家编码 当前订单为新订单 将上一条订单信息提交 * */ if (row.getCell(34) == null || "BLANK".equals(row.getCell(34).getCellTypeEnum().toString())) { /** * TODO * * 订单提交到集合处理 * * */ ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "有必填项为空,如果该行是空的,请删除"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; continue; } tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); tradeInfo.orders[tradeInfo.orders.length - 1] = new OrderInfo(); tradeInfo.orders[tradeInfo.orders.length - 1].discount_fee = "0"; tradeInfo.orders[tradeInfo.orders.length - 1].adjust_fee = "0"; boolean breakFlag = false; for (int j = 0; j < colLength; j++) { cell = row.getCell(j); // Row row2 = sheet.getRow(2); // Cell cell2 = row2.getCell(j); // errorTitle = cell2.getStringCellValue(); switch (j) { case 34: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code = row .getCell(j).getStringCellValue().trim(); if ("".equals( tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "平台商家处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code = nf .format(row.getCell(j).getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "平台商家编码格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有平台商家编码"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } break; case 35: tradeInfo.orders[tradeInfo.orders.length - 1].title = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].title = row.getCell(j) .getStringCellValue().trim(); } } break; case 36: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].price = nf .format(row.getCell(j).getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[tradeInfo.orders.length - 1].price = row.getCell(j) .getStringCellValue().trim(); if (!StringUtils .isNumeric(tradeInfo.orders[tradeInfo.orders.length - 1].price)) { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有商品金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } break; case 37: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].num = (int) row.getCell(j) .getNumericCellValue(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品数量格式"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有商品数量"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } tradeInfo.orders[tradeInfo.orders.length - 1].total_fee = String .valueOf(Double.valueOf(tradeInfo.orders[tradeInfo.orders.length - 1].price) * tradeInfo.orders[tradeInfo.orders.length - 1].num); break; case 38: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = nf .format(row.getCell(j).getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = row.getCell(j) .getStringCellValue().trim(); if (!StringUtils.isNumeric( tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } tradeInfo.orders[tradeInfo.orders.length - 1].payment = tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有商品金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } break; default: break; } // 如果上面表格内容有异常值则退出本次循环 if (breakFlag) { break; } if (j == colLength - 1) { addList(list, k, false); } } } else { /** * TODO bug 若订单第一行信息正确 但是在接下来的商品信息有误时会将上一条有问题的订单添加至队列 删除信息时会将正确的订单信息行删除 * * * 如果该行的店铺编码不为空,上一个订单已经读取完毕,当前读取的是一条新的订单信息,将上一个订单放入集合 * * * 有多种商品的订单 || 只有一种商品的订单 */ if (tradeInfo != null) { tradeList.add(tradeInfo); } tradeInfo = new TradeInfo(); file_error_flag = false; tradeInfo.orders = new OrderInfo[1]; tradeInfo.orders[0] = new OrderInfo(); tradeInfo.orders[0].discount_fee = "0"; tradeInfo.orders[0].total_fee = "0"; tradeInfo.orders[0].adjust_fee = "0"; tradeInfo.orders[0].sku_id = ""; tradeInfo.post_fee = "0"; tradeInfo.trade_type2 = 2; tradeInfo.row_num = k; tradeInfo.export_file_path = import_file_path; tradeInfo.out_path = out_path; tradeInfo.replenish_code = ip.code; // 循环结束标志 boolean breakFlag = false; sign_row: for (int j = 1; j < colLength; j++) { cell = row.getCell(j); // Row row2 = sheet.getRow(2); // Cell cell2 = row2.getCell(j); // errorTitle = cell2.getStringCellValue(); switch (j) { case 1: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.shop_code = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.shop_code = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.shop_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码格式错误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有店铺编码"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } // Druid连接池管理数据库连接 DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = dbpc.getConnection(); String sql = "select a.order_sync_lock_flag,a.order_sync_lock_keyword,a.storage_code,a.platform_code,a.delivery_mode_id,a.company_code,b.type from tb_shop a,tb_company b where a.code=? and a.company_code=b.code"; ps = conn.prepareStatement(sql); ps.setString(1, tradeInfo.shop_code); rs = ps.executeQuery(); if (rs.next()) { tradeInfo.company_code = rs.getString("company_code"); if (!ip.company_code.equals(tradeInfo.company_code) && !ip.obm_company_code.equals(tradeInfo.company_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码不存在或不属于该公司"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break sign_row; } tradeInfo.delivery_mode_id = rs.getInt("delivery_mode_id"); tradeInfo.storage_code = rs.getString("storage_code"); tradeInfo.company_type = rs.getInt("type"); tradeInfo.obm_company_code = ""; tradeInfo.platform_code = rs.getString("platform_code"); tradeInfo.shopMessage = new ShopMessage(); int orderSyncLockFlag = rs.getInt("order_sync_lock_flag"); String orderSyncLocKeyword = rs.getString("order_sync_lock_keyword") == null ? "" : rs.getString("order_sync_lock_keyword"); tradeInfo.shopMessage.setOrder_sync_lock_flag(orderSyncLockFlag); tradeInfo.shopMessage.setOrder_sync_lock_keyword(orderSyncLocKeyword); if ("001".equals(tradeInfo.platform_code) || "012".equals(tradeInfo.platform_code)) { tradeInfo.platform_code = "002"; } if ("002".equals(tradeInfo.platform_code)) { tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码不存在"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } catch (Exception e) { logger.error(ReplenishOrder.class, e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } rs = null; } if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } ps = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } conn = null; } dbpc = null; } break; case 2: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tid = nf.format(cell.getNumericCellValue()).replace(",", "").trim(); } else { tradeInfo.tid = cell.getStringCellValue().trim(); } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有平台订单号"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 3: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.product_fee = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { tradeInfo.product_fee = cell.getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.product_fee)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单总金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有订单总金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 4: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.num = (int) cell.getNumericCellValue(); } else { if (StringUtils.isNumeric(cell.getStringCellValue())) { tradeInfo.num = Integer.valueOf(cell.getStringCellValue().trim()); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单数量不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有订单商品总数"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 5: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.money = nf.format(cell.getNumericCellValue()).replace(",", "").trim(); } else { tradeInfo.money = cell.getStringCellValue(); if (!StringUtils.isNumeric(tradeInfo.money)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单实收金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } tradeInfo.pay_money = tradeInfo.money; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有实收金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 6: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.discount_fee = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { tradeInfo.discount_fee = cell.getStringCellValue(); if (!StringUtils.isNumeric(tradeInfo.discount_fee)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单优惠金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } tradeInfo.adjust_fee = "0"; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有优惠金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 7: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.pay_time = sdf .format(cell.getDateCellValue()); } else if ("STRING".equals(cell.getCellTypeEnum().toString())){ try { String payTime = cell.getStringCellValue().trim(); sdf.parse(payTime); tradeInfo.pay_time = payTime; } catch (Exception e) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有付款时间"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 8: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.created = sdf .format(cell.getDateCellValue()); } else if ("STRING".equals(cell.getCellTypeEnum().toString())){ try { String payTime = cell.getStringCellValue().trim(); sdf.parse(payTime); tradeInfo.pay_time = payTime; } catch (Exception e) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "创建时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { tradeInfo.created = tradeInfo.pay_time; } break; case 9: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_name)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人姓名"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 10: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_phone = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_phone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_phone = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { tradeInfo.receiver_phone = ""; } break; case 11: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString()) && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_mobile)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人手机处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人手机格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } if (null == tradeInfo.receiver_mobile) { tradeInfo.receiver_mobile = ""; } if (!checkMobileNumber(tradeInfo.receiver_mobile) && !"".equals(tradeInfo.receiver_mobile)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人手机格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 tradeInfo.receiver_mobile = ""; } if ("".equals(tradeInfo.receiver_phone) && "".equals(tradeInfo.receiver_mobile)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人手机和电话不能同时为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } if ("".equals(tradeInfo.receiver_phone)) { tradeInfo.receiver_phone = null; } if ("".equals(tradeInfo.receiver_mobile)) { tradeInfo.receiver_mobile = null; } break; case 12: tradeInfo.receiver_country = "中国"; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_state = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_state)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货省份处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } tradeInfo.receiver_state = tradeInfo.receiver_state.trim(); int unknowPrivinceCount = 0; boolean errorPrivinceFlag = false; for (Entry privinceEntry : ProvinceConstant.privince .entrySet()) { String privinceName = privinceEntry.getKey(); if (privinceName.indexOf(tradeInfo.receiver_state) > -1) { if (privinceName.equals(tradeInfo.receiver_state)) { break; } else { errorPrivinceFlag = true; ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货省份请写入标准格式:" + privinceName; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 统计省份未匹配的次数 unknowPrivinceCount++; } } // 省份书写不完整 if (errorPrivinceFlag) { break; } if (unknowPrivinceCount == ProvinceConstant.privince.size()) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "请选择标准格式的省级名称:\"北京\",\"上海\",\"天津\",\"重庆\",\"辽宁省\",\"湖北省\",\"山西省\",\"福建省\",\"青海省\",\"江西省\",\"河南省\",\"浙江省\",\"吉林省\",\"安徽省\",\"海南省\",\"四川省\",\"黑龙江省\",\"云南省\",\"贵州省\",\"江苏省\",\"陕西省\",\"广东省\",\"河北省\",\"湖南省\",\"甘肃省\",\"山东省\",\"西藏自治区\",\"广西壮族自治区\",\"宁夏回族自治区\",\"新疆维吾尔自治区\",\"内蒙古自治区\",\"香港特别行政区\",\"澳门特别行政区\",\"台湾\",\"海外\""; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人所在省份格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人所在省份"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 13: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_city = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_city)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货城市处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人所在城市格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人城市"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } break; case 14: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_district = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_district)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货区县处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人区/县格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人区/县"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 15: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_address = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_address)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货详细地址处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人详细地址格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + tradeInfo.receiver_district + " " + tradeInfo.receiver_address; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人详细地址"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } break; case 16: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_zip = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人邮编格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } } else { tradeInfo.receiver_zip = ""; } break; case 17: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.post_fee = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "运费格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "运费为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 18: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_type = (int) cell.getNumericCellValue(); if (tradeInfo.invoice_type == 0) { tradeInfo.invoice_content = ""; tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.tax_id = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; } else { if (tradeInfo.invoice_type != 5 && tradeInfo.invoice_type != 6 && tradeInfo.invoice_type != 7) { tradeInfo.invoice_type = 0; tradeInfo.invoice_content = ""; tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.tax_id = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; } } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票类型格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } } else { tradeInfo.invoice_type = 0; tradeInfo.invoice_content = ""; tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.tax_id = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; } break; case 27: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.status = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.status)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单状态处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单状态格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有订单状态"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 28: tradeInfo.title = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.title = cell.getStringCellValue().trim(); } } break; case 29: tradeInfo.type = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.type = row.getCell(j).getStringCellValue().trim(); } } break; case 30: tradeInfo.buyer_message = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.buyer_message = cell.getStringCellValue().trim(); } } break; case 31: tradeInfo.seller_memo = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.seller_memo = cell.getStringCellValue().trim(); } } break; case 32: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.test_flag = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.test_flag)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "是否测试选项处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } if (!"是".equals(tradeInfo.test_flag) && !"否".equals(tradeInfo.test_flag)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "是否测试选项输入有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "是否测试选项输入有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "是否测试选项为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 34: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.orders[0].platform_seller_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = nf.format(cell.getNumericCellValue()) .replace(",", ""); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 35: tradeInfo.orders[0].title = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].title = cell.getStringCellValue().trim(); } } break; case 36: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].price = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[0].price = cell.getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.orders[0].price)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 37: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].num = (int) cell.getNumericCellValue(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } tradeInfo.orders[0].total_fee = String .valueOf(Double.valueOf(tradeInfo.orders[0].price) * tradeInfo.orders[0].num); break; case 38: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = nf .format(cell.getNumericCellValue()).replace(",", ""); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = cell .getStringCellValue().trim(); if (!StringUtils.isNumeric( tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } tradeInfo.orders[tradeInfo.orders.length - 1].payment = tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; default: break; } // 有异常值退出循环 if (breakFlag) { break; } if (tradeInfo.invoice_type == 5 || tradeInfo.invoice_type == 6) { tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; boolean invoiceBreakFlag = false; switch (j) { case 19: tradeInfo.invoice_content = ""; tradeInfo.tax_id = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_title = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_title)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 20: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tax_id = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.tax_id)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "纳税人识别号处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tax_id = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "纳税人识别号格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 21: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_content = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_content)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 26: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_money = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.invoice_money = cell.getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.invoice_money)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } break; default: break; } if (invoiceBreakFlag) { break; } } if (tradeInfo.invoice_type == 7) { // 异常值退出标志 boolean invoiceBreakFlag = false; switch (j) { case 19: tradeInfo.invoice_content = ""; tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.tax_id = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_title = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_title)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票抬头格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; invoiceBreakFlag = true; break; } } break; case 20: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tax_id = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.tax_id)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "纳税人识别号处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tax_id = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "纳税人识别号格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 21: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_content = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_content)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票信息处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票信息格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; invoiceBreakFlag = true; break; } } break; case 22: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_email = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_email)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收邮箱处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } if (!checkEmail(tradeInfo.invoice_email)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收邮箱格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_email = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); if (!checkEmail(tradeInfo.invoice_email)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收邮箱格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收邮箱格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 23: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_phone = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.invoice_phone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收手机处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } if (!checkMobileNumber(tradeInfo.invoice_phone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收手机格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_phone = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); if (!checkMobileNumber(tradeInfo.invoice_phone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收手机格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "发票接收手机格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 24: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.address_telephone = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.address_telephone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "增值税发票地址、电话信息处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "增值税发票地址、电话信息格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 25: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.bank_of_deposit_account_number = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.bank_of_deposit_account_number)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "增值税发票开户行及账号信息处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "增值税发票开户行及账号信息格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } break; case 26: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.invoice_money = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.invoice_money = cell.getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.invoice_money)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "开票金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; invoiceBreakFlag = true; break; } break; default: break; } if (invoiceBreakFlag) { break; } } if (j == colLength - 1) { // 记录没有错误的 list = addList(list, k, true); } } } /** * TODO 当前为最后一行订单数据 添加至队列 */ if (tradeInfo != null && tradeInfo.pay_time != null && k == rowLength - 1) { tradeList.add(tradeInfo); } } } catch (Exception e) { importExcelDataInfo.setErrorRow(errorRow); importExcelDataInfo.setErrorTitle(errorTitle); logger.error(this, e); } importExcelDataInfo.setList(list); importExcelDataInfo.setTradeList(tradeList); return importExcelDataInfo; } /** * @Description: 解析简易模式的订单模板 * @Title: standardMode2ReadExcel * @author Lewis * @param sheet * @param row * @param rowLength * @param colLength * @param cell * @param out_path * @param ip * @return 封装的对象 */ private ImportExcelDataInfo simpleMode2ReadExcel(Sheet sheet, Row row, int rowLength, int colLength, Cell cell, String out_path, ImportParams ip) throws Exception { ImportExcelDataInfo importExcelDataInfo = new ImportExcelDataInfo(); TradeInfo tradeInfo = null; ArrayList list = new ArrayList(); boolean file_error_flag = false;// 文件中是否有错误 ArrayList tradeList = new ArrayList(); NumberFormat nf = NumberFormat.getInstance(); String errorTitle = ""; // 记录错误行号 int errorRow = 0; try { for (int k = 2; k < rowLength; k++) { row = sheet.getRow(k); errorRow = k + 1; if (null == row) { continue; } // TradeInfo tradeInfo = null; /** * 第一行如果没有shop_code,那么属于错误数据,直到有shop_code才能开始写入, * 如果前一行已经有了shop_code,后面没有,那么属于商品子条目 */ // 开始判断当前行 if (null == row.getCell(1) || "BLANK".equals(row.getCell(1).getCellTypeEnum().toString())) { /** * 当前订单为新订单但是没有店铺编号 */ if ("EffectiveValue".equals(checkCellValue(row, 2)) || "EffectiveValue".equals(checkCellValue(row, 4)) || "EffectiveValue".equals(checkCellValue(row, 5)) || "EffectiveValue".equals(checkCellValue(row, 6)) || "EffectiveValue".equals(checkCellValue(row, 7))) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "有必填项为空,如果该行是空的,请删除"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; continue; } /** * 当前订单为新订单但是没有店铺编码 */ if (tradeInfo == null || file_error_flag) { ReplenishInfo ri = new ReplenishInfo(); if (tradeInfo == null) { ri.original_trade = true; ri.error_msg = "订单没有店铺编码"; } ri.row_num = k; ri.error_flag = true; list.add(ri); continue; } /** * 没有平台商家编码 当前订单为新订单 将上一条订单信息提交 * */ if (row.getCell(9) == null || "BLANK".equals(row.getCell(9).getCellTypeEnum().toString())) { /** * TODO * * 订单提交到集合处理 * * */ if (tradeInfo != null) { tradeList.add(tradeInfo); } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "有必填项为空,如果该行是空的,请删除"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; continue; } tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); tradeInfo.orders[tradeInfo.orders.length - 1] = new OrderInfo(); tradeInfo.orders[tradeInfo.orders.length - 1].discount_fee = "0"; tradeInfo.orders[tradeInfo.orders.length - 1].adjust_fee = "0"; boolean breakFlag = false; for (int j = 0; j < colLength; j++) { cell = row.getCell(j); switch (j) { case 9: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code = row .getCell(j).getStringCellValue().trim(); tradeInfo.orders[tradeInfo.orders.length - 1].title = ""; if ("".equals( tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "平台商家处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].platform_seller_code = nf .format(row.getCell(j).getNumericCellValue()).replace(",", "").trim(); tradeInfo.orders[tradeInfo.orders.length - 1].title = ""; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "平台商家编码格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有平台商家编码"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } break; case 10: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].num = (int) row.getCell(j) .getNumericCellValue(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品数量格式"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有商品数量"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } break; case 11: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = nf.format(row.getCell(j).getNumericCellValue()) .replace(",", "").trim(); // tradeInfo.orders[tradeInfo.orders.length // - 1].price = String.valueOf(new BigDecimal(tradeInfo.orders[tradeInfo.orders.length // - 1].divide_order_fee).divide(new BigDecimal(tradeInfo.orders[tradeInfo.orders.length - 1].num))); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = row.getCell(j).getStringCellValue().trim(); if (!StringUtils .isNumeric(tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee)) { ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.error_msg = "没有商品金额"; ri.row_num = k; ri.error_flag = true; list.add(ri); tradeInfo = null; breakFlag = true; break; } // tradeInfo.orders[tradeInfo.orders.length // - 1].payment = tradeInfo.orders[tradeInfo.orders.length - 1].total_fee = String // .valueOf(Double // .valueOf(tradeInfo.orders[tradeInfo.orders.length - 1].price) // * tradeInfo.orders[tradeInfo.orders.length - 1].num); break; default: break; } // 如果上面表格内容有异常值则退出本次循环 if (breakFlag) { break; } if (j == colLength - 1) { addList(list, k, false); } } } else { /** * TODO bug 若订单第一行信息正确 但是在接下来的商品信息有误时会将上一条有问题的订单添加至队列 删除信息时会将正确的订单信息行删除 * * * 如果该行的店铺编码不为空,上一个订单已经读取完毕,当前读取的是一条新的订单信息,将上一个订单放入集合 * * * 有多种商品的订单 || 只有一种商品的订单 */ if (tradeInfo != null) { tradeList.add(tradeInfo); } tradeInfo = new TradeInfo(); file_error_flag = false; tradeInfo.orders = new OrderInfo[1]; tradeInfo.orders[0] = new OrderInfo(); tradeInfo.orders[0].discount_fee = "0"; tradeInfo.orders[0].total_fee = "0"; tradeInfo.orders[0].adjust_fee = "0"; tradeInfo.orders[0].sku_id = ""; tradeInfo.post_fee = "0"; tradeInfo.trade_type2 = 2; tradeInfo.row_num = k; tradeInfo.export_file_path = import_file_path; tradeInfo.out_path = out_path; tradeInfo.replenish_code = ip.code; // 循环结束标志 boolean breakFlag = false; sign_row: for (int j = 1; j < colLength; j++) { cell = row.getCell(j); switch (j) { case 1: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.shop_code = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.shop_code = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.shop_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码格式错误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有店铺编码"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } // Druid连接池管理数据库连接 DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = dbpc.getConnection(); String sql = "select a.order_sync_lock_flag,a.order_sync_lock_keyword,a.storage_code,a.platform_code,a.delivery_mode_id,a.company_code,b.type from tb_shop a,tb_company b where a.code=? and a.company_code=b.code"; ps = conn.prepareStatement(sql); ps.setString(1, tradeInfo.shop_code); rs = ps.executeQuery(); if (rs.next()) { tradeInfo.company_code = rs.getString("company_code"); if (!ip.company_code.equals(tradeInfo.company_code) && !ip.obm_company_code.equals(tradeInfo.company_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码不存在或不属于该公司"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break sign_row; } tradeInfo.delivery_mode_id = rs.getInt("delivery_mode_id"); tradeInfo.storage_code = rs.getString("storage_code"); tradeInfo.company_type = rs.getInt("type"); tradeInfo.obm_company_code = ""; tradeInfo.platform_code = rs.getString("platform_code"); tradeInfo.shopMessage = new ShopMessage(); int orderSyncLockFlag = rs.getInt("order_sync_lock_flag"); String orderSyncLocKeyword = rs.getString("order_sync_lock_keyword") == null ? "" : rs.getString("order_sync_lock_keyword"); tradeInfo.shopMessage.setOrder_sync_lock_flag(orderSyncLockFlag); tradeInfo.shopMessage.setOrder_sync_lock_keyword(orderSyncLocKeyword); if ("001".equals(tradeInfo.platform_code) || "012".equals(tradeInfo.platform_code)) { tradeInfo.platform_code = "002"; } if ("002".equals(tradeInfo.platform_code)) { tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "店铺编码不存在"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } catch (Exception e) { logger.error(ReplenishOrder.class, e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } rs = null; } if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } ps = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } conn = null; } dbpc = null; } break; case 2: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tid = nf.format(cell.getNumericCellValue()).replace(",", "").trim(); } else { tradeInfo.tid = cell.getStringCellValue().trim(); } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有平台订单号"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 3: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.pay_time = sdf .format(cell.getDateCellValue()); } else if ("STRING".equals(cell.getCellTypeEnum().toString())){ try { String payTime = cell.getStringCellValue().trim(); sdf.parse(payTime); tradeInfo.pay_time = payTime; } catch (Exception e) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } }else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有付款时间"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 4: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_name)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人姓名"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 5: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = tradeInfo.receiver_phone = cell.getStringCellValue() .trim(); if ("".equals(tradeInfo.receiver_phone)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = tradeInfo.receiver_phone = nf .format(cell.getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人电话号码"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 6: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_address = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_address)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货详细地址处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } Map addressMap = ParseAddressUtil .getTextRecognitionInfo(tradeInfo.receiver_address); if (addressMap.size() == 4) { tradeInfo.receiver_country = "中国"; tradeInfo.receiver_state = addressMap.get("province"); tradeInfo.receiver_city = addressMap.get("city"); tradeInfo.receiver_district = addressMap.get("county"); } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "根据详细地址解析省市区失败"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人详细地址格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人详细地址"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 7: tradeInfo.buyer_message = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.buyer_message = cell.getStringCellValue().trim(); } } break; case 8: tradeInfo.seller_memo = ""; if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.seller_memo = cell.getStringCellValue().trim(); } } break; case 9: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = cell.getStringCellValue().trim(); tradeInfo.orders[0].title = ""; if ("".equals(tradeInfo.orders[0].platform_seller_code)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = nf.format(cell.getNumericCellValue()) .replace(",", ""); tradeInfo.orders[0].title = ""; } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品编码为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 10: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].num = (int) cell.getNumericCellValue(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 11: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = nf .format(cell.getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[tradeInfo.orders.length - 1].divide_order_fee = cell .getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.orders[0].divide_order_fee)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } // tradeInfo.orders[0].payment = tradeInfo.orders[0].total_fee = String // .valueOf(Double.valueOf(tradeInfo.orders[0].price) * tradeInfo.orders[0].num); break; default: break; } // 有异常值退出循环 if (breakFlag) { break; } if (j == colLength - 1) { // 记录没有错误的 list = addList(list, k, true); } } } /** * TODO 当前为最后一行订单数据 添加至队列 */ if (tradeInfo != null && tradeInfo.pay_time != null && k == rowLength - 1) { tradeList.add(tradeInfo); } } } catch (Exception e) { importExcelDataInfo.setErrorRow(errorRow); importExcelDataInfo.setErrorTitle(errorTitle); logger.error(this, e); } importExcelDataInfo.setList(list); // 补齐tradeList中的tradeInfo的订单信息 for (int i = 0; i < tradeList.size(); i++) { TradeInfo fullTradeInfo = tradeList.get(i); OrderInfo[] orders = fullTradeInfo.orders; for (OrderInfo fullOrderInfo : orders) { BigDecimal bigDecimal1 = new BigDecimal(fullOrderInfo.divide_order_fee); fullOrderInfo.price = String.valueOf(new BigDecimal(fullOrderInfo.divide_order_fee).divide(new BigDecimal(fullOrderInfo.num),BigDecimal.ROUND_HALF_UP)); fullOrderInfo.payment = fullOrderInfo.total_fee = fullOrderInfo.divide_order_fee; BigDecimal bigDecimal2 = new BigDecimal( (fullTradeInfo.product_fee == null || "".equals(fullTradeInfo.product_fee)) ? "0" : fullTradeInfo.product_fee); fullTradeInfo.pay_money = fullTradeInfo.money = fullTradeInfo.product_fee = bigDecimal1 .add(bigDecimal2).toString(); fullTradeInfo.num = fullTradeInfo.num + fullOrderInfo.num; } fullTradeInfo.discount_fee = "0"; fullTradeInfo.adjust_fee = "0"; fullTradeInfo.receiver_zip = ""; fullTradeInfo.post_fee = "0"; fullTradeInfo.invoice_type = 0; fullTradeInfo.invoice_content = ""; fullTradeInfo.invoice_phone = ""; fullTradeInfo.invoice_email = ""; fullTradeInfo.tax_id = ""; fullTradeInfo.address_telephone = ""; fullTradeInfo.bank_of_deposit_account_number = ""; fullTradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); fullTradeInfo.status = "未发货"; fullTradeInfo.title = ""; fullTradeInfo.type = "fixed"; fullTradeInfo.test_flag = "否"; } importExcelDataInfo.setTradeList(tradeList); return importExcelDataInfo; } /** * @Description: 解析滴滴模式的订单模板 * @Title: standardMode2ReadExcel * @author Lewis * @param sheet * @param row * @param rowLength * @param colLength * @param cell * @param out_path * @param ip * @return 封装的对象 * @throws NoShopException */ private ImportExcelDataInfo ddMode2ReadExcel(Sheet sheet, Row row, int rowLength, int colLength, Cell cell, String out_path, ImportParams ip) throws Exception { ImportExcelDataInfo importExcelDataInfo = new ImportExcelDataInfo(); ArrayList list = new ArrayList(); boolean file_error_flag = false;// 文件中是否有错误 ArrayList tradeList = new ArrayList(); NumberFormat nf = NumberFormat.getInstance(); String errorTitle = ""; // 记录错误行号 int errorRow = 0; try { for (int k = 2; k < rowLength; k++) { TradeInfo tradeInfo = new TradeInfo(); tradeInfo = getImportShopMessage(tradeInfo, ip); row = sheet.getRow(k); errorRow = k + 1; if (null == row) { continue; } file_error_flag = false; tradeInfo.orders = new OrderInfo[1]; tradeInfo.orders[0] = new OrderInfo(); boolean breakFlag = false; for (int j = 0; j < colLength; j++) { cell = row.getCell(j); switch (j) { case 0: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = nf.format(cell.getNumericCellValue()) .replace(",", "").trim(); } else if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].platform_seller_code = cell.getStringCellValue().trim(); } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品id格式错误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有设置商品id"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 1: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.tid = nf.format(cell.getNumericCellValue()).replace(",", "").trim(); } else { tradeInfo.tid = cell.getStringCellValue().trim(); } } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有平台订单号"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 2: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.pay_time = sdf .format(cell.getDateCellValue()); } else if ("STRING".equals(cell.getCellTypeEnum().toString())){ try { String payTime = cell.getStringCellValue().trim(); sdf.parse(payTime); tradeInfo.pay_time = payTime; } catch (Exception e) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "付款时间格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有付款时间"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 3: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].title = cell.getStringCellValue().trim(); } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].title = nf.format(cell.getNumericCellValue()).replace(",", ""); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品标题格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { tradeInfo.orders[0].title = ""; } break; case 6: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { if (isDouble(cell.getStringCellValue())) { tradeInfo.orders[0].payment = tradeInfo.orders[0].total_fee = cell .getStringCellValue().trim(); } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.orders[0].payment = tradeInfo.orders[0].total_fee = nf .format(cell.getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 tradeInfo.orders[0].payment = tradeInfo.orders[0].total_fee = cell .getStringCellValue().trim(); if (!StringUtils.isNumeric(tradeInfo.orders[0].price)) { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额不是数字"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品金额格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 7: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.num = tradeInfo.orders[0].num = (int) cell.getNumericCellValue(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "商品数量为空"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 9: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_name)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_name = nf.format(cell.getNumericCellValue()).replace(",", "") .trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人姓名格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人姓名"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 10: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = tradeInfo.receiver_phone = cell.getStringCellValue() .trim(); if ("".equals(tradeInfo.receiver_mobile)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else if ("NUMERIC".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_mobile = tradeInfo.receiver_phone = nf .format(cell.getNumericCellValue()).replace(",", "").trim(); } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人电话格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人电话"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; case 11: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.receiver_address = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.receiver_address)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货详细地址处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } Map addressMap = ParseAddressUtil .getTextRecognitionInfo(tradeInfo.receiver_address); if (addressMap.size() == 4) { tradeInfo.receiver_country = "中国"; tradeInfo.receiver_state = addressMap.get("province"); tradeInfo.receiver_city = addressMap.get("city"); tradeInfo.receiver_district = addressMap.get("county"); } else { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "根据详细地址解析省市区失败"; ri.row_num = k; ri.error_flag = true; file_error_flag = true; tradeInfo = null; breakFlag = true; list.add(ri); } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "收货人详细地址格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有收货人详细地址"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; breakFlag = true; break; } break; case 17: if (cell != null && !"BLANK".equals(cell.getCellTypeEnum().toString())) { if ("STRING".equals(cell.getCellTypeEnum().toString())) { tradeInfo.status = cell.getStringCellValue().trim(); if ("".equals(tradeInfo.status)) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单状态处有空格"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "订单状态格式有误"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } } else { // 提交任务补抓单程序的结果 ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = true; ri.error_msg = "没有订单状态"; ri.row_num = k; ri.error_flag = true; list.add(ri); file_error_flag = true; tradeInfo = null; breakFlag = true; break; } break; default: break; } // 有异常值退出循环 if (breakFlag) { break; } if (j == colLength - 1) { // 记录没有错误的 list = addList(list, k, true); } } if (tradeInfo != null) { // tradeInfo.orders[0].divide_order_fee = tradeInfo.orders[0].price = String.valueOf(Double.valueOf(tradeInfo.orders[0].payment) / tradeInfo.orders[0].num); tradeInfo.orders[0].divide_order_fee = tradeInfo.orders[0].price = String.valueOf( new BigDecimal(Double.valueOf(tradeInfo.orders[0].payment) / tradeInfo.orders[0].num) .setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); tradeInfo.orders[0].discount_fee = "0"; tradeInfo.orders[0].total_fee = "0"; tradeInfo.orders[0].adjust_fee = "0"; tradeInfo.orders[0].sku_id = ""; tradeInfo.post_fee = "0"; tradeInfo.trade_type2 = 2; tradeInfo.row_num = k; tradeInfo.export_file_path = import_file_path; tradeInfo.out_path = out_path; tradeInfo.replenish_code = ip.code; tradeInfo.pay_money = tradeInfo.money = tradeInfo.product_fee = tradeInfo.orders[0].payment; tradeInfo.discount_fee = "0"; tradeInfo.adjust_fee = "0"; tradeInfo.receiver_zip = ""; tradeInfo.post_fee = "0"; tradeInfo.invoice_type = 0; tradeInfo.invoice_content = ""; tradeInfo.invoice_phone = ""; tradeInfo.invoice_email = ""; tradeInfo.tax_id = ""; tradeInfo.address_telephone = ""; tradeInfo.bank_of_deposit_account_number = ""; tradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); tradeInfo.title = "fixed"; tradeInfo.type = "fixed"; tradeInfo.test_flag = "否"; tradeList.add(tradeInfo); } } } catch (NoShopException e) { throw e; } catch (Exception e) { importExcelDataInfo.setErrorRow(errorRow); importExcelDataInfo.setErrorTitle(errorTitle); logger.error(this, e); } importExcelDataInfo.setList(list); importExcelDataInfo.setTradeList(tradeList); return importExcelDataInfo; } public TradeInfo getImportShopMessage(TradeInfo tradeInfo, ImportParams ip) throws Exception { /* * 读取企业的店铺信息 */ // Druid连接池管理数据库连接 DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = dbpc.getConnection(); String sql = "select a.order_sync_lock_flag,a.order_sync_lock_keyword,a.storage_code,a.platform_code,a.delivery_mode_id,a.company_code,b.type,a.code as shopCode " + "from tb_shop a,tb_company b " + "where b.code=? and a.company_code=b.code AND a.is_default_order_in =2"; ps = conn.prepareStatement(sql); if (null != ip.company_code) { ps.setString(1, ip.company_code); } else { ps.setString(1, ip.obm_company_code); } rs = ps.executeQuery(); if (rs.next()) { tradeInfo.company_code = rs.getString("company_code"); tradeInfo.shop_code = rs.getString("shopCode"); tradeInfo.delivery_mode_id = rs.getInt("delivery_mode_id"); tradeInfo.storage_code = rs.getString("storage_code"); tradeInfo.company_type = rs.getInt("type"); tradeInfo.obm_company_code = ""; tradeInfo.platform_code = rs.getString("platform_code"); tradeInfo.shopMessage = new ShopMessage(); int orderSyncLockFlag = rs.getInt("order_sync_lock_flag"); String orderSyncLocKeyword = rs.getString("order_sync_lock_keyword") == null ? "" : rs.getString("order_sync_lock_keyword"); tradeInfo.shopMessage.setOrder_sync_lock_flag(orderSyncLockFlag); tradeInfo.shopMessage.setOrder_sync_lock_keyword(orderSyncLocKeyword); if ("001".equals(tradeInfo.platform_code) || "012".equals(tradeInfo.platform_code)) { tradeInfo.platform_code = "002"; } if ("002".equals(tradeInfo.platform_code)) { tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; } } else { throw new NoShopException("没有找到订单所属的店铺信息"); } return tradeInfo; } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } rs = null; } if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } ps = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } conn = null; } dbpc = null; } } /** * 根据时间或者订单号补抓启动线程 * * @author Lewis */ private class RecatchOrders extends Thread { PlatConfig pc1; RecatchConfig recatchConfig; String replenish_code; public RecatchOrders(PlatConfig pc1, RecatchConfig recatchConfig, String replenish_code) { this.pc1 = pc1; this.recatchConfig = recatchConfig; this.replenish_code = replenish_code; } @Override public void run() { // Druid连接池管理数据库连接 DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; PreparedStatement ps = null; // ResultSet rs = null; try { conn = dbpc.getConnection(); boolean flag2 = false; AppConfig appConfig = pc1.apps.get(0); if ("002".equals(recatchConfig.platform_code)) { ApiTmall apiTmall = new ApiTmall(pc1.api_url, pc1.tmc_url, appConfig.key, appConfig.secret, pc1.apps.get(0).shops, recatchConfig); apiTmall.start(); flag2 = true; } else if ("006".equals(recatchConfig.platform_code)) { // apiGome = new ApiGome(pc1, recatchConfig); apiGomeNew = new ApiGomeNew(pc1, recatchConfig); flag2 = true; } else if ("005".equals(recatchConfig.platform_code)) { // apiDangdang = new ApiDangdang(pc1, recatchConfig); apiDangDangNew = new ApiDangDangNew(pc1, recatchConfig); flag2 = true; } else if ("003".equals(recatchConfig.platform_code)) { apiJingdong = new ApiJingdongNew(pc1, recatchConfig, accessKeyId, secretKey, endpoint, customerId); flag2 = true; } else if ("011".equals(recatchConfig.platform_code)) { // apiYouzan = new ApiYouzan(pc1, recatchConfig); apiYouZanNew = new ApiYouZanNew(pc1, recatchConfig); flag2 = true; } else if ("014".equals(recatchConfig.platform_code)) { // apiPinduoduo = new ApiPinduoduo(pc1, recatchConfig); // apiPinDuoDuoNew = new ApiPinDuoDuoNew(pc1, recatchConfig); ApiPinDuoDuoThirdEdition ApiPinDuoDuoThirdEdition = new ApiPinDuoDuoThirdEdition(pc1, recatchConfig); flag2 = true; } else if ("015".equals(recatchConfig.platform_code)) { apiVip = new ApiVip(pc1, recatchConfig); flag2 = true; } else if ("017".equals(recatchConfig.platform_code)) { logger.info("【初始化】017平台, app:" + appConfig.key + "启动"); // apiWeimob = new ApiWeimob(pc1, recatchConfig); apiWeiMobNew = new ApiWeiMobNew(pc1, recatchConfig); flag2 = true; } else if ("018".equals(recatchConfig.platform_code)) { logger.info("【初始化】018平台, app:" + appConfig.key + "启动"); apiPingan = new ApiPingan(pc1, recatchConfig); flag2 = true; } else if ("019".equals(recatchConfig.platform_code)) { logger.info("【初始化】019平台, app:" + appConfig.key + "启动"); apiMia = new ApiMia(pc1, recatchConfig); flag2 = true; } else if ("020".equals(recatchConfig.platform_code)) { logger.info("【初始化】020平台, app:" + appConfig.key + "启动"); // apiYitiao = new ApiYitiao(pc1, recatchConfig); apiYiTiaoNew = new ApiYiTiaoNew(pc1, recatchConfig); flag2 = true; } else if ("021".equals(recatchConfig.platform_code)) { logger.info("【初始化】021平台, app:" + appConfig.key + "启动"); // apiXiaoHongShu = new ApiXiaoHongShu(pc1, recatchConfig); apiXiaoHongShuNewThirdEdition = new ApiXiaoHongShuNewThirdEdition(pc1, recatchConfig); flag2 = true; } else if ("022".equals(recatchConfig.platform_code)) { logger.info("【初始化】022平台, app:" + appConfig.key + "启动"); apiMiHeMall = new ApiMiHeMall(pc1, recatchConfig); flag2 = true; } else if ("023".equals(recatchConfig.platform_code)) { logger.info("【初始化】023平台, app:" + appConfig.key + "启动"); apiDouDian = new ApiDouDian(pc1, recatchConfig); flag2 = true; }else if ("024".equals(recatchConfig.platform_code)) { logger.info("【初始化】024平台, app:" + appConfig.key + "启动"); apiKtt = new ApiKtt(pc1, recatchConfig); flag2 = true; }else if ("025".equals(recatchConfig.platform_code)) { logger.info("【初始化】025平台, app:" + appConfig.key + "启动"); apiKuaiShou = new ApiKuaiShou(pc1, recatchConfig); flag2 = true; }else if ("026".equals(recatchConfig.platform_code)) { logger.info("【初始化】026平台, app:" + appConfig.key + "启动"); apiQunJieLong= new ApiQunJieLong(pc1, recatchConfig); flag2 = true; } else if ("027".equals(recatchConfig.platform_code)) { apiWeiDianFirst = new ApiWeiDianFirst(pc1, recatchConfig); flag2 = true; } if (!flag2) { String sql = "update tb_replenish_order set result = ?,status=3 where code=" + replenish_code; ps = conn.prepareStatement(sql); ps.setString(1, "该第三方平台暂未开启补抓功能,请联系软维ERP"); ps.executeUpdate(); } } catch (Exception e) { logger.error(this, e); } finally { if (ps != null) { try { ps.close(); } catch (SQLException e) { logger.error(this, e); } catch (Exception e) { logger.error(this, e); } ps = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(this, e); } catch (Exception e) { logger.error(this, e); } conn = null; } dbpc = null; } } } /** * getConfigFromDB 从数据库读取配置 * * @throws Exception */ private PlatConfig getConfigFromDB(DruidPooledConnection conn, PreparedStatement ps, RecatchConfig recatchConfig) { boolean found = true; PlatConfig platConfig = new PlatConfig(); platConfig.apps = Collections.synchronizedList(new ArrayList()); AppConfig appConfig = new AppConfig(); ShopConfig shopConfig = new ShopConfig(); try { if (recatchConfig.type == 3 || recatchConfig.type == 1 || recatchConfig.type == 4) { String sql = "select a.platform_code,c.code as app_code,c.key as app_key,a.delivery_mode_id,a.delivery_area_setting,a.order_sync_lock_flag,a.order_sync_lock_keyword," + "c.secret as app_secret,a.company_code as shop_company_code,a.code as shop_code," + "a.platform_account as shop_name,a.session_key as shop_session_key,a.storage_code,d.type as company_type " + " from tb_shop a,tb_platform_app c,tb_company d where " + " a.del_flag = 1 and order_sync_flag=2 and a.company_code=d.code and a.app_code = c.code and c.del_flag = 1" + " and a.code = '" + recatchConfig.shop_code + "'"; ResultSet rs = ps.executeQuery(sql); while (rs.next()) { // 构造店铺 String platform_code = rs.getString("platform_code"); String realPlatformCode = platform_code; recatchConfig.platform_code = platform_code; if ("001".equals(recatchConfig.platform_code) || "012".equals(recatchConfig.platform_code)) { recatchConfig.platform_code = "002"; } recatchConfig.platform_account = rs.getString("shop_name"); for (int i = 0; i < config.plats.size(); i++) { PlatConfig pc = new PlatConfig(); pc = config.plats.get(i); if (pc.plat_name.equals(realPlatformCode)) { shopConfig = new ShopConfig(); shopConfig.realPlatformCode = realPlatformCode; shopConfig.platformCode = platform_code; shopConfig.code = rs.getString("shop_code"); shopConfig.name = rs.getString("shop_name"); shopConfig.session_key = rs.getString("shop_session_key"); shopConfig.company_code = rs.getString("shop_company_code"); shopConfig.storage_code = rs.getString("storage_code"); shopConfig.company_type = rs.getInt("company_type"); shopConfig.order_sync_lock_flag = rs.getInt("order_sync_lock_flag"); shopConfig.order_sync_lock_keyword = rs.getString("order_sync_lock_keyword") == null ? "" : rs.getString("order_sync_lock_keyword"); appConfig.secret = rs.getString("app_secret"); appConfig.key = rs.getString("app_key"); if ((rs.getString("delivery_mode_id") == null)) { shopConfig.delivery_mode_id = 2; } else { shopConfig.delivery_mode_id = rs.getInt("delivery_mode_id"); } shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" : rs.getString("delivery_area_setting"); found = false; if ("001".equals(realPlatformCode) || "012".equals(realPlatformCode)) { for (int j = 0; j ()); platConfig.apps.get(0).shops.add(shopConfig); } } } if (found) { logger.info("店铺编号未查到,请核对编号是否正确!"); return null; } return platConfig; } logger.info("补抓单程序配置中平台单号和店铺单号不能都为空!"); return null; } catch (Exception e) { logger.error(ReOrderSync.class, e); return null; } } public ArrayList addList(ArrayList list, int k, boolean original_trade) { ReplenishInfo ri = new ReplenishInfo(); ri.original_trade = original_trade; ri.error_msg = ""; ri.row_num = k; list.add(ri); return list; } /** * 根据行号删除一行 * * @param sheet a Excel sheet * @param rowIndex a 0 based index of removing row */ public void removeRow(XSSFSheet sheet, int rowIndex) { int lastRowNum = sheet.getLastRowNum(); if (rowIndex >= 0 && rowIndex < lastRowNum) // 将行号为rowIndex+1一直到行号为lastRowNum的单元格全部上移一行,以便删除rowIndex行 sheet.shiftRows(rowIndex + 1, lastRowNum, -1); if (rowIndex == lastRowNum) { XSSFRow removingRow = sheet.getRow(rowIndex); if (removingRow != null) sheet.removeRow(removingRow); } } } /** * 校验邮箱是否符合格式 * * @param email * @return */ public static boolean checkEmail(String email) { boolean flag = false; try { String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regex = Pattern.compile(check); Matcher matcher = regex.matcher(email); flag = matcher.matches(); } catch (Exception e) { flag = false; } return flag; } /** * 校验手机号是否符合格式 * * @param mobileNumber * @return */ public static boolean checkMobileNumber(String mobileNumber) { boolean flag = false; try { // Pattern regex = // Pattern.compile("^(((13[0-9])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8})|(0\\d{2}-\\d{8})|(0\\d{3}-\\d{7})$"); Pattern regex = Pattern.compile("^1[3456789]\\d{9}$"); Matcher matcher = regex.matcher(mobileNumber); flag = matcher.matches(); } catch (Exception e) { e.printStackTrace(); flag = false; } return flag; } /** * 判断文件是否是excel * * @throws Exception */ public static void checkExcelVaild(File file) throws Exception { if (!file.exists()) { throw new Exception("文件不存在"); } if (!(file.isFile() && (file.getName().endsWith(EXCEL_XLS) || file.getName().endsWith(EXCEL_XLSX)))) { throw new Exception("文件不是Excel"); } } /** * 判断Excel的版本,获取Workbook * * @param in * @param file * @return * @throws IOException */ public static Workbook getWorkbok(InputStream in, File file) throws Exception { Workbook wb = null; if (file.getName().endsWith(EXCEL_XLS)) { // Excel 2003 wb = new HSSFWorkbook(in); } else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010 wb = new XSSFWorkbook(in); } return wb; } /** * initConfig 初始化配置 */ private static boolean initFileConfig() { boolean res = false; try { IniReader iniReader = new IniReader(config_filename); config = new Config(); config.db_host = iniReader.getValue("mysql", "host"); config.db_port = iniReader.getValue("mysql", "port"); config.db_name = iniReader.getValue("mysql", "name"); config.db_user = iniReader.getValue("mysql", "user"); config.db_password = iniReader.getValue("mysql", "password"); storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); coverage = iniReader.getValue("coverTime", "coverage"); import_file_path = iniReader.getValue("path", "import_file_path"); stopStartTime = iniReader.getValue("storageUpdateTime", "stopStartTime"); stopEndTime = iniReader.getValue("storageUpdateTime", "stopEndTime"); accessKeyId = iniReader.getValue("hufu", "accessKeyId"); secretKey = iniReader.getValue("hufu", "secretKey"); endpoint = iniReader.getValue("hufu", "endpoint"); customerId = iniReader.getValue("hufu", "customerId"); // 读入所有平台参数 config.globe_plats = iniReader.getValue("globe", "plats"); String[] plat_array = config.globe_plats.split(","); config.plats = Collections.synchronizedList(new ArrayList()); for (int i = 0; i < plat_array.length; i++) { PlatConfig pc = new PlatConfig(); pc.plat_name = pc.plat_code = plat_array[i]; pc.api_url = iniReader.getValue(plat_array[i], "api_url"); pc.agent_api_ip = iniReader.getValue(plat_array[i], "agent_api_ip"); pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); pc.apps = Collections.synchronizedList(new ArrayList()); pc.updateTokenList = Collections.synchronizedList(new ArrayList()); config.plats.add(pc); } res = true; } catch (IOException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } return res; } /** * getConfigFromDB 从数据库读取配置 */ private static boolean getConfigFromDB() { boolean res = false; // Druid连接池管理数据库连接 DbPoolConnection dbpc = DbPoolConnection.getInstance(); DruidPooledConnection conn = null; Statement statement = null; ResultSet rs = null; try { conn = dbpc.getConnection(); if (config.plats.size() < 1) { return false; } statement = conn.createStatement(); StringBuffer sql = new StringBuffer() .append("select c.platform_code,c.code as app_code,c.key as app_key,a.pay_percent," + "c.secret as app_secret,a.company_code as shop_company_code," + "a.code as shop_code," + "a.delivery_mode_id,a.delivery_area_setting,a.refresh_token,a.expires_time,b.expire_time as endTime," + "a.platform_code as platformCode,a.del_flag,a.auth_flag,a.order_sync_flag,a.init_time,a.order_sync_modify_time," + "a.platform_account as shop_name,a.session_key as shop_session_key,a.storage_code,e.type as company_type " + "from tb_shop a, tb_platform_app c,tb_company_role_relation b,tb_role d,tb_company e " + "where a.del_flag = 1 and a.app_code = c.code and c.del_flag = 1 and a.company_code=b.company_code and b.role_code=d.code and d.type=1 " + "and a.app_code = c.code and a.company_code=e.code and a.platform_code in ("); for (int i = 0; i < config.plats.size(); i++) { PlatConfig pConfig = new PlatConfig(); pConfig = config.plats.get(i); if (i < config.plats.size() - 1) { sql.append(pConfig.plat_code + ","); } else { sql.append(pConfig.plat_code + ")"); } } sql.append(" order by order_sync_modify_time asc"); rs = statement.executeQuery(sql.toString()); while (rs.next()) { // 先判断app是否存在 String app_code = rs.getString("app_code"); String platformCode = rs.getString("platformCode"); String endTime = rs.getString("endTime"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long endTimeLong = sdf.parse(endTime).getTime(); long timeNow = System.currentTimeMillis(); if (timeNow - endTimeLong >= 7 * 24 * 60 * 60 * 1000) { continue; } if ("001".equals(platformCode) || "012".equals(platformCode)) { platformCode = "002"; } Boolean found = false; for (int i = 0; i < config.plats.size(); i++) { PlatConfig pc = new PlatConfig(); pc = config.plats.get(i); if (pc.plat_code.equals(platformCode)) { pc.order_sync_modify_time = rs.getString("order_sync_modify_time"); // 构造店铺 shopConfig = new ShopConfig(); shopConfig.code = rs.getString("shop_code"); shopConfig.name = rs.getString("shop_name"); shopConfig.session_key = rs.getString("shop_session_key"); shopConfig.company_code = rs.getString("shop_company_code"); shopConfig.pay_percent = rs.getDouble("pay_percent"); shopConfig.del_flag = rs.getInt("del_flag"); shopConfig.auth_flag = rs.getInt("auth_flag"); shopConfig.order_sync_flag = rs.getInt("order_sync_flag"); shopConfig.company_type = rs.getInt("company_type"); if ("".equals(coverage) || coverage == null) { shopConfig.init_time = rs.getInt("init_time"); } else { Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(coverage); if (!isNum.matches()) { shopConfig.init_time = rs.getInt("init_time"); } else { shopConfig.init_time = Integer.valueOf(coverage) * 60; } } String storage_code = rs.getString("storage_code"); if (storage_code == null) { shopConfig.storage_code = ""; } else { shopConfig.storage_code = rs.getString("storage_code"); } if ((rs.getString("delivery_mode_id") == null)) { shopConfig.delivery_mode_id = 2; } else { shopConfig.delivery_mode_id = rs.getInt("delivery_mode_id"); } shopConfig.delivery_area_setting = rs.getString("delivery_area_setting") == null ? "" : rs.getString("delivery_area_setting"); shopConfig.platformCode = platformCode; if ((shopConfig.del_flag == 1) && (shopConfig.auth_flag == 2) && (shopConfig.order_sync_flag == 2)) { for (int j = 0; j < pc.apps.size(); j++) { AppConfig app_config = pc.apps.get(j); if (app_code.equals(app_config.code)) { // 找到app可以直接添加店铺 app_config.shops.add(shopConfig); logger.info("只添加店铺[ {} ] | [ {} ] 时间->{}", shopConfig.code, shopConfig.name, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); found = true; break; } } if (!found) { // 未找到app,需要同步添加app和店铺 AppConfig appConfig = new AppConfig(); appConfig.code = rs.getString("app_code"); appConfig.key = rs.getString("app_key"); appConfig.secret = rs.getString("app_secret"); appConfig.shops = Collections.synchronizedList(new ArrayList()); appConfig.shops.add(shopConfig); pc.apps.add(appConfig); } } // 获取自动更新sessionkey的所需信息 int del_flag = shopConfig.del_flag; int auth_flag = shopConfig.auth_flag; String refresh_token = rs.getString("refresh_token"); String expires_time = rs.getString("expires_time"); if (del_flag == 1 && auth_flag == 2 && (refresh_token != null && !"".equals(refresh_token) && (expires_time != null && !"".equals(expires_time)))) { UpdateMessage um = new UpdateMessage(); um.app_key = rs.getString("app_key"); um.app_secret = rs.getString("app_secret"); um.refresh_token = refresh_token; um.expires_time = expires_time; um.shop_name = rs.getString("shop_name"); um.shop_code = rs.getString("shop_code"); pc.updateTokenList.add(um); } break; } } } res = true; } catch (Exception e) { logger.error(ReplenishOrder.class, e); logger.info("{}时间->{}", e.toString(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } catch (Exception e) { logger.error(ReplenishOrder.class, e); } rs = null; } if (statement != null) { try { statement.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } statement = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.error(ReplenishOrder.class, e); } conn = null; } dbpc = null; } return res; } public static boolean isDouble(String str) { Pattern pattern = Pattern.compile("[0-9]+[.]{0,1}[0-9]*[dD]{0,1}"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } /** * * @title: checkCell * @description: 检查单元格是否有值 * @param row 行 * @param cellNumber 列号 * @return string NullValue/EffectiveValue 单元格为空值/单元格中有效值 */ public static String checkCellValue(Row row, int cellNumber) { try { Cell cell = row.getCell(cellNumber); if (null != cell && "BLANK".equals(cell.getCellTypeEnum().toString())) {// 单元格有过操作 值为空字符串 return "NullValue"; } else if (null != cell && !"BLANK".equals(cell.getCellTypeEnum().toString())) { return "EffectiveValue"; } else if (null == cell || "BLANK".equals(cell.getCellTypeEnum().toString())) { return "NullValue"; } } catch (Exception e) { logger.error("", e); if (e instanceof NullPointerException) { return "NullValue"; } } logger.error("补录订单发生了未知的异常,请检查源文件。"); return "Unknown"; } } \ No newline at end of file diff --git a/src/com/since/emp/service/StorageUpdate.java b/src/com/since/emp/service/StorageUpdate.java new file mode 100644 index 0000000..ad2296d --- /dev/null +++ b/src/com/since/emp/service/StorageUpdate.java @@ -0,0 +1,2082 @@ +package com.since.emp.service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.URIException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.jd.open.api.sdk.DefaultJdClient; +import com.jd.open.api.sdk.JdClient; +import com.jd.open.api.sdk.JdException; +import com.jd.open.api.sdk.request.ware.SkuReadSearchSkuListRequest; +import com.jd.open.api.sdk.request.ware.StockWriteUpdateSkuStockRequest; +import com.jd.open.api.sdk.response.ware.SkuReadSearchSkuListResponse; +import com.jd.open.api.sdk.response.ware.StockWriteUpdateSkuStockResponse; +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsListGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsQuantityUpdateRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsListGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsQuantityUpdateResponse; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.ShopCommodityConfig; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.request.ItemPromotionRuleGetRequest; +import com.taobao.api.request.ItemQuantityUpdateRequest; +import com.taobao.api.request.ItemsCustomGetRequest; +import com.taobao.api.request.SkusCustomGetRequest; +import com.taobao.api.response.ItemPromotionRuleGetResponse; +import com.taobao.api.response.ItemQuantityUpdateResponse; +import com.taobao.api.response.ItemsCustomGetResponse; +import com.taobao.api.response.SkusCustomGetResponse; + +import cn.com.gome.cloud.openplatform.bridge.core.client.DefaultGmosClient; +import cn.com.gome.cloud.openplatform.bridge.core.client.GmosClient; +import gome.open.api.sdk.cloud.client.domain.bridge.client.request.GomeGoodsItemCustomGetRequest; +import gome.open.api.sdk.cloud.client.domain.bridge.client.request.GomeGoodsItemQuantityUpdateRequest; +import gome.open.api.sdk.cloud.client.domain.bridge.client.response.GomeGoodsItemCustomGetResponse; +import gome.open.api.sdk.cloud.client.domain.bridge.client.response.GomeGoodsItemQuantityUpdateResponse; +import net.sf.json.JSON; +import net.sf.json.xml.XMLSerializer; +import net.spy.memcached.MemcachedClient; + +public class StorageUpdate { + + private static final Logger logger = LogManager.getLogger(StorageUpdate.class); + public Vector ImmediateUpdateQueue; + List plats; + private String sql; + String interval; + private MemcachedClient mcc = null; + private String stopStartTime;// 定时同步停止同步的起始时间 + private String stopEndTime;// 定时同步停止同步的结束时间 + // boolean agentFlag = false;//代发标志,true为代发商品,false为非代发商品 + // String obm_company_code = "";//品牌商公司编码 + // String obm_commodity_code = "";//品牌商商品编码 + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + private String tmallPromotionRuleEndTime = "";//天猫限制更新库存的结束时间 + + public StorageUpdate(List plats, String interval, String stopStartTime, String stopEndTime) { + this.plats = plats; + this.interval = interval; + this.stopStartTime = stopStartTime; + this.stopEndTime = stopEndTime; + try { + threadPool = ThreadPool.getInstance(); + } catch (Exception e) { + logger.error(this, e); + } + } + + /* *//** + * 店铺信息汇总类 + * + * @author Lewis + * + */ + + /* + * class ShopMessage { String url; String app_key; String app_secret; String + * platform_code; String session_key; } + * + *//** + * 同步策略信息类 + * + * @author Lewis + * + *//* + * class ShopCommodityConfig { int quantity; float percent; int formula; int + * onpassage_flag; int min_syn_quantity;//人工设置的最小同步数量 String storageCodes; + * String app_key; String app_secret; String session_key; String shop_name; + * String platform_code; String platform_seller_code; } + */ + + public void start() { + try { + mcc = OrderSyncs.MemcacheInit(StorageUpdate.class.getName()); + ImmediateUpdateQueue = new Vector(); + /* + * for (String shop : shop_message.keySet()) { ShopMessage sm = new + * ShopMessage(); sm = shop_message.get(shop); } + */ + /** + * 启动即时更新线程 + */ + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize()+1); + ImmediateUpdateThread iut = new ImmediateUpdateThread(); + // iut.start(); + scheduledThreadPool.scheduleAtFixedRate(iut, 0, 500, TimeUnit.MILLISECONDS); + /** + * 启动定时更新线程 + */ + if (!"".equals(interval)) { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize()+1); + UpdateTimerTask utt = new UpdateTimerTask(); + scheduledThreadPool.scheduleAtFixedRate(utt, 0, Integer.valueOf(interval) * 60 * 1000, + TimeUnit.MILLISECONDS); + // Timer timer = new Timer(); + // timer.schedule(utt, 0, Integer.valueOf(interval) * 60 * 1000);// 各线程间隔5分钟 + logger.info("库存更新|定时更新库存线程启动,间隔查询时间 [ {} ] 分钟!", interval); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + class UpdateTimerTask extends Thread { + + public String lastQueryTime;// 上次成功查询仓库流水表的时间 + + @Override + public void run() { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String now = sdf.format(new Date()); + if (now.compareTo(stopStartTime) < 0 || now.compareTo(stopEndTime) >= 0) { + // 获取上次查询时间 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + if (this.lastQueryTime == null) { + // 初始时,获取最后一个流水写入的时间(分钟) + String lastTime = getLastTime(); + this.lastQueryTime = lastTime; + logger.info("库存更新|根据流水表最新的一条数据初始化查询时间->{}", lastTime); + } else { + try { + // 时间覆盖式,下次查询时,开始时间往前覆盖5分钟 + Date date = df.parse(this.lastQueryTime); + date = new Date(date.getTime()); + this.lastQueryTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + // 启动仓库流水表查询线程 + GetCommodityThread thread = new GetCommodityThread(this.lastQueryTime); + thread.task = this; + // thread.start(); + threadPool.execute(thread); + } + } else { + this.lastQueryTime = sdf.format(new Date()); + logger.info("库存更新|目前处于禁止同步时间:{}->{}的时间段内,不予同步,更新最后查询时间为->{}", stopStartTime, stopEndTime, + lastQueryTime); + } + + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + private String getLastTime() { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + String lastTime = null; + + try { + conn = dbpc.getConnection(); + sql = "select create_time from tb_storage_flow where id = (select max(id) from tb_storage_flow)"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + lastTime = rs.getString("create_time"); + } + return lastTime; + } catch (SQLException e) { + this.getLastTime(); + logger.error(this, e); + return null; + } catch (Exception e) { + this.getLastTime(); + logger.error(this, e); + return null; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + class GetCommodityThread extends Thread { + public UpdateTimerTask task; + private String time_start; + + public GetCommodityThread(String time_start) { + this.time_start = time_start; + } + + public void run() { + this.getCommodityMessage(); + } + + private void getCommodityMessage() { + /** + * Druid连接池管理数据库连接 + */ + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + Map map_commodity = new ConcurrentHashMap(); + // conn = OrderSyncs.dbUtil.getDbConn(); + String time = time_start; + try { + + conn = dbpc.getConnection(); + logger.info("库存更新|根据流水表创建时间获取订单:时间->{}", time_start); + /** + * 定时同步加入代发的订单同步,使用如下新逻辑 + */ + sql = "select a.commodity_code,a.company_code,b.type,c.platform_seller_code,a.create_time " + + "from tb_storage_flow a,tb_company b,tb_commodity c " + + "where a.company_code=b.code and a.commodity_code=c.code and a.company_code=c.company_code and c.status=2 and c.del_flag=1 and a.create_time > ? " + + "order by create_time"; + ps = conn.prepareStatement(sql); + ps.setString(1, time_start); + rs = ps.executeQuery(); + while (rs.next()) { + + String obm_company_code = ""; + String obm_commodity_code = ""; + boolean agentFlag = false; + time = rs.getString("create_time"); + int company_type = rs.getInt("type"); + String commodity_code = rs.getString("commodity_code"); + String company = rs.getString("company_code"); + ResultSet rs_obm = null; + // 企业类型,1:平台管理公司,2:普通用户公司 3:品牌商公司 + if (2 == company_type) { + Boolean foundFlag = false; + // 平台商品编码 + String platform_seller_code = rs.getString("platform_seller_code"); + if (null == platform_seller_code || "".equals(platform_seller_code)) { + continue; + } + sql = "select a.obm_company_code,b.obm_commodity_code,a.shop_code " + + "from tb_obm_agent_shop a,tb_obm_agent_commodity b " + + "where a.company_code=? and b.commodity_code=? and a.status=2 and b.status=2 and b.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code"; + ps = conn.prepareStatement(sql); + ps.setString(1, company); + ps.setString(2, commodity_code); + rs_obm = ps.executeQuery(); + /** + * 如果是经销商的代发商品,在经销商自己这边有库存变化,并不影响库存数据,所以不需要更新库存 + */ + /* + * 2018-05-31 22:43:00停用该代码 while (rs_obm.next()) { foundFlag = true;//查询到是代发订单 + * agentFlag = true;//代发标志 if (null == platform_seller_code || + * "".equals(platform_seller_code)) { continue; } String shop_code = + * rs_obm.getString("shop_code"); obm_commodity_code = + * rs_obm.getString("obm_commodity_code"); obm_company_code = + * rs_obm.getString("obm_company_code"); String key = commodity_code + "," + + * company + "," + platform_seller_code + "," + shop_code ; String value = + * obm_company_code + "," + obm_commodity_code + "," + agentFlag; if + * (!map_commodity.containsKey(key)) { map_commodity.put(key, value); } } + */ + if (rs_obm.next()) { + foundFlag = true;// 查询到是代发订单 + } + + if (!foundFlag) { + String key = commodity_code + "," + company + "," + platform_seller_code + "," + ""; + String value = obm_company_code + "," + obm_commodity_code + "," + agentFlag; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + } + } + // 企业类型,1:平台管理公司,2:普通用户公司 3:品牌商公司 + if (3 == company_type) { + Boolean foundFlag = false; + sql = "select a.company_code,b.commodity_code,c.platform_seller_code,a.shop_code " + + "from tb_obm_agent_shop a,tb_obm_agent_commodity b ,tb_commodity c " + + "where a.obm_company_code=? and b.obm_commodity_code=? and a.status=2 and b.status=2 and b.del_flag=1 and c.status=2 and c.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code " + + "and a.company_code=c.company_code and b.commodity_code=c.code"; + ps = conn.prepareStatement(sql); + ps.setString(1, company); + ps.setString(2, commodity_code); + rs_obm = ps.executeQuery(); + while (rs_obm.next()) { + foundFlag = true;// 查询到是代发订单 + agentFlag = true;// 代发标志 + // 平台商品编码 + String platform_seller_code = rs_obm.getString("platform_seller_code"); + if (null == platform_seller_code || "".equals(platform_seller_code)) { + continue; + } + obm_commodity_code = commodity_code; + obm_company_code = company; + String shop_code = rs_obm.getString("shop_code"); + String agent_commodity_code = rs_obm.getString("commodity_code"); + String agent_company = rs_obm.getString("company_code"); + String key = agent_commodity_code + "," + agent_company + "," + platform_seller_code + "," + + shop_code; + String value = obm_company_code + "," + obm_commodity_code + "," + agentFlag; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + } + /** + * 能查到代发关系,品牌商自己的店铺也可能有该商品的同步策略,所以都要讲品牌商添加上去查询,同时查询品牌商自己对应的商品编码 2018-05-31 + * 23:47:00 + */ + // if (!foundFlag) { + sql = "select a.platform_seller_code from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + company + "' and a.code= '" + commodity_code + "'"; + ps = conn.prepareStatement(sql); + rs_obm = ps.executeQuery(); + if (rs_obm.next()) { + String platform_seller_code = rs_obm.getString("platform_seller_code"); + String key = commodity_code + "," + company + "," + platform_seller_code + "," + ""; + String value = obm_company_code + "," + obm_commodity_code + "," + false; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + } + + // } + // 关闭rs_obm连接 + if (rs_obm != null) { + try { + rs_obm.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_obm = null; + } + } + } + for (Map.Entry entry : map_commodity.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + String obm_company_code = ""; + String obm_commodity_code = ""; + boolean agentFlag = false; + String[] array_value = value.split(","); + obm_company_code = array_value[0]; + + obm_commodity_code = array_value[1]; + + if ("true".equals(array_value[2])) { + agentFlag = true; + } + + String[] array = key.split(","); + String shop_code = ""; + if (agentFlag) { + shop_code = array[3]; + } + if (parseDataImmediate(array[1], array[0], array[2], obm_company_code, obm_commodity_code, + agentFlag, 1, shop_code)) { + // logger.info("【" + logTitle + + // "】库存更新|定时更新,商品:" + array[0] + ",所属公司:" + // + array[1] + "成功!"); + } else { + logger.info("库存更新|定时更新,商品:[ {} ] ,所属公司:[ {} ] 未成功,放弃处理", array[0], array[1]); + } + logger.info("库存更新|定时更新,待处理队列总数:[ {} ] ", ImmediateUpdateQueue.size()); + } + + /** + * 定时同步加入代发的订单,原有定时同步逻辑作废 + */ + /* + * sql = + * "select a.create_time,b.commodity_code,b.company_code,b.quantity,b.percent,b.formula,b.onpassage_flag,b.shop_code,b.min_syn_quantity,c.storage_code as storage2,f.key,f.secret,e.name,e.platform_code,e.session_key,g.platform_seller_code " + * + + * "from tb_storage_flow a,tb_shop_commodity_config b,tb_shop_storage c,tb_shop e,tb_platform_app f,tb_commodity g " + * + + * "where a.commodity_code=b.commodity_code and a.company_code=b.company_code and b.company_code=c.company_code and b.shop_code=c.shop_code " + * + + * "and a.storage_code in(select d.storage_code from tb_shop_storage d where b.shop_code=d.shop_code) and b.status=2 and b.del_flag=1 " + * + + * "and e.app_code=f.code and e.code=b.shop_code and e.company_code=a.company_code and b.commodity_code=g.code " + * + + * "and f.del_flag=1 and e.del_flag=1 and e.auth_flag=2 and e.order_sync_flag=2 and e.stock_sync_flag=2 and a.create_time>'" + * + time_start + "'" + + * " group by a.commodity_code,a.company_code,b.shop_code,storage2 order by a.create_time" + * ; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) + * { String commodity_code = rs.getString("commodity_code"); String company_code + * = rs.getString("company_code"); String shop_code = rs.getString("shop_code"); + * int min_syn_quantity = rs.getInt("min_syn_quantity"); float percent = + * rs.getFloat("percent"); int quantity = rs.getInt("quantity"); int formula = + * rs.getInt("formula"); int onpassage_flag = rs.getInt("onpassage_flag"); + * String storageCode = rs.getString("storage2"); time = + * rs.getString("create_time"); String app_key = rs.getString("key"); String + * app_secret = rs.getString("secret"); String session_key = + * rs.getString("session_key"); String shop_name = rs.getString("name"); String + * platform_code = rs.getString("platform_code"); String platform_seller_code = + * rs.getString("platform_seller_code"); if ("001".equals(platform_code)) {// || + * "012".equals(platform_code) platform_code = "002"; } String key = + * company_code + "," + shop_code + "," + commodity_code; if + * (!map_shop.containsKey(key)) { ShopCommodityConfig scc = new + * ShopCommodityConfig(); scc.formula = formula; scc.onpassage_flag = + * onpassage_flag; scc.min_syn_quantity = min_syn_quantity; scc.percent = + * percent; scc.quantity = quantity; scc.storageCodes = storageCode; scc.app_key + * = app_key; scc.app_secret = app_secret; scc.session_key = session_key; + * scc.shop_name = shop_name; scc.platform_code = platform_code; + * scc.platform_seller_code = platform_seller_code; map_shop.put(key, scc); } + * else { ShopCommodityConfig sccput = new ShopCommodityConfig(); sccput = + * map_shop.get(key); sccput.storageCodes = sccput.storageCodes + "," + + * storageCode; map_shop.put(key, sccput); } } for (Map.Entry entry : map_shop.entrySet()) { String key = + * entry.getKey(); String[] shopMessages = key.split(","); String company_code = + * shopMessages[0] ; String shop_code = shopMessages[1] ; String commodity_code + * = shopMessages[2] ; ShopCommodityConfig scc = new ShopCommodityConfig(); scc + * = entry.getValue(); + * + * // //判断商品是否为代发 // sql = "select a.obm_company_code,b.obm_commodity_code "+ // + * "from tb_obm_agent_shop a,tb_obm_agent_commodity b "+ // + * "where a.company_code=? and b.commodity_code=? and a.status=2 and b.status=2 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code" + * ; // ps = conn.prepareStatement(sql); // rs = ps.executeQuery(); // while + * (rs.next()) { // obm_company_code = rs.getString("obm_company_code"); // + * obm_commodity_code = rs.getString("obm_commodity_code"); // agentFlag = true; + * // } + * + * if (parseDataTimer(company_code, shop_code, commodity_code, scc, map_shop)) { + * logger.info("库存更新|定时更新:" + commodity_code + "成功!所属公司:" + company_code + "店铺:" + * + shop_code); } else { logger.info("库存更新|定时更新:" + commodity_code + "失败!所属公司:" + * + company_code + "店铺:" + shop_code); } } + */ + + logger.info("库存更新|更新流水表数据查询时间为->" + time); + } catch (SQLException e) { + logger.info("库存更新|定时处理库存更新失败,放弃处理"); + logger.error(this, e); + } catch (Exception e) { + logger.info("库存更新|定时处理库存更新失败,放弃处理"); + logger.error(this, e); + } finally { + this.task.lastQueryTime = time; + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + /* + * private boolean parseDataTimer(String company_code, String shopCode, String + * commodity_code, ShopCommodityConfig scc, Map + * map_shop) { // Druid连接池管理数据库连接 DbPoolConnection dbpc = + * DbPoolConnection.getInstance(); DruidPooledConnection conn = null; + * PreparedStatement ps = null; ResultSet rs = null; ResultSet rs_unsend = null; + * ResultSet rs_type_in = null; // conn = OrderSyncs.dbUtil.getDbConn(); try { + * conn = dbpc.getConnection(); String storages = scc.storageCodes; // 计算库存数量 + * int sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, + * rs_unsend); // 获取待配货数量 int unsend = 0; unsend = getUnsendQuantity(storages, + * ps, conn, commodity_code, company_code, rs); + * + * // 获取待入库数量 int type_in = 0; sql = "select _getOnpassage('" + commodity_code + + * "','" + company_code + "') as type_in"; ps = conn.prepareStatement(sql); + * rs_type_in = ps.executeQuery(); if (rs_type_in.next()) { type_in = + * rs_type_in.getInt("type_in"); } + * + * if ("002".equals(scc.platform_code)) { + * + * updateTmall(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } else if ("003".equals(scc.platform_code)) { + * + * updateJingdong(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } else if ("004".equals(scc.platform_code)) { + * + * updateYhd(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } else if ("005".equals(scc.platform_code)) { + * + * updateDangdang(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } else if ("006".equals(scc.platform_code)) { + * + * updateGome(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } else if ("009".equals(scc.platform_code)) { + * + * updateFn(scc, commodity_code, shopCode, sum, unsend, type_in, 1, + * company_code, scc.platform_seller_code); + * + * } return true; } catch (SQLException e) { logger.error(this, e); return + * false; } catch (Exception e) { logger.error(this, e); return false; } finally + * { if (rs != null) { try { rs.close(); } catch (SQLException e) { + * logger.error(this, e); } catch (Exception e) { logger.error(this, e); } rs = + * null; } if (rs_unsend != null) { try { rs_unsend.close(); } catch + * (SQLException e) { logger.error(this, e); } catch (Exception e) { + * logger.error(this, e); } rs_unsend = null; } if (rs_type_in != null) { try { + * rs_type_in.close(); } catch (SQLException e) { logger.error(this, e); } catch + * (Exception e) { logger.error(this, e); } rs_type_in = null; } if (ps != null) + * { try { ps.close(); } catch (SQLException e) { logger.error(this, e); } catch + * (Exception e) { logger.error(this, e); } ps = null; } if (conn != null) { try + * { conn.close(); } catch (SQLException e) { logger.error(this, e); } catch + * (Exception e) { logger.error(this, e); } conn = null; } dbpc = null; } + * + * } + */ + } + + class ImmediateUpdateThread extends Thread { + public void run() { + try { + // while (true) { + if (ImmediateUpdateQueue.size() > 0) { + /** + * Druid连接池管理数据库连接 + */ + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + Map map_commodity = new ConcurrentHashMap(); + try { + conn = dbpc.getConnection(); + TradeInfo trade = ImmediateUpdateQueue.get(0); + ImmediateUpdateQueue.remove(0); + for (int i = 0; i < trade.orders.length; i++) { + String obm_company_code = ""; + String obm_commodity_code = ""; + boolean agentFlag = false; + OrderInfo orderInfo = trade.orders[i]; + /** + * 如果该子条目无商品信息,则跳过 + */ + if ((orderInfo.obm_commodity_code == null || "".equals(orderInfo.obm_commodity_code)) + && (orderInfo.commodity_code == null || "".equals(orderInfo.commodity_code))) { + continue; + } + /** + * 赠品的平台商家编码为空,暂不处理 + */ + if (orderInfo.platform_seller_code == null || "".equals(orderInfo.platform_seller_code)) { + continue; + } + if (orderInfo.obm_commodity_code != null && !"".equals(orderInfo.obm_commodity_code)) { + /** + * 如果品牌商编码不为空,那么要么是属于品牌商代经商上发货,要么属于经销商自有店铺发货,如果如下第一个sql的查询有结果,则为代发,不管品牌商的自发同步, + * 只去查询品牌商所有代发店铺的同步,否则去同步品牌商自有的店铺(目前都没有策略) + */ + Boolean foundFlag = false; + sql = "select a.company_code,b.commodity_code,c.platform_seller_code,a.shop_code " + + "from tb_obm_agent_shop a,tb_obm_agent_commodity b ,tb_commodity c " + + "where a.obm_company_code=? and b.obm_commodity_code=? and a.status=2 and b.status=2 and b.del_flag=1 and c.status=2 and c.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code " + + "and a.company_code=c.company_code and b.commodity_code=c.code"; + ps = conn.prepareStatement(sql); + ps.setString(1, orderInfo.obm_company_code); + ps.setString(2, orderInfo.obm_commodity_code); + rs = ps.executeQuery(); + while (rs.next()) { + foundFlag = true;// 查询到是代发订单 + agentFlag = true;// 代发标志 + String platform_seller_code = rs.getString("platform_seller_code"); + obm_commodity_code = orderInfo.obm_commodity_code; + obm_company_code = orderInfo.obm_company_code; + String agent_commodity_code = rs.getString("commodity_code"); + String agent_company = rs.getString("company_code"); + String shop_code = rs.getString("shop_code"); + String key = agent_commodity_code + "," + agent_company + "," + platform_seller_code + + "," + shop_code; + String value = obm_company_code + "," + obm_commodity_code + "," + agentFlag; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + } + // if (!foundFlag) { + /** + * 根据品牌商商品编码查询平台商家编码 + */ + sql = "select a.platform_seller_code from tb_commodity a left join tb_brand_dic b on a.brand_dic_code=b.code and a.company_code=b.company_code where a.status=2 and a.del_flag=1 and a.company_code= '" + + orderInfo.obm_company_code + "' and a.code= '" + orderInfo.obm_commodity_code + + "'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + String platform_seller_code = rs.getString("platform_seller_code"); + String key = orderInfo.obm_commodity_code + "," + orderInfo.obm_company_code + "," + + platform_seller_code + "," + ""; + String value = obm_company_code + "," + obm_commodity_code + "," + false; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + } + + // } + } else { + /** + * 非代发订单中,可能存在部分代发,判断单个sku是否建立代发关系,如果是代发,则去判断品牌商所有的代发店铺,否则只同步经销商自己的店铺 + */ + /* + * 2019-03-07 取消该部分代码 sql = + * "select a.obm_company_code,b.obm_commodity_code,c.platform_seller_code " + + * "from tb_obm_agent_shop a,tb_obm_agent_commodity b ,tb_commodity c " + + * "where a.company_code=? and b.commodity_code=? and a.status=2 and b.status=2 and c.status=2 and c.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code " + * + "and a.company_code=c.company_code and b.commodity_code=c.code "; ps = + * conn.prepareStatement(sql); ps.setString(1, trade.company_code); + * ps.setString(2, orderInfo.commodity_code); rs = ps.executeQuery(); + * //用if判断的条件是目前只有一个品牌商代发经销商的一个商品 if (rs.next()) { obm_company_code = + * rs.getString("obm_company_code"); obm_commodity_code = + * rs.getString("obm_commodity_code"); String obm_platform_seller_code = + * rs.getString("c.platform_seller_code"); sql = + * "select a.company_code,b.commodity_code,c.platform_seller_code,a.shop_code " + * + "from tb_obm_agent_shop a,tb_obm_agent_commodity b ,tb_commodity c " + + * "where a.obm_company_code=? and b.obm_commodity_code=? and a.status=2 and b.status=2 and c.status=2 and c.del_flag=1 and a.code=b.obm_agent_shop_code and a.obm_company_code=b.obm_company_code and a.company_code=b.company_code " + * + "and a.company_code=c.company_code and b.commodity_code=c.code"; ps = + * conn.prepareStatement(sql); ps.setString(1, obm_company_code); + * ps.setString(2, obm_commodity_code); rs = ps.executeQuery(); while + * (rs.next()) { agentFlag = true;// 代发标志 String platform_seller_code = + * rs.getString("platform_seller_code"); // = orderInfo.obm_commodity_code = ; + * // obm_company_code = trade.obm_company_code; String agent_commodity_code = + * rs.getString("commodity_code"); String agent_company = + * rs.getString("company_code"); String shop_code = rs.getString("shop_code"); + * String key = agent_commodity_code + "," + agent_company + "," + + * platform_seller_code + "," + shop_code; String value = obm_company_code + "," + * + obm_commodity_code + "," + agentFlag; if (!map_commodity.containsKey(key)) + * { map_commodity.put(key, value); } } + * //能查到代发关系,品牌商自己的店铺也可能有该商品的同步策略,所以都要讲品牌商添加上去查询 //2018-05-31 23:47:00 String + * key = obm_commodity_code + "," + obm_company_code + "," + + * obm_platform_seller_code + "," + ""; String value = obm_company_code + "," + + * obm_commodity_code + "," + false; if (!map_commodity.containsKey(key)) { + * map_commodity.put(key, value); } } else { + */ + String key = orderInfo.commodity_code + "," + trade.company_code + "," + + orderInfo.platform_seller_code + "," + ""; + String value = obm_company_code + "," + obm_commodity_code + "," + agentFlag; + if (!map_commodity.containsKey(key)) { + map_commodity.put(key, value); + } + // } + } + } + + for (Map.Entry entry : map_commodity.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + String obm_company_code = ""; + String obm_commodity_code = ""; + String shop_code = ""; + boolean agentFlag = false; + + String[] array_value = value.split(","); + obm_company_code = array_value[0]; + + obm_commodity_code = array_value[1]; + if ("true".equals(array_value[2])) { + agentFlag = true; + } + + String[] array = key.split(","); + if (agentFlag) { + shop_code = array[3]; + } + if (!parseDataImmediate(array[1], array[0], array[2], obm_company_code, obm_commodity_code, + agentFlag, 2, shop_code)) { + logger.info("库存更新|即时更新,商品:[ {} ] ,所属公司:[ {} ] 未成功,放弃处理", array[0], array[1]); + } + } + logger.info("库存更新|即时更新,待处理队列总数:[ {} ] ", ImmediateUpdateQueue.size()); + } catch (SQLException e) { + logger.info("库存更新|即时处理库存更新失败,放弃处理"); + logger.error(this, e); + } catch (Exception e) { + logger.info("库存更新|即时处理库存更新失败,放弃处理"); + logger.error(this, e); + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + + } + /** + * 暂停使用 2018-03-06 + */ + /* + * else if (ImmediateUpdateQueue.size() > 500) { Map + * map_commodity = new ConcurrentHashMap(); for (int i = 0; i < + * 500; i++) { TradeInfo trade = ImmediateUpdateQueue.get(0); for (int j = 0; j + * < trade.orders.length; j++) { String obm_company_code = ""; String + * obm_commodity_code = ""; boolean agentFlag = false; String value = ""; String + * commodity_code = trade.orders[j] .commodity_code; String company = + * trade.company_code; String platform_seller_code = trade.orders[j] + * .platform_seller_code; String key = commodity_code + "," + company + "," + + * platform_seller_code; if (trade.obm_flag == 1) { obm_company_code = + * trade.obm_company_code; obm_commodity_code = trade.orders[j] + * .obm_commodity_code; agentFlag = true; value = obm_company_code + "," + + * obm_commodity_code + "," + agentFlag; } if + * (!(map_commodity.containsKey(key))) { map_commodity.put(key, value); } } + * ImmediateUpdateQueue.remove(0); } for (Map.Entry entry : + * map_commodity.entrySet()) { String key = entry.getKey(); String value = + * entry.getValue(); String obm_company_code = ""; String obm_commodity_code = + * ""; boolean agentFlag = false; + * + * String [] array_value = value.split(","); obm_company_code = array_value[0] ; + * obm_commodity_code = array_value[1] ; if ("true".equals(array_value[2] )) { + * agentFlag = true; } + * + * String[] array = key.split(","); if (parseDataImmediate(array[1] , array[0] , + * array[2] , obm_company_code, obm_commodity_code, agentFlag, 2)) { // + * logger.info("【"+logTitle+"】库存更新|批量处理库存更新,商品:"+array[0] +",所属公司:"+ array[1] + * +"】完成"); } else { logger.info("【" + logTitle + "】库存更新|批量处理库存更新,商品:" + + * array[0] + ",所属公司:" + array[1] + "未成功,放弃处理"); } logger.info("库存更新|待处理队列总数:" + + * ImmediateUpdateQueue.size()); } } + */ + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + + } catch (Throwable e) { + logger.error(this, e); + } + } + } + + // 公司编号 商品编号 平台商品编码 + private boolean parseDataImmediate(String company_code, String commodity_code, String platform_seller_code, + String obm_company_code, String obm_commodity_code, boolean agentFlag, int sync_type, String shop_code) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + ResultSet rs_unsend = null; + ResultSet rs_type_in = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + int sum = 0; + Map map_shop = new ConcurrentHashMap();// 根据同步策略表查到的相关店铺的集合 + // Map map_storage= new + // HashMap();//根据同步策略表查到的相关仓库的集合 + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + try { + conn = dbpc.getConnection(); + // if(storage_code == null){ + + sql = "select b.storage_code as storageCode,b.shop_code as shopCode,a.quantity,a.percent,a.formula,a.onpassage_flag,a.min_syn_quantity,d.key,d.secret,c.name,c.platform_code,c.session_key,a.sync_lock_end_time " + + "from tb_shop_commodity_config a,tb_shop_storage b,tb_shop c,tb_platform_app d " + + "where a.commodity_code = '" + commodity_code + + "' and a.status=2 and a.shop_code = b.shop_code and a.company_code='" + company_code + "'" + + "and c.app_code=d.code and c.code=a.shop_code " + + "and d.del_flag=1 and c.del_flag=1 and c.auth_flag=2 and c.order_sync_flag=2 and c.stock_sync_flag=2 and a.del_flag=1 " + + "group by storageCode,shopCode"; + + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + /* + * }else{ sql = + * "select distinct b.storage_code as storageCode,b.shop_code as shopCode,a.quantity,a.percent,a.formula,a.onpassage_flag " + * + + * " from tb_shop_commodity_config a,tb_shop_storage b ,(select shop_code from tb_shop_storage where storage_code='" + * +storage_code+"')c"+ " where a.commodity_code = '" +commodity_code+ + * "' and a.status=2 and a.shop_code = c.shop_code and b.shop_code = c.shop_code and a.company_code='" + * +company_code+"'"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); } + */ + if (rs.next()) { + // 有的话 先获取第一条记录 + do { + String shopCode = rs.getString("shopCode"); + if (!map_shop.containsKey(shopCode)) { + ShopCommodityConfig sccput = new ShopCommodityConfig(); + sccput.percent = rs.getFloat("percent"); + sccput.quantity = rs.getInt("quantity"); + sccput.formula = rs.getInt("formula"); + sccput.onpassage_flag = rs.getInt("onpassage_flag"); + sccput.min_syn_quantity = rs.getInt("min_syn_quantity"); + sccput.storageCodes = rs.getString("storageCode"); + sccput.app_key = rs.getString("key"); + sccput.app_secret = rs.getString("secret"); + sccput.session_key = rs.getString("session_key"); + sccput.shop_name = rs.getString("name"); + sccput.platform_code = rs.getString("platform_code"); + sccput.sync_lock_end_time = rs.getString("sync_lock_end_time") == null ? "" + : rs.getString("sync_lock_end_time"); + if ("001".equals(sccput.platform_code)) {// || + // "012".equals(sccput.platform_code) + sccput.platform_code = "002"; + } + map_shop.put(rs.getString("shopCode"), sccput); + } else { + ShopCommodityConfig sccput = new ShopCommodityConfig(); + sccput = map_shop.get(shopCode); + sccput.storageCodes = sccput.storageCodes + "," + rs.getString("storageCode"); + map_shop.put(shopCode, sccput); + } + } while (rs.next()); + } else { + logger.info("库存更新|[ {} ] :该商品未定制任何策略,放弃处理!", commodity_code); + return true; + } + + // 获取待入库数量 + int type_in = 0; + sql = "select _getOnpassage(?,?) as type_in"; + ps = conn.prepareStatement(sql); + if (agentFlag) { + ps.setString(1, obm_commodity_code); + ps.setString(2, obm_company_code); + } else { + ps.setString(1, commodity_code); + ps.setString(2, company_code); + } + rs_type_in = ps.executeQuery(); + if (rs_type_in.next()) { + type_in = rs_type_in.getInt("type_in"); + } + + int count = 0;// 用于计数 + for (Map.Entry entry : map_shop.entrySet()) { + // for (String shopCode : map_shop.keySet()) { + String shopCode = entry.getKey(); + if (agentFlag) { + if (!shopCode.equals(shop_code)) { + continue; + } + } + ShopCommodityConfig scc = entry.getValue(); + String storages = scc.storageCodes; + + // 获取待发货数量 +// int unsend = 0; + + // if (agentFlag && count == 0) { + // unsend = getUnsendQuantity_NoStorage(ps, conn, obm_commodity_code, + // obm_company_code, rs_unsend); + // } + // + // if (!agentFlag) { + // unsend = getUnsendQuantity(storages, ps, conn, commodity_code, company_code, + // rs_unsend); + // } + + // 判断是什么平台 + if ("002".equals(scc.platform_code)) { + sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, rs, obm_company_code, + obm_commodity_code, agentFlag); + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if (("".equals(scc.sync_lock_end_time)) || (now.compareTo(scc.sync_lock_end_time) > 0)) { + updateTmall(scc, commodity_code, shopCode, sum, type_in, sync_type, company_code, + platform_seller_code); + } + + } else if ("003".equals(scc.platform_code)) { + sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, rs, obm_company_code, + obm_commodity_code, agentFlag); + + updateJingdong(scc, commodity_code, shopCode, sum, type_in, sync_type, company_code, + platform_seller_code); + + } /* + * else if ("004".equals(scc.platform_code)) { sum = sum(shopCode, storages, + * commodity_code, company_code, conn, ps, rs, obm_company_code, + * obm_commodity_code, agentFlag); + * + * updateYhd(scc, commodity_code, shopCode, sum, type_in, sync_type, + * company_code, platform_seller_code); + * + * } + */else if ("005".equals(scc.platform_code)) { + sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, rs, obm_company_code, + obm_commodity_code, agentFlag); + + updateDangdang(scc, commodity_code, shopCode, sum, type_in, sync_type, company_code, + platform_seller_code); + + } else if ("006".equals(scc.platform_code)) { + sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, rs, obm_company_code, + obm_commodity_code, agentFlag); + + updateGome(scc, commodity_code, shopCode, sum, type_in, sync_type, company_code, + platform_seller_code); + + } /* + * else if ("009".equals(scc.platform_code)) { sum = sum(shopCode, storages, + * commodity_code, company_code, conn, ps, rs, obm_company_code, + * obm_commodity_code, agentFlag); + * + * updateFn(scc, commodity_code, shopCode, sum, type_in, sync_type, + * company_code, platform_seller_code); + * + * } + */else if ("014".equals(scc.platform_code)) { + sum = sum(shopCode, storages, commodity_code, company_code, conn, ps, rs, obm_company_code, + obm_commodity_code, agentFlag); + updatePdd(scc, obm_commodity_code, shop_code, sum, type_in, sync_type, obm_company_code, + platform_seller_code); + } + count++; + } + return true; + } catch (SQLException e) { + logger.error(this, e); + return false; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs = null; + } + if (rs_unsend != null) { + try { + rs_unsend.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_unsend = null; + } + if (rs_type_in != null) { + try { + rs_type_in.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + rs_type_in = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + /** + * + * @title: sum + * @description: 商品可用库存 + * @throws Exception + */ + private synchronized int sum(String shopCode, String storages, String commodity_code, String company_code, + DruidPooledConnection conn, PreparedStatement ps, ResultSet rs, String obm_company_code, + String obm_commodity_code, boolean agentFlag) throws Exception { + int sum = 0; + + // 公司 商店 商品 + String sql2 = "select _getUnsendQuantity(?,?,?)"; + ps = conn.prepareStatement(sql2); + ps.setString(1, obm_company_code); + ps.setString(2, shopCode); + ps.setString(3, obm_commodity_code); + // 未发货 + int wfh = 0; + rs = ps.executeQuery(); + + if (rs.next()) { + wfh = rs.getInt(1); + // 公司 商店 商品 未发货量 + String sql1 = "select _getSaleableQuantity(?,?,?,?)"; + + ps = conn.prepareStatement(sql1); + if (agentFlag) { + ps.setString(1, obm_company_code); + ps.setString(2, shopCode); + ps.setString(3, obm_commodity_code); + ps.setInt(4, wfh); + } else { + ps.setString(1, company_code); + ps.setString(2, shopCode); + ps.setString(3, commodity_code); + ps.setInt(4, wfh); + } + rs = ps.executeQuery(); + if (rs.next()) { + sum = rs.getInt(1); + } + + } + + return sum; + } + // + // private int getUnsendQuantity(String storages, PreparedStatement ps, + // DruidPooledConnection conn, + // String commodity_code, String company_code, ResultSet rs) throws Exception { + // // 获取待发货数量 + // int unsend = 0; + // String[] storage = storages.split(","); + // for (int i = 0; i < storage.length; i++) { + // String sto = storage[i] ; + // sql = "select _getUnsendQuantity(?,?,?) as unsend"; + // ps = conn.prepareStatement(sql); + // ps.setString(1, commodity_code); + // ps.setString(2, sto); + // ps.setString(3, company_code); + // rs = ps.executeQuery(); + // if (rs.next()) { + // unsend += rs.getInt("unsend"); + // } + // } + // + // return unsend; + // } + + // private int getUnsendQuantity_NoStorage(PreparedStatement ps, + // DruidPooledConnection conn, String commodity_code, + // String company_code, ResultSet rs) throws Exception { + // // 获取待发货数量 + // int unsend = 0; + // sql = "select _getUnsendQuantity_NoStorage(?,?) as unsend"; + // ps = conn.prepareStatement(sql); + // ps.setString(1, commodity_code); + // ps.setString(2, company_code); + // rs = ps.executeQuery(); + // if (rs.next()) { + // unsend += rs.getInt("unsend"); + // } + // return unsend; + // } + + private synchronized boolean updateTmall(ShopCommodityConfig scc, String commodityCode, String shopCode, int sum, + int typeIn, int syncType, String companyCode, String platformSellerCode) { + long value = 0L;// 记录更新的数量 + try { + // 应更新的数量 + value = getUpdateNum(scc, sum, typeIn); + String url = "http://gw.api.taobao.com/router/rest"; + TaobaoClient client1 = new DefaultTaobaoClient(url, scc.app_key, scc.app_secret); + SkusCustomGetRequest req1 = new SkusCustomGetRequest(); + req1.setOuterId(platformSellerCode); + req1.setFields("sku_id,num_iid,quantity"); + SkusCustomGetResponse rsp1; + rsp1 = client1.execute(req1, scc.session_key); + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|{}", scc.platform_code, commodityCode, rsp1.getBody()); + String jsonString1 = rsp1.getBody(); + JSONObject json1 = new JSONObject(jsonString1); + // api接口错误处理 + if (json1.has("error_response")) { + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, jsonString1, + companyCode, scc.formula, scc.onpassage_flag); + return false;// + } + JSONObject skus_custom_get_response = json1.getJSONObject("skus_custom_get_response"); + if (!skus_custom_get_response.has("skus")) {// 如果没有sku,则去取itemid + // insertStorageLog(shop_code,commodity_code,"",sum,unsent,type_in,value,scc,sync_type,2,jsonString, + // company_code); + // logger.info("【"+logTitle+"】平台:"+scc.platform_code+"商品:"+commodity_code+"库存更新|" + // + "策略商品在第三方平台未查询到,请检查是否下架!】" ); + TaobaoClient client3 = new DefaultTaobaoClient(url, scc.app_key, scc.app_secret); + ItemsCustomGetRequest req3 = new ItemsCustomGetRequest(); + req3.setOuterId(platformSellerCode); + req3.setFields("num_iid"); + ItemsCustomGetResponse rsp3 = client3.execute(req3, scc.session_key); + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|{}" + scc.platform_code, commodityCode, rsp3.getBody()); + String jsonString3 = rsp3.getBody(); + if (jsonString3.indexOf("error_response") > -1) { + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, jsonString3, + companyCode, scc.formula, scc.onpassage_flag); + return false;// + } + JSONObject json3 = new JSONObject(jsonString3); + JSONObject items_custom_get_response = json3.getJSONObject("items_custom_get_response"); + JSONObject items = items_custom_get_response.getJSONObject("items"); + JSONArray itemArray = items.getJSONArray("item"); + int count = 0; + for (int i = 0; i < itemArray.length(); i++) { + JSONObject item = itemArray.getJSONObject(i); + long num_iid = item.has("num_iid") ? item.getLong("num_iid") : 0; + if (num_iid == 0) { + logger.info("平台:[ {} ] 库存更新|[ {} ] 的num_iid为空,不能更新", scc.platform_code, commodityCode); + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, jsonString1, + companyCode, scc.formula, scc.onpassage_flag); + return true; + } + //对于tmallPromotionRuleEndTime不为空字符串,且是未来的某个时间点,先获取商品的活动,然后在确定是否更新 + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if(tmallPromotionRuleEndTime.compareTo(now)>=0){ + String endTime = getPromotionRule(url, scc, num_iid, commodityCode); + if (!"".equals(endTime)) { + updatePromotionRuleTime(companyCode, shopCode, commodityCode, endTime); + logger.info("平台:[ {} ] 库存更新|[ {} ] 有限制更新库存的规则存在,放弃更新", scc.platform_code, commodityCode); + continue; + } + } + TaobaoClient client4 = new DefaultTaobaoClient(url, scc.app_key, scc.app_secret); + ItemQuantityUpdateRequest req4 = new ItemQuantityUpdateRequest(); + req4.setNumIid(num_iid); + req4.setQuantity(value); + req4.setType(1L); + ItemQuantityUpdateResponse rsp4 = client4.execute(req4, scc.session_key); + String jsonString4 = rsp4.getBody(); + JSONObject itemQuantityUpdateResponseJsonObject = new JSONObject(jsonString4); + if (itemQuantityUpdateResponseJsonObject.has("item_quantity_update_response")) { + count++; + insertStorageLog(shopCode, commodityCode, String.valueOf(num_iid), sum, typeIn, value, scc, + syncType, 1, "", companyCode, scc.formula, scc.onpassage_flag); + } else { + if (itemQuantityUpdateResponseJsonObject.has("error_response")) { + JSONObject errorResponse = itemQuantityUpdateResponseJsonObject + .getJSONObject("error_response"); + String subCode = errorResponse.getString("sub_code"); + /** + * 在没有活动的时候,通过此处检测到有活动开始限制更新库存, + * 在内存中记录tmallPromotionRuleEndTime,并在开始更新库存前查询需要同步的商品是否有活动限制 + */ + if ("isv.sku-quantity-update-fail-in-activity-tmall".equals(subCode)) { + String endTime = getPromotionRule(url, scc, num_iid, commodityCode); + if (!"".equals(endTime)) { + updatePromotionRuleTime(companyCode, shopCode, commodityCode, endTime); + tmallPromotionRuleEndTime = endTime; + } + } else if ("SYS_REQUEST_TOO_FAST-tmall".equals(subCode)) { + Thread.sleep(5*1000); + } + } + insertStorageLog(shopCode, commodityCode, String.valueOf(num_iid), sum, typeIn, value, scc, + syncType, 2, jsonString4, companyCode, scc.formula, scc.onpassage_flag); + } + } + if (count > 0) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新成功", scc.platform_code, commodityCode); + return true; + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新失败", scc.platform_code, commodityCode); + return false; + } + } else { + JSONObject skus = skus_custom_get_response.getJSONObject("skus"); + JSONArray aSku = skus.getJSONArray("sku"); + int count = 0; + for (int i = 0; i < aSku.length(); i++) { + JSONObject sku = aSku.getJSONObject(i); + long sku_id = sku.has("sku_id") ? sku.getLong("sku_id") : 0; + long num_iid = sku.has("num_iid") ? sku.getLong("num_iid") : 0; + // int quantity = sku.has("quantity")? + // sku.getInt("quantity") : 0; + if (num_iid == 0) { + logger.info("平台:[ {} ] 库存更新|[ {} ] 的num_iid为空,不能更新", scc.platform_code, commodityCode); + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, jsonString1, + companyCode, scc.formula, scc.onpassage_flag); + return true; + } + //对于tmallPromotionRuleEndTime不为空字符串,且是未来的某个时间点,先获取商品的活动,然后在确定是否更新 + String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + if(tmallPromotionRuleEndTime.compareTo(now)>=0){ + String endTime = getPromotionRule(url, scc, num_iid, commodityCode); + if (!"".equals(endTime)) { + updatePromotionRuleTime(companyCode, shopCode, commodityCode, endTime); + logger.info("平台:[ {} ] 库存更新|[ {} ] 有限制更新库存的规则存在,放弃更新", scc.platform_code, commodityCode); + continue; + } + } + TaobaoClient client2 = new DefaultTaobaoClient(url, scc.app_key, scc.app_secret); + ItemQuantityUpdateRequest req2 = new ItemQuantityUpdateRequest(); + req2.setNumIid(num_iid); + req2.setSkuId(sku_id); + req2.setOuterId(commodityCode); + req2.setQuantity(value); + req2.setType(1L); + ItemQuantityUpdateResponse rsp2 = client2.execute(req2, scc.session_key); + String jsonStr = rsp2.getBody(); + JSONObject itemQuantityUpdateResponseJsonObject = new JSONObject(jsonStr); + logger.info("[ {} ] 库存更新|[ {} ] 共查到[ {} ] 条记录,第[ {} ] 条记录更新返回结果:{}", scc.platform_code, + commodityCode, aSku.length(), (i + 1), jsonStr); + if (itemQuantityUpdateResponseJsonObject.has("item_quantity_update_response")) { + count++; + insertStorageLog(shopCode, commodityCode, String.valueOf(sku_id), sum, typeIn, value, scc, + syncType, 1, "", companyCode, scc.formula, scc.onpassage_flag); + } else { + if (itemQuantityUpdateResponseJsonObject.has("error_response")) { + JSONObject errorResponse = itemQuantityUpdateResponseJsonObject + .getJSONObject("error_response"); + String subCode = errorResponse.getString("sub_code"); + /** + * 在没有活动的时候,通过此处检测到有活动开始限制更新库存, + * 在内存中记录tmallPromotionRuleEndTime,并在开始更新库存前查询需要同步的商品是否有活动限制 + */ + if ("isv.sku-quantity-update-fail-in-activity-tmall".equals(subCode)) { + String endTime = getPromotionRule(url, scc, num_iid, commodityCode); + if (!"".equals(endTime)) { + updatePromotionRuleTime(companyCode, shopCode, commodityCode, endTime); + tmallPromotionRuleEndTime = endTime; + } + } else if ("SYS_REQUEST_TOO_FAST-tmall".equals(subCode)) { + Thread.sleep(5*1000); + } + } + + insertStorageLog(shopCode, commodityCode, String.valueOf(sku_id), sum, typeIn, value, scc, + syncType, 2, jsonStr, companyCode, scc.formula, scc.onpassage_flag); + } + } + if (count > 0) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新成功", scc.platform_code, commodityCode); + return true; + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新失败", scc.platform_code, commodityCode); + return false; + } + } + } catch (ApiException e) { + logger.error(this, e); + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, e.toString(), + companyCode, scc.formula, scc.onpassage_flag); + return false; + } catch (JSONException e) { + logger.error(this, e); + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, e.toString(), + companyCode, scc.formula, scc.onpassage_flag); + return false; + } catch (Exception e) { + logger.error(this, e); + insertStorageLog(shopCode, commodityCode, "", sum, typeIn, value, scc, syncType, 2, e.toString(), + companyCode, scc.formula, scc.onpassage_flag); + return false; + } + } + + /** + * @Description: 根据商品的num_iid查询商品是否有营销活动 + * @Title: getPromotionRule + * @author Lewis + * @param url + * @param scc + * @param num_iid + * @param commodity_code + * @return endTime + * @throws Exception + */ + private String getPromotionRule(String url, ShopCommodityConfig scc, long num_iid, String commodity_code) + throws Exception { + TaobaoClient client = new DefaultTaobaoClient(url, scc.app_key, scc.app_secret); + ItemPromotionRuleGetRequest req = new ItemPromotionRuleGetRequest(); + req.setItemId(num_iid); + ItemPromotionRuleGetResponse response = client.execute(req, scc.session_key); + String promotionRuleJsonString = response.getBody(); + logger.info("平台:[ {} ] 商品:[ {} ],类目编码:[ {} ] 库存更新| 获取商品已生效营销活动更新规则 :{}", scc.platform_code, commodity_code, + num_iid, promotionRuleJsonString); + JSONObject promotionRuleJson = new JSONObject(promotionRuleJsonString); + + if (promotionRuleJson.has("item_promotion_rule_get_response")) { + JSONObject itemPromotionRuleJsonObject = promotionRuleJson + .getJSONObject("item_promotion_rule_get_response"); + if (itemPromotionRuleJsonObject.has("effec")) { + boolean effec = itemPromotionRuleJsonObject.getBoolean("effec"); + if (effec) { + JSONObject itemPromotionRulesJsonObject = itemPromotionRuleJsonObject.getJSONObject("rules"); + JSONArray itemPromotionRulesJsonArray = itemPromotionRulesJsonObject + .getJSONArray("item_promotion_rule"); + for (int i = 0; i < itemPromotionRulesJsonArray.length(); i++) { + JSONObject itemPromotionRule = itemPromotionRulesJsonArray.getJSONObject(i); + String type = itemPromotionRule.getString("type"); + if ("库存减少锁定规则".equals(type)) { + String endTime = itemPromotionRule.getString("end_time"); + return endTime; + } + } + + } + } + } + return ""; + } + + /** + * @Description: 更新tb_shop_commodity_config的商品在淘宝平台的活动结束时间,以控制商品库存同步的更新 + * @Title: updatePromotionRuleTime + * @author Lewis + * @param companyCode + * @param shopCode + * @param commodityCode + * @param endTime + * @return 更新成功与否 + * @throws + */ + private boolean updatePromotionRuleTime(String companyCode, String shopCode, String commodityCode, String endTime) throws Exception{ + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + String sql = "UPDATE tb_shop_commodity_config SET sync_lock_end_time=? WHERE company_code=? AND shop_code=? AND commodity_code=? AND del_flag=1 AND STATUS=2"; + ps = conn.prepareStatement(sql); + ps.setString(1, endTime); + ps.setString(2, companyCode); + ps.setString(3, shopCode); + ps.setString(4, commodityCode); + if (ps.executeUpdate() == 0) { + logger.info("商品:[ {} ],店铺:[ {} ] 库存更新| 更新商品已生效营销活动更新规则的结束时间失败", commodityCode, shopCode); + return false; + } + logger.info("商品:[ {} ],店铺:[ {} ] 库存更新| 更新商品已生效营销活动更新规则的结束时间成功", commodityCode, shopCode); + return true; + } catch (Exception e) { + logger.error(this, e); + throw e; + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + + private synchronized boolean updateJingdong(ShopCommodityConfig scc, String commodity_code, String shop_code, + int sum, int type_in, int sync_type, String company_code, String platform_seller_code) { + + long sku_id = 0L; + long value = 0L; + try { + String url = "https://api.jd.com/routerjson"; + JdClient client_jd1 = new DefaultJdClient(url, scc.session_key, scc.app_key, scc.app_secret, 5000, 5000);// 超时时间都设置为5秒,不同于抓单的30秒 + SkuReadSearchSkuListRequest request1 = new SkuReadSearchSkuListRequest(); + + request1.setOutId(platform_seller_code); + request1.setField("skuId,status,stockNum"); + SkuReadSearchSkuListResponse response_jd1 = client_jd1.execute(request1); + String jsonString_jd1 = response_jd1.getMsg(); + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|{}", scc.platform_code, commodity_code, response_jd1.getMsg()); + + JSONObject json_jd1 = new JSONObject(jsonString_jd1); + + value = getUpdateNum(scc, sum, type_in); + // api接口错误处理 + if (json_jd1.has("error_response")) {// 京东如果没有对应的外部编码,会按正常格式返回,而不是error_response,因此错误要重试 + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, jsonString_jd1, + company_code, scc.formula, scc.onpassage_flag); + return false; + } + JSONObject jingdong_sku_read_searchSkuList_responce = json_jd1 + .getJSONObject("jingdong_sku_read_searchSkuList_responce"); + JSONObject page = jingdong_sku_read_searchSkuList_responce.getJSONObject("page"); + long totalItem = page.getLong("totalItem");// 不确定是long还是int类型的数据 + if (totalItem < 1) { + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, jsonString_jd1, + company_code, scc.formula, scc.onpassage_flag); + logger.info("[ {} ] 库存更新|未查询到相关商品[ {} ] ", scc.platform_code, commodity_code); + return true; + } + JSONArray datas = page.getJSONArray("data"); + int count = 0; + for (int i = 0; i < datas.length(); i++) { + JSONObject data = datas.getJSONObject(i); + sku_id = data.getLong("skuId"); + if (sku_id == 0) { + logger.info("[ 库存更新[ {} ] ] [ {} ] 的sku_id为空,不能更新", scc.platform_code, commodity_code); + } + JdClient client_jd2 = new DefaultJdClient(url, scc.session_key, scc.app_key, scc.app_secret, 5000, + 5000); + + StockWriteUpdateSkuStockRequest request2 = new StockWriteUpdateSkuStockRequest(); + request2.setSkuId(sku_id); + request2.setStockNum(value); + StockWriteUpdateSkuStockResponse response2 = client_jd2.execute(request2); + String jsonString_jd2 = response2.getMsg(); + logger.info("平台:[ {} ] 库存更新|[ {} ] 共查到[ {} ] 条记录,第[ {} ] 条记录更新返回结果:{}" + scc.platform_code, + commodity_code, datas.length(), (i + 1), jsonString_jd2); + JSONObject json_jd2 = new JSONObject(jsonString_jd2); + if (json_jd2.has("error_response")) {// 京东如果没有对应的外部编码,会按正常格式返回,而不是error_response,因此错误要重试 + insertStorageLog(shop_code, commodity_code, String.valueOf(sku_id), sum, type_in, value, scc, + sync_type, 2, jsonString_jd2, company_code, scc.formula, scc.onpassage_flag); + return false; + } + JSONObject jingdong_stock_write_updateSkuStock_responce = json_jd2 + .getJSONObject("jingdong_stock_write_updateSkuStock_responce"); + boolean success = jingdong_stock_write_updateSkuStock_responce.getBoolean("success"); + if (success) { + insertStorageLog(shop_code, commodity_code, String.valueOf(sku_id), sum, type_in, value, scc, + sync_type, 1, "", company_code, scc.formula, scc.onpassage_flag); + count++; + } else { + insertStorageLog(shop_code, commodity_code, String.valueOf(sku_id), sum, type_in, value, scc, + sync_type, 2, jsonString_jd2, company_code, scc.formula, scc.onpassage_flag); + } + } + if (count > 0) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新成功", scc.platform_code, commodity_code); + return true; + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|库存更新失败", scc.platform_code, commodity_code); + return false; + } + } catch (JdException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (JSONException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (Exception e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } + + } + + /* + * //一号店平台服务已取消 private synchronized boolean updateYhd(ShopCommodityConfig scc, + * String commodity_code, String shop_code, int sum, int type_in, int sync_type, + * String company_code, String platform_seller_code) { int value = 0; try { + * String url = "http://openapi.yhd.com/app/api/rest/router"; + * + * value = (int) getUpdateNum(scc, sum, type_in); + * + * YhdClient yhd = new YhdClient(url, scc.app_key, scc.app_secret); + * ProductStockUpdateRequest request = new ProductStockUpdateRequest(); + * request.setVirtualStockNum(value); request.setUpdateType(1); + * request.setOuterId(platform_seller_code); ProductStockUpdateResponse response + * = yhd.excute(request, scc.session_key); String jsonString = + * response.getBody(); logger .info("平台:" + scc.platform_code + "商品:" + + * commodity_code + "库存更新|" + jsonString); JSONObject json = new + * JSONObject(jsonString); JSONObject response_message = + * json.getJSONObject("response"); int errorCount = + * response_message.getInt("errorCount"); if (errorCount > 0) { if + * (jsonString.indexOf("指定的产品信息不存在") > -1) { logger.info("" + scc.platform_code + * + "库存更新|" + "策略商品在第三方平台未查询到,请检查是否下架!】" + commodity_code); + * insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, + * sync_type, 2, jsonString, company_code, scc.formula, scc.onpassage_flag); + * return true; } else { logger.info( "平台:" + scc.platform_code + "商品:" + + * commodity_code + "库存更新|" + "更新失败"); insertStorageLog(shop_code, + * commodity_code, "", sum, type_in, value, scc, sync_type, 2, jsonString, + * company_code, scc.formula, scc.onpassage_flag); return false; } } else { + * logger .info("平台:" + scc.platform_code + "商品:" + commodity_code + "库存更新|" + + * "更新成功"); insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, + * scc, sync_type, 1, "", company_code, scc.formula, scc.onpassage_flag); return + * true; } } catch (JSONException e) { logger.error(this, e); + * insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, + * sync_type, 1, e.toString(), company_code, scc.formula, scc.onpassage_flag); + * return false; } catch (Exception e) { logger.error(this, e); + * insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, + * sync_type, 1, e.toString(), company_code, scc.formula, scc.onpassage_flag); + * return false; } + * + * } + */ + private synchronized boolean updateDangdang(ShopCommodityConfig scc, String commodity_code, String shop_code, + int sum, int type_in, int sync_type, String company_code, String platform_seller_code) { + String url = "http://api.open.dangdang.com/openapi/rest"; + GetMethod httpMethod = new GetMethod(url); + long value = 0L; + try { + value = (int) getUpdateNum(scc, sum, type_in); + + String signStr = scc.app_secret + "app_key" + scc.app_key + "format" + "xml" + "method" + + "dangdang.item.stock.update" + "session" + scc.session_key + "sign_method" + "md5" + "timestamp" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + scc.app_secret;// 组成签名字符串 + String signStrMD5 = MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + scc.app_key + + "&method=" + "dangdang.item.stock.update" + "&format=" + "xml" + "&session=" + scc.session_key + + "&oit=" + platform_seller_code + "&stk=" + value; + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + String jsonString = xmlToJson(resxml);// 将xml转为json + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新{}", scc.platform_code, commodity_code, jsonString); + if (jsonString.indexOf("操作成功") > -1) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新成功", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 1, "", + company_code, scc.formula, scc.onpassage_flag); + return true; + } else if (jsonString.indexOf("这个商品不存在") > -1) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|策略商品在第三方平台未查询到,请检查是否下架!", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, jsonString, + company_code, scc.formula, scc.onpassage_flag); + return true; + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新失败,稍后重试!", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, jsonString, + company_code, scc.formula, scc.onpassage_flag); + return false; + } + } catch (URIException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (HttpException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (IOException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (Exception e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } + } + + private synchronized boolean updateGome(ShopCommodityConfig scc, String commodity_code, String shop_code, int sum, + int type_in, int sync_type, String company_code, String platform_seller_code) { + String url = "http://gw.gome.com.cn/router"; + long value = 0L; + try { + value = getUpdateNum(scc, sum, type_in); + + GmosClient cc_itemId = new DefaultGmosClient(url, scc.app_key, scc.app_secret, scc.session_key); + GomeGoodsItemCustomGetRequest request_itemId = new GomeGoodsItemCustomGetRequest(); + // 详细参数信息请参考API详情页面。 + request_itemId.setFields("itemId"); + request_itemId.setOutId(platform_seller_code); + GomeGoodsItemCustomGetResponse response_itemId = cc_itemId.execute(request_itemId); + String jsonString_itemId = response_itemId.getBody(); + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|{}", scc.platform_code, commodity_code, jsonString_itemId); + + // 如果返回错误信息,分为找不到商品或者更新失败,如果找不到打印信息,更新失败重试 + if (jsonString_itemId.indexOf("itemId") == -1) { + logger.info("[ {} ] 库存更新|策略商品在第三方平台未查询到,请检查是否下架![ {} ] ", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, + jsonString_itemId, company_code, scc.formula, scc.onpassage_flag); + return true; + } + JSONObject json = new JSONObject(jsonString_itemId); + JSONObject gome_goods_itemCustom_get_response = json.getJSONObject("gome_goods_itemCustom_get_response"); + JSONObject result = gome_goods_itemCustom_get_response.getJSONObject("result"); + String itemId = result.getString("itemId"); + + GmosClient cc_update = new DefaultGmosClient(url, scc.app_key, scc.app_secret, scc.session_key); + GomeGoodsItemQuantityUpdateRequest request_update = new GomeGoodsItemQuantityUpdateRequest(); + // 详细参数信息请参考API详情页面。 + request_update.setItemId(itemId); + request_update.setQuantity(String.valueOf(value)); + GomeGoodsItemQuantityUpdateResponse response_update = cc_update.execute(request_update); + String jsonString_update = response_update.getBody(); + logger.info(jsonString_update); + if (jsonString_update.indexOf("\"result\":\"Y\"") > -1) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新成功", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, itemId, sum, type_in, value, scc, sync_type, 1, "", + company_code, scc.formula, scc.onpassage_flag); + return true; + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新失败,稍后重试", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, itemId, sum, type_in, value, scc, sync_type, 2, + jsonString_update, company_code, scc.formula, scc.onpassage_flag); + return false; + } + } catch (JSONException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (Exception e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } + } + + /* + * //飞牛平台服务已取消 private synchronized boolean updateFn(ShopCommodityConfig scc, + * String commodity_code, String shop_code, int sum, int type_in, int sync_type, + * String company_code, String platform_seller_code) { logger.info("平台:" + + * scc.platform_code + "商品:" + commodity_code + "库存更新|"); String url = + * "http://open.feiniu.com/call.do?"; long value = 0L; try { value = + * getUpdateNum(scc, sum, type_in); FnClient client_query = new + * DefaultFnClient(url, scc.session_key, scc.app_key, scc.app_secret); + * ItemSkuidGetRequest request_query = new ItemSkuidGetRequest(); + * request_query.setBarcodes(platform_seller_code); ItemSkuidGetResponse + * response_query = client_query.execute(request_query); String mess = + * response_query.getMsg(); if (!"success".equals(mess)) { logger.info("平台:" + + * scc.platform_code + "商品:" + commodity_code + "库存更新|商品查询失败,错误码:" + + * response_query.getCode()); insertStorageLog(shop_code, commodity_code, "", + * sum, type_in, value, scc, sync_type, 2, mess, company_code, scc.formula, + * scc.onpassage_flag); return false; } List data = + * response_query.getData(); if (data.isEmpty()) { logger.info("平台:" + + * scc.platform_code + "商品:" + commodity_code + "库存更新|" + + * "策略商品在第三方平台未查询到,请检查是否下架!"); insertStorageLog(shop_code, commodity_code, "", + * sum, type_in, value, scc, sync_type, 2, "第三方平台未查询到该商品", company_code, + * scc.formula, scc.onpassage_flag); return true; } int count = 0; for (int i = + * 0; i < data.size(); i++) { ItemSkuidBarcodeVo isbv = data.get(i); String + * sku_id = isbv.getSmSeq(); + * + * // 通过sku_id更新商品的库存 FnClient client_update = new DefaultFnClient(url, + * scc.session_key, scc.app_key, scc.app_secret); ItemSkuBatchUpdateRequest + * request_update = new ItemSkuBatchUpdateRequest(); + * request_update.setSkuIds(sku_id); + * request_update.setStocks(String.valueOf(value)); ItemSkuBatchUpdateResponse + * response_update = client_update.execute(request_update); String mess_update = + * response_update.getMsg(); logger.info("平台:" + scc.platform_code + "库存更新|" + + * commodity_code + "共查到" + data.size() + "条记录,第" + (i + 1) + "条记录更新返回信息:" + + * mess_update); if ("success".equals(mess_update)) { count++; + * insertStorageLog(shop_code, commodity_code, sku_id, sum, type_in, value, scc, + * sync_type, 1, "", company_code, scc.formula, scc.onpassage_flag); } else { + * insertStorageLog(shop_code, commodity_code, sku_id, sum, type_in, value, scc, + * sync_type, 2, mess_update, company_code, scc.formula, scc.onpassage_flag); } + * } if (count > 0) { logger .info("平台:" + scc.platform_code + "商品:" + + * commodity_code + "库存更新|" + "更新成功"); return true; } else { logger.info( "平台:" + * + scc.platform_code + "商品:" + commodity_code + "库存更新|" + "更新失败,稍后重试"); return + * false; } } catch (FnException e) { logger.error(this, e); + * insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, + * sync_type, 2, e.toString(), company_code, scc.formula, scc.onpassage_flag); + * return false; } catch (Exception e) { logger.error(this, e); + * insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, + * sync_type, 2, e.toString(), company_code, scc.formula, scc.onpassage_flag); + * return false; } } + */ + /** + * + * @title: updatePdd + * @description: TODO(拼多多库存更新方法) + * @param scc 同步策略信息 + * @param commodity_code 商品编码 + * @param shop_code 店铺编码 + * @param sum 商品可用库存 + * @param type_in 采购数量(未入库) + * @param sync_type 同步类型 1:定时同步 2:即时同步 + * @param company_code 企业编码 + * @param platform_seller_code 平台商家编码 + * @return boolean true:更新成功 false:更新失败 + */ + private synchronized boolean updatePdd(ShopCommodityConfig scc, String commodity_code, String shop_code, int sum, + int type_in, int sync_type, String company_code, String platform_seller_code) { + long value = 0L; + JSONObject error_response = null; + int error_code; + String error_msg; + long goods_id = 0L; + long sku_id = 0L; + try { + value = getUpdateNum(scc, sum, type_in);// 获取商品可用库存 + PopClient client = new PopHttpClient(scc.app_key, scc.app_secret); + // 根据商品outer_id获取商品igood_id,以及sku_id + PddGoodsListGetRequest getGoodsListRequest = new PddGoodsListGetRequest(); + getGoodsListRequest.setOuterId(platform_seller_code); + PddGoodsListGetResponse pddGoodsListGetResponse = client.syncInvoke(getGoodsListRequest, scc.session_key); + String goods_list_get_response_str = JsonUtil.transferToJson(pddGoodsListGetResponse); + JSONObject goods_list_get_response_json_str = new JSONObject(goods_list_get_response_str); + + // 判断接口是否异常 + if (goods_list_get_response_json_str.has("error_response")) { + error_response = goods_list_get_response_json_str.getJSONObject("error_response"); + error_code = error_response.getInt("error_code"); + error_msg = error_response.getString("error_msg"); + logger.info("[ {} ] 库存更新|平台异常,错误编码:[ {} ] ,异常信息:{}![ {} ] ", scc.platform_code, error_code, error_msg, + commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, error_msg, + company_code, scc.formula, scc.onpassage_flag); + return false; + } + + JSONObject goods_list_get_response = goods_list_get_response_json_str + .getJSONObject("goods_list_get_response"); + + int total_count = goods_list_get_response.getInt("total_count"); + + if (total_count <= 0) { + logger.info("[ {} ] 库存更新|指定的平台商家编码在第三方平台未查询到,请检查是否下架![ {} ] ", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, "第三方平台未查询到该商品", + company_code, scc.formula, scc.onpassage_flag); + return true; + } + + JSONArray goods_list_array = goods_list_get_response.getJSONArray("goods_list"); + + for (int i = 0; i < goods_list_array.length(); i++) { + JSONObject goods_list = goods_list_array.getJSONObject(i); + goods_id = goods_list.getLong("goods_id"); + JSONArray sku_list = goods_list.getJSONArray("sku_list"); + for (int j = 0; j < sku_list.length(); j++) { + JSONObject sku_list_json = sku_list.getJSONObject(j); + String outer_id = sku_list_json.getString("outer_id"); + if (outer_id.equals(platform_seller_code)) { + sku_id = sku_list_json.getLong("sku_id"); + PddGoodsQuantityUpdateRequest pddGoodsQuantityUpdateRequest = new PddGoodsQuantityUpdateRequest(); + pddGoodsQuantityUpdateRequest.setGoodsId(goods_id); + pddGoodsQuantityUpdateRequest.setQuantity(value); + pddGoodsQuantityUpdateRequest.setSkuId(sku_id); + pddGoodsQuantityUpdateRequest.setOuterId(platform_seller_code); + pddGoodsQuantityUpdateRequest.setUpdateType(1); + + PddGoodsQuantityUpdateResponse pddGoodsQuantityUpdateResponse = client + .syncInvoke(pddGoodsQuantityUpdateRequest, scc.session_key); + String goods_quantity_update_response_str = JsonUtil + .transferToJson(pddGoodsQuantityUpdateResponse); + JSONObject goods_quantity_update_response_json_str = new JSONObject( + goods_quantity_update_response_str); + // 异常处理 + if (goods_quantity_update_response_json_str.has("error_response")) { + error_response = goods_quantity_update_response_json_str.getJSONObject("error_response"); + error_code = error_response.getInt("error_code"); + error_msg = error_response.getString("error_msg"); + logger.info("[ {} ] 库存更新|平台异常,错误编码:[ {} ] ,异常信息:{} ![ {} ] ", scc.platform_code, error_code, + error_msg, commodity_code); + continue; + } + // 成功响应 + if (goods_quantity_update_response_json_str.has("goods_quantity_update_response")) { + JSONObject goods_quantity_update_response = goods_quantity_update_response_json_str + .getJSONObject("goods_quantity_update_response"); + boolean is_success = goods_quantity_update_response.has("is_success") + ? goods_quantity_update_response.getBoolean("is_success") + : false; + if (is_success) { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新成功", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, String.valueOf(goods_id), sum, type_in, + value, scc, sync_type, 1, "", company_code, scc.formula, scc.onpassage_flag); + } else { + logger.info("平台:[ {} ] 商品:[ {} ] 库存更新|更新失败", scc.platform_code, commodity_code); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, + "未知异常,请排查!", company_code, scc.formula, scc.onpassage_flag); + continue; + } + } + } + } + } + return true; + } catch (JSONException e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } catch (Exception e) { + logger.error(this, e); + insertStorageLog(shop_code, commodity_code, "", sum, type_in, value, scc, sync_type, 2, e.toString(), + company_code, scc.formula, scc.onpassage_flag); + return false; + } + } + + private synchronized long getUpdateNum(ShopCommodityConfig sccget, int sum, int type_in) { + long value = 0; + logger.info("有效库存数量为:[ {} ] ,在途数量为:[ {} ] ,预留数量为:[ {} ] ,配比为:[ {} ] ", sum, type_in, sccget.quantity, + sccget.percent); + + /* + * 公式1:(可销售数量+[采购在途] -预留量)*配比 公式2:(可销售数量+[采购在途] )*配比-预留量 if( sccget.formula==1){ + * value = (long) ((sum+type_in-sccget.quantity)*sccget.percent); }else + * if(sccget.formula==2){ value = (long) + * ((sum+type_in)*sccget.percent)-sccget.quantity; } + */ + + // onpassage_flag == 1 是否在途:1:否 2 是 + if (sccget.formula == 1) { + if (sccget.onpassage_flag == 1) { + value = (long) (Math.floor((sum - sccget.quantity) * sccget.percent)); + } else if (sccget.onpassage_flag == 2) { + value = (long) (Math.floor((sum + type_in - sccget.quantity) * sccget.percent)); + } + } else if (sccget.formula == 2) { + if (sccget.onpassage_flag == 1) { + value = (long) (Math.floor(sum * sccget.percent)) - sccget.quantity; + } else if (sccget.onpassage_flag == 2) { + value = (long) (Math.floor((sum + type_in) * sccget.percent)) - sccget.quantity; + } + } + if (value < 0) {// 如果更新的数量小于0,则将数量设为0 + value = 0; + } + if (value < sccget.min_syn_quantity) { + value = sccget.min_syn_quantity; + } + return value; + } + + /** + * 32位MD5加密 + * + * @param sourceStr + * @return + */ + private String MD5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (NoSuchAlgorithmException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return result; + } + + /** + * xmlToJson + * + * @param xml + * @return + */ + private String xmlToJson(String xml) throws Exception { + XMLSerializer xmlSerializer = new XMLSerializer(); + JSON json = xmlSerializer.read(xml); + String jsonStr = json.toString(1); + return jsonStr; + } + + /** + * 用于记录商品更新库存的信息 + * + * @return + */ + private boolean insertStorageLog(String shop_code, String commodity_code, String sku_id, int sum, int type_in, + long value, ShopCommodityConfig scc, int sync_type, int sync_status, String message, String company_code, + int formula, int onpassage_flag) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + try { + conn = dbpc.getConnection(); + String sql = "insert into tb_storage_sync_log(shop_code,commodity_code,sku_id,saleable_quantity,on_passage_quantity,keep_quantity,percent,sync_quantity,sync_type,sync_status,fail_reason,company_code,formula,onpassage_flag) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, shop_code); + ps.setString(2, commodity_code); + ps.setString(3, sku_id); + ps.setInt(4, sum); + ps.setInt(5, type_in); + ps.setInt(6, scc.quantity); + ps.setFloat(7, scc.percent); + ps.setInt(8, Integer.valueOf(value + "")); + ps.setInt(9, sync_type); + ps.setInt(10, sync_status); + ps.setString(11, message); + ps.setString(12, company_code); + ps.setInt(13, formula); + ps.setInt(14, onpassage_flag); + if (ps.executeUpdate() == 0) { + return false; + } + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + } + } + +} diff --git a/src/com/since/emp/service/SubmitLog.java b/src/com/since/emp/service/SubmitLog.java new file mode 100644 index 0000000..3cac36f --- /dev/null +++ b/src/com/since/emp/service/SubmitLog.java @@ -0,0 +1,204 @@ +package com.since.emp.service; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TreeMap; +import java.util.Vector; +import java.util.concurrent.ThreadPoolExecutor; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.since.emp.base.YchClient; +import com.since.emp.base.thread.ThreadPool; + +/** + * @className:SubmitLog + * @description:提交日志 + * @author:Sunshine + * @date:2019年10月16日 上午10:09:15 + */ +public class SubmitLog { + + private static final Logger LOGGER = LogManager.getLogger(SubmitLog.class); + + public Vector ychLogQueue; + + private static ThreadPoolExecutor threadPool;// + + // 当前时间 + //public long currentTime; + + // 上次执行提交订单时间 + //public long lastSubmitTime = System.currentTimeMillis(); + + // // 执行时间 + // public long execTime; + + public void start() { + ychLogQueue = new Vector<>(); + threadPool = ThreadPool.getInstance(); + threadPool.execute(new SubmitThread()); + + } + + class SubmitThread implements Runnable { + @Override + public void run() { + while (true) { + // 超过五分钟尚未提交直接进行提交(5*60*1000) + int queueCount = ychLogQueue.size(); + //currentTime = System.currentTimeMillis(); + int tradeCount = queueCount >= 100 ? 100 : queueCount; + if (tradeCount > 0) { + StringBuffer sb = null; + for (int i = 0; i < tradeCount; i++) { + String tid = ychLogQueue.get(0); + if (sb == null) { + sb = new StringBuffer(); + sb.append(tid); + } else { + sb.append(";").append(tid); + } + ychLogQueue.remove(0); + } + + LOGGER.info("[ 御城河订单日志提交 ] 本次处理订单数[ {} ],待处理订单总数:[ {} ]", tradeCount, ychLogQueue.size()); + LogOrder to = new LogOrder(sb.toString()); + if (!to.exec()) { + threadPool.execute(new RetryThread(sb.toString())); + } + + // 提交完毕更新最后提交时间 + //lastSubmitTime = System.currentTimeMillis(); + } + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + LOGGER.error(this, e); + } + } + + } + + } +} + +class LogOrder { + + private static final Logger LOGGER = LogManager.getLogger(LogOrder.class); + + private String tradeIds; + + public LogOrder(String tradeIds) { + this.tradeIds = tradeIds; + } + + String appkey = "68757018"; + String secret = "4zvq1DXbiWo3XPpt1qX0"; + String topAppkey = "23811642"; // 如果没有TOP appkey,可以不填,样例代码中会使用御城河appkey代替topAppkey + String apiHost = "http://gw.ose.aliyun.com/event/order"; // 日志接入API + String accountHost = "http://account.ose.aliyun.com/"; // 账号风控API + + SimpleDateFormat sFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date now = new Date(); + String time = sFormat.format(now); + String ntime = new Long(now.getTime()).toString(); + + public boolean exec() { + try { + String url = apiHost; + TreeMap paramNew = new TreeMap(String.CASE_INSENSITIVE_ORDER); + paramNew.put("userId", "系统"); + paramNew.put("userIp", "39.100.118.71"); + paramNew.put("ati", "0000000000"); + paramNew.put("topAppkey", topAppkey); + paramNew.put("appName", "软维ERP"); + paramNew.put("url", "www.chinaemp.cn"); + paramNew.put("tradeIds", tradeIds); + paramNew.put("operation", "query"); + paramNew.put("time", ntime); + paramNew.put("appkey", appkey); + + YchClient sdk = new YchClient(appkey, secret); + String rsp = sdk.send(url, paramNew); + return parseResult(rsp, tradeIds); + + } catch (Exception e) { + LOGGER.error(this, e); + } + return false; + } + + /** + * + * @description: 解析接口返回 + * @param rsponse + */ + protected boolean parseResult(String rsponse, String tradeIds) { + String result = ""; + String errMsg = ""; + try { + if (rsponse != null) { + JSONObject obj = null; + obj = (JSONObject) JSON.parse(rsponse); + if (obj != null) { + result = obj.getString("result"); + errMsg = obj.getString("errMsg"); + } + } + if ("success".equals(result) && (errMsg == null || errMsg.isEmpty())) { + LOGGER.info("[ 御城河订单日志提交 ] Success.订单号详情:[ {} ]", tradeIds); + } else { + LOGGER.info("[ 御城河订单日志提交 ] Error:{},即将开始重试!", rsponse); + } + return "success".equals(result) && (errMsg == null || errMsg.isEmpty()); + } catch (Exception e) { + LOGGER.info("[ 御城河订单日志提交 ] 接口返回信息:{}", rsponse); + LOGGER.error(this, e); + } + return false; + } +} + +/** + * + * @className:RetryThread + * @description:失败重试线程 + * @author:Sunshine + * @date:2019年10月16日 下午12:56:06 + */ +class RetryThread implements Runnable { + + private static final Logger LOGGER = LogManager.getLogger(RetryThread.class); + + private String tradeIds; + + private int retryFlag; + + public RetryThread(String tradeIds) { + this.tradeIds = tradeIds; + } + + @Override + public void run() { + LogOrder to = new LogOrder(tradeIds); + if (!to.exec()) { + retryFlag++; + try { + Thread.sleep(30_000); + } catch (InterruptedException e) { + LOGGER.error(this, e); + } + if (retryFlag <= 5) { + LOGGER.info("[ 御城河订单日志提交 ] 重试失败,当前重试次数 [ {} ]", retryFlag); + run(); + } else { + LOGGER.info("[ 御城河订单日志提交 ] 已达到最大重试次数,放弃处理!订单详情:[ {} ]", tradeIds); + } + } + } +} diff --git a/src/com/since/emp/service/csv/BaseFileField.java b/src/com/since/emp/service/csv/BaseFileField.java new file mode 100644 index 0000000..38ef84e --- /dev/null +++ b/src/com/since/emp/service/csv/BaseFileField.java @@ -0,0 +1,296 @@ +package com.since.emp.service.csv; + +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.csv.constants.Constants; +import com.since.emp.util.SqlUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author zh + * @Date 2021/8/17 + * 做统一泛型处理 + */ +public abstract class BaseFileField { + + protected Logger logger = LogManager.getLogger(BaseFileField.class); + /** + * 记录子商品数据 + */ + protected BaseFileField next; + + /** + * 校验参数是否符合规则 不通过返回出错的条数以及信息 + * + * @return 全部通过 null + */ + public abstract Boolean validate(String companyCode); + + + /** + * 将数据写入 TradeInfo + * + * @return + */ + public abstract void writeTradeInfo(TradeInfo info); + + /** + * 将数据写入 OrderInfo + * + * @return + */ + public abstract OrderInfo writeOrderInfo(); + + /** + * 将正确的 数据写入dataList 错的数据返回 + * + * @param originData 文件读取的数据 + * @param dataList 存放正确数据 + * @return 错误数据 + */ + public abstract List initData(List originData, List dataList); + + + /** + * 验证详细地址 + * + * @param address + * @return + */ + public abstract String checkAddressDetailedAddress(String address); + + /** + * 验证平台店铺 + * + * @param code 待验证的店铺code + * @return 返回不存在的错误信息 + */ + protected String checkShopCode(String code, String companyCode) { + if (code.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置店铺编码为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL+" "; + } + if (!SqlUtil.isShopExist(code.trim())) { + return "店铺不存在!**"; + } + if (SqlUtil.checkShopByCompanyCode(code.trim(), companyCode)) { + logger.info("校验的店铺编码{},企业编码{}", code, companyCode); + + return "请导入本企业订单!**"; + } + return ""; + } + + /** + * 验证平台单号 是否存在 + * + * @param platformOrder 待验证的平台单号 + * @return 返回不存在的错误信息 + */ + protected String checkOrderNumber(String platformOrder) { + if (platformOrder.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置平台单号为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL+" "; + } + if (StringUtils.isBlank(platformOrder)) { + return "平台单号为空!**"; + } + return ""; + } + + /** + * 校验时间格式 默认为 yyyy-MM-dd HH:mm:ss 其他均为错误 + * + * @param date 待校验的时间 + * @return 错误信息 + */ + protected String checkDate(String date,BaseFileField fileField) { + + String message = "时间格式错误,请使用正确的时间格式 年-月-日 时:分:秒**"; + if (StringUtils.isBlank(date)) { + return message; + } + boolean flag = true; + date = date.replace(":", ":").trim(); + SimpleDateFormat simpleDateFormat = null; + try { + // 第一层if区分/和- ,第二层if区分有无:,第三层区分为分钟还是秒钟 + if (date.contains("/")) { + if (date.contains(":")) { + if (date.length() < 17) { + simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm"); + } else { + simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + } + }else{ + simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd"); + } + } else if (date.contains("-")) { + if (date.contains(":")) { + if (date.length() < 17) { + simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } else { + simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + } else { + simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + } + } else { + return message; + } + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date parse = simpleDateFormat.parse(date); + if (!Objects.isNull(fileField)) { + if (fileField instanceof EasyFileField) { + EasyFileField field = (EasyFileField) fileField; + field.setPayDate(format.format(parse)); + } else if (fileField instanceof StandardFileField) { + StandardFileField field = (StandardFileField) fileField; + field.setPayDate(format.format(parse)); + } + } + } catch (Exception e) { + logger.error(e); + return message; + } + return ""; + } + + + /** + * 如果有支付时间 就校验 + * + * @param payDate 待校验的时间 + * @return 错误信息 + */ + protected String checkPayDate(String payDate,BaseFileField fileField) { + if (StringUtils.isBlank(payDate)) { + return ""; + } + return checkDate(payDate,fileField); + } + + + /** + * 校验收货人 + * + * @param consigneeName 待校验收货人 + * @return 错误信息 + */ + + protected String checkConsigneeName(String consigneeName) { + if (StringUtils.isBlank(consigneeName.trim())) { + return "收货人为空!**"; + } + return ""; + } + + /** + * 校验固定电话和移动电话 + * + * @param phoneNumber 固定电话 + * @param movePhone 移动电话 + * @return 错误信息 + */ + protected String checkPhoneNumber(String phoneNumber, String movePhone) { + if (StringUtils.isBlank(phoneNumber) && StringUtils.isBlank(movePhone)) { + return "电话号码有误!**"; + } + + if (StringUtils.isNotBlank(movePhone)) { + movePhone = movePhone.trim(); + if (!movePhone.matches(Constants.PHONE_NUMBER_PATTERN)) { + return "手机号填写错误**"; + } + } + return ""; + } + + /** + * 校验商品数量 + * + * @param goodsNumber 商品数量 + * @return 错误信息 + */ + protected String checkGoodsCount(String goodsNumber) { + if (goodsNumber.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置商品数量为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL+" "; + } + if (!goodsNumber.trim().matches(Constants.IS_INTEGER_PATTERN)) { + return "商品数量错误!**"; + } + return ""; + } + + protected String checkRealityMoney(String goodsRealityMoney) { + if (goodsRealityMoney.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置实际价格为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL+" "; + } + if (!goodsRealityMoney.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "实际价格填写错误!**"; + } + return ""; + } + + /** + * 校验平台商家编码是否正确 + * + * @param code 平台商家编码 + * @return 错误信息 + */ + protected String checkPlatformMerchantCode(String code) { + if (code.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置平台商家编码为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL+" "; + } + if (StringUtils.isBlank(code)) { + return "商家平台编码为空!**"; + } + return ""; + } + + protected void appendDefaultData(StringBuilder builder, int length) { + for (int i = 0; i < length; i++) { + builder.append(","); + } + } + + /** + * 数组转String + * + * @param objects 数组 + * @return String + */ + protected String toString(Object[] objects) { + String string = Arrays.toString(objects); + return string.substring(1, string.length() - 1); + } + + /** + * 对象转String 链表模式 + * + * @return 多个对象 返回集合 + */ + public Collection convertString() { + List list = new ArrayList<>(); + BaseFileField field = this; + while (field != null) { + list.add(field.toString()); + field = field.next; + } + return list; + } + + public BaseFileField next() { + return this.next; + } + + public abstract void writeErrorToCsv(TradeInfo tradeInfo, Charset charset, String msg); + + public abstract void init(List tradeInfos); + + public abstract Set checkScientificCount(List originData); +} diff --git a/src/com/since/emp/service/csv/CsvFileManageThread.java b/src/com/since/emp/service/csv/CsvFileManageThread.java new file mode 100644 index 0000000..68e186b --- /dev/null +++ b/src/com/since/emp/service/csv/CsvFileManageThread.java @@ -0,0 +1,330 @@ +package com.since.emp.service.csv; + +import com.ibm.icu.text.CharsetDetector; +import com.ibm.icu.text.CharsetMatch; +import com.since.emp.base.ImportParams; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.csv.constants.BaseFileFieldEnum; +import com.since.emp.service.csv.constants.Constants; +import com.since.emp.service.csv.constants.EasyFileFieldEnum; +import com.since.emp.service.csv.constants.StandardFileFieldEnum; +import com.since.emp.util.CloseUtil; +import com.since.emp.util.SqlUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +/** + * @author zh + * @Date 2021/8/17 + */ +public class CsvFileManageThread extends Thread { + + private Logger logger = LogManager.getLogger("csvFile"); + + public CsvFileManageThread(String path, ImportParams importParams) { + this.path = path; + this.importParams = importParams; + } + + private String path; + private ImportParams importParams; + + @Override + public void run() { + manageCsvFile(path, importParams); + } + + + private void manageCsvFile(String path, ImportParams ip) { + BufferedReader bufferedReader = null; + List dataList = new ArrayList<>(); + List errorList = null; + List originData = new ArrayList<>(); + BaseFileFieldEnum baseFileFieldEnum = null; + BaseFileField baseFileField; + String writePath = ""; + Charset charset = null; + boolean isEasy = false; + try { + // 创建文件信息,校验文件 + String readPath = ip.in_path; + writePath = ip.in_path.replace(Constants.CSV_FILE_SUFFIX, Constants.CSV_ERROR_SUFFIX); + File file = new File(path + readPath); + charset = checkFile(file, ip.code); + if (charset == null) { + logger.error("文件编码异常!"); + OrderSyncs.updateReplenishResult(ip.code, "失败", ""); + throw new Exception("请上传官方支持的编码文件"); + } + + if (Constants.ERROR_CHARSET.equals(charset.name())) { + charset = Charset.forName("GBK"); + } + + bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); + String temp; + while ((temp = bufferedReader.readLine()) != null) { + originData.add(temp); + } + if (CollectionUtils.isEmpty(originData)) { + OrderSyncs.updateReplenishResult(ip.code, "失败,未读取到订单数据", ""); + } + logger.info("文件读取成功!"); + checkList(originData, ip.code); + logger.info("文件初步校验!"); + // 找到对应的模板信息 + String fileType = originData.get(1).split(Constants.CSV_FILE_PATTERN, -1)[0]; + // 暂时处理,重新已GBK编码格式读取文件 + if (!"编号".equals(fileType.trim())) { + bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK")); + originData.clear(); + while ((temp = bufferedReader.readLine()) != null) { + originData.add(temp); + } + } + fileType = originData.get(0).split(Constants.CSV_FILE_PATTERN, -1)[0]; + + if (Objects.equals("简易", fileType)) { + isEasy = true; + baseFileField = new EasyFileField(); + baseFileFieldEnum = EasyFileFieldEnum.DEFAULT; + + } else { + baseFileField = new StandardFileField(); + baseFileFieldEnum = StandardFileFieldEnum.DEFAULT; + } + logger.info("文件数据校验开始!"); + // 校验有无 将纯数字识别为科学技术法的列 + Set set = baseFileField.checkScientificCount(originData); + if (CollectionUtils.isNotEmpty(set)) { + String msg = set.toString().replaceAll("[|]", "") + Constants.EXCEL_EDIT_FORMAT_URL; + OrderSyncs.updateReplenishResult(ip.code, msg, ""); + return; + } + // 返回 错误数据 + errorList = baseFileField.initData(originData, dataList); + + // 解析数据,返回正确的订单数据 + String companyCode = ip.company_code; + if (StringUtils.isBlank(companyCode)) { + companyCode = ip.obm_company_code; + } + List rightList = checkData(dataList, errorList, companyCode); + logger.info("数据解析完成"); + // 写入错误文件 + if (CollectionUtils.isNotEmpty(errorList)) { + logger.info("写入错误文件开始..."); + writeErrorFile(errorList, path + writePath, ip.code, baseFileFieldEnum, charset, isEasy); + OrderSyncs.updateReplenishResult(ip.code, "失败", writePath); + logger.info("写入错误文件结束..."); + } + // 将正确的数据写入待处理队列 + logger.info("开始添加订单执行队列"); + List tradeInfos = writeOrderQueue(ip, rightList); + // 默认数据赋值 + baseFileField.init(tradeInfos); + for (TradeInfo tradeInfo : tradeInfos) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + } + if (CollectionUtils.isEmpty(errorList)) { + OrderSyncs.updateReplenishResult(ip.code, "成功", ""); + + } + logger.info("文件数据解析完毕"); + } catch (Exception e) { + // 有异常不做处理 更新数据库 + writeErrorFile(errorList, path + writePath, ip.code, baseFileFieldEnum, charset, isEasy); + logger.error("数据解析错误", e); + OrderSyncs.updateReplenishResult(ip.code, "文件解析错误!", ""); + } finally { + CloseUtil.close(bufferedReader); + } + } + + /** + * 封装正确的订单数据 + * + * @param ip 路径等信息 + * @param rightList 正确的订单数据 + * @return List + */ + private List writeOrderQueue(ImportParams ip, List rightList) { + List list = new ArrayList<>(); + for (BaseFileField baseFileField : rightList) { + List orderInfos = new ArrayList<>(); + TradeInfo info = new TradeInfo(); + // 文件订单数据 + baseFileField.writeTradeInfo(info); + // 商品数据 + while (baseFileField != null) { + OrderInfo orderInfo = baseFileField.writeOrderInfo(); + orderInfos.add(orderInfo); + baseFileField = baseFileField.next(); + } + // 有子商品数据的 才添加子商品 + if (CollectionUtils.isNotEmpty(orderInfos)) { + OrderInfo[] orders = new OrderInfo[orderInfos.size()]; + info.orders = orderInfos.toArray(orders); + } + amountGoods(info); + // 默认订单数据 + SqlUtil.initDefaultTradeData(info, ip, path); + list.add(info); + } + return list; + } + + /** + * 校验数据是否符合 符合存入正确集合 做后续处理;否则写入错误集合,回填至错误文件 + * + * @param dataList 源数据 + * @param errorList 错误数据 + * @return 待处理的正确数据集合 + */ + private List checkData(List dataList, List errorList, String companyCode) { + List rightData = new ArrayList<>(); + for (BaseFileField baseFileField : dataList) { + // 校验数据是否符合要求 + Boolean isError = baseFileField.validate(companyCode); + if (isError) { + errorList.addAll(baseFileField.convertString()); + } else { + rightData.add(baseFileField); + } + } + return rightData; + } + + + /** + * 首先校验上传数据是否符合规定大小(小于5000条,大于不做处理) + * + * @param originData 文件读取的源数据 + * @throws Exception 抛出异常 文件数据不做处理 + */ + private void checkList(List originData, String code) throws Exception { + boolean b = CollectionUtils.isEmpty(originData) + || (originData.size() < 2) + || originData.size() > 5000; + if (b) { + OrderSyncs.updateReplenishResult(code, "文件解析错误!", ""); + throw new Exception("请不要上传过大或过小的文件"); + } + } + + /** + * 校验文件 + * + * @param file 文件 + * @throws Exception + */ + private Charset checkFile(File file, String code) throws Exception { + if (!file.isFile()) { + OrderSyncs.updateReplenishResult(code, "文件解析错误!", ""); + throw new Exception("未读取到文件!"); + } + + // 获取所有字符集 匹配文件的字符集 + CharsetDetector charsetDetector = new CharsetDetector(); + byte[] bytes = Files.readAllBytes(Paths.get(file.getPath())); + charsetDetector.setText(bytes); + CharsetMatch match = charsetDetector.detect(); + for (Map.Entry stringCharsetEntry : Charset.availableCharsets().entrySet()) { + if (Objects.equals(stringCharsetEntry.getKey(), match.getName())) { + return stringCharsetEntry.getValue(); + } + } + return null; + } + + /** + * 将错误数据写入错误文件 + * + * @param errorList 错误数据 + * @param writePath 输出路径 + * @param code 店铺编码 + * @param typeEnum 头文件数据 + * @param charset 文件编码 + * @param isStandard 是否为标准模板 + */ + private synchronized void writeErrorFile(List errorList, String writePath, + String code, BaseFileFieldEnum typeEnum, Charset charset, + Boolean isStandard) { + BufferedWriter bufferedWriter = null; + try { + File file = new File(writePath); + bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream((file)), charset)); + if (isStandard) { + bufferedWriter.write("简易"); + bufferedWriter.newLine(); + } + if (file.length() == 0) { + bufferedWriter.write(typeEnum.returnString()); + bufferedWriter.newLine(); + } + for (String s : errorList) { + bufferedWriter.write(s); + bufferedWriter.newLine(); + } + bufferedWriter.flush(); + if (writePath.contains("/")) { + writePath = writePath.substring(writePath.lastIndexOf("/")); + } + OrderSyncs.updateReplenishResult(code, "失败,详情请查看错误文件", writePath); + } catch (Exception e) { + OrderSyncs.updateReplenishResult(code, "失败", "写入文件错误!"); + logger.error("写入错误文件发生错误!"); + e.printStackTrace(); + } finally { + CloseUtil.close(bufferedWriter); + } + } + + /** + * 计算订单总金额 + * + * @param info + */ + private void amountGoods(TradeInfo info) { + // 计算总金额 + BigDecimal totalMoney = new BigDecimal("0"); + // 计算总数量 + BigDecimal totalNum = new BigDecimal("0"); + for (OrderInfo order : info.orders) { + BigDecimal num = new BigDecimal(order.num); + BigDecimal bigDecimal = new BigDecimal(order.payment); + totalMoney = totalMoney.add(bigDecimal); + totalNum = totalNum.add(num); + } + String money = totalMoney.toString(); + if (StringUtils.isBlank(info.money)) { + info.money = money; + } + if (StringUtils.isBlank(info.pay_money)) { + info.pay_money = money; + } + if (StringUtils.isBlank(info.product_fee)) { + info.product_fee = money; + } + if (StringUtils.isBlank(info.discount_fee)) { + info.discount_fee = "0"; + + } + if (StringUtils.isBlank(info.post_fee)) { + info.post_fee = "0"; + } + info.num = totalNum.intValue(); + } +} diff --git a/src/com/since/emp/service/csv/EasyFileField.java b/src/com/since/emp/service/csv/EasyFileField.java new file mode 100644 index 0000000..719f0f3 --- /dev/null +++ b/src/com/since/emp/service/csv/EasyFileField.java @@ -0,0 +1,478 @@ +package com.since.emp.service.csv; + +import com.since.emp.base.ImportParams; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.csv.constants.Constants; +import com.since.emp.service.csv.constants.EasyFileFieldEnum; +import com.since.emp.service.csv.constants.StandardFileFieldEnum; +import com.since.emp.test.AddressTest; +import com.since.emp.util.CloseUtil; +import com.since.emp.util.ParseAddressUtil; +import org.apache.commons.lang.StringUtils; + +import java.io.*; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author zh + * @Date 2021/8/16 + * 记录读取上传的 CSV 文件,每行数据切分后的数组对应的字段名称 + * 对应简易文件模板 + */ +public class EasyFileField extends BaseFileField { + + /** + * (0; "编号"); + */ + private String number; + /** + * (1; "*店铺编码"); + */ + private String shopCode; + + /** + * (2; "*平台订单号(作为订单的唯一标示)"); + */ + private String platformOrder; + + /** + * (3; "付款时间"); + */ + private String payDate; + + /** + * (4; "*收货人姓名"); + */ + private String consigneeName; + + /** + * (5; "*移动电话"); + */ + private String movePhone; + + /** + * (6; "*详细地址"); + */ + private String address; + + /** + * (7; "买家留言"); + */ + private String buyerRemark; + + /** + * (8; "卖家备注"); + */ + private String vendorRemark; + + /** + * (9; "*平台商家编码"); + */ + private String platformMerchantCode; + + /** + * (10; "*数量"); + */ + private String orderGoodsCount; + + /** + * (11; "*实付金额"); + */ + private String realityMoney; + + private String errorMessage; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getShopCode() { + return shopCode; + } + + public void setShopCode(String shopCode) { + this.shopCode = shopCode; + } + + public String getPlatformOrder() { + return platformOrder; + } + + public void setPlatformOrder(String platformOrder) { + this.platformOrder = platformOrder; + } + + public String getPayDate() { + return payDate; + } + + public void setPayDate(String payDate) { + this.payDate = payDate; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getMovePhone() { + return movePhone; + } + + public void setMovePhone(String movePhone) { + this.movePhone = movePhone; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBuyerRemark() { + return buyerRemark; + } + + public void setBuyerRemark(String buyerRemark) { + this.buyerRemark = buyerRemark; + } + + public String getVendorRemark() { + return vendorRemark; + } + + public void setVendorRemark(String vendorRemark) { + this.vendorRemark = vendorRemark; + } + + public String getPlatformMerchantCode() { + return platformMerchantCode; + } + + public void setPlatformMerchantCode(String platformMerchantCode) { + this.platformMerchantCode = platformMerchantCode; + } + + public String getOrderGoodsCount() { + return orderGoodsCount; + } + + public void setOrderGoodsCount(String orderGoodsCount) { + this.orderGoodsCount = orderGoodsCount; + } + + public String getRealityMoney() { + return realityMoney; + } + + public void setRealityMoney(String realityMoney) { + this.realityMoney = realityMoney; + } + + /** + * 封装读取到的数据,方便回写 + * + * @param originData + * @return + */ + @Override + public List initData(List originData, List dataList) { + EasyFileField easyFileField = null; + EasyFileField currNode = null; + List errorList = new ArrayList<>(); + try { + for (int i = 0; i < originData.size(); i++) { + // 前两行没有订单数据 第三行开始为订单数据 + if (i <= 1) { + continue; + } + //解析scv文件数据 + String[] arr = originData.get(i).split(Constants.CSV_FILE_PATTERN, -1); + // 店铺编码 + String shopCode = arr[1]; + /* + 当首个订单出现之前,没有shopCode 的为错误数据 + 出现订单之后,没有shopCode 的为子商品数据,存储到当前订单的next节点 + */ + if (StringUtils.isBlank(shopCode)) { + if (Objects.isNull(easyFileField)) { + errorList.add(toString(arr) + ",无店铺信息"); + } else { + EasyFileField newNode = new EasyFileField(); + newNode.init(arr); + currNode.next = newNode; + currNode = newNode; + } + } else { + easyFileField = new EasyFileField(); + currNode = easyFileField; + easyFileField.init(arr); + dataList.add(easyFileField); + } + + } + } catch (Exception e) { + e.printStackTrace(); + // 出现异常 全部写入错误数据 + originData = originData.stream().map(val -> val.concat(",文件解析错误")).collect(Collectors.toList()); + final List data = originData; + originData = originData.stream().filter(val -> data.indexOf(val) > 1).collect(Collectors.toList()); + return originData; + } + return errorList; + } + + @Override + public Boolean validate(String companyCode) { + EasyFileField field = this; + // 数据是否有错误 + boolean isError = false; + int i = 1; + while (field != null) { + StringBuilder builder = new StringBuilder(); + if (i == 1) { + builder.append(checkShopCode(field.shopCode, companyCode)) + .append(checkOrderNumber(field.platformOrder)) + .append(checkDate(field.payDate,this)) + .append(checkConsigneeName(field.consigneeName)) + .append(checkPhoneNumber("", field.movePhone)) + .append(checkAddressDetailedAddress(field.address)) + ; + + } + builder.append(checkPlatformMerchantCode(field.platformMerchantCode)) + .append(checkGoodsCount(field.orderGoodsCount)) + .append(checkRealityMoney(field.realityMoney)); + String error = builder.toString(); + if (StringUtils.isNotBlank(error)) { + field.errorMessage = error; + isError = true; + } + field = (EasyFileField) field.next; + i++; + } + + return isError; + } + + @Override + public String checkAddressDetailedAddress(String address) { + + Map stringStringMap = null; + String msg = "详细地址有误"; + try { + stringStringMap = ParseAddressUtil.getTextRecognitionInfo(address); + } catch (Exception e) { + return msg; + } + String province = stringStringMap.get("province"); + String city = stringStringMap.get("city"); + String county = stringStringMap.get("county"); + String detail = stringStringMap.get("detail"); + boolean b = province == null || city == null || county == null || detail == null; + if (b) { + return msg; + } + return ""; + } + + @Override + public void writeTradeInfo(TradeInfo info) { + info.csvOrderNumber = this.number; + info.shop_code = this.shopCode; + info.tid = this.platformOrder; + String date = this.payDate; + info.pay_time = date; + info.created = date; + info.platform_modify_time = date; + info.receiver_name = this.consigneeName; + info.receiver_mobile = this.movePhone; + info.receiver_address = this.address; + info.buyer_message = this.buyerRemark; + info.seller_memo = this.vendorRemark; + info.receiver_country = "中国"; + Map map = null; + try { + map = AddressTest.getTextRecognitionInfo(address); + } catch (Exception e) { + logger.error(e); + } + info.receiver_state = map.get("province"); + info.receiver_address = map.get("detail"); + info.receiver_city = map.get("city"); + info.receiver_district = map.get("county"); + } + + @Override + public OrderInfo writeOrderInfo() { + OrderInfo info = new OrderInfo(); + info.platform_seller_code = this.platformMerchantCode; + info.num = Integer.parseInt(this.orderGoodsCount.trim()); + + info.discount_fee = "0"; + BigDecimal bigDecimal1 = new BigDecimal(this.realityMoney); + + info.total_fee = bigDecimal1.toString(); + + info.payment = info.total_fee; + info.adjust_fee = "0"; + info.sku_id = ""; + info.title = ""; + info.divide_order_fee = this.realityMoney; + info.num_iid = this.number; + return info; + + + } + + + /** + * 把数据封装到该类 + * + * @param arr 文件中的数据 + */ + protected void init(String[] arr) throws Exception { + Field[] declaredFields = this.getClass().getDeclaredFields(); + // 减一是因为 实体多了一个字段 用来存放错误信息 + for (int i = 0; i < declaredFields.length - 1; i++) { + // 后面的替换是将前后的引号替换掉 + declaredFields[i].set(this, arr[i].replaceAll("^\"|\"$", "").trim()); + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + Field[] declaredFields = this.getClass().getDeclaredFields(); + for (Field declaredField : declaredFields) { + try { + declaredField.setAccessible(true); + builder.append(Objects.toString(declaredField.get(this), "")).append(","); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return builder.toString().substring(0, builder.length() - 1); + } + + @Override + public void writeErrorToCsv(TradeInfo info, Charset charset, String msg) { + BufferedWriter writer = null; + StringBuilder builder; + try { + builder = new StringBuilder(); + File file = new File(info.out_path); + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), charset)); + // 如果不存在, 需要文件头数据 + if (file.length() == 0) { + writer.write(EasyFileFieldEnum.DEFAULT.returnString()); + writer.newLine(); + } + builder.append(info.csvOrderNumber).append(",") + .append(info.shop_code).append(",") + .append(info.tid).append(",") + .append(info.pay_time).append(",") + .append(info.receiver_name).append(",") + .append(info.receiver_mobile).append(",") + .append(info.receiver_address).append(",") + .append(info.buyer_message).append(",") + .append(info.seller_memo).append(",") + ; + int orderFieldCount = builder.toString().split(",").length; + OrderInfo[] orders = info.orders; + for (int i = 0; i < orders.length; i++) { + if (i > 0) { + builder.delete(0, builder.length()); + appendDefaultData(builder, orderFieldCount); + } + builder.append(orders[i].platform_seller_code).append(",") + .append(orders[i].num).append(",") + .append(orders[i].payment).append(",") + .append(msg) + ; + writer.newLine(); + writer.write(builder.toString()); + } + writer.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + CloseUtil.close(writer); + } + } + + @Override + public void init(List tradeInfos) { + for (int i = 0; i < tradeInfos.size(); i++) { + TradeInfo fullTradeInfo = tradeInfos.get(i); + OrderInfo[] orders = fullTradeInfo.orders; + + for (OrderInfo fullOrderInfo : orders) { + BigDecimal bigDecimal1 = new BigDecimal(fullOrderInfo.divide_order_fee); + fullOrderInfo.price = String.valueOf(new BigDecimal(fullOrderInfo.divide_order_fee).divide(new BigDecimal(fullOrderInfo.num), BigDecimal.ROUND_HALF_UP)); + fullOrderInfo.payment = fullOrderInfo.total_fee = fullOrderInfo.divide_order_fee; + BigDecimal bigDecimal2 = new BigDecimal( + (fullTradeInfo.product_fee == null || "".equals(fullTradeInfo.product_fee)) ? "0" + : fullTradeInfo.product_fee); + + + } + fullTradeInfo.adjust_fee = "0"; + fullTradeInfo.receiver_zip = ""; + fullTradeInfo.invoice_type = 0; + fullTradeInfo.invoice_content = ""; + fullTradeInfo.invoice_phone = ""; + fullTradeInfo.invoice_email = ""; + fullTradeInfo.tax_id = ""; + fullTradeInfo.address_telephone = ""; + fullTradeInfo.bank_of_deposit_account_number = ""; + fullTradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + fullTradeInfo.status = "未发货"; + fullTradeInfo.title = ""; + fullTradeInfo.type = "fixed"; + fullTradeInfo.test_flag = "否"; + } + } + + + @Override + public Set checkScientificCount(List originData) { + Set set = new HashSet<>(); + for (String str : originData) { + //解析scv文件数据 + String[] arr = str.split(Constants.CSV_FILE_PATTERN, -1); + for (int i = 0; i < arr.length; i++) { + if (arr[i].matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + set.add(EasyFileFieldEnum.get(i).getDescription()); + } + } + } + return set; + } +} + + diff --git a/src/com/since/emp/service/csv/StandardFileField.java b/src/com/since/emp/service/csv/StandardFileField.java new file mode 100644 index 0000000..8eec500 --- /dev/null +++ b/src/com/since/emp/service/csv/StandardFileField.java @@ -0,0 +1,1056 @@ +package com.since.emp.service.csv; + +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.csv.constants.*; +import com.since.emp.util.CloseUtil; +import com.since.emp.util.SqlUtil; +import org.apache.commons.lang.StringUtils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author zh + * @Date 2021/8/16 + * 记录读取上传的 CSV 文件,每行数据切分后的数组对应的字段名称 + * 对应标准文件模板 + */ +public class StandardFileField extends BaseFileField { + /** + * (0; "编号"); + */ + private String number; + + /** + * (1; "*店铺编码"); + */ + private String shopCode; + + /** + * (2; "*平台订单号(作为订单的唯一标示)"); + */ + private String platformOrder; + + /** + * (3; "*订单总金额"); + */ + private String orderTotalMoney; + + /** + * (4; "*订单商品数量"); + */ + private String orderGoodsCount; + + /** + * (5; "*订单实收金额"); + */ + private String orderRealityMoney; + + /** + * (6; "*优惠金额"); + */ + private String discountsMoney; + + /** + * (7; "*付款时间"); + */ + private String payDate; + + /** + * (8; "创建时间"); + */ + private String createDate; + + /** + * (9; "*收货人姓名"); + */ + private String consigneeName; + + /** + * (10; "*固定电话"); + */ + private String phoneNumber; + + /** + * (11; "*移动电话"); + */ + private String movePhone; + + /** + * (12; "*收货省"); + */ + private String province; + + /** + * (13; "*收货市"); + */ + private String city; + + /** + * (14; "*收货区/县"); + */ + private String district; + + /** + * (15; "*详细地址"); + */ + private String address; + + /** + * (16; "邮政编码"); + */ + private String postalCode; + + /** + * (17; "*运费"); + */ + private String freight; + + /** + * (18; "发票类型(5.普通发票 6.增值税普通发票 7.增值税专用发票,无票为空)"); + */ + private String invoiceType; + + /** + * (19; "发票抬头(个人或公司抬头)"); + */ + private String invoiceTitle; + + /** + * (20; "普通发票纳税人识别码(发票抬头是公司此项必填)"); + */ + private String invoiceCode; + + /** + * (21; "发票内容"); + */ + private String invoiceContent; + + /** + * (22; "电子发票联系人邮箱?"); + */ + private String invoiceEmail; + + /** + * (23; "电子发票联系人手机号"); + */ + private String invoicePhoneNumber; + + /** + * (24; "注册地址,电话(增票)"); + */ + private String registerAddress; + + /** + * (25; "开户银行及账号(增票)"); + */ + private String bank; + + /** + * (26; "开票金额"); + */ + private String invoiceMoney; + + /** + * (27; "*订单状态(未发货,已发货,已完成,已关闭)"); + */ + private String orderStatus; + /** + * (28; "所属平台(例如:淘宝,京东等)"); + */ + private String fromPlatform; + + /** + * (29; "订单类型(fixed(一口价),step(预售))"); + */ + private String orderType; + + /** + * (30; "买家留言"); + */ + private String buyerRemark; + + /** + * (31; "卖家备注"); + */ + private String vendorRemark; + + /** + * (32; "*是否测试"); + */ + private String isTest; + + /** + * (33; "商品编号"); + */ + private String goodsNumber; + + /** + * (34; "*平台商家编码"); + */ + private String platformMerchantCode; + + /** + * (35; "商品标题"); + */ + private String goodsTitle; + + /** + * (36; "*商品价格"); + */ + private String goodsPrice; + + /** + * (37; "*数量"); + */ + private String goodsCount; + + /** + * (38; "*实付金额"); + */ + private String goodsRealityMoney; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + private String errorMessage; + + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getShopCode() { + return shopCode; + } + + public void setShopCode(String shopCode) { + this.shopCode = shopCode; + } + + public String getPlatformOrder() { + return platformOrder; + } + + public void setPlatformOrder(String platformOrder) { + this.platformOrder = platformOrder; + } + + public String getOrderTotalMoney() { + return orderTotalMoney; + } + + public void setOrderTotalMoney(String orderTotalMoney) { + this.orderTotalMoney = orderTotalMoney; + } + + public String getOrderGoodsCount() { + return orderGoodsCount; + } + + public void setOrderGoodsCount(String orderGoodsCount) { + this.orderGoodsCount = orderGoodsCount; + } + + public String getOrderRealityMoney() { + return orderRealityMoney; + } + + public void setOrderRealityMoney(String orderRealityMoney) { + this.orderRealityMoney = orderRealityMoney; + } + + public String getDiscountsMoney() { + return discountsMoney; + } + + public void setDiscountsMoney(String discountsMoney) { + this.discountsMoney = discountsMoney; + } + + public String getPayDate() { + return payDate; + } + + public void setPayDate(String payDate) { + this.payDate = payDate; + } + + public String getCreateDate() { + return createDate; + } + + public void setCreateDate(String createDate) { + this.createDate = createDate; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getMovePhone() { + return movePhone; + } + + public void setMovePhone(String movePhone) { + this.movePhone = movePhone; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getDistrict() { + return district; + } + + public void setDistrict(String district) { + this.district = district; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getPostalCode() { + return postalCode; + } + + public void setPostalCode(String postalCode) { + this.postalCode = postalCode; + } + + public String getFreight() { + return freight; + } + + public void setFreight(String freight) { + this.freight = freight; + } + + public String getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(String invoiceType) { + this.invoiceType = invoiceType; + } + + public String getInvoiceTitle() { + return invoiceTitle; + } + + public void setInvoiceTitle(String invoiceTitle) { + this.invoiceTitle = invoiceTitle; + } + + public String getInvoiceCode() { + return invoiceCode; + } + + public void setInvoiceCode(String invoiceCode) { + this.invoiceCode = invoiceCode; + } + + public String getInvoiceContent() { + return invoiceContent; + } + + public void setInvoiceContent(String invoiceContent) { + this.invoiceContent = invoiceContent; + } + + public String getInvoiceEmail() { + return invoiceEmail; + } + + public void setInvoiceEmail(String invoiceEmail) { + this.invoiceEmail = invoiceEmail; + } + + public String getInvoicePhoneNumber() { + return invoicePhoneNumber; + } + + public void setInvoicePhoneNumber(String invoicePhoneNumber) { + this.invoicePhoneNumber = invoicePhoneNumber; + } + + public String getRegisterAddress() { + return registerAddress; + } + + public void setRegisterAddress(String registerAddress) { + this.registerAddress = registerAddress; + } + + public String getBank() { + return bank; + } + + public void setBank(String bank) { + this.bank = bank; + } + + public String getInvoiceMoney() { + return invoiceMoney; + } + + public void setInvoiceMoney(String invoiceMoney) { + this.invoiceMoney = invoiceMoney; + } + + public String getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(String orderStatus) { + this.orderStatus = orderStatus; + } + + public String getFromPlatform() { + return fromPlatform; + } + + public void setFromPlatform(String fromPlatform) { + this.fromPlatform = fromPlatform; + } + + public String getOrderType() { + return orderType; + } + + public void setOrderType(String orderType) { + this.orderType = orderType; + } + + public String getBuyerRemark() { + return buyerRemark; + } + + public void setBuyerRemark(String buyerRemark) { + this.buyerRemark = buyerRemark; + } + + public String getVendorRemark() { + return vendorRemark; + } + + public void setVendorRemark(String vendorRemark) { + this.vendorRemark = vendorRemark; + } + + public String getIsTest() { + return isTest; + } + + public void setIsTest(String isTest) { + this.isTest = isTest; + } + + public String getGoodsNumber() { + return goodsNumber; + } + + public void setGoodsNumber(String goodsNumber) { + this.goodsNumber = goodsNumber; + } + + public String getPlatformMerchantCode() { + return platformMerchantCode; + } + + public void setPlatformMerchantCode(String platformMerchantCode) { + this.platformMerchantCode = platformMerchantCode; + } + + public String getGoodsTitle() { + return goodsTitle; + } + + public void setGoodsTitle(String goodsTitle) { + this.goodsTitle = goodsTitle; + } + + public String getGoodsPrice() { + return goodsPrice; + } + + public void setGoodsPrice(String goodsPrice) { + this.goodsPrice = goodsPrice; + } + + public String getGoodsCount() { + return goodsCount; + } + + public void setGoodsCount(String goodsCount) { + this.goodsCount = goodsCount; + } + + public String getGoodsRealityMoney() { + return goodsRealityMoney; + } + + public void setGoodsRealityMoney(String goodsRealityMoney) { + this.goodsRealityMoney = goodsRealityMoney; + } + + + /** + * 处理订单数据 + * + * @param originData 文件中的数据 + * @return + */ + @Override + public List initData(List originData, List dataList) { + StandardFileField standardFileField = null; + StandardFileField currNode = null; + List errorList = new ArrayList<>(); + try { + for (int i = 0; i < originData.size(); i++) { + // 前两行没有订单数据 第三行开始为订单数据 + if (i <= 1) { + continue; + } + //解析scv文件数据 + String[] arr = originData.get(i).split(Constants.CSV_FILE_PATTERN, -1); + String shopCode = arr[1]; + /* + 当首个订单出现之前,没有shopCode 的为错误数据 + 出现订单之后,没有shopCode 的为子商品数据,存储到当前订单的next节点 + */ + if (StringUtils.isBlank(shopCode)) { + if (Objects.isNull(standardFileField)) { + errorList.add(toString(arr) + ",无订单信息"); + } else { + StandardFileField newNode = new StandardFileField(); + newNode.init(arr); + currNode.next = newNode; + currNode = newNode; + } + } else { + standardFileField = new StandardFileField(); + currNode = standardFileField; + standardFileField.init(arr); + dataList.add(standardFileField); + } + + } + } catch (Exception e) { + e.printStackTrace(); + // 出现异常 全部写入错误数据 + originData = originData.stream().map(val -> val.concat(",文件解析错误")).collect(Collectors.toList()); + final List data = originData; + originData = originData.stream().filter(val -> data.indexOf(val) > 1).collect(Collectors.toList()); + return originData; + } + return errorList; + } + + + @Override + public Boolean validate(String companyCode) { + int i = 1; + StandardFileField field = this; + // 数据是否有错误 + boolean isError = false; + + while (field != null) { + StringBuilder builder = new StringBuilder(); + if (i == 1) { + builder.append(checkShopCode(field.shopCode, companyCode)) + .append(checkOrderNumber(field.platformOrder)) + .append(checkOrderTotalMoney(field.orderTotalMoney)) + .append(checkOrderGoodsCount(field.orderGoodsCount)) + .append(checkOrderRealityMoney(field.orderRealityMoney)) + .append(checkDiscountMoney(field.discountsMoney)) + .append(checkDate(field.payDate,this)) + .append(checkDate(field.createDate,null)) + .append(checkPayDate(field.payDate, this)) + .append(checkConsigneeName(field.consigneeName)) + .append(checkPhoneNumber(field.phoneNumber, field.movePhone)) + .append(checkAddress(field.province, field.city, field.district)) + .append(checkFreight(field.freight)) + .append(checkAddressDetailedAddress(field.address)) + .append(checkOrderStatus(field.orderStatus)) + .append(checkIsTest(field.isTest)) + .append(checkInvoiceType(field.invoiceType)) + .append(checkPlatformMerchantCode(field.platformMerchantCode)) + ; + + } + builder.append(checkGoodsPrice(field.goodsPrice)) + .append(checkGoodsCount(field.goodsCount)) + .append(checkRealityMoney(field.goodsRealityMoney)); + String error = builder.toString(); + if (StringUtils.isNotBlank(error)) { + field.errorMessage = error; + isError = true; + } + field = (StandardFileField) field.next; + i++; + } + return isError; + } + + /** + * 校验发票类型是否正确 + * + * @param invoiceType 类型 + * @return 错误信息 + */ + private String checkInvoiceType(String invoiceType) { + if (StringUtils.isBlank(invoiceType)) { + return ""; + } + if (!invoiceType.trim().matches("^[5]|[6]|[7]")) { + return "发票类型数据错误!**"; + } + return ""; + } + + + /** + * 校验邮编是否正确 + * + * @param postalCode 待校验的邮编 + * @return 错误信息 + */ + private String checkPostalCode(String postalCode) { + if (postalCode.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置邮政编码为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!postalCode.trim().matches(Constants.POSTAL_CODE_PATTERN)) { + return "邮政编码格式错误!**"; + } + return ""; + } + + /** + * 校验金额是否为数字 + * + * @param invoiceMoney + * @return + */ + private String checkInvoiceMoney(String invoiceMoney) { + if (org.apache.commons.lang3.StringUtils.isNotBlank(invoiceMoney) && invoiceMoney.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置开票金额为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + return ""; + } + + + /** + * 校验商品价格 + * + * @param goodsPrice 商品价格 + * @return 错误信息 + */ + private String checkGoodsPrice(String goodsPrice) { + if (goodsPrice.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置商品价格为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!goodsPrice.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "商品价格填写错误!**"; + } + return ""; + } + + /** + * 校验是否测试 + * + * @param isTest 是否测试 + * @return 错误信息 + */ + private String checkIsTest(String isTest) { + String status = OrderIsTestEnum.status(isTest.trim()); + if (StringUtils.isBlank(status)) { + return "是否测试数据错误!**"; + } + return ""; + } + + /** + * 校验省市区 是否符合 + * + * @param orderStatus 订单状态 + * @return 错误信息 + */ + private String checkOrderStatus(String orderStatus) { + String status = OrderStatusEnum.status(orderStatus.trim()); + if (StringUtils.isBlank(status)) { + return "订单状态错误!**"; + } + return ""; + } + + + /** + * 校验运费 是否符合 + * + * @param freight 运费 + * @return 错误信息 + */ + private String checkFreight(String freight) { + if (freight.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置运费为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!freight.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "运费数据错误!**"; + } + return ""; + } + + /** + * 校验省市区 是否符合 + * + * @param city 市 + * @param district 区 + * @param province 省 + * @return 错误信息 + */ + private String checkAddress(String province, String city, String district) { + String provinceCode = SqlUtil.getAddress("1", province.trim()); + if (StringUtils.isBlank(provinceCode)) { + Set address = SqlUtil.getNextAddress("1"); + return ("省级单位错误!请填写正确的省->" + address + "**").replace(",", "/"); + } + String cityCode = SqlUtil.getAddress(provinceCode, city.trim()); + if (StringUtils.isBlank(cityCode)) { + Set address = SqlUtil.getNextAddress(provinceCode); + return ("市级单位错误!请填写正确的市->" + address + "**").replace(",", "/"); + } + String districtCode = SqlUtil.getAddress(cityCode, district.trim()); + if (StringUtils.isBlank(districtCode)) { + Set address = SqlUtil.getNextAddress(cityCode); + return ("区/县级单位错误!请填写正确的区/县->" + address + "**").replace(",", "/"); + } + return ""; + } + + + /** + * 验证优惠金额是否符合 + * + * @param discountsMoney 待验证的优惠 + * @return 返回不存在的错误信息 + */ + private String checkDiscountMoney(String discountsMoney) { + + if (discountsMoney.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置订单优惠金额为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!discountsMoney.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "订单优惠金额数据错误!**"; + } + return ""; + } + + /** + * 验证订单实收金额是否符合 + * + * @param orderRealityMoney 待验证的订单实收金额 + * @return 返回不存在的错误信息 + */ + private String checkOrderRealityMoney(String orderRealityMoney) { + if (orderRealityMoney.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置订单实收金额为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!orderRealityMoney.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "订单实收金额数据错误!**"; + } + return ""; + } + + + /** + * 验证详细地址 + * + * @param address + * @return + */ + + @Override + public String checkAddressDetailedAddress(String address) { + if (StringUtils.isBlank(address)) { + return "详细地址不可为空!"; + } + return ""; + } + + /** + * 验证订单总金额是否符合 + * + * @param orderTotalMoney 待验证的订单总金额 + * @return 返回不存在的错误信息 + */ + private String checkOrderTotalMoney(String orderTotalMoney) { + + if (orderTotalMoney.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置订单总金额为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!orderTotalMoney.trim().matches(Constants.IS_NUMBER_PATTERN)) { + return "订单总金额数据错误!**"; + } + return ""; + } + + + /** + * 验证订单总数量是否符合 + * + * @param orderGoodsCount 待验证的订单总数量 + * @return 返回不存在的错误信息 + */ + private String checkOrderGoodsCount(String orderGoodsCount) { + if (orderGoodsCount.matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + return " 请设置订单总数量为文本格式后再上传。设置地址:" + Constants.EXCEL_EDIT_FORMAT_URL + " "; + } + if (!orderGoodsCount.trim().matches(Constants.IS_INTEGER_PATTERN)) { + return "订单商品数量数据错误**"; + } + return ""; + } + + @Override + public void writeTradeInfo(TradeInfo info) { + info.csvOrderNumber = this.number; + info.shop_code = this.shopCode; + info.tid = this.platformOrder; + info.product_fee = this.orderTotalMoney; + info.num = Integer.parseInt(this.orderGoodsCount.trim()); + info.money = this.orderRealityMoney; + info.pay_money = this.orderRealityMoney; + info.discount_fee = this.discountsMoney; + String date = this.payDate; + + info.pay_time = date; + info.platform_modify_time = date; + info.created = this.createDate; + info.invoice_type = Integer.parseInt( + StringUtils.isNotBlank(this.invoiceType.trim()) + ? this.invoiceType.trim() + : "0"); + info.receiver_name = this.consigneeName; + info.receiver_phone = this.phoneNumber; + info.receiver_mobile = this.movePhone; + info.receiver_state = this.province; + info.receiver_city = this.city; + info.receiver_district = this.district; + info.receiver_country = "中国"; + info.receiver_address = this.address; + info.receiver_zip = this.postalCode; + info.post_fee = this.freight; + info.invoice_title = this.invoiceTitle; + info.tax_id = this.invoiceCode; + info.invoice_content = this.invoiceContent; + info.invoice_email = this.invoiceEmail; + info.invoice_phone = this.invoicePhoneNumber; + info.address_telephone = this.registerAddress; + info.bank_of_deposit_account_number = this.bank; + info.invoice_money = this.invoiceMoney; + info.status = this.orderStatus; + info.title = this.fromPlatform; + info.type = this.orderType; + info.buyer_message = this.buyerRemark; + info.seller_memo = this.vendorRemark; + info.test_flag = this.isTest; + } + + @Override + public OrderInfo writeOrderInfo() { + OrderInfo info = new OrderInfo(); + info.platform_seller_code = this.platformMerchantCode; + info.title = this.goodsTitle; + info.price = this.goodsPrice; + info.num = Integer.parseInt(this.goodsCount.trim()); + + BigDecimal bigDecimal1 = new BigDecimal(this.goodsPrice); + info.payment = bigDecimal1.toString(); + info.num_iid = this.goodsNumber; + info.discount_fee = "0"; + info.total_fee = "0"; + info.adjust_fee = "0"; + info.sku_id = ""; + info.divide_order_fee = this.goodsRealityMoney; + return info; + } + + /** + * 把数据封装到该类 + * + * @param arr 文件中的数据 + */ + protected void init(String[] arr) throws Exception { + Field[] declaredFields = this.getClass().getDeclaredFields(); + for (int i = 0; i < declaredFields.length; i++) { + declaredFields[i].setAccessible(true); + declaredFields[i].set(this, arr[i].replaceAll("^\"|\"$", "").trim()); + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + Field[] declaredFields = this.getClass().getDeclaredFields(); + for (Field declaredField : declaredFields) { + try { + declaredField.setAccessible(true); + builder.append(Objects.toString(declaredField.get(this), "")).append(","); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return builder.toString().substring(0, builder.length() - 1); + } + + @Override + public void writeErrorToCsv(TradeInfo info, Charset charset, String msg) { + BufferedWriter writer = null; + StringBuilder builder; + try { + builder = new StringBuilder(); + File file = new File(info.out_path); + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), charset)); + // 如果不存在, 需要文件头数据 + if (file.length() == 0) { + writer.write(StandardFileFieldEnum.DEFAULT.returnString()); + } + builder.append(info.csvOrderNumber).append(",") + .append(info.shop_code).append(",") + .append(info.tid).append(",") + .append(info.product_fee).append(",") + .append(info.num).append(",") + .append(info.money).append(",") + .append(info.discount_fee).append(",") + .append(info.pay_time).append(",") + .append(info.created).append(",") + .append(info.receiver_name).append(",") + .append(info.receiver_phone).append(",") + .append(info.receiver_mobile).append(",") + .append(info.receiver_state).append(",") + .append(info.receiver_city).append(",") + .append(info.receiver_district).append(",") + .append(info.receiver_address).append(",") + .append(info.receiver_zip).append(",") + .append(info.post_fee).append(",") + .append(info.invoice_type).append(",") + .append(info.invoice_title).append(",") + .append(info.tax_id).append(",") + .append(info.invoice_content).append(",") + .append(info.invoice_email).append(",") + .append(info.receiver_phone).append(",") + .append(info.address_telephone).append(",") + .append(info.bank_of_deposit_account_number).append(",") + .append(info.invoice_money).append(",") + .append(info.status).append(",") + .append(info.title).append(",") + .append(info.type).append(",") + .append(info.buyer_message).append(",") + .append(info.seller_memo).append(",") + .append(info.test_flag).append(",") + + ; + int orderFieldCount = builder.toString().split(",").length; + OrderInfo[] orders = info.orders; + for (int i = 0; i < orders.length; i++) { + if (i > 0) { + builder.delete(0, builder.length()); + appendDefaultData(builder, orderFieldCount); + } + builder.append(Objects.toString(orders[i].num_iid, "")).append(","); + builder.append(orders[i].platform_seller_code).append(",") + .append(orders[i].title).append(",") + .append(orders[i].price).append(",") + .append(orders[i].num).append(",") + .append(orders[i].payment).append(",") + .append("订单已存在!") + ; + writer.newLine(); + writer.write(builder.toString()); + + } + writer.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + CloseUtil.close(writer); + } + } + + @Override + public void init(List tradeInfos) { + + } + + /** + * 校验有无 将纯数字识别为科学技术法的列 + * 店铺编码、订单号格式错误, + * + * @param originData + * @return + */ + @Override + public Set checkScientificCount(List originData) { + Set set = new HashSet<>(); + for (String str : originData) { + //解析scv文件数据 + String[] arr = str.split(Constants.CSV_FILE_PATTERN, -1); + for (int i = 0; i < arr.length; i++) { + if (arr[i].matches(Constants.CHECK_SCIENTIFIC_COUNT)) { + set.add(StandardFileFieldEnum.get(i).getDescription()); + } + } + } + return set; + } +} diff --git a/src/com/since/emp/service/csv/constants/AddressTypeEnum.java b/src/com/since/emp/service/csv/constants/AddressTypeEnum.java new file mode 100644 index 0000000..650343c --- /dev/null +++ b/src/com/since/emp/service/csv/constants/AddressTypeEnum.java @@ -0,0 +1,29 @@ +package com.since.emp.service.csv.constants; + +/** + * @author zh + * @Date 2021/8/18 + * 地址等级 + */ +public enum AddressTypeEnum { + COUNTRY("国家", "1"), + PROVINCE("省", "2"), + CITY("市/区", "3"), + COUNTY("区/县", "4"), + ; + private String info; + private String type; + + AddressTypeEnum(String info, String type) { + this.info = info; + this.type = type; + } + + public String getInfo() { + return info; + } + + public String getType() { + return type; + } +} diff --git a/src/com/since/emp/service/csv/constants/BaseFileFieldEnum.java b/src/com/since/emp/service/csv/constants/BaseFileFieldEnum.java new file mode 100644 index 0000000..37a1406 --- /dev/null +++ b/src/com/since/emp/service/csv/constants/BaseFileFieldEnum.java @@ -0,0 +1,11 @@ +package com.since.emp.service.csv.constants; + +/** + * @author zh + * @Date 2021/8/20 + */ +public interface BaseFileFieldEnum { + + String returnString(); + +} diff --git a/src/com/since/emp/service/csv/constants/Constants.java b/src/com/since/emp/service/csv/constants/Constants.java new file mode 100644 index 0000000..8ecc30c --- /dev/null +++ b/src/com/since/emp/service/csv/constants/Constants.java @@ -0,0 +1,64 @@ +package com.since.emp.service.csv.constants; + +/** + * @author zh + * @Date 2021/8/18 + */ +public class Constants { + + /** + * 切分csv文件的正则表达式 + */ + public static final String CSV_FILE_PATTERN = ",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"; + + /** + * 读取的csv文件后缀名 + */ + public static final String CSV_FILE_SUFFIX = ".csv"; + + /** + * 输出的错误文件后缀名 + */ + public static final String CSV_ERROR_SUFFIX = "_error.csv"; + + /** + * 是否为正数的正则表达式 包括小数 + */ + public static final String IS_NUMBER_PATTERN = "(^[1-9]+[0-9]*\\.?[0-9]+$)|(^[0-9]?\\.?[0-9]+$)"; + + + /** + * 正整数正则 + */ + public static final String IS_INTEGER_PATTERN = "^[1-9][0-9]*"; + + /** + * 所有符号正则 + */ + public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"; + + /** + * 手机号正则 + */ + public static final String PHONE_NUMBER_PATTERN = "^1[3-9](\\d){9}$"; + + /** + * 邮编正则 + */ + public static final String POSTAL_CODE_PATTERN = "^[1-9]\\d{5}$"; + + /** + * excel 修改单元格样式为文本形式 地址 + */ + public static final String EXCEL_EDIT_FORMAT_URL = ", 不能使用科学计数法。请点击:解决方案"; + + /** + * 判断是否为科学计数 + */ + public static final String CHECK_SCIENTIFIC_COUNT = "(-?\\d+\\.?\\d*)[Ee]{1}[\\+-]?[0-9]*"; + + public static final String ERROR_CHARSET = "EUC-KR"; + + + +} diff --git a/src/com/since/emp/service/csv/constants/CsvDataTypeEnum.java b/src/com/since/emp/service/csv/constants/CsvDataTypeEnum.java new file mode 100644 index 0000000..151d055 --- /dev/null +++ b/src/com/since/emp/service/csv/constants/CsvDataTypeEnum.java @@ -0,0 +1,44 @@ +package com.since.emp.service.csv.constants; + +import java.util.Objects; + +/** + * @author zh + * @Date 2021/8/13 + */ +public enum CsvDataTypeEnum { + EASY("简易","匹配简易对应的类"), + STANDARD("","匹配标准对应的类"), + OTHER("其他","其他位置的类型"), + ; + private String type; + private String description; + + + CsvDataTypeEnum(String type, String description) { + this.type = type; + this.description = description; + } + + public String getType() { + return type; + } + + public String getDescription() { + return description; + } + + /** + * 根据传入的参数匹配对应的值 + * @param string + * @return + */ + public static CsvDataTypeEnum getType(String string) { + for (CsvDataTypeEnum value : CsvDataTypeEnum.values()) { + if (Objects.equals(value.getType(), string)) { + return value; + } + } + return OTHER; + } +} diff --git a/src/com/since/emp/service/csv/constants/EasyFileFieldEnum.java b/src/com/since/emp/service/csv/constants/EasyFileFieldEnum.java new file mode 100644 index 0000000..1cca12a --- /dev/null +++ b/src/com/since/emp/service/csv/constants/EasyFileFieldEnum.java @@ -0,0 +1,69 @@ +package com.since.emp.service.csv.constants; + +/** + * @author zh + * @Date 2021/8/16 + * 记录读取上传的 CSV 文件,每行数据切分后的数组对应的字段名称 + * 注释 @see description + * 对应简易文件模板 + */ +public enum EasyFileFieldEnum implements BaseFileFieldEnum { + + DEFAULT(-1,""), + NUMBER(0, "编号"), + SHOP_CODE(1, "*店铺编码"), + PLATFORM_ORDER(2, "*平台订单号(作为订单的唯一标示)"), + PAY_DATE(3, "付款时间"), + CONSIGNEE_NAME(4, "*收货人姓名"), + MOVE_PHONE(5, "*移动电话"), + ADDRESS(6, "*详细地址"), + BUYER_REMARK(7, "买家留言"), + VENDOR_REMARK(8, "卖家备注"), + PLATFORM_MERCHANT_CODE(9, "*平台商家编码"), + GOODS_COUNT(10, "*数量"), + REALITY_MONEY(11, "*实付金额"), + ; + + /** + * 读取字段对应的数组下标 + */ + private Integer index; + + /** + * 字段描述 + */ + private String description; + + EasyFileFieldEnum(int index, String description) { + this.index = index; + this.description = description; + } + + public int getIndex() { + return index; + } + + public String getDescription() { + return description; + } + + public String returnString() { + StringBuilder stringBuilder = new StringBuilder(); + for (EasyFileFieldEnum value : EasyFileFieldEnum.values()) { + stringBuilder.append(value.description).append(","); + } + String result = stringBuilder.toString(); + return result.substring(1,result.length() - 1); + } + + public static EasyFileFieldEnum get(Integer column) { + for (EasyFileFieldEnum value : EasyFileFieldEnum.values()) { + if (value.index.equals(column)) { + return value; + } + } + return EasyFileFieldEnum.DEFAULT; + } +} + + diff --git a/src/com/since/emp/service/csv/constants/OrderIsTestEnum.java b/src/com/since/emp/service/csv/constants/OrderIsTestEnum.java new file mode 100644 index 0000000..29e4e6b --- /dev/null +++ b/src/com/since/emp/service/csv/constants/OrderIsTestEnum.java @@ -0,0 +1,38 @@ +package com.since.emp.service.csv.constants; + +import java.util.Objects; + +/** + * @author zh + * @Date 2021/8/19 + */ +public enum OrderIsTestEnum { + NO("否"), + YES("是"), + + ; + private String status; + + OrderIsTestEnum(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + + /** + * 根据传入的参数匹配对应的值 + * @param string + * @return + */ + public static String status(String string) { + for (OrderIsTestEnum value : OrderIsTestEnum.values()) { + if (Objects.equals(value.getStatus(), string)) { + return value.status; + } + } + return null; + } +} diff --git a/src/com/since/emp/service/csv/constants/OrderStatusEnum.java b/src/com/since/emp/service/csv/constants/OrderStatusEnum.java new file mode 100644 index 0000000..7b534fc --- /dev/null +++ b/src/com/since/emp/service/csv/constants/OrderStatusEnum.java @@ -0,0 +1,39 @@ +package com.since.emp.service.csv.constants; + +import java.util.Objects; + +/** + * @author zh + * @Date 2021/8/19 + */ +public enum OrderStatusEnum { + NOT("未发货"), + YES("已发货"), + FINISH("已完成"), + CLOSE("已关闭"), + ; + private String status; + + OrderStatusEnum(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + + /** + * 根据传入的参数匹配对应的值 + * @param string + * @return + */ + public static String status(String string) { + for (OrderStatusEnum value : OrderStatusEnum.values()) { + if (Objects.equals(value.getStatus(), string)) { + return value.status; + } + } + return null; + } +} diff --git a/src/com/since/emp/service/csv/constants/StandardFileFieldEnum.java b/src/com/since/emp/service/csv/constants/StandardFileFieldEnum.java new file mode 100644 index 0000000..29ba1f7 --- /dev/null +++ b/src/com/since/emp/service/csv/constants/StandardFileFieldEnum.java @@ -0,0 +1,94 @@ +package com.since.emp.service.csv.constants; + +/** + * @author zh + * @Date 2021/8/16 + * 记录读取上传的 CSV 文件,每行数据切分后的数组对应的字段名称 + * 注释 description + * 对应标准文件模板 + */ +public enum StandardFileFieldEnum implements BaseFileFieldEnum { + DEFAULT(-1,""), + NUMBER(0, "编号"), + SHOP_CODE(1, "*店铺编码"), + PLATFORM_ORDER(2, "*平台订单号"), + ORDER_TOTAL_MONEY(3, "*订单总金额"), + ORDER_GOODS_COUNT(4, "*订单商品数量"), + ORDER_REALITY_MONEY(5, "*订单实收金额"), + DISCOUNTS_MONEY(6, "*优惠金额"), + PAY_DATE(7, "*付款时间"), + CREATE_DATE(8, "创建时间"), + CONSIGNEE_NAME(9, "*收货人姓名"), + PHONE_NUMBER(10, "*固定电话"), + MOVE_PHONE(11, "*移动电话"), + PROVINCE(12, "*收货省"), + CITY(13, "*收货市"), + DISTRICT(14, "*收货区/县"), + ADDRESS(15, "*详细地址"), + POSTAL_CODE(16, "邮政编码"), + FREIGHT(17, "*运费"), + INVOICE_TYPE(18, "发票类型"), + INVOICE_TITLE(19, "发票抬头"), + INVOICE_CODE(20, "普通发票纳税人识别码"), + INVOICE_CONTENT(21, "发票内容"), + INVOICE_EMAIL(22, "电子发票联系人邮箱?"), + NUMBER_PHONE_NUMBER(23, "电子发票联系人手机号"), + REGISTER_ADDRESS(24, "注册地址,电话(增票)"), + BANK(25, "开户银行及账号(增票)"), + INVOICE_MONEY(26, "开票金额"), + ORDER_STATUS(27, "*订单状态"), + FROM_PLATFORM(28, "所属平台"), + ORDER_TYPE(29, "订单类型"), + BUYER_REMARK(30, "买家留言"), + VENDOR_REMARK(31, "卖家备注"), + IS_TEST(32, "*是否测试"), + GOODS_NUMBER(33, "商品编号"), + PLATFORM_MERCHANT_CODE(34, "*平台商家编码"), + GOODS_TITLE(35, "商品标题"), + GOODS_PRICE(36, "*商品价格"), + GOODS_COUNT(37, "*数量"), + REALITY_MONEY(38, "*实付金额"), + BACK_MESSAGE(39, "订单录入返回信息"), + ; + + /** + * 读取字段对应的数组下标 + */ + private Integer index; + + /** + * 字段描述 + */ + private String description; + + StandardFileFieldEnum(int index, String description) { + this.index = index; + this.description = description; + } + + public int getIndex() { + return index; + } + + public String getDescription() { + return description; + } + + public String returnString() { + StringBuilder builder = new StringBuilder(); + for (StandardFileFieldEnum value : StandardFileFieldEnum.values()) { + builder.append(value.description).append(","); + } + String result = builder.toString(); + return result.substring(1,result.length() - 1); + } + + public static StandardFileFieldEnum get(Integer column) { + for (StandardFileFieldEnum value : StandardFileFieldEnum.values()) { + if (value.index.equals(column)) { + return value; + } + } + return StandardFileFieldEnum.DEFAULT; + } +} diff --git a/src/com/since/emp/service/queue/order/CheckTradeQueueThread.java b/src/com/since/emp/service/queue/order/CheckTradeQueueThread.java new file mode 100644 index 0000000..55e6209 --- /dev/null +++ b/src/com/since/emp/service/queue/order/CheckTradeQueueThread.java @@ -0,0 +1,64 @@ +package com.since.emp.service.queue.order; + +import java.io.File; +import java.io.FileWriter; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.constant.CheckNewOrderQueue; +import com.since.emp.service.OrderSyncs; + +/** + * @Description: 检查DataParse的新订单队列,记录队列里面最早一单的订单创建时间。 + * 根据此时间,可以在数据库崩溃的情况下,重启程序以重新抓取到消息已发送而未落库的订单数据。 + * @ClassName: CheckTradeQueueThread + * @author Lewis + * @date 2021-11-5 9:24:33 + * + */ +public class CheckTradeQueueThread extends Thread { + private static final Logger logger = LogManager.getLogger(CheckTradeQueueThread.class); + String tradeCreateTime = ""; + + @Override + public void run() { + try { + File file = new File(CheckNewOrderQueue.fileName); + if (!file.exists()) { + file.createNewFile(); + } + file.createNewFile(); + OrderSyncs.dataParse.tradeQueue.forEach(tradeInfo->{ + if ("002".equals(tradeInfo.platform_code)) { + tradeCreateTime = "".equals(tradeCreateTime)?tradeInfo.created: (tradeCreateTime.compareTo(tradeInfo.created)>0?tradeInfo.created:tradeCreateTime); + } + }); + if ("".equals(tradeCreateTime)) { + logger.info("检查新订单写入队列,队列无积压订单"); + }else { + if (file.canWrite()) { + //写文件之前,首先清空文件 + StringBuffer str = new StringBuffer(""); + writeFile(file,str.toString()); + //将订单时间写入文件 + str = str.append("tradeCreateTime=").append(tradeCreateTime); + writeFile(file, str.toString()); + logger.info("检查新订单写入队列,队列有积压订单,更新cnoq.properties文件的tradeCreateTime={}",tradeCreateTime); + } else { + logger.info("检查新订单写入队列,队列有积压订单,但是文件不可写入,放弃处理"); + } + + } + } catch (Exception e) { + logger.error(this,e); + } + } + + private void writeFile(File file, String str) throws Exception { + FileWriter fileWriter = new FileWriter(file); + fileWriter.write(str); + fileWriter.flush(); + fileWriter.close(); + } +} diff --git a/src/com/since/emp/service_bak/ApiDangdang_bak.java b/src/com/since/emp/service_bak/ApiDangdang_bak.java new file mode 100644 index 0000000..e777915 --- /dev/null +++ b/src/com/since/emp/service_bak/ApiDangdang_bak.java @@ -0,0 +1,987 @@ +package com.since.emp.service_bak; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.MD5Util; + +import net.sf.json.JSON; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.xml.XMLSerializer; + +/** + * ApiDangdang 当当api接口类 + * + * @author jue + * + */ +public class ApiDangdang_bak { + private static final Logger logger = LogManager.getLogger(ApiDangdang_bak.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private Vector orderQueue; + private Vector exceptionOrderQueue; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /* + * public class ShopOrderInfo { String tid; ShopConfig shopConfig; String + * app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, + * String app_secret) { this.tid = tid; this.shopConfig = shopConfig; + * this.app_key = app_key; this.app_secret = app_secret; } } + */ + + public ApiDangdang_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + + try { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + + threadPool = ThreadPool.getInstance(); + + // 启动订单详情获取队列 + orderQueue = new Vector(); + exceptionOrderQueue = new Vector(); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + + GetOrderInfoThread getOrderInfoThread = new GetOrderInfoThread(); + // getOrderInfoThread.setDaemon(true); + // getOrderInfoThread.start(); + scheduledThreadPool.scheduleAtFixedRate(getOrderInfoThread, 0, 500, TimeUnit.MILLISECONDS); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + ordersByTime1(platConfig.apps.get(0).shops.get(0)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] 根据订单号抓取订单,API返回订单数据:[ {} ]", shopOrderInfo.shopConfig.name, + recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + // logger.info("【"+logTitle+"】app:"+app_key+"启动,抓取店铺:"+shops.get(0).name); + + } else { + + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // OrdersTimerTask ott = new OrdersTimerTask(cachedThreadPool); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ] 启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 根据下单时间段抓取订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void ordersByTime1(ShopConfig shopConfig) { + // 启动抓单线程 + GetOrderThread1 thread1 = new GetOrderThread1(shopConfig, recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(thread1); + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author jue + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 异常订单处理队列 + ExceptionQueueThread eqt = new ExceptionQueueThread(); + threadPool.execute(eqt); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class GetOrderThread extends Thread { + private AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数5、10、15、20,默认20 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + GetMethod httpMethod = new GetMethod(platConfig.api_url); + try { + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + String signStr = appConfig.secret + "app_key" + appConfig.key + "format" + "xml" + "method" + + "dangdang.orders.list.get" + "session" + shopConfig.session_key + "sign_method" + "md5" + + "timestamp" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + + appConfig.secret;// 组成签名字符串 + MD5Util md5 = new MD5Util(); + String signStrMD5 = md5.MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + appConfig.key + + "&method=" + "dangdang.orders.list.get" + "&format=" + "xml" + "&session=" + + shopConfig.session_key + "&os=101" + "&p=" + page_now + "&pageSize=" + page_rows + + "&lastModifyTime_start=" + time_start + "&lastModifyTime_end=" + time_end; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + String jsonString = xmlToJson(resxml);// 将xml转为json + // JSONObject jsonObject = JSONObject.fromObject(jsonStr); + + // logger.info("【"+logTitle+"】【"+shopConfig.name+"】返回订单:"+resxml); + this.parseOrderList(jsonString); + } catch (HttpException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + + // 处理错误信息 + if (json.has("errorCode")) { + + logger.info("[ {} ]获取订单响应:{}", shopConfig.name, jsonStr); + + shopConfig.errFlag = false; + String errorCode = json.getString("errorCode"); + logger.info("[ {} ] {}:{}", shopConfig.name, errorCode, json.getString("errorMessage")); + if ("177".equals(errorCode) || "178".equals(errorCode) || "179".equals(errorCode)) {// 非session_key问题直接重试 + logger.info("店铺:[ {} ] session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else if ("182".equals(errorCode)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + + if (json.has("Error")) { + logger.info("[ {} ] 异常订单返回结果:{}" + shopConfig.name, json.get("Error")); + return; + } + + // 未查询到数据 + JSONObject totalInfo = json.getJSONObject("totalInfo"); + int totalCount = totalInfo.getInt("orderCount"); + logger.info("[ {} ] 本批数据总数:{},剩余未处理数:{}" + shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + + shopConfig.errFlag = false; + return; + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + // 将订单移至队列,等待获取详细信息 + int currentPageCount = this.page_rows; + if (this.page_now == this.page_count) { + currentPageCount = totalCount % this.page_rows; + } + if (currentPageCount == 1) { + // 当前页订单数为1 + JSONObject OrdersList = json.getJSONObject("OrdersList"); + JSONObject OrderInfo = OrdersList.getJSONObject("OrderInfo"); + String orderID = OrderInfo.getString("orderID"); + orderQueue.add(new ShopOrderInfo(orderID, shopConfig, appConfig.key, appConfig.secret)); + } else { + // 当前页订单数>1 + JSONArray OrdersList = json.getJSONArray("OrdersList"); + for (int i = 0; i < OrdersList.size(); i++) { + JSONObject order = OrdersList.getJSONObject(i); + String orderID = order.getString("orderID"); + orderQueue.add(new ShopOrderInfo(orderID, shopConfig, appConfig.key, appConfig.secret)); + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] 异常订单返回结果:{}", shopConfig.name, jsonStr); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class GetOrderThread1 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数5、10、15、20,默认20 + + public GetOrderThread1(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + + GetMethod httpMethod = new GetMethod(platConfig.api_url); + try { + time_start = time_start.substring(0, 19); + time_end = time_end.substring(0, 19); + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + String signStr = platConfig.apps.get(0).secret + "app_key" + platConfig.apps.get(0).key + "format" + + "xml" + "method" + "dangdang.orders.list.get" + "session" + shopConfig.session_key + + "sign_method" + "md5" + "timestamp" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + + platConfig.apps.get(0).secret;// 组成签名字符串 + MD5Util md5 = new MD5Util(); + String signStrMD5 = md5.MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + + platConfig.apps.get(0).key + "&method=" + "dangdang.orders.list.get" + "&format=" + "xml" + + "&session=" + shopConfig.session_key + "&os=101" + "&p=" + page_now + "&pageSize=" + page_rows + + "&osd=" + time_start + "&oed=" + time_end; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + String jsonString = xmlToJson(resxml);// 将xml转为json + // JSONObject jsonObject = JSONObject.fromObject(jsonStr); + + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (HttpException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + + // 处理错误信息 + if (json.has("errorCode")) { + logger.info("异常订单返回结果:{}", jsonStr); + logger.info("[ {} ] {}:{}", shopConfig.name, json.getString("errorCode"), + json.getString("errorMessage")); + // this.getOrder();// 重新抓取 + return; + } + if (!json.has("totalInfo")) { + if (json.has("errorCode")) { + String errorCode = json.getString("errorCode"); + if ("177".equals(errorCode) || "178".equals(errorCode) || "179".equals(errorCode)) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + } + } else { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + } + return; + } + if (json.has("Error")) { + logger.info("[ {} ] 异常订单返回结果:{}" + shopConfig.name, json.get("Error")); + return; + } + // 未查询到数据 + JSONObject totalInfo = json.getJSONObject("totalInfo"); + int totalCount = totalInfo.getInt("orderCount"); + logger.info("[ {} ] 根据订单生成时间本批数据总数:{},剩余未处理数:{}", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + // 将订单移至队列,等待获取详细信息 + int currentPageCount = this.page_rows; + if (this.page_now == this.page_count) { + currentPageCount = totalCount % this.page_rows; + } + if (currentPageCount == 1) { + // 当前页订单数为1 + JSONObject OrdersList = json.getJSONObject("OrdersList"); + JSONObject OrderInfo = OrdersList.getJSONObject("OrderInfo"); + String orderID = OrderInfo.getString("orderID"); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(orderID, shopConfig, platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + // orderQueue.add(new ShopOrderInfo(orderID,shopConfig)); + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", orderID); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", orderID); + } + } else { + // 当前页订单数>1 + JSONArray OrdersList = json.getJSONArray("OrdersList"); + for (int i = 0; i < OrdersList.size(); i++) { + JSONObject order = OrdersList.getJSONObject(i); + String orderID = order.getString("orderID"); + // orderQueue.add(new + // ShopOrderInfo(orderID,shopConfig)); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(orderID, shopConfig, platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", orderID); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", orderID); + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + // if(this.page_now == this.page_count){ + // System.exit(0); + // } + + } catch (Exception e) { + logger.info("[ {} ] 异常订单返回结果:{}", shopConfig.name, jsonStr); + logger.error(this, e); + // this.getOrder();//重新抓取 + } + } + } + + /** + * xmlToJson + * + * @param xml + * @return + */ + private String xmlToJson(String xml) throws Exception { + XMLSerializer xmlSerializer = new XMLSerializer(); + JSON json = xmlSerializer.read(xml); + String jsonStr = json.toString(1); + jsonStr = jsonStr.replace("[]", "\"\""); + return jsonStr; + } + + /** + * GetOrderInfoThread 获取订单详情线程 + * + * @author Carl + * + */ + private class GetOrderInfoThread extends Thread { + @Override + public void run() { + // while (true) { + try { + if (orderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = orderQueue.get(0); + logger.info("[ {} ] 获取订单详情|[ {} ]" + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + if (getOrderInfo(shopOrderInfo)) { + orderQueue.remove(0); + logger.info("[ {} ] 获取订单详情成功|[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.name, + shopOrderInfo.tid); + } else { + orderQueue.remove(0); + exceptionOrderQueue.add(shopOrderInfo); + logger.info("error:解析订单详情错误,将加入异常处理队列时间->{}", + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + logger.info("[ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.name, orderQueue.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + } + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 + * + * @param shopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoStr = ""; + GetMethod httpMethod = new GetMethod("http://api.open.dangdang.com/openapi/rest"); + try { + // API查询订单详细信息 + String signStr = shopOrderInfo.app_secret + "app_key" + shopOrderInfo.app_key + "format" + "xml" + "method" + + "dangdang.order.details.get" + "session" + shopOrderInfo.shopConfig.session_key + "sign_method" + + "md5" + "timestamp" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + + shopOrderInfo.app_secret;// 组成签名字符串 + MD5Util md5 = new MD5Util(); + String signStrMD5 = md5.MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + + shopOrderInfo.app_key + "&method=" + "dangdang.order.details.get" + "&format=" + "xml" + + "&session=" + shopOrderInfo.shopConfig.session_key + "&o=" + shopOrderInfo.tid; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + tradeInfoStr = resBuffer.toString(); + + String jsonStr = xmlToJson(tradeInfoStr); + logger.info("[ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.name, jsonStr); + // 检查订单查询结果是否正常 + JSONObject json = JSONObject.fromObject(jsonStr); + + // 处理错误信息 + if (json.has("errorCode")) { + logger.info("异常订单返回结果:{}", jsonStr); + String errorCode = json.getString("errorCode"); + logger.info("[ {} ] {}:{}" + shopOrderInfo.shopConfig.name, errorCode, json.getString("errorMessage")); + if ("177".equals(errorCode) || "178".equals(errorCode) || "179".equals(errorCode)) {// 非session_key问题直接重试 + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true; + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当当平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + + if (json.has("Error")) { + logger.info("[ {} ] 异常订单返回结果:{}", shopOrderInfo.shopConfig.name, json.get("Error")); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result_response = "当当平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("订单编号错误") > -1) { + result_response = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result_response, ""); + } + return false; + } + TradeInfo tradeInfo = parseTradeInfo(jsonStr, shopOrderInfo.shopConfig); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "当当平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("订单编号错误") > -1) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if (tradeInfo.pay_time.indexOf("http://www.w3.org/2001/XMLSchema-instance") > 0) { + logger.info("[ {} ] [ {} ]:付款时间为空,放弃处理", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + // if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + // && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + // || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + // OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + // } else { + if ("101".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + return false; + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + // } + } + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.name, tradeInfoStr); + return false; + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param jsonString jsonString + * @param shopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = JSONObject.fromObject(jsonString); + + JSONObject buyerInfo = json.getJSONObject("buyerInfo"); + JSONObject sendGoodsInfo = json.getJSONObject("sendGoodsInfo"); + JSONObject receiptInfo = json.getJSONObject("receiptInfo"); + + // 订单 + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.pay_percent = shopConfig.pay_percent; + + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = json.getString("orderID"); + tradeInfo.status = json.getString("orderState"); + tradeInfo.num = 0; + tradeInfo.discount_fee = Double.parseDouble(buyerInfo.getString("deductAmount")) + + Double.parseDouble(buyerInfo.getString("promoDeductAmount")) + + Double.parseDouble(buyerInfo.getString("activityDeductAmount")) + "";// 优惠金额=网银支付满额减优惠金额+订单级促销优惠金额+移动端优惠金额 + tradeInfo.pay_money = buyerInfo.getString("realPaidAmount"); + tradeInfo.money = buyerInfo.getString("realPaidAmount"); + tradeInfo.product_fee = "0"; + JSONArray OrderOperateList = json.getJSONArray("OrderOperateList"); + JSONObject OperateInfo = OrderOperateList.getJSONObject(0); + tradeInfo.created = OperateInfo.getString("operateTime"); + tradeInfo.pay_time = json.getString("paymentDate"); + tradeInfo.platform_modify_time = json.getString("lastModifyTime"); + tradeInfo.post_fee = buyerInfo.getString("postage"); + tradeInfo.buyer_nick = sendGoodsInfo.getString("dangdangAccountID"); + tradeInfo.receiver_name = sendGoodsInfo.getString("consigneeName"); + tradeInfo.receiver_country = sendGoodsInfo.getString("consigneeAddr_State"); + tradeInfo.receiver_state = sendGoodsInfo.has("consigneeAddr_Province") + ? sendGoodsInfo.getString("consigneeAddr_Province") + : ""; + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = sendGoodsInfo.has("consigneeAddr_City") + ? sendGoodsInfo.getString("consigneeAddr_City") + : ""; + tradeInfo.receiver_district = sendGoodsInfo.has("consigneeAddr_Area") + ? sendGoodsInfo.getString("consigneeAddr_Area") + : ""; + tradeInfo.receiver_address = sendGoodsInfo.has("consigneeAddr") ? sendGoodsInfo.getString("consigneeAddr") + : ""; + tradeInfo.receiver_mobile = sendGoodsInfo.has("consigneeMobileTel") + ? sendGoodsInfo.getString("consigneeMobileTel") + : ""; + tradeInfo.receiver_phone = sendGoodsInfo.has("consigneeTel") ? sendGoodsInfo.getString("consigneeTel") : ""; + tradeInfo.receiver_zip = sendGoodsInfo.has("consigneePostcode") + ? sendGoodsInfo.getString("consigneePostcode") + : ""; + tradeInfo.buyer_message = (json.getString("message").indexOf("xmlns:xsi") > 0) ? "" + : json.getString("message"); + tradeInfo.seller_memo = (json.getString("remark").indexOf("xmlns:xsi") > 0) ? "" : json.getString("remark"); + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = ((json.getInt("isPresale") == 0) ? "fixed" : "step"); + // 当当 + tradeInfo.platform_code = "005"; + + // 发票 + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + tradeInfo.tax_id = ""; + tradeInfo.invoice_title = (receiptInfo.getString("receiptName").equals("[]") + || receiptInfo.getString("receiptName").indexOf("xmlns:xsi") > 0) ? "" + : receiptInfo.getString("receiptName"); + tradeInfo.invoice_content = (receiptInfo.getString("receiptDetails").equals("[]") + || receiptInfo.getString("receiptDetails").indexOf("xmlns:xsi") > 0) ? "" + : receiptInfo.getString("receiptDetails"); + tradeInfo.invoice_money = (receiptInfo.getString("receiptMoney").equals("[]") + || receiptInfo.getString("receiptMoney").indexOf("xmlns:xsi") > 0) ? "" + : receiptInfo.getString("receiptMoney"); + + int receiptType = receiptInfo.getInt("receiptType"); + if (receiptType == 0) { + tradeInfo.invoice_type = 0; + tradeInfo.invoice_money = "0"; + } + if (receiptType == 1) { + tradeInfo.invoice_type = 6; + tradeInfo.tax_id = receiptInfo.has("taxpayerId") ? receiptInfo.getString("taxpayerId") : ""; + } + if (receiptType == 2) { + tradeInfo.invoice_type = 6; + tradeInfo.invoice_phone = receiptInfo.getString("receiptTel"); + tradeInfo.invoice_email = receiptInfo.getString("eReceiptAddress"); + tradeInfo.tax_id = receiptInfo.has("taxpayerId") ? receiptInfo.getString("taxpayerId") : ""; + } + if (receiptType == 100) { + tradeInfo.invoice_type = 7; + tradeInfo.tax_id = receiptInfo.has("taxpayerId") ? receiptInfo.getString("taxpayerId") : ""; + } + + // 商品 + JSONArray ItemsList = json.getJSONArray("ItemsList"); + tradeInfo.orders = new OrderInfo[ItemsList.size()]; + for (int i = 0; i < ItemsList.size(); i++) { + JSONObject item = ItemsList.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outerItemID") ? item.getString("outerItemID") : ""; + orderInfo.num = item.getInt("orderCount"); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getDouble("unitPrice") + ""; + orderInfo.total_fee = (Double.parseDouble(orderInfo.price) * orderInfo.num) + ""; + orderInfo.discount_fee = "0"; + orderInfo.payment = "" + + (Double.parseDouble(orderInfo.total_fee) - Double.parseDouble(orderInfo.discount_fee)); + tradeInfo.product_fee = "" + + (Double.parseDouble(tradeInfo.product_fee) + Double.parseDouble(orderInfo.payment));// 计算订单商品总金额 + orderInfo.title = item.getString("itemName"); + orderInfo.sku_properties_name = item.has("specialAttribute") ? item.getString("specialAttribute") : ""; + orderInfo.adjust_fee = "0"; + orderInfo.productItemID_dd = item.getString("productItemId"); + orderInfo.sku_id = item.getInt("itemID") + ""; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private class ExceptionQueueThread extends Thread { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始:|订单队列异常数:[ {} ]", exceptionOrderQueue.size()); + while (exceptionOrderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = exceptionOrderQueue.get(0); + orderQueue.add(shopOrderInfo); + exceptionOrderQueue.remove(0); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + } +} diff --git a/src/com/since/emp/service_bak/ApiGome_bak.java b/src/com/since/emp/service_bak/ApiGome_bak.java new file mode 100644 index 0000000..a23777b --- /dev/null +++ b/src/com/since/emp/service_bak/ApiGome_bak.java @@ -0,0 +1,741 @@ +package com.since.emp.service_bak; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +import cn.com.gome.cloud.openplatform.bridge.core.client.DefaultGmosClient; +import cn.com.gome.cloud.openplatform.bridge.core.client.GmosClient; +import gome.open.api.sdk.cloud.client.domain.bridge.client.request.GomeOrderOrderGetRequest; +import gome.open.api.sdk.cloud.client.domain.bridge.client.request.GomeOrderOrdersGetRequest; +import gome.open.api.sdk.cloud.client.domain.bridge.client.response.GomeOrderOrderGetResponse; +import gome.open.api.sdk.cloud.client.domain.bridge.client.response.GomeOrderOrdersGetResponse; + +/** + * ApiGome 国美api接口类 + * + * 国美新版API请求接口默认设置超时时长为3秒,未提供显示设置方法,不可更改 + * + * @author jue + * + */ +public class ApiGome_bak { + private static final Logger logger = LogManager.getLogger(ApiGome_bak.class); + private PlatConfig platConfig; + // private List shops; + private RecatchConfig recatchConfig; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiGome_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + threadPool = ThreadPool.getInstance(); + try { + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(0).key, + platConfig.apps.get(0).shops.get(0).name); + // 启动店铺独立订单列表获取线程 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + ordersByTime(platConfig.apps.get(0).shops.get(0)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + orderById(platConfig.apps.get(0).shops.get(0)); + } + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + // OrdersTimerTask ott = new OrdersTimerTask(cachedThreadPool); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 根据系统单号抓取订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void orderById(ShopConfig shopConfig) { + GetOrderById thread = new GetOrderById(shopConfig); + // thread.start(); + threadPool.execute(thread); + } + + /** + * 根据时间段抓取订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void ordersByTime(ShopConfig shopConfig) { + // 启动抓单线程 + GetOrderThread2 thread2 = new GetOrderThread2(shopConfig, recatchConfig.starTime, recatchConfig.endTime); + // thread2.start(); + threadPool.execute(thread2); + } + + /** + * 单次抓单线程(根据给定时间段) 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 根据指定时间获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + GmosClient client = new DefaultGmosClient(platConfig.api_url, platConfig.apps.get(0).key, + platConfig.apps.get(0).secret, shopConfig.session_key); + GomeOrderOrdersGetRequest request = new GomeOrderOrdersGetRequest(); + // 详细参数信息请参考API详情页面。 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + request.setStartDate(df.parse(this.time_start)); + request.setEndDate(df.parse(this.time_end)); + request.setStatus("PR");// 订单状态( + // PR:初始,PP:订单处理中,EX:已出库,DL:已妥投,CWS:客服取消-待商家确认,CWC:商家申请取消,DFC:发货失败取消 + // ,RCC:客服取消,RV:拒收,RT:拒收已退回库房) + /** + * 国美新api如果设置Fields,只要Fields包好的时间相关的参数,如orderTime,payTime则会报错 + */ + // request.setFields("orderId,orderNo,vendorId,subOrderType,payType,status,customerRemark,freightPrice,itemTotalPrice,orderTotalPrice,payment,orderTime,payTime,payStatus,endOrderTime,orderChangeTime,exTime,trackingNo,gomeFreight,addressShortName,packageNum,trackingCompany,warehouseId,warehouseName,blacklistId,blacklistType,reason,consignee,userId,orderDetails,partDiscountPrice,couponValue,paymentDiscount,idType,idNum,idName,salesModel,opinionDesc,headType,orderServiceType"); + request.setPageNo(page_now); + request.setPageSize(page_rows); + GomeOrderOrdersGetResponse response = client.execute(request); + String jsonString = response.getBody(); + logger.info("[ {} ] 根据给定时间返回订单:{}", shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrderList 解析国美返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = new JSONObject(jsonStr); + if (!json.has("gome_order_orders_get_response")) { + // 提交任务补抓单程序的结果 + if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + String code = error_response.getString("code"); + if ("8238".equals(code)) { + // 提交任务补抓单程序的结果 + String result = "店铺授权过期,请重新授权后重试"; + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + logger.info("店铺:" + shopConfig.name + "session_key过期,将不再抓单|" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + } + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "国美平台故障,请联系软维ERP排查", ""); + } + } + + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "国美平台故障,请联系软维ERP排查", ""); + } + } + JSONObject orders_get_response = json.getJSONObject("gome_order_orders_get_response"); + JSONObject result = orders_get_response.getJSONObject("result"); + int total_result = result.getInt("totalResult"); + + // 未查询到数据 + logger.info("[ {} ] 根据给定时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_result, + (total_result - page_rows * (this.page_now - 1))); + + if (total_result < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + if (total_result > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + // 将订单移至数据处理中心 + JSONArray orders = result.getJSONArray("orders"); + for (int i = 0; i < orders.length(); i++) { + JSONObject orderJson = orders.getJSONObject(i); + // long tid = orderJson.getLong("orderNo"); + // orderQueue.add(new ShopOrderInfo(tid,shopConfig)); + TradeInfo tradeInfo = parseTradeInfo(orderJson, shopConfig); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "国美平台故障,请联系软维ERP排查", ""); + } + logger.info("[ {} ] error:解析订单详情错误!时间->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("PR".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + } + + this.page_count = (int) Math.ceil((double) total_result / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + // if(this.page_now == this.page_count){ + // System.exit(0); + // } + } catch (JSONException e) { + logger.error(this, e); + // this.getOrder();//重新抓取 + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author jue + * + */ + private class OrdersTimerTask extends Thread { + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class GetOrderThread extends Thread { + private AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + GmosClient client = new DefaultGmosClient(platConfig.api_url, appConfig.key, appConfig.secret, + shopConfig.session_key); + GomeOrderOrdersGetRequest request = new GomeOrderOrdersGetRequest(); + // 详细参数信息请参考API详情页面。 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + request.setStartDate(df.parse(this.time_start)); + request.setEndDate(df.parse(this.time_end)); + request.setStatus("PR");// 订单状态( + // PR:初始,PP:订单处理中,EX:已出库,DL:已妥投,CWS:客服取消-待商家确认,CWC:商家申请取消,DFC:发货失败取消 + // ,RCC:客服取消,RV:拒收,RT:拒收已退回库房) + /** + * 国美新api如果设置Fields,只要Fields包好的时间相关的参数,如orderTime,payTime则会报错 + */ + // request.setFields("orderId,orderNo,vendorId,subOrderType,payType,status,customerRemark,freightPrice,itemTotalPrice,orderTotalPrice,payment,orderTime,payTime,payStatus,endOrderTime,orderChangeTime,exTime,trackingNo,gomeFreight,addressShortName,packageNum,trackingCompany,warehouseId,warehouseName,blacklistId,blacklistType,reason,consignee,userId,orderDetails,partDiscountPrice,couponValue,paymentDiscount,idType,idNum,idName,salesModel,opinionDesc,headType,orderServiceType"); + request.setPageNo(page_now); + request.setPageSize(page_rows); + GomeOrderOrdersGetResponse response = client.execute(request); + String jsonString = response.getBody(); + + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = new JSONObject(jsonStr); + if (json.has("gome_order_orders_get_response")) { + JSONObject orders_get_response = json.getJSONObject("gome_order_orders_get_response"); + JSONObject result = orders_get_response.getJSONObject("result"); + if (result.has("totalResult")) { + int total_result = result.getInt("totalResult"); + + // 未查询到数据 + logger.info("[ {} ] 本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_result, + (total_result - page_rows * (this.page_now - 1))); + if (total_result < 1) { + shopConfig.errFlag = false; + return; + } + + // 将订单移至数据处理中心 + JSONArray orders = result.getJSONArray("orders"); + // JSONArray order = orders.getJSONArray("order"); + for (int i = 0; i < orders.length(); i++) { + JSONObject orderJson = orders.getJSONObject(i); + String tid = orderJson.getString("orderId"); + TradeInfo tradeInfo = parseTradeInfo(orderJson, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid[ {} ],将加入异常处理队列时间->{}", tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("PR".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + } + + this.page_count = (int) Math.ceil((double) total_result / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } + } else {// 国美按时间查询订单没有时间跨度的限制 + + logger.info("异常订单返回结果:" + jsonStr); + shopConfig.errFlag = false; + if (jsonStr.indexOf("invalid_access_token") > -1) { + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + return; + } + + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 根据系统单号抓取单个订单线程 + * + * @author Lewis + * + */ + + class GetOrderById extends Thread { + private ShopConfig shopConfig; + + public GetOrderById(ShopConfig shopConfig) { + this.shopConfig = shopConfig; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 根据订单号抓取订单,订单号:[ {} ]", shopConfig.name, recatchConfig.orderId); + GmosClient client = new DefaultGmosClient(platConfig.api_url, platConfig.apps.get(0).key, + platConfig.apps.get(0).secret, shopConfig.session_key); + GomeOrderOrderGetRequest request = new GomeOrderOrderGetRequest(); + // 详细参数信息请参考API详情页面。 + request.setOrderId(recatchConfig.orderId); + /** + * 国美新api如果设置Fields,只要Fields包好的时间相关的参数,如orderTime,payTime则会报错 + */ + // request.setFields("mainItemId,count,point,price,itemId,itemType,itemName,itemDiscount,outId,size,color,partDiscountPrice,couponValue,salesProps"); + GomeOrderOrderGetResponse response = client.execute(request); + String jsonString = response.getBody(); + + logger.info("[ {} ] 根据订单号查找返回订单:{}", shopConfig.name, jsonString); + this.parseOrder(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrder 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + + private boolean parseOrder(String jsonStr) { + boolean res = false; + try { + JSONObject json = new JSONObject(jsonStr); + if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + String code = error_response.getString("code"); + String result = ""; + if ("8241".equals(code)) { + // 提交任务补抓单程序的结果 + result = "单号长度不符合国美平台,请确认后重试!"; + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + } else if ("8238".equals(code)) { + // 提交任务补抓单程序的结果 + result = "店铺授权过期,请重新授权后重试"; + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + } + return false; + } + JSONObject order_get_response = json.getJSONObject("gome_order_order_get_response"); + + // 将订单移至数据处理中心 + JSONObject result = order_get_response.getJSONObject("result"); + TradeInfo tradeInfo = parseTradeInfo(result, shopConfig); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result_response = "国美平台故障,请联系软维ERP排查"; + if (!result.has("orderId")) { + result_response = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result_response, ""); + } + + logger.info("[ {} ] error:解析订单详情错误!时间->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if ("PR".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return true; + } catch (JSONException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return res; + } + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param orderJson orderJson + * @param shopConfig shopConfig + */ + private TradeInfo parseTradeInfo(JSONObject orderJson, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = orderJson.getString("orderId"); + tradeInfo.status = orderJson.getString("status"); + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.num = 0; + tradeInfo.discount_fee = orderJson.getDouble("partDiscountPrice") + orderJson.getDouble("couponValue") + "";// 优惠金额=店铺优惠(满减或店铺优惠券)+国美优惠券金额 + tradeInfo.pay_money = orderJson.getDouble("payment") + ""; + tradeInfo.money = "" + (orderJson.getDouble("couponValue") + Double.valueOf(tradeInfo.pay_money)); + tradeInfo.product_fee = orderJson.getDouble("orderTotalPrice") + ""; + SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy K:m:s a", Locale.ENGLISH); + String orderTime = orderJson.getString("orderTime"); + Date order_time = sdf.parse(orderTime); + tradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(order_time); + String payTime = orderJson.getString("payTime"); + Date pay_time = sdf.parse(payTime); + tradeInfo.pay_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pay_time); + String orderChangeTime = orderJson.getString("orderChangeTime"); + Date platform_modify_time = sdf.parse(orderChangeTime); + tradeInfo.platform_modify_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(platform_modify_time); + tradeInfo.post_fee = orderJson.getDouble("freightPrice") + ""; + tradeInfo.buyer_nick = orderJson.getString("userId"); + + JSONObject consignee = orderJson.getJSONObject("consignee"); + tradeInfo.receiver_name = consignee.getString("name"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = consignee.has("province") ? consignee.getString("province") : ""; + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = consignee.has("city") ? consignee.getString("city") : ""; + tradeInfo.receiver_district = consignee.has("county") ? consignee.getString("county") : ""; + tradeInfo.receiver_address = consignee.getString("address"); + tradeInfo.receiver_mobile = consignee.has("mobilephone") ? consignee.getString("mobilephone") : ""; + tradeInfo.receiver_phone = consignee.has("telephone") ? consignee.getString("telephone") : ""; + tradeInfo.receiver_zip = consignee.has("post") ? consignee.getString("post") : ""; + tradeInfo.buyer_message = consignee.has("customerRemark") ? consignee.getString("customerRemark") : ""; + tradeInfo.seller_memo = consignee.has("opinionDesc") ? consignee.getString("opinionDesc") : ""; + tradeInfo.adjust_fee = "0"; + + tradeInfo.pay_mode_id = 5; + tradeInfo.type = ""; + + // 国美 + tradeInfo.platform_code = "006"; + + // 发票 + int invoice = consignee.has("invoice") ? consignee.getInt("invoice") : 0; + if (invoice > 0) { + tradeInfo.invoice_type = invoice + 5; + tradeInfo.invoice_title = consignee.getString("invoiceTitle") == null ? "" + : consignee.getString("invoiceTitle"); + tradeInfo.invoice_content = ""; + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + tradeInfo.tax_id = ""; + tradeInfo.invoice_money = tradeInfo.pay_money == null ? "" : tradeInfo.pay_money; + } else { + tradeInfo.invoice_type = 0; + } + + // 商品 + JSONArray orderDetails = orderJson.getJSONArray("orderDetails"); + tradeInfo.orders = new OrderInfo[orderDetails.length()]; + for (int i = 0; i < orderDetails.length(); i++) { + JSONObject item = orderDetails.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outId") ? item.getString("outId") : ""; + orderInfo.num = item.getInt("count"); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getDouble("price") + ""; + orderInfo.total_fee = (Double.parseDouble(orderInfo.price) * orderInfo.num) + ""; + orderInfo.discount_fee = item.getDouble("partDiscountPrice") + item.getDouble("couponValue") + ""; + orderInfo.payment = "" + + (Double.parseDouble(orderInfo.total_fee) - Double.parseDouble(orderInfo.discount_fee)); + orderInfo.title = item.getString("itemName"); + orderInfo.sku_id = item.getString("mainItemId"); + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + +} diff --git a/src/com/since/emp/service_bak/ApiJingdong_bak.java b/src/com/since/emp/service_bak/ApiJingdong_bak.java new file mode 100644 index 0000000..be280ed --- /dev/null +++ b/src/com/since/emp/service_bak/ApiJingdong_bak.java @@ -0,0 +1,1587 @@ +package com.since.emp.service_bak; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.jd.open.api.sdk.DefaultJdClient; +import com.jd.open.api.sdk.JdClient; +import com.jd.open.api.sdk.JdException; +import com.jd.open.api.sdk.request.refundapply.PopAfsSoaRefundapplyQueryByIdRequest; +import com.jd.open.api.sdk.request.refundapply.PopAfsSoaRefundapplyQueryPageListRequest; +import com.jd.open.api.sdk.request.ware.SkuReadFindSkuByIdRequest; +import com.jd.open.api.sdk.response.refundapply.PopAfsSoaRefundapplyQueryByIdResponse; +import com.jd.open.api.sdk.response.refundapply.PopAfsSoaRefundapplyQueryPageListResponse; +import com.jd.open.api.sdk.response.ware.SkuReadFindSkuByIdResponse; +import com.jd.security.tdeclient.SecretJdClient; +import com.jd.security.tdeclient.TDEClient; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.util.HttpRequest; + +/** + * + * 京东API请求接口默认设置连接超时时长为0,不超时,读超时时长为0秒,不超时,提供显示设置方法,抓单统一设置为30秒, 库存同步设置为5秒. + * + * ApiJingdong 京东api接口类 + * + * @author Lewis + * + */ +public class ApiJingdong_bak { + private static final Logger logger = LogManager.getLogger(ApiJingdong_bak.class); + private String logTitle = "ApiJingdong"; + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private List payServiceTypeDic; + + private Vector refundQueue; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + // private Vector exceptionOrderQueue; + /* + * public class ShopOrderInfo { String refundId; String tid; ShopConfig + * shopConfig; String app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig,String app_key, String + * app_secret) { this.tid = tid; this.shopConfig = shopConfig; this.app_key = + * app_key; this.app_secret = app_secret; } } + */ + + private class Dic { + String code; + String name; + + public Dic(String code, String name) { + this.code = code; + this.name = name; + } + } + + private void initDic() { + payServiceTypeDic = Collections.synchronizedList(new ArrayList()); + payServiceTypeDic.add(new Dic("1-货到付款", "14")); + payServiceTypeDic.add(new Dic("2-邮局汇款", "11")); + payServiceTypeDic.add(new Dic("3-自提", "14")); + payServiceTypeDic.add(new Dic("4-在线支付", "5")); + payServiceTypeDic.add(new Dic("5-公司转账", "14")); + payServiceTypeDic.add(new Dic("6-银行转账", "12")); + } + + public ApiJingdong_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + this.initDic(); + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + for (int i = 0; i < platConfig.apps.get(0).shops.size(); i++) { + GetOrderThread2 thread2 = new GetOrderThread2(platConfig.apps.get(0).shops.get(i), + recatchConfig.starTime, recatchConfig.endTime); + // thread2.start(); + threadPool.execute(thread2); + } + + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] | [ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + refundQueue = new Vector(); + GetRefundInfoThread grt = new GetRefundInfoThread(); + scheduledThreadPool.scheduleAtFixedRate(grt, 0, 500, TimeUnit.MILLISECONDS); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + String shopCode = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + shopCode = platConfig.apps.get(i).shops.get(j).code; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + shopCode = shopCode + "," + platConfig.apps.get(i).shops.get(j).code; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ] | [ {} ] ", platConfig.apps.get(i).key, shopCode, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + // UpdateTokenThread updateTokenThread = new UpdateTokenThread(); + // threadPool.execute(updateTokenThread); + dealUpdateToken(); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastQueryRefundTime, df.format(now)); + threadPool.execute(grt); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + // JdClient client = new DefaultJdClient(platConfig.api_url, + // shopConfig.session_key, appConfig.key, + // appConfig.secret); + // PopOrderSearchRequest request = new PopOrderSearchRequest(); + // request.setStartDate(time_start); + // request.setEndDate(time_end); + // request.setOrderState("WAIT_SELLER_STOCK_OUT,FINISHED_L");// + // 1:WAIT_SELLER_STOCK_OUT,2:SEND_TO_DISTRIBUTION_CENER,3:DISTRIBUTION_CENTER_RECEIVED,4:WAIT_GOODS_RECEIVE_CONFIRM,5:RECEIPTS_CONFIRM,6:WAIT_SELLER_DELIVERY,7:FINISHED_L,8:TRADE_CANCELED,9:LOCKED + // request.setOptionalFields( + // "venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + // request.setPage(String.valueOf(page_now)); + // request.setPageSize(String.valueOf(page_rows)); + // PopOrderSearchResponse response = client.execute(request); + // String jsonString = response.getMsg(); + String url = "http://" + platConfig.agent_api_ip + "/getorderlist.php"; + String order_status = "WAIT_SELLER_STOCK_OUT,FINISHED_L"; + String params = "app_key=" + appConfig.key + "&app_secret=" + appConfig.secret + "&session_key=" + + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + time_end + + "&order_state=" + order_status + + "&optional_fields=venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList&page=" + + String.valueOf(page_now) + "&page_size=" + String.valueOf(page_rows) + + "&sortType=0&dateType=0"; + params = params.replaceAll(" ", "%20"); + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendGet(url, params, logTitle); + + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_order_search_responce")) { + JSONObject order_search_response = json.getJSONObject("jingdong_pop_order_search_responce"); + if (order_search_response.has("searchorderinfo_result")) { + + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("异常订单返回结果:{}", jsonString); + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + shopConfig.errFlag = false; + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (jsonString + .indexOf("interval between beginDate and endDate is more than one month") > -1) { + logger.info("异常订单返回结果:{}", jsonString); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + shopConfig.errFlag = false; + } + + JSONObject order_search = order_search_response.getJSONObject("searchorderinfo_result"); + int totalCount = order_search.getInt("orderTotal"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.errFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray orderList = order_search.getJSONArray("orderInfoList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + String orderCode = order.getString("orderId"); + // orderQueue.add(new ShopOrderInfo(orderCode, + // shopConfig,appConfig.key,appConfig.secret)); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, + new ShopOrderInfo(orderCode, shopConfig, appConfig.key, appConfig.secret)); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid [ {} ],将加入异常处理队列" + "时间->{}", orderCode, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单:[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + continue; + } + // 等待出库 的订单 + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } + // else if ("FINISHED_L".equals(tradeInfo.status)) { + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + // } + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } else { + logger.info("异常订单返回结果:{}", jsonString); + // JSONObject errInfo = + // json.getJSONObject("error_response"); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (jsonString + .indexOf("interval between beginDate and endDate is more than one month") > -1) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.errFlag = false; + return; + } + + } else {// 处理错误信息 + logger.info("异常订单返回结果:{}", jsonString); + // JSONObject errInfo = + // json.getJSONObject("error_response"); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopConfig.code, shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (jsonString + .indexOf("interval between beginDate and endDate is more than one month") > -1) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 补抓单处理线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + // JdClient client = new DefaultJdClient(platConfig.api_url, + // shopConfig.session_key, + // platConfig.apps.get(0).key, platConfig.apps.get(0).secret); + // PopOrderSearchRequest request = new PopOrderSearchRequest(); + // request.setStartDate(time_start); + // request.setEndDate(time_end); + // request.setOrderState("WAIT_SELLER_STOCK_OUT,FINISHED_L");// + // 1:WAIT_SELLER_STOCK_OUT,2:SEND_TO_DISTRIBUTION_CENER,3:DISTRIBUTION_CENTER_RECEIVED,4:WAIT_GOODS_RECEIVE_CONFIRM,5:RECEIPTS_CONFIRM,6:WAIT_SELLER_DELIVERY,7:FINISHED_L,8:TRADE_CANCELED,9:LOCKED + // request.setOptionalFields( + // "venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + // request.setPage(String.valueOf(page_now)); + // request.setPageSize(String.valueOf(page_rows)); + // PopOrderSearchResponse response = client.execute(request); + // String jsonString = response.getMsg(); + + String url = "http://" + platConfig.agent_api_ip + "/getorderlist.php"; + String order_status = "WAIT_SELLER_STOCK_OUT,FINISHED_L"; + String params = "app_key=" + platConfig.apps.get(0).key + "&app_secret=" + platConfig.apps.get(0).secret + + "&session_key=" + shopConfig.session_key + "&start_date=" + time_start + "&end_date=" + + time_end + "&order_state=" + order_status + + "&optional_fields=venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList&page=" + + String.valueOf(page_now) + "&page_size=" + String.valueOf(page_rows) + + "&sortType=0&dateType=1"; + params = params.replaceAll(" ", "%20"); + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendGet(url, params, logTitle); + logger.info("[ {} ] | [ {} ] 根据订单生成时间抓取订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, + time_start, time_end, page_now); + logger.info(jsonString); + // jsonString = + // "{\"jingdong_pop_order_search_responce\":{\"code\":\"0\",\"searchorderinfo_result\":{\"orderInfoList\":[{\"venderId\":\"117396\",\"orderRemark\":\"\",\"logisticsId\":\"463\",\"orderSellerPrice\":\"218.00\",\"venderRemark\":\"12.5\\u5df2\\u5382\\u53d1\",\"orderState\":\"FINISHED_L\",\"orderType\":\"22\",\"consigneeInfo\":{\"provinceId\":\"7\",\"fullAddress\":\"\\u6cb3\\u5357\\u90d1\\u5dde\\u5e02\\u4e2d\\u539f\\u533a\\u6850\\u67cf\\u8def\\u8857\\u9053\\u897f\\u7ad9\\u8def23\\u53f7\\u9662-\\u897f\\u7ad9\\u8def23\\u53f7\",\"cityId\":\"412\",\"townId\":\"53657\",\"city\":\"\\u90d1\\u5dde\\u5e02\",\"county\":\"\\u4e2d\\u539f\\u533a\",\"province\":\"\\u6cb3\\u5357\",\"town\":\"\\u6850\\u67cf\\u8def\\u8857\\u9053\",\"telephone\":\"13333711977\",\"fullname\":\"\\u848b\\u4fdd\\u94f6\",\"countyId\":\"3548\",\"mobile\":\"13333711977\"},\"modified\":\"2019-12-10 + // 14:14:21\",\"orderPayment\":\"218.00\",\"itemInfoList\":[{\"productNo\":\"TCMK-500\",\"itemTotal\":\"1\",\"jdPrice\":\"582.00\",\"skuName\":\"\\u81b3\\u9b54\\u5e08\\uff08THERM0S\\uff09 + // \\u4fdd\\u6e29\\u676f\\u7537\\u5973\\u4e0d\\u9508\\u94a2\\u5546\\u52a1\\u529e\\u516c\\u5e26\\u6ee4\\u7f51\\u6ce1\\u8336\\u6c34\\u676f\\u5b50TCMK-500\\u56e2\\u8d2d\\u5b9a\\u5236 + // TCMK-500 + // \\u5496\\u5561\\u8272-500ml\",\"invoiceContentId\":\"\",\"itemExt\":\"{\\\"skuUuid\\\":\\\"10_32451464407_117396_1474085627_1_0\\\",\\\"isVMI\\\":0,\\\"newStoreId\\\":\\\"0\\\"}\",\"newStoreId\":\"0\",\"outerSkuId\":\"\",\"skuId\":\"1474085627\",\"giftPoint\":\"0\",\"wareId\":\"1245933898\"}],\"payType\":\"4-\\u5728\\u7ebf\\u652f\\u4ed8\",\"storeId\":\"0\",\"orderTotalPrice\":\"582.00\",\"invoiceEasyInfo\":{\"invoiceType\":\"0\",\"invoiceContentId\":\"1\",\"invoiceTitle\":\"\\u4e2a\\u4eba\"},\"paymentConfirmTime\":\"2019-12-04 + // 23:30:18\",\"orderExt\":\"{\\\"road\\\":\\\"25\\\",\\\"aerfaTime.idSopShipmentType\\\":\\\"67\\\"}\",\"returnOrder\":\"0\",\"storeOrder\":\"\",\"invoiceInfo\":\"\\u4e0d\\u9700\\u8981\\u5f00\\u5177\\u53d1\\u7968\",\"orderStartTime\":\"2019-12-04 + // 23:30:06\",\"orderId\":\"106950262242\",\"waybill\":\"YT3109788402075\",\"orderSource\":\"\\u79fb\\u52a8\\u7aef\\u8ba2\\u5355\",\"couponDetailList\":[{\"couponType\":\"30-\\u5355\\u54c1\\u4fc3\\u9500\\u4f18\\u60e0\",\"skuId\":\"1474085627\",\"couponPrice\":\"364.00\",\"orderId\":\"106950262242\"}],\"pin\":\"jiangbaoyin\",\"freightPrice\":\"0.00\",\"sellerDiscount\":\"364.00\"},{\"venderId\":\"117396\",\"orderRemark\":\"\",\"logisticsId\":\"\",\"orderSellerPrice\":\"369.00\",\"venderRemark\":\"\",\"orderState\":\"WAIT_SELLER_STOCK_OUT\",\"orderType\":\"22\",\"consigneeInfo\":{\"provinceId\":\"12\",\"fullAddress\":\"\\u6c5f\\u82cf\\u76d0\\u57ce\\u5e02\\u76d0\\u90fd\\u533a\\u4e49\\u4e30\\u9547\\u4e49\\u4e30\\u5317\\u8857\",\"cityId\":\"939\",\"townId\":\"23809\",\"city\":\"\\u76d0\\u57ce\\u5e02\",\"county\":\"\\u76d0\\u90fd\\u533a\",\"province\":\"\\u6c5f\\u82cf\",\"town\":\"\\u4e49\\u4e30\\u9547\",\"telephone\":\"18361063099\",\"fullname\":\"\\u8042\\u5fb7\\u4f59\",\"countyId\":\"23683\",\"mobile\":\"18361063099\"},\"modified\":\"2019-12-10 + // 14:22:33\",\"orderPayment\":\"369.00\",\"itemInfoList\":[{\"productNo\":\"EHA-1313A-S\",\"itemTotal\":\"1\",\"jdPrice\":\"699.00\",\"skuName\":\"\\u81b3\\u9b54\\u5e08\\uff08THERM0S\\uff09\\u7535\\u70ed\\u6c34\\u58f6\\u70e7\\u6c34\\u7535\\u56681.7L\\u98df\\u54c1\\u7ea7304\\u4e0d\\u9508\\u94a2\\u8336\\u58f6\\u81ea\\u52a8\\u65ad\\u7535 + // EHA-1313A + // \\u53e4\\u94dc\\u8272\",\"invoiceContentId\":\"\",\"itemExt\":\"{\\\"skuUuid\\\":\\\"10_32248500770_117396_12571304674_1_0\\\",\\\"isVMI\\\":0,\\\"newStoreId\\\":\\\"0\\\"}\",\"newStoreId\":\"0\",\"outerSkuId\":\"\",\"skuId\":\"12571304674\",\"giftPoint\":\"0\",\"wareId\":\"10382174890\"}],\"payType\":\"1-\\u8d27\\u5230\\u4ed8\\u6b3e\",\"storeId\":\"0\",\"orderTotalPrice\":\"699.00\",\"invoiceEasyInfo\":{\"invoiceType\":\"1\",\"invoiceContentId\":\"1\",\"invoiceTitle\":\"\\u4e2a\\u4eba\"},\"orderExt\":\"{\\\"road\\\":\\\"7\\\",\\\"aerfaTime.idSopShipmentType\\\":\\\"67\\\"}\",\"returnOrder\":\"0\",\"storeOrder\":\"\",\"invoiceInfo\":\"\\u53d1\\u7968\\u7c7b\\u578b:\\u666e\\u901a\\u53d1\\u7968;\\u53d1\\u7968\\u62ac\\u5934:\\u4e2a\\u4eba;\\u53d1\\u7968\\u5185\\u5bb9:\\u660e\\u7ec6\",\"orderStartTime\":\"2019-12-10 + // 14:22:30\",\"orderId\":\"107354737068\",\"waybill\":\"\",\"orderSource\":\"\\u5386\\u53f2\\u8ba2\\u5355\\u6682\\u65e0\\u6765\\u6e90\",\"couponDetailList\":[{\"couponType\":\"30-\\u5355\\u54c1\\u4fc3\\u9500\\u4f18\\u60e0\",\"skuId\":\"12571304674\",\"couponPrice\":\"330.00\",\"orderId\":\"107354737068\"}],\"pin\":\"jd_4f9915c2e1727\",\"freightPrice\":\"0.00\",\"sellerDiscount\":\"330.00\"}],\"orderTotal\":2,\"apiResult\":{\"englishErrCode\":\"success\",\"success\":true,\"chineseErrCode\":\"\\u6210\\u529f\",\"numberCode\":10100000}}}}"; + // logger.info("["+logTitle+"] ["+shopConfig.name+"] 返回订单:"+jsonString); + parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析京东返回的订单列表数据 补抓订单 + * + * @param jsonStr + */ + private void parseOrderList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_order_search_responce")) { + JSONObject order_search_response = json.getJSONObject("jingdong_pop_order_search_responce"); + JSONObject order_search = order_search_response.getJSONObject("searchorderinfo_result"); + int totalCount = order_search.getInt("orderTotal"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray orderList = order_search.getJSONArray("orderInfoList"); + for (int i = 0; i < orderList.length(); i++) { + JSONObject order = orderList.getJSONObject(i); + String orderCode = order.getString("orderId"); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseTradeInfo(tradeInfoStr, new ShopOrderInfo(orderCode, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret)); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + + logger.info("[ {} ] | [ {} ] error:订单[ {} ]解析订单详情错误!时间->{}", shopConfig.code, + shopConfig.name, orderCode, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopConfig.code, shopConfig.name, + tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", + ""); + } + continue; + } + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单 [ {} ] 处理失败!", orderCode); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + // else { + // logger.info("[" + logTitle + + // "] 未处理的订单类型!"); + // } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end; + } + + } else {// 处理错误信息 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + if (jsonString.indexOf("Invalid access_token") > -1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } else { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + // this.parseOrderList(jsonString); + } + } catch (JSONException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + public static String asciiToString(String value) { + StringBuffer sbu = new StringBuffer(); + String[] chars = value.split(","); + for (int i = 0; i < chars.length; i++) { + sbu.append((char) Integer.parseInt(chars[i])); + } + return sbu.toString(); + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 补抓订单 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + // API查询订单详细信息 + /* + * 2018-10-23生产改为用京东上部署的php接口 + */ + // JdClient client = new DefaultJdClient(platConfig.api_url, + // shopOrderInfo.shopConfig.session_key, + // shopOrderInfo.app_key, shopOrderInfo.app_secret); + // PopOrderGetRequest request = new PopOrderGetRequest(); + // request.setOptionalFields( + // "venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + // request.setOrderId(Long.valueOf(shopOrderInfo.tid)); + // PopOrderGetResponse response = client.execute(request); + // tradeInfoString = response.getMsg(); + // logger + // .info("[" + shopOrderInfo.shopConfig.name + "] API返回订单数据:" + + // tradeInfoString); + + // if (recatchConfig.type == 1) { + String param = "app_key=" + shopOrderInfo.app_key + "&app_secret=" + shopOrderInfo.app_secret + + "&session_key=" + shopOrderInfo.shopConfig.session_key + "&tid=" + shopOrderInfo.tid; + HttpRequest httpRequest = new HttpRequest(); + tradeInfoString = httpRequest.sendGet("http://" + platConfig.agent_api_ip + "/rwjd.php", param, logTitle); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + // } + // String param = + // "app_key="+shopOrderInfo.app_key+"&app_secret="+shopOrderInfo.app_secret+"&session_key="+shopOrderInfo.shopConfig.session_key+"&tid="+shopOrderInfo.tid; + // tradeInfoString = + // OrderSyncs.dataParse.sendGet("http://43.226.165.175/rwjd.php", + // param); + // logger.info("[" + + // shopOrderInfo.shopConfig.name + "] API返回订单数据:" + tradeInfoString); + + JSONObject json = new JSONObject(tradeInfoString); + // api接口错误处理 + if (json.has("error_response")) { + if (tradeInfoString.indexOf("Invalid access_token") > -1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shopConfig.code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return true;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + } + return false; + } + + JSONObject order_get_response = json.getJSONObject("jingdong_pop_order_get_responce"); + JSONObject order = order_get_response.getJSONObject("orderDetailInfo"); + if (!order.has("orderInfo")) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "无此订单号,请核对后重新提交!", ""); + } + return false; + } + JSONObject orderInfo = order.getJSONObject("orderInfo"); + + TradeInfo tradeInfo = parseTradeInfo(orderInfo.toString(), shopOrderInfo); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "京东平台故障,请联系软维ERP排查", ""); + } + + logger.info("[ {} ] | [ {} ] error:订单[ {} ]解析订单详情错误!时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] | [ {} ] 订单[ {} ],为到付订单,不做处理!", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, tradeInfo.tid); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", ""); + } + return false; + } + + // if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + // && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + // || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + // TODO 用完改为 WAIT_SELLER_STOCK_OUT + if ("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("FINISHED_L".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单[ {} ]处理失败!", shopOrderInfo.tid); + // System.exit(0); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + // }else{ + // logger.info("未处理的订单类型!"); + // } + // } + // }else{ + // if("WAIT_SELLER_STOCK_OUT".equals(tradeInfo.status)){ + // OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// + // 发送tradeInfo至订单数据处理队列 + // }else if("FINISHED_L".equals(tradeInfo.status)){ + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + // } + // } + + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] | [ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name, + tradeInfoString); + return false; + } + + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = new JSONObject(jsonString); + // JSONObject orderList = json.getJSONObject("order_get_response"); + // JSONObject order = orderList.getJSONObject("order"); + // JSONObject orderDetail = order.getJSONObject("orderInfo"); + JSONObject orderDetail = json; + JSONObject userInfo = orderDetail.getJSONObject("consigneeInfo"); + JSONArray orderItemList = orderDetail.getJSONArray("itemInfoList"); + // JSONArray coupon_detail = + // orderDetail.getJSONArray("couponDetailList"); + + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopOrderInfo.shopConfig.company_code; + tradeInfo.shop_code = shopOrderInfo.shopConfig.code; + tradeInfo.delivery_mode_id = shopOrderInfo.shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopOrderInfo.shopConfig.storage_code; + tradeInfo.company_type = shopOrderInfo.shopConfig.company_type; + tradeInfo.pay_percent = shopOrderInfo.shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = orderDetail.getString("orderId"); + tradeInfo.status = orderDetail.getString("orderState"); + tradeInfo.num = 0; + tradeInfo.discount_fee = orderDetail.getString("sellerDiscount"); + tradeInfo.money = orderDetail.getString("orderSellerPrice"); + tradeInfo.pay_money = orderDetail.getString("orderPayment"); + tradeInfo.product_fee = orderDetail.getString("orderTotalPrice"); + tradeInfo.created = orderDetail.getString("orderStartTime"); + // tradeInfo.pay_time = orderDetail.getString("paymentConfirmTime"); + tradeInfo.pay_time = orderDetail.has("paymentConfirmTime") ? orderDetail.getString("paymentConfirmTime") + : "到付订单"; + tradeInfo.platform_modify_time = orderDetail.getString("modified"); + tradeInfo.post_fee = orderDetail.getString("freightPrice"); + tradeInfo.buyer_nick = orderDetail.getString("pin"); + // tradeInfo.alipay_id = orderDetail.getString("pin"); + String fullname = userInfo.getString("fullname"); + TDEClient tdeClient = null; + try { + tdeClient = SecretJdClient.getInstance(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret); + } catch (Exception e) { + logger.error(this, e); + } + + if (TDEClient.isEncryptData(fullname)) { + tradeInfo.receiver_name = new String(tdeClient.decrypt(fullname), "UTF-8"); + tradeInfo.encrpy_name = fullname; + } else { + tradeInfo.receiver_name = fullname; + tradeInfo.encrpy_name = ""; + } + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = userInfo.has("province") ? userInfo.getString("province") : ""; + + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + String city = userInfo.has("province") ? userInfo.getString("province") : ""; + tradeInfo.receiver_city = city + "市"; + tradeInfo.receiver_district = userInfo.has("city") ? userInfo.getString("city") : ""; + } else { + tradeInfo.receiver_city = userInfo.has("city") ? userInfo.getString("city") : ""; + tradeInfo.receiver_district = userInfo.has("county") ? userInfo.getString("county") : ""; + } + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + String fullAddress = userInfo.getString("fullAddress"); + if (TDEClient.isEncryptData(fullAddress)) { + tradeInfo.receiver_address = new String(tdeClient.decrypt(fullAddress), "UTF-8"); + tradeInfo.encrpy_address = fullAddress; + } else { + tradeInfo.receiver_address = fullAddress; + tradeInfo.encrpy_address = ""; + } + // tradeInfo.receiver_address = userInfo.getString("fullAddress"); + String mobile = userInfo.has("mobile") ? userInfo.getString("mobile") : ""; + if (TDEClient.isEncryptData(mobile)) { + tradeInfo.receiver_mobile = new String(tdeClient.decrypt(mobile), "UTF-8"); + tradeInfo.encrpy_mobile = mobile; + } else { + tradeInfo.receiver_mobile = mobile; + tradeInfo.encrpy_mobile = ""; + } + // tradeInfo.receiver_mobile = userInfo.has("mobile") ? + // userInfo.getString("mobile") : ""; + String telephone = userInfo.has("telephone") ? userInfo.getString("telephone") : ""; + if (TDEClient.isEncryptData(telephone)) { + tradeInfo.receiver_phone = new String(tdeClient.decrypt(telephone), "UTF-8"); + tradeInfo.encrpy_telephone = telephone; + } else { + tradeInfo.receiver_phone = telephone; + tradeInfo.encrpy_telephone = ""; + } + tradeInfo.buyer_message = orderDetail.has("orderRemark") ? orderDetail.getString("orderRemark") : ""; + tradeInfo.seller_memo = orderDetail.has("venderRemark") ? orderDetail.getString("venderRemark") : ""; + tradeInfo.adjust_fee = "0"; + + String payServiceType = orderDetail.has("payType") ? orderDetail.getString("payType") : "-1"; + String dicname = getDicName(payServiceTypeDic, payServiceType); + tradeInfo.pay_mode_id = dicname.equals("") ? 14 : Integer.parseInt(dicname); + tradeInfo.type = ""; + + // 京东 + tradeInfo.platform_code = "003"; + + // 发票 + // tradeInfo.invoice_type = + // orderDetail.getString("invoiceInfo").indexOf("不需要开具发票") >-1 ? 0 : + // 1; + JSONObject invoiceEasyInfo = orderDetail.getJSONObject("invoiceEasyInfo"); + int invoice_type = Integer.valueOf(invoiceEasyInfo.getString("invoiceType")); + + /** + * 京东平台规定:发票类型,0=不开发票、1=普通发票、2=增值税发票、3=电子发票 + */ + tradeInfo.invoice_content = ""; + String invoice_info = orderDetail.getString("invoiceInfo"); + String[] invoiceInfo = invoice_info.split(";"); + tradeInfo.invoice_phone = ""; + tradeInfo.invoice_email = ""; + tradeInfo.address_telephone = ""; + tradeInfo.bank_of_deposit_account_number = ""; + if (invoiceInfo.length == 3) { + tradeInfo.invoice_content = invoiceInfo[2].split(":")[1]; + } + JSONObject vatInfo = orderDetail.has("vatInfo") ? orderDetail.getJSONObject("vatInfo") : null; + String invoice_title = ""; + if (null != vatInfo) { + invoice_title = vatInfo.has("invoicePersonalName") ? vatInfo.getString("invoicePersonalName") : ""; + } + if (invoice_type == 3) { + tradeInfo.invoice_type = 6; + String invoice_phone = invoiceEasyInfo.has("invoiceConsigneePhone") + ? invoiceEasyInfo.getString("invoiceConsigneePhone") + : ""; + if (TDEClient.isEncryptData(invoice_phone)) { + tradeInfo.invoice_phone = new String(tdeClient.decrypt(invoice_phone), "UTF-8"); + tradeInfo.encrypt_invoice_phone = invoice_phone; + } else { + tradeInfo.invoice_phone = invoice_phone; + tradeInfo.encrypt_invoice_phone = ""; + } + String invoice_email = invoiceEasyInfo.has("invoiceConsigneeEmail") + ? invoiceEasyInfo.getString("invoiceConsigneeEmail") + : ""; + if (TDEClient.isEncryptData(invoice_email)) { + tradeInfo.invoice_email = new String(tdeClient.decrypt(invoice_email), "UTF-8"); + tradeInfo.encrypt_invoice_email = invoice_email; + } else { + tradeInfo.invoice_email = invoice_email; + tradeInfo.encrypt_invoice_email = ""; + } + invoice_title = "".equals(invoice_title) ? invoiceEasyInfo.getString("invoiceTitle") : invoice_title; + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + + if (!"个人".equals(tradeInfo.invoice_title)) { + tradeInfo.tax_id = invoiceEasyInfo.has("invoiceCode") ? invoiceEasyInfo.getString("invoiceCode") + : ""; + } + } + if (invoice_type == 2) { + tradeInfo.invoice_type = 7;// erp系统3对应增票 + + String invoice_address = vatInfo.getString("addressRegIstered"); + String invoice_phone = vatInfo.getString("phoneRegIstered"); + String invoice_bank = vatInfo.getString("depositBank"); + tradeInfo.bank_of_deposit = invoice_bank; + String invoice_account = vatInfo.getString("bankAccount"); + if (TDEClient.isEncryptData(invoice_account)) { + tradeInfo.encrypt_bank_account = invoice_account; + invoice_account = new String(tdeClient.decrypt(invoice_account), "UTF-8"); + } else { + tradeInfo.encrypt_bank_account = ""; + } + + tradeInfo.address_telephone = invoice_address + " " + invoice_phone; + tradeInfo.bank_of_deposit_account_number = invoice_bank + " " + invoice_account; + tradeInfo.tax_id = vatInfo.getString("vatNo"); + invoice_title = invoiceEasyInfo.getString("invoiceTitle"); + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + } + if (invoice_type == 1) { + tradeInfo.invoice_type = 6;// erp系统2对应新版普票 + invoice_title = "".equals(invoice_title) ? invoiceEasyInfo.getString("invoiceTitle") : invoice_title; + tradeInfo = decryptInvoiceTitle(tdeClient, tradeInfo, invoice_title); + if (!"个人".equals(tradeInfo.invoice_title)) { + tradeInfo.tax_id = invoiceEasyInfo.has("invoiceCode") ? invoiceEasyInfo.getString("invoiceCode") + : ""; + } + } + + tradeInfo.invoice_money = tradeInfo.pay_money; + + // 商品 + tradeInfo.orders = new OrderInfo[orderItemList.length()]; + for (int i = 0; i < orderItemList.length(); i++) { + JSONObject item = orderItemList.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outerSkuId") ? item.getString("outerSkuId") : ""; + String sku_id = item.getString("skuId"); + + // c3b758c08fb24151aab9a6b0ce92369eninz + if (orderInfo.platform_seller_code == null || "".equals(orderInfo.platform_seller_code)) { + JdClient client = new DefaultJdClient(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret, 5000, 5000); + SkuReadFindSkuByIdRequest request = new SkuReadFindSkuByIdRequest(); + request.setSkuId(Long.valueOf(sku_id)); + + request.setField("outer_id"); + SkuReadFindSkuByIdResponse response = client.execute(request); + String skuString = response.getMsg(); + JSONObject jsonStr = new JSONObject(skuString); + logger.info("[ {} ] | [ {} ] 通过订单详单查询订单外部编码响应信息:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, skuString); + // api接口错误处理 + if (jsonStr.has("error_response")) { + return null; + } + logger.info("[ {} ] | [ {} ] 通过订单详单查询到的订单外部编码为空,通过商品API查询编码返回:{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, jsonStr); + JSONObject skuList = jsonStr.getJSONObject("jingdong_sku_read_findSkuById_responce"); + JSONObject sku = skuList.getJSONObject("sku"); + orderInfo.platform_seller_code = sku.getString("outerId"); + } + orderInfo.num = Integer.valueOf(item.getString("itemTotal")); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getString("jdPrice"); + orderInfo.total_fee = Double.valueOf(orderInfo.price) * orderInfo.num + ""; + orderInfo.discount_fee = "" + 0; + orderInfo.payment = String.valueOf(orderInfo.num * Double.valueOf(orderInfo.price)); + orderInfo.title = item.getString("skuName"); + orderInfo.sku_id = sku_id; + orderInfo.productItemID_dd = ""; + orderInfo.adjust_fee = "0"; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + public TradeInfo decryptInvoiceTitle(TDEClient tdeClient, TradeInfo tradeInfo, String invoice_title) + throws Exception { + if (TDEClient.isEncryptData(invoice_title)) { + tradeInfo.invoice_title = new String(tdeClient.decrypt(invoice_title), "UTF-8"); + tradeInfo.encrypt_invoice_title = invoice_title; + } else { + tradeInfo.invoice_title = invoice_title; + tradeInfo.encrypt_invoice_title = ""; + } + return tradeInfo; + } + + private String getDicName(List dics, String code) { + for (int i = 0; i < dics.size(); i++) { + Dic dic = dics.get(i); + if (code.equals(dic.code)) { + return dic.name; + } + } + return ""; + } + + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数1-50 + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + try { + logger.info("[ {} ] | [ {} ] 获取退款订单:{}->{},第[ {} ]页", shopConfig.code, shopConfig.name, time_start, + time_end, page_now); + JdClient client = new DefaultJdClient(platConfig.api_url, shopConfig.session_key, appConfig.key, + appConfig.secret, 30 * 1000, 30 * 1000);// connectTimeout=30秒,readTimeout=30秒 + PopAfsSoaRefundapplyQueryPageListRequest request = new PopAfsSoaRefundapplyQueryPageListRequest(); + request.setApplyTimeStart(time_start); + request.setApplyTimeEnd(time_end); + request.setPageIndex(page_now); + request.setPageSize(page_rows); + PopAfsSoaRefundapplyQueryPageListResponse response = client.execute(request); + + String jsonString = response.getMsg(); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (JdException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_afs_soa_refundapply_queryPageList_responce")) { + JSONObject jingdong_pop_afs_soa_refundapply_queryPageList_responce = json + .getJSONObject("jingdong_pop_afs_soa_refundapply_queryPageList_responce"); + JSONObject queryResult = jingdong_pop_afs_soa_refundapply_queryPageList_responce + .getJSONObject("queryResult"); + int totalCount = queryResult.getInt("totalCount"); + logger.info("[ {} ] | [ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.code, shopConfig.name, + totalCount, (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.refundErrFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray result = queryResult.getJSONArray("result"); + for (int i = 0; i < result.length(); i++) { + JSONObject refundOrder = result.getJSONObject(i); + String refundId = refundOrder.getLong("id") + ""; + refundQueue.add(new ShopOrderInfo(refundId, shopConfig, appConfig.key, appConfig.secret)); + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } else {// 处理错误信息 + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[ {} ] | [ {} ] 返回订单:{}", shopConfig.code, shopConfig.name, errInfo); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单", shopConfig.code, shopConfig.name); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (jsonString + .indexOf("interval between beginDate and endDate is more than one month") > -1) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + shopConfig.errFlag = false; + return; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * GetOrderInfoThread 获取订单详情线程 + * + * @author Carl + * + */ + private class GetRefundInfoThread extends Thread { + @Override + public void run() { + // while (true) { + try { + if (refundQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = (ShopOrderInfo) refundQueue.get(0); + logger.info("[" + shopOrderInfo.shopConfig.name + "] 获取退款订单详情|" + shopOrderInfo.tid); + if (getRefundInfo(shopOrderInfo)) {// 如果队列中订单有问题,订单已查询到,可以排除系统级错误,不断重试,并不会影响其他线程 + logger.info("[ {} ] | [ {} ] 获取退款订单详情成功[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + logger.info("[ {} ] | [ {} ] 获取退款订单处理失败[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } + refundQueue.remove(0); + logger.info("[ {} ] | [ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, refundQueue.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + } + } + + private boolean getRefundInfo(ShopOrderInfo shopOrderInfo) { + + try { + + JdClient client = new DefaultJdClient(platConfig.api_url, shopOrderInfo.shopConfig.session_key, + shopOrderInfo.app_key, shopOrderInfo.app_secret, 30 * 1000, 30 * 1000);// connectTimeout=30秒,readTimeout=30秒 + PopAfsSoaRefundapplyQueryByIdRequest request = new PopAfsSoaRefundapplyQueryByIdRequest(); + request.setId(Long.valueOf(shopOrderInfo.tid)); + PopAfsSoaRefundapplyQueryByIdResponse response = client.execute(request); + String jsonString = response.getMsg(); + + JSONObject json = new JSONObject(jsonString); + if (json.has("jingdong_pop_afs_soa_refundapply_queryById_responce")) { + List refundlist = parseRefundInfo(jsonString, shopOrderInfo.shopConfig); + if (refundlist == null) { + logger.info("[ {} ] | [ {} ] error:订单[ {} ]解析订单详情错误!时间->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + for (int i = 0; i < refundlist.size(); i++) { + RefundInfo refundInfo = refundlist.get(i); + // if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { + // return false; + // } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + return false; + } + } + return true; + } else { + // 处理错误信息 + JSONObject errInfo = json.getJSONObject("error_response"); + logger.info("[" + shopOrderInfo.shopConfig.name + "] 返回退款订单:" + errInfo); + if (jsonString.indexOf("Invalid access_token") > -1) { + logger.info("店铺:[ {} ] | [ {} ] session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.code, + shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + } + return false; + + } + } catch (Exception e) { + logger.error(this, e); + return false; + } + } + + private List parseRefundInfo(String jsonString, ShopConfig shopConfig) { + List refundList = Collections.synchronizedList(new ArrayList()); + try { + RefundInfo refundInfo = new RefundInfo(); + JSONObject json = new JSONObject(jsonString); + JSONObject jingdong_pop_afs_soa_refundapply_queryById_responce = json + .getJSONObject("jingdong_pop_afs_soa_refundapply_queryById_responce"); + JSONObject queryResult = jingdong_pop_afs_soa_refundapply_queryById_responce.getJSONObject("queryResult"); + JSONArray results = queryResult.getJSONArray("result"); + for (int i = 0; i < results.length(); i++) { + JSONObject result = results.getJSONObject(i); + refundInfo.tid = result.getString("orderId"); + refundInfo.refund_id = result.getLong("id") + ""; + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.platform_code = shopConfig.platformCode; + try { + refundInfo.desc = result.has("checkRemark") ? result.getString("checkRemark") : ""; + } catch (JSONException e) { + logger.error(this, e); + refundInfo.desc = ""; + } catch (Exception e) { + logger.error(this, e); + refundInfo.desc = ""; + } + refundInfo.reason = "其它"; + refundList.add(refundInfo); + } + + } catch (Exception e) { + logger.error(this, e); + } + return refundList; + } + + /** + * + * @ClassName:UpdateTokenThread + * @Author:Luke + * @Date:2018年11月23日 下午3:21:45 + */ + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 2 * 60 * 60 * 1000) && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于两个个小时的话更新 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String client_id = um.app_key; + String client_secret = um.app_secret; + String refresh_token = um.refresh_token; + String url = "https://oauth.jd.com/oauth/token"; + String params = "client_id=" + client_id + "&client_secret=" + client_secret + + "&grant_type=refresh_token&refresh_token=" + refresh_token; + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, params, 3, logTitle); + JSONObject json = new JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新码到期,放弃刷新", shop_code, shop_name); + } + } else { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_code, shop_name, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] | [ {} ] 刷新令牌失败", shop_code, shop_name); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌获取成功,写入数据库失败!", shop_code, shop_name); + } else { + logger.info("店铺:[ {} ] | [ {} ] ,刷新令牌成功,已写入数据库!", shop_code, shop_name); + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/service_bak/ApiPinduoduo_bak.java b/src/com/since/emp/service_bak/ApiPinduoduo_bak.java new file mode 100644 index 0000000..bed7515 --- /dev/null +++ b/src/com/since/emp/service_bak/ApiPinduoduo_bak.java @@ -0,0 +1,1321 @@ +package com.since.emp.service_bak; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONException; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +public class ApiPinduoduo_bak { + private static final Logger logger = LogManager.getLogger(ApiPinduoduo_bak.class); + private PlatConfig platConfig;// 平台参数类 + private RecatchConfig recatchConfig;// 平台补抓单参数类 + + private Vector orderQueue;// 订单信息队列 + private Vector exceptionOrderQueue;// 异常订单信息队列 + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /* + * public class ShopOrderInfo { String tid; ShopConfig shopConfig; String + * app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, + * String app_secret) { this.tid = tid; this.shopConfig = shopConfig; + * this.app_key = app_key; this.app_secret = app_secret; } } + */ + public ApiPinduoduo_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + + // 启动订单详情获取队列 + orderQueue = new Vector(); + exceptionOrderQueue = new Vector(); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + GetOrderInfoThread getOrderInfoThread = new GetOrderInfoThread();// 获取订单信息线程 + // getOrderInfoThread.setDaemon(true); + // getOrderInfoThread.start();// 启动获取订单信息线程 + scheduledThreadPool.scheduleAtFixedRate(getOrderInfoThread, 0, 500, TimeUnit.MILLISECONDS); + + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + ordersByTime1(platConfig.apps.get(0).shops.get(0)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] 根据订单号抓取订单,API返回订单数据:[ {} ]", shopOrderInfo.shopConfig.name, + recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + + } + // logger.info("["+logTitle+"]app:"+app_key+"启动,抓取店铺:"+shops.get(0).name); + + } else { + + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + // OrdersTimerTask ott = new OrdersTimerTask(cachedThreadPool); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 抓取所有为发货的订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void ordersByTime1(ShopConfig shopConfig) { + // 启动抓单线程 + GetOrderThread1 thread1 = new GetOrderThread1(shopConfig, recatchConfig.starTime, recatchConfig.endTime); + // thread1.start(); + threadPool.execute(thread1); + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author jue + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 异常订单处理队列 + ExceptionQueueThread eqt = new ExceptionQueueThread(); + threadPool.execute(eqt); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + // UpdateTokenThread utt = new UpdateTokenThread(); + // threadPool.execute(utt); + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + + /* + * 抓单处理线程 + */ + if (shopConfig.lastCatchTime == null) { + int order_loop = (int) Math.ceil((double) shopConfig.init_time / 30);// 初始抓单回退时间 + for (int k = 0; k < order_loop; k++) { + String start_time = df.format(new Date(now.getTime() - (order_loop - k) * 30 * 60000));// 开始时间 + String end_time = df + .format(new Date(now.getTime() - (order_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + start_time, end_time); + threadPool.execute(thread); + } + + Date beforeDate = new Date(now.getTime() - 60000 * 30);// 拼多多平台增量查询订单的时间跨度最大为30分钟,所以不能根据shopConfig.init_time(一般为一个小时) + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + /** + * 2019-05-23 注释,拼多多不再使用时间覆盖式,而是根据当前时间往前半个小时的方式查询 By Lewis + */ + // Date date = df.parse(shopConfig.lastCatchTime); + // date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0));// + // 若抓单出现错误,抓单时间向前推20分钟 + // shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd + // HH:mm:ss").format(date); + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + df.format(now.getTime() - 30 * 60000), df.format(now)); + threadPool.execute(thread); + } + // catch (ParseException e) { + // logger.error(this, e); + // } + catch (Exception e) { + logger.error(this, e); + } + } + + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + int refund_loop = (int) Math.ceil((double) shopConfig.init_time / 30); + for (int k = 0; k < refund_loop; k++) { + String start_time = df + .format(new Date(now.getTime() - (refund_loop - k) * 30 * 60000)); + String end_time = df + .format(new Date(now.getTime() - (refund_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + start_time, end_time); + threadPool.execute(grt); + } + Date beforeDate = new Date(now.getTime() - 60000 * 30); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + /** + * 2019-05-23 注释,拼多多不再使用时间覆盖式,而是根据当前时间往前半个小时的方式查询 By Lewis + */ + // Date date = df.parse(shopConfig.lastQueryRefundTime); + // date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : + // 0)); + // shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + // .format(date); + // 启动抓单线程 + GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + df.format(now.getTime() - 30 * 60 * 1000), df.format(now)); + threadPool.execute(grt); + } + // catch (ParseException e) { + // logger.error(this, e); + // } + catch (Exception e) { + logger.error(this, e); + } + + } + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + class GetRefundThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数1-50 + // private int refund_status; + + public GetRefundThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + // this.refund_status = refund_status; + } + + @Override + public void run() { + this.getRefundOrder(); + } + + private void getRefundOrder() { + PostMethod httpMethod = new PostMethod(platConfig.api_url); + try { + logger.info("[ {} ] 获取退款订单:{}->{},第[ {} ]页,退款状态为1", shopConfig.name, time_start, time_end, page_now); + long timestamp = System.currentTimeMillis() / 1000; + long start_updated_at = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start).getTime() / 1000; + long end_updated_at = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end).getTime() / 1000; + String signStr = "access_token" + shopConfig.session_key + "after_sales_status" + 1 + "after_sales_type" + + 1 + "client_id" + appConfig.key + "data_type" + "JSON" + "end_updated_at" + end_updated_at + + "page" + page_now + "page_size" + page_rows + "start_updated_at" + start_updated_at + + "timestamp" + timestamp + "type" + "pdd.refund.list.increment.get"; + String signStrMD5 = MD5(appConfig.secret + signStr + appConfig.secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.refund.list.increment.get&data_type=JSON×tamp=" + timestamp + + "&client_id=" + appConfig.key + "&access_token=" + shopConfig.session_key + + "&after_sales_status=" + 1 + "&after_sales_type=1&start_updated_at=" + start_updated_at + + "&end_updated_at=" + end_updated_at + "&page=" + page_now + "&page_size" + page_rows + + "&sign=" + signStrMD5; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonString = resBuffer.toString(); + + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonString); + this.parseRefundList(jsonString); + } catch (HttpException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * parseOrderList 解析拼多多返回的订单列表数据 + * + * @param jsonStr + */ + private void parseRefundList(String jsonString) { + try { + JSONObject json = JSONObject.fromObject(jsonString); + // 处理错误信息 + if (json.has("error_response")) { + shopConfig.refundErrFlag = false;// 抓取退款订单记录API相关错误 + JSONObject errorJson = json.getJSONObject("error_response"); + String error_code = errorJson.getString("error_code"); + logger.info("[ {} ] []:{}", shopConfig.name, error_code, errorJson.getString("error_msg")); + // 错误码10019:access_token已过期 错误码10035:access_token已过期 + if ("10019".equals(error_code) || "10035".equals(error_code)) {// 非session_key问题直接重试 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + // + } else if ("70020".equals(error_code)) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() + 16 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推16分钟,其他平台往后推一个小时是因为平台允许的时间跨度较大,拼多多只允许30分钟的时间跨度 + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + + if (json.has("refund_increment_get_response")) { + JSONObject refund_increment_get_response = json.getJSONObject("refund_increment_get_response"); + // org.json.JSONObject queryResult = + // refund_increment_get_response.getJSONObject("total_count"); + int totalCount = refund_increment_get_response.getInt("total_count"); + logger.info("[ {} ] 根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.refundErrFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + JSONArray result = refund_increment_get_response.getJSONArray("refund_list"); + for (int i = 0; i < result.size(); i++) { + JSONObject refundOrder = result.getJSONObject(i); + RefundInfo refundInfo = parseRefundInfo(refundOrder, shopConfig); + if (refundInfo.after_sales_status == 2 || refundInfo.after_sales_status == 3) { +// if (!OrderSyncs.dataParse.insertRefundOrder(refundInfo)) { +// logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); +// } + if (!OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo)) { + logger.info("退款订单[ {} ]处理失败,对应的订单号:[ {} ]", refundInfo.refund_id, refundInfo.tid); + } + } + + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getRefundOrder();// 抓取下一页 + } else { + shopConfig.lastQueryRefundTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.refundErrFlag = true; + } + + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } catch (ParseException e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } catch (Exception e) { + logger.error(this, e); + shopConfig.refundErrFlag = false; + } + } + } + + private RefundInfo parseRefundInfo(JSONObject refundOrder, ShopConfig shopConfig) throws Exception { + RefundInfo refundInfo = new RefundInfo(); + try { + refundInfo.tid = refundOrder.getString("order_sn"); + refundInfo.after_sales_status = refundOrder.getInt("after_sales_status"); + refundInfo.refund_id = refundOrder.getString("id"); + refundInfo.company_code = shopConfig.company_code; + refundInfo.shop_code = shopConfig.code; + refundInfo.company_type = shopConfig.company_type; + refundInfo.bill_type = 1; + refundInfo.desc = ""; + refundInfo.reason = refundOrder.has("after_sale_reason") ? refundOrder.getString("after_sale_reason") : ""; + refundInfo.platform_code = shopConfig.platformCode; + // refundInfo.return_delivery_code = refundOrder.has(""); + + } catch (Exception e) { + logger.error(this, e); + } + return refundInfo; + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class GetOrderThread extends Thread { + private AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数5、10、15、20,默认20 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + PostMethod httpMethod = new PostMethod(platConfig.api_url); + try { + long timestamp = System.currentTimeMillis() / 1000; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + String signStr = "access_token" + shopConfig.session_key + "client_id" + appConfig.key + "data_type" + + "JSON" + "end_updated_at" + sdf.parse(time_end).getTime() / 1000 + "is_lucky_flag" + "0" + + "order_status" + 1 + "page" + page_now + "page_size" + page_rows + "refund_status" + "5" + + "start_updated_at" + sdf.parse(time_start).getTime() / 1000 + "timestamp" + timestamp + "type" + + "pdd.order.number.list.increment.get"; + String signStrMD5 = MD5(appConfig.secret + signStr + appConfig.secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.number.list.increment.get&data_type=JSON×tamp=" + timestamp + + "&client_id=" + appConfig.key + "&access_token=" + shopConfig.session_key + + "&is_lucky_flag=0&order_status=1&start_updated_at=" + sdf.parse(time_start).getTime() / 1000 + + "&end_updated_at=" + sdf.parse(time_end).getTime() / 1000 + "&page_size=" + page_rows + + "&page=" + page_now + "&refund_status=5&sign=" + signStrMD5; + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonString = resBuffer.toString(); + + this.parseOrderList(jsonString); + } catch (HttpException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + + // 处理错误信息 + if (json.has("error_response")) { + logger.info("异常订单返回结果:{}", jsonStr); + + shopConfig.errFlag = false; + JSONObject errorJson = json.getJSONObject("error_response"); + String error_code = errorJson.getString("error_code"); + logger.info("[ {} ] {}:{}", shopConfig.name, error_code, errorJson.getString("error_msg")); + if ("10019".equals(error_code) || "10035".equals(error_code)) {// 非session_key问题直接重试 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + // 错误码:20018抓单 超时 + } else if ("20018".equals(error_code)) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 16 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推16分钟,其他平台往后推一个小时是因为平台允许的时间跨度较大,拼多多只允许30分钟的时间跨度 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + + // 未查询到数据 + JSONObject order_sn_increment_get_response = json.getJSONObject("order_sn_increment_get_response"); + + int total_count = order_sn_increment_get_response.getInt("total_count"); + logger.info("[ {} ] 本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_count, + (total_count - page_rows * (this.page_now - 1))); + if (total_count < 1) { + shopConfig.errFlag = false; + return; + } + + this.page_count = (int) Math.ceil((double) total_count / page_rows);// 计算分页总数 + + // 将订单移至队列,等待获取详细信息 + JSONArray order_sn_list = order_sn_increment_get_response.getJSONArray("order_sn_list"); + for (int i = 0; i < order_sn_list.size(); i++) { + JSONObject order = order_sn_list.getJSONObject(i); + String order_sn = order.getString("order_sn"); + orderQueue.add(new ShopOrderInfo(order_sn, shopConfig, appConfig.key, appConfig.secret)); + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class GetOrderThread1 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 每次订单列表获取的单页条数5、10、15、20,默认20 + + public GetOrderThread1(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + + PostMethod httpMethod = new PostMethod(platConfig.api_url); + try { + long timestamp = System.currentTimeMillis() / 1000; + logger.info("[ {} ] 根据订单生成时间获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + String signStr = "access_token" + shopConfig.session_key + "client_id" + platConfig.apps.get(0).key + + "data_type" + "JSON" + "order_status" + 1 + "page" + page_now + "page_size" + page_rows + + "timestamp" + timestamp + "type" + "pdd.order.number.list.get"; + logger.info("signStr|{}", signStr); + String signStrMD5 = MD5(platConfig.apps.get(0).secret + signStr + platConfig.apps.get(0).secret) + .toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.number.list.get&sign=" + signStrMD5 + "&client_id=" + + platConfig.apps.get(0).key + "&page=" + page_now + "&page_size=" + page_rows + + "&data_type=JSON×tamp=" + timestamp + "&order_status=1&access_token=" + + shopConfig.session_key; + logger.info("queryString|{}", queryString); + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonString = resBuffer.toString(); + + this.parseOrderList(jsonString); + } catch (HttpException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * parseOrderList 解析拼多多返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + // 处理错误信息 + if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + String error_code = error_response.getString("error_code"); + logger.info("[ {} ] {}:{}", shopConfig.name, error_code, error_response.getString("error_msg")); + // this.getOrder();// 重新抓取 + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "拼多多平台故障,请联系软维ERP排查"; + if ("20018".equals(error_code)) { + result = "时间跨度超过拼多多平台限制,跨度应控制在30分钟内"; + } + if ("10019".equals(error_code)) { + result = "店铺授权过期,请重新授权后重试"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return; + } + + // 未查询到数据 + JSONObject order_sn_list_get_response = json.getJSONObject("order_sn_list_get_response"); + int total_count = order_sn_list_get_response.getInt("total_count"); + logger.info("[ {} ] 根据订单生成时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_count, + (total_count - page_rows * (this.page_now - 1))); + if (total_count < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (total_count > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + this.page_count = (int) Math.ceil((double) total_count / page_rows);// 计算分页总数 + // 当前页订单数>1 + JSONArray order_sn_list = order_sn_list_get_response.getJSONArray("order_sn_list"); + for (int i = 0; i < order_sn_list.size(); i++) { + JSONObject order = order_sn_list.getJSONObject(i); + String order_sn = order.getString("order_sn"); + // orderQueue.add(new + // ShopOrderInfo(orderID,shopConfig)); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(order_sn, shopConfig, platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功[ {} ],已转交数据处理中心", order_sn); + } else { + logger.info("消息处理失败[ {} ],放弃处理", order_sn); + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + // if(this.page_now == this.page_count){ + // System.exit(0); + // } + + } catch (Exception e) { + logger.error(this, e); + // this.getOrder();//重新抓取 + } + } + } + + /** + * 32位MD5加密 + * + * @param sourceStr + * @return + */ + private String MD5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (NoSuchAlgorithmException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return result; + } + + /** + * GetOrderInfoThread 获取订单详情线程 + * + * @author Carl + * + */ + private class GetOrderInfoThread extends Thread { + @Override + public void run() { + // while (true) { + if (orderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = (ShopOrderInfo) orderQueue.get(0); + logger.info("[ {} ] 获取订单详情[ {} ]", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + if (getOrderInfo(shopOrderInfo)) { + orderQueue.remove(0); + logger.info("[ {} ] 获取订单详情成功[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + orderQueue.remove(0); + exceptionOrderQueue.add(shopOrderInfo); + logger.info("[ {} ] 获取订单处理失败[ {} ],添加到异常处理订单队列", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } + logger.info("[ {} ] 待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.name, orderQueue.size()); + } + // try { + // Thread.sleep(500);// 每次处理间隔0.5秒 + // } catch (InterruptedException e) { + // logger.error(this, e); + // } catch (Exception e) { + // logger.error(this, e); + // } + // } + } + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoStr = ""; + PostMethod httpMethod = new PostMethod(platConfig.api_url); + try { + long timestamp = System.currentTimeMillis() / 1000; + String signStr = "access_token" + shopOrderInfo.shopConfig.session_key + "client_id" + shopOrderInfo.app_key + + "data_type" + "JSON" + "order_sn" + shopOrderInfo.tid + "timestamp" + timestamp + "type" + + "pdd.order.information.get"; + String signStrMD5 = MD5(shopOrderInfo.app_secret + signStr + shopOrderInfo.app_secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.information.get&data_type=JSON×tamp=" + timestamp + "&client_id=" + + shopOrderInfo.app_key + "&access_token=" + shopOrderInfo.shopConfig.session_key + "&order_sn=" + + shopOrderInfo.tid + "&sign=" + signStrMD5; + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonStr = resBuffer.toString(); + logger.info("[ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.name, jsonStr); + // 检查订单查询结果是否正常 + JSONObject json = JSONObject.fromObject(jsonStr); + + // 处理错误信息 + if (json.has("error_response")) { + logger.info("异常订单返回结果:{}", jsonStr); + JSONObject error_response = json.getJSONObject("error_response"); + String error_code = error_response.getString("error_code"); + logger.info("[" + shopOrderInfo.shopConfig.name + "]" + error_code + ":" + + error_response.getString("error_msg")); + if ("10019".equals(error_code) || "10035".equals(error_code)) {// 非session_key问题直接重试 + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopOrderInfo.shopConfig.code, shopOrderInfo.shopConfig.name); + + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopOrderInfo.shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ]session_key过期,将不再抓单", shopOrderInfo.shopConfig.name); + return true; + } + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "拼多多平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("订单不存在") > -1) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + } + + TradeInfo tradeInfo = parseTradeInfo(jsonStr, shopOrderInfo.shopConfig); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "拼多多平台故障,请联系软维ERP排查", ""); + } + logger.info("error:解析订单详情错误,tid[ {} ],将加入异常处理队列时间->{}", shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if ("".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] [ {} ]:付款时间为空,放弃处理", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + } else { + + if ("待发货".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.name, tradeInfoStr); + return false; + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + } + + /** + * parseTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseTradeInfo(String jsonString, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject json = JSONObject.fromObject(jsonString); + JSONObject order_info_get_response = json.getJSONObject("order_info_get_response"); + JSONObject order_info = order_info_get_response.getJSONObject("order_info"); + + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = order_info.getString("order_sn"); + int order_status = order_info.getInt("order_status"); + switch (order_status) { + case 1: + tradeInfo.status = "待发货"; + break; + case 2: + tradeInfo.status = "已发货待签收"; + break; + case 3: + tradeInfo.status = "已签收"; + break; + default: + tradeInfo.status = "待发货"; + break; + } + String pay_type = order_info.getString("pay_type"); + switch (pay_type) { + case "WEIXIN": + tradeInfo.pay_mode_id = 8; + break; + } + tradeInfo.num = 0; + tradeInfo.discount_fee = Double.parseDouble(order_info.getString("discount_amount")) + ""; + tradeInfo.pay_money = order_info.getString("pay_amount"); + tradeInfo.money = order_info.getString("pay_amount"); + tradeInfo.product_fee = order_info.getString("goods_amount"); + tradeInfo.created = order_info.getString("created_time"); + tradeInfo.pay_time = order_info.getString("created_time"); + tradeInfo.platform_modify_time = order_info.getString("updated_at"); + tradeInfo.post_fee = order_info.getString("postage"); + tradeInfo.buyer_nick = order_info.getString("receiver_name"); + tradeInfo.receiver_name = order_info.getString("receiver_name"); + tradeInfo.receiver_country = order_info.getString("country"); + tradeInfo.receiver_state = order_info.has("province") ? order_info.getString("province") : ""; + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = order_info.has("city") ? order_info.getString("city") : ""; + tradeInfo.receiver_district = order_info.has("town") ? order_info.getString("town") : ""; + tradeInfo.receiver_address = order_info.has("address") ? order_info.getString("address") : ""; + tradeInfo.receiver_mobile = order_info.has("receiver_phone") ? order_info.getString("receiver_phone") : ""; + tradeInfo.receiver_phone = order_info.has("receiver_phone") ? order_info.getString("receiver_phone") : ""; + tradeInfo.receiver_zip = ""; + tradeInfo.buyer_message = ""; + tradeInfo.seller_memo = ""; + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = "fixed"; + tradeInfo.platform_code = "014"; + + // 拼多多没有发票 + tradeInfo.invoice_type = 0; + // tradeInfo.invoice_money = "0"; + + // 商品 + JSONArray item_list = order_info.getJSONArray("item_list"); + tradeInfo.orders = new OrderInfo[item_list.size()]; + for (int i = 0; i < item_list.size(); i++) { + JSONObject item = item_list.getJSONObject(i); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = item.has("outer_id") + ? (item.getString("outer_id") == null ? "" : item.getString("outer_id")) + : ""; + orderInfo.num = Integer.valueOf(item.getString("goods_count")); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = item.getString("goods_price") + ""; + orderInfo.total_fee = (Double.parseDouble(orderInfo.price) * orderInfo.num) + ""; + orderInfo.discount_fee = "0"; + orderInfo.payment = "" + + (Double.parseDouble(orderInfo.total_fee) - Double.parseDouble(orderInfo.discount_fee)); + orderInfo.title = item.getString("goods_name"); + orderInfo.sku_properties_name = item.has("goods_spec") ? item.getString("goods_spec") : ""; + orderInfo.adjust_fee = "0"; + orderInfo.productItemID_dd = ""; + orderInfo.sku_id = item.getInt("sku_id") + ""; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private class ExceptionQueueThread extends Thread { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始,订单队列异常数:[ {} ]", exceptionOrderQueue.size()); + while (exceptionOrderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = exceptionOrderQueue.get(0); + orderQueue.add(shopOrderInfo); + exceptionOrderQueue.remove(0); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String app_key = um.app_key; + String app_secret = um.app_secret; + String refresh_token = um.refresh_token; + try { + if ((expires_time_sdf - now_time_sdf <= 2 * 60 * 60 * 1000) + && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于两个小时的话更新 + + String url = "http://open-api.pinduoduo.com/oauth/token"; + + String param = "{\"client_id\":\"" + app_key + "\",\"client_secret\":\"" + app_secret + + "\",\"grant_type\": \"refresh_token\",\"refresh_token\":\"" + refresh_token + "\"}"; + + String result = sendPost(url, param, shop_name); + org.json.JSONObject json = new org.json.JSONObject(result); + // String messageCode = json.getString(); + if (json.has("access_token")) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ],刷新码到期,放弃刷新", shop_name); + } + } else if (json.has("error_response")) { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_name, result); + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺[ {} ]刷新令牌失败", shop_name); + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + } else { + logger.info("店铺:[ {} ],刷新令牌成功,已写入数据库!", shop_name); + + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + + private String sendPost(String url, String param, String shop_name) { + String result = ""; + try { + HttpURLConnection httpcon; + // Connect + httpcon = (HttpURLConnection) ((new URL(url).openConnection())); + httpcon.setDoOutput(true); + httpcon.setRequestProperty("Content-Type", "application/json"); + httpcon.setRequestProperty("Accept", "application/json"); + httpcon.setRequestMethod("POST"); + httpcon.setConnectTimeout(30 * 1000); + httpcon.setReadTimeout(30 * 1000); + httpcon.connect(); + + // Write + OutputStream os = httpcon.getOutputStream(); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); + writer.write(param); + writer.close(); + os.close(); + + // Read + BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(), "UTF-8")); + + String line = null; + StringBuilder sb = new StringBuilder(); + + while ((line = br.readLine()) != null) { + sb.append(line); + } + + br.close(); + result = sb.toString(); + + } catch (IOException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return result; + } + +} diff --git a/src/com/since/emp/service_bak/ApiWeimob_bak.java b/src/com/since/emp/service_bak/ApiWeimob_bak.java new file mode 100644 index 0000000..9327dd3 --- /dev/null +++ b/src/com/since/emp/service_bak/ApiWeimob_bak.java @@ -0,0 +1,1395 @@ +package com.since.emp.service_bak; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONException; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.HttpRequestCode; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.base.weimob.MerchantOrderListQueryByCreateTimeParameter; +import com.since.emp.base.weimob.MerchantOrderListQueryByUpdateTimeParameter; +import com.since.emp.base.weimob.WeimobOrderRequestByCreateTimeParams; +import com.since.emp.base.weimob.WeimobOrderRequestByUpdateTimeParams; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.util.HttpRequest; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +public class ApiWeimob_bak { + private static final Logger logger = LogManager.getLogger(ApiWeimob_bak.class); + private PlatConfig platConfig;// 平台参数类 + private RecatchConfig recatchConfig;// 平台补抓单参数类 + + private Vector orderQueue;// 订单信息队列 + private Vector exceptionOrderQueue;// 异常订单信息队列 + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + /* + * public class ShopOrderInfo { String tid; ShopConfig shopConfig; String + * app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, + * String app_secret) { this.tid = tid; this.shopConfig = shopConfig; + * this.app_key = app_key; this.app_secret = app_secret; } } + */ + + public ApiWeimob_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + // 启动订单详情获取队列 + orderQueue = new Vector(); + exceptionOrderQueue = new Vector(); + + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + ordersByTime(platConfig.apps.get(0).shops.get(0)); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] 根据订单号抓取订单,API返回订单数据:[ {} ]", shopOrderInfo.shopConfig.name, + recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + // logger.info("["++"]app:"+app_key+"启动,抓取店铺:"+shops.get(0).name); + + } else { + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + } + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 抓取所有为发货的订单 + * + * @param shopConfig + * @author Lewis + * + */ + private void ordersByTime(ShopConfig shopConfig) throws Exception { + // 启动抓单线程 + RecatchOrderThread thread1 = new RecatchOrderThread(shopConfig, recatchConfig.starTime, recatchConfig.endTime); + // thread1.start(); + threadPool.execute(thread1); + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author jue + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 异常订单处理队列 + ExceptionQueueThread eqt = new ExceptionQueueThread(); + threadPool.execute(eqt); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ + // UpdateTokenThread utt = new UpdateTokenThread(); + // threadPool.execute(utt); + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + /* + * 店铺初次抓单前执行一次刷新授权码,如果有错误,重试两次,如果依然错误,直接放弃 + */ + for (int k = 0; k < 3; k++) { + if (initRefreshToken(shopConfig.code)) { + break; + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + logger.error(this, e); + } + } + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(shopConfig, shopConfig.lastCatchTime, + df.format(now)); + threadPool.execute(thread); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 根据订单创建时间抓取 + * + * @author Carl + * + */ + class GetOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 50;// 每次订单列表获取的单页条数 微盟api:1-50 + + public GetOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String url = platConfig.api_url + "/api/1_0/ec/order/queryOrderList?accesstoken=" + + shopConfig.session_key; + WeimobOrderRequestByUpdateTimeParams weimobOrderRequestByPaymentTimeParams = new WeimobOrderRequestByUpdateTimeParams(); + weimobOrderRequestByPaymentTimeParams.page_size = page_rows;// 分页条数(取值范围[1,50]) + weimobOrderRequestByPaymentTimeParams.page_num = page_now;// 分页页码(从1开始) + weimobOrderRequestByPaymentTimeParams.queryParameter = new MerchantOrderListQueryByUpdateTimeParameter(); + weimobOrderRequestByPaymentTimeParams.queryParameter.updateStartTime = sdf.parse(time_start).getTime(); + weimobOrderRequestByPaymentTimeParams.queryParameter.updateEndTime = sdf.parse(time_end).getTime(); + // weimobOrderRequestParams.queryParameter.deliveryStatuses = new + // ArrayList(); + // weimobOrderRequestParams.queryParameter.deliveryStatuses.add(0); + weimobOrderRequestByPaymentTimeParams.queryParameter.orderStatuses = new ArrayList(); + weimobOrderRequestByPaymentTimeParams.queryParameter.orderStatuses.add(1); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String params = gson.toJson(weimobOrderRequestByPaymentTimeParams); + HttpRequest httpRequest = new HttpRequest(); + + String jsonString = httpRequest.sendPost(url, params, HttpRequestCode.CONTENT_TEXT, + ApiWeimob_bak.class.getName()); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonString); + // jsonString="{\"code\":{\"errcode\":\"0\",\"errmsg\":\"处理成功\"},\"data\":{\"pageList\":[{\"createTime\":1565757821000,\"deliveryTypeName\":\"商家配送\",\"channelType\":0,\"channelTypeName\":\"公众号\",\"goodsAmount\":395.00,\"paymentTime\":1565757834000,\"expectDeliveryTime\":\"立即配送\",\"paymentMethodName\":\"微信\",\"receiverAddress\":\"湖南省岳阳市君山区 + // 挂口世纪大道中盛·御景园23栋401(414005)\",\"paymentTypeName\":\"线上支付\",\"processStoreId\":87139982,\"paymentAmount\":365.00,\"bizSouceType\":1,\"processStoreTitle\":\"膳魔师官方微商城\",\"receiverName\":\"周琪\",\"buyerRemark\":\"\",\"orderStatusName\":\"已付款,待发\",\"deliveryType\":1,\"wid\":1393290901,\"orderType\":1,\"updateTime\":1565757834000,\"paymentType\":1,\"storeTitle\":\"膳魔师官方微商城\",\"transferType\":1,\"operationList\":[{\"operationType\":3,\"name\":\"发货\"}],\"receiverCounty\":\"君山区\",\"receiverMobile\":\"13786023917\",\"receiverProvince\":\"湖南省\",\"pid\":100000310982,\"paymentStatus\":2,\"deliveryAmount\":0.00,\"userNickname\":\"sunny\",\"existingInvoice\":false,\"orderStatus\":1,\"goodsPromotionInfo\":{\"cycleOrderInfo\":{},\"promotionType\":1},\"enableDelivery\":1,\"goodsSellMode\":1,\"receiverCity\":\"岳阳市\",\"orderNo\":12794512010183,\"transferStatus\":0,\"receiverArea\":\"\",\"itemList\":[{\"goodsId\":14409020182,\"skuNum\":1,\"skuAmount\":395.00,\"imageUrl\":\"https://image-c.weimobwmc.com/openruntime/775d2f170c484ce1a1246b34282fb9fe.jpg\",\"tagInfo\":{\"goodsBizTag\":[],\"activityTag\":[]},\"hadDeliveryItemNum\":0,\"skuName\":\"桔色(ORG)\",\"warehouseId\":146247,\"skuCode\":\"002.01.05.879\",\"goodsSellMode\":1,\"id\":1819486,\"paymentAmount\":365.00,\"warehouseName\":\"微商城_87139982\",\"price\":395.00,\"originalPrice\":395.00,\"totalAmount\":395.00,\"skuId\":37076280182,\"goodsTitle\":\"新品膳魔师升级316不锈钢保温杯 + // 森之雪系列水杯 + // TCMD-500S\",\"goodsSourceType\":1,\"bizInfo\":{},\"baseDiscountInfo\":{\"couponDiscountAmount\":30.00},\"goodsType\":0}],\"bizType\":0,\"goodsSourceType\":1,\"storeId\":87139982}],\"totalCount\":1,\"pageSize\":50,\"pageNum\":1}}\r\n" + // + + // ""; + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + JSONObject respon_code = json.getJSONObject("code"); + String code = respon_code.getString("errcode"); + // 处理错误信息 + if (!"0".equals(code)) { + logger.info("异常订单返回结果:{}", jsonStr); + + shopConfig.errFlag = false; + if ("80001001000119".equals(code)) {// 非session_key问题直接重试 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } + + // 未查询到数据 + // JSONObject order_sn_increment_get_response = + // json.getJSONObject("order_sn_increment_get_response"); + JSONObject respon_data = json.getJSONObject("data"); + if (respon_data.isNullObject()) { + logger.info("店铺:[ {} ]", shopConfig.name); + shopConfig.errFlag = false; + logger.info("[ {} ] 本批数据总数:0", shopConfig.name); + return; + } else { + int totalCount = respon_data.has("totalCount") ? respon_data.getInt("totalCount") : 0; + if (totalCount <= 0) { + shopConfig.errFlag = false; + logger.info("[ {} ] 本批数据总数:0", shopConfig.name); + return; + } + logger.info("[ {} ] 本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + JSONArray pageList = respon_data.getJSONArray("pageList"); + for (int i = 0; i < pageList.size(); i++) { + JSONObject order = pageList.getJSONObject(i); + String orderNo = order.getString("orderNo"); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseBatchTradeInfo(tradeInfoStr, shopConfig); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", orderNo, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonStr); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] 订单| [ {} } 为到付订单,不予处理!", shopConfig.name, orderNo); + continue; + } + // 等待出库 的订单 + if ("待发货".equals(tradeInfo.status) && "已付款,待发货".equals(tradeInfo.orderStatusName)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + logger.info("[ {} ] error:订单| [ {} ] 的状态非待发货,不予处理!时间->{}", shopConfig.name, orderNo, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Carl + * + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 20;// 微盟平台支持单页的条目数[1-50] + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 根据订单生成时间获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String url = platConfig.api_url + "/api/1_0/ec/order/queryOrderList?accesstoken=" + + shopConfig.session_key; + WeimobOrderRequestByCreateTimeParams weimobOrderRequestByCreateTimeParams = new WeimobOrderRequestByCreateTimeParams(); + weimobOrderRequestByCreateTimeParams.page_size = page_rows;// 分页条数(取值范围[1,50]) + weimobOrderRequestByCreateTimeParams.page_num = page_now;// 分页页码(从1开始) + weimobOrderRequestByCreateTimeParams.queryParameter = new MerchantOrderListQueryByCreateTimeParameter(); + weimobOrderRequestByCreateTimeParams.queryParameter.createStartTime = sdf.parse(time_start).getTime(); + weimobOrderRequestByCreateTimeParams.queryParameter.createEndTime = sdf.parse(time_end).getTime(); + weimobOrderRequestByCreateTimeParams.queryParameter.orderStatuses = new ArrayList(); + weimobOrderRequestByCreateTimeParams.queryParameter.orderStatuses.add(1); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String params = gson.toJson(weimobOrderRequestByCreateTimeParams); + HttpRequest httpRequest = new HttpRequest(); + + String jsonString = httpRequest.sendPost(url, params, HttpRequestCode.CONTENT_TEXT, + ApiWeimob_bak.class.getName()); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, jsonString); + this.parseOrderList(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析微盟返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(String jsonStr) { + try { + JSONObject json = JSONObject.fromObject(jsonStr); + JSONObject respon_code = json.getJSONObject("code"); + String code = respon_code.getString("errcode"); + // 处理错误信息 + if (!"0".equals(code)) { + // JSONObject error_response = json.getJSONObject("error_response"); + // String error_code = error_response.getString("error_code"); + logger.info("[ {} ] {}:{}", code, shopConfig.name, respon_code.getString("errmsg")); + // this.getOrder();// 重新抓取 + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "微盟平台故障,请联系软维ERP排查"; + if ("80001001000119".equals(code)) { + result = "店铺授权过期,请重新授权后重试"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return; + } + + // 未查询到数据 + // JSONObject order_sn_increment_get_response = + // json.getJSONObject("order_sn_increment_get_response"); + JSONObject respon_data = json.getJSONObject("data"); + if (respon_data.isNullObject()) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + logger.info("店铺:[ {} ]本批数据总数:0", shopConfig.name); + return; + } else { + int totalCount = respon_data.has("totalCount") ? respon_data.getInt("totalCount") : 0; + logger.info("[ {} ] 根据订单生成时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + // 当前页订单数>1 + JSONArray pageList = respon_data.getJSONArray("pageList"); + for (int i = 0; i < pageList.size(); i++) { + JSONObject order = pageList.getJSONObject(i); + String orderNo = order.getString("orderNo"); + String tradeInfoStr = order.toString(); + TradeInfo tradeInfo = parseBatchTradeInfo(tradeInfoStr, shopConfig); + if (tradeInfo == null) { + logger.info("[ {} ] error:订单|[ {} ]解析订单详情错误!时间->{}", shopConfig.name, orderNo, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("到付订单".equals(tradeInfo.pay_time)) { + logger.info("[ {} ] 订单| [ {} ]为到付订单,不予处理!", shopConfig.name, orderNo); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "到付订单暂不支持处理,请联系软维ERP", + ""); + } + continue; + } + // 等待出库 的订单 + if ("待发货".equals(tradeInfo.status) && "已付款,待发货".equals(tradeInfo.orderStatusName)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + logger.info("消息处理成功|[ {} ],已转交数据处理中心", orderNo); + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + logger.info("[ {} ] error:订单|[ {} ]的状态非待发货,不予处理!时间->{}", shopConfig.name, orderNo, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + } + } catch (Exception e) { + logger.error(this, e); + // this.getOrder();//重新抓取 + } + } + } + + private void getOrderInfo(ShopOrderInfo shopOrderInfo) throws Exception { + GetOrderByIdThread thread = new GetOrderByIdThread(shopOrderInfo.shopConfig); + // thread.start(); + threadPool.execute(thread); + } + + private class GetOrderByIdThread extends Thread { + private ShopConfig shopConfig; + + public GetOrderByIdThread(ShopConfig shopConfig) { + this.shopConfig = shopConfig; + } + + @Override + public void run() { + getOrder(); + } + + private void getOrder() { + try { + String url = platConfig.api_url + "/api/1_0/ec/order/queryOrderDetail?accesstoken=" + + shopConfig.session_key; + String params = "{\"orderNo\": " + recatchConfig.orderId + " }"; + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendPost(url, params, HttpRequestCode.CONTENT_TEXT, + ApiWeimob_bak.class.getName()); + + logger.info("[ {} ] 根据订单号查找返回订单:{}", shopConfig.name, jsonString); + this.parseOrder(jsonString); + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * parseOrder 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + + private boolean parseOrder(String jsonStr) { + boolean res = false; + try { + JSONObject json = JSONObject.fromObject(jsonStr); + JSONObject respon_code = json.getJSONObject("code"); + String code = respon_code.getString("errcode"); + + if (!"0".equals(code)) { + logger.info("[ {} ] {}:{}", shopConfig.name, code, respon_code.getString("errmsg")); + if ("80001001000119".equals(code)) {// 非session_key问题直接重试 + // 更新数据库中该店铺的使用状态 + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "店铺授权过期,请重新授权后重试", ""); + } + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + logger.info("店铺:[ {} ]session_key过期,将不再抓单", shopConfig.name); + return true; + } + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "微盟平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("订单不存在") > -1) { + result = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + + } + + JSONObject respon_data = json.getJSONObject("data"); + if (respon_data.isNullObject()) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "微盟平台故障,请联系软维ERP排查"; + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + } else { + String tradeInfoStr = respon_data.toString(); + TradeInfo tradeInfo = parseSingleTradeInfo(tradeInfoStr, shopConfig); + // 将订单移至数据处理中心 + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result_response = "微盟平台故障,请联系软维ERP排查"; + if (jsonStr.indexOf("订单不存在") > -1) { + result_response = "无此订单号,请核对后重新提交!"; + } + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result_response, ""); + } + + logger.info("[ {} ] error:解析订单详情错误!时间->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + return false; + } + if ("待发货".equals(tradeInfo.status) && "已付款,待发货".equals(tradeInfo.orderStatusName)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + return false; + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return true; + } + } catch (JSONException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return res; + } + } + + /** + * parseTradeInfo 解析批量订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseBatchTradeInfo(String jsonString, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject trade = JSONObject.fromObject(jsonString); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = trade.getString("orderNo"); + int orderStatus = trade.getInt("orderStatus"); + tradeInfo.orderStatusName = trade.getString("orderStatusName") == null ? "" + : trade.getString("orderStatusName"); + switch (orderStatus) { + case 0: + tradeInfo.status = "待支付"; + break; + case 1: + tradeInfo.status = "待发货"; + break; + case 2: + tradeInfo.status = "已发货"; + break; + case 3: + tradeInfo.status = "已完成"; + break; + case 4: + tradeInfo.status = "已取消"; + break; + default: + tradeInfo.status = ""; + break; + } + // String payment_id = trade.getString("payment_id");//支付方式ID + // String payment_code = trade.getString("payment_code");//支付方式编码 + String payment_name = trade.getString("paymentMethodName");// 支付方式名称 + + // logger.info("解析微盟订单的支付方式ID为:" + payment_id + + // ",支付方式编码:" + payment_code + ",支付方式名称:" + payment_name); + tradeInfo.pay_mode_id = 14; + if ("微信".equals(payment_name)) { + tradeInfo.pay_mode_id = 8; + } + if ("支付宝".equals(payment_name)) { + tradeInfo.pay_mode_id = 6; + } + if ("银行卡".equals(payment_name)) { + tradeInfo.pay_mode_id = 5; + } + if ("现金".equals(payment_name)) { + tradeInfo.pay_mode_id = 2; + } + + tradeInfo.num = 0; + tradeInfo.discount_fee = "0.0"; + if (trade.has("BaseDiscountInfoVo")) { + JSONObject BaseDiscountInfoVo = trade.getJSONObject("BaseDiscountInfoVo"); + Double couponDiscountAmount = BaseDiscountInfoVo.has("couponDiscountAmount") + ? BaseDiscountInfoVo.getDouble("couponDiscountAmount") + : 0.0;// 优惠券优惠金额 + Double couponCodeDiscountAmount = BaseDiscountInfoVo.has("couponCodeDiscountAmount") + ? BaseDiscountInfoVo.getDouble("couponCodeDiscountAmount") + : 0.0;// 码券优惠金额 + Double promotionDiscountAmount = BaseDiscountInfoVo.has("promotionDiscountAmount") + ? BaseDiscountInfoVo.getDouble("promotionDiscountAmount") + : 0.0;// 促销折扣金额 + Double membershipDiscountAmount = BaseDiscountInfoVo.has("membershipDiscountAmount") + ? BaseDiscountInfoVo.getDouble("membershipDiscountAmount") + : 0.0;// 会员折扣金额 + Double memberPointsDiscountAmount = BaseDiscountInfoVo.has("memberPointsDiscountAmount") + ? BaseDiscountInfoVo.getDouble("memberPointsDiscountAmount") + : 0.0;// 积分抵扣金额 + Double merchantDiscountAmount = BaseDiscountInfoVo.has("merchantDiscountAmount") + ? BaseDiscountInfoVo.getDouble("merchantDiscountAmount") + : 0.0;// 商家减免金额 + Double nynjDiscountAmount = BaseDiscountInfoVo.has("nynjDiscountAmount") + ? BaseDiscountInfoVo.getDouble("nynjDiscountAmount") + : 0.0;// N元N件减免金额 + tradeInfo.discount_fee = (couponDiscountAmount + couponCodeDiscountAmount + promotionDiscountAmount + + membershipDiscountAmount + memberPointsDiscountAmount + merchantDiscountAmount + + nynjDiscountAmount) + ""; + + } + tradeInfo.pay_money = trade.getDouble("paymentAmount") + ""; + tradeInfo.money = trade.getString("paymentAmount"); + tradeInfo.product_fee = (Double.valueOf(tradeInfo.money) + Double.valueOf(tradeInfo.discount_fee)) + ""; + + long createTime = trade.getLong("createTime"); + tradeInfo.created = sdf.format(new Date(createTime)); + long paymentTime = trade.has("paymentTime") ? trade.getLong("paymentTime") : 0; + + if (paymentTime == 0) { + tradeInfo.pay_time = "到付订单"; + } else { + tradeInfo.pay_time = sdf.format(new Date(paymentTime)); + } + long updateTime = trade.getLong("updateTime"); + tradeInfo.platform_modify_time = sdf.format(new Date(updateTime)); + + tradeInfo.post_fee = trade.getDouble("deliveryAmount") + ""; + String userNickname = trade.getString("userNickname"); + tradeInfo.buyer_nick = userNickname; + // boolean hasEmoji = EmojiFilterUtil.containsEmoji(userNickname); + // if (hasEmoji) { + // tradeInfo.buyer_nick = EmojiFilterUtil.filterEmoji(userNickname).trim(); + // } else { + // tradeInfo.buyer_nick = userNickname; + // } + + tradeInfo.receiver_name = trade.getString("receiverName"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_address = trade.has("receiver_address") ? trade.getString("receiver_address") : ""; + tradeInfo.receiver_state = trade.getString("receiverProvince"); + tradeInfo.receiver_city = trade.getString("receiverCity"); + tradeInfo.receiver_district = trade.getString("receiverCounty"); + tradeInfo.receiver_address = trade.getString("receiverAddress"); + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_phone = tradeInfo.receiver_mobile = trade.has("receiverMobile") + ? trade.getString("receiverMobile") + : ""; + tradeInfo.receiver_zip = ""; + tradeInfo.buyer_message = ""; + tradeInfo.seller_memo = ""; + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = "fixed"; + tradeInfo.platform_code = "017"; + + // 微盟不支持发票 + tradeInfo.invoice_type = 0; + // tradeInfo.invoice_money = "0"; + + // 商品 + JSONArray order = trade.getJSONArray("itemList"); + // tradeInfo.orders = new OrderInfo[order.size()]; + OrderInfo[] orders = {}; + for (int i = 0; i < order.size(); i++) { + JSONObject item = order.getJSONObject(i); + int skuNum = item.getInt("skuNum");// 商品数量 + int hadDeliveryItemNum = item.getInt("hadDeliveryItemNum");// 已经发货的数量 + if (hadDeliveryItemNum >= skuNum) { + // 标示已发货的数量已经满足订单的数量,不再计入订单 + continue; + } + orders = Arrays.copyOf(orders, orders.length + 1); + orders[orders.length - 1] = new OrderInfo(); + orders[orders.length - 1].platform_seller_code = item.has("skuCode") + ? (item.getString("skuCode") == null ? "" : item.getString("skuCode")) + : ""; + orders[orders.length - 1].num = skuNum; + tradeInfo.num += orders[orders.length - 1].num;// 计算订单总数量 + orders[orders.length - 1].price = item.getDouble("price") + ""; + double totalAmount = item.getDouble("totalAmount"); + orders[orders.length - 1].total_fee = totalAmount + ""; + double paymentAmount = item.getDouble("paymentAmount"); + orders[orders.length - 1].payment = paymentAmount + ""; + orders[orders.length - 1].discount_fee = (totalAmount - paymentAmount) + ""; + + orders[orders.length - 1].title = item.getString("goodsTitle"); + orders[orders.length - 1].sku_properties_name = item.has("skuName") ? item.getString("skuName") : ""; + orders[orders.length - 1].adjust_fee = "0"; + orders[orders.length - 1].productItemID_dd = ""; + orders[orders.length - 1].sku_id = item.getLong("skuId") + ""; + orders[orders.length - 1].gift_type = 1; + + } + if (orders.length == 0) { + return null; + } + tradeInfo.orders = orders; + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * parseTradeInfo 解析单个订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseSingleTradeInfo(String jsonString, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + JSONObject trade = JSONObject.fromObject(jsonString); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = trade.getString("orderNo"); + int orderStatus = trade.getInt("orderStatus"); + tradeInfo.orderStatusName = trade.getString("orderStatusName") == null ? "" + : trade.getString("orderStatusName"); + switch (orderStatus) { + case 0: + tradeInfo.status = "待支付"; + break; + case 1: + tradeInfo.status = "待发货"; + break; + case 2: + tradeInfo.status = "已发货"; + break; + case 3: + tradeInfo.status = "已完成"; + break; + case 4: + tradeInfo.status = "已取消"; + break; + default: + tradeInfo.status = ""; + break; + } + // String payment_id = trade.getString("payment_id");//支付方式ID + // String payment_code = trade.getString("payment_code");//支付方式编码 + JSONObject paymentInfo = trade.getJSONObject("paymentInfo"); + String payment_name = paymentInfo.getString("paymentMethodName");// 支付方式名称 + + // logger.info("解析微盟订单的支付方式ID为:" + payment_id + + // ",支付方式编码:" + payment_code + ",支付方式名称:" + payment_name); + tradeInfo.pay_mode_id = 14; + if ("微信".equals(payment_name)) { + tradeInfo.pay_mode_id = 8; + } + if ("支付宝".equals(payment_name)) { + tradeInfo.pay_mode_id = 6; + } + if ("银行卡".equals(payment_name)) { + tradeInfo.pay_mode_id = 5; + } + if ("现金".equals(payment_name)) { + tradeInfo.pay_mode_id = 2; + } + + tradeInfo.num = 0; + tradeInfo.discount_fee = "0.0"; + if (trade.has("BaseDiscountInfoVo")) { + JSONObject BaseDiscountInfoVo = trade.getJSONObject("BaseDiscountInfoVo"); + Double couponDiscountAmount = BaseDiscountInfoVo.has("couponDiscountAmount") + ? BaseDiscountInfoVo.getDouble("couponDiscountAmount") + : 0.0;// 优惠券优惠金额 + Double couponCodeDiscountAmount = BaseDiscountInfoVo.has("couponCodeDiscountAmount") + ? BaseDiscountInfoVo.getDouble("couponCodeDiscountAmount") + : 0.0;// 码券优惠金额 + Double promotionDiscountAmount = BaseDiscountInfoVo.has("promotionDiscountAmount") + ? BaseDiscountInfoVo.getDouble("promotionDiscountAmount") + : 0.0;// 促销折扣金额 + Double membershipDiscountAmount = BaseDiscountInfoVo.has("membershipDiscountAmount") + ? BaseDiscountInfoVo.getDouble("membershipDiscountAmount") + : 0.0;// 会员折扣金额 + Double memberPointsDiscountAmount = BaseDiscountInfoVo.has("memberPointsDiscountAmount") + ? BaseDiscountInfoVo.getDouble("memberPointsDiscountAmount") + : 0.0;// 积分抵扣金额 + Double merchantDiscountAmount = BaseDiscountInfoVo.has("merchantDiscountAmount") + ? BaseDiscountInfoVo.getDouble("merchantDiscountAmount") + : 0.0;// 商家减免金额 + Double nynjDiscountAmount = BaseDiscountInfoVo.has("nynjDiscountAmount") + ? BaseDiscountInfoVo.getDouble("nynjDiscountAmount") + : 0.0;// N元N件减免金额 + tradeInfo.discount_fee = (couponDiscountAmount + couponCodeDiscountAmount + promotionDiscountAmount + + membershipDiscountAmount + memberPointsDiscountAmount + merchantDiscountAmount + + nynjDiscountAmount) + ""; + + } + tradeInfo.pay_money = trade.getDouble("paymentAmount") + ""; + tradeInfo.money = trade.getString("paymentAmount"); + tradeInfo.product_fee = (Double.valueOf(tradeInfo.money) + Double.valueOf(tradeInfo.discount_fee)) + ""; + + long createTime = trade.getLong("createTime"); + tradeInfo.created = sdf.format(new Date(createTime)); + long paymentTime = paymentInfo.has("paymentTime") ? paymentInfo.getLong("paymentTime") : 0; + + if (paymentTime == 0) { + tradeInfo.pay_time = "到付订单"; + } else { + tradeInfo.pay_time = sdf.format(new Date(paymentTime)); + } + // long updateTime = trade.getLong("updateTime"); + // tradeInfo.platform_modify_time = sdf.format(new Date (updateTime)); + // JSONObject guideInfo = trade.getJSONObject("guideInfo"); + tradeInfo.post_fee = trade.getDouble("deliveryAmount") + ""; + // tradeInfo.buyer_nick = trade.getString("userNickname"); + JSONObject buyerInfo = trade.getJSONObject("buyerInfo"); + String userNickname = buyerInfo.getString("userNickname"); + tradeInfo.buyer_nick = userNickname; + // boolean hasEmoji = EmojiFilterUtil.containsEmoji(userNickname); + // if (hasEmoji) { + // tradeInfo.buyer_nick = EmojiFilterUtil.filterEmoji(userNickname).trim(); + // } else { + // tradeInfo.buyer_nick = userNickname; + // } + JSONObject deliveryDetail = trade.getJSONObject("deliveryDetail"); + JSONObject logisticsDeliveryDetail = deliveryDetail.getJSONObject("logisticsDeliveryDetail"); + tradeInfo.receiver_name = logisticsDeliveryDetail.getString("receiverName"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_address = logisticsDeliveryDetail.has("receiver_address") + ? logisticsDeliveryDetail.getString("receiver_address") + : ""; + tradeInfo.receiver_state = logisticsDeliveryDetail.getString("receiverProvince"); + tradeInfo.receiver_city = logisticsDeliveryDetail.getString("receiverCity"); + tradeInfo.receiver_district = logisticsDeliveryDetail.getString("receiverCounty"); + tradeInfo.receiver_address = logisticsDeliveryDetail.getString("receiverAddress"); + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + if (tradeInfo.receiver_state.endsWith("市")) { + tradeInfo.receiver_state = tradeInfo.receiver_state.substring(0, tradeInfo.receiver_state.length() - 1); + } + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson.fromJson(shopConfig.delivery_area_setting, + new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_phone = tradeInfo.receiver_mobile = logisticsDeliveryDetail.has("receiverMobile") + ? logisticsDeliveryDetail.getString("receiverMobile") + : ""; + tradeInfo.receiver_zip = ""; + tradeInfo.buyer_message = ""; + tradeInfo.seller_memo = ""; + tradeInfo.adjust_fee = "0"; + + tradeInfo.type = "fixed"; + tradeInfo.platform_code = "017"; + + // 微盟不支持发票 + tradeInfo.invoice_type = 0; + // tradeInfo.invoice_money = "0"; + + // 商品 + JSONArray order = trade.getJSONArray("itemList"); + // tradeInfo.orders = new OrderInfo[order.size()]; + OrderInfo[] orders = {}; + for (int i = 0; i < order.size(); i++) { + JSONObject item = order.getJSONObject(i); + int skuNum = item.getInt("skuNum");// 商品数量 + int hadDeliveryItemNum = item.getInt("hadDeliveryItemNum");// 已经发货的数量 + if (hadDeliveryItemNum >= skuNum) { + // 标示已发货的数量已经满足订单的数量,不再计入订单 + continue; + } + orders = Arrays.copyOf(orders, orders.length + 1); + orders[orders.length - 1] = new OrderInfo(); + orders[orders.length - 1].platform_seller_code = item.has("skuCode") + ? (item.getString("skuCode") == null ? "" : item.getString("skuCode")) + : ""; + orders[orders.length - 1].num = skuNum; + tradeInfo.num += orders[orders.length - 1].num;// 计算订单总数量 + orders[orders.length - 1].price = item.getDouble("price") + ""; + double totalAmount = item.getDouble("totalAmount"); + orders[orders.length - 1].total_fee = totalAmount + ""; + double paymentAmount = item.getDouble("paymentAmount"); + orders[orders.length - 1].payment = paymentAmount + ""; + orders[orders.length - 1].discount_fee = (totalAmount - paymentAmount) + ""; + + orders[orders.length - 1].title = item.getString("goodsTitle"); + orders[orders.length - 1].sku_properties_name = item.has("skuName") ? item.getString("skuName") : ""; + orders[orders.length - 1].adjust_fee = "0"; + orders[orders.length - 1].productItemID_dd = ""; + orders[orders.length - 1].sku_id = item.getLong("skuId") + ""; + orders[orders.length - 1].gift_type = 1; + + } + if (orders.length == 0) { + return null; + } + tradeInfo.orders = orders; + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private class ExceptionQueueThread extends Thread { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始,订单队列异常数:[ {} ]", exceptionOrderQueue.size()); + while (exceptionOrderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = exceptionOrderQueue.get(0); + orderQueue.add(shopOrderInfo); + exceptionOrderQueue.remove(0); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 程序启动或者店铺开启抓单首先执行刷新授权码步骤 + * + * 2018年11月13日 void Lewis + */ + private boolean initRefreshToken(String shopCode) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String shop_code = um.shop_code; + if (shopCode != null && shopCode.equals(shop_code)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long now_time_sdf = System.currentTimeMillis(); + + String shop_name = um.shop_name; + String app_key = um.app_key; + String app_secret = um.app_secret; + String refresh_token = um.refresh_token; + /* + * 微盟要求用post请求,但是url的?后面的参数不能用post请求发送,要拼接到url,然后参数sendPost的参数传空。 + */ + String url = "https://dopen.weimob.com/fuwu/b/oauth2/token?grant_type=refresh_token&client_id=" + + app_key + "&client_secret=" + app_secret + "&refresh_token=" + refresh_token; + + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, "", HttpRequestCode.CONTENT_TEXT, + ApiWeimob_bak.class.getName()); + org.json.JSONObject json = new org.json.JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + return false; + } else { + logger.info("店铺:[ {} ]刷新令牌成功,已写入数据库!", shop_name); + + return true; + } + } else { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_name, result); + return false; + } + } + } + return true; + } catch (Exception e) { + logger.error(this, e); + return false; + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * 微盟平台自动更新授权码,授权码有效期为两个小时,刷新码的有效期为七天,但是刷新码在七天内被使用了,有效期从被使用时间重新计算七天的有效期, + * 即刷新码只有在七天内被使用,就会一直有效. + * + * @author Lewis 2018年11月12日 UpdateTokenThread + */ + + private void dealUpdateToken() { + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String app_key = um.app_key; + String app_secret = um.app_secret; + String refresh_token = um.refresh_token; + try { + + if ((expires_time_sdf - now_time_sdf <= 30 * 60 * 1000) && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于半个小时的话更新,微盟平台的accessToken有效期只有2个小时 + + /* + * 微盟要求用post请求,但是url的?后面的参数不能用post请求发送,要拼接到url,然后参数sendPost的参数传空。 + */ + String url = "https://dopen.weimob.com/fuwu/b/oauth2/token?grant_type=refresh_token&client_id=" + + app_key + "&client_secret=" + app_secret + "&refresh_token=" + refresh_token; + + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, "", HttpRequestCode.CONTENT_TEXT, + ApiWeimob_bak.class.getName()); + + org.json.JSONObject json = new org.json.JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 10 * 60) {// 如果授权码的时效不足两个小时,即购买在10分钟内到期,不做更新 + + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } else { + logger.info("店铺:[ {} ],刷新码到期,放弃刷新", shop_name); + } + } else { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_name, result); + } + } + + } catch (Exception e) { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试", shop_name); + logger.error(this, e); + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, long expiresIn, long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + } else { + logger.info("店铺:[ {} ],刷新令牌成功,已写入数据库!", shop_name); + + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/service_bak/ApiXiaoHongShu_bak.java b/src/com/since/emp/service_bak/ApiXiaoHongShu_bak.java new file mode 100644 index 0000000..a3d085a --- /dev/null +++ b/src/com/since/emp/service_bak/ApiXiaoHongShu_bak.java @@ -0,0 +1,868 @@ +package com.since.emp.service_bak; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.MD5Util; + +/** + * @className:ApiXiaoHongShu + * @description:小红书Api接口类 + * @author:Sunshine + * @date:2019年3月4日 下午1:19:17 + */ +public class ApiXiaoHongShu_bak { + private static final Logger logger = LogManager.getLogger(ApiXiaoHongShu_bak.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private Vector orderQueue; + private Vector exceptionOrderQueue; + + private ThreadPoolExecutor threadPool; + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiXiaoHongShu_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + JSONObject json = new JSONObject(platConfig.apps.get(0).shops.get(0).name); + platConfig.apps.get(0).key = json.getString("app-key"); + platConfig.apps.get(0).secret = json.getString("app-secret"); + + threadPool = ThreadPool.getInstance(); + + // 启动订单详情获取队列 + orderQueue = new Vector(); + exceptionOrderQueue = new Vector(); + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + GetOrderInfoThread getOrderInfoThread = new GetOrderInfoThread(); + scheduledThreadPool.scheduleAtFixedRate(getOrderInfoThread, 0, 500, TimeUnit.MILLISECONDS); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据下单时间段抓取订单 + if ((recatchConfig.starTime.length() > 0) && (recatchConfig.endTime.length() > 0)) { + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(recatchOrderThread); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ]根据订单号抓取订单,API返回订单数据:[ {} ]", shopOrderInfo.shopConfig.name, + recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * @className:OrdersTimerTask + * @description:根据订单生成时间定时抓取订单 + * @author:Sunshine + * @date:2019年3月4日 下午5:11:21 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + // 异常订单处理队列 + ExceptionQueueThread eqt = new ExceptionQueueThread(); + threadPool.execute(eqt); + + platConfig = OrderSyncs.getAppMessage(platConfig); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + + /* + * 抓单处理线程 + */ + + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0));// 若抓单出现错误,抓单时间向前推20分钟 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + // // 启动抓单线程 TODO + // GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), + // shopConfig, + // shopConfig.lastCatchTime, df.format(now)); + // threadPool.execute(thread); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + + if (shopConfig.auto_aftersale_flag == 2) { + if (shopConfig.lastQueryRefundTime == null) { + int refund_loop = (int) Math.ceil((double) shopConfig.init_time / 30); + for (int k = 0; k < refund_loop; k++) { + String start_time = df + .format(new Date(now.getTime() - (refund_loop - k) * 30 * 60000)); + String end_time = df + .format(new Date(now.getTime() - (refund_loop - k - 1) * 30 * 60000)); + // 启动抓单线程 + // GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + // start_time, end_time); + // threadPool.execute(grt); + } + Date beforeDate = new Date(now.getTime() - 60000 * 30); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + + // 启动抓单线程 + // GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + // shopConfig.lastQueryRefundTime, df.format(now)); + // threadPool.execute(grt); + } + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * @className:GetOrderThread + * @description:即时获取订单线程(order_time_from和order_time_to查询订单创建时间的起止时间 间隔不得超过30分钟。调用频率建议15分钟一次。) + * @author:Sunshine + * @date:2019年3月4日 下午1:18:31 + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1;// 分页总数 + private int page_now = 1;// 当前页 + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + } + + @Override + public void run() { + this.getOrder(); + } + + public void getOrder() { + try { + logger.info("[ {} ]获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + if (shopConfig.name == null) {// 判断是否有店铺信息 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + String app_key = shopConfig_json.getString("app-key"); + String app_secret = shopConfig_json.getString("app-secret"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String start_time = String.valueOf(sdf.parse(time_start).getTime() / 1000);// 开始时间 + String end_time = String.valueOf(sdf.parse(time_end).getTime() / 1000); + String timestamp = System.currentTimeMillis() / 1000 + ""; + String sign = "/ark/open_api/v0/packages?" + "app-key=" + app_key + "&end_time=" + end_time + + "&page_no=" + page_now + "&page_size=" + page_rows + "&start_time=" + start_time + + "×tamp=" + timestamp + app_secret; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + String request_str = "?end_time=" + end_time + "&start_time=" + start_time + "&page_no=" + page_now + + "&page_size=" + page_rows; + String response_str = new HttpRequest().xiaoHongShuSendGet(platConfig.api_url + request_str, + timestamp, app_key, signStr); + logger.info("[ {} ]返回订单:{}", shopConfig.name, response_str); + this.parseOrderList(response_str); + } + } catch (Exception e) { + logger.error(e); + } + + } + + /** + * @return + * @title: parseOrderList + * @description: 解析小红书返回的订单列表 + * @param: jsonString + */ + private void parseOrderList(String jsonString) { + try { + logger.info("[ {} ]获取即时订单:{}", shopConfig.name, jsonString); + JSONObject json_response_str = new JSONObject(jsonString); + if (json_response_str.has("error_code")) { + int error_code = json_response_str.getInt("error_code"); + String error_msg = ""; + if (json_response_str.has("error_msg")) { + error_msg = json_response_str.getString("error_msg"); + } + if (error_code == 0) {// 正常返回 + JSONObject json_data_str = json_response_str.getJSONObject("data"); + // JSONObject json_order_data = new JSONObject(json_data_str); + int total_number = json_data_str.getInt("total_number"); + logger.info("[ {} ]本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_number, + (total_number - page_rows * (this.page_now - 1))); + // 未获取到订单 + if (total_number < 1) { + shopConfig.errFlag = false; + return; + + } + // 获取到订单 + this.page_count = (int) Math.ceil((double) total_number / page_rows);// 计算分页总数 + + // 将订单移至队列,等待获取详细信息 + int currentPageCount = this.page_rows; + if (this.page_now == this.page_count) { + currentPageCount = total_number % this.page_rows; + } + if (currentPageCount == 1) { + // 当前页订单数为1 + JSONArray packages = json_data_str.getJSONArray("package_list"); + for (int i = 0; i < packages.length(); i++) { + // String json_order = packages.getString(i); + JSONObject json_package = packages.getJSONObject(i); + String package_id = json_package.getString("package_id"); + String status = json_package.getString("status"); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(package_id, shopConfig, appConfig.key, + appConfig.secret); + if ("confirmed".equals(status)) { + orderQueue.add(shopOrderInfo); + } + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", package_id); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", package_id); + } + } + } else { + JSONArray packages = json_data_str.getJSONArray("package_list"); + for (int i = 0; i < packages.length(); i++) { + // String json_order = packages.getString(i); + JSONObject json_package = packages.getJSONObject(i); + ; + String package_id = json_package.getString("package_id"); + String status = json_package.getString("status"); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(package_id, shopConfig, appConfig.key, + appConfig.secret); + if ("confirmed".equals(status)) { + orderQueue.add(shopOrderInfo); + } + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", package_id); + } else { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", shopOrderInfo.tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + + logger.info("异常订单返回结果:{}", json_data_str); + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else if (error_code == -10000) {// 处理错误信息 + logger.info("异常订单返回结果:" + json_response_str); + logger.info("[ {} ]发生未知异常:错误编码:-10000,异常信息:{}", shopConfig.name, error_msg); + return; + } else if (error_code == -8006) {// 超过平台跨度 + logger.info("异常订单返回结果:" + json_response_str); + logger.info("[ {} ]发生异常:错误编码:-8006,异常信息:{}", shopConfig.name, error_msg); + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + return; + } else { + logger.info("异常订单返回结果:" + json_response_str); + logger.info("[ {} ]发生异常:错误编码:{},异常信息:{}" + shopConfig.name, error_code, error_msg); + return; + } + + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * @className:RecatchOrderThread + * @description:根据时间段补抓订单线程 + * @author:Sunshine + * @date:2019年3月4日 下午4:58:46 + */ + class RecatchOrderThread extends Thread { + + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数5、10、15、20,默认20 + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + public void getOrder() { + + try { + logger.info("[ {} ]获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + if (shopConfig.name == null) {// 判断是否有店铺信息 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + String app_key = shopConfig_json.getString("app-key"); + String app_secret = shopConfig_json.getString("app-secret"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String start_time = String.valueOf(sdf.parse(time_start).getTime() / 1000);// 开始时间 + String end_time = String.valueOf(sdf.parse(time_end).getTime() / 1000); + String timestamp = System.currentTimeMillis() / 1000 + ""; + String sign = "/ark/open_api/v0/packages?" + "app-key=" + app_key + "&end_time=" + end_time + + "&page_no=" + page_now + "&page_size=" + page_rows + "&start_time=" + start_time + + "×tamp=" + timestamp + app_secret; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + String request_str = "?end_time=" + end_time + "&start_time=" + start_time + "&page_no=" + page_now + + "&page_size=" + page_rows; + String response_str = new HttpRequest().xiaoHongShuSendGet(platConfig.api_url + request_str, + timestamp, app_key, signStr); + logger.info("[ {} ]根据时间段补抓返回订单:{}", shopConfig.name, response_str); + this.parseOrderList(response_str); + } + } catch (Exception e) { + logger.error(e); + } + + } + + /** + * @param jsonString + * @title: parseOrderList + * @description: 解析小红书返回的订单列表 + */ + private void parseOrderList(String jsonString) { + try { + logger.info("[ {} ]根据时间段补抓订单:{}", shopConfig.name, jsonString); + JSONObject json_response_str = new JSONObject(jsonString); + if (json_response_str.has("error_code")) { + int error_code = json_response_str.getInt("error_code"); + String error_msg = ""; + if (json_response_str.has("error_msg")) { + error_msg = json_response_str.getString("error_msg"); + } + if (error_code == 0) {// 正常返回 + JSONObject json_data_str = json_response_str.getJSONObject("data"); + // JSONObject json_order_data = new JSONObject(json_data_str); + int total_number = json_data_str.getInt("total_number"); + logger.info("[ {} ]本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, total_number, + (total_number - page_rows * (this.page_now - 1))); + // 未获取到订单 + if (total_number < 1) { + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + + } + if (total_number > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + // 获取到订单 + this.page_count = (int) Math.ceil((double) total_number / page_rows);// 计算分页总数 + + // 将订单移至队列,等待获取详细信息 + int currentPageCount = this.page_rows; + if (this.page_now == this.page_count) { + currentPageCount = total_number % this.page_rows; + } + if (currentPageCount == 1) { + // 当前页订单数为1 + JSONArray packages = json_data_str.getJSONArray("package_list"); + for (int i = 0; i < packages.length(); i++) { + // String json_order = packages.getString(i); + JSONObject json_package = packages.getJSONObject(i); + String package_id = json_package.getString("package_id"); + String status = json_package.getString("status"); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(package_id, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret); + if ("waiting".equals(status)) { + orderQueue.add(shopOrderInfo); + } + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", package_id); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", package_id); + } + } + } else { + JSONArray packages = json_data_str.getJSONArray("package_list"); + for (int i = 0; i < packages.length(); i++) { + // String json_order = packages.getString(i); + JSONObject json_package = packages.getJSONObject(i); + String package_id = json_package.getString("package_id"); + String status = json_package.getString("status"); + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(package_id, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret); + if ("waiting".equals(status)) { + + if (getOrderInfo(shopOrderInfo)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", package_id); + } else { + logger.info("消息处理失败|[ {} ],放弃处理", package_id); + } + } + } + } + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + + } else if (error_code == -10000) {// 处理错误信息 + logger.info("[ {} ]发生未知异常:错误编码:-10000" + ",异常信息:{}", shopConfig.name, error_msg); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + return; + } else if (error_code == -8006) { + logger.info("[ {} ]发生异常:错误编码:{},异常信息:{}" + shopConfig.name, error_code, error_msg); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "时间范围请缩查询范围!", ""); + } + } else { + logger.info("[ {} ]发生异常:错误编码:{},异常信息:{}" + shopConfig.name, error_code, error_msg); + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + return; + } + + } + + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + } + + /** + * @className:GetOrderInfoThread + * @description:获取订单详情队列 + * @author:Sunshine + * @date:2019年3月4日 下午3:50:40 + */ + private class GetOrderInfoThread extends Thread { + @Override + public void run() { + try { + if (orderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = (ShopOrderInfo) orderQueue.get(0); + logger.info("[ {} ]获取订单详情|[ {} ]", shopOrderInfo.shopConfig.name, shopOrderInfo.tid); + if (getOrderInfo(shopOrderInfo)) { + orderQueue.remove(0); + logger.info("[ {} ]获取订单详情成功|[ {} ],已转交数据处理中心", shopOrderInfo.shopConfig.name, + shopOrderInfo.tid); + } else { + orderQueue.remove(0); + exceptionOrderQueue.add(shopOrderInfo); + logger.info("[ {} ]获取订单处理失败|[ {} ],添加到异常处理订单队列", shopOrderInfo.shopConfig.name, + shopOrderInfo.tid); + } + logger.info("[ {} ]待处理队列总数:[ {} ]", shopOrderInfo.shopConfig.name, orderQueue.size()); + } + } catch (Exception e) { + logger.error(this, e); + } + + } + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 + * + * @param shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + try { + String timestamp = System.currentTimeMillis() / 1000 + ""; + String sign = "/ark/open_api/v0/packages/" + shopOrderInfo.tid + "?app-key=" + shopOrderInfo.app_key + + "×tamp=" + timestamp + shopOrderInfo.app_secret; + String request_str = "/" + shopOrderInfo.tid; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + String get_orderInfo_response = new HttpRequest().xiaoHongShuSendGet(platConfig.api_url + request_str, + timestamp, shopOrderInfo.app_key, signStr); + logger.info("[ {} ]根据订单号补抓订单:{}", shopOrderInfo.shopConfig.name, get_orderInfo_response); + JSONObject json_str = new JSONObject(get_orderInfo_response); + + if (json_str.has("error_code")) { + int error_code = json_str.getInt("error_code"); + String error_msg = ""; + if (json_str.has("error_msg")) { + error_msg = json_str.getString("error_msg"); + } + // 正常获取订单 + if (error_code == 0) { + JSONObject orderinfo_str = json_str.getJSONObject("data"); + TradeInfo tradeInfo = parseTradeInfo(orderinfo_str, shopOrderInfo.shopConfig); + if (tradeInfo == null) { + return false; + } + String status = "waiting"; + if (status.equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + } + } else if (error_code == -10000) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + return false; + } else if (error_code == -7003) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + String result = "无此订单号,请核对后重新提交!"; + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, result, ""); + } + return false; + } else {// 其他异常 + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "小红书平台故障,请联系软维ERP排查", ""); + } + return false; + } + } + return true; + + } catch (Exception e) { + logger.error(this, e); + } + return false; + } + + /** + * @return + * @title: parseTradeInfo + * @description: 解析订单详情 + */ + public TradeInfo parseTradeInfo(JSONObject order, ShopConfig shopConfig) { + try { + TradeInfo tradeInfo = new TradeInfo(); + // OrderInfo orderInfo = new OrderInfo(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + /** + * register_name String //备案名,该字段仅限于小包转运模式 international_express_no String + * //国际快件号,该字段仅限于小包转运模式 delivery_time_preference String //国内快递送货时间,该字段仅限于小包转运模式 + * order_declared_amount String //订单申报金额,该字段仅限于小包转运模式 + */ + tradeInfo.platform_code = "021"; + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.code; + tradeInfo.delivery_mode_id = shopConfig.delivery_mode_id; + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.pay_percent = shopConfig.pay_percent; + tradeInfo.storage_code = shopConfig.storage_code; + tradeInfo.company_type = shopConfig.company_type; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = order.getString("package_id"); // 订单ID + tradeInfo.status = order.getString("status");// 订单状态,waiting待打包和打包中(APP端显示为待配货和配货中),shipped已发货,received收件人已签收 + tradeInfo.money = order.getDouble("pay_amount") + ""; + tradeInfo.pay_money = tradeInfo.money; + /************************/ + tradeInfo.num = 0; + tradeInfo.discount_fee = "0"; + tradeInfo.invoice_type = 0;// 发票类型 + tradeInfo.buyer_message = ""; + tradeInfo.adjust_fee = "0"; + tradeInfo.product_fee = "0"; + tradeInfo.receiver_zip = ""; + tradeInfo.seller_memo = ""; + /************************/ + tradeInfo.pay_time = sdf.format((order.getInt("pay_time") * 1000L));// 用户支付时间 + tradeInfo.created = sdf.format((order.getInt("pay_time") * 1000L));// 交易创建时间 + // time Int //用户下单时间,Unix-Time时间戳 + + // confirm_time Int //订单确认时间,Unix-Time时间戳 + tradeInfo.receiver_name = order.getString("receiver_name");// 收件人姓名 + tradeInfo.buyer_nick = tradeInfo.receiver_name;// 昵称 + tradeInfo.receiver_phone = order.getString("receiver_phone");// 收件人电话 + tradeInfo.receiver_mobile = order.getString("receiver_phone");// 收件人电话 + tradeInfo.receiver_state = order.getString("province");// 省 + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.receiver_state = tradeInfo.receiver_state.replaceAll("市", ""); + } + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_address = order.getString("receiver_address");// 收件人地址 + tradeInfo.receiver_city = order.getString("city");// 市 + tradeInfo.receiver_district = order.getString("district");// 区 + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + + tradeInfo.money = Double.toString(order.getDouble("pay_amount"));// 订单支付金额 + JSONArray item_list = order.getJSONArray("item_list");// 商品列表 + tradeInfo.orders = new OrderInfo[0]; + double product_fee = 0.0; + for (int i = 0; i < item_list.length(); i++) { + OrderInfo orderInfo = new OrderInfo(); + orderInfo.divide_order_fee = "0"; + + orderInfo.adjust_fee = "0"; + orderInfo.productItemID_dd = ""; + orderInfo.part_mjz_discount = "0"; + tradeInfo.post_fee = "0"; + JSONObject item_json_string = (JSONObject) item_list.get(i); + orderInfo.platform_seller_code = item_json_string.has("barcode") ? item_json_string.getString("barcode") + : "";// 平台商家编码 + orderInfo.sku_id = item_json_string.has("skucode") ? item_json_string.getString("skucode") : "";// 小红书编码 + orderInfo.title = item_json_string.has("item_name") ? item_json_string.getString("item_name") : "";// 商品名称 + orderInfo.num = item_json_string.getInt("qty");// 购买数量 + // orderInfo.order_buyer_payment = item_json_string.getString("pay_price");// + // 商品的零售金额 + orderInfo.price = item_json_string.getString("price");// 商品售价(标价) + orderInfo.discount_fee = item_json_string.has("merchant_discount") + ? item_json_string.getString("merchant_discount") + : "";// 商品优惠金额 + orderInfo.sku_properties_name = item_json_string.has("specification") + ? item_json_string.getString("specification") + : "";// 商品规格 + orderInfo.total_fee = String + .valueOf(Double.parseDouble(item_json_string.getString("pay_price")) * orderInfo.num);// 应付金额 + orderInfo.payment = orderInfo.total_fee; + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = orderInfo; + + /*************************/ + tradeInfo.num += orderInfo.num;// 计算订单总数量 + + double price = (Double.parseDouble(orderInfo.total_fee) * orderInfo.num); + product_fee += price; + /*************************/ + ; + } + // (订单中)商品标价*数量 + tradeInfo.product_fee = String.valueOf(product_fee);// 商品金额(订单中所有商品未优惠前的总金额) + + // barcode String 商品条码 + // specification String + // merchant_discount String 单件商品商家承担的优惠,一般包括商家配置的薯券和商家设置的促销,例如限时特价,满减和任选等。 + // red_discount String 单件商品小红书承担的优惠,一般为全场通用薯券,例如新人薯券,全场通用券等 + // net_weight Double 商品净重 + // paint_marker String 大头笔,该字段仅限于小包转运模式 + // express_extend_1 String 集包地,该字段仅限于小包转运模式 + // express_extend_2 String 三段码,该字段仅限于小包转运模式 + // logistics String 当前包裹的物流模式 + // id_number String 买家身份证,此字段默认不显示,需要向AM申请通过审核后方可展示 + + return tradeInfo; + + } catch (Exception e) { + logger.error(this, e); + } + return null; + } + + /** + * @className:ExceptionQueueThread + * @description:异常队列线程 + * @author:Sunshine + * @date:2019年3月4日 下午4:22:09 + */ + private class ExceptionQueueThread extends Thread { + + @Override + public void run() { + try { + logger.info("异常订单处理队列检查开始:|订单队列异常数:[ {} ]", exceptionOrderQueue.size()); + while (exceptionOrderQueue.size() > 0) { + ShopOrderInfo shopOrderInfo = exceptionOrderQueue.get(0); + orderQueue.add(shopOrderInfo); + exceptionOrderQueue.remove(0); + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + +} diff --git a/src/com/since/emp/service_bak/ApiYitiao_bak.java b/src/com/since/emp/service_bak/ApiYitiao_bak.java new file mode 100644 index 0000000..d796e35 --- /dev/null +++ b/src/com/since/emp/service_bak/ApiYitiao_bak.java @@ -0,0 +1,888 @@ +package com.since.emp.service_bak; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONObject; + +import com.alibaba.fastjson.JSON; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.yit.openapi.sdk.client.ApiAccessor; +import com.yit.openapi.sdk.client.ApiContext; +import com.yit.openapi.sdk.client.BaseRequest; +import com.yit.openapi.sdk.client.ServerResponse; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_ConfirmDownload; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetOrderByPeriod; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_SearchOrderParam; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_YitOrderInfo; + +import net.sf.json.JSONArray; + +/** + * 调用一条API所有的超时时间设置都在方法:getApiAccessor中设置为30秒(connecttime,readtime) + * @className:ApiYitiao + * @description:一条平台Api接口类 + * @author:Sunshine + * @date:2019年2月11日 上午9:34:11 + */ +public class ApiYitiao_bak { + private static final Logger logger = LogManager.getLogger(ApiYitiao_bak.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + public ApiYitiao_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + threadPool = ThreadPool.getInstance(); + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + + RecatchOrderThread recatchOrderThread = new RecatchOrderThread(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(recatchOrderThread); + } + + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.name, recatchConfig.orderId); + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该平台不支持本方式抓取订单!", ""); + } + + } else { + // 使用线程池管理订单查询线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + // Timer timer_order = new Timer(); + // timer_order.schedule(ott, 1000, 5 * 60 * 1000);// 各线程间隔5分钟 + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]", platConfig.apps.get(i).key, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * + * @className:OrdersTimerTask + * @description:定时抓取订单线程 + * @author:Sunshine + * @date:2019年2月13日 下午2:45:07 + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}", LoggerRecordConstant.TIMER_TASK_LOGGER, LoggerRecordConstant.ORDER_TYPE, + this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + // cachedThreadPool.execute(thread); + threadPool.execute(thread); + // 判断店铺是否开启自动登记 当auto_aftersale_flag值为2时,执行该流程 + if (shopConfig.auto_aftersale_flag == -1) {// TODO 设置为-1表示api暂不启动自动登记售后的功能 + if (shopConfig.lastQueryRefundTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastQueryRefundTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastQueryRefundTime); + date = new Date(date.getTime() - (shopConfig.refundErrFlag ? (60000 * 20) : 0)); + shopConfig.lastQueryRefundTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // GetRefundThread grt = new GetRefundThread(platConfig.apps.get(i), shopConfig, + // shopConfig.lastQueryRefundTime, df.format(now)); + // // cachedThreadPool.execute(grt); + // threadPool.execute(grt); + } + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * + * @className:GetOrderThread + * @description:单次抓单线程 + * @author:Sunshine + * @date:2019年2月12日 上午12:01:31 + */ + class GetOrderThread extends Thread { + + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private String sellerId = ""; + private String app_key = ""; + private String app_secret = ""; + private int page_now = 1; + private HashMap tradeInfo_map = new HashMap();// 用于订单合并,存储订单信息 + private ArrayList oid_List = new ArrayList(); + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start;// 开始时间 + this.time_end = time_end;// 结束时间 + } + + @Override + public void run() { + this.getOrder(0);// 本次查询大于此id的订单,首次查询传0 + try { + for (Entry entry : tradeInfo_map.entrySet()) { + + TradeInfo tradeInfo = entry.getValue(); + + if (tradeInfo.orders.length > 1) { + logger.info("本次接口调用重复的订单号:[ {} ]", tradeInfo.tid); + } + // 等待出库 的订单 + if ("WAIT_DELIVERY".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("SIGNED ".equals(tradeInfo.status)) {// 已经交易成功 + OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + } + } + + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + sellerId = shopConfig_json.getString("tpid"); + app_key = shopConfig_json.getString("publickey"); + app_secret = shopConfig_json.getString("privatekey"); + + // list转int数组,注意list数组不可以直接转换为int数组,只能通过遍历转换。 + int[] ids = new int[oid_List.size()]; + for (int i = 0; i < oid_List.size(); i++) { + ids[i] = oid_List.get(i); + } + + if (ids.length > 0) { + // 确认下载订单 + boolean confirmDownload = confirmDownload(ids, sellerId, app_key, app_secret, platConfig.api_url); + if (confirmDownload) { + logger.info("[ {} ]:该批次订单确认下载成功!", shopConfig.name); + } else {// 确认下载订单失败重试一次 + Thread.sleep(5 * 1000); + boolean confirmDownload_next = confirmDownload(ids, sellerId, app_key, app_secret, + platConfig.api_url); + if (confirmDownload_next) { + logger.info("[ {} ]:该批次订单确认下载成功!", shopConfig.name); + } else { + logger.info("[ {} ]:该批次订单确认下载失败!", shopConfig.name); + } + + } + logger.info("本次共获取到订单数:[ {} ],订单号:[ {} ]", oid_List.size(), oid_List); + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @title: getOrder + * @description: 调用一条接口,获取订单 + */ + private void getOrder(int lastId) { + try { + logger.info("[ {} ]获取订单:[ {} ]->[ {} ],第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + // String order_status = "WAIT_DELIVERY"; + if (shopConfig.name == null) {// 判断是否有店铺信息 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + sellerId = shopConfig_json.getString("tpid"); + app_key = shopConfig_json.getString("publickey"); + app_secret = shopConfig_json.getString("privatekey"); + LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId getUnDownloadedPendingDeliveryOrder = new LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId( + lastId); + // 生产接口地址:https://open.yit.com/apigw/m.api + // 测试接口地址:https://open-test.yit.com/apigw/m.api + ApiAccessor apiAccessor = getApiAccessor(sellerId, app_key, app_secret, platConfig.api_url); + ServerResponse serverResponse = apiAccessor.fillApiResponse(getUnDownloadedPendingDeliveryOrder); + String serverResponseString = JSON.toJSONString(serverResponse); + net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(serverResponseString); + logger.info("响应信息:{}", jsonObject); + int returnCode = jsonObject.getInt("returnCode");// 平台返回状态码 0:正常返回 ,-180:SIGNATURE_ERROR 签名错误 + // ,其他为未知异常 + if (returnCode == 0) { + List orderList = getUnDownloadedPendingDeliveryOrder + .getResponse().value; + String order_jsonString = ""; + if (null != orderList) { + order_jsonString = JSON.toJSONString(orderList); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, order_jsonString); + this.parseOrderList(order_jsonString); + } else { + logger.info("[ {} ]获取订单异常:{}", shopConfig.name, order_jsonString); + return; + } + + } else if (returnCode == -180) { + logger.info("异常订单返回结果:{}", jsonObject); + logger.info("店铺:[ {} ]签名错误,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + logger.info("异常订单返回结果:{}", jsonObject); + logger.info("[ {} ]:未知的异常!{}", shopConfig.name, jsonObject); + return; + } + } + + } catch (net.sf.json.JSONException ex) { + logger.error(this, ex); + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * @title: parseOrderList + * @description: 解析获取到的订单信息 + * @param order_jsonString + * @return + */ + private void parseOrderList(String order_jsonString) { + + try { + // 1.将获取的订单遍历,遍历看是否获取完(订单总数小于200),若小于200,则本次已经获取完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传, + // 若订单总数大于200,将数据存储起来,与下次获取到的订单合并,合并完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传。 + int lastId = 0; + int count = 0;// 用于统计当次获取的订单数量 + JSONArray jsonArray = (JSONArray) JSONArray.fromObject(order_jsonString); + + int jsonArraySize = jsonArray.size(); + logger.info("本次共获取到订单数:[ {} ]", jsonArray.size()); + for (int i = 0; i < jsonArraySize; i++) { + count++; + net.sf.json.JSONObject order = jsonArray.getJSONObject(i); + net.sf.json.JSONObject yitOrderDetailInfo = order.getJSONObject("yitOrderDetailInfo"); + String tid = yitOrderDetailInfo.getString("subOrderNo"); + TradeInfo singleOrder = parseOrderInfo(order, + new ShopOrderInfo(tid, shopConfig, app_key, app_secret)); + if (singleOrder == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->{}", tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + // ids[i] = order.getInt("id");// 将本次获取的订单id放入数组,用于回传 + oid_List.add(Integer.valueOf(order.getString("id"))); + // OrderInfo orderInfo = new OrderInfo(); + if (tradeInfo_map.containsKey(singleOrder.tid)) { + TradeInfo tradeInfo = tradeInfo_map.get(singleOrder.tid); + // 将金额和数量等信息加到订单里面 + tradeInfo.num = (tradeInfo.num + singleOrder.num); + tradeInfo.money = ((Double.parseDouble(tradeInfo.money) + Double.parseDouble(singleOrder.money) + + "")); + tradeInfo.pay_money = ((Double.parseDouble(tradeInfo.pay_money) + + Double.parseDouble(singleOrder.pay_money) + "")); + tradeInfo.product_fee = ((Double.parseDouble(tradeInfo.product_fee) + + Double.parseDouble(singleOrder.product_fee) + "")); + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = singleOrder.orders[0]; + tradeInfo_map.put(tradeInfo.tid, tradeInfo); + } else { + tradeInfo_map.put(singleOrder.tid, singleOrder); + } + // 如果该批订单有200条,那么可能会有下一页,记下该页的最后一个id,用于下一页查询 + if (i == 199) { + lastId = order.getInt("id"); + } + } + // 若本次回去订单数够200条则进行下次调用 + if (count == 200) { + getOrder(lastId); + count = 0; + } + + } catch (net.sf.json.JSONException ex) { + logger.error(this, ex); + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + /** + * TODO + * @className:RecatchOrderThread + * @description:补抓订单线程 (按付款时间查询时间段内的所有订单,最多查询30天的订单) + * @author:Sunshine + * @date:2019年2月19日 上午9:56:56 + */ + class RecatchOrderThread extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end;// 付款开始时间 付款结束时间 + private int page_now = 1; + private int page_rows = 200;// 每次订单列表获取的单页条数(最大为200) + private String sellerId = ""; + private String app_key = ""; + private String app_secret = ""; + + private HashMap tradeInfo_map = new HashMap();// 用于订单合并,存储订单信息 + private ArrayList oid_List = new ArrayList(); + + public RecatchOrderThread(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(0); + + try { + + int totalCount = tradeInfo_map.size(); + logger.info("[ {} ] 根据时间本批数据总数:[ {} ]", shopConfig.name, totalCount); + if (totalCount < 1) {// 没有需要处理的订单 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + for (Entry entry : tradeInfo_map.entrySet()) { + + TradeInfo tradeInfo = entry.getValue(); + + if (tradeInfo.orders.length > 1) { + logger.info("本次接口调用重复的订单号:[ {} ]", tradeInfo.tid); + } + + // 等待出库 的订单 + if ("WAIT_DELIVERY".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else if ("SIGNED ".equals(tradeInfo.status)) { + if (!(OrderSyncs.dataParse.tradeSuccess(tradeInfo))) { + logger.info("交易成功订单|[ {} ] :处理失败!", tradeInfo.tid); + } + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + + } + + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + sellerId = shopConfig_json.getString("tpid"); + app_key = shopConfig_json.getString("publickey"); + app_secret = shopConfig_json.getString("privatekey"); + + // list转int数组,注意list数组不可以直接转换为int数组,只能通过遍历转换。 + int[] ids = new int[oid_List.size()]; + for (int i = 0; i < oid_List.size(); i++) { + ids[i] = oid_List.get(i); + } + + if (ids.length > 0) { + // 确认下载订单 + boolean confirmDownload = confirmDownload(ids, sellerId, app_key, app_secret, platConfig.api_url); + if (confirmDownload) { + logger.info("[ {} ]:该批次订单确认下载成功!", shopConfig.name); + } else {// 确认下载订单失败重试一次 + Thread.sleep(5 * 1000); + boolean confirmDownload_next = confirmDownload(ids, sellerId, app_key, app_secret, + platConfig.api_url); + if (confirmDownload_next) { + logger.info("[ {} ]:该批次订单确认下载成功!", shopConfig.name); + } else { + logger.info("[ {} ]:该批次订单确认下载失败!", shopConfig.name); + } + + } + + logger.info("本次补抓到到订单数:[ {} ],订单号:[ {} ]", oid_List.size(), oid_List); + + } + + } catch (Exception e) { + logger.error(this, e); + } + + } + + public void getOrder(int lastId) { + try { + logger.info("[ {} ]获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + // String order_status = "WAIT_DELIVERY"; + + if (shopConfig.name == null) {// 判断是否有店铺信息 + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + JSONObject shopConfig_json = new JSONObject(shopConfig.name); + sellerId = shopConfig_json.getString("tpid"); + app_key = shopConfig_json.getString("publickey"); + app_secret = shopConfig_json.getString("privatekey"); + Api_LOGISTICSOPENAPI_SearchOrderParam param = new Api_LOGISTICSOPENAPI_SearchOrderParam(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + param.lastId = lastId; + param.size = page_rows; + param.startDate = formatter.parse(time_start); + param.endDate = formatter.parse(time_end); + param.status = "WAIT_DELIVERY"; + LogisticsOpenApi_GetOrderByPeriod getOrderByPeriod = new LogisticsOpenApi_GetOrderByPeriod(param); + // 生产接口地址:https://open.yit.com/apigw/m.api + // 测试接口地址:https://open-test.yit.com/apigw/m.api + ApiAccessor apiAccessor = getApiAccessor(sellerId, app_key, app_secret, platConfig.api_url); + ServerResponse serverResponse = apiAccessor.fillApiResponse(getOrderByPeriod); + String serverResponseString = JSON.toJSONString(serverResponse); + net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(serverResponseString); + logger.info("响应信息:{}", jsonObject); + + int returnCode = jsonObject.getInt("returnCode");// 平台返回状态码 0:正常返回 ,-180:SIGNATURE_ERROR 签名错误 + // ,其他为未知异常 + if (returnCode == 0) { + List orderList = getOrderByPeriod.getResponse().value; + String order_jsonString = ""; + if (null != orderList) { + order_jsonString = JSON.toJSONString(orderList); + logger.info("[ {} ]返回订单:{}", shopConfig.name, order_jsonString); + this.parseOrderList(order_jsonString); + } else { + logger.info("[ {} ]获取订单异常:{}", shopConfig.name, order_jsonString); + return; + } + + } else if (returnCode == -180) { + logger.info("店铺:[ {} ]签名错误,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + boolean check = false; + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code, shopConfig.name); + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return; + } else { + logger.info("[ {} ]:未知的异常!{}", shopConfig.name, jsonObject); + return; + } + } + + } catch (net.sf.json.JSONException ex) { + logger.error(this, ex); + } catch (ParseException ep) { + logger.error(this, ep); + } catch (Exception e) { + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + /** + * @title: parseOrderList + * @description: 解析获取到的订单信息 + * @param order_jsonString + * @return + */ + private void parseOrderList(String order_jsonString) { + + try { + // 1.将获取的订单遍历,遍历看是否获取完(订单总数小于200),若小于200,则本次已经获取完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传, + // 若订单总数大于200,将数据存储起来,与下次获取到的订单合并,合并完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传。 + int lastId = 0; + int count = 0;// 用于统计当次获取的订单数量 + JSONArray jsonArray = (JSONArray) JSONArray.fromObject(order_jsonString); + + int jsonArraySize = jsonArray.size(); + logger.info("本次共获取到订单数:[ {} ]", jsonArray.size()); + for (int i = 0; i < jsonArraySize; i++) { + count++; + net.sf.json.JSONObject order = jsonArray.getJSONObject(i); + net.sf.json.JSONObject yitOrderDetailInfo = order.getJSONObject("yitOrderDetailInfo"); + String tid = yitOrderDetailInfo.getString("subOrderNo"); + TradeInfo singleOrder = parseOrderInfo(order, + new ShopOrderInfo(tid, shopConfig, app_key, app_secret)); + // 等待出库 的订单 + if (singleOrder == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "一条平台故障,请联系软维ERP排查", ""); + } + + logger.info("[ {} ]error:订单|[ {} ]解析订单详情错误!时间->{}", shopConfig.name, tid, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + + // ids[i] = order.getInt("id");// 将本次获取的订单id放入数组,用于回传 + oid_List.add(Integer.valueOf(order.getString("id"))); + // OrderInfo orderInfo = new OrderInfo(); + if (tradeInfo_map.containsKey(singleOrder.tid)) { + TradeInfo tradeInfo = tradeInfo_map.get(singleOrder.tid); + // 将金额和数量等信息加到订单里面 + tradeInfo.num = (tradeInfo.num + singleOrder.num); + tradeInfo.money = ((Double.parseDouble(tradeInfo.money) + Double.parseDouble(singleOrder.money) + + "")); + tradeInfo.pay_money = ((Double.parseDouble(tradeInfo.pay_money) + + Double.parseDouble(singleOrder.pay_money) + "")); + tradeInfo.product_fee = ((Double.parseDouble(tradeInfo.product_fee) + + Double.parseDouble(singleOrder.product_fee) + "")); + tradeInfo.orders = Arrays.copyOf(tradeInfo.orders, tradeInfo.orders.length + 1); + tradeInfo.orders[tradeInfo.orders.length - 1] = singleOrder.orders[0]; + tradeInfo_map.put(tradeInfo.tid, tradeInfo); + } else { + tradeInfo_map.put(singleOrder.tid, singleOrder); + } + + // 如果该批订单有200条,那么可能会有下一页,记下该页的最后一个id,用于下一页查询 + if (i == 199) { + lastId = order.getInt("id"); + } + } + // 若本次回去订单数够200条则进行下次调用 + if (count == 200) { + getOrder(lastId); + count = 0; + } + + } catch (net.sf.json.JSONException ex) { + logger.error(this, ex); + } catch (Exception e) { + logger.error(this, e); + } + } + + } + + /** + * + * @title: parseOrder + * @description: 解析订单详情 + * @param order + * @return + */ + private TradeInfo parseOrderInfo(net.sf.json.JSONObject order, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + OrderInfo orderInfo = new OrderInfo(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + orderInfo.oid = order.getString("id");// 订单商品id,用于分页和确认下载订单 + // 订单详情信息 + net.sf.json.JSONObject yitOrderDetailInfo = order.getJSONObject("yitOrderDetailInfo"); + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopOrderInfo.shopConfig.company_code; + tradeInfo.shop_code = shopOrderInfo.shopConfig.code; + tradeInfo.delivery_mode_id = shopOrderInfo.shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopOrderInfo.shopConfig.storage_code; + tradeInfo.company_type = shopOrderInfo.shopConfig.company_type; + tradeInfo.pay_percent = shopOrderInfo.shopConfig.pay_percent; + tradeInfo.obm_company_code = "";// 品牌商公司编码,只有代发订单有值 + tradeInfo.invoice_type = yitOrderDetailInfo.getBoolean("hasInvoice") ? 5 : 0;// 是否能开发票 + JSONArray note = yitOrderDetailInfo.getJSONArray("note");// 外部备注 + for (int i = 0; i < note.size(); i++) { + tradeInfo.buyer_message = tradeInfo.buyer_message + note.getString(i); + } + tradeInfo.receiver_zip = ""; + tradeInfo.seller_memo = ""; + long orderPayTime = yitOrderDetailInfo.getLong("orderPayTime"); + tradeInfo.pay_time = sdf.format(new Date(orderPayTime));// 支付时间 + tradeInfo.status = yitOrderDetailInfo.getString("status");// 订单状态 CANCEL 已取消, CONFIRMED 已确认, SIGNED 已签收, + // STOCK_OUT 已发货, WAIT_DELIVERY 待发货 + tradeInfo.tid = yitOrderDetailInfo.getString("subOrderNo");// 一条订单编号 + + // 订单商品信息 + net.sf.json.JSONObject yitProductInfo = order.getJSONObject("yitProductInfo"); + orderInfo.sku_id = yitProductInfo.getString("itemId");// 一条sku + orderInfo.sku_properties_name = yitProductInfo.getString("optionText");// 商品规格 + orderInfo.title = yitProductInfo.getString("productName");// 商品名称 + orderInfo.num = yitProductInfo.getInt("quantity");// 数量 + orderInfo.total_fee = (yitProductInfo.getInt("totalPrice") / 100.0) + "";// 总价 (单位:分) + orderInfo.price = (yitProductInfo.getInt("unitPrice") / 100.0) + "";// 单价 (单位:分) + orderInfo.platform_seller_code = yitProductInfo.getString("vendorSku");// 供应商sku + orderInfo.adjust_fee = "0"; + orderInfo.discount_fee = "" + 0; + orderInfo.divide_order_fee = "0"; + orderInfo.payment = orderInfo.total_fee; + orderInfo.part_mjz_discount = "0"; + tradeInfo.post_fee = "0"; + tradeInfo.num = orderInfo.num;// 商品购买数量 + // 收件人信息 + net.sf.json.JSONObject yitReceiverInfo = order.getJSONObject("yitReceiverInfo"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = yitReceiverInfo.getString("province");// 省 + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.receiver_state = tradeInfo.receiver_state.replaceAll("市", ""); + } + tradeInfo.receiver_city = yitReceiverInfo.getString("city");// 市 + tradeInfo.receiver_name = yitReceiverInfo.getString("recipient");// 收货人 + tradeInfo.buyer_nick = tradeInfo.receiver_name;// 买家昵称 + tradeInfo.receiver_phone = yitReceiverInfo.getString("phone");// 收货人手机 + tradeInfo.receiver_mobile = yitReceiverInfo.getString("phone");// 收货人电话 + + String fullAddress = yitReceiverInfo.getString("fullAddress");// 详细地址 + tradeInfo.receiver_district = yitReceiverInfo.getString("region");// 区 + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + fullAddress;// 收货人详细地址 + tradeInfo.adjust_fee = "0"; + tradeInfo.platform_code = "020"; + tradeInfo.pay_money = orderInfo.total_fee;// 买家实付金额 + tradeInfo.money = orderInfo.total_fee;// 商家实收金额 + tradeInfo.product_fee = orderInfo.total_fee; + tradeInfo.discount_fee = "0.0"; + + OrderInfo[] orders = new OrderInfo[1]; + orders[0] = orderInfo; + tradeInfo.orders = orders; + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + + } + + /** + * @param sellerId + * @param app_key + * @param app_secret + * @param api_url + * @return: com.yit.openapi.sdk.client.ApiAccessor + * @description: 一条账户校验 + * @date: 2019/9/5 15:47 + */ + private ApiAccessor getApiAccessor(String sellerId, String app_key, String app_secret, String api_url) { + ApiAccessor apiAccessor = null; + try { + ApiContext context = ApiContext.getCurrent(); + context.setThirdPartyId(sellerId); + context.setClientPK(app_key, app_secret); + apiAccessor = new ApiAccessor(context, 30000, 30000, api_url); + return apiAccessor; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + /** + * + * @title: confirmDownload + * @description: 根据订单商品id确认订单已下载 + * @param ids 确认已下载的订单商品id + */ + private boolean confirmDownload(int[] ids, String sellerId, String app_key, String app_secret, String api_url) { + try { + LogisticsOpenApi_ConfirmDownload confirmDownload = new LogisticsOpenApi_ConfirmDownload(ids); + ApiAccessor apiAccessor = getApiAccessor(sellerId, app_key, app_secret, api_url); + ServerResponse serverResponse = apiAccessor.fillApiResponse(new BaseRequest[] { confirmDownload }); + String serverResponseString = JSON.toJSONString(serverResponse); + net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(serverResponseString); + logger.info("确认下载订单响应信息:{}", jsonObject); + // 平台返回状态码 0:正常返回 ,-180:SIGNATURE_ERROR 签名错误 + // ,其他为未知异常 + int returnCode = jsonObject.getInt("returnCode"); + if (returnCode == 0) { + return confirmDownload.getResponse().value; + + } else if (returnCode == -180) { + logger.info("签名错误!{}", jsonObject); + return false; + } else { + logger.info("未知的异常!{}", jsonObject); + return false; + } + } catch (Exception e) { + logger.error(this, e); + return false; + } + } + +} diff --git a/src/com/since/emp/service_bak/ApiYouzan_bak.java b/src/com/since/emp/service_bak/ApiYouzan_bak.java new file mode 100644 index 0000000..be8f01c --- /dev/null +++ b/src/com/since/emp/service_bak/ApiYouzan_bak.java @@ -0,0 +1,937 @@ +package com.since.emp.service_bak; + +import java.sql.SQLException; +import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.http.entity.ContentType; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONException; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DeliveryArea; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RecatchConfig; +import com.since.emp.base.ShopOrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.base.constant.LoggerRecordConstant; +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.youzan.open.sdk.client.auth.Token; +import com.youzan.open.sdk.client.core.DefaultYZClient; +import com.youzan.open.sdk.client.core.YZClient; +import com.youzan.open.sdk.exception.KDTException; +import com.youzan.open.sdk.gen.v3_0_0.api.YouzanTradeGet; +import com.youzan.open.sdk.gen.v3_0_0.api.YouzanTradesSoldGet; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetParams; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetParams; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult.AdjustFee; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult.TradeDetailV2; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult.TradeOrderV2; +import com.youzan.open.sdk.util.http.DefaultHttpClient; +import com.youzan.open.sdk.util.http.HttpClient; + +/** + * 有赞API请求接口默认设置连接超时时长为2秒,读超时时长为10秒,提供显示设置方法,目前调用未更改 + * + * ApiJingdong 有赞api接口类 + * + * @author Lewis + * + */ +public class ApiYouzan_bak { + private static final Logger logger = LogManager.getLogger(ApiYouzan_bak.class); + private PlatConfig platConfig; + private RecatchConfig recatchConfig; + + private List payServiceTypeDic; + + private ThreadPoolExecutor threadPool;// 弃用executors创建线程池,改为ThreadPoolExecutors创建 + private ScheduledThreadPoolExecutor scheduledThreadPool; + + /* + * public class ShopOrderInfo { String tid; ShopConfig shopConfig; String + * app_key; String app_secret; + * + * public ShopOrderInfo(String tid, ShopConfig shopConfig, String app_key, + * String app_secret) { this.tid = tid; this.shopConfig = shopConfig; + * this.app_key = app_key; this.app_secret = app_secret; } } + */ + + private class Dic { + String code; + String name; + + public Dic(String code, String name) { + this.code = code; + this.name = name; + } + } + + private void initDic() { + payServiceTypeDic = Collections.synchronizedList(new ArrayList()); + payServiceTypeDic.add(new Dic("WEIXIN", "8")); + payServiceTypeDic.add(new Dic("WEIXIN_DAIXIAO", "8")); + payServiceTypeDic.add(new Dic("ALIPAY", "6")); + payServiceTypeDic.add(new Dic("BANKCARDPAY", "5")); + payServiceTypeDic.add(new Dic("PEERPAY", "14")); + payServiceTypeDic.add(new Dic("CODPAY", "14")); + payServiceTypeDic.add(new Dic("BAIDUPAY", "14")); + payServiceTypeDic.add(new Dic("PRESENTTAKE", "14")); + payServiceTypeDic.add(new Dic("COUPONPAY", "14")); + payServiceTypeDic.add(new Dic("BULKPURCHASE", "14")); + payServiceTypeDic.add(new Dic("MERGEDPAY", "14")); + payServiceTypeDic.add(new Dic("ECARD", "14")); + } + + public ApiYouzan_bak(PlatConfig platConfig, RecatchConfig recatchConfig) { + this.platConfig = platConfig; + this.recatchConfig = recatchConfig; + try { + this.initDic(); + threadPool = ThreadPool.getInstance(); + + logger.info("订单详情获取线程启动"); + + if ((!(recatchConfig.starTime == null || "".equals(recatchConfig.starTime)) + && !(recatchConfig.endTime == null || "".equals(recatchConfig.endTime))) + || !((recatchConfig.orderId == null || "".equals(recatchConfig.orderId)))) { + + // 根据订单生成时间抓取订单/* + if (recatchConfig.starTime.length() > 0 && recatchConfig.endTime.length() > 0) { + GetOrderThread2 thread2 = new GetOrderThread2(platConfig.apps.get(0).shops.get(0), + recatchConfig.starTime, recatchConfig.endTime); + threadPool.execute(thread2); + } + // 根据系统单号抓取订单 + if (recatchConfig.orderId.length() > 0) { + ShopOrderInfo shopOrderInfo = new ShopOrderInfo(recatchConfig.orderId, + platConfig.apps.get(0).shops.get(0), platConfig.apps.get(0).key, + platConfig.apps.get(0).secret); + logger.info("[ {} ] 根据订单号抓取订单:[ {} ]", shopOrderInfo.shopConfig.name, recatchConfig.orderId); + getOrderInfo(shopOrderInfo); + } + + } else { + + // ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // + // 使用线程池管理订单查询线程 + // 启动定时更新店铺及相关apps,并启动各店铺抓单线程 + scheduledThreadPool = ScheduledThreadPool.getInstance(); + // scheduledThreadPool.setCorePoolSize(scheduledThreadPool.getCorePoolSize() + + // 1); + OrdersTimerTask ott = new OrdersTimerTask(threadPool); + scheduledThreadPool.scheduleAtFixedRate(ott, 1000, 5 * 60 * 1000, TimeUnit.MILLISECONDS); + // handle exception + for (int i = 0; i < platConfig.apps.size(); i++) { + String shopName = null; + for (int j = 0; j < platConfig.apps.get(i).shops.size(); j++) { + if (j == 0) { + shopName = platConfig.apps.get(i).shops.get(j).name; + } else { + shopName = shopName + "," + platConfig.apps.get(i).shops.get(j).name; + } + } + logger.info("app:[ {} ]启动,抓取店铺:[ {} ]" + platConfig.apps.get(i).key, shopName); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + + /** + * 定时抓取时间段内订单列表线程 + * + * @author Lewis + * + */ + private class OrdersTimerTask extends Thread { + + private ThreadPoolExecutor threadPool; + + // ExecutorService cachedThreadPool; + public OrdersTimerTask(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } + + @Override + public void run() { + try { + logger.info("{}{},线程ID:{}",LoggerRecordConstant.TIMER_TASK_LOGGER,LoggerRecordConstant.ORDER_TYPE, this.getId()); + platConfig = OrderSyncs.getAppMessage(platConfig); + /** + * 由于更新token线程更新了token,可能导致本次抓单的token成为旧的token,导致session_key异常的报文,不再使用线程更新token,改为刷新的方法, + * 当刷新token方法执行完所有操作,再执行抓单等接下来的步骤 Lewis date:2019-06-18 + */ +// UpdateTokenAndRefreshToken updateTokenThread = new UpdateTokenAndRefreshToken(); +// threadPool.execute(updateTokenThread); + dealUpdateToken(); + + for (int i = 0; i < platConfig.apps.size(); i++) { + List shops = Collections.synchronizedList(new ArrayList()); + shops = platConfig.apps.get(i).shops; + for (int j = 0; j < shops.size(); j++) { + // 初始时,当前时间往前init_time小时 + ShopConfig shopConfig = new ShopConfig(); + shopConfig = shops.get(j); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date now = new Date(); + if (shopConfig.lastCatchTime == null) { + Date beforeDate = new Date(now.getTime() - 60000 * (shopConfig.init_time)); + shopConfig.lastCatchTime = df.format(beforeDate); + } else { + try { + // 时间覆盖式,下次抓单时,开始时间往前覆盖20分钟 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() - (shopConfig.errFlag ? (60000 * 20) : 0)); + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } catch (ParseException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + // 启动抓单线程 + GetOrderThread thread = new GetOrderThread(platConfig.apps.get(i), shopConfig, + shopConfig.lastCatchTime, df.format(now)); + threadPool.execute(thread); + } + } + + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread extends Thread { + public AppConfig appConfig; + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread(AppConfig appConfig, ShopConfig shopConfig, String time_start, String time_end) { + this.appConfig = appConfig; + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ]获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + YZClient client = new DefaultYZClient(new Token(shopConfig.session_key)); // new + // Sign(appKey, + // appSecret) + YouzanTradesSoldGetParams youzanTradesSoldGetParams = new YouzanTradesSoldGetParams(); + + youzanTradesSoldGetParams.setStartUpdate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + youzanTradesSoldGetParams.setEndUpdate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + youzanTradesSoldGetParams.setPageSize(Long.valueOf(page_rows)); + youzanTradesSoldGetParams.setPageNo(Long.valueOf(page_now)); + youzanTradesSoldGetParams.setStatus("WAIT_SELLER_SEND_GOODS"); + + YouzanTradesSoldGet youzanTradesSoldGet = new YouzanTradesSoldGet(); + youzanTradesSoldGet.setAPIParams(youzanTradesSoldGetParams); + YouzanTradesSoldGetResult result = client.invoke(youzanTradesSoldGet); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, new GsonBuilder().disableHtmlEscaping().create().toJson(result)); + this.parseOrderList(result); + client.close(); + } catch (KDTException e) { + + logger.info("异常订单返回结果:{}", e); + logger.error("批量查询订单异常:{}", e); + + logger.error(this, e); + String errMsg = e.toString(); + // 处理查询的错误信息 + if (errMsg.indexOf("参数 token 无效") > -1) { + logger.info("店铺:[ {} ]session_key过期,将不再抓单->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + // 更新数据库中该店铺的使用状态 + OrderSyncs.updateShopStatus(shopConfig.code,shopConfig.name); + + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig sc = appConfig.shops.get(k); + if (shopConfig.code.equals(sc.code)) { + platConfig.apps.get(j).shops.remove(k); + check = true; + break; + } + } + if (check) { + if (appConfig.shops.size() == 0) { + platConfig.apps.remove(j); + } + break; + } + } + return;// 如果是session_key不能用,放过该批订单,等五分钟后更新了店铺的session_key后再查询就可以了 + } else if (errMsg.indexOf("每次可搜索3个月订单记录,请重新选择起止时间.") > -1) { + try { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + Date date = df.parse(shopConfig.lastCatchTime); + date = new Date(date.getTime() + 60 * 60 * 1000);// 当一个店铺的订单查询超过平台的规定跨度,则往后推一个小时 + shopConfig.lastCatchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + + } catch (ParseException e2) { + logger.error(this, e); + } catch (Exception e2) { + logger.error(this, e); + } + + } + shopConfig.errFlag = false; + return; + } catch (Exception e) { + logger.error("批量查询订单异常:{}", e); + logger.error(this, e); + shopConfig.errFlag = false; + } + + } + + /** + * parseOrderList 解析有赞返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(YouzanTradesSoldGetResult result) { + try { + long totalCount = result.getTotalResults(); + logger.info("[ {} ]根据时间本批数据总数:[ {} ],剩余未处理数:[ {} ]", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + shopConfig.errFlag = false; + return; + } + + // 将订单移至队列,等待获取详细信息 + TradeDetailV2[] trades = result.getTrades(); + for (int i = 0; i < trades.length; i++) { + TradeDetailV2 trade = trades[i]; + String orderCode = trade.getTid(); + // orderQueue.add(new ShopOrderInfo(orderCode, + // shopConfig,appConfig.key,appConfig.secret)); + + TradeInfo tradeInfo = parseBatchTradeInfo(trade, + new ShopOrderInfo(orderCode, shopConfig, appConfig.key, appConfig.secret)); + if (tradeInfo == null) { + logger.info("error:解析订单详情错误,tid|[ {} ],将加入异常处理队列时间->", orderCode, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", tradeInfo.tid); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } else { + shopConfig.lastCatchTime = this.time_end;// 抓单成功后更新上次抓单时间 + shopConfig.errFlag = true; + } + } catch (JSONException e) { + logger.error(this, e); + shopConfig.errFlag = false; + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * 单次抓单线程(适用于根据订单生成时间抓单) 采用线程模式避免出错后,影响主线程 + * + * @author Lewis + * + */ + class GetOrderThread2 extends Thread { + private ShopConfig shopConfig; + private String time_start, time_end; + private int page_count = 1; + private int page_now = 1; + private int page_rows = 100;// 每次订单列表获取的单页条数50-100 + + public GetOrderThread2(ShopConfig shopConfig, String time_start, String time_end) { + this.shopConfig = shopConfig; + this.time_start = time_start; + this.time_end = time_end; + } + + @Override + public void run() { + this.getOrder(); + } + + private void getOrder() { + try { + logger.info("[ {} ] 获取订单:{}->{},第[ {} ]页", shopConfig.name, time_start, time_end, page_now); + YZClient client = new DefaultYZClient(new Token(shopConfig.session_key)); // new + // Sign(appKey, + // appSecret) + YouzanTradesSoldGetParams youzanTradesSoldGetParams = new YouzanTradesSoldGetParams(); + + youzanTradesSoldGetParams + .setStartCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_start)); + youzanTradesSoldGetParams.setEndCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time_end)); + youzanTradesSoldGetParams.setPageSize(Long.valueOf(page_rows)); + youzanTradesSoldGetParams.setPageNo(Long.valueOf(page_now)); + youzanTradesSoldGetParams.setStatus("WAIT_SELLER_SEND_GOODS"); + + YouzanTradesSoldGet youzanTradesSoldGet = new YouzanTradesSoldGet(); + youzanTradesSoldGet.setAPIParams(youzanTradesSoldGetParams); + YouzanTradesSoldGetResult result = client.invoke(youzanTradesSoldGet); + logger.info("[ {} ] 返回订单:{}", shopConfig.name, new GsonBuilder().disableHtmlEscaping().create().toJson(result)); + this.parseOrderList(result); + client.close(); + } catch (KDTException e) { + logger.error(this, e); + return; + } catch (Exception e) { + logger.error(this, e); + } + + } + + /** + * parseOrderList 解析一号店返回的订单列表数据 + * + * @param jsonStr + */ + private void parseOrderList(YouzanTradesSoldGetResult result) { + try { + long totalCount = result.getTotalResults(); + logger.info("[ {} ] 根据时间本批数据总数:[ {}],剩余未处理数:[ {} ]", shopConfig.name, totalCount, + (totalCount - page_rows * (this.page_now - 1))); + if (totalCount < 1) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "该时间段未查询到未发货订单!", ""); + } + return; + } + + if (totalCount > recatchConfig.once_max_replenish_order_count && recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "当前时间段可补录订单数超过平台限制!", ""); + return; + } + + // 将订单移至队列,等待获取详细信息 + TradeDetailV2[] trades = result.getTrades(); + for (int i = 0; i < trades.length; i++) { + TradeDetailV2 trade = trades[i]; + String orderCode = trade.getTid(); + // orderQueue.add(new ShopOrderInfo(orderCode, + // shopConfig,appConfig.key,appConfig.secret)); + + TradeInfo tradeInfo = parseBatchTradeInfo(trade, new ShopOrderInfo(orderCode, shopConfig, + platConfig.apps.get(0).key, platConfig.apps.get(0).secret)); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "拼多多平台故障,请联系软维ERP排查", ""); + } + logger.info("[ {} ] error:解析订单详情错误时间->{}", shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + continue; + } + if ("WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) { + logger.info("消息处理成功|[ {} ],已转交数据处理中心", tradeInfo.tid); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + } + + this.page_count = (int) Math.ceil((double) totalCount / page_rows);// 计算分页总数 + + if (this.page_now < this.page_count) { + this.page_now++; + this.getOrder();// 抓取下一页 + } + } catch (JSONException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + } + } + + /** + * getOrderInfo 调用API接口,根据订单号获取订单详情 + * + * @param ShopOrderInfo shopOrderInfo + * @return true/false + */ + private boolean getOrderInfo(ShopOrderInfo shopOrderInfo) { + String tradeInfoString = ""; + try { + YZClient client = new DefaultYZClient(new Token(shopOrderInfo.shopConfig.session_key)); // new + // Sign(appKey, + // appSecret) + YouzanTradeGetParams youzanTradeGetParams = new YouzanTradeGetParams(); + + youzanTradeGetParams.setTid(shopOrderInfo.tid); + + YouzanTradeGet youzanTradeGet = new YouzanTradeGet(); + youzanTradeGet.setAPIParams(youzanTradeGetParams); + YouzanTradeGetResult result = client.invoke(youzanTradeGet); + logger.info("[ {} ] 返回订单:{}", shopOrderInfo.shopConfig.name, new GsonBuilder().disableHtmlEscaping().create().toJson(result)); + com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult.TradeDetailV2 trade = result.getTrade(); + String orderCode = trade.getTid(); + TradeInfo tradeInfo = parseSingleTradeInfo(trade, new ShopOrderInfo(orderCode, shopOrderInfo.shopConfig, + shopOrderInfo.app_key, shopOrderInfo.app_secret)); + client.close(); + if (tradeInfo == null) { + // 提交任务补抓单程序的结果 + if (recatchConfig.type == 1 || recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "有赞平台故障,请联系软维ERP排查", ""); + } + logger.info("[ {} ] error:解析订单详情错误时间->{}", shopOrderInfo.shopConfig.name, + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } + logger.info("消息处理成功|[ {} ],已转交数据处理中心", tradeInfo.tid); + if ("WAIT_SELLER_SEND_GOODS".equals(tradeInfo.status)) { + OrderSyncs.dataParse.tradeQueue.add(tradeInfo);// 发送tradeInfo至订单数据处理队列 + } else { + if (recatchConfig.type == 1) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "目前只支持待发货订单补录", ""); + } + } + if (recatchConfig.type == 3 || recatchConfig.type == 4) { + OrderSyncs.updateReplenishResult(recatchConfig.replenish_code, "", ""); + } + return true; + } catch (Exception e) { + logger.error(this, e); + logger.info("[ {} ] API返回订单数据:{}", shopOrderInfo.shopConfig.name, tradeInfoString); + return false; + } + + } + + /** + * parseBatchTradeInfo 解析订单详情 + * + * @param String jsonString + * @param ShopConfig shopConfig + */ + private TradeInfo parseBatchTradeInfo(TradeDetailV2 trade, ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopOrderInfo.shopConfig.company_code; + tradeInfo.shop_code = shopOrderInfo.shopConfig.code; + tradeInfo.delivery_mode_id = shopOrderInfo.shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopOrderInfo.shopConfig.storage_code; + tradeInfo.company_type = shopOrderInfo.shopConfig.company_type; + tradeInfo.pay_percent = shopOrderInfo.shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = trade.getTid(); + tradeInfo.status = trade.getStatus(); + tradeInfo.num = trade.getNum().intValue(); + tradeInfo.discount_fee = trade.getDiscountFee().toString(); + tradeInfo.money = trade.getPayment().toString(); + tradeInfo.pay_money = trade.getPayment().toString(); + tradeInfo.product_fee = trade.getTotalFee().toString(); + tradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getCreated()); + tradeInfo.pay_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getPayTime()); + tradeInfo.platform_modify_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getUpdateTime()); + + // 费用调整对象 + AdjustFee adjustFee = trade.getAdjustFee(); + Float post_fee = 0.0F; + post_fee = adjustFee.getPostChange(); + if (post_fee == 0.0f) { + tradeInfo.post_fee = trade.getOriginalPostFee().toString(); + } else { + tradeInfo.post_fee = post_fee.toString(); + } + + tradeInfo.buyer_nick = trade.getReceiverName(); + // tradeInfo.alipay_id = orderDetail.getString("pin"); + tradeInfo.receiver_name = trade.getReceiverName(); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = trade.getReceiverState(); + + /* + * 省份匹配暂不确定是否需要 int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, + * tradeInfo.receiver_state); if (diccode == 2) { tradeInfo.receiver_state += + * "省"; } else if (diccode == 3) { tradeInfo.receiver_state += "自治区"; } else if + * (diccode == 4) { tradeInfo.receiver_state += "回族自治区"; } else if (diccode == + * 5) { tradeInfo.receiver_state += "维吾尔自治区"; } else if (diccode == 6) { + * tradeInfo.receiver_state += "壮族自治区"; } + */ + /** + * 根据店铺设置匹配发货的快递 + */ + if (!"".equals(shopOrderInfo.shopConfig.delivery_area_setting)) { + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + List delivery_area_setting_list = gson + .fromJson(shopOrderInfo.shopConfig.delivery_area_setting, new TypeToken>() { + }.getType()); + for (int i = 0; i < delivery_area_setting_list.size(); i++) { + DeliveryArea delivery_area_setting_item = delivery_area_setting_list.get(i); + int delivery_mode_id = delivery_area_setting_item.delivery_mode_id; + String areas = delivery_area_setting_item.areas; + if (areas.indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.delivery_mode_id = delivery_mode_id; + break; + } + } + } + tradeInfo.receiver_city = trade.getReceiverCity(); + tradeInfo.receiver_district = trade.getReceiverDistrict(); + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + trade.getReceiverAddress(); + tradeInfo.receiver_mobile = trade.getReceiverMobile(); + tradeInfo.receiver_phone = ""; + tradeInfo.buyer_message = trade.getBuyerMessage(); + tradeInfo.seller_memo = trade.getTradeMemo(); + tradeInfo.adjust_fee = adjustFee.getChange().toString(); + + String payServiceType = trade.getPayType(); + String dicname = getDicName(payServiceTypeDic, payServiceType); + tradeInfo.pay_mode_id = dicname.equals("") ? 14 : Integer.parseInt(dicname); + tradeInfo.type = ""; + // 有赞 + tradeInfo.platform_code = "011"; + + // 发票 + tradeInfo.invoice_type = 0; + + // 商品 + TradeOrderV2[] orders = trade.getOrders(); + int length = orders.length; + tradeInfo.orders = new OrderInfo[length]; + for (int i = 0; i < length; i++) { + TradeOrderV2 order = orders[i]; + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = order.getOuterSkuId() == null ? "" : order.getOuterSkuId(); + orderInfo.sku_id = order.getSkuId().toString(); + orderInfo.num = order.getNum().intValue(); + orderInfo.price = order.getPrice().toString(); + orderInfo.total_fee = order.getTotalFee().toString(); + orderInfo.discount_fee = order.getDiscountFee().toString(); + orderInfo.payment = order.getPayment().toString(); + orderInfo.title = order.getTitle(); + orderInfo.adjust_fee = adjustFee.getChange().toString(); + orderInfo.sku_id = order.getSkuId() + ""; + orderInfo.productItemID_dd = order.getItemId() + ""; + orderInfo.gift_type = 1; + + tradeInfo.orders[i] = orderInfo; + } + + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private TradeInfo parseSingleTradeInfo( + com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult.TradeDetailV2 trade, + ShopOrderInfo shopOrderInfo) { + try { + TradeInfo tradeInfo = new TradeInfo(); + + // 订单 + tradeInfo.trade_type2 = recatchConfig.type; + tradeInfo.replenish_code = recatchConfig.replenish_code; + tradeInfo.company_code = shopOrderInfo.shopConfig.company_code; + tradeInfo.shop_code = shopOrderInfo.shopConfig.code; + tradeInfo.delivery_mode_id = shopOrderInfo.shopConfig.delivery_mode_id; + tradeInfo.storage_code = shopOrderInfo.shopConfig.storage_code; + tradeInfo.company_type = shopOrderInfo.shopConfig.company_type; + tradeInfo.pay_percent = shopOrderInfo.shopConfig.pay_percent; + tradeInfo.obm_company_code = ""; + tradeInfo.tid = trade.getTid(); + tradeInfo.status = trade.getStatus(); + tradeInfo.num = trade.getNum().intValue(); + tradeInfo.discount_fee = trade.getDiscountFee().toString(); + tradeInfo.money = trade.getPayment().toString(); + tradeInfo.pay_money = trade.getPayment().toString(); + tradeInfo.product_fee = trade.getTotalFee().toString(); + tradeInfo.created = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getCreated()); + tradeInfo.pay_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getPayTime()); + tradeInfo.platform_modify_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trade.getUpdateTime()); + + // 费用调整对象 + com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult.AdjustFee adjustFee = trade.getAdjustFee(); + Float post_fee = 0.0F; + post_fee = adjustFee.getPostChange(); + if (post_fee == 0.0f) { + tradeInfo.post_fee = trade.getOriginalPostFee().toString(); + } else { + tradeInfo.post_fee = post_fee.toString(); + } + + tradeInfo.buyer_nick = trade.getReceiverName(); + // tradeInfo.alipay_id = orderDetail.getString("pin"); + tradeInfo.receiver_name = trade.getReceiverName(); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = trade.getReceiverState(); + + /* + * 省份匹配暂不确定是否需要 int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, + * tradeInfo.receiver_state); if (diccode == 2) { tradeInfo.receiver_state += + * "省"; } else if (diccode == 3) { tradeInfo.receiver_state += "自治区"; } else if + * (diccode == 4) { tradeInfo.receiver_state += "回族自治区"; } else if (diccode == + * 5) { tradeInfo.receiver_state += "维吾尔自治区"; } else if (diccode == 6) { + * tradeInfo.receiver_state += "壮族自治区"; } + */ + tradeInfo.receiver_city = trade.getReceiverCity(); + tradeInfo.receiver_district = trade.getReceiverDistrict(); + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + trade.getReceiverAddress(); + tradeInfo.receiver_mobile = trade.getReceiverMobile(); + tradeInfo.receiver_phone = ""; + tradeInfo.buyer_message = trade.getBuyerMessage(); + tradeInfo.seller_memo = trade.getTradeMemo(); + tradeInfo.adjust_fee = "0"; + + String payServiceType = trade.getPayType(); + String dicname = getDicName(payServiceTypeDic, payServiceType); + tradeInfo.pay_mode_id = dicname.equals("") ? 14 : Integer.parseInt(dicname); + tradeInfo.type = ""; + + // 发票 + tradeInfo.invoice_type = 0; + + // 商品 + com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult.TradeOrderV2[] orders = trade.getOrders(); + int length = orders.length; + tradeInfo.orders = new OrderInfo[length]; + for (int i = 0; i < length; i++) { + com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradeGetResult.TradeOrderV2 order = orders[i]; + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = order.getOuterSkuId() == null ? "" : order.getOuterSkuId(); + orderInfo.sku_id = order.getSkuId().toString(); + orderInfo.num = order.getNum().intValue(); + orderInfo.price = order.getPrice().toString(); + orderInfo.total_fee = order.getTotalFee().toString(); + orderInfo.discount_fee = order.getDiscountFee().toString(); + orderInfo.payment = order.getPayment().toString(); + orderInfo.title = order.getTitle(); + orderInfo.adjust_fee = "0"; + + tradeInfo.orders[i] = orderInfo; + } + return tradeInfo; + } catch (Exception e) { + logger.error(this, e); + return null; + } + } + + private String getDicName(List dics, String code) throws Exception { + for (int i = 0; i < dics.size(); i++) { + Dic dic = dics.get(i); + if (code.equals(dic.code)) { + return dic.name; + } + } + return ""; + } + + /** + * + * @ClassName:UpdateTokenAndRefreshToken + * @Description:用户更新有赞平台的token以及refresh_token(token过期时间为7天,refresh_token过期时间为28天 注意,刷新token同事也会刷新refresh_token) + * 已知有赞平台刷新token,旧的token即时作废,刷新token文档:https://doc.youzanyun.com/doc#/content/27027/27068 + * @Author:Luke + * @Date:2018年12月4日 上午9:46:37 + */ + + private void dealUpdateToken() { + HttpClient httpClient = null; + try { + for (int i = 0; i < platConfig.updateTokenList.size(); i++) { + + UpdateMessage um = platConfig.updateTokenList.get(i); + String expires_time = um.expires_time; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expires_time_sdf = sdf.parse(expires_time).getTime(); + long now_time_sdf = System.currentTimeMillis(); + if ((expires_time_sdf - now_time_sdf <= 2 * 60 * 60 * 1000) && (expires_time_sdf - now_time_sdf > 0)) {// 判断小于两个个小时的话更新 + + String shop_code = um.shop_code; + String shop_name = um.shop_name; + String client_id = um.app_key; + String client_secret = um.app_secret; + String refresh_token = um.refresh_token; + + try { + httpClient = new DefaultHttpClient(); + HttpClient.Params params = HttpClient.Params.custom().add("client_id", client_id) + .add("client_secret", client_secret).add("grant_type", "refresh_token") + .add("refresh_token", refresh_token) + .setContentType(ContentType.APPLICATION_FORM_URLENCODED).build(); + String result = httpClient.post("https://open.youzan.com/oauth/token", params); + JSONObject json = new JSONObject(result); + if (json.has("access_token")) { + String access = json.getString("access_token"); + String refresh = json.getString("refresh_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 2 * 60 * 60) {// 如果授权码的时效不足两个小时,即购买在两小时内到期,不做更新 + updateNewToken(shop_name, shop_code, access, refresh, expiresIn, now_time_sdf); + + } else { + logger.info("店铺:[ {} ],刷新码到期,放弃刷新", shop_name); + } + } else { + logger.info("店铺[ {} ]刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shop_name, result); + } + + } catch (Exception e) { + logger.info("店铺:[ {} ]刷新令牌失败", shop_name); + logger.error(this, e); + } + } + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试"); + } + } + + private void updateNewToken(String shop_name, String shop_code, String access, String refresh, long expiresIn, + long now_time_sdf) { + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + conn = dbpc.getConnection(); + statement = conn.createStatement(); + /** + * 更新内存的店铺授权信息,然后更新数据库,以防数据库更新出现问题,导致影响抓单 + */ + // 更新相关店铺的sessionkey + boolean check = false; + for (int j = 0; j < platConfig.apps.size(); j++) { + AppConfig appConfig = platConfig.apps.get(j); + for (int k = 0; k < appConfig.shops.size(); k++) { + ShopConfig shopConfig = appConfig.shops.get(k); + if (shop_code.equals(shopConfig.code)) { + platConfig.apps.get(j).shops.get(k).session_key = access; + check = true; + break; + } + } + if (check) { + break; + } + } + String expiresIn_sdf = sdf.format(new Date(expiresIn * 1000 + now_time_sdf)); + String sql = "update tb_shop set session_key='" + access + "',expires_time='" + expiresIn_sdf + + "',refresh_token='" + refresh + "' where code = '" + shop_code + "'"; + if (statement.executeUpdate(sql) == 0) { + logger.info("店铺:[ {} ],刷新令牌获取成功,写入数据库失败!", shop_name); + } else { + logger.info("店铺:[ {} ],刷新令牌成功,已写入数据库!", shop_name); + + } + + } catch (SQLException e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,sql执行异常!"); + /** + * 当sql异常的时候,休眠五秒,重试一次 + */ + try { + Thread.sleep(5 * 1000); + updateNewToken(shop_name, shop_code, refresh, access, expiresIn, now_time_sdf); + } catch (Exception e2) { + logger.error(this, e); + logger.info("店铺刷新令牌再次异常,sql执行异常!"); + } + } catch (Exception e) { + logger.error(this, e); + logger.info("店铺刷新令牌异常,将在5分钟后重试!"); + } finally { + + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + conn = null; + } + dbpc = null; + + } + } + +} \ No newline at end of file diff --git a/src/com/since/emp/taobao/MsgServiceClient.java b/src/com/since/emp/taobao/MsgServiceClient.java new file mode 100644 index 0000000..ecf5408 --- /dev/null +++ b/src/com/since/emp/taobao/MsgServiceClient.java @@ -0,0 +1,536 @@ +package com.since.emp.taobao; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; +import java.util.Vector; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.json.JSONException; +import org.json.JSONObject; + +import com.since.emp.base.IniReader; +import com.since.emp.service.OrderSync; +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.internal.tmc.Message; +import com.taobao.api.internal.tmc.MessageHandler; +import com.taobao.api.internal.tmc.MessageStatus; +import com.taobao.api.internal.tmc.TmcClient; +import com.taobao.api.internal.toplink.LinkException; +import com.taobao.api.request.TradeFullinfoGetRequest; +import com.taobao.api.response.TradeFullinfoGetResponse; + +public class MsgServiceClient { + + public static Logger logger; + + private static class ShopConfig { + public String shop_name; + public String session_key; + public String order_origin_id; + public String brand_list; + } + + private static class Config { + public String app_apiurl; + public String app_tmcurl; + public String app_key; + public String app_secret; + public String app_shops;// 需要处理的店铺序列 + public ArrayList shop_list; + + public String mss_ip;// MsgServiceServer服务器IP + } + + private static Config config; + private static String config_filename = "config_msg.ini"; + + private static Vector msgQueue; + + private static class MsgInfo { + String topic; + String content; + + public MsgInfo(String topic, String content) { + this.topic = topic; + this.content = content; + } + } + + public static void main(String[] args) { + // 日志初始化 + // logger = Logger.getLogger(MsgServiceClient.class); + // PropertyConfigurator.configure("log4j.properties"); + + ConfigurationSource source; + String relativePath = "log4j2.properties"; + // String filePath = CONFIG_PATH + System.getProperty("file.separator") + + // relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(OrderSync.class.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + + // 读取配置 + readConfig(); + + // 连接DataReceiver + connectMSS(); + + msgQueue = new Vector(); + new MsgParseThread().start(); + + Thread thread = new Thread(new MsgServiceTask()); + thread.start(); + } + + /** + * readConfig 读取配置 + */ + private static void readConfig() { + try { + IniReader iniReader = new IniReader(config_filename); + config = new Config(); + config.app_apiurl = iniReader.getValue("app", "apiurl"); + config.app_tmcurl = iniReader.getValue("app", "tmcurl"); + config.app_key = iniReader.getValue("app", "appkey"); + config.app_secret = iniReader.getValue("app", "appsecret"); + config.app_shops = iniReader.getValue("app", "shops"); + + // 设置各店铺参数 + String[] shops = config.app_shops.split(","); + config.shop_list = new ArrayList(); + for (int i = 0; i < shops.length; i++) { + ShopConfig shopConfig = new ShopConfig(); + shopConfig.shop_name = shops[i]; + shopConfig.session_key = iniReader.getValue(shops[i], "sessionkey"); + shopConfig.brand_list = iniReader.getValue(shops[i], "brand_list"); + shopConfig.order_origin_id = iniReader.getValue(shops[i], "order_origin_id"); + config.shop_list.add(shopConfig); + } + + config.mss_ip = iniReader.getValue("socket", "ip"); + } catch (IOException e) { + logger.error(MsgServiceClient.class, e); + } catch (Exception e) { + logger.error(MsgServiceClient.class, e); + } + } + + /** + * MsgServiceTask 接收淘宝消息推送任务 + * + * @author Carl + */ + static class MsgServiceTask implements Runnable { + @Override + public void run() { + TmcClient client = new TmcClient(config.app_tmcurl, config.app_key, config.app_secret, "default"); + client.setMessageHandler(new MessageHandler() { + + @Override + public void onMessage(Message message, MessageStatus status) { + try { + String topic = message.getTopic(); + String content = message.getContent(); + msgQueue.add(new MsgInfo(topic, content));// 将消息放入待处理队列,由队列处理线程负责按序处理 + logger.info("[ 淘宝 ] 新消息:{}——{}\r\n消息队列总数:[ {} ]", topic, content, msgQueue.size()); + } catch (Exception e) { + logger.error(MsgServiceClient.class, e); + status.fail();// 消息处理失败回滚,服务端需要重发 + logger.info("[ ERROR ] 淘宝推送消息进入消息队列失败!服务端回滚,详情:{}", e.toString()); + } + } + + }); + try { + client.connect(); + } catch (LinkException e) { + logger.error(MsgServiceClient.class, e); + } + } + } + + /** + * MsgParseThread 淘宝消息队列处理线程 + * + * @author Carl + * + */ + static class MsgParseThread extends Thread { + public void run() { + while (true) { + if (msgQueue.size() > 0) { + MsgInfo msginfo = (MsgInfo) msgQueue.get(0); + if (parseData(msginfo)) { + msgQueue.remove(0); + } + logger.info("[ 系统 ]消息队列总数:[ {} ]", msgQueue.size()); + } + try { + Thread.sleep(1000);// 每次处理间隔1秒 + } catch (InterruptedException e) { + logger.error(MsgServiceClient.class, e); + } + } + } + } + + /** + * parseData 消息解析 + * + * @param message + * @return + */ + public static boolean parseData(MsgInfo msginfo) { + boolean res = false; + try { + // logger.info("【淘宝】"+msginfo.topic+"——"+msginfo.content); + if (msginfo.topic.equals("taobao_trade_TradeBuyerPay")) { + res = parseTradeBuyerPay(msginfo.topic, msginfo.content); + } else if (msginfo.topic.equals("taobao_trade_TradeMemoModified")) { + res = parseTradeMemoModified(msginfo.topic, msginfo.content); + } else { + res = true; + } + } catch (Exception e) { + logger.error(MsgServiceClient.class, e); + } + return res; + } + + /** + * parseTradeBuyerPay 解析消息类型——客户已付款 + * + * @param str + * @return + */ + public static boolean parseTradeBuyerPay(String topic, String content) { + boolean res = false; + try { + JSONObject json = new JSONObject(content); + long tid = json.getLong("tid"); + String buyer_nick = json.getString("buyer_nick"); + String payment = json.getString("payment"); + String type = json.getString("type"); + String seller_nick = json.getString("seller_nick"); + ShopConfig shopConfig = getShopConfig(seller_nick); + if (shopConfig == null) { + logger.info("[ 错误 ]店铺:[ {} ]配置不存在,订单[ {} ]需人工处理!", seller_nick, tid); + return true; + } + + TaobaoClient client = new DefaultTaobaoClient(config.app_apiurl, config.app_key, config.app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields( + "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, shopConfig.session_key); + + // System.out.println(rsp.getBody()); + String tradeStr = rsp.getBody(); + + // 加入店铺来源 + StringBuilder sb = new StringBuilder(tradeStr); + sb.insert(1, "\"topic\":\"" + topic + "\",\"order_origin_id\":\"" + shopConfig.order_origin_id + + "\",\"brand_list\":\"" + shopConfig.brand_list + "\","); + tradeStr = sb.toString(); + + // 转发 + if (sock_connected) { + sock_writer.println(tradeStr); + sock_writer.flush(); + logger.info("[ MSC ] [ {} ] ——转发新订单:[ {} ],订货人:[ {} ]", seller_nick, tid, buyer_nick); + res = true; + + // 重启心跳线程,保证空闲时发送心跳 + restartBeatTimer(); + } + } catch (JSONException e) { + logger.error(MsgServiceClient.class, e); + } catch (ApiException e) { + logger.error(MsgServiceClient.class, e); + } + return res; + } + + /** + * parseTradeMemoModified 解析消息类型——修改备注 + * + * @param str + * @return + */ + public static boolean parseTradeMemoModified(String topic, String content) { + boolean res = false; + try { + JSONObject json = new JSONObject(content); + long tid = json.getLong("tid"); + String buyer_nick = json.getString("buyer_nick"); + String payment = json.getString("payment"); + String type = json.getString("type"); + String seller_nick = json.getString("seller_nick"); + ShopConfig shopConfig = getShopConfig(seller_nick); + if (shopConfig == null) { + logger.info("[ 错误 ] 店铺:[ {} ],配置不存在,订单 [ {} ] 需人工处理!", seller_nick, tid); + return true; + } + + TaobaoClient client = new DefaultTaobaoClient(config.app_apiurl, config.app_key, config.app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields("seller_nick,tid,buyer_message,seller_memo,trade_memo,buyer_memo"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, shopConfig.session_key); + + // System.out.println(rsp.getBody()); + String tradeStr = rsp.getBody(); + if (tradeStr.indexOf("seller_memo") < 0) { + logger.info("[ 系统 ]无卖家备注,修改备注消息不做处理!订单号:[ {} ]", tid); + return true; + } + + // 加入店铺来源 + StringBuilder sb = new StringBuilder(tradeStr); + sb.insert(1, "\"topic\":\"" + topic + "\",\"order_origin_id\":\"" + shopConfig.order_origin_id + + "\",\"brand_list\":\"" + shopConfig.brand_list + "\","); + tradeStr = sb.toString(); + + // 转发 + if (sock_connected) { + sock_writer.println(tradeStr); + sock_writer.flush(); + logger.info("[ MSC ] [ {} ]——修改备注:[ {} ],订货人:[ {} ]", seller_nick, tid, buyer_nick); + res = true; + + // 重启心跳线程,保证空闲时发送心跳 + restartBeatTimer(); + } + } catch (JSONException e) { + logger.error(MsgServiceClient.class, e); + } catch (ApiException e) { + logger.error(MsgServiceClient.class, e); + } + return res; + } + + /** + * getShopConfig 根据店铺名称获取店铺配置 + * + * @param shopName + * @return + */ + private static ShopConfig getShopConfig(String shopName) { + ShopConfig res = null; + for (int i = 0; i < config.shop_list.size(); i++) { + ShopConfig shopConfig = config.shop_list.get(i); + if (shopConfig.shop_name.equals(shopName)) { + res = shopConfig; + break; + } + } + return res; + } + + /*** + * ---------------------------------SOCKET转发-------------------------------- + * ------ + ***/ + + private static Socket sock_client; + private static PrintWriter sock_writer; + private static BufferedReader sock_reader; + private static Boolean sock_connected; + private static Thread sock_read_thread; + + /** + * connectMSS 连接DataReceiver(socket服务器) + * + * @throws IOException + */ + private static void connectMSS() { + try { + String host = config.mss_ip; + int port = 30005; // 要连接的服务端对应的监听端口 + sock_client = new Socket(host, port);// 与服务端建立连接 + sock_writer = new PrintWriter(sock_client.getOutputStream()); + sock_reader = new BufferedReader(new InputStreamReader(sock_client.getInputStream())); + logger.info("[ 系统 ] MsgServiceServer connected at {}:{}...", host, port); + + // 启动异步接收服务器返回数据线程 + sock_read_thread = new Thread(new SockReadTask()); + sock_read_thread.start(); + + sock_connected = true; + + // 启动心跳线程 + startBeatTimer(); + // 启动超时检测连接状态线程 + startTimeoutTimer(); + } catch (IOException e) { + logger.error(MsgServiceClient.class, e); + logger.error("[ ERROR ] MsgServiceServer连接失败!"); + sock_connected = false; + } + } + + private static void closeMss() { + try { + stopBeatTimer(); + sock_client.close(); + sock_client = null; + sock_reader.close(); + sock_reader = null; + sock_writer.close(); + sock_writer = null; + sock_read_thread.interrupt(); + sock_read_thread = null; + stopTimeoutTimer(); + + sock_connected = false; + logger.info("[ 系统 ] socket断开连接!"); + } catch (IOException e) { + logger.error(MsgServiceClient.class, e); + } + } + + /** + * SockReadTask 异步接收服务端消息任务 + * + * @author Carl + */ + static class SockReadTask implements Runnable { + @Override + public void run() { + logger.info("[ 系统 ] 读取服务端消息任务启动..."); + while (true) { + try { + String msg = sock_reader.readLine(); + if (!msg.equals("reheartbeat")) { + logger.info("[ MSS ] {}", msg); + } + restartTimeoutTimer(); + } catch (IOException e) { + logger.error(MsgServiceClient.class, e); + logger.error("[ ERROR ] 读取异常,socket连接中断!"); + break; + } + } + } + } + + /** + * 心跳 + */ + private static Timer beatTimer; + private static TimerTask beatTimerTask; + + private static void startBeatTimer() { + beatTimer = new Timer(); + beatTimerTask = new BeatTask(); + beatTimer.schedule(beatTimerTask, 60000, 60000);// 1分钟后发心跳 + } + + private static void stopBeatTimer() { + if (beatTimerTask != null) { + beatTimerTask.cancel(); + beatTimerTask = null; + } + if (beatTimer != null) { + beatTimer.cancel(); + beatTimer = null; + } + } + + private static void restartBeatTimer() { + stopBeatTimer(); + startBeatTimer(); + } + + static class BeatTask extends TimerTask { + @Override + public void run() { + if (sock_connected) { + // String t = + // "{\"topic\":\"taobao_trade_TradeBuyerPay\",\"order_origin_id\":\"7\",\"brand_list\":\"膳魔师\",\"trade_fullinfo_get_response\":{\"trade\":{\"adjust_fee\":\"0.00\",\"alipay_no\":\"2015120321001001360262986778\",\"buyer_nick\":\"易德成采购\",\"created\":\"2016-01-29 + // 09:50:59\",\"discount_fee\":\"0.00\",\"orders\":{\"order\":[{\"adjust_fee\":\"0.00\",\"discount_fee\":\"41.00\",\"num\":3,\"outer_iid\":\"002.01.05.479\",\"outer_sku_id\":\"002.01.05.479\",\"payment\":\"294.00\",\"price\":\"335.00\",\"sku_properties_name\":\"颜色分类:咖啡色\",\"status\":\"WAIT_SELLER_SEND_GOODS\",\"title\":\"测试赠品用商品\",\"total_fee\":\"294.00\"}]},\"pay_time\":\"2016-01-29 + // 10:00:00\",\"payment\":\"294.00\",\"post_fee\":\"0.00\",\"receiver_address\":\"陶**街**城区骡马**街**号易德诚办公超市\",\"receiver_city\":\"北京市\",\"receiver_district\":\"西城区\",\"receiver_mobile\":\"1501058****\",\"receiver_name\":\"周**\",\"receiver_phone\":\"010-83539866****\",\"receiver_state\":\"北京\",\"seller_nick\":\"膳魔师新实专卖店\",\"status\":\"WAIT_SELLER_SEND_GOODS\",\"tid\":1295153640472589,\"total_fee\":\"335.00\",\"type\":\"fixed\"},\"request_id\":\"r4kdxmih05fr\"}}"; + // String t = + // "{\"topic\":\"taobao_trade_TradeBuyerPay\",\"order_origin_id\":\"7\",\"brand_list\":\"膳魔师\",\"trade_fullinfo_get_response\":{\"trade\":{\"adjust_fee\":\"0.00\",\"alipay_no\":\"2015120321001001360262986778\",\"buyer_nick\":\"易德成采购\",\"created\":\"2015-12-03 + // 19:02:35\",\"discount_fee\":\"0.00\",\"orders\":{\"order\":[{\"adjust_fee\":\"0.00\",\"discount_fee\":\"41.00\",\"num\":1,\"outer_iid\":\"002.01.05.203\",\"outer_sku_id\":\"002.01.05.203\",\"payment\":\"294.00\",\"price\":\"335.00\",\"sku_properties_name\":\"颜色分类:咖啡色\",\"status\":\"WAIT_SELLER_SEND_GOODS\",\"title\":\"膳魔师thermos不锈钢保温杯水杯男士泡茶杯滤网带茶漏杯TCMK-500\",\"total_fee\":\"294.00\"}]},\"pay_time\":\"2015-12-04 + // 15:16:28\",\"payment\":\"294.00\",\"post_fee\":\"0.00\",\"receiver_address\":\"陶**街**城区骡马**街**号易德诚办公超市\",\"receiver_city\":\"北京市\",\"receiver_district\":\"西城区\",\"receiver_mobile\":\"1501058****\",\"receiver_name\":\"周**\",\"receiver_phone\":\"010-83539866****\",\"receiver_state\":\"北京\",\"seller_nick\":\"膳魔师新实专卖店\",\"status\":\"WAIT_SELLER_SEND_GOODS\",\"tid\":1295153640472589,\"total_fee\":\"335.00\",\"type\":\"fixed\"},\"request_id\":\"r4kdxmih05fr\"}}"; + // String t = + // "{\"topic\":\"taobao_trade_TradeMemoModified\",\"order_origin_id\":\"7\",\"brand_list\":\"膳魔师\",\"trade_fullinfo_get_response\":{\"trade\":{\"seller_memo\":\"此单是这个买家补偿我们店铺的赔付款--不发货,不退款----kuma\",\"seller_nick\":\"膳魔师新实专卖店\",\"tid\":1446773308943630},\"request_id\":\"z29kevxulj9h\"}}"; + // sock_writer.println(t); + sock_writer.println("heartbeat"); + sock_writer.flush(); + // logger.info("【MSC】heartbeat"); + } + } + } + + /** + * 超时检测 + */ + private static Timer timeoutTimer; + private static TimerTask timeoutTask; + + private static void startTimeoutTimer() { + timeoutTimer = new Timer(); + timeoutTask = new TimeoutTask(); + timeoutTimer.schedule(timeoutTask, 60000 * 3);// 3分钟服务端无响应,超时 + } + + private static void stopTimeoutTimer() { + if (timeoutTask != null) { + timeoutTask.cancel(); + timeoutTask = null; + } + if (timeoutTimer != null) { + timeoutTimer.cancel(); + timeoutTimer = null; + } + } + + private static void restartTimeoutTimer() { + stopTimeoutTimer(); + startTimeoutTimer(); + } + + static class TimeoutTask extends TimerTask { + @Override + public void run() { + logger.info("timeout"); + closeMss(); + while (sock_connected == false) { + try { + logger.info("10秒后重连"); + Thread.sleep(10000);// 延迟10秒重连 + connectMSS(); + } catch (InterruptedException e) { + logger.error(MsgServiceClient.class, e); + } + } + } + } + +} \ No newline at end of file diff --git a/src/com/since/emp/taobao/MsgServiceServer.java b/src/com/since/emp/taobao/MsgServiceServer.java new file mode 100644 index 0000000..ba05b61 --- /dev/null +++ b/src/com/since/emp/taobao/MsgServiceServer.java @@ -0,0 +1,737 @@ +package com.since.emp.taobao; +/** + * Copyright @ 2015 Since Co. Ltd. + * All rights reserved. + * @author: Carl + * date: 2015-10-27 + */ + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; +import java.util.Vector; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSync; + +/** + * DataReceiver 数据接收类 该类为socket服务端,接收从客户端发送的订单数据。 + * 服务端部署在erp服务器,负责数据落地,客户端部署在天猫云主机,负责抓取数据并转发。 + */ +public class MsgServiceServer { + + public static int PORT = 30005;// socket端口 + public static Logger logger; + + private static class Config { + public boolean db_enable = false; + public String db_host; + public String db_user; + public String db_password; + } + + private static Config config; + private static String config_filename = "config_msg.ini"; + + /** + * @param args + */ + public static void main(String[] args) throws IOException { + // 日志初始化 + // logger = Logger.getLogger(MsgServiceServer.class); + // PropertyConfigurator.configure("log4j.properties"); + ConfigurationSource source; + String relativePath = "log4j2.properties"; + // String filePath = CONFIG_PATH + System.getProperty("file.separator") + + // relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(OrderSync.class.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + + // 读取配置 + readConfig(); + + // 启动活动规则同步线程 + readActivityThread(); + + msgQueue = new Vector(); + new QueueParseThread().start(); + + // 启动socket服务端 + ServerSocket server = new ServerSocket(MsgServiceServer.PORT); + logger.info("[ MSS ] MsgServiceServer started at {}!", MsgServiceServer.PORT); + while (true) { + // server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的 + Socket socket = server.accept(); + logger.info("[ MSS ] Client {} connected", socket.getLocalAddress()); + // 每接收到一个Socket就建立一个新的线程来处理它 + new Thread(new Task(socket)).start(); + } + } + + /** + * readConfig 读取配置 + */ + private static void readConfig() { + try { + IniReader iniReader = new IniReader(config_filename); + config = new Config(); + config.db_enable = iniReader.getValue("mysql", "use").equals("0") ? false : true; + config.db_host = iniReader.getValue("mysql", "host"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + } catch (IOException e) { + logger.error(MsgServiceServer.class, e); + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + } + } + + /** + * 用来处理Socket请求的 + */ + static class Task implements Runnable { + private Socket socket; + private BufferedReader reader; + private PrintWriter writer; + + public Task(Socket socket) { + this.socket = socket; + } + + public void run() { + try { + handleSocket(); + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + } finally { + try { + socket.close(); + socket = null; + writer.close(); + writer = null; + reader.close(); + reader = null; + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + } + } + } + + /** + * 跟客户端Socket进行通信 + * + * @throws Exception + */ + private void handleSocket() throws Exception { + this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + this.writer = new PrintWriter(socket.getOutputStream()); + String msg; + + while (true) { + msg = reader.readLine(); + if (msg == null || msg.equals("") || msg.equals("null")) { + continue; + } + if (msg.equals("heartbeat")) { + writer.println("reheartbeat"); + writer.flush(); + } else if (msg.equals("bye")) { + writer.close(); + reader.close(); + socket.close(); + break; + } else { + logger.info("[ MSC ] {}", msg); + msgQueue.add(new MsgInfo(writer, msg));// 将消息放入待处理队列,由队列处理线程负责按序处理 + // new ParseThread(msg,writer).start(); + } + } + } + + } + + /*** + * ---------------------------------数据解析------------------------------------ + * -- + ***/ + private static Vector msgQueue; + + private static class MsgInfo { + PrintWriter writer; + String content; + int retry_times = 0; + + public MsgInfo(PrintWriter writer, String content) { + this.writer = writer; + this.content = content; + } + } + + /** + * QueueParseThread 消息队列处理线程 + * + * @author Carl + * + */ + static class QueueParseThread extends Thread { + public void run() { + while (true) { + if (msgQueue.isEmpty()) { + try { + Thread.sleep(1000);// 无数据时间隔1秒 + } catch (InterruptedException e) { + logger.error(MsgServiceServer.class, e); + } + } else { + MsgInfo msginfo = (MsgInfo) msgQueue.get(0); + if (parseData(msginfo)) { + msgQueue.remove(0); + } else { + if (msginfo.retry_times >= 3) { + // 错误重试次数超过3次,放弃处理此消息 + logger.info("[ 系统 ] 消息处理失败"); + msgQueue.remove(0); + } else { + msginfo.retry_times += 1; + logger.info("[ 系统 ] 第 [ {} ] 次处理消息失败", msginfo.retry_times); + } + } + logger.info("[ 系统 ] 消息队列总数:[ {} ]", msgQueue.size()); + } + } + } + } + + /** + * parseData 解析收到的订单数据 + * + * @param data + */ + private static boolean parseData(MsgInfo msginfo) { + try { + JSONObject json = new JSONObject(msginfo.content); + + String topic = json.getString("topic"); + String order_origin_id = json.getString("order_origin_id"); + String brand_list = json.getString("brand_list"); + JSONObject trade_fullinfo_get_response = json.getJSONObject("trade_fullinfo_get_response"); + JSONObject trade = trade_fullinfo_get_response.getJSONObject("trade"); + + TradeInfo tradeInfo = null; + if (topic.equals("taobao_trade_TradeBuyerPay")) { + tradeInfo = parseNewTrade(trade, Integer.parseInt(order_origin_id), brand_list); + } else if (topic.equals("taobao_trade_TradeMemoModified")) { + tradeInfo = parseMemoTrade(trade, Integer.parseInt(order_origin_id), brand_list); + } + + if (tradeInfo == null) { + msginfo.writer.println("订单解析失败"); + msginfo.writer.flush(); + return false; + } + + Connection conn = null; + Statement statement = null; + try { + String url = "jdbc:mysql://" + config.db_host + + ":3306/sinceerp?useUnicode=true&characterEncoding=UTF-8"; + String user = config.db_user; + String password = config.db_password; + Class.forName("com.mysql.jdbc.Driver"); + conn = DriverManager.getConnection(url, user, password); + statement = conn.createStatement(); + if (topic.equals("taobao_trade_TradeBuyerPay")) { + if (findTrade(tradeInfo, statement)) { + logger.info("订单已存在"); + } else { + insertTrade(tradeInfo, statement); + } + } else if (topic.equals("taobao_trade_TradeMemoModified")) { + updateTradeTransaction(tradeInfo, conn); + } + logger.info("数据处理成功"); + msginfo.writer.println("数据处理成功"); + msginfo.writer.flush(); + return true; + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + return false; + } finally { + if (statement != null) { + statement.close(); + statement = null; + } + if (conn != null) { + conn.close(); + conn = null; + } + } + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + return false; + } + } + + /** + * parseNewTrade 解析单条新订单数据,生成tradeInfo对象 + * + * @param jsonTrade + * @param order_origin_id + * @param brand_list + * @return + */ + private static TradeInfo parseNewTrade(JSONObject jsonTrade, int order_origin_id, String brand_list) { + TradeInfo tradeInfo = new TradeInfo(); + try { + // tradeInfo.order_origin_id = order_origin_id; + // tradeInfo.brand_list = brand_list; + tradeInfo.tid = jsonTrade.getString("tid"); + tradeInfo.type = jsonTrade.getString("type"); + tradeInfo.alipay_no = jsonTrade.getString("alipay_no"); + tradeInfo.num = 0; + // tradeInfo.payment = jsonTrade.getString("payment"); + tradeInfo.created = jsonTrade.getString("created"); + tradeInfo.pay_time = jsonTrade.getString("pay_time"); + tradeInfo.post_fee = jsonTrade.getString("post_fee"); + tradeInfo.buyer_nick = jsonTrade.getString("buyer_nick"); + tradeInfo.receiver_name = jsonTrade.getString("receiver_name"); + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_state = jsonTrade.has("receiver_state") ? jsonTrade.getString("receiver_state") : ""; + tradeInfo.receiver_city = jsonTrade.has("receiver_city") ? jsonTrade.getString("receiver_city") : ""; + tradeInfo.receiver_district = jsonTrade.has("receiver_district") ? jsonTrade.getString("receiver_district") + : ""; + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + jsonTrade.getString("receiver_address"); + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_mobile = jsonTrade.has("receiver_mobile") ? jsonTrade.getString("receiver_mobile") : ""; + tradeInfo.receiver_phone = jsonTrade.has("receiver_phone") ? jsonTrade.getString("receiver_phone") : ""; + tradeInfo.buyer_message = jsonTrade.has("buyer_message") ? jsonTrade.getString("buyer_message") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + tradeInfo.seller_memo = jsonTrade.has("seller_memo") ? jsonTrade.getString("seller_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + // tradeInfo.total_fee = jsonTrade.getString("total_fee"); + tradeInfo.adjust_fee = jsonTrade.getString("adjust_fee"); + tradeInfo.discount_fee = jsonTrade.getString("discount_fee"); + + JSONObject orders = jsonTrade.getJSONObject("orders"); + JSONArray aOrder = orders.getJSONArray("order"); + tradeInfo.orders = new OrderInfo[aOrder.length()]; + for (int i = 0; i < aOrder.length(); i++) { + JSONObject order = aOrder.getJSONObject(i); + OrderInfo orderInfo = new OrderInfo(); + orderInfo.outer_sku_id = order.has("outer_sku_id") ? order.getString("outer_sku_id") : ""; + orderInfo.outer_iid = order.has("outer_iid") ? order.getString("outer_iid") : ""; + orderInfo.num = order.getInt("num"); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = order.getString("price"); + orderInfo.payment = order.getString("payment"); + orderInfo.title = order.getString("title"); + orderInfo.sku_properties_name = order.has("sku_properties_name") + ? order.getString("sku_properties_name") + : ""; + orderInfo.discount_fee = order.getString("discount_fee"); + orderInfo.total_fee = order.getString("total_fee"); + orderInfo.adjust_fee = order.getString("adjust_fee"); + orderInfo.status = order.getString("status"); + tradeInfo.orders[i] = orderInfo; + } + } catch (JSONException e) { + logger.info("订单解析失败:[ {} ]", tradeInfo.tid); + logger.error(MsgServiceServer.class, e); + return null; + } + return tradeInfo; + } + + /** + * parseMemoTrade 解析单条备注订单数据,生成tradeInfo对象 + * + * @param jsonTrade + * @param order_origin_id + * @param brand_list + * @return + */ + private static TradeInfo parseMemoTrade(JSONObject jsonTrade, int order_origin_id, String brand_list) { + TradeInfo tradeInfo = new TradeInfo(); + try { + // tradeInfo.order_origin_id = order_origin_id; + // tradeInfo.brand_list = brand_list; + tradeInfo.tid = jsonTrade.getString("tid"); + tradeInfo.buyer_message = jsonTrade.has("buyer_message") ? jsonTrade.getString("buyer_message") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + tradeInfo.seller_memo = jsonTrade.has("seller_memo") ? jsonTrade.getString("seller_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + } catch (JSONException e) { + logger.info("订单解析失败:[ {} ]", tradeInfo.tid); + logger.error(MsgServiceServer.class, e); + return null; + } + return tradeInfo; + } + + /*** + * ---------------------------------数据库------------------------------------- + * - + ***/ + + /** + * findTrade 查询订单是否存在 + * + * @param tradeInfo + * @param statement + * @return + * @throws SQLException + */ + private static boolean findTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + Boolean res = false; + String sql = "select order_code from tb_sale_order where platform_order_code='" + tradeInfo.tid + "'"; + ResultSet rs = statement.executeQuery(sql); + if (rs.next()) { + res = true; + } + rs.close(); + return res; + } + + /** + * updateTrade 更新订单数据 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void updateTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + String sqlstr = "update tb_sale_order set seller_note='" + tradeInfo.seller_memo + + "' where platform_order_code='" + tradeInfo.tid + "'"; + logger.info(sqlstr); + statement.executeUpdate(sqlstr); + } + + /** + * updateTradeTransaction 更新订单数据——事务方式 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void updateTradeTransaction(TradeInfo tradeInfo, Connection conn) { + PreparedStatement ps = null; + try { + conn.setAutoCommit(false); + String sqlstr = "update tb_sale_order set seller_note='" + tradeInfo.seller_memo + + "' where type=2 and platform_order_code='" + tradeInfo.tid + "'"; + ps = conn.prepareCall(sqlstr); + logger.info(sqlstr); + ps.executeUpdate(); + conn.commit(); + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + logger.error("更新事务执行失败:{}", e.toString()); + try { + conn.rollback(); + } catch (SQLException e1) { + logger.error(MsgServiceServer.class, e); + logger.error("回滚执行失败:{}", e.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + ps.close(); + } catch (SQLException e) { + logger.error(MsgServiceServer.class, e); + } + } + + } + + /** + * insertTrade 新增订单数据 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void insertTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + // 生成系统订单号 + String order_code = tradeInfo.created.replaceAll("-", ""); + order_code = order_code.replaceAll(":", ""); + order_code = order_code.replaceAll(" ", ""); + order_code = order_code.substring(2, order_code.length()); + int seq = getSeq(statement);// 获取序列码 + String index = seq + ""; + while (index.length() < 4) { + index = "0" + index; + } + order_code = "XT" + order_code + index; + + // 插入订单 + String column = "(type" + ",order_origin_id" + ",order_code" + ",platform_order_code" + ",alipay_account" + + ",brand_list" + ",quantity" + ",money" + ",receivables_money" + ",receivables_difference" + + ",pay_mode_id" + ",order_create_time" + ",pay_time" + ",freight_info_id" + ",delivery_cost" + + ",transaction_mode_id" + ",buyer_nick_name" + ",receiver_name" + ",receiver_address" + + ",receiver_telephone" + ",platform_note" + ",seller_note" + ",delivery_type_id" + ",invoice_type_id" + + ",total_fee" + ",adjust_fee" + ",discount_fee)"; + String value = "(2" + // + "," + tradeInfo.order_origin_id + + ",'" + order_code + "'" + ",'" + tradeInfo.tid + "'" + ",'" + tradeInfo.alipay_no + "'" + // + ",'" + tradeInfo.brand_list + "'" + + "," + tradeInfo.num + // + "," + tradeInfo.payment + // + "," + tradeInfo.payment + + ",0" + ",4" + ",'" + tradeInfo.created + "'" + ",'" + tradeInfo.pay_time + "'" + "," + + (Float.parseFloat(tradeInfo.post_fee) > 0 ? 2 : 1) + "," + tradeInfo.post_fee + ",1" + ",'" + + tradeInfo.buyer_nick + "'" + ",'" + tradeInfo.receiver_name + "'" + ",'" + tradeInfo.receiver_address + + "'" + ",'" + + (tradeInfo.receiver_mobile.equals("") ? tradeInfo.receiver_phone : tradeInfo.receiver_mobile) + "'" + + ",'" + tradeInfo.buyer_message + "'" + ",'" + tradeInfo.seller_memo + "'" + ",2" + // + "," + (seq%2==0 ? 2 : 3) + + ",3" + // + "," + tradeInfo.total_fee + + "," + tradeInfo.adjust_fee + "," + tradeInfo.discount_fee + ")"; + String sqlstr = "insert into tb_sale_order " + column + " values " + value; + logger.info(sqlstr); + statement.executeUpdate(sqlstr); + } + + /** + * getSeq 获取系统订单号后4位序列码 + * + * @param statement + * @return + * @throws SQLException + */ + private static int getSeq(Statement statement) throws SQLException { + int res = 0; + String sqlstr = "select _nextval('tid') as seq"; + ResultSet rs = statement.executeQuery(sqlstr); + if (rs.next()) { + res = rs.getInt("seq"); + } + rs.close(); + return res; + } + + /** + * getLastSaleId 获取最后插入的saleId,供订单条目表写入关联订单号使用 + * + * @param statement + * @return + * @throws SQLException + */ + private static String getLastSaleId(Statement statement) throws SQLException { + String res = "0"; + String sql_seq = "select LAST_INSERT_ID() as id from tb_sale_order LIMIT 0,1"; + ResultSet rs = statement.executeQuery(sql_seq); + rs.next(); + res = rs.getString("id"); + rs.close(); + return res; + } + + /*** + * ---------------------------------活动规则同步---------------------------------- + * ---- + ***/ + private static Vector ruleQueue; + + private static class Rule { + String activity_code; + String activity_name; + String activity_shop_id; + String activity_begin_time; + String activity_end_time; + String rule_code; + String rule_name; + String rule_apply_object; + String rule_check_mode; + String rule_gift_mode; + String rule_pay_money; + String rule_commodity_code; + String rule_gift_code; + String rule_gift_number; + String rule_delivery_type_id; + int current_number = 0; + } + + private static void readActivityThread() { + ruleQueue = new Vector(); + + Timer activityTimer = new Timer(); + ActivityTimerTask activityTimerTask = new ActivityTimerTask(); + activityTimer.schedule(activityTimerTask, 0, 60000 * 30);// 30分钟同步一次规则 + } + + static class ActivityTimerTask extends TimerTask { + @Override + public void run() { + logger.info("【activity】同步"); + + Connection conn = null; + Statement statement = null; + try { + String url = "jdbc:mysql://" + config.db_host + + ":3306/sinceerp?useUnicode=true&characterEncoding=UTF-8"; + String user = config.db_user; + String password = config.db_password; + Class.forName("com.mysql.jdbc.Driver"); + conn = DriverManager.getConnection(url, user, password); + statement = conn.createStatement(); + getRules(statement); + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(MsgServiceServer.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(MsgServiceServer.class, e); + } + conn = null; + } + } + } + } + + private static String getRules(Statement statement) throws SQLException { + String res = "0"; + String sql = "select b.activity_code,a.name as activity_name,a.order_origin_id,a.begin_time,a.end_time,b.code as rule_code,b.name as rule_name,b.apply_object as rule_apply_object,b.check_mode as rule_check_mode,b.gift_mode as rule_gift_mode,b.pay_money as rule_pay_money,b.commodity_code as rule_commodity_code,b.gift_code as rule_gift_code,b.gift_number as rule_gift_number,b.delivery_type_id as rule_delivery_type_id from tb_activity a,tb_activity_rule b where a.status = 2 and now() >= date_sub(a.begin_time, INTERVAL 1 HOUR) and b.activity_code = a.code"; + ResultSet rs = statement.executeQuery(sql); + ArrayList expire_list = new ArrayList(); + while (rs.next()) { + Rule rule = new Rule(); + rule.activity_code = rs.getString("activity_code"); + rule.activity_name = rs.getString("activity_name"); + rule.activity_shop_id = rs.getString("order_origin_id"); + rule.activity_begin_time = rs.getString("begin_time"); + rule.activity_end_time = rs.getString("end_time"); + rule.rule_code = rs.getString("rule_code"); + rule.rule_name = rs.getString("rule_name"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_check_mode = rs.getString("rule_check_mode"); + rule.rule_gift_mode = rs.getString("rule_gift_mode"); + rule.rule_pay_money = rs.getString("rule_pay_money"); + rule.rule_apply_object = rs.getString("rule_apply_object"); + rule.rule_commodity_code = rs.getString("rule_commodity_code"); + rule.rule_gift_code = rs.getString("rule_gift_code"); + rule.rule_gift_number = rs.getString("rule_gift_number"); + rule.rule_delivery_type_id = rs.getString("rule_delivery_type_id"); + + // 判断活动是否结束 + try { + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long end_time_long = sdf.parse(rule.activity_end_time).getTime(); + long now_time_long = now.getTime(); + + if (now_time_long > end_time_long) { + // 活动已经结束 + if (!expire_list.contains(rule.activity_code)) { + expire_list.add(rule.activity_code);// 加入到过期活动表中,之后统一处理数据库更新 + removeActivityFromQueue(rule.activity_code);// 过期活动从队列中移除 + logger.info("[ activity ] 活动过期:{}——{}", rule.activity_name, rule.rule_name); + } + } else { + // 正在进行中的活动 + int i = findRule(rule); + if (i < 0) { + ruleQueue.add(rule); + logger.info("[ activity ] 规则启用:{}——{}", rule.activity_name, rule.rule_name); + } else { + logger.info("[ activity ] 规则已存在,不做处理:{}——{}", rule.activity_name, rule.rule_name); + } + } + + } catch (Exception e) { + logger.error(MsgServiceServer.class, e); + } + + } + logger.info("规则队列总数:[ {} ]", ruleQueue.size()); + rs.close(); + if (!expire_list.isEmpty()) { + changeActivityStatus(statement, expire_list); + } + return res; + } + + private static void changeActivityStatus(Statement statement, ArrayList expire_list) throws SQLException { + String sqlstr = "update tb_activity set status=3 where "; + for (int i = 0; i < expire_list.size(); i++) { + String s = i == 0 ? "" : " or "; + sqlstr += s + "code='" + expire_list.get(i) + "'"; + } + logger.info(sqlstr); + statement.executeUpdate(sqlstr); + } + + private static int findRule(Rule rule) { + int res = -1; + for (int i = 0; i < ruleQueue.size(); i++) { + Rule r = ruleQueue.get(i); + if (r.rule_code.equals(rule.rule_code)) { + res = i; + break; + } + } + return res; + } + + private static void removeActivityFromQueue(String activity_code) { + for (int i = ruleQueue.size() - 1; i >= 0; i--) { + Rule r = ruleQueue.get(i); + if (r.activity_code.equals(activity_code)) { + ruleQueue.remove(i); + } + } + } + +} diff --git a/src/com/since/emp/taobao/Permit.java b/src/com/since/emp/taobao/Permit.java new file mode 100644 index 0000000..a91f531 --- /dev/null +++ b/src/com/since/emp/taobao/Permit.java @@ -0,0 +1,88 @@ +package com.since.emp.taobao; + +import java.text.SimpleDateFormat; + +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.request.TmcUserGetRequest; +import com.taobao.api.request.TmcUserPermitRequest; +import com.taobao.api.request.TradesSoldIncrementGetRequest; +import com.taobao.api.response.TmcUserGetResponse; +import com.taobao.api.response.TmcUserPermitResponse; +import com.taobao.api.response.TradesSoldIncrementGetResponse; + +public class Permit { + + public static String url = "http://gw.api.taobao.com/router/rest"; + public static String appkey = "21367340"; + public static String secret = "a4a165a88288afea63c8707f48c11c7c"; + + public static void main(String[] args) { +// permit("taobao_trade_TradeBuyerPay,taobao_trade_TradeMemoModified,taobao_refund_RefundCreated,taobao_trade_TradeSuccess,taobao_fenxiao_FxOrderPaid,taobao_refund_RefundBuyerReturnGoods","6100129bfb8632213a585bdf77be3e30ca3d51cb35f3d48811691369"); +// permit("taobao_fenxiao_FxOrderPaid,taobao_fenxiao_DealerPay,taobao_fenxiao_DealerModify,taobao_trade_TradeMemoModified","6100704421171263fZZ068eccf1be5f5549bfa2e00f25453182109001"); + getPermitTopics(); + } + + private static void permit(String topics, String sessionkey) { + // 授权 + try { + TaobaoClient tbclient = new DefaultTaobaoClient(url, appkey, secret); + TmcUserPermitRequest req = new TmcUserPermitRequest(); + req.setTopics(topics); + TmcUserPermitResponse rsp; + rsp = tbclient.execute(req, sessionkey); + System.out.println(rsp.getBody()); + } catch (ApiException e) { + e.printStackTrace(); + } + } + + private static void getPermitTopics() { + try { + TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret); + TmcUserGetRequest req = new TmcUserGetRequest(); + req.setFields("user_nick,topics,user_id,is_valid,created,modified"); + req.setNick("rosendahl旗舰店供应商"); + TmcUserGetResponse rsp = client.execute(req); + } catch (ApiException e) { + e.printStackTrace(); + } + } + + private static void getOrder() { + try { + TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23302508", + "9761218bb730ddb8b709adcf6f0c76e1"); + TradesSoldIncrementGetRequest req = new TradesSoldIncrementGetRequest(); + req.setFields( + "seller_nick,buyer_nick,title,type,created,sid,tid,seller_rate,buyer_rate,status,payment,discount_fee,adjust_fee,post_fee,total_fee,pay_time,end_time,modified,consign_time,buyer_obtain_point_fee,point_fee,real_point_fee,received_payment,commission_fee,pic_path,num_iid,num_iid,num,price,cod_fee,cod_status,shipping_type,receiver_name,receiver_state,receiver_city,receiver_district,receiver_address,receiver_zip,receiver_mobile,receiver_phone,orders.title,orders.pic_path,orders.price,orders.num,orders.iid,orders.num_iid,orders.sku_id,orders.refund_status,orders.status,orders.oid,orders.total_fee,orders.payment,orders.discount_fee,orders.adjust_fee,orders.sku_properties_name,orders.item_meal_name,orders.buyer_rate,orders.seller_rate,orders.outer_iid,orders.outer_sku_id,orders.refund_id,orders.seller_type"); + req.setStartModified(SimpleDateFormat.getDateTimeInstance().parse("2016-01-21 10:00:00")); + req.setEndModified(SimpleDateFormat.getDateTimeInstance().parse("2016-01-21 11:00:00")); + TradesSoldIncrementGetResponse response = client.execute(req, + "6100b086df0cccbb11e1a0b540a96881a775a4c25d8fcce811691369"); + String jsonString = response.getBody(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void getOrder1() { + try { + TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23077162", + "812ac5919c523b197ca62d7f5249e279"); + TradesSoldIncrementGetRequest req = new TradesSoldIncrementGetRequest(); + req.setFields( + "seller_nick,buyer_nick,title,type,created,sid,tid,seller_rate,buyer_rate,status,payment,discount_fee,adjust_fee,post_fee,total_fee,pay_time,end_time,modified,consign_time,buyer_obtain_point_fee,point_fee,real_point_fee,received_payment,commission_fee,pic_path,num_iid,num_iid,num,price,cod_fee,cod_status,shipping_type,receiver_name,receiver_state,receiver_city,receiver_district,receiver_address,receiver_zip,receiver_mobile,receiver_phone,orders.title,orders.pic_path,orders.price,orders.num,orders.iid,orders.num_iid,orders.sku_id,orders.refund_status,orders.status,orders.oid,orders.total_fee,orders.payment,orders.discount_fee,orders.adjust_fee,orders.sku_properties_name,orders.item_meal_name,orders.buyer_rate,orders.seller_rate,orders.outer_iid,orders.outer_sku_id,orders.refund_id,orders.seller_type"); + req.setStartModified(SimpleDateFormat.getDateTimeInstance().parse("2016-01-21 10:00:00")); + req.setEndModified(SimpleDateFormat.getDateTimeInstance().parse("2016-01-21 11:00:00")); + TradesSoldIncrementGetResponse response = client.execute(req, + "6101c004199aa0b65781ee2595ba64c1b5d0cc3b64d2ba3811691369"); + String jsonString = response.getBody(); + System.out.println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/com/since/emp/taobao/tb_mq.java b/src/com/since/emp/taobao/tb_mq.java new file mode 100644 index 0000000..82775a4 --- /dev/null +++ b/src/com/since/emp/taobao/tb_mq.java @@ -0,0 +1,778 @@ +package com.since.emp.taobao; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Vector; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSync; +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.internal.tmc.Message; +import com.taobao.api.internal.tmc.MessageHandler; +import com.taobao.api.internal.tmc.MessageStatus; +import com.taobao.api.internal.tmc.TmcClient; +import com.taobao.api.internal.toplink.LinkException; +import com.taobao.api.request.TradeFullinfoGetRequest; +import com.taobao.api.response.TradeFullinfoGetResponse; + +public class tb_mq { + + public static Logger logger; + + /** + * 店铺参数类 + */ + private static class ShopConfig { + public String company_code; + public String shop_name; + public String session_key; + public String shop_code; + public String brand; + } + + /** + * 应用参数类 + */ + private static class Config { + public String app_apiurl; + public String app_tmcurl; + public String app_key; + public String app_secret; + public String app_shops;// 需要处理的店铺序列 + public ArrayList shop_list; + + public String db_host; + public String db_user; + public String db_password; + } + + private static Config config; + private static String config_filename = "config.ini"; + + private static Vector msgQueue; + + private static class MsgInfo { + String topic; + String content; + long tid; + + public MsgInfo(String topic, String content, long tid) { + this.topic = topic; + this.content = content; + this.tid = tid; + } + } + + /** + * main + * + * @param args + */ + public static void main(String[] args) { + // 日志初始化 + // logger = Logger.getLogger(tb_mq.class); + // PropertyConfigurator.configure("log4j.properties"); + ConfigurationSource source; + String relativePath = "log4j2.properties"; + // String filePath = CONFIG_PATH + System.getProperty("file.separator") + + // relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(OrderSync.class.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + + // 读取配置 + if (readConfig() == false) { + logger.info("【初始化】读取配置失败"); + return; + } + + msgQueue = new Vector(); + new MsgParseThread().start(); + + Thread thread = new Thread(new MsgServiceTask()); + thread.start(); + } + + /** + * readConfig 读取配置 + */ + private static boolean readConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + config = new Config(); + config.app_apiurl = iniReader.getValue("app", "apiurl"); + config.app_tmcurl = iniReader.getValue("app", "tmcurl"); + config.app_key = iniReader.getValue("app", "appkey"); + config.app_secret = iniReader.getValue("app", "appsecret"); + config.app_shops = iniReader.getValue("app", "shops"); + + config.db_host = iniReader.getValue("mysql", "host"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + + // 从数据库读取各店铺参数 + try { + readShopConfig(config.app_shops); + res = true; + } catch (Exception e) { + logger.error(tb_mq.class, e); + } + } catch (IOException e) { + logger.error(tb_mq.class, e); + } catch (Exception e) { + logger.error(tb_mq.class, e); + } + return res; + } + + /** + * MsgServiceTask 接收淘宝消息推送任务 + * + * @author Carl + */ + static class MsgServiceTask implements Runnable { + @Override + public void run() { + TmcClient client = new TmcClient(config.app_tmcurl, config.app_key, config.app_secret, "default"); + client.setMessageHandler(new MessageHandler() { + + @Override + public void onMessage(Message message, MessageStatus status) { + try { + String topic = message.getTopic(); + String content = message.getContent(); + + JSONObject json = new JSONObject(content); + long tid = json.getLong("tid"); + String seller_nick = json.getString("seller_nick"); + + msgQueue.add(new MsgInfo(topic, content, tid));// 将消息放入待处理队列,由队列处理线程负责按序处理 + logger.info("[" + topic + "] [ {} ]:[ {} ]\r\n消息队列总数:[ {} ]", seller_nick, tid, + msgQueue.size()); + + // status.fail(); + } catch (Exception e) { + logger.error(tb_mq.class, e); + status.fail();// 消息处理失败回滚,服务端需要重发 + logger.info("[ ERROR ] 淘宝推送消息进入消息队列失败!服务端回滚,详情:{}", e.toString()); + } + } + + }); + try { + client.connect(); + } catch (LinkException e) { + logger.error(tb_mq.class, e); + } + } + } + + /** + * MsgParseThread 淘宝消息队列处理线程 + * + * @author Carl + * + */ + static class MsgParseThread extends Thread { + public void run() { + while (true) { + if (msgQueue.size() > 0) { + MsgInfo msginfo = (MsgInfo) msgQueue.get(0); + + logger.info("[ 系统 ] 处理消息:{}:{}", msginfo.topic, msginfo.tid); + if (msgProcess(msginfo)) { + msgQueue.remove(0); + logger.info("[ 系统 ] 消息处理成功"); + } else { + logger.info("[ 系统 ] 消息处理失败"); + } + + logger.info("[ 系统 ] 消息队列总数:[ {} ]", msgQueue.size()); + } + try { + Thread.sleep(500);// 每次处理间隔0.5秒 + } catch (InterruptedException e) { + logger.error(tb_mq.class, e); + } + } + } + } + + /** + * msgProcess 消息处理 + * + * @param message + * @return + */ + public static boolean msgProcess(MsgInfo msginfo) { + boolean res = false; + try { + if (msginfo.topic.equals("taobao_trade_TradeBuyerPay")) { + res = processTradeBuyerPayMsg(msginfo.topic, msginfo.content); + } else if (msginfo.topic.equals("taobao_trade_TradeMemoModified")) { + res = processTradeMemoModifiedMsg(msginfo.topic, msginfo.content); + } else { + res = true; + } + } catch (Exception e) { + logger.error(tb_mq.class, e); + } + return res; + } + + /** + * processTradeBuyerPayMsg 处理消息类型——客户已付款 + * + * @param str + * @return + */ + public static boolean processTradeBuyerPayMsg(String topic, String content) { + boolean res = false; + try { + JSONObject json = new JSONObject(content); + long tid = json.getLong("tid"); + String seller_nick = json.getString("seller_nick"); + ShopConfig shopConfig = getShopConfig(seller_nick); + if (shopConfig == null) { + logger.info("[ 错误 ] 店铺:[ {} ]配置不存在,订单 [ {} ] 需人工处理!", seller_nick, tid); + return true; + } + + // 查询订单详细信息 + TaobaoClient client = new DefaultTaobaoClient(config.app_apiurl, config.app_key, config.app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields( + "seller_nick,tid,type,status,payment,alipay_id,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + + ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip" + + ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, shopConfig.session_key); + String tradeInfoStr = rsp.getBody(); + System.out.println(tradeInfoStr); + // json数据预解析,判断是否正确返回trade_fullinfo_get_response,如果返回error_response,则做异常处理 + JSONObject json_test = new JSONObject(tradeInfoStr); + if (json_test.has("error_response")) { + return false; + } + return parseApiData(shopConfig, topic, tradeInfoStr); + } catch (JSONException e) { + logger.error(tb_mq.class, e); + logger.error("[ ERROR ] JSON解析错误:{}", e.toString()); + } catch (ApiException e) { + logger.error(tb_mq.class, e); + logger.error("[ ERROR ] API调用错误:{}", e.toString()); + } + return res; + } + + /** + * processTradeMemoModifiedMsg 处理消息类型——修改备注 + * + * @param str + * @return + */ + public static boolean processTradeMemoModifiedMsg(String topic, String content) { + boolean res = false; + try { + JSONObject json = new JSONObject(content); + long tid = json.getLong("tid"); + String buyer_nick = json.getString("buyer_nick"); + String payment = json.getString("payment"); + String type = json.getString("type"); + String seller_nick = json.getString("seller_nick"); + ShopConfig shopConfig = getShopConfig(seller_nick); + if (shopConfig == null) { + logger.info("[ 错误 ] 店铺:[ {} ],配置不存在,订单 [ {} ] 需人工处理!", seller_nick, tid); + return true; + } + + TaobaoClient client = new DefaultTaobaoClient(config.app_apiurl, config.app_key, config.app_secret); + TradeFullinfoGetRequest req = new TradeFullinfoGetRequest(); + req.setFields("seller_nick,tid,buyer_message,seller_memo,trade_memo,buyer_memo"); + req.setTid(tid); + TradeFullinfoGetResponse rsp = client.execute(req, shopConfig.session_key); + + String tradeInfoStr = rsp.getBody(); + System.out.println(tradeInfoStr); + // json数据预解析,判断是否正确返回trade_fullinfo_get_response,如果返回error_response,则做异常处理 + JSONObject json_test = new JSONObject(tradeInfoStr); + if (json_test.has("error_response")) { + return false; + } + if (tradeInfoStr.indexOf("seller_memo") < 0) { + logger.info("[ 系统 ] 无卖家备注,修改备注消息不做处理!订单号:[ {} ]", tid); + return true; + } + return parseApiData(shopConfig, topic, tradeInfoStr); + } catch (JSONException e) { + logger.error(tb_mq.class, e); + logger.error("[ ERROR ]JSON解析错误:{}", e.toString()); + } catch (ApiException e) { + logger.error(tb_mq.class, e); + logger.error("[ ERROR ] API调用错误:{}", e.toString()); + } + return res; + } + + /** + * parseApiData 解析接口返回数据 + * + * @param data + */ + private static boolean parseApiData(ShopConfig shopConfig, String topic, String jsonString) { + try { + JSONObject json = new JSONObject(jsonString); + + JSONObject trade_fullinfo_get_response = json.getJSONObject("trade_fullinfo_get_response"); + JSONObject trade = trade_fullinfo_get_response.getJSONObject("trade"); + + TradeInfo tradeInfo = null; + if (topic.equals("taobao_trade_TradeBuyerPay")) { + tradeInfo = parseNewTrade(trade, shopConfig); + } else if (topic.equals("taobao_trade_TradeMemoModified")) { + tradeInfo = parseMemoTrade(trade, shopConfig); + } + + if (tradeInfo == null) { + logger.info("[ 系统 ] 接口数据解析失败"); + return false; + } + + Connection conn = null; + Statement statement = null; + try { + String url = "jdbc:mysql://" + config.db_host + ":3306/EMP?useUnicode=true&characterEncoding=UTF-8"; + String user = config.db_user; + String password = config.db_password; + Class.forName("com.mysql.jdbc.Driver"); + conn = DriverManager.getConnection(url, user, password); + statement = conn.createStatement(); + if (topic.equals("taobao_trade_TradeBuyerPay")) { + if (findTrade(tradeInfo, statement)) { + logger.info("订单已存在"); + } else { + insertTrade(tradeInfo, statement); + } + } else if (topic.equals("taobao_trade_TradeMemoModified")) { + updateTradeTransaction(tradeInfo, conn); + } + logger.info("数据处理成功"); + // msginfo.writer.println("数据处理成功"); + // msginfo.writer.flush(); + return true; + } catch (Exception e) { + logger.error(tb_mq.class, e); + return false; + } finally { + if (statement != null) { + statement.close(); + statement = null; + } + if (conn != null) { + conn.close(); + conn = null; + } + } + } catch (Exception e) { + logger.error(tb_mq.class, e); + return false; + } + } + + /** + * parseNewTrade 解析单条新订单数据,生成tradeInfo对象 + * + * @param jsonTrade + * @param order_origin_id + * @param brand_list + * @return + */ + private static TradeInfo parseNewTrade(JSONObject jsonTrade, ShopConfig shopConfig) { + TradeInfo tradeInfo = new TradeInfo(); + try { + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.shop_code; + tradeInfo.brand = shopConfig.brand; + tradeInfo.tid = jsonTrade.getString("tid"); + tradeInfo.status = jsonTrade.getString("status"); + tradeInfo.type = jsonTrade.getString("type"); + tradeInfo.alipay_no = jsonTrade.getString("alipay_no"); + tradeInfo.alipay_id = jsonTrade.getString("alipay_id"); + tradeInfo.num = 0; + // tradeInfo.payment = jsonTrade.getString("payment"); + tradeInfo.created = jsonTrade.getString("created"); + tradeInfo.pay_time = jsonTrade.getString("pay_time"); + tradeInfo.post_fee = jsonTrade.getString("post_fee"); + tradeInfo.buyer_nick = jsonTrade.getString("buyer_nick"); + tradeInfo.receiver_name = jsonTrade.getString("receiver_name"); + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_name = tradeInfo.receiver_name.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_country = jsonTrade.has("receiver_country") ? jsonTrade.getString("receiver_country") + : ""; + if (tradeInfo.receiver_country.equals("")) { + tradeInfo.receiver_country = "中国"; + } + tradeInfo.receiver_state = jsonTrade.has("receiver_state") ? jsonTrade.getString("receiver_state") : ""; + tradeInfo.receiver_city = jsonTrade.has("receiver_city") ? jsonTrade.getString("receiver_city") : ""; + tradeInfo.receiver_district = jsonTrade.has("receiver_district") ? jsonTrade.getString("receiver_district") + : ""; + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + jsonTrade.getString("receiver_address"); + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\"", "");// 去双引号 + tradeInfo.receiver_address = tradeInfo.receiver_address.replaceAll("\\\'", "");// 去单引号 + tradeInfo.receiver_mobile = jsonTrade.has("receiver_mobile") ? jsonTrade.getString("receiver_mobile") : ""; + tradeInfo.receiver_phone = jsonTrade.has("receiver_phone") ? jsonTrade.getString("receiver_phone") : ""; + tradeInfo.receiver_zip = jsonTrade.has("receiver_zip") ? jsonTrade.getString("receiver_zip") : ""; + tradeInfo.buyer_message = jsonTrade.has("buyer_message") ? jsonTrade.getString("buyer_message") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + tradeInfo.seller_memo = jsonTrade.has("seller_memo") ? jsonTrade.getString("seller_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + // tradeInfo.total_fee = jsonTrade.getString("total_fee"); + tradeInfo.adjust_fee = jsonTrade.getString("adjust_fee"); + tradeInfo.discount_fee = jsonTrade.getString("discount_fee"); + + JSONObject orders = jsonTrade.getJSONObject("orders"); + JSONArray aOrder = orders.getJSONArray("order"); + tradeInfo.orders = new OrderInfo[aOrder.length()]; + for (int i = 0; i < aOrder.length(); i++) { + JSONObject order = aOrder.getJSONObject(i); + OrderInfo orderInfo = new OrderInfo(); + orderInfo.outer_sku_id = order.has("outer_sku_id") ? order.getString("outer_sku_id") : ""; + orderInfo.outer_iid = order.has("outer_iid") ? order.getString("outer_iid") : ""; + orderInfo.num = order.getInt("num"); + tradeInfo.num += orderInfo.num;// 计算订单总数量 + orderInfo.price = order.getString("price"); + orderInfo.payment = order.getString("payment"); + orderInfo.title = order.getString("title"); + orderInfo.sku_properties_name = order.has("sku_properties_name") + ? order.getString("sku_properties_name") + : ""; + orderInfo.discount_fee = order.getString("discount_fee"); + orderInfo.total_fee = order.getString("total_fee"); + orderInfo.adjust_fee = order.getString("adjust_fee"); + orderInfo.status = order.getString("status"); + tradeInfo.orders[i] = orderInfo; + } + } catch (JSONException e) { + logger.error("订单解析失败:[ {} ]", tradeInfo.tid); + logger.error(MsgServiceServer.class, e); + return null; + } + return tradeInfo; + } + + /** + * parseMemoTrade 解析单条备注订单数据,生成tradeInfo对象 + * + * @param jsonTrade + * @param order_origin_id + * @param brand_list + * @return + */ + private static TradeInfo parseMemoTrade(JSONObject jsonTrade, ShopConfig shopConfig) { + TradeInfo tradeInfo = new TradeInfo(); + try { + tradeInfo.company_code = shopConfig.company_code; + tradeInfo.shop_code = shopConfig.shop_code; + tradeInfo.brand = shopConfig.brand; + tradeInfo.tid = jsonTrade.getString("tid"); + tradeInfo.buyer_message = jsonTrade.has("buyer_message") ? jsonTrade.getString("buyer_message") : ""; + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\"", "");// 去双引号 + tradeInfo.buyer_message = tradeInfo.buyer_message.replaceAll("\\\'", "");// 去单引号 + tradeInfo.seller_memo = jsonTrade.has("seller_memo") ? jsonTrade.getString("seller_memo") : ""; + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\"", "");// 去双引号 + tradeInfo.seller_memo = tradeInfo.seller_memo.replaceAll("\\\'", "");// 去单引号 + } catch (JSONException e) { + logger.error("订单解析失败:[ {} ]", tradeInfo.tid); + logger.error(tb_mq.class, e); + return null; + } + return tradeInfo; + } + + /** + * getShopConfig 根据店铺名称获取店铺配置 + * + * @param shopName + * @return + */ + private static ShopConfig getShopConfig(String shopName) { + ShopConfig res = null; + for (int i = 0; i < config.shop_list.size(); i++) { + ShopConfig shopConfig = config.shop_list.get(i); + if (shopConfig.shop_name.equals(shopName)) { + res = shopConfig; + break; + } + } + return res; + } + + /*** + * ---------------------------------数据库------------------------------------- + * - + ***/ + + /** + * getDbConn 获取数据库连接 用完需要关闭 + * + * @return + */ + private static Connection getDbConn() { + Connection conn = null; + try { + String url = "jdbc:mysql://" + config.db_host + ":3306/EMP?useUnicode=true&characterEncoding=UTF-8"; + String user = config.db_user; + String password = config.db_password; + Class.forName("com.mysql.jdbc.Driver"); + conn = DriverManager.getConnection(url, user, password); + } catch (Exception e) { + logger.error(tb_mq.class, e); + } + return conn; + } + + private static void readShopConfig(String shops) throws Exception { + Connection conn = null; + Statement statement = null; + try { + conn = getDbConn(); + statement = conn.createStatement(); + String[] shop_array = shops.split(","); + shops = ""; + for (String x : shop_array) { + shops = shops + ",'" + x + "'"; + } + shops = shops.substring(1, shops.length()); + String sql = "select a.company_code,a.code,a.name,a.session_key,b.name as brand from tb_shop a, tb_brand_dic b where a.brand_code=b.code and a.name in (" + + shops + ")"; + ResultSet rs = statement.executeQuery(sql); + config.shop_list = new ArrayList(); + while (rs.next()) { + ShopConfig shopConfig = new ShopConfig(); + shopConfig.company_code = rs.getString("company_code"); + shopConfig.shop_code = rs.getString("code"); + shopConfig.shop_name = rs.getString("name"); + shopConfig.session_key = rs.getString("session_key"); + shopConfig.brand = rs.getString("brand"); + config.shop_list.add(shopConfig); + } + } catch (Exception e) { + logger.error(tb_mq.class, e); + } finally { + if (statement != null) { + statement.close(); + statement = null; + } + if (conn != null) { + conn.close(); + conn = null; + } + } + } + + /** + * findTrade 查询订单是否存在 + * + * @param tradeInfo + * @param statement + * @return + * @throws SQLException + */ + private static boolean findTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + Boolean res = false; + String sql = "select code from tb_sale_order where platform_code='" + tradeInfo.tid + "'"; + ResultSet rs = statement.executeQuery(sql); + if (rs.next()) { + res = true; + } + rs.close(); + return res; + } + + /** + * updateTrade 更新订单数据 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void updateTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + String sqlstr = "update tb_sale_order set seller_note='" + tradeInfo.seller_memo + + "' where platform_order_code='" + tradeInfo.tid + "'"; + logger.info(sqlstr); + statement.executeUpdate(sqlstr); + } + + /** + * updateTradeTransaction 更新订单数据——事务方式 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void updateTradeTransaction(TradeInfo tradeInfo, Connection conn) { + PreparedStatement ps = null; + try { + conn.setAutoCommit(false); + String sqlstr = "update tb_sale_order set seller_note='" + tradeInfo.seller_memo + + "' where type=2 and platform_code='" + tradeInfo.tid + "'"; + ps = conn.prepareCall(sqlstr); + logger.info(sqlstr); + ps.executeUpdate(); + conn.commit(); + } catch (Exception e) { + logger.error(tb_mq.class, e); + logger.error("更新事务执行失败:{}", e.toString()); + try { + conn.rollback(); + } catch (SQLException e1) { + logger.error(tb_mq.class, e); + logger.error("回滚执行失败:{}", e.toString()); + } + } finally { + try { + conn.setAutoCommit(true); + ps.close(); + } catch (SQLException e) { + logger.error(tb_mq.class, e); + } + } + + } + + /** + * insertTrade 新增订单数据 + * + * @param tradeInfo + * @param statement + * @throws SQLException + */ + private static void insertTrade(TradeInfo tradeInfo, Statement statement) throws SQLException { + // 生成系统订单号 + String[] a = tradeInfo.created.split(" "); + String order_code = a[0].replaceAll("-", ""); + int seq = getSeq(statement);// 获取流水号 + order_code = "XT" + order_code + seq; + + // 插入订单 + String column = "(code" + ",original_sale_order_code" + ",platform_code" + ",pay_account" + ",pay_no" + + ",platform_status" + ",platform_type" + ",brand_list" + ",quantity" + ",money" + ",type" + + ",buyer_nick_name" + ",platform_create_time" + ",buyer_message" + ",seller_note" + ",pay_money" + + ",total_fee" + ",adjust_fee" + ",discount_fee" + ",pay_time" + ",invoice_type" + ",pay_mode_id" + + ",shop_code" + ",company_code" + ",trade_mode_id" + ",cur_delivery_order_code" + ",cur_money" + + ",cur_quantity" + ",cur_invoice_type)"; + String value = "('" + order_code + "'" + ",'" + order_code + "'" + ",'" + tradeInfo.tid + "'" + ",'" + + tradeInfo.alipay_id + "'" + ",'" + tradeInfo.alipay_no + "'" + ",'" + tradeInfo.status + "'" + ",'" + + tradeInfo.type + "'" + ",'" + tradeInfo.brand + "'" + "," + tradeInfo.num + // + "," + tradeInfo.payment + + ",1" + ",'" + tradeInfo.buyer_nick + "'" + ",'" + tradeInfo.created + "'" + ",'" + + tradeInfo.buyer_message + "'" + ",'" + tradeInfo.seller_memo + "'" + // + "," + tradeInfo.payment + // + "," + tradeInfo.total_fee + + "," + tradeInfo.adjust_fee + "," + tradeInfo.discount_fee + ",'" + tradeInfo.pay_time + "'" + ",1" + + ",6" + ",'" + tradeInfo.shop_code + "'" + ",'" + tradeInfo.company_code + "'" + ",1" + ",'" + "PS" + + order_code + "'" + // + "," + tradeInfo.payment + + "," + tradeInfo.num + ",1)"; + String sqlstr = "insert into tb_sale_order " + column + " values " + value; + logger.info(sqlstr); + statement.executeUpdate(sqlstr); + + // 插入商品 + for (int i = 0; i < tradeInfo.orders.length; i++) { + OrderInfo orderInfo = tradeInfo.orders[i]; + String commodity_code = (orderInfo.outer_sku_id.equals("") ? orderInfo.outer_iid : orderInfo.outer_sku_id); + String column_order = "(code" + ",sale_order_code" + ",commodity_code" + ",quantity" + ",unit_price" + + ",money" + ",commodity_title" + ",Sku_message" + ",account" + ",total_fee" + ",adjust_fee)"; + String value_order = "(" + "'" + order_code + "_" + (i + 1) + "'" + ",'" + order_code + "'" + ",'" + + commodity_code + "'" + "," + orderInfo.num + "," + orderInfo.price + "," + orderInfo.payment + + ",'" + orderInfo.title + "'" + ",'" + orderInfo.sku_properties_name + "'" + "," + + orderInfo.discount_fee + "," + orderInfo.total_fee + "," + orderInfo.adjust_fee + ")"; + String sqlstr_order = "insert into tb_sale_order_items " + column_order + " values " + value_order; + logger.info(sqlstr_order); + statement.executeUpdate(sqlstr_order); + } + + // 插入配送单 + String column_delivery = "(code" + ",sale_order_code" + ",cost" + ",country" + ",state" + ",city" + ",district" + + ",post_code" + ",delivery_mode_code" + ",company_code" + ",name" + ",mobile" + ",address" + + ",telephone)"; + String value_delivery = "('" + "PS" + order_code + "'" + ",'" + order_code + "'" + "," + tradeInfo.post_fee + + ",'" + tradeInfo.receiver_country + "'" + ",'" + tradeInfo.receiver_state + "'" + ",'" + + tradeInfo.receiver_city + "'" + ",'" + tradeInfo.receiver_district + "'" + ",'" + + tradeInfo.receiver_zip + "'" + ",2" + ",'" + tradeInfo.company_code + "'" + ",'" + + tradeInfo.receiver_name + "'" + ",'" + tradeInfo.receiver_mobile + "'" + ",'" + + tradeInfo.receiver_address + "'" + ",'" + tradeInfo.receiver_phone + "'" + ")"; + String sqlstr_delivery = "insert into tb_delivery_order " + column_delivery + " values " + value_delivery; + logger.info(sqlstr_delivery); + statement.executeUpdate(sqlstr_delivery); + } + + /** + * getSeq 获取系统订单号后4位序列码 + * + * @param statement + * @return + * @throws SQLException + */ + private static int getSeq(Statement statement) throws SQLException { + int res = 0; + String sqlstr = "select _getCpySeq('0001') as seq"; + ResultSet rs = statement.executeQuery(sqlstr); + if (rs.next()) { + res = rs.getInt("seq"); + } + rs.close(); + return res; + } + + /** + * getLastSaleId 获取最后插入的saleId,供订单条目表写入关联订单号使用 + * + * @param statement + * @return + * @throws SQLException + */ + private static String getLastSaleId(Statement statement) throws SQLException { + String res = "0"; + String sql_seq = "select LAST_INSERT_ID() as id from tb_sale_order LIMIT 0,1"; + ResultSet rs = statement.executeQuery(sql_seq); + rs.next(); + res = rs.getString("id"); + rs.close(); + return res; + } + +} \ No newline at end of file diff --git a/src/com/since/emp/test/AddressTest.java b/src/com/since/emp/test/AddressTest.java new file mode 100644 index 0000000..aa704e8 --- /dev/null +++ b/src/com/since/emp/test/AddressTest.java @@ -0,0 +1,823 @@ +package com.since.emp.test; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.service.OrderSyncs; + +public class AddressTest extends OrderSyncs { + private static final Logger logger = LogManager.getLogger(AddressTest.class); + + public static void main(String[] args) throws Exception { + Map textRecognitionInfo = getTextRecognitionInfo("河南郑州市新密市超化镇河南省"); + System.out.println(textRecognitionInfo); + } + public static void getAddress() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + List list = new ArrayList(15000000); + sql = "select address from tb_delivery_order2 limit 10000"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("address") == null) { + continue; + } + String address = rs.getString("address"); + + list.add(address); + } + + matchAddress(list); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + public static void matchAddress(List list) { + logger.info("地址总条目数:{}", list.size()); + int count = 0; + for (int i = 0; i < list.size(); i++) { + try { + + if (i % 1000 == 0) { + System.out.println("完成数量:" + i); + } + String address = list.get(i); +// Map row = addressResolution(address); + Map row = getTextRecognitionInfo(address); + if (row.size() == 4) { +// System.out.println("成功解析:" + row); + count++; + } else { +// System.out.println(row); +// logger.info("不能解析的address:" + address); + insertUnmatchAddress(address); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + logger.info("解析成功的条目数:{}", count); + + logger.info("解析成功率:{}%", (count / (list.size() * 1.0)) * 100); + } + + /** + * @Description: 方法1 + * @Title: addressResolution + * @author Lewis + * @param address + * @return map + */ + public static Map addressResolution(String address) { + String regex = "(?[^省]+^自治区|.*?自治区|.*?省|.*?行政区|.*?市)(?上海城区|北京城区|天津城区|重庆城区|重庆郊县|[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|香港岛|九龙|新界|澳门半岛|离岛|.*?市|.*?县)"; + String countyRegex = "(?121团炮台镇|井陉县|正定县|行唐县|灵寿县|高邑县|深泽县|赞皇县|无极县|平山县|元氏县|赵县|辛集市|晋州市|新乐市|滦县|滦南县|乐亭县|迁西县|玉田县|遵化市|迁安市|青龙满族自治县|昌黎县|卢龙县|临漳县|成安县|大名县|涉县|磁县|邱县|鸡泽县|广平县|馆陶县|魏县|曲周县|武安市|邢台县|临城县|内丘县|柏乡县|隆尧县|任县|南和县|宁晋县|巨鹿县|新河县|广宗县|平乡县|威县|清河县|临西县|南宫市|沙河市|涞水县|阜平县|定兴县|唐县|高阳县|容城县|涞源县|望都县|安新县|易县|曲阳县|蠡县|顺平县|博野县|雄县|涿州市|定州市|安国市|高碑店市|张北县|康保县|沽源县|尚义县|蔚县|阳原县|怀安县|怀来县|涿鹿县|赤城县|承德县|兴隆县|滦平县|隆化县|丰宁满族自治县|宽城满族自治县|围场满族蒙古族自治县|平泉市|沧县|青县|东光县|海兴县|盐山县|肃宁县|南皮县|吴桥县|献县|孟村回族自治县|泊头市|任丘市|黄骅市|河间市|固安县|永清县|香河县|大城县|文安县|大厂回族自治县|霸州市|三河市|枣强县|武邑县|武强县|饶阳县|安平县|故城县|景县|阜城县|深州市|清徐县|阳曲县|娄烦县|古交市|阳高县|天镇县|广灵县|灵丘县|浑源县|左云县|大同县|平定县|盂县|长治县|襄垣县|屯留县|平顺县|黎城县|壶关县|长子县|武乡县|沁县|沁源县|潞城市|沁水县|阳城县|陵川县|泽州县|高平市|山阴县|应县|右玉县|怀仁县|榆社县|左权县|和顺县|昔阳县|寿阳县|太谷县|祁县|平遥县|灵石县|介休市|临猗县|万荣县|闻喜县|稷山县|新绛县|绛县|垣曲县|夏县|平陆县|芮城县|永济市|河津市|定襄县|五台县|代县|繁峙县|宁武县|静乐县|神池县|五寨县|岢岚县|河曲县|保德县|偏关县|原平市|曲沃县|翼城县|襄汾县|洪洞县|古县|安泽县|浮山县|吉县|乡宁县|大宁县|隰县|永和县|蒲县|汾西县|侯马市|霍州市|文水县|交城县|兴县|临县|柳林县|石楼县|岚县|方山县|中阳县|交口县|孝义市|汾阳市|土默特左旗|托克托县|和林格尔县|清水河县|武川县|土默特右旗|固阳县|达尔罕茂明安联合旗|阿鲁科尔沁旗|巴林左旗|巴林右旗|林西县|克什克腾旗|翁牛特旗|喀喇沁旗|宁城县|敖汉旗|科尔沁左翼中旗|科尔沁左翼后旗|开鲁县|库伦旗|奈曼旗|扎鲁特旗|霍林郭勒市|达拉特旗|准格尔旗|鄂托克前旗|鄂托克旗|杭锦旗|乌审旗|伊金霍洛旗|阿荣旗|莫力达瓦达斡尔族自治旗|鄂伦春自治旗|鄂温克族自治旗|陈巴尔虎旗|新巴尔虎左旗|新巴尔虎右旗|满洲里市|牙克石市|扎兰屯市|额尔古纳市|根河市|五原县|磴口县|乌拉特前旗|乌拉特中旗|乌拉特后旗|杭锦后旗|卓资县|化德县|商都县|兴和县|凉城县|察哈尔右翼前旗|察哈尔右翼中旗|察哈尔右翼后旗|四子王旗|丰镇市|乌兰浩特市|阿尔山市|科尔沁右翼前旗|科尔沁右翼中旗|扎赉特旗|突泉县|二连浩特市|锡林浩特市|阿巴嘎旗|苏尼特左旗|苏尼特右旗|东乌珠穆沁旗|西乌珠穆沁旗|太仆寺旗|镶黄旗|正镶白旗|正蓝旗|多伦县|阿拉善左旗|阿拉善右旗|额济纳旗|康平县|法库县|新民市|长海县|瓦房店市|庄河市|台安县|岫岩满族自治县|海城市|抚顺县|新宾满族自治县|清原满族自治县|本溪满族自治县|桓仁满族自治县|宽甸满族自治县|东港市|凤城市|黑山县|义县|凌海市|北镇市|盖州市|大石桥市|阜新蒙古族自治县|彰武县|辽阳县|灯塔市|盘山县|铁岭县|西丰县|昌图县|调兵山市|开原市|朝阳县|建平县|喀喇沁左翼蒙古族自治县|北票市|凌源市|绥中县|建昌县|兴城市|农安县|榆树市|德惠市|永吉县|蛟河市|桦甸市|舒兰市|磐石市|梨树县|伊通满族自治县|公主岭市|双辽市|东丰县|东辽县|通化县|辉南县|柳河县|梅河口市|集安市|抚松县|靖宇县|长白朝鲜族自治县|临江市|前郭尔罗斯蒙古族自治县|长岭县|乾安县|扶余市|镇赉县|通榆县|洮南市|大安市|延吉市|图们市|敦化市|珲春市|龙井市|和龙市|汪清县|安图县|依兰县|方正县|宾县|巴彦县|木兰县|通河县|延寿县|尚志市|五常市|龙江县|依安县|泰来县|甘南县|富裕县|克山县|克东县|拜泉县|讷河市|鸡东县|虎林市|密山市|萝北县|绥滨县|集贤县|友谊县|宝清县|饶河县|肇州县|肇源县|林甸县|杜尔伯特蒙古族自治县|嘉荫县|铁力市|桦南县|桦川县|汤原县|同江市|富锦市|抚远市|勃利县|林口县|绥芬河市|海林市|宁安市|穆棱市|东宁市|嫩江县|逊克县|孙吴县|北安市|五大连池市|望奎县|兰西县|青冈县|庆安县|明水县|绥棱县|安达市|肇东市|海伦市|呼玛县|塔河县|漠河县|江阴市|宜兴市|丰县|沛县|睢宁县|新沂市|邳州市|溧阳市|常熟市|张家港市|昆山市|太仓市|海安县|如东县|启东市|如皋市|海门市|东海县|灌云县|灌南县|涟水县|盱眙县|金湖县|响水县|滨海县|阜宁县|射阳县|建湖县|东台市|宝应县|仪征市|高邮市|丹阳市|扬中市|句容市|兴化市|靖江市|泰兴市|沭阳县|泗阳县|泗洪县|桐庐县|淳安县|建德市|象山县|宁海县|余姚市|慈溪市|永嘉县|平阳县|苍南县|文成县|泰顺县|瑞安市|乐清市|嘉善县|海盐县|海宁市|平湖市|桐乡市|德清县|长兴县|安吉县|新昌县|诸暨市|嵊州市|武义县|浦江县|磐安县|兰溪市|义乌市|东阳市|永康市|常山县|开化县|龙游县|江山市|岱山县|嵊泗县|三门县|天台县|仙居县|温岭市|临海市|玉环市|青田县|缙云县|遂昌县|松阳县|云和县|庆元县|景宁畲族自治县|龙泉市|长丰县|肥东县|肥西县|庐江县|巢湖市|芜湖县|繁昌县|南陵县|无为县|怀远县|五河县|固镇县|凤台县|寿县|当涂县|含山县|和县|濉溪县|枞阳县|怀宁县|潜山县|太湖县|宿松县|望江县|岳西县|桐城市|歙县|休宁县|黟县|祁门县|来安县|全椒县|定远县|凤阳县|天长市|明光市|临泉县|太和县|阜南县|颍上县|界首市|砀山县|萧县|灵璧县|泗县|霍邱县|舒城县|金寨县|霍山县|涡阳县|蒙城县|利辛县|东至县|石台县|青阳县|郎溪县|广德县|泾县|绩溪县|旌德县|宁国市|闽侯县|连江县|罗源县|闽清县|永泰县|平潭县|福清市|仙游县|明溪县|清流县|宁化县|大田县|尤溪县|沙县|将乐县|泰宁县|建宁县|永安市|惠安县|安溪县|永春县|德化县|金门县|石狮市|晋江市|南安市|云霄县|漳浦县|诏安县|长泰县|东山县|南靖县|平和县|华安县|龙海市|顺昌县|浦城县|光泽县|松溪县|政和县|邵武市|武夷山市|建瓯市|长汀县|上杭县|武平县|连城县|漳平市|霞浦县|古田县|屏南县|寿宁县|周宁县|柘荣县|福安市|福鼎市|南昌县|安义县|进贤县|浮梁县|乐平市|莲花县|上栗县|芦溪县|武宁县|修水县|永修县|德安县|都昌县|湖口县|彭泽县|瑞昌市|共青城市|庐山市|分宜县|余江县|贵溪市|信丰县|大余县|上犹县|崇义县|安远县|龙南县|定南县|全南县|宁都县|于都县|兴国县|会昌县|寻乌县|石城县|瑞金市|吉安县|吉水县|峡江县|新干县|永丰县|泰和县|遂川县|万安县|安福县|永新县|井冈山市|奉新县|万载县|上高县|宜丰县|靖安县|铜鼓县|丰城市|樟树市|高安市|南城县|黎川县|南丰县|崇仁县|乐安县|宜黄县|金溪县|资溪县|广昌县|玉山县|铅山县|横峰县|弋阳县|余干县|鄱阳县|万年县|婺源县|德兴市|平阴县|济阳县|商河县|胶州市|平度市|莱西市|桓台县|高青县|沂源县|滕州市|利津县|广饶县|长岛县|龙口市|莱阳市|莱州市|蓬莱市|招远市|栖霞市|海阳市|临朐县|昌乐县|青州市|诸城市|寿光市|安丘市|高密市|昌邑市|微山县|鱼台县|金乡县|嘉祥县|汶上县|泗水县|梁山县|曲阜市|邹城市|宁阳县|东平县|新泰市|肥城市|荣成市|乳山市|五莲县|莒县|沂南县|郯城县|沂水县|兰陵县|费县|平邑县|莒南县|蒙阴县|临沭县|宁津县|庆云县|临邑县|齐河县|平原县|夏津县|武城县|乐陵市|禹城市|阳谷县|莘县|茌平县|东阿县|冠县|高唐县|临清市|惠民县|阳信县|无棣县|博兴县|邹平县|曹县|单县|成武县|巨野县|郓城县|鄄城县|东明县|中牟县|巩义市|荥阳市|新密市|新郑市|登封市|杞县|通许县|尉氏县|兰考县|孟津县|新安县|栾川县|嵩县|汝阳县|宜阳县|洛宁县|伊川县|偃师市|宝丰县|叶县|鲁山县|郏县|舞钢市|汝州市|安阳县|汤阴县|滑县|内黄县|林州市|浚县|淇县|新乡县|获嘉县|原阳县|延津县|封丘县|长垣县|卫辉市|辉县市|修武县|博爱县|武陟县|温县|沁阳市|孟州市|清丰县|南乐县|范县|台前县|濮阳县|鄢陵县|襄城县|禹州市|长葛市|舞阳县|临颍县|渑池县|卢氏县|义马市|灵宝市|南召县|方城县|西峡县|镇平县|内乡县|淅川县|社旗县|唐河县|新野县|桐柏县|邓州市|民权县|睢县|宁陵县|柘城县|虞城县|夏邑县|永城市|罗山县|光山县|新县|商城县|固始县|潢川县|淮滨县|息县|扶沟县|西华县|商水县|沈丘县|郸城县|淮阳县|太康县|鹿邑县|项城市|西平县|上蔡县|平舆县|正阳县|确山县|泌阳县|汝南县|遂平县|新蔡县|阳新县|大冶市|郧西县|竹山县|竹溪县|房县|丹江口市|远安县|兴山县|秭归县|长阳土家族自治县|五峰土家族自治县|宜都市|当阳市|枝江市|南漳县|谷城县|保康县|老河口市|枣阳市|宜城市|京山县|沙洋县|钟祥市|孝昌县|大悟县|云梦县|应城市|安陆市|汉川市|公安县|监利县|江陵县|石首市|洪湖市|松滋市|团风县|红安县|罗田县|英山县|浠水县|蕲春县|黄梅县|麻城市|武穴市|嘉鱼县|通城县|崇阳县|通山县|赤壁市|随县|广水市|恩施市|利川市|建始县|巴东县|宣恩县|咸丰县|来凤县|鹤峰县|长沙县|浏阳市|宁乡市|宁乡县|株洲县|攸县|茶陵县|炎陵县|醴陵市|湘潭县|湘乡市|韶山市|衡阳县|衡南县|衡山县|衡东县|祁东县|耒阳市|常宁市|邵东县|新邵县|邵阳县|隆回县|洞口县|绥宁县|新宁县|城步苗族自治县|武冈市|岳阳县|华容县|湘阴县|平江县|汨罗市|临湘市|安乡县|汉寿县|澧县|临澧县|桃源县|石门县|津市市|慈利县|桑植县|南县|桃江县|安化县|沅江市|桂阳县|宜章县|永兴县|嘉禾县|临武县|汝城县|桂东县|安仁县|资兴市|祁阳县|东安县|双牌县|道县|江永县|宁远县|蓝山县|新田县|江华瑶族自治县|中方县|沅陵县|辰溪县|溆浦县|会同县|麻阳苗族自治县|新晃侗族自治县|芷江侗族自治县|靖州苗族侗族自治县|通道侗族自治县|洪江市|双峰县|新化县|冷水江市|涟源市|吉首市|泸溪县|凤凰县|花垣县|保靖县|古丈县|永顺县|龙山县|始兴县|仁化县|翁源县|乳源瑶族自治县|新丰县|乐昌市|南雄市|澳门大学横琴校区(由澳门管辖)|南澳县|台山市|开平市|鹤山市|恩平市|遂溪县|徐闻县|廉江市|雷州市|吴川市|高州市|化州市|信宜市|广宁县|怀集县|封开县|德庆县|四会市|博罗县|惠东县|龙门县|大埔县|丰顺县|五华县|平远县|蕉岭县|兴宁市|海丰县|陆河县|陆丰市|紫金县|龙川县|连平县|和平县|东源县|阳西县|阳春市|佛冈县|阳山县|连山壮族瑶族自治县|连南瑶族自治县|英德市|连州市|饶平县|揭西县|惠来县|普宁市|新兴县|郁南县|罗定市|隆安县|马山县|上林县|宾阳县|横县|柳城县|鹿寨县|融安县|融水苗族自治县|三江侗族自治县|阳朔县|灵川县|全州县|兴安县|永福县|灌阳县|龙胜各族自治县|资源县|平乐县|荔浦县|恭城瑶族自治县|苍梧县|藤县|蒙山县|岑溪市|合浦县|上思县|东兴市|灵山县|浦北县|平南县|桂平市|容县|陆川县|博白县|兴业县|北流市|田东县|平果县|德保县|那坡县|凌云县|乐业县|田林县|西林县|隆林各族自治县|靖西市|昭平县|钟山县|富川瑶族自治县|南丹县|天峨县|凤山县|东兰县|罗城仫佬族自治县|环江毛南族自治县|巴马瑶族自治县|都安瑶族自治县|大化瑶族自治县|忻城县|象州县|武宣县|金秀瑶族自治县|合山市|扶绥县|宁明县|龙州县|大新县|天等县|凭祥市|西沙群岛|南沙群岛|中沙群岛的岛礁及其海域|城口县|丰都县|垫江县|忠县|云阳县|奉节县|巫山县|巫溪县|石柱土家族自治县|秀山土家族苗族自治县|酉阳土家族苗族自治县|彭水苗族土家族自治县|金堂县|大邑县|蒲江县|新津县|都江堰市|彭州市|邛崃市|崇州市|简阳市|荣县|富顺县|米易县|盐边县|泸县|合江县|叙永县|古蔺县|中江县|广汉市|什邡市|绵竹市|三台县|盐亭县|梓潼县|北川羌族自治县|平武县|江油市|旺苍县|青川县|剑阁县|苍溪县|蓬溪县|射洪县|大英县|威远县|资中县|隆昌市|犍为县|井研县|夹江县|沐川县|峨边彝族自治县|马边彝族自治县|峨眉山市|南部县|营山县|蓬安县|仪陇县|西充县|阆中市|仁寿县|洪雅县|丹棱县|青神县|宜宾县|江安县|长宁县|高县|珙县|筠连县|兴文县|屏山县|岳池县|武胜县|邻水县|华蓥市|宣汉县|开江县|大竹县|渠县|万源市|荥经县|汉源县|石棉县|天全县|芦山县|宝兴县|通江县|南江县|平昌县|安岳县|乐至县|马尔康市|汶川县|理县|茂县|松潘县|九寨沟市|金川县|小金县|黑水县|壤塘县|阿坝县|若尔盖县|红原县|康定市|泸定县|丹巴县|九龙县|雅江县|道孚县|炉霍县|甘孜县|新龙县|德格县|白玉县|石渠县|色达县|理塘县|巴塘县|乡城县|稻城县|得荣县|西昌市|木里藏族自治县|盐源县|德昌县|会理县|会东县|宁南县|普格县|布拖县|金阳县|昭觉县|喜德县|冕宁县|越西县|甘洛县|美姑县|雷波县|开阳县|息烽县|修文县|清镇市|水城县|盘州市|桐梓县|绥阳县|正安县|道真仡佬族苗族自治县|务川仡佬族苗族自治县|凤冈县|湄潭县|余庆县|习水县|赤水市|仁怀市|普定县|镇宁布依族苗族自治县|关岭布依族苗族自治县|紫云苗族布依族自治县|大方县|黔西县|金沙县|织金县|纳雍县|威宁彝族回族苗族自治县|赫章县|江口县|玉屏侗族自治县|石阡县|思南县|印江土家族苗族自治县|德江县|沿河土家族自治县|松桃苗族自治县|兴义市|兴仁县|普安县|晴隆县|贞丰县|望谟县|册亨县|安龙县|凯里市|黄平县|施秉县|三穗县|镇远县|岑巩县|天柱县|锦屏县|剑河县|台江县|黎平县|榕江县|从江县|雷山县|麻江县|丹寨县|都匀市|福泉市|荔波县|贵定县|瓮安县|独山县|平塘县|罗甸县|长顺县|龙里县|惠水县|三都水族自治县|富民县|宜良县|石林彝族自治县|嵩明县|禄劝彝族苗族自治县|寻甸回族彝族自治县|安宁市|马龙县|陆良县|师宗县|罗平县|富源县|会泽县|宣威市|澄江县|通海县|华宁县|易门县|峨山彝族自治县|新平彝族傣族自治县|元江哈尼族彝族傣族自治县|施甸县|龙陵县|昌宁县|腾冲市|鲁甸县|巧家县|盐津县|大关县|永善县|绥江县|镇雄县|彝良县|威信县|水富县|玉龙纳西族自治县|永胜县|华坪县|宁蒗彝族自治县|宁洱哈尼族彝族自治县|墨江哈尼族自治县|景东彝族自治县|景谷傣族彝族自治县|镇沅彝族哈尼族拉祜族自治县|江城哈尼族彝族自治县|孟连傣族拉祜族佤族自治县|澜沧拉祜族自治县|西盟佤族自治县|凤庆县|云县|永德县|镇康县|双江拉祜族佤族布朗族傣族自治县|耿马傣族佤族自治县|沧源佤族自治县|楚雄市|双柏县|牟定县|南华县|姚安县|大姚县|永仁县|元谋县|武定县|禄丰县|个旧市|开远市|蒙自市|弥勒市|屏边苗族自治县|建水县|石屏县|泸西县|元阳县|红河县|金平苗族瑶族傣族自治县|绿春县|河口瑶族自治县|文山市|砚山县|西畴县|麻栗坡县|马关县|丘北县|广南县|富宁县|景洪市|勐海县|勐腊县|大理市|漾濞彝族自治县|祥云县|宾川县|弥渡县|南涧彝族自治县|巍山彝族回族自治县|永平县|云龙县|洱源县|剑川县|鹤庆县|瑞丽市|芒市|梁河县|盈江县|陇川县|泸水市|福贡县|贡山独龙族怒族自治县|兰坪白族普米族自治县|香格里拉市|德钦县|维西傈僳族自治县|林周县|当雄县|尼木县|曲水县|墨竹工卡县|南木林县|江孜县|定日县|萨迦县|拉孜县|昂仁县|谢通门县|白朗县|仁布县|康马县|定结县|仲巴县|亚东县|吉隆县|聂拉木县|萨嘎县|岗巴县|江达县|贡觉县|类乌齐县|丁青县|察雅县|八宿县|左贡县|芒康县|洛隆县|边坝县|工布江达县|米林县|墨脱县|波密县|察隅县|朗县|扎囊县|贡嘎县|桑日县|琼结县|曲松县|措美县|洛扎县|加查县|隆子县|错那县|浪卡子县|嘉黎县|比如县|聂荣县|安多县|申扎县|索县|班戈县|巴青县|尼玛县|双湖县|普兰县|札达县|噶尔县|日土县|革吉县|改则县|措勤县|蓝田县|周至县|宜君县|凤翔县|岐山县|扶风县|眉县|陇县|千阳县|麟游县|凤县|太白县|三原县|泾阳县|乾县|礼泉县|永寿县|彬县|长武县|旬邑县|淳化县|武功县|兴平市|潼关县|大荔县|合阳县|澄城县|蒲城县|白水县|富平县|韩城市|华阴市|延长县|延川县|子长县|志丹县|吴起县|甘泉县|富县|洛川县|宜川县|黄龙县|黄陵县|城固县|洋县|西乡县|勉县|宁强县|略阳县|镇巴县|留坝县|佛坪县|府谷县|靖边县|定边县|绥德县|米脂县|佳县|吴堡县|清涧县|子洲县|神木市|汉阴县|石泉县|宁陕县|紫阳县|岚皋县|平利县|镇坪县|旬阳县|白河县|洛南县|丹凤县|商南县|山阳县|镇安县|柞水县|永登县|皋兰县|榆中县|永昌县|靖远县|会宁县|景泰县|清水县|秦安县|甘谷县|武山县|张家川回族自治县|民勤县|古浪县|天祝藏族自治县|肃南裕固族自治县|民乐县|临泽县|高台县|山丹县|泾川县|灵台县|崇信县|华亭县|庄浪县|静宁县|金塔县|瓜州县|肃北蒙古族自治县|阿克塞哈萨克族自治县|玉门市|敦煌市|庆城县|环县|华池县|合水县|正宁县|宁县|镇原县|通渭县|陇西县|渭源县|临洮县|漳县|岷县|成县|文县|宕昌县|康县|西和县|礼县|徽县|两当县|临夏市|临夏县|康乐县|永靖县|广河县|和政县|东乡族自治县|积石山保安族东乡族撒拉族自治县|合作市|临潭县|卓尼县|舟曲县|迭部县|玛曲县|碌曲县|夏河县|大通回族土族自治县|湟中县|湟源县|民和回族土族自治县|互助土族自治县|化隆回族自治县|循化撒拉族自治县|门源回族自治县|祁连县|海晏县|刚察县|同仁县|尖扎县|泽库县|河南蒙古族自治县|共和县|同德县|贵德县|兴海县|贵南县|玛沁县|班玛县|甘德县|达日县|久治县|玛多县|玉树市|杂多县|称多县|治多县|囊谦县|曲麻莱县|格尔木市|德令哈市|乌兰县|都兰县|天峻县|海西蒙古族藏族自治州直辖|永宁县|贺兰县|灵武市|平罗县|盐池县|同心县|青铜峡市|西吉县|隆德县|泾源县|彭阳县|中宁县|海原县|乌鲁木齐县|鄯善县|托克逊县|巴里坤哈萨克自治县|伊吾县|昌吉市|阜康市|呼图壁县|玛纳斯县|奇台县|吉木萨尔县|木垒哈萨克自治县|博乐市|阿拉山口市|精河县|温泉县|库尔勒市|轮台县|尉犁县|若羌县|且末县|焉耆回族自治县|和静县|和硕县|博湖县|阿克苏市|温宿县|库车县|沙雅县|新和县|拜城县|乌什县|阿瓦提县|柯坪县|阿图什市|阿克陶县|阿合奇县|乌恰县|喀什市|疏附县|疏勒县|英吉沙县|泽普县|莎车县|叶城县|麦盖提县|岳普湖县|伽师县|巴楚县|塔什库尔干塔吉克自治县|和田市|和田县|墨玉县|皮山县|洛浦县|策勒县|于田县|民丰县|伊宁市|奎屯市|霍尔果斯市|伊宁县|察布查尔锡伯自治县|霍城县|巩留县|新源县|昭苏县|特克斯县|尼勒克县|塔城市|乌苏市|额敏县|沙湾县|托里县|裕民县|和布克赛尔蒙古自治县|阿勒泰市|布尔津县|富蕴县|福海县|哈巴河县|青河县|吉木乃县|喀尔交镇|恰勒什海乡|托普铁热克镇|别斯铁热克乡|吉木乃镇|托斯特乡|兵团一八六团|乌拉斯特镇|兵团一五二团|向阳街道|红山街道|东城街道|石河子乡|老街街道|北泉镇|新城街道|阿拉尔农场|幸福路街道|兵团第一师幸福农场|兵团七团|兵团十一团|兵团第一师水利水电工程处|青松路街道|托喀依乡|兵团八团|中心监狱|兵团第一师塔里木灌区水利管理处|兵团十四团|兵团十二团|兵团十三团|金银川路街道|兵团十六团|兵团十团|南口街道|兵团四十九团|兵团图木舒克市永安坝|兵团五十一团|前海街道|兵团图木舒克市喀拉拜勒镇|永安坝街道|齐干却勒街道|兵团五十团|兵团五十三团|兵团四十四团|兵团一零二团|军垦路街道|人民路街道|兵团一零一团|兵团一零三团|青湖路街道|兵团二十九团|农二师三十团|兵团六十八团|都拉塔口岸|兵团六十六团|兵团六十三团|兵团六十七团|兵团六十四团|乌尔其乡|普恰克其乡|兵团皮山农场|兵团二二四团|兵团四十七团|博斯坦乡|喀拉喀什镇|阔依其乡|兵团一牧场|乌鲁克萨依乡|奴尔乡|兵团一零三|坡头镇|梨林镇|思礼镇|大峪镇|五龙口镇|王屋镇|玉泉街道|轵城镇|济水街道|沁园街道|下冶镇|天坛街道|克井镇|邵原镇|北海街道|承留镇|沙湖镇|工业园区|畜禽良种场|豆河镇|通海口镇|胡场镇|长倘口镇|五湖渔场|杨林尾镇|干河街道|西流河镇|赵西垸林场|九合垸原种场|彭场镇|沔城回族镇|龙华山街道|沙湖原种场|陈场镇|郭河镇|排湖风景区|郑场镇|沙嘴街道|张沟镇|毛嘴镇|三伏潭镇|积玉口镇|广华街道|泰丰街道|潜江经济开发区|周矶管理区|周矶街道|总口管理区|高场街道|王场镇|运粮湖管理区|园林街道|白鹭湖管理区|竹根滩镇|渔洋镇|熊口镇|后湖管理区|熊口管理区|江汉石油管理局|张金镇|杨市街道|老新镇|龙湾镇|浩口原种场|浩口镇|高石碑镇|胡市镇|多祥镇|黄潭镇|沉湖管委会|横林镇|马湾镇|干驿镇|蒋湖农场|小板镇|多宝镇|岳口镇|蒋场镇|石家河镇|彭市镇|竟陵街道|九真镇|佛子山镇|侨乡街道开发区|麻洋镇|杨林街道|白茅湖农场|汪场镇|渔薪镇|净潭乡|卢市镇|皂市镇|拖市镇|张港镇|下谷坪土家族乡|木鱼镇|新华镇|九湖镇|宋洛乡|松柏镇|红坪镇|阳日镇|常平镇|莞城街道|望牛墩镇|大朗镇|麻涌镇|黄江镇|凤岗镇|樟木头镇|东莞生态园|松山湖管委会|桥头镇|石龙镇|寮步镇|高埗镇|塘厦镇|厚街镇|谢岗镇|虎门镇|南城街道|虎门港管委会|横沥镇|企石镇|东坑镇|东城街道|石排镇|洪梅镇|沙田镇|长安镇|道滘镇|大岭山镇|清溪镇|茶山镇|中堂镇|万江街道|石碣镇|横栏镇|三角镇|五桂山街道|东升镇|神湾镇|火炬开发区街道|小榄镇|南朗镇|古镇镇|民众镇|港口镇|三乡镇|石岐区街道|大涌镇|南头镇|黄圃镇|东区街道|阜沙镇|板芙镇|西区街道|坦洲镇|南区街道|沙溪镇|东凤镇|洋浦经济开发区|光村镇|兰洋镇|海头镇|和庆镇|华南热作学院|国营蓝洋农场|中和镇|王五镇|木棠镇|东成镇|新州镇|南丰镇|排浦镇|国营西培农场|雅星镇|国营八一农场|国营西联农场|白马井镇|那大镇|峨蔓镇|大成镇|三都镇|南圣镇|毛阳镇|国营畅好农场|番阳镇|水满乡|通什镇|畅好乡|毛道乡|嘉积镇|会山镇|国营东升农场|国营东太农场|彬村山华侨农场|万泉镇|大路镇|潭门镇|国营东红农场|中原镇|长坡镇|龙江镇|塔洋镇|博鳌镇|阳江镇|石壁镇|东阁镇|国营罗豆农场|文教镇|会文镇|锦山镇|翁田镇|东郊镇|国营东路农场|铺前镇|龙楼镇|冯坡镇|国营南阳农场|昌洒镇|公坡镇|蓬莱镇|抱罗镇|潭牛镇|东路镇|文城镇|重兴镇|礼纪镇|国营东兴农场|后安镇|国营东和农场|万城镇|和乐镇|大茂镇|山根镇|龙滚镇|兴隆华侨农场|三更罗镇|北大镇|长丰镇|地方国营六连林场|国营新中农场|南桥镇|东澳镇|东方华侨农场|新龙镇|江边乡|国营广坝农场|天安乡|东河镇|感城镇|三家镇|四更镇|大田镇|板桥镇|八所镇|黄竹镇|新竹镇|国营中瑞农场|富文镇|岭口镇|定城镇|雷鸣镇|翰林镇|国营南海农场|龙河镇|国营金鸡岭农场|龙湖镇|龙门镇|国营中建农场|屯城镇|南吕镇|坡心镇|新兴镇|国营中坤农场|西昌镇|枫木镇|南坤镇|乌坡镇|永发镇|福山镇|中兴镇|桥头镇|金江镇|老城镇|文儒镇|国营红岗农场|瑞溪镇|国营红光农场|大丰镇|加乐镇|国营昆仑农场|国营金安农场|国营西达农场|国营和岭农场|仁兴镇|南宝镇|博厚镇|和舍镇|东英镇|调楼镇|波莲镇|多文镇|国营加来农场|新盈镇|临城镇|皇桐镇|国营红华农场|七坊镇|金波乡|南开乡|荣邦乡|青松乡|国营龙江农场|邦溪镇|元门乡|国营白沙农场|牙叉镇|细水乡|打安镇|阜龙乡|国营邦溪农场|国营霸王岭林场|十月田镇|石碌镇|海南矿业联合有限公司|七叉镇|乌烈镇|叉河镇|王下乡|海尾镇|国营红林农场|昌化镇|国营山荣农场|莺歌海镇|国营乐光农场|万冲镇|利国镇|国营保国农场|抱由镇|九所镇|国营莺歌海盐场|黄流镇|大安镇|佛罗镇|尖峰镇|千家镇|志仲镇|国营尖峰岭林业公司|椰林镇|黎安镇|群英乡|新村镇|国营吊罗山林业公司|本号镇|光坡镇|文罗镇|国营南平农场|隆广镇|提蒙乡|三才镇|国营岭门农场|英州镇|海南保亭热带作物研究所|新政镇|加茂镇|国营新星农场|保城镇|国营金江农场|南林乡|国营三道农场|毛感乡|响水镇|什玲镇|三道镇|六弓乡|吊罗山乡|国营加钗农场|和平镇|国营乌石农场|什运乡|湾岭镇|国营阳江农场|国营黎母山林业公司|营根镇|上安乡|中平镇|黎母山镇|国营长征农场|红毛镇|长征镇|峪泉镇|新城镇|文殊镇|雄关区|镜铁区|长城区|[^区]+区)"; + String detailAddress = "?(?.*)"; + Matcher matcher = Pattern.compile(regex + countyRegex + detailAddress).matcher(address); + String province, city, county, detail; + Map row = new LinkedHashMap<>(3); + while (matcher.find()) { + province = matcher.group("province"); + row.put("province", province == null ? null : province.trim()); + city = matcher.group("city"); + row.put("city", city == null ? null : city.trim()); + county = matcher.group("county"); + row.put("county", county == null ? null : county.trim()); + detail = matcher.group("detail"); + row.put("detail", detail == null ? "" : detail.trim()); + } + return row; + } + + /** + * @Description: 方法2 @Title: getTextRecognitionInfo @author Lewis @param + * text @return @throws + */ + public static Map getTextRecognitionInfo(String text) throws Exception { + //移除所有符号 + String details = text.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "").trim(); + if(details.startsWith("中国")){ + details = details.replaceFirst("中国", ""); + } + // 直接完整匹配省市区 + Map row = addressResolution(details); + // 匹配文本中的电话号码 + String phone = ""; + Pattern phoneReg = Pattern.compile("\\d{7,17}"); + Matcher phoneMatcher = phoneReg.matcher(details); + while (phoneMatcher.find()) { + phone = phoneMatcher.group(); + } + phoneReg = Pattern.compile("1[345678]\\d{9}"); + phoneMatcher = phoneReg.matcher(details); + while (phoneMatcher.find()) { + phone = phoneMatcher.group(); + details = details.replaceFirst(phone, ""); + } + details = details.replaceFirst(phone, ""); + + // 解析省 + int provinceLength = 0; + String provinceTemp = ""; + // 可以完整匹配出来地址 + if (row.size() == 4) { + return row; + } else { + // 查询所有的省 + List provinceList = getprovice(); + for (String province : provinceList) { + String tem; + if (province.contains("省")) { + tem = province.replace("省", ""); + } else if (province.contains("市")) { + tem = province.replace("市", ""); + } else if (province.contains("壮族自治区")) { + tem = province.replace("壮族自治区", ""); + } else if (province.contains("维吾尔自治区")) { + tem = province.replace("维吾尔自治区", ""); + } else if (province.contains("回族自治区")) { + tem = province.replace("回族自治区", ""); + } else if (province.contains("特别行政区")) { + tem = province.replace("特别行政区", ""); + } else if (province.contains("特别行政区")) { + tem = province.replace("特别行政区", ""); + } else if (province.contains("自治区")) { + tem = province.replace("自治区", ""); + } else { + tem = province; + } + if (details.startsWith(tem)) { + if (tem.length() > provinceLength) { + provinceLength = tem.length(); + provinceTemp = tem; + row.put("province", province); + break; + } + } + } + } + String name = details.substring(0, details.indexOf(provinceTemp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + int orLen = details.length(); + String province = row.get("province") == null? "" : row.get("province"); + if (details.indexOf(province)<8) { + details = details.replaceFirst(row.get("province") == null ? "" : row.get("province"), ""); + } + + int newLen = details.length(); + if (orLen == newLen) { + details = details.replaceFirst(provinceTemp, ""); + } + + int cityLength = 0; + String cityTemp = ""; + // 解析市 + if (row.get("province") != null) { + List cityList = getcity(row.get("province")); + for (String city : cityList) { + String tem; + if (city.contains("市")) { + tem = city.replace("市", ""); + } else if (city.contains("自治县")) { + tem = city.replace("自治县", ""); + } else if (city.contains("县")) { + tem = city.replace("县", ""); + } else if (city.contains("自治洲")) { + tem = city.replace("自治洲", ""); + } else if (city.contains("地区")) { + tem = city.replace("地区", ""); + } else if (city.contains("盟")) { + tem = city.replace("盟", ""); + } else { + tem = city; + } + + if (details.startsWith(tem)) { + if (tem.length() > cityLength) { + cityLength = tem.length(); + cityTemp = tem; + row.put("city", city); + break; + } + } + + } + } else { + List cityList = getcity(); + for (String city : cityList) { + String tem; + if (city.contains("市")) { + tem = city.replace("市", ""); + } else if (city.contains("自治县")) { + tem = city.replace("自治县", ""); + } else if (city.contains("自治洲")) { + tem = city.replace("自治洲", ""); + } else if (city.contains("县")) { + tem = city.replace("县", ""); + } else if (city.contains("盟")) { + tem = city.replace("盟", ""); + } else if (city.contains("地区")) { + tem = city.replace("地区", ""); + } else { + tem = city; + } + + if (details.startsWith(tem)) { + if (tem.length() > cityLength) { + cityLength = tem.length(); + cityTemp = tem; +// cityCode = city.getRegionId(); +// region.setCity(city.getRegionName()); +// region.setProvinceCode(city.getRegionParentId()); +// region.setProvince(regionMapper.selectByPrimaryKey(city.getRegionParentId()).getRegionName()); + row.put("city", city); + row.put("province", getProvinceByCityName(city)); + } + } + + } + + } + + name = details.substring(0, details.indexOf(cityTemp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + orLen = details.length(); + details = details.replaceFirst(row.get("city") == null ? "" : row.get("city"), ""); + newLen = details.length(); + if (newLen == orLen) { + details = details.replaceFirst(cityTemp, ""); + } + + String countyTmp = ""; + String specialCity = row.get("city") == null ?"" : row.get("city"); + if((!"".equals(specialCity))&&("中山市".indexOf(specialCity)>-1 || "东莞市".indexOf(specialCity)>-1)) { + row.put("county", "城区"); + }else { + // 解析区 + int countyLength = 0; + + if (row.get("city") != null) { + List countyList = getCountyByCityName(row.get("city")); + for (String county : countyList) { + String tem; + if (county.contains("市")) { + tem = county.replace("市", ""); + } else if (county.contains("区")) { + tem = county.replace("区", ""); + } else if (county.contains("县")) { + tem = county.replace("县", ""); + } else if (county.contains("镇")) { + tem = county.replace("镇", ""); + } else if (county.contains("旗")) { + tem = county.replace("旗", ""); + } else if (county.contains("街道")) { + tem = county.replace("街道", ""); + } else if (county.contains("乡")) { + tem = county.replace("乡", ""); + } else if (county.contains("农场")) { + tem = county.replace("农场", ""); + } else if (county.contains("兵团")) { + tem = county.replace("兵团", ""); + } else { + tem = county; + } + + if (details.startsWith(tem)) { + if (tem.length() > countyLength) { + countyLength = tem.length(); + countyTmp = tem; +// region.setCounty(county.getRegionName()); + row.put("county", county); + } + } + + } + } else { + + List cityList = getcity(row.get("province")); + + for (String city : cityList) { + List countyList = getCountyByCityName(city); + + for (String county : countyList) { + String tem; + if (county.contains("市")) { + tem = county.replace("市", ""); + } else if (county.contains("区")) { + tem = county.replace("区", ""); + } else if (county.contains("县")) { + tem = county.replace("县", ""); + } else if (county.contains("镇")) { + tem = county.replace("镇", ""); + } else if (county.contains("旗")) { + tem = county.replace("旗", ""); + } else if (county.contains("街道")) { + tem = county.replace("街道", ""); + } else if (county.contains("乡")) { + tem = county.replace("乡", ""); + } else if (county.contains("农场")) { + tem = county.replace("农场", ""); + } else if (county.contains("兵团")) { + tem = county.replace("兵团", ""); + } else { + tem = county; + } + if (details.startsWith(tem)) { + if (tem.length() > countyLength) { + countyLength = tem.length(); + countyTmp = tem; +// region.setCity(city.getRegionName()); +// region.setCounty(county.getRegionName()); + row.put("city", city); + row.put("county", county); + } + } + } + + } + + } + + if (row.get("county") == null) { + row.put("county", ""); + } + } + + + name = details.substring(0, details.indexOf(countyTmp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + orLen = details.length(); + details = details.replaceFirst(row.get("county") == null ? "" : row.get("county"), ""); + newLen = details.length(); + if (orLen == newLen) { + details = details.replaceFirst(countyTmp, ""); + } + row.put("detail", text); +// System.out.println("row:"+row); + return row; + } + + /** + * @Description: 查询所有的省级名称 @Title: getprovice @author Lewis @return @throws + */ + public static List getprovice() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "select name from tb_admin_dic where type = 2 and parent_code=1"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 查询所有的市级名称 @Title: getcity @author Lewis @return @throws + */ + public static List getcity() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "select name from tb_admin_dic where type = 3"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 查询指定省的市级名称 @Title: getcity @author Lewis @return @throws + */ + public static List getcity(String province) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic WHERE parent_code=(SELECT code FROM tb_admin_dic WHERE NAME=? AND TYPE=2)"; + ps = conn.prepareStatement(sql); + ps.setString(1, province); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 根据市级名称查询所属的省级名称 @Title: getcity @author Lewis @return @throws + */ + public static String getProvinceByCityName(String city) throws Exception { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic where code= (SELECT parent_code FROM tb_admin_dic WHERE NAME=? AND TYPE=3);"; + ps = conn.prepareStatement(sql); + ps.setString(1, city); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + return rs.getString("name"); + } + throw new RuntimeException(); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 根据市级名称查询所有的区县 @Title: getcity @author Lewis @return @throws + */ + public static List getCountyByCityName(String city) throws Exception { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic where parent_code= (SELECT code FROM tb_admin_dic WHERE NAME=? AND TYPE=3)"; + ps = conn.prepareStatement(sql); + ps.setString(1, city); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + list.add(rs.getString("name")); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 将不能解析的地址写入数据库 @Title: getprovice @author Lewis @return @throws + */ + public static void insertUnmatchAddress(String address) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + + sql = "insert into tb_unmatch_address(address) values(?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, address); + ps.executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(AddressTest.class, e); + } catch (Exception e) { + logger.error(AddressTest.class, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/test/AmazonTest.java b/src/com/since/emp/test/AmazonTest.java new file mode 100644 index 0000000..a899766 --- /dev/null +++ b/src/com/since/emp/test/AmazonTest.java @@ -0,0 +1,83 @@ +package com.since.emp.test; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.apache.commons.httpclient.HttpException; + +import com.since.emp.service.OrderSyncs.ShopConfig; +//Test +public class AmazonTest { + public static void main(String[] args) throws HttpException, IOException { + + Map map= new HashMap<>(); + map.put("1", "1"); + System.out.println( map.containsKey("1")); + + for (int i = 0; i < 100; i++) { + Random rand = new Random(); + int x = rand.nextInt(4); + System.out.println(x); + } + } +// +// public static class RefundThread implements Runnable { +// private String name; +// +// public RefundThread(String name) { +// this.name = name; +// } +// +// @Override +// public void run() { +// for (int i = 0; i < 1; i++) { +// String start_date = "2019-04-01 14:30:00"; +// String end_date = "2019-05-07 10:16:00"; +// end_date = end_date.replaceAll(" ", "%20"); +// start_date = start_date.replaceAll(" ", "%20"); +// String url = "http://192.168.1.55:8020/order?shop_code=20180329221&date_type=2&start_date=" +// + start_date + "&end_date=" + end_date + "&page_rows=20&page_now=1&order_status=6"; +// String orderRequest = getOrderRequest(url); +// System.out.println("【"+name+"】"+orderRequest); +// +// } +// } +// } +// +// /** +// * +// * @title: getOrderRequest +// * @description: 调用接口,获取订单 +// * @param url +// * @return response_json +// * @throws HttpException +// * @throws IOException +// */ +// private static String getOrderRequest(String url) { +// String response = ""; +// try { +// HttpMethod getMethod = new GetMethod(url); +// HttpClient httpClient = new HttpClient(); +// httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); +// httpClient.executeMethod(getMethod); +// InputStream resStream = getMethod.getResponseBodyAsStream(); +// BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); +// StringBuffer resBuffer = new StringBuffer(); +// String resTemp = ""; +// while ((resTemp = br.readLine()) != null) { +// resBuffer.append(resTemp); +// } +// response = resBuffer.toString(); +// } catch (HttpException e) { +// System.err.println(e.getMessage()); +// } catch (UnsupportedEncodingException e) { +// System.err.println(e.getMessage()); +// } catch (IOException e) { +// System.err.println(e.getMessage()); +// } +// return response; +// } + +} diff --git a/src/com/since/emp/test/AnalysisData.java b/src/com/since/emp/test/AnalysisData.java new file mode 100644 index 0000000..f7a1a50 --- /dev/null +++ b/src/com/since/emp/test/AnalysisData.java @@ -0,0 +1,191 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.xml.stream.events.EndDocument; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DbUtil; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; + +import jxl.Sheet; +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; + +public class AnalysisData extends OrderSyncs { + private static Logger logger; + public static void main(String[] args) { + logger = (Logger) LogManager.getLogger(AnalysisData.class.getName()); + File file = new File("analysisData.xls"); + recordData(file); + } + + public static void recordData(File file) { + + // conn = OrderSyncs.dbUtil.getDbConn(); + // if (conn == null) { + // return false; + // } + String[] platform_codes = { "002", "003", "005", "006" }; + String start_time = "2017-11-01 00:00:00"; + String ent_time = "2017-11-01 01:00:00"; + int idd = 1; + int sum = 0; + while (start_time.compareTo("2017-11-15 15:00:00") < 0) { + Connection conn = null; + PreparedStatement ps = null; + DbUtil dbUtil = new DbUtil("192.168.1.180", "30001", "EMP", "vip", "www888"); + conn = dbUtil.getDbConn(); + ResultSet rs = null; + try { + for (int i = 0; i < platform_codes.length; i++) { + String platform_code = platform_codes[i]; + String platform_name = ""; + String sql = "select count(*) as count from tb_sale_order a,tb_shop b where a.shop_code=b.code and a.create_time>=? and a.create_time" + ent_time); + start_time = ent_time; + + Date date3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(ent_time); + long time2 = date3.getTime(); + time2 = time2 + 3600000; + Date date4 = new Date(time2); + ent_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date4); + + System.out.println("总数量:" + sum); + } catch (Exception e) { + logger.error(AnalysisData.class, e); + } + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + logger.error(AnalysisData.class, e); + } + } + + } +} diff --git a/src/com/since/emp/test/ApiQunJieLongTest.java b/src/com/since/emp/test/ApiQunJieLongTest.java new file mode 100644 index 0000000..95319bd --- /dev/null +++ b/src/com/since/emp/test/ApiQunJieLongTest.java @@ -0,0 +1,145 @@ +package com.since.emp.test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.since.emp.test.vo.PageParamVo; +import com.since.emp.util.HttpRequest; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/17 14:46 + */ +public class ApiQunJieLongTest { + private static String token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyNDM0NzMzMiwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjI0MzQwMTMyfQ.P6aZA9NV4bxwxjB3LRi6A3T7756RFkGZybYMG1N-z_Y"; + public static void main(String[] args) { +// getToken(); +// queryOrderList(); + queryOrderInfo(); + queryRefundOrderList(); + applyCancel(); + //listTest(); + } + + public static void listTest(){ + try{ + List list = new ArrayList(); + list.add("-1"); + for (int i = list.size()-1; i >=0; i--) { + list.add(String.valueOf(i)); + } + System.out.println(new Gson().toJson(list)); + }catch(Exception e){ + e.printStackTrace(); + } + + } + + + public static void queryOrderList() { + String url=" https://openapi.qunjielong.com/open/api/order/forward/query_order_list"; + //String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyMzkyMDk0MiwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjIzOTEzNzQyfQ.oENNhK5YJfc8dcevP1tR6DCURd35L5Zv3DEJiBHIWwc"; + try { + + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(1); + pageParamVo.setPageSize(20); + map.put("pageParam", pageParamVo); + map.put("startTime", "2021-06-17 09:00:05"); + map.put("endTime", "2021-06-22 11:51:05"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderListResponseStr = httpRequest.sendPost(url + "?accessToken=" + token, json, 2, ApiQunJieLongTest.class.getName()); + System.out.println("正向订单查询接口:::"+queryOrderListResponseStr); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void getToken() { + String url=" https://openapi.qunjielong.com/open/auth/token"; + try { + HttpRequest httpRequest = new HttpRequest(); + String TokenString =httpRequest.sendGet(url,"secret=7cbfa3ac8c7556c1b3381f816376ff49",""); + System.out.println("访问凭证:::"+TokenString); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void queryOrderInfo() { + String url=" https://openapi.qunjielong.com/open/api/order/single/query_order_info"; + //String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyMzkyMDk0MiwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjIzOTEzNzQyfQ.oENNhK5YJfc8dcevP1tR6DCURd35L5Zv3DEJiBHIWwc"; + //String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyNDMzNjI0MiwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjI0MzI5MDQyfQ.5u6kc5G8THKNnNvGPtjB9dvexdg_qWfx0MzpyI5DzHI"; + try { + HashMap map = new HashMap(); + map.put("orderNo", "210617162390997205399752820"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryOrderInfoResponseStr = httpRequest.sendPost(url + "?accessToken=" + token, json, 2, ApiQunJieLongTest.class.getName()); + System.out.println("订单详情查询接口:::"+queryOrderInfoResponseStr); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void queryRefundOrderList() { + String url=" https://openapi.qunjielong.com/open/api/order/reverse/query_order_list"; + //String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyNDM0MTczMCwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjI0MzM0NTMwfQ.lBTt6oByFrGLopRXLGa8QM_EcCxGXDS3pwYXk2WhWt8"; + try { + + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(1); + pageParamVo.setPageSize(20); + map.put("pageParam", pageParamVo); + map.put("startTime", "2021-06-17 09:00:05"); + map.put("endTime", "2021-06-22 14:30:05"); +// map.put("updateBeginTime", "2021-06-22 09:00:05"); +// map.put("updateEndTime", "2021-06-22 11:40:05"); + //map.put("orderLogisticsStatus", "UN_DELIVER_GOODS"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryRefundOrderListResponseStr = httpRequest.sendPost(url + "?accessToken=" + token, json, 2, ApiQunJieLongTest.class.getName()); + System.out.println("逆向订单查询接口:::"+queryRefundOrderListResponseStr); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void applyCancel() { + String url=" https://openapi.qunjielong.com/open/api/order/apply_cancel/query_order_list"; + //String token ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJRSkwtT1BFTi1BUEktQVVUSCIsImV4cCI6MTYyNDM0MTczMCwiZ2hJZCI6Ijg4NzA2MTkxIiwiaWF0IjoxNjI0MzM0NTMwfQ.lBTt6oByFrGLopRXLGa8QM_EcCxGXDS3pwYXk2WhWt8"; + try { + + HashMap map = new HashMap(); + PageParamVo pageParamVo = new PageParamVo(); + pageParamVo.setPage(1); + pageParamVo.setPageSize(10); + map.put("pageParam", pageParamVo); + map.put("startTime", "2021-06-17 09:00:05"); + map.put("endTime", "2021-06-22 14:30:05"); +// map.put("updateBeginTime", "2021-06-22 10:00:05"); +// map.put("updateEndTime", "2021-06-22 11:51:05"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String json = gson.toJson(map); + + HttpRequest httpRequest = new HttpRequest(); + String queryRefundOrderListResponseStr = httpRequest.sendPost(url + "?accessToken=" + token, json, 2, ApiQunJieLongTest.class.getName()); + System.out.println("申请退款订单查询接口:::"+queryRefundOrderListResponseStr); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/since/emp/test/DangdangDemo.java b/src/com/since/emp/test/DangdangDemo.java new file mode 100644 index 0000000..a281598 --- /dev/null +++ b/src/com/since/emp/test/DangdangDemo.java @@ -0,0 +1,77 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.util.URIUtil; + +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.util.MD5Util; + +import net.sf.json.JSON; +import net.sf.json.xml.XMLSerializer; + +public class DangdangDemo { + public static void main(String[] args) { + try { + /** + * 当当API调用 + */ + + GetMethod httpMethod = new GetMethod("http://api.open.dangdang.com/openapi/rest"); + AppConfig appConfig = new AppConfig(); + appConfig.key="2100006906"; + appConfig.secret = "C91B26DFF9ADF3CC0FA921C0230B0776"; + int page_now = 1; + String session_key= "988A58D6F03447405C76367FCBCBD519DA2963407D610B6BC12CCD3B73C3D4A4"; + int page_rows = 20; + String time_start = "2010-01-01 00:00:00"; + String time_end = "2018-06-29 00:00:00"; + String signStr = appConfig.secret + "app_key" + appConfig.key + "format" + "xml" + "method" + + "dangdang.orders.list.get" + "session" + session_key + "sign_method" + "md5" + + "timestamp" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + + appConfig.secret;// 组成签名字符串 + String signStrMD5 = new MD5Util().MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + appConfig.key + + "&method=" + "dangdang.orders.list.get" + "&format=" + "xml" + "&session=" + + session_key + "&os=101" + "&p=" + page_now + "&pageSize=" + page_rows + + "&lastModifyTime_start=" + time_start + "&lastModifyTime_end=" + time_end; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + String jsonString = xmlToJson(resxml);// 将xml转为json + System.out.println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + + } + /** + * xmlToJson + * + * @param xml + * @return + */ + private static String xmlToJson(String xml) { + XMLSerializer xmlSerializer = new XMLSerializer(); + JSON json = xmlSerializer.read(xml); + String jsonStr = json.toString(1); + jsonStr = jsonStr.replace("[]", "\"\""); + return jsonStr; + } +} diff --git a/src/com/since/emp/test/DbPoolTest.java b/src/com/since/emp/test/DbPoolTest.java new file mode 100644 index 0000000..5c4ad1c --- /dev/null +++ b/src/com/since/emp/test/DbPoolTest.java @@ -0,0 +1,215 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.DbPoolConnection_MiHe; + +/** + * @description + * @author Lewis + * @file_name DbPoolTest.java + * @date 2019年7月5日 + */ +public class DbPoolTest { + static Logger logger ; + static { + ConfigurationSource source; + String filePath = "log4j2.properties"; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(DbPoolTest.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + public static void main(String[] args) { + logger = LogManager.getLogger(DbPoolTest.class); + for(;;) { + for (int i = 0; i < 12; i++) { + DbTest t1 = new DbTest("t1_" + (i+1)); + t1.start(); + } + + for (int i = 0; i < 2669; i++) { + DbMiheTest t2=new DbMiheTest("t2_" + (i+1)); + t2.start(); + } + + try { + Thread.sleep(1000*60); + } catch (InterruptedException e) { + logger.error(DbPoolTest.class,e); + } + } + } +} +class DbTest extends Thread { + private String name; + public DbTest(String name) { + this.name = name; + } + @Override + public void run() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + DbPoolTest.logger.info(name); + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "select * from tb_sale_order limit 1"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + int int1 = rs.getInt("id"); + DbPoolTest.logger.info("int1:" + int1); + } + conn.setAutoCommit(true); + } catch (Exception e) { + try { + DbPoolTest.logger.error(this,e); + conn.rollback(); + } catch (SQLException e1) { + e.printStackTrace(); + } catch (Exception e1) { + e.printStackTrace(); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + conn = null; + } + dbpc = null; + } + } +} +class DbMiheTest extends Thread { + private String name; + public DbMiheTest(String name) { + this.name = name; + } + @Override + public void run() { + DbPoolConnection_MiHe dbpc = DbPoolConnection_MiHe.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + ResultSet rs = null; + + // 事务方式处理订单写入 + try { + DbPoolTest.logger.info(name); + conn = dbpc.getConnection(); + conn.setAutoCommit(false); + sql = "select * from tb_order limit 1"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + if (rs.next()) { + int int2 = rs.getInt("id"); + DbPoolTest.logger.info("int2:" + int2); + } + conn.setAutoCommit(true); + } catch (Exception e) { + try { + DbPoolTest.logger.error(this,e); + conn.rollback(); + } catch (SQLException e1) { + e.printStackTrace(); + } catch (Exception e1) { + e.printStackTrace(); + } + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + conn = null; + } + dbpc = null; + } + } + +} \ No newline at end of file diff --git a/src/com/since/emp/test/Demo1_simple.java b/src/com/since/emp/test/Demo1_simple.java new file mode 100644 index 0000000..a978ee3 --- /dev/null +++ b/src/com/since/emp/test/Demo1_simple.java @@ -0,0 +1,160 @@ +package com.since.emp.test; + +import java.security.spec.InvalidKeySpecException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import com.alibaba.fastjson.JSON; +import com.yit.openapi.sdk.client.ApiAccessor; +import com.yit.openapi.sdk.client.ApiContext; +import com.yit.openapi.sdk.client.BaseRequest; +import com.yit.openapi.sdk.client.ServerResponse; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_ConfirmDownload; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetOrderByPeriod; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_SearchOrderParam; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_YitOrderInfo; + +/** + * @description + * @author Lewis + * @file_name Demo1.java + * @date 2019年1月29日 + */ +public class Demo1_simple { +// public static final String privateKey = "MIICXQIBAAKBgQDxZI2ZCyYRzQq3z3rYVDeyCzXGSgBgP5/FKS08A69VYzkzndrk\n" +// + "rLbPN7x7m65mSmj/YNr5hiQBwgTXv3rZjgGQpvO/AwO6y5EMDviFUFG85WWpF6uH\n" +// + "bdtVODyLywD1Qj4qDuf9NWl7wGnORNyeEOGU2UkiUEfwNkEQ8nLW8YuS4QIDAQAB\n" +// + "AoGAHoJB7zTcg+VxVFfxw8OpImSOUFhsAb4o2EdjAzHICDe5NA/gaYR2umvl841y\n" +// + "llUTPiukoWLVzC8UY5w8z6BGDB5ktbMr0w2KdekPph4YTComYy5dkfJN4lFOZKEQ\n" +// + "DJVdoyaU/1+hR8Icra7FtDk9Zuj2a+lOv4ek3nAWHKdNORECQQD9Djt3mtpplRVx\n" +// + "d4zaVqYMS1wAAJu1o6sNuhk228FXaB7ogw7MzJGOBt98U1f8ACNh6Z+MozpA/NJU\n" +// + "Do1X0jqdy+QA/FLH+P+0fkthqrExxCPeHQJBAJxK1wW3GaDOWFEdUlxj2eiL/sVt\n" +// + "mr4j2PkAcKRGM/KlNznKADETQ+7hZdSmsRfOigvmPAmjos4SmGFZCLFBtMUCQFQC\n" +// + "ksPGrR3dMVzB0j1Ua7TYNsGXN3EUbUYux0WQIY2hYP+uPPtDFFmjQn0ucS69h6FG\n" +// + "kUkWHu/72uOwBeDmPfkCQQD3Q+R6e++LZFkCeRuTPiJLcvvuadHJEYgfH0Hf3jkl\n" +// + "kDBz97GhZmpq9CWTr6cNggFeQxb1hNbVcp6p6Gb9y6nS"; +// public static final String publicKey = ""; +// +// public static final String tpId = "afc26891388c0a70"; + + public static final String privateKey = "MIICXQIBAAKBgQDxZI2ZCyYRzQq3z3rYVDeyCzXGSgBgP5/FKS08A69VYzkzndrk\n" + + "rLbPN7x7m65mSmj/YNr5hiQBwgTXv3rZjgGQpvO/AwO6y5EMDviFUFG85WWpF6uH\n" + + "bdtVODyLywD1Qj4qDuf9NWl7wGnORNyeEOGU2UkiUEfwNkEQ8nLW8YuS4QIDAQAB\n" + + "AoGAHoJB7zTcg+VxVFfxw8OpImSOUFhsAb4o2EdjAzHICDe5NA/gaYR2umvl841y\n" + + "llUTPiukoWLVzC8UY5w8z6BGDB5ktbMr0w2KdekPph4YTComYy5dkfJN4lFOZKEQ\n" + + "DJVdoyaU/1+hR8Icra7FtDk9Zuj2a+lOv4ek3nAWHKdNORECQQD9Djt3mtpplRVx\n" + + "d4zaVqYMS1wAAJu1o6sNuhk228FXaB7ogw7MzJGOBt98U1f8ACNh6Z+MozpA/NJU\n" + + "cSwaZryVAkEA9DOUy074QyeHHmXz3RqDaM09lb5h4TR2THwlBQ6uyhlfjKED5nnD\n" + + "Do1X0jqdy+QA/FLH+P+0fkthqrExxCPeHQJBAJxK1wW3GaDOWFEdUlxj2eiL/sVt\n" + + "mr4j2PkAcKRGM/KlNznKADETQ+7hZdSmsRfOigvmPAmjos4SmGFZCLFBtMUCQFQC\n" + + "ksPGrR3dMVzB0j1Ua7TYNsGXN3EUbUYux0WQIY2hYP+uPPtDFFmjQn0ucS69h6FG\n" + + "kUkWHu/72uOwBeDmPfkCQQD3Q+R6e++LZFkCeRuTPiJLcvvuadHJEYgfH0Hf3jkl\n" + + "kDBz97GhZmpq9CWTr6cNggFeQxb1hNbVcp6p6Gb9y6nS"; + public static final String publicKey = ""; + + public static final String tpId = "afc26891388c0a70"; + + public static void main(String[] args) { + try { + //System.out.println(privateKey1.equals(privateKey)); + + getOrderByPeriod(); +// getUnDownloadedPendingDeliveryOrder(); +// getUnDownloadedPendingDeliveryOrderByLastId(0); + // int[] a = new int[] { 11122 }; + // confirmDownload(a); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e); + } + + } + + private static List getUnDownloadedPendingDeliveryOrder() { + LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder getUnDownloadedPendingDeliveryOrder = new LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder(); + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor + .fillApiResponse(new BaseRequest[] { getUnDownloadedPendingDeliveryOrder }); + // System.out.println(JSON.toJSONString(serverResponse)); + // System.out.println(JSON.toJSONString(getUnDownloadedPendingDeliveryOrder.getResponse())); + List list = getUnDownloadedPendingDeliveryOrder.getResponse().value; + List ids = new ArrayList<>(); + for (Api_LOGISTICSOPENAPI_YitOrderInfo info : list) { + ids.add(String.valueOf(info.id)); + } + System.out.println(ids); + System.out.println(ids.size()); + System.out.println(JSON.toJSONString(list)); + return list; + } + + /** + * 查询未发货的订单 + */ + private static List getUnDownloadedPendingDeliveryOrderByLastId(int lastId) { + LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId getUnDownloadedPendingDeliveryOrder = new LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId( + lastId); + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor + .fillApiResponse(new BaseRequest[] { getUnDownloadedPendingDeliveryOrder }); + // System.out.println(JSON.toJSONString(serverResponse)); + // System.out.println(JSON.toJSONString(getUnDownloadedPendingDeliveryOrder.getResponse())); + List list = getUnDownloadedPendingDeliveryOrder.getResponse().value; + List ids = new ArrayList<>(); + for (Api_LOGISTICSOPENAPI_YitOrderInfo info : list) { + ids.add(String.valueOf(info.id)); + } + System.out.println(ids); + System.out.println(ids.size()); + System.out.println(JSON.toJSONString(list)); + return list; + } + + /* + * 根据商品id确认商品已经下载过 + */ + private static boolean confirmDownload(int[] ids) { + LogisticsOpenApi_ConfirmDownload confirmDownload = new LogisticsOpenApi_ConfirmDownload(ids); + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor.fillApiResponse(new BaseRequest[] { confirmDownload }); + System.out.println(JSON.toJSONString(serverResponse)); + System.out.println(JSON.toJSONString(confirmDownload.getResponse())); + return confirmDownload.getResponse().value; + + } + + /** + * 根据时间间隔下载 + */ + public static void getOrderByPeriod() { + Api_LOGISTICSOPENAPI_SearchOrderParam param = new Api_LOGISTICSOPENAPI_SearchOrderParam(); + param.lastId = 8478088; + param.size = 200; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, -30); + param.startDate = calendar.getTime(); + param.endDate = new Date(); // 最多查询30天时间间隔 + param.status = "WAIT_DELIVERY"; + LogisticsOpenApi_GetOrderByPeriod getOrderByPeriod = new LogisticsOpenApi_GetOrderByPeriod(param); + ApiContext context = ApiContext.getCurrent(); + context.setThirdPartyId(tpId); + context.setClientPK("", privateKey); + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor.fillApiResponse(new BaseRequest[] { getOrderByPeriod }); + System.out.println(JSON.toJSONString(serverResponse)); + System.out.println(JSON.toJSONString(getOrderByPeriod.getResponse())); + } + + private static ApiAccessor getApiAccessor() { + ApiContext context = ApiContext.getCurrent(); + context.setThirdPartyId(tpId); + context.setClientPK(publicKey, privateKey); + ApiAccessor apiAccessor = new ApiAccessor(context, 3000, 3000, "https://open-test.yit.com/apigw/m.api"); + return apiAccessor; + } + +} diff --git a/src/com/since/emp/test/Demo2.java b/src/com/since/emp/test/Demo2.java new file mode 100644 index 0000000..980999c --- /dev/null +++ b/src/com/since/emp/test/Demo2.java @@ -0,0 +1,39 @@ +package com.since.emp.test; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; + +import org.junit.Test; + +import com.doudian.open.api.afterSale_List.AfterSaleListRequest; +import com.doudian.open.api.afterSale_List.AfterSaleListResponse; +import com.doudian.open.api.afterSale_List.param.AfterSaleListParam; +import com.doudian.open.core.AccessToken; +import com.doudian.open.core.AccessTokenBuilder; +import com.doudian.open.core.GlobalConfig; + +public class Demo2 { + @Test + public void test() throws Exception{ + GlobalConfig.initAppKey("6945070810793313792"); + GlobalConfig.initAppSecret("603303e0-de5a-4c17-9175-653d99184cd5"); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + AfterSaleListRequest request = new AfterSaleListRequest(); + AfterSaleListParam param = request.getParam(); + String timeStart = "2019-12-19 00:00:00"; + String timeEnd = "2021-12-18 00:00:00"; + // 退货物流状态,枚举为1(全部),2(已发货),3(未发货) + param.setLogisticsStatus(1L); + param.setPage(1L); + param.setSize(1L); + param.setStartTime(sdf.parse(timeStart).getTime() / 1000); + param.setEndTime(sdf.parse(timeEnd).getTime() / 1000); + ArrayList orderList = new ArrayList(); + orderList.add("update_time"); + param.setOrderBy(orderList); + AccessToken token = AccessTokenBuilder.parse("8347eb29-8ecd-4ac2-b831-67a79e0f4267"); + AfterSaleListResponse response = request.execute(token); + System.out.println(response.toString()); + } +} diff --git a/src/com/since/emp/test/DoudianTestDemo.java b/src/com/since/emp/test/DoudianTestDemo.java new file mode 100644 index 0000000..74695a4 --- /dev/null +++ b/src/com/since/emp/test/DoudianTestDemo.java @@ -0,0 +1,693 @@ +package com.since.emp.test; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.logging.log4j.core.Logger; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.since.emp.base.doudian.CipherInfo; +import com.since.emp.base.doudian.CipherInfos; +import com.since.emp.base.doudian.DdEncryptBO; +import com.since.emp.service.ApiDouDian; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; +import com.since.emp.service.OrderSyncs.UpdateMessage; +import com.since.emp.test.vo.CityVo; +import com.since.emp.test.vo.CombineStatusVO; +import com.since.emp.test.vo.DouDianOrderListQueryVO; +import com.since.emp.test.vo.DouDianSignVO; +import com.since.emp.test.vo.OrderDetialVO; +import com.since.emp.test.vo.ProvinceVo; +import com.since.emp.test.vo.RefundVO; +import com.since.emp.util.ConvertUtil; +import com.since.emp.util.DouDianSignUtil; +import com.since.emp.util.HttpRequest; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/7 13:46 + */ +public class DoudianTestDemo { + Logger logger; + + public static void main(String[] args) { +// getOrders(); +// new DoudianTestDemo().getToken(new UpdateMessage(), ""); +// new DoudianTestDemo().updateToken(new UpdateMessage()); + /* + * UpdateMessage um = new UpdateMessage(); um.app_key = "6945070810793313792"; + * um.app_secret="603303e0-de5a-4c17-9175-653d99184cd5"; um.expires_time = + * "2021-07-05 15:30:00"; um.refresh_token = + * "cd5d5ad0-9bed-4923-aadb-5dc1de29b10c"; um.shop_code = "123"; new + * DoudianTestDemo() .doudianUpdateToken(um); + */ + + DdEncryptBO ddEncryptBO = new DdEncryptBO(); + ddEncryptBO.setOrderNo("4819553205672655915"); +// ddEncryptBO.setEncryptDetail("#cex/8345rZ/s9RHo6hRR40hNFPYrrao6o9J1dwRGrUQ7HWi9323Ja0b+60m/uKkfsxOyMc3vYUqzZvoIjAklQ1u06/yH#U9p0KC6WWIsMQ8137zu1Uut9a5rsUy4MyNHOlM+NhyTcDrNorVn/EUzR+qjQhs+CwGU/fFurXdxvJ8P+VPKGQ6RFUOZd/L8Uynl13qmlVmoJA0DkcvolcbjS2k//0I/mepn4JyBz0MT5Ok5e9OXhEj1R*CgkIARCtHCABKAESPgo8b09wAa6O97FztfTTZ0ZcmcuZ2Yb2aRxO+WMHvoAMm2tNH43IFQYwl5A1b2/+YenrgApFeHII/pFXsnqvGgA=#1##"); +// ddEncryptBO.setEncryptPostReceiver( +// "#TVhpP9nf#untl2JA8cBq1hnMuXWYfU10yp2Ar4edVAFGDM4T2LNkaiXQxVasBksZasiS0V3XQFVJu4UTVOGJdAkbo8exKuonPa/USDr+3Yglr*CgkIARCtHCABKAESPgo8KZGlb7o47j8FyhBweZVDyTNsHELRsOmc81xlFDyCqhLF0pYnS4uNz3JE/s1V/HKYMm3tWDXMLfbaygQ7GgA=#1##"); + +// ddEncryptBO.setEncryptPostReceiver("1456sad4f3a4f53a4f531g53r1g53r1g3g515r351gr3g51r3g13rg153gr513r51gr3"); + ddEncryptBO.setEncryptPostTel("$ZjgOHerObF8C/BFyz2CzdOz0HkGGN0CbiYWCaVuys58=$W4v95zDyQk41k8jlYw6PhPTvx2h5sGlr9u2nYvq91MScMunX/gNRxnjmvghAKC4eTPaBBeqVvPMBeQ6ytcmMhY6fenDEhuEqLl91fBE=*CgkIARCtHCABKAESPgo8TRJfhLvm8U2zmne8+2MMoejAhRNv17NwKTHmWae7uyFBJ/FDaDBUPH66okKHdvBLQTGT6/ZC9rZ5x6XwGgA=$1$$"); +// decryptData(ddEncryptBO); + AppConfig appConfig = new AppConfig(); + appConfig.key = "6945070810793313792"; + appConfig.secret = "603303e0-de5a-4c17-9175-653d99184cd5"; + ShopConfig shopConfig = new ShopConfig(); + shopConfig.session_key = "782d3afc-2440-4ef1-9d34-0f39ffd9ab10"; + try { + requestData(appConfig, shopConfig, ddEncryptBO); + } catch (Exception e) { + e.printStackTrace(); + } + + // getProvinceList(); + // getCityList(); + // getAreaList(); +// getrefundList(); +// getOrderDetail(); + // refundProcessDetail(); + } + + public static void requestData(AppConfig appConfig, ShopConfig shopConfig, DdEncryptBO ddEncryptBO) + throws Exception { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + // 封装业务参数 + CipherInfos decryptData = decryptData(ddEncryptBO); + // 封装平台参数 + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("order.batchDecrypt"); + setCommonConfig(douDianSignVO, appConfig.key, shopConfig.session_key, JSON.toJSONString(decryptData), + timestamp); + // 生成签名 + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appConfig.secret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil.buildRequestString(convertUtil.object2Map(douDianSignVO)); + System.out.println(douDianSignVORequestString); + //.replaceAll("=", "%3D")不能替换= + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20").replaceAll("#", "%23").replaceAll("/", "%2F") + .replaceAll("\\+", "%2B");; + System.out.println(douDianSignVORequestString); + String douOrderDetialString = new HttpRequest().sendGet("https://openapi-fxg.jinritemai.com/order/batchDecrypt", + douDianSignVORequestString, "测试logTitle"); + System.out.println(douOrderDetialString); + } + + public static CipherInfos decryptData(DdEncryptBO ddEncryptBO) { + CipherInfos cipherInfos = new CipherInfos(); + // 抖店总有三个加密字段 + List list = new ArrayList(); + // 详细地址 + if (null != ddEncryptBO.getEncryptDetail()) { + CipherInfo cipherInfoDetail = new CipherInfo(); + cipherInfoDetail.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoDetail.setCipher_text(ddEncryptBO.getEncryptDetail()); + list.add(cipherInfoDetail); + } + + // 电话 + if (null != ddEncryptBO.getEncryptPostTel()) { + CipherInfo cipherInfoMobile = new CipherInfo(); + cipherInfoMobile.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoMobile.setCipher_text(ddEncryptBO.getEncryptPostTel()); + list.add(cipherInfoMobile); + } + // 姓名 + if (null != ddEncryptBO.getEncryptPostReceiver()) { + CipherInfo cipherInfoName = new CipherInfo(); + cipherInfoName.setAuth_id(ddEncryptBO.getOrderNo()); + cipherInfoName.setCipher_text(ddEncryptBO.getEncryptPostReceiver()); + list.add(cipherInfoName); + } + + list.sort(Comparator.comparing(CipherInfo::getCipher_text)); + cipherInfos.setCipher_infos(list); + return cipherInfos; + } + + public void encoder(String sb) { + /* + * 空格 - %20 " - %22 # - %23 % - %25 & - %26 ( - %28 ) - %29 + - %2B , - %2C / - + * %2F : - %3A ; - %3B < - %3C = - %3D > - %3E ? - %3F + * + * @ - %40 \ - %5C | - %7C + */ + sb.replaceAll(" ", "%20").replaceAll("#", "%23"); + } + + /** + * + * @ClassName:UpdateTokenThread + * @Author:Luke + * @Date:2018年11月23日 下午3:21:45 + */ + private void getToken(UpdateMessage um, String paramJson) { + String nowTimeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String sign = makeSign(um); + String url = "https://openapi-fxg.jinritemai.com/token/create"; + String params = new StringBuilder("app_key=").append(um.app_key).append("&method=token.create¶m_json=") + .append(paramJson).append("&v=2&sign=").append(sign).toString(); + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendGet(url, params, ""); + JSONObject json = JSON.parseObject(result); + int resultCode = json.getIntValue("err_no"); + if (resultCode == 0) { + JSONObject data = json.getJSONObject("data"); + String access = data.getString("access_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + String refreshToken = json.getString("refresh_token"); + // 写入数据库 + insertToken2Db(um.shop_code, access, refreshToken, expiresIn, nowTimeSdf); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void doudianUpdateToken(UpdateMessage um) { + String shopCode = um.shop_code; + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + long expiresTimeSdf = sdf.parse(um.expires_time).getTime(); + long nowTimeSdf = System.currentTimeMillis(); + // 抖音店铺的授权只有在过期前一个小时内刷新才会刷到新的token和refresh_token,在过期前一个小时外刷新,只会获取到老的token和refresh_token + if (expiresTimeSdf - nowTimeSdf <= 1 * 60 * 60 * 1000) { + String url = "https://openapi-fxg.jinritemai.com/token/refresh"; + + Map updateParamsMap = new HashMap(); + updateParamsMap.put("grant_type", "refresh_token"); + updateParamsMap.put("refresh_token", um.refresh_token); + String updateParamsString = douDianSignUtil.sortParams(updateParamsMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setMethod("token.refresh"); + setCommonConfig(douDianSignVO, um.app_key, null, updateParamsString, sdf.format(new Date())); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(um.app_secret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(new ConvertUtil().object2Map(douDianSignVO)); + + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String result = new HttpRequest().sendGet(url, douDianSignVORequestString, ""); + System.out.println(result); + JSONObject json = JSON.parseObject(result); + if (json.containsKey("data")) { + JSONObject data = json.getJSONObject("data"); + String access = data.getString("access_token"); + String refreshToken = data.getString("refresh_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = data.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 1 * 60 * 60) {// 如果授权码的时效不足1个小时,即购买在两小时内到期,不做更新 + updateNewToken(shopCode, access, refreshToken, expiresIn, nowTimeSdf); + + } else { +// logger.info("店铺:[ {} ] ,刷新码到期,放弃刷新", shopCode); + } + } else { +// logger.info("店铺[ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shopCode, result); + } + } + } catch (Exception e) { +// logger.info("店铺[ {} ] 刷新令牌失败", shopCode); +// logger.error(this, e); + e.printStackTrace(); + } + } + + // 获取公共参数配置信息提取 + public static void setCommonConfig(DouDianSignVO douDianSignVO, String appKey, String token, String douOrderDetial, + String timestamp) { + douDianSignVO.setApp_key(appKey); + douDianSignVO.setParam_json(douOrderDetial); + douDianSignVO.setAccess_token(token); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + } + + /** + * @Description: 更新抖店Token + * @Title: dealUpdateToken + * @author Lewis + * @param um + */ + private void updateToken(UpdateMessage um) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long expiresTimeSdf = sdf.parse(um.expires_time).getTime(); + long nowTimeSdf = System.currentTimeMillis(); + String shopCode = um.shop_code; + // 抖音店铺的授权只有在过期前一个小时内刷新才会刷到新的token和refresh_token,在过期前一个小时外刷新,只会获取到老的token和refresh_token + if (expiresTimeSdf - nowTimeSdf <= 1 * 60 * 60 * 1000) { + String url = "https://openapi-fxg.jinritemai.com/oauth2/refresh_token?"; + String params = new StringBuilder("app_id=").append(um.app_key).append("&app_secret=") + .append(um.app_secret).append("&grant_type=refresh_token&refresh_token=") + .append(um.refresh_token).toString(); + try { + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, params, 3, ApiDouDian.class.getName()); + JSONObject json = JSON.parseObject(result); + if (json.containsKey("data")) { + JSONObject data = json.getJSONObject("data"); + String access = data.getString("access_token"); + String refreshToken = data.getString("refresh_token"); + // String newRefreshToken = json.getString("refresh_token"); + long expiresIn = json.getLong("expires_in");// 获取的是当前时候往后expires_in(秒)过期 + + if (expiresIn > 1 * 60 * 60) {// 如果授权码的时效不足1个小时,即购买在两小时内到期,不做更新 + updateNewToken(shopCode, access, refreshToken, expiresIn, nowTimeSdf); + + } else { + logger.info("店铺:[ {} ] ,刷新码到期,放弃刷新", shopCode); + } + } else { + logger.info("店铺[ {} ] 刷新令牌失败,将在5分钟后重试,返回错误信息:{}", shopCode, result); + } + } catch (Exception e) { + logger.info("店铺[ {} ] 刷新令牌失败", shopCode); + logger.error(this, e); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public String makeSign(UpdateMessage um) { + return ""; + } + + public void insertToken2Db(String shop_code, String access, String refreshToken, long expiresIn, + String nowTimeSdf) { + + } + + public void updateNewToken(String shopCode, String access, String refreshToken, long expiresIn, long nowTimeSdf) { + System.out.println("********************"); + } + + // 订单列表查询 + public static void getOrders() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "38d7cf92-77ff-41be-9b55-ca16aca77804"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + DouDianOrderListQueryVO douDianOrderListQueryVO = new DouDianOrderListQueryVO(); + + douDianOrderListQueryVO.setPage(0); + douDianOrderListQueryVO.setSize(100); + Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-03-18 09:00:05"); + Date date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-06-16 12:00:05"); + douDianOrderListQueryVO.setCreate_time_start(date.getTime() / 1000); + douDianOrderListQueryVO.setCreate_time_end(date1.getTime() / 1000); + + CombineStatusVO combineStatusVo = new CombineStatusVO(); + // combineStatusVo.setMain_status("103"); + combineStatusVo.setOrder_status("2,5"); + ArrayList list = new ArrayList(); + list.add(combineStatusVo); + // System.out.println(list.get(0).getOrder_status()); + douDianOrderListQueryVO.setCombine_status(list); + +// JSONObject douDianOrderListQueryVOJson = JSONObject.fromObject(douDianOrderListQueryVO); +// String douDianOrderListQueryVOStrJson=douDianOrderListQueryVOJson.toString(); + + String douDianOrderListQueryVOStrJson = douDianOrderListQueryVO.toJsonString(); + + // Map douDianOrderListQueryMap = + // convertUtil.object2Map(douDianOrderListQueryVO); + Map douDianOrderListQueryMap = douDianSignUtil.jsonToMap(douDianOrderListQueryVOStrJson); + System.out.println(douDianOrderListQueryMap); + String douDianOrderListQueryString = douDianSignUtil.sortParams(douDianOrderListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("order.searchList"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douDianOrderListQueryString); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String orderListString = new HttpRequest().sendGet(url + "/order/searchList", douDianSignVORequestString, + "测试logTitle"); + + // 解析订单 + System.out.println("orderListString:" + orderListString); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + // 获取订单详情 + public static void getOrderDetail() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "38d7cf92-77ff-41be-9b55-ca16aca77804"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + OrderDetialVO orderDetialVO = new OrderDetialVO(); + orderDetialVO.setShop_order_id("4809186464593927648"); + + String s = orderDetialVO.toJsonString(); + + Map douDianOrderDetialQueryMap = douDianSignUtil.jsonToMap(s); + System.out.println(douDianOrderDetialQueryMap); + String douOrderDetial = douDianSignUtil.sortParams(douDianOrderDetialQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("order.orderDetail"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douOrderDetial); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + System.out.println("qianming:::::" + md5Sign); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String douOrderDetialString = new HttpRequest().sendGet(url + "/order/orderDetail", + douDianSignVORequestString, "测试logTitle"); + + // 售后单列表 + System.out.println("douOrderDetialString::" + douOrderDetialString); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 售后单列表查询 + public static void getrefundList() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + // String sessionKey = "38d7cf92-77ff-41be-9b55-ca16aca77804"; + String sessionKey = ""; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + RefundVO refundVO = new RefundVO(); + // refundVO.setOrder_id("4807042983845184557"); + + refundVO.setEnd_time("2021/06/16 13:48:00"); + refundVO.setIs_desc(0); + refundVO.setOrder_by("update_time");// update_time + refundVO.setPage(0); + refundVO.setSize(100); + refundVO.setStart_time("2021/06/16 09:00:00"); + refundVO.setStatus(1);// 2 + refundVO.setType(5);// 1 + refundVO.setLogistics_status(3);// 3 + + String s = refundVO.toJsonString(); + + Map douDianRefundListQueryMap = douDianSignUtil.jsonToMap(s); + System.out.println(douDianRefundListQueryMap); + String douRefundAreaList = douDianSignUtil.sortParams(douDianRefundListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("trade.refundListSearch"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douRefundAreaList); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + + System.out.println("*****" + md5Sign); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String refundList = new HttpRequest().sendGet(url + "/trade/refundListSearch", douDianSignVORequestString, + "测试logTitle"); + + // 售后单列表 + System.out.println("refundList::" + refundList); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取区列表 + public static void getAreaList() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "801cb840-8fb2-4205-b948-fc8213fac9ec"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + CityVo cityVo = new CityVo(); + cityVo.setCity_id("652900"); + String s = cityVo.toJsonString(); + + Map douDianAreaListQueryMap = douDianSignUtil.jsonToMap(s); + System.out.println(douDianAreaListQueryMap); + String douDianAreaList = douDianSignUtil.sortParams(douDianAreaListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("address.areaList"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douDianAreaList); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String areaList = new HttpRequest().sendGet(url + "/address/areaList", douDianSignVORequestString, + "测试logTitle"); + + // 区 + System.out.println("areaList::" + areaList); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取市列表 + public static void getCityList() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "801cb840-8fb2-4205-b948-fc8213fac9ec"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + ProvinceVo provinceVo = new ProvinceVo(); + provinceVo.setProvince_id("650000"); + String s = provinceVo.toJsonString(); + + Map douDianCityListQueryMap = douDianSignUtil.jsonToMap(s); + System.out.println(douDianCityListQueryMap); + String douDianCityList = douDianSignUtil.sortParams(douDianCityListQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("address.cityList"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douDianCityList); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String cityList = new HttpRequest().sendGet(url + "/address/cityList", douDianSignVORequestString, + "测试logTitle"); + + // 市 + System.out.println("cityList::" + cityList); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取省列表 + public static void getProvinceList() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "801cb840-8fb2-4205-b948-fc8213fac9ec"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("address.provinceList"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json("{}"); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String provinceList = new HttpRequest().sendGet(url + "/address/provinceList", douDianSignVORequestString, + "测试logTitle"); + + // 省 + System.out.println("provinceList::" + provinceList); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取售后单订单详情 + public static void refundProcessDetail() { + try { + DouDianSignUtil douDianSignUtil = new DouDianSignUtil(); + ConvertUtil convertUtil = new ConvertUtil(); + + String url = "https://openapi-fxg.jinritemai.com"; + String appKey = "6945070810793313792"; + String appSecret = "603303e0-de5a-4c17-9175-653d99184cd5"; + String sessionKey = "38d7cf92-77ff-41be-9b55-ca16aca77804"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timestamp = sdf.format(new Date()); + + OrderDetialVO orderDetialVO = new OrderDetialVO(); + orderDetialVO.setOrder_id("4808822075262877122"); + + String s = orderDetialVO.toJsonString(); + + Map douDianOrderDetialQueryMap = douDianSignUtil.jsonToMap(s); + System.out.println(douDianOrderDetialQueryMap); + String douOrderDetial = douDianSignUtil.sortParams(douDianOrderDetialQueryMap); + + DouDianSignVO douDianSignVO = new DouDianSignVO(); + douDianSignVO.setApp_key(appKey); + douDianSignVO.setMethod("afterSale.refundProcessDetail"); + douDianSignVO.setAccess_token(sessionKey); + douDianSignVO.setParam_json(douOrderDetial); + douDianSignVO.setTimestamp(timestamp); + douDianSignVO.setV("2"); + + Map douDianSignMap = new ConvertUtil().object2Map(douDianSignVO); + String buildSignString = douDianSignUtil.buildSignString(appSecret, douDianSignMap); + + String md5Sign = douDianSignUtil.stringToMD5(buildSignString); + System.out.println("qianming:::::" + md5Sign); + douDianSignVO.setSign(md5Sign); + String douDianSignVORequestString = douDianSignUtil + .buildRequestString(convertUtil.object2Map(douDianSignVO)); +// //对参数中出现的空格等特殊字符encode,需要只对对象的值进行,这样需要更改订单开始时间,结束时间和时间戳,此处不进行复杂处理, + // 直接将空格替换为16进制数:%20 + douDianSignVORequestString = douDianSignVORequestString.replaceAll(" ", "%20"); + String douOrderDetialString = new HttpRequest().sendGet(url + "/afterSale/refundProcessDetail", + douDianSignVORequestString, "测试logTitle"); + + // 售后单列表 + System.out.println("douOrderDetialString::" + douOrderDetialString); + + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/com/since/emp/test/ExcelCopy.java b/src/com/since/emp/test/ExcelCopy.java new file mode 100644 index 0000000..123accb --- /dev/null +++ b/src/com/since/emp/test/ExcelCopy.java @@ -0,0 +1,173 @@ +package com.since.emp.test; + +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class ExcelCopy { + public static void main(String[] args) throws Exception { + copyTemplate("orders_181_1623375908324.xlsx", 3,"workbook.xlsx"); + } + @SuppressWarnings("incomplete-switch") + public static void copyTemplate(String exTemplateFilePath,int exTemplateFilePathRow, + String targetFilePath ) throws Exception { + //配置原始表的数据源 + XSSFWorkbook exWorkbook = new XSSFWorkbook(new FileInputStream(exTemplateFilePath)); + // 读取原始表第一个Sheet + XSSFSheet exSheet = exWorkbook.getSheetAt(0); + //读取原始表的列数,以第二列的长度为准 + short exColumnNum = exSheet.getRow(1).getLastCellNum(); + //配置目标表的数据源 + XSSFWorkbook targetWorkbook = new XSSFWorkbook(new FileInputStream(targetFilePath)); + // 读取目标表第一个Sheet + XSSFSheet targetSheet = targetWorkbook.getSheetAt(0); + //读取目标表的行数 + int targetRowNum = targetSheet.getLastRowNum(); + + + //读取原始表指定的行 +// Row exRow = exSheet.getRow(exTemplateFilePathRow); + //在目标表创建新的一行 + targetSheet.createRow(targetRowNum + 1); + + for (int i = 0; i < exColumnNum; i++) { + XSSFCell exCell = exWorkbook.getSheetAt(0).getRow(2).getCell(i); + //创建单元格 + System.out.println("i:" + i); + targetSheet.getRow(targetRowNum + 1).createCell(i); + XSSFCell targetCell = targetSheet.getRow(targetRowNum + 1).getCell(i); +// Cell exCell = exRow.getCell(i); + //设置单元格style +// CellStyle exCellStyle = exCell.getCellStyle(); +// targetSheet.getRow(targetRowNum + 1).getCell(i).setCellStyle(exCellStyle); + //设置单元格type + targetCell.getCellStyle().setLocked(false); + switch (exCell.getCellTypeEnum()) { + case BOOLEAN: + targetCell.setCellValue(exCell.getBooleanCellValue()); + break; + case ERROR: + targetCell.setCellErrorValue(exCell.getErrorCellValue()); + break; + case FORMULA: + targetCell.setCellFormula(parseFormula(exCell.getCellFormula())); + break; + case NUMERIC: + targetCell.setCellValue(exCell.getNumericCellValue()); + break; + case STRING: + targetCell.setCellValue(exCell.getRichStringCellValue()); + break; + + } + FileOutputStream fos = new FileOutputStream(targetFilePath); + targetWorkbook.write(fos); + fos.close(); + } + + + } + public static void copyRows(XSSFSheet sourceSheet, XSSFSheet targetSheet, + int startRow, int endRow, int targetPosition) { + int pStartRow = startRow - 1; + int pEndRow = endRow - 1; + int pPosition = targetPosition - 1; + XSSFRow sourceRow = null, targetRow = null; + XSSFCell sourceCell = null, targetCell = null; + CellRangeAddress region = null; + CellType cType; + int i, j, targetRowFrom, targetRowTo; + if (pStartRow < 0 || pEndRow < 0 || pStartRow > pEndRow) { + return; + } + // 获取合并行单元格的数目,并设定目标单元格合并属性 + int mergedc = sourceSheet.getNumMergedRegions(); + for (i = 0; i < mergedc; i++) { + region = sourceSheet.getMergedRegion(i); + int rf = region.getFirstRow(); + int rt = region.getLastRow(); + if ((rf >= pStartRow) && (rt <= pEndRow)) { + targetRowFrom = rf - pStartRow + pPosition; + targetRowTo = rt - pStartRow + pPosition; + region.setFirstRow(targetRowFrom); + region.setLastRow(targetRowTo); + targetSheet.addMergedRegion(region); + } + } + /* + // 设定个单元格的列宽 + for (i = pStartRow; i <= pEndRow; i++) { + sourceRow = sourceSheet.getRow(i); + if (sourceRow != null) { + int firstC = sourceRow.getFirstCellNum(); + for (j = sourceRow.getLastCellNum(); j > firstC; j--) { + targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j)); + targetSheet.setColumnHidden(j, false); + } + break; + } + } + */ + // 填充数据 + for (; i <= pEndRow; i++) { + sourceRow = sourceSheet.getRow(i); + if (sourceRow == null) { + continue; + } + targetRow = targetSheet.createRow(i - pStartRow + pPosition); +// targetRow.setHeight(sourceRow.getHeight()); + for (j = 0; j < 14; j++) { + sourceCell = sourceRow.getCell(j); + if (sourceCell == null) { + continue; + } + targetCell = targetRow.createCell(j); + targetCell.setCellStyle(sourceCell.getCellStyle()); + cType = sourceCell.getCellTypeEnum(); + targetCell.setCellType(cType); + switch (cType) { + case BOOLEAN: + targetCell.setCellValue(sourceCell.getBooleanCellValue()); + break; + case ERROR: + targetCell.setCellErrorValue(sourceCell.getErrorCellValue()); + break; + case FORMULA: + targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula())); + break; + case NUMERIC: + targetCell.setCellValue(sourceCell.getNumericCellValue()); + break; + case STRING: + targetCell.setCellValue(sourceCell.getRichStringCellValue()); + break; + } + } + } + } + private static String parseFormula(String pPOIFormula) { + final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$ + StringBuffer result = null; + int index; + result = new StringBuffer(); + index = pPOIFormula.indexOf(cstReplaceString); + if (index >= 0) { + result.append(pPOIFormula.substring(0, index)); + result.append(pPOIFormula.substring(index + + cstReplaceString.length())); + } else { + result.append(pPOIFormula); + } + return result.toString(); + } +} diff --git a/src/com/since/emp/test/ExcelSimple.java b/src/com/since/emp/test/ExcelSimple.java new file mode 100644 index 0000000..eceff14 --- /dev/null +++ b/src/com/since/emp/test/ExcelSimple.java @@ -0,0 +1,116 @@ +package com.since.emp.test; + +import com.since.emp.service.OrderSyncs; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.File; +import java.io.FileInputStream; + +/** + * + * @className:ExcelSimple + * @description:Excel读取测试 + * @author:Sunshine + * @date:2019年11月14日 下午2:03:32 + */ +public class ExcelSimple extends OrderSyncs { + + private static final Logger logger = LogManager.getLogger(ExcelSimple.class); + + private static String import_file_path = "orders_31201608100018_1573466062635.xlsx";// 导入文件路径 + + public static void main(String[] args) { + try { + FileInputStream is = null; + File excelFile = new File(import_file_path); // 创建文件对象 + + is = new FileInputStream(excelFile); // 文件流 + // checkExcelVaild(excelFile); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + Sheet sheet = workbook.getSheetAt(0); // 遍历第一个Sheet + // 总行数 + int rowLength = sheet.getLastRowNum() + 1; + System.out.println("总行数:" + rowLength); + // 工作表的列 + Row row = sheet.getRow(0); + // 总列数 + int colLength = row.getLastCellNum(); + System.out.println("总列数:" + colLength); + // 3 + int[] cellArray = {3,4,5,6,7,}; + for (int k = 3; k < rowLength; k++) { + row = sheet.getRow(k); + if (null == row) { + continue; + } + for (int i = 0; i < 39; i++) { + String checkCell = checkCellValue(row, i); + if ("NullValue".equals(checkCell)) { + System.out.println("-->NullValue"); + } else if ("EffectiveValue".equals(checkCell)) { + System.out.println("-->EffectiveValue"); + } else if ("Unknown".equals(checkCell)) { + System.out.println("-->Unknown"); + } else { + System.out.println("-------未捕获到的异常"); + } + + } + + } + + } catch (Exception e) { + logger.error("", e); + String string = e.getCause().toString(); + System.out.println(string); + } + + } + + /** + * 判断文件是否是excel + * + * @throws Exception + */ + public static void checkExcelVaild(File file) throws Exception { + if (!file.exists()) { + throw new Exception("文件不存在"); + } + if (!(file.isFile() && (file.getName().endsWith(".xls") || file.getName().endsWith(".xlsx")))) { + throw new Exception("文件不是Excel"); + } + } + + /** + * + * @title: checkCell + * @description: 检查单元格是否有值 + * @param row 行 + * @param cellNumber 列号 + * @return string NullValue/EffectiveValue 单元格为空值/单元格中有效值 + */ + public static String checkCellValue(Row row, int cellNumber) { + try { + Cell cell = row.getCell(cellNumber); + if (null != cell && "BLANK".equals(cell.getCellTypeEnum().toString())) {// 单元格有过操作 值为空字符串 + return "NullValue"; + } else if (null != cell && !"BLANK".equals(cell.getCellTypeEnum().toString())) { + return "EffectiveValue"; + } else if (null == cell || "BLANK".equals(cell.getCellTypeEnum().toString())) { + return "NullValue"; + } + } catch (Exception e) { + if (e instanceof NullPointerException) { + return "NullValue"; + } + } + return "Unknown"; + } + +} diff --git a/src/com/since/emp/test/HttpClientDemo.java b/src/com/since/emp/test/HttpClientDemo.java new file mode 100644 index 0000000..b0142a1 --- /dev/null +++ b/src/com/since/emp/test/HttpClientDemo.java @@ -0,0 +1,49 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.json.JSONArray; + +import com.google.gson.Gson; +import com.since.emp.service.OrderSyncs; +import com.since.emp.util.MD5Util; + +public class HttpClientDemo { + public static void main(String[] args) {// + /* + try { + System.out.println("开始时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + GetMethod httpMethod = new GetMethod("http://localhost:8040/test"); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(5*60000); + client.getHttpConnectionManager().getParams().setSoTimeout(5*60000); + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + System.out.println("正常结束时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + } catch (Exception e) { + System.out.println("异常结束时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + e.printStackTrace(); + } + */ + String str = "[\"hgl2xUuddAaY1G%2FpweYaqeU1tEHvZ3CQn2jBGaSvhdBI66tpa22646bZp7BZOR88gX7Ndc0VM%2FVD%0ApQx5oWJ4vuHtpXJhj21acOAC5Aid%2FR2FPgnyh3yhY3cxgJTaxurvDRTPtttgKzLFWdeW3c1t3oBb%0Aisrx9ViJlunvx7lJRPByPvZduiCyVBh3DFkSp1ymG%2FKwBy1PnGCj5GixzU1L1jJp1FPUPjOTqpox%0A0TyH02dsMzBGVwwB4Wd%2F9iLI41RKTw8YOw%3D%3D|预订|5l000G181421|G1814|AOH|ZAF|AOH|ZAF|14:15|18:12|03:57|Y|ZUl%2BFxM9VQNj0iVd3wHXdg6MJeA9NQNZ3Kzk97MevP2eU9yc|20181128|3|H6|01|04|1|0|||||||||||1|1|无||O0M090|OM9|0\",\"5ki%2Fb8YhqfHcJ1naZ3hpGk5OcJyQKGmAuUUO1S4QYIrQ5PBB1Bp1EtAz4R5lfUuepXUNit9rwIg5%0Alt6nYwkP4Ckfl9caGtPW8ER4hJksM7ogjgC3KilNGTBmzwAUelI0m5GqvOtDAyBIHu2r5X5Aqy3h%0Amo3g8NXgb4W6xE8nXBucTK4%2FmWTMPMul6omZRJZsTw5qQLFKOTsKLJUIU1LmEl%2BqcZMD6IBUM4bV%0A36SB8G3euiygFU9UTGqo4E%2BltchUE%2BLjRQ%3D%3D|预订|5l000G181811|G1818|AOH|ZAF|AOH|ZAF|14:32|19:30|04:58|Y|HZHUXFroe2xe6tP%2B0IKGsZAL41y%2FUnKj7IPfINeFQ0HrS22r|20181128|3|H1|01|11|1|0|||||||||||1|无|无||O0M090|OM9|0\",\"0TIX2LmP52piFJ2EDh1Ba0c1%2FZ61UCXmWgKtFkKAlbkoUi4sjO5pq6IshVIfHwTd%2BOfVWiCswPU0%0A3uZgQdzwM60CWbZXGWhWv88I%2B8Is4iez%2FA9jDC0v9ab3JTAP5EDLNY2SE%2BMkizmNSml6r0VkcmW9%0ASCQX1ZTow7dm%2BUUk1b5czAMlMWkQE7FA5qbsxlSWH%2FG71y6Zz%2FyFl%2FTKq0OV2SJx2pV8%2BpPdvH%2Fl%0AsC7yYFf9ogM5CWOGb%2FWoDUKyP6hiFFAjXQ%3D%3D|预订|550000K56024|K560|SHH|YWY|SHH|ZZF|14:48|04:04|13:16|Y|IGnCUWDgKErozVBz4MB7dHLdGOvbuM12M3M4xpKywY8ZxC0Wv4%2FtCzIKsOY%3D|20181128|3|H6|01|14|0|0||||有|||有||有|有|||||10401030|1413|1\",\"oN3tjZ6FzuTsuB%2BbepZZNH0OCwi0kdSvRxihJLExvVJizpJNCgeIUCq9dr7o5VLIuJegUa7G95s0%0AbeDlw3Kj5W0gtwe3xO4PTT7QZ9kUeHYetGNAFFdpsXfGi99UidkB%2FqqiSNaU%2FBa4qVtAVj3xl0qm%0AVX5kDnp00Bl9TzDm9n%2F9Mm9E6pDdBbI1jEXCKq1f%2B4SxVMnK79b4ybsuf%2BSPUQyBwovA7jO553pu%0ALuevf6qCDAsRGrUBUoge4bbz%2B1gcJ8DNWg%3D%3D|预订|550000T11671|T116|SHH|LZJ|SHH|ZZF|15:33|01:49|10:16|Y|lFIzFMigcx%2BoT9oF4OL33bjDdyWDKvtikNHAkglxbnuoBHQLpTQo8sgZp4U%3D|20181128|3|H2|01|08|0|0||||11|||有||有|有|||||10401030|1413|1\",\"YVeBCBeIs9DTlgGr8VEz3YH7tJGxasy1ZLeFjf4%2BZQA%2BSAYFYb3Ag8pLRzc6g4tkwlY5GQNilSjT%0AkeCAnqXM1ZZrok9%2BFQf1q7zRwAJJUzP6Aww3PVYN4a%2BnAdbflKhBlXiOu2OBbKpl4hH%2BQ4QqHL5Y%0AeRvwLgn2vbtK2n2srVmn78UWfrsYFuz2WAK4Up%2FQPQYPX5bhLf4nfW7SN6A1FjXpbbYNS%2FlWHjCJ%0AN016wMkG0UiD4zr6uUBrY5KqZdzOiqKMgA%3D%3D|预订|5l000G182221|G1822|AOH|LLF|AOH|ZAF|15:40|20:40|05:00|Y|vljHrDyLz0VmkOLhYYFrdV%2BiBzO%2B2J0nXa2j%2BkCpx4ZeQO0F|20181128|3|H1|01|11|1|0|||||||||||3|无|无||O0M090|OM9|1\",\"rl6MYeCaSG%2BSSE%2FFhJj16y9KGTm4L6rNS8qEeULcNDy1Lbdh3Ld0W7rdklohjPIXhtefpFNUxcbO%0AZ204jQyaOIpAbqvQ1JGn3ZYohDuVMOjPM4Ex81GN4Dq5KS5IDBdKyRN5zZq7VXitup1OOfAEGINE%0Al9m1KkFtOpq0cv%2BYfxlvHk%2F5yNpU%2F4j8Bls3e3sd81%2BOdq0nARhhOM79OnxsZzE9yxHodB30KCE7%0AnR6dXd%2Flasw2Kcgp7eXTWy80%2FWSFQeo3Vw%3D%3D|预订|550000Z25202|Z252|SHH|XAY|SHH|ZZF|15:52|01:42|09:50|Y|yl%2BosEuGWAvzARyDS7Yu1%2FrV3DH38fb89Yn4WotvDPvLC7aYP6HlcFlacR8%3D|20181128|3|H3|01|10|0|0||||无|||有||无|有|||||10401030|1413|0\",\"nShyVcvGXCMCloaiIStXw38Tof95c3N45TKuvKvZYko5TQU6ekWuUXpZKKzG4j5oYWIq2OK4Az0I%0Ad1HlNsanAza%2F5oKhcM%2Byy0ikP02Ma2Q%2F%2BDAGNPpoMcRwMOBKb3Q3WFl0ofEJE%2FPqPK2%2F4atUHBqQ%0A4MU%2BzU4y5DZFokoCjJTN51gN8WwiqrU9hdLl%2FIGFC9uj%2B9xgpiM0%2FqkaItyIZSFalTuHOYO5BVun%0AK2%2FliIJdB2%2BQvcERpMVMdiUxdLyc8Al1nw%3D%3D|预订|5l000G193621|G1936|AOH|EAY|AOH|ZAF|16:12|20:45|04:33|Y|BujjGtdrdApNPPTOp555qgrG4tNKiXYVcPGSzu3SaPLa4%2FfM|20181128|3|H6|01|08|1|0|||||||||||无|无|3||O0M090|OM9|0\",\"0JGt%2F3EN2wDAYfliSgig60JCyYRv0o07EeqlmPRwNUZjzp%2FgBjftTY3mwLwIBLOjKsBmngJ3CD9T%0AkxR4liU2qxLjmQq4%2BxR5vdmbi8CCGTWN0fiYE9xmGfW7f4%2BuNSnoensyZiCHlHAmbSXNZhgCbbi9%0AFsD3P0Q%2B09x8KKrRngCC2pOvjIZR7JbQ0dP3GD4Ha8AjtKwtFQcbTMusxP2YE9sdtbkcA1DgcV4D%0AgvJkzTIrJ1QiHygfEZodx4eSLB2msET4Tw%3D%3D|预订|5l000G281242|G2812|AOH|SJP|AOH|ZAF|16:26|21:23|04:57|Y|LqVh2ESPBG%2FOQa9HEgYsW0kmuNKhSyj3yO4s1eylkLkHB8YT|20181128|3|H2|01|09|1|0|||||||||||无|有|19||O0M090|OM9|0\",\"DPE0gn97IhQcUwKnzNpaSRRl4H934BypnChunLkixpzB%2FytqrOsssoELWzLCTU5MQtU0kdFHn8U0%0AfA%2Bc%2FZpRNiUuXyZsilLU5PXVk2I2PQoyCxkPZQVRu6S0WNioZRvLMkig68IthsnmR1g2ap5xbf7W%0ABreX5HQT7l7tkCPSw5Fhewrjw4yttk1Zl1KvDGvWhy%2FP3Rx7DsUXrfld3NPdBcDYYm2RibbyP1pb%0AbdtV9ozRjFFADPy%2B%2FJOtlMrsypqmu0%2B2EQ%3D%3D|预订|550000K15205|K152|SHH|ZZF|SHH|ZZF|16:31|07:27|14:56|Y|OQEpKUi4NewBssnj63Acsua1kri%2F7AstDiW1hj57A7k1XoLXmuRRR%2B9mMsY%3D|20181128|3|H3|01|13|0|0||||无|||有||无|有|||||10401030|1413|0\",\"CuAL32yyZNU2d8mKFhkDs6oEiOTXTd7ibD60A2VuwUCTk4WcnWP4Fi4p2pvPYMXYklMQ65l5YUMQ%0AZX%2B7XKpRGdYInGqwjfzh%2FfMAs%2FlzJYh%2FRdf0L46DHByPrBLF6Ew6NiAVeH7jxiXiTG%2FpQHRzCo5v%0AofZTwB2tmrxEotDamDo2hNFsvm%2BYcNGgx%2FQpNC7YGnVVPxjIIkVlBLy5FTdOwqXLYOPQLhwAupma%0Ahl70WZ6UtJ6bu3MdBUYut6L3b1G%2FW2D42g%3D%3D|预订|55000K416804|K4168|SHH|ZZF|SHH|ZZF|17:03|08:50|15:47|Y|SiUTTCPsfq6%2FqbOsyDMrpeMEgId0Sb0%2BUeC0Sfy2lrpwCHzNXqIYdWxH%2BaQ%3D|20181128|3|H1|01|13|0|0||||无|||有||1|有|||||10401030|1413|1\",\"K2P9uzbqZuMZ1el0FROCrviB0WTlupO5VxKQbUd9yB9mUk3KUDpQix7XGJGm%2BVE%2BQajrkSHqucm0%0AexQpZ0Iosar5aywdZLI2YA5xR%2B2pA2Y1ZI41uBGCOQWnHsdfVt1qjX56y5qGPrOnsJgxBMeoM8Ll%0AzrQPzvs%2FPN4fkA6BmAlaKwF51ggnig4vgQaBSmwIuJyjGCpPq6eufgxT%2FZsF%2ByJsmaYlwURyzZt6%0AbMNR61zvgJz%2BzOZJdI6iibdTClT1U2RKlQ%3D%3D|预订|5l000G194033|G1940|AOH|EAY|AOH|ZAF|17:06|21:34|04:28|Y|V8Tn5yWyyJaBDXtCbkfeBzydcWE138F5CXdwU3SzB3dqaJjm|20181128|3|H6|01|08|1|0|||||||||||无|1|无||O0M090|OM9|1\",\"MS0OBN4t6P5nnpk6h0gHVyvHoQBBgLo11TIbHNe6kw5bJIph2sbb2Wo%2Bw1rTG6YN83zYjXDIjFGv%0Aep%2Be94bzuVlgOFfql1WdKmlIQz%2BKlOJ56YMgNmgs%2F7lcZ2q94sq%2Fwc5gOGdTLptYaMAZgBzGWj0U%0AUHrv7lSjSDPzJLI56Hiu4hAEueSpz%2FkyNh%2F93xV0m3hQJxDDRyirxOOdgr71XO0rolBHDkkZdpwv%0AWdbw08DO5yikbKGJzH5n194es%2FgmIeVMCsr3HMiZSq5d1C%2F%2BDQ%3D%3D|预订|550000Z21605|Z216|SHH|LZJ|SHH|ZZF|18:37|03:18|08:41|Y|JvLVO1aEaWes6fB%2FYWHmUMCHDBcsZPXYAJnZ9ZF%2BGNWErLzc1oPTlXkSjTM7dkULsWHnK7wT79g%3D|20181128|3|H6|01|06|0|0||||无|有||有||无|无|||||1040102030|14123|0\",\"O%2B3c3EPNGFGBYJkBu%2BpXauNercwF3Ut8hDRLQPa6akBB%2B7vUJmfRAzyki23kWRv2BbPttZTAeNMR%0A7ypddnyIdwQyBV1k8cQGkGKZ2mO6JPwC0cjxLOzc2AqZU0p%2B5dCCjb9rjhpzPBppzwQ8nFdakIRJ%0AcHL3S16%2FqZxFD7NJOjnBgI5zbdoJwYqveHCPHuPyMk01o0HrDJ26XsPfgis5rPmkgirXI0u6SM8t%0A%2BhTKwemC7UjlK63rEd71lV%2B9embolJIBdw%3D%3D|预订|5l0000G36801|G368|AOH|ZAF|AOH|ZAF|19:18|23:17|03:59|Y|q0dUIXJEwaz%2BbgDkSR05GzVD%2F1aZkzmAdZ2BkXBSdbp9XiPF|20181128|3|H6|01|04|1|0|||||||||||有|2|6||O0M090|OM9|1\",\"5FmNN5WATW33k5r6zCAoYaqT6XyY9V9fxgW3ogKcMQsoIWc7lejwfeizTl7UuU%2F8R4He5jS8J58w%0A6y1A35pnI436qljD7T3tWP2YPe%2BYrOraHMjG0HJweCUyuAJyK5hzmdWJ3Do6MZK4tnu3Fsigp3R9%0A0WU%2BtVpLM4g73Y9KnKWBgabWqpXQRyC3Ljrl1pb8SBTnmWmcBIf1bityrcD1oIp%2BNHyIM8IL7VP%2F%0AmuQXNhkOT15%2BU6CzQHqHOBgYl80pByjQ0Q%3D%3D|预订|5500000Z4061|Z40|SHH|WAR|SHH|ZZF|19:40|04:53|09:13|Y|n6%2FlWcVBZ5Z3vyfydZH6zipDicJ%2BrdtOoLKO%2B%2B1zI7TsxXr%2FcP2ayr667XA%3D|20181128|3|H6|01|08|0|0||||无|||有||无|无|||||10401030|1413|0\",\"|预订|550000Z16410|Z164|SHH|LSO|SHH|ZZF|20:10|05:07|08:57|N|ivfOzPHJmp55TQvBNqoklMs3xEhGqnMjV%2FVaTGkFdjzgwWRexqGiDp4vo3I%3D|20181128|3|H2|01|07|0|0||||无|||无||无|无|||||10403010|1431|1\",\"42c2zcshHKk4K2ytuZes6TMGkqw8mKewJPBxcSd%2F83zDXMRtpMUQumLkL%2B9Jutt2Rifexn%2BLsh%2B%2B%0A0C5%2BOLx%2BLOrjI7DUq2%2FYUnUUxsXoyM7hoDaIVeOJEgsAMaT09P%2F5FO4mEWcOHiD6fgymU7tt%2B2WY%0AJu5WCxEBOxxQD2DWNmr2KfRsBdLWDPl50EgdABqlA6fFKiD3ouEQjC9enVR0NyEslm3qnhVGyEke%0AwvaWZDFyl8tGvGuC7C%2FCdUE4QGrFr%2BB3mg%3D%3D|预订|550000K282B7|K282|SHH|CDW|SHH|ZZF|20:46|09:09|12:23|Y|ojr9JZJwkB5HDkYCxTNNW%2FNUKRN2haOOQE%2FYCzz3I3nyY1WDQexkUJc1W8A%3D|20181128|3|H3|01|12|0|0||||无|||有||无|无|||||10401030|1413|0\",\"XypSe4xnauYzHiRj0ui66mM2eIYPn8533ESfRIcRHJCqoz4WcjAQ39jT5IhfEgvwvmzODAO2C%2B1F%0ABCzo4ZHQuHFv0Blr04%2F61S47HOnSrd0yeghOlWdWyL1tvN%2FbJzkTUllzpe0Z1RlvITiLcsOfUWN1%0AXtgCeXwcAxDNmWlkdUy5r4WLQONDBByTYpg9ipk2rn07mAdf%2B%2Fx12ihUbeVN9p%2B7ww%2F5QwbRRY9K%0AG7WR4CTmZJuy78qvrgBvmoE%3D|预订|550000D30681|D306|SHH|EAY|SHH|ZAF|22:55|07:15|08:20|Y|A6wjfTGg9iOGGrqWZNpknHWFgUMtCrgTrxGx3N7OUjurOjls|20181128|3|H2|01|05|1|0||||有|无||||||无||||O02040|O24|1\"]"; + JSONArray jsonArray = new JSONArray(str); + System.out.println(jsonArray.length()); + + } +} diff --git a/src/com/since/emp/test/JingdongDemo.java b/src/com/since/emp/test/JingdongDemo.java new file mode 100644 index 0000000..8e3dea7 --- /dev/null +++ b/src/com/since/emp/test/JingdongDemo.java @@ -0,0 +1,289 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.GsonBuilder; +import com.jd.open.api.sdk.DefaultJdClient; +import com.jd.open.api.sdk.JdClient; +import com.jd.open.api.sdk.domain.ydy.PullDataService.request.pullData.PullDataReqDTO; +import com.jd.open.api.sdk.domain.ydy.PullDataService.request.pullData.WayBillInfo; +import com.jd.open.api.sdk.request.ydy.PrintingPrintDataPullDataRequest; +import com.jd.open.api.sdk.response.ydy.PrintingPrintDataPullDataResponse; +import com.jdcloud.sdk.apim.auth.CredentialsProvider; +import com.jdcloud.sdk.apim.auth.StaticCredentialsProvider; +import com.jdcloud.sdk.apim.client.Environment; +import com.jdcloud.sdk.apim.http.ContentType; +import com.jdcloud.sdk.apim.http.HttpRequestConfig; +import com.jdcloud.sdk.apim.http.Protocol; +import com.since.emp.util.HttpRequest; + +import net.jdcloud.HufuErpMigrateV2.client.HufuErpMigrateV2Client; + +public class JingdongDemo { + public static void main(String[] args) throws Exception { + // 批量查询订单 + + // String url = "https://api.jd.com/routerjson"; + String key = "04DD1217BD2F950B48064A7298B0D94D"; + String secret = "6c0f825de53540ac973cfe6532bc6cd7"; + String session_key = "75f145c5bebb4c24b466d9686e7500a4mtq1"; + String accessKeyId = "E995C8167080BD5ED26B3573D8B08FFF"; + String customerId = "888"; + String endpoint = "hufu.cn-north-1.jdcloud-api.net"; + String secretKey = "17E8CFECA6B49E406D0ED6C6E81021DC"; + + CredentialsProvider credentialsProvider = new StaticCredentialsProvider(accessKeyId, secretKey); + HufuErpMigrateV2Client client = HufuErpMigrateV2Client.builder() + .credentialsProvider(credentialsProvider) + .httpRequestConfig(new HttpRequestConfig.Builder().connectionTimeout(10000) + .contentType(ContentType.APPLICATION_JSON).protocol(Protocol.HTTPS).build()) + .environment(new Environment.Builder().endpoint(endpoint).build()) // 线上环境地址 + .build(); + /* + * 调用虎符接口获取订单 + */ + /* + JingdongHufuOrderPopOrderSearchRequest jingdongHufuOrderPopOrderSearchRequest = new JingdongHufuOrderPopOrderSearchRequest(); + jingdongHufuOrderPopOrderSearchRequest.setAppKey(accessKeyId); + jingdongHufuOrderPopOrderSearchRequest.setCustomerId(customerId); + jingdongHufuOrderPopOrderSearchRequest.setMethod("jingdong.hufu.order.popOrderSearch"); + JingdongHufuOrderPopOrderSearchBody jingdongHufuOrderPopOrderSearchBody = new JingdongHufuOrderPopOrderSearchBody(); + jingdongHufuOrderPopOrderSearchBody.setToken(session_key);// d291b02aa59e4befba9c2402fda6a720di5m + jingdongHufuOrderPopOrderSearchBody + .setOrderState("WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,FINISHED_L"); + jingdongHufuOrderPopOrderSearchBody.setPage(String.valueOf(1)); + jingdongHufuOrderPopOrderSearchBody.setPageSize(String.valueOf(20)); + jingdongHufuOrderPopOrderSearchBody.setStartDate("2021-05-24 10:30:00"); + jingdongHufuOrderPopOrderSearchBody.setEndDate("2021-05-24 11:00:00"); + jingdongHufuOrderPopOrderSearchBody + .setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + jingdongHufuOrderPopOrderSearchBody.setOptionalFields( + "desen_mobile,venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList"); + jingdongHufuOrderPopOrderSearchRequest + .setJingdongHufuOrderPopOrderSearchBody(jingdongHufuOrderPopOrderSearchBody); + JingdongHufuOrderPopOrderSearchResponse jingdongHufuOrderPopOrderSearchResponse = client + .jingdongHufuOrderPopOrderSearch(jingdongHufuOrderPopOrderSearchRequest); + String hfJsonString = new GsonBuilder().disableHtmlEscaping().create().toJson(jingdongHufuOrderPopOrderSearchResponse); + JSONObject hfJsonResult = new JSONObject(hfJsonString); + JSONObject result = hfJsonResult.getJSONObject("result"); + System.out.println(result.toString()); + */ + + String url = "http://114.67.230.107:30002/jd/orderSearch"; + /* + String order_status = "WAIT_SELLER_STOCK_OUT"; + String params = "session_key=" + session_key + "&start_date=2021-05-24 13:00:00&end_date=2021-05-24 14:42:00&order_status=" + order_status + "&shop_code=" + "20191015681" + "&page_now=" + + String.valueOf(1) + "&page_rows=" + String.valueOf(20) + + "&sort_type=0&date_type=0"; + HttpRequest httpRequest = new HttpRequest(); + params = params.replaceAll(" ", "%20"); + String jsonString = httpRequest.sendGet(url, params, ""); + System.out.println(jsonString); + */ + + String tid = "198436150022"; + String param = "session_key=" + "7e1f62e007a74f05b03964e9d07e6fc6yzta" + "&platform_num=" + tid + "&shop_code=" + "2018032195"; + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendGet("http://114.67.230.107:30002" + "/jd/orderGet", param, ""); + System.out.println(result); + + +// PullDataReqDTO pullDataReqDTO = new PullDataReqDTO(); + /* + JdClient client2=new DefaultJdClient("https://api.jd.com/routerjson",session_key,key,secret); + PrintingPrintDataPullDataRequest request=new PrintingPrintDataPullDataRequest(); + PullDataReqDTO param=new PullDataReqDTO(); + param.setCpCode("ZTO"); + param.setObjectId(getGuid()); + Map map = new HashMap(); + map.put("eCustomerCode", "10253283"); +// map.put("ewCustomerCode", session_key); + param.setParameters(map); + + WayBillInfo wayBillInfo = new WayBillInfo(); +// wayBillInfo.setJdWayBillCode("75600183561592"); + wayBillInfo.setWayBillCode("75600183561592"); + wayBillInfo.setOrderNo("XTBL2021052571231"); + wayBillInfo.setPopFlag(1); + List wayBillInfos = new ArrayList(); + wayBillInfos.add(wayBillInfo); + param.setWayBillInfos(wayBillInfos); + request.setParam1(param); + PrintingPrintDataPullDataResponse response=client2.execute(request); + System.out.println(new GsonBuilder().disableHtmlEscaping().create().toJson(response)); +// System.out.println(response.getMsg()); + */ + + + /* + JdClient client=new DefaultJdClient("",session_key,key,secret); + PopOrderOrderSplitCommitXmlApiRequest request=new PopOrderOrderSplitCommitXmlApiRequest(); + request.setParam("无"); + + PopOrderOrderSplitCommitXmlApiResponse response=client.execute(request); + */ + /* + String hfJsonString = "{\"result\":{\"msg\":\"成功\",\"code\":\"0000\",\"num\":0,\"orderInfoList\":[]},\"requestId\":\"bv27scfsnidgg1uj304t7osgoj0ch5md\",\"jdcloudHttpResponse\":{\"content\":[123,34,111,114,100,101,114,73,110,102,111,76,105,115,116,34,58,91,93,44,34,109,115,103,34,58,34,-26,-120,-112,-27,-118,-97,34,44,34,110,117,109,34,58,48,44,34,99,111,100,101,34,58,34,48,48,48,48,34,125],\"contentCharset\":{\"name\":\"UTF-8\",\"aliases\":[\"UTF8\",\"unicode-1-1-utf-8\"],\"aliasSet\":[\"unicode-1-1-utf-8\",\"UTF8\"]},\"contentType\":\"text/plain;charset\\u003dUTF-8\",\"headers\":{\"content-type\":[\"text/plain;charset\\u003dUTF-8\"],\"date\":[\"Mon, 12 Oct 2020 16:00:48 GMT\"],\"server\":[\"Jdcloud-FE\"],\"transfer-encoding\":[\"chunked\"],\"connection\":[\"keep-alive\"],\"access-control-allow-origin\":[\"*\"],\"access-control-allow-headers\":[\"content-type,accept,authorization,x-jdcloud-date,x-jdcloud-nonce,host\"],\"access-control-allow-methods\":[\"POST,OPTIONS\"],\"access-control-max-age\":[\"3600\"],\"vary\":[\"Origin\",\"Access-Control-Request-Method\",\"Access-Control-Request-Headers\"],\"x-jdcloud-request-id\":[\"bv27scfsnidgg1uj304t7osgoj0ch5md\"],\"x-jdcloud-upstream-latency\":[\"55\"],\"x-jdcloud-proxy-latency\":[\"35\"],\"via\":[\"jd-gateway/1.0.1, hb2-waf-jfe-02\"]},\"MediaType\":{\"type\":\"text\",\"subType\":\"plain\",\"parameters\":{\"charset\":\"UTF-8\"}},\"contentLoggingLimit\":16384,\"statusCode\":200,\"statusMessage\":\"\"}}"; + JSONObject hfJsonResult = new JSONObject(hfJsonString); + JSONObject result = hfJsonResult.getJSONObject("result"); + System.out.println(result.toString()); + */ + /** + * 加解密 + */ + /* + String url = "https://api.jd.com/routerjson"; String str = + "AAQcAVFeGhO3b9\\/afM5BPzRi+m03dgA5E4ifvqHo3zIlNqLzXsunKwYYKag6Jo5iGBE="; + TDEClient tdeClient = null; try { tdeClient = SecretJdClient.getInstance(url, + session_key, key, secret); if (TDEClient.isEncryptData(str)) { String string + = new String(tdeClient.decrypt(str), "UTF-8"); System.out.println("string:" + + string); } } catch (Exception e) { e.printStackTrace(); } + */ + /* + String time_start = "2020-09-14 16:00:00"; + String time_end = "2020-09-14 17:00:00"; + String page_now = "1"; + String page_rows = "50"; + + String url = "http://jdapi.chinaemp.cn/getorderlist.php"; + String order_status = "WAIT_SELLER_STOCK_OUT,FINISHED_L"; + String params = "app_key=" + key + "&app_secret=" + secret + "&session_key=" + session_key + "&start_date=" + + time_start + "&end_date=" + time_end + "&order_state=" + order_status + + "&optional_fields=venderId,returnOrder,pin,consigneeInfo,waybill,logisticsId,parentOrderId,orderType,itemInfoList,orderState,sellerDiscount,orderSellerPrice,orderPayment,orderTotalPrice,sellerDiscount,orderStartTime,paymentConfirmTime,modified,freightPrice,orderRemark,venderRemark,payType,orderType,invoiceInfo,invoiceEasyInfo,vatInfo,couponDetailList&page=" + + String.valueOf(page_now) + "&page_size=" + String.valueOf(page_rows) + "&sortType=0&dateType=0"; +// System.out.println(params); + params = params.replaceAll(" ", "%20"); + + String jsonString = sendGet(url, params); + System.out.println("jsonString:"+jsonString); + */ + // 单个订单查询 + +// String key = "04DD1217BD2F950B48064A7298B0D94D"; +// String secret = "6c0f825de53540ac973cfe6532bc6cd7"; +// String session_key = "c3b758c08fb24151aab9a6b0ce92369eninz-"; + /* + String tid = "1263421743233"; + + String param = "app_key=" + key + "&app_secret=" + secret + "&session_key=" + session_key + "&tid=" + tid; + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendGet("http://jdapi.chinaemp.cn/rwjd.php", param, ""); + System.out.println(result); + */ + // client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_ID&grant_type=refresh_token&refresh_token=YOUR_REFRESH_TOKEN + /* + * try { String client_id = "04DD1217BD2F950B48064A7298B0D94D"; String + * client_secret = "6c0f825de53540ac973cfe6532bc6cd7"; String grant_type = + * "refresh_token"; String refresh_token = + * "32f7c3ae-5495-4ca7-adec-023ddd789b0f-"; + * + * String url = "https://oauth.jd.com/oauth/token"; String params = "client_id=" + * + client_id + "&client_secret=" + client_secret + "&grant_type=" + grant_type + * + "&refresh_token=" + refresh_token; HttpRequest httpRequest = new + * HttpRequest(); String result = httpRequest.sendPost(url, params, 3, + * "TestLogTitle"); System.out.println("result:"+ result); JSONObject json = new + * JSONObject(result); long EI = json.getLong("expires_in"); SimpleDateFormat + * sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = new Date(); long + * date = d.getTime() + EI * 1000; System.out.println(sdf.format(date)); + * System.out.println(EI); // System.out.println(result); } catch (Exception e) + * { System.out.println(e.getMessage()); } + */ + /** + * 查询退款订单 + */ + /* + * try { JdClient client = new DefaultJdClient(url, session_key,key, secret, 30* + * 1000, 30 * 1000);//connectTimeout=30秒,readTimeout=30秒 + * PopAfsSoaRefundapplyQueryByIdRequest request = new + * PopAfsSoaRefundapplyQueryByIdRequest(); request.setId(Long.valueOf(13213)); + * PopAfsSoaRefundapplyQueryByIdResponse response = client.execute(request); + * String jsonString = response.getMsg(); System.out.println(jsonString); } + * catch (Exception e) { e.printStackTrace(); } + */ + + } + + + /** + * 20位末尾的数字id + */ + public static int Guid=100; + + public static String getGuid() { + + Guid+=1; + + long now = System.currentTimeMillis(); + //获取4位年份数字 + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy"); + //获取时间戳 + String time=dateFormat.format(now); + String info=now+""; + //获取三位随机数 + //int ran=(int) ((Math.random()*9+1)*100); + //要是一段时间内的数据连过大会有重复的情况,所以做以下修改 + int ran=0; + if(Guid>999){ + Guid=100; + } + ran=Guid; + + return time+info.substring(2, info.length())+ran; + } + + /** + * http get请求方法 + */ + public static String sendGet(String url, String param) { + String result = ""; + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + URLConnection connection = realUrl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 建立实际的连接 + connection.connect(); + // 获取所有响应头字段 + // Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段 + // for (String key : map.keySet()) { + // System.out.println(key + "--->" + map.get(key)); + // } + // 定义 BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + + } catch (Exception e) { + e.printStackTrace(); + } + // 使用finally块来关闭输入流 + finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return result; + } +} diff --git a/src/com/since/emp/test/KuaiShouTest.java b/src/com/since/emp/test/KuaiShouTest.java new file mode 100644 index 0000000..39cefa6 --- /dev/null +++ b/src/com/since/emp/test/KuaiShouTest.java @@ -0,0 +1,67 @@ +package com.since.emp.test; + + + +import com.kuaishou.merchant.open.api.client.AccessTokenKsMerchantClient; +import com.kuaishou.merchant.open.api.common.utils.GsonUtils; +import com.kuaishou.merchant.open.api.request.order.OpenSellerOrderDetailRequest; +import com.kuaishou.merchant.open.api.request.order.OpenSellerOrderPcursorListRequest; +import com.kuaishou.merchant.open.api.response.order.OpenSellerOrderDetailResponse; +import com.kuaishou.merchant.open.api.response.order.OpenSellerOrderPcursorListResponse; + +public class KuaiShouTest { + String url = "https://open.kwaixiaodian.com"; + String appKey = "ks672162246132608051"; + String signSecret = "7e65193530f683381df52f1659ea346c"; + String accessToken = "ChFvYXV0aC5hY2Nlc3NUb2tlbhJAgteIw47VvM4NF5b7TdRYDgTFX6U0kMtOxQkCKCZE4qvcPSXVLCEhriiOUT6GxkbFPsiV_Av6GxW1RkwYAlWC9hoSdJTaZfTbRbe4zPS88hU0zxRHIiB0lwvWOJMNJX5qKHASiJkuVp-442iXEaGXk12c4MJnKigFMAE"; + + /** + * @Description: 获取批量订单 @Title: getOrderList @author Lewis @throws + */ + + public void getOrderList() { + try { + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(url, appKey, signSecret); + + OpenSellerOrderPcursorListRequest request = new OpenSellerOrderPcursorListRequest(); + request.setAccessToken(accessToken); + request.setApiMethodVersion(1L); + + request.setType(1); + request.setCurrentPage(1L); + request.setPageSize(100); + request.setSort(1); + request.setQueryType(1); + request.setBeginTime(125155300000L); + request.setEndTime(1625194900000L); + request.setCpsType(0); + request.setPcursor(""); + + OpenSellerOrderPcursorListResponse response = client.execute(request); + + System.out.println(GsonUtils.toJSON(response)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public void getOrderInfo() { + try { + AccessTokenKsMerchantClient client = new AccessTokenKsMerchantClient(url,appKey,signSecret); + + OpenSellerOrderDetailRequest request = new OpenSellerOrderDetailRequest(); + request.setAccessToken(accessToken); + request.setApiMethodVersion(1L); + + request.setOrderId(12345); + + OpenSellerOrderDetailResponse response = client.execute(request); + + System.out.println(GsonUtils.toJSON(response)); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/since/emp/test/MemcachedTest.java b/src/com/since/emp/test/MemcachedTest.java new file mode 100644 index 0000000..77eb89c --- /dev/null +++ b/src/com/since/emp/test/MemcachedTest.java @@ -0,0 +1,133 @@ +package com.since.emp.test; + +import java.net.InetSocketAddress; + +import net.spy.memcached.MemcachedClient; +import net.spy.memcached.MemcachedConnection; +import net.spy.memcached.internal.OperationFuture; + + +/** + * @description java.net.URLEncoder会将一个英文空格变为+,而memcached调用了这个方法; + * @author Lewis + * @file_name MemcachedTest.java + * @date 2019年5月13日 + */ +public class MemcachedTest { + public static void main(String[] args) throws Exception { + MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("192.168.1.172", 11211)); + MemcachedConnection connection = mcc.getConnection(); + /* + MemCachedClient mcc = null; + String[] servers = { "192.168.1.172:11211" }; + SockIOPool pool = SockIOPool.getInstance(); + pool.setServers(servers); + pool.initialize();// 初始化 + mcc = new MemCachedClient(); + */ + +// mcc.setSanitizeKeys(false); + String rule_key = "1=12"; +// rule_key = rule_key.repla4ceAll(" ", "%20"); + + String value = "1=3"; +// boolean set = set(rule_key,value); + +// String str = getMemcachedClient().get(rule_key); +// OperationFuture set = mcc.set(rule_key,0, value); +// boolean set = mcc.set(rule_key, value); + boolean str = (mcc.get(rule_key) == null); + +// System.out.println("set:" + set); + System.out.println("str:" + str); +// String activity = (String) mcc.get(rule_key); +//// mcc.delete(rule_key); +// System.out.println("原来活动规则:" + activity); +// // JSONArray jsonArray = new JSONArray(activity); +// // for (Object array : jsonArray) { +// // JSONObject jsonObject = new JSONObject(array); +// // +// GiftNum giftNum = new Gson().fromJson(activity, GiftNum.class); +// +// System.out.println(giftNum); +// // GiftNum gn = new GiftNum(); +// // gn.rule_code = "ZPHD20190419168301_1"; +// // giftNum.order_current = 10; +// System.out.println(giftNum); +// // gn.gift_current = 1; +// // String jsonStr = new Gson().toJson(gn); +//// System.out.println(mcc.add(rule_key, new Gson().toJson(giftNum))); +//// System.out.println(mcc.set(rule_key, new Gson().toJson(giftNum))); +// System.out.println("新的活动规则:" + (String) mcc.get(rule_key)); +// // +// // } +// List allKeys = getAllKeys(mcc); +// System.out.println(new Gson().toJson(allKeys)); +// mcc.shutdown(); + + } + + /** + * 获取服务器上面所有的key + * + * @return + * @author liu787427876@126.com + * @date 2013-12-4 + */ +/* + public static List getAllKeys(MemCachedClient memCachedClient) { + System.out.println("开始获取没有挂掉服务器中所有的key......."); + List list = new ArrayList(); + Map> items = memCachedClient.statsItems(); + for (Iterator itemIt = items.keySet().iterator(); itemIt.hasNext();) { + String itemKey = itemIt.next(); + Map maps = items.get(itemKey); + for (Iterator mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) { + String mapsKey = mapsIt.next(); + String mapsValue = maps.get(mapsKey); + if (mapsKey.endsWith("number")) { // memcached key 类型 item_str:integer:number_str + String[] arr = mapsKey.split(":"); + int slabNumber = Integer.valueOf(arr[1].trim()); + int limit = Integer.valueOf(mapsValue.trim()); + Map> dumpMaps = memCachedClient.statsCacheDump(slabNumber, limit); + for (Iterator dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) { + String dumpKey = dumpIt.next(); + Map allMap = dumpMaps.get(dumpKey); + for (Iterator allIt = allMap.keySet().iterator(); allIt.hasNext();) { + String allKey = allIt.next(); + list.add(allKey.trim()); + + } + } + } + } + } + System.out.println("获取没有挂掉服务器中所有的key完成......."); + return list; + } + */ + + +/* + protected static MemcachedClient memcachedClient; + + public static MemcachedClient getMemcachedClient() throws IOException { + if (memcachedClient == null) { + MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.1.172:11211")); + memcachedClient = builder.build(); + memcachedClient.setSanitizeKeys(true); + } + return memcachedClient; + } + + public static boolean set(String key, String value) { + boolean result = false; + try { + result = getMemcachedClient().set(key, 900, value); + } catch (TimeoutException | InterruptedException | MemcachedException | IOException e) { + e.printStackTrace(); + } + return result; + } +*/ +} diff --git a/src/com/since/emp/test/MiaTest.java b/src/com/since/emp/test/MiaTest.java new file mode 100644 index 0000000..59d82a7 --- /dev/null +++ b/src/com/since/emp/test/MiaTest.java @@ -0,0 +1,143 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.util.URIUtil; + +import com.google.gson.Gson; +import com.since.emp.base.mia.MiaAftersaleRequestParams; +import com.since.emp.base.mia.MiaCommonRequestParams; +import com.since.emp.util.HttpRequest; + +import net.sf.json.JSONObject; + +public class MiaTest { + public static void main(String[] args) { + try { + String url = "http://gw.api.miyabaobei.com/openapi/app"; + /* + * 蜜芽根据订单创建时间获取订单 + */ + /* + + String app_key = "0FB74ABA-379A-DDBE-E416-0E21A063C57F"; + String app_secret = "CDECAF0B-8D0E-26A3-EC72-C0221A6E5E98"; + + Param param = new Param(); + + String signParams = "date_sort" + param.date_sort +"date_type" + param.date_type+"end_date"+param.end_date+"format"+param.format+"method"+param.method+"optional_field" +param.optional_field+"order_state"+param.order_state+"page" + param.page + "page_size" + param.page_size+"start_date"+param.start_date+"timestamp"+param.timestamp+"vendor_key"+param.vendor_key+"version"+param.version + app_secret; + String signStr = MD5(signParams); + String params = "sign=" + signStr + "&date_sort=" + param.date_sort +"&date_type=" + param.date_type+"&end_date="+param.end_date+"&format="+param.format+"&method="+param.method+"&optional_field=" +param.optional_field+"&order_state="+param.order_state+"&page=" + param.page + "&page_size=" + param.page_size+"&start_date="+param.start_date+"×tamp="+param.timestamp+"&vendor_key="+param.vendor_key+"&version="+param.version;//+ "&secret=" + app_secret; + + String jsonString = new HttpRequest().sendPost(url, params, 3); + JSONObject json = JSONObject.fromObject(jsonString); + String msg = json.getString("msg"); + System.out.println(msg); + System.out.println("返回结果:"+jsonString); + */ + + + /* + * 蜜芽根据单号获取订单 + */ + + String app_secret = "CDECAF0B-8D0E-26A3-EC72-C0221A6E5E98"; + Param param = new Param(); + String order_id = "1811191710242472"; + String signParams ="format"+param.format+"method"+param.method+"optional_field" +param.optional_field+"order_id"+order_id+"timestamp"+param.timestamp+"vendor_key"+param.vendor_key+"version"+param.version + app_secret; + String signStr = MD5(signParams); + String params = "sign=" + signStr +"&format="+param.format+"&method="+param.method+"&optional_field=" +param.optional_field+"×tamp="+param.timestamp+"&vendor_key="+param.vendor_key+"&version="+param.version +"&order_id="+order_id;//+ "&secret=" + app_secret; + + String jsonString = new HttpRequest().sendPost(url, params, 3, "TestLogTitle"); + System.out.println("返回结果:"+jsonString); + + /* + * 获取售后订单 + */ + /* + String app_secret = "CDECAF0B-8D0E-26A3-EC72-C0221A6E5E98"; + MiaCommonRequestParams miaCommonRequestParams = new MiaCommonRequestParams(); + miaCommonRequestParams.method = "mia.returns.get"; + miaCommonRequestParams. vendor_key = "3D9F8148-D0C5-BC61-728B-8D9BD8E2006A"; + miaCommonRequestParams.timestamp= System.currentTimeMillis() / 1000+ ""; + miaCommonRequestParams.format = "json"; + miaCommonRequestParams.version = "1.0"; + MiaAftersaleRequestParams miaAftersaleRequestParams = new MiaAftersaleRequestParams(); + miaAftersaleRequestParams.start_date = "2018-11-19 00:00:00"; + miaAftersaleRequestParams.end_date = "2018-11-19 12:00:00"; + miaAftersaleRequestParams.return_state = "0,1,2"; + miaAftersaleRequestParams.page = "1"; + miaAftersaleRequestParams.page_size = "100"; + miaAftersaleRequestParams.optional_field = ""; + miaAftersaleRequestParams.date_sort = "0"; + + String signParams = "date_sort" + miaAftersaleRequestParams.date_sort +"end_date"+miaAftersaleRequestParams.end_date+"format"+miaCommonRequestParams.format+"method"+miaCommonRequestParams.method+"optional_field" +miaAftersaleRequestParams.optional_field+"page" + miaAftersaleRequestParams.page + "page_size" + miaAftersaleRequestParams.page_size+"return_state" +miaAftersaleRequestParams.return_state+"start_date"+miaAftersaleRequestParams.start_date+"timestamp"+miaCommonRequestParams.timestamp+"vendor_key"+miaCommonRequestParams.vendor_key+"version"+miaCommonRequestParams.version + app_secret; + String signStr = MD5(signParams); + String params = "sign=" + signStr + "&date_sort=" + miaAftersaleRequestParams.date_sort +"&end_date="+miaAftersaleRequestParams.end_date+"&format="+miaCommonRequestParams.format+"&method="+miaCommonRequestParams.method+"&optional_field=" +miaAftersaleRequestParams.optional_field+"&return_state="+miaAftersaleRequestParams.return_state+"&page=" + miaAftersaleRequestParams.page + "&page_size=" + miaAftersaleRequestParams.page_size+"&start_date="+miaAftersaleRequestParams.start_date+"×tamp="+miaCommonRequestParams.timestamp+"&vendor_key="+miaCommonRequestParams.vendor_key+"&version="+miaCommonRequestParams.version;//+ "&secret=" + app_secret; + + String jsonString = new HttpRequest().sendPost(url, params, 3); +// JSONObject json = JSONObject.fromObject(jsonString); +// String msg = json.getString("msg"); +// System.out.println(msg); + */ + System.out.println("返回结果:"+jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 32位MD5加密 + * + * @param sourceStr + * @return + */ + private static String MD5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + +} +class Param{ + String method = "mia.order.get"; +// String vendor_key = "0FB74ABA-379A-DDBE-E416-0E21A063C57F"; + String vendor_key = "3D9F8148-D0C5-BC61-728B-8D9BD8E2006A"; + String timestamp= System.currentTimeMillis() / 1000+ ""; + String format = "json"; + String version = "1.0"; + String start_date = "2018-11-06 00:00:00"; + String end_date = "2018-11-06 00:00:01"; + String order_state = "1,2,4,5,6"; + String page = "1"; + String page_size = "100"; + String optional_field = "";//"order_id"; + String date_sort = "1"; + String date_type = "1"; +} diff --git a/src/com/since/emp/test/PLGTest.java b/src/com/since/emp/test/PLGTest.java new file mode 100644 index 0000000..f037cb3 --- /dev/null +++ b/src/com/since/emp/test/PLGTest.java @@ -0,0 +1,83 @@ +package com.since.emp.test; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.since.emp.service.DataParse; +import com.since.emp.util.HttpRequest; +import com.since.emp.util.MD5Util; + +/** + * @description + * @author Lewis + * @file_name PLGTest.java + * @date 2019年6月14日 + */ +public class PLGTest { + public static void main(String[] args) { + String orderId = "RG2019042842743"; + HashMap resultMap = sendInterceptToPLG( + orderId); + if (!resultMap.containsKey("result")) { + System.out.println("不包含result"); + } + boolean resultFlag = Boolean.valueOf(resultMap.get("flag")); + String result = resultMap.get("result"); + if (!resultFlag) { + System.out.println("拦截失败"); + } + System.out.println(new Gson().toJson(resultMap)); + } + + private static HashMap sendInterceptToPLG(String orderId) { + HashMap returnMap = new HashMap(); + try { + String key = "JnNBxiJ"; + String warehouseCode = "PLGBJ"; +// 验证内容:orderId+作废时间(yyyyMMddHHmm)+key+ warehouseCode +// Key= JnNBxiJ 作废时间=接口调用时间支持±1分钟的误差 加密算法为md5,加密后的md5值要大写 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + String cancelTime = sdf.format(new Date()); + MD5Util md5 = new MD5Util(); + String sourceToken = orderId + cancelTime + key + warehouseCode; + String token = md5.MD5(sourceToken).toUpperCase(); + HashMap map = new HashMap(); + map.put("token", token); + map.put("orderId", orderId); + map.put("warehouseCode", warehouseCode); +// map.put("cancelReason", "客户取消"); + Gson gson = new Gson(); + String json = gson.toJson(map); + HttpRequest httpRequest = new HttpRequest(); + + String result = httpRequest.sendPost("http://101.200.81.221:9900/api/thermos/cancel", json, 2, PLGTest.class.getName()); + System.out.println(result); + HashMap resultMap = gson.fromJson(result, new TypeToken>() { + }.getType()); + boolean flag = false; + int code = -1; + if (resultMap.containsKey("flag")) { + String resultFlag = resultMap.get("flag"); + if ("success".equals(resultFlag)) { + flag = true; + } + } + if (resultMap.containsKey("code")) { + code = Integer.valueOf(resultMap.get("code")); + } + + returnMap.put("result", result); + if (code >= 0 && flag) { + resultMap.put("flag", "true"); + return resultMap; + } + } catch (Exception e) { + System.out.println(e); + } + returnMap.put("flag", "flase"); + return returnMap; + } +} diff --git a/src/com/since/emp/test/POIDemo.java b/src/com/since/emp/test/POIDemo.java new file mode 100644 index 0000000..a592485 --- /dev/null +++ b/src/com/since/emp/test/POIDemo.java @@ -0,0 +1,227 @@ +package com.since.emp.test; + +import org.apache.poi.openxml4j.exceptions.OpenXML4JException; + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ==================================================================== */ + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; + +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackageAccess; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.util.CellAddress; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.util.SAXHelper; +import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable; +import org.apache.poi.xssf.eventusermodel.XSSFReader; +import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler; +import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler; +import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor; +import org.apache.poi.xssf.model.StylesTable; +import org.apache.poi.xssf.usermodel.XSSFComment; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** + * A rudimentary XLSX -> CSV processor modeled on the POI sample program + * XLS2CSVmra from the package org.apache.poi.hssf.eventusermodel.examples. As + * with the HSSF version, this tries to spot missing rows and cells, and output + * empty entries for them. + *

+ * Data sheets are read using a SAX parser to keep the memory footprint + * relatively small, so this should be able to read enormous workbooks. The + * styles table and the shared-string table must be kept in memory. The standard + * POI styles table class is used, but a custom (read-only) class is used for + * the shared string table because the standard POI SharedStringsTable grows + * very quickly with the number of unique strings. + *

+ * For a more advanced implementation of SAX event parsing of XLSX files, see + * {@link XSSFEventBasedExcelExtractor} and {@link XSSFSheetXMLHandler}. Note + * that for many cases, it may be possible to simply use those with a custom + * {@link SheetContentsHandler} and no SAX code needed of your own! + */ +public class POIDemo { + /** + * Uses the XSSF Event SAX helpers to do most of the work of parsing the Sheet + * XML, and outputs the contents as a (basic) CSV. + */ + private class SheetToCSV implements SheetContentsHandler { + private boolean firstCellOfRow = false; + private int currentRow = -1; + private int currentCol = -1; + + private void outputMissingRows(int number) { + for (int i = 0; i < number; i++) { + for (int j = 0; j < minColumns; j++) { + output.append(','); + } + output.append('\n'); + } + } + + @Override + public void startRow(int rowNum) { + // If there were gaps, output the missing rows + outputMissingRows(rowNum - currentRow - 1); + // Prepare for this row + firstCellOfRow = true; + currentRow = rowNum; + currentCol = -1; + } + + @Override + public void endRow(int rowNum) { + // Ensure the minimum number of columns + for (int i = currentCol; i < minColumns; i++) { + output.append(','); + } + output.append('\n'); + } + + @Override + public void cell(String cellReference, String formattedValue, XSSFComment comment) { + if (firstCellOfRow) { + firstCellOfRow = false; + } else { + output.append(','); + } + + // gracefully handle missing CellRef here in a similar way as XSSFCell does + if (cellReference == null) { + cellReference = new CellAddress(currentRow, currentCol).formatAsString(); + } + + // Did we miss any cells? + int thisCol = (new CellReference(cellReference)).getCol(); + int missedCols = thisCol - currentCol - 1; + for (int i = 0; i < missedCols; i++) { + output.append(','); + } + currentCol = thisCol; + + // Number or string? + try { + Double.parseDouble(formattedValue); + output.append(formattedValue); + } catch (NumberFormatException e) { + output.append('"'); + output.append(formattedValue); + output.append('"'); + } + } + + @Override + public void headerFooter(String text, boolean isHeader, String tagName) { + // Skip, no headers or footers in CSV + } + } + + private final OPCPackage xlsxPackage; + + /** + * Number of columns to read starting with leftmost + */ + private final int minColumns; + + /** + * Destination for data + */ + private final PrintStream output; + + /** + * Creates a new XLSX -> CSV converter + * + * @param pkg The XLSX package to process + * @param output The PrintStream to output the CSV to + * @param minColumns The minimum number of columns to output, or -1 for no + * minimum + */ + public POIDemo(OPCPackage pkg, PrintStream output, int minColumns) { + this.xlsxPackage = pkg; + this.output = output; + this.minColumns = minColumns; + } + + /** + * Parses and shows the content of one sheet using the specified styles and + * shared-strings tables. + * + * @param styles + * @param strings + * @param sheetInputStream + */ + public void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, SheetContentsHandler sheetHandler, + InputStream sheetInputStream) throws IOException, ParserConfigurationException, SAXException { + DataFormatter formatter = new DataFormatter(); + InputSource sheetSource = new InputSource(sheetInputStream); + try { + XMLReader sheetParser = SAXHelper.newXMLReader(); + ContentHandler handler = new XSSFSheetXMLHandler(styles, null, strings, sheetHandler, formatter, false); + sheetParser.setContentHandler(handler); + sheetParser.parse(sheetSource); + } catch (ParserConfigurationException e) { + throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage()); + } + } + + /** + * Initiates the processing of the XLS workbook file to CSV. + * + * @throws IOException + * @throws OpenXML4JException + * @throws ParserConfigurationException + * @throws SAXException + */ + public void process() throws IOException, OpenXML4JException, ParserConfigurationException, SAXException { + ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(this.xlsxPackage); + XSSFReader xssfReader = new XSSFReader(this.xlsxPackage); + StylesTable styles = xssfReader.getStylesTable(); + XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData(); + int index = 0; + while (iter.hasNext()) { + InputStream stream = iter.next(); +// String sheetName = iter.getSheetName(); +// this.output.println(); +// this.output.println(sheetName + " [index=" + index + "]:"); + processSheet(styles, strings, new SheetToCSV(), stream); + stream.close(); + ++index; + } + } + + public static void main(String[] args) throws Exception { + File xlsxFile = new File("orders.xlsx"); + if (!xlsxFile.exists()) { + return; + } + + int minColumns = -1; + if (args.length >= 2) + minColumns = Integer.parseInt(args[1]); + // The package open is instantaneous, as it should be. + OPCPackage p = OPCPackage.open(xlsxFile.getPath(), PackageAccess.READ); + POIDemo xlsx2csv = new POIDemo(p, System.out, minColumns); + xlsx2csv.process(); + p.close(); + } +} diff --git a/src/com/since/emp/test/PinduoduoTest.java b/src/com/since/emp/test/PinduoduoTest.java new file mode 100644 index 0000000..0aa0e2a --- /dev/null +++ b/src/com/since/emp/test/PinduoduoTest.java @@ -0,0 +1,363 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.apache.commons.lang.StringUtils; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddKttIncrementOrderQueryRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddLogisticsCompaniesGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddLogisticsOnlineSendRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddOpenKmsEncryptBatchRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddOrderInformationGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddOrderNumberListIncrementGetRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddKttIncrementOrderQueryResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddLogisticsCompaniesGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddLogisticsOnlineSendResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddOpenKmsEncryptBatchResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddOrderInformationGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddOrderNumberListIncrementGetResponse; +import com.since.emp.util.MD5Util; + +/** + * @description + * @author Lewis + * @file_name PinduoduoTest.java + * @date 2019年7月4日 + */ +public class PinduoduoTest { + static String url = "http://gw-api.pinduoduo.com/api/router"; + static String key = "1df7fba5e96a4527ab16e475a44a45a3"; + static String secret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + static String session_key = "62d65b5196334fcc948a105fc601b63577305832"; + static MD5Util md5 = new MD5Util(); + + public static void main(String[] args) throws Exception{ + try { +// boolean encryptData = isEncryptData("~AAAAAABtvYYAAAAAAAB7x5rBGMzxsc21uVUCNxQV/Bg=~0~"); +// System.out.println(encryptData); +// testEncrypt(); +// dataEncrypt("18387136897"); +// testDecrypt(); +// delivery(); +// getOrder(); +// getOrderInfo(); +// getOrderListBySDK(); +// getOrderInfoBySDK(); +// getLogisticsCompany(); + getKttOrderList(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + public static void getKttOrderList() throws Exception{ + String clientId = "57c68a664a294a0c90353f595adca0c2"; + String clientSecret = "e5b0106936c00481690d7a375851bead97efa868"; + String accessToken = "adc56f5f53994b6dae24631939f1a61ce9b51e46-"; + PopClient client = new PopHttpClient(clientId, clientSecret); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startDate = "2021-05-31 09:00:00"; + String endDate = "2021-05-31 16:00:00"; + PddKttIncrementOrderQueryRequest request = new PddKttIncrementOrderQueryRequest(); +// request.setActivityNo("str"); + request.setAfterSalesStatus(0); + request.setCancelStatus(0); + request.setEndUpdatedAt(sdf.parse(endDate).getTime()); + request.setPageNumber(1); + request.setPageSize(100); + request.setShippingStatus(0); + request.setStartUpdatedAt(sdf.parse(startDate).getTime()); +// request.setVerificationStatus(0); + PddKttIncrementOrderQueryResponse response = client.syncInvoke(request, accessToken); + System.out.println(JsonUtil.transferToJson(response)); + } + + public static void testEncrypt() throws Exception { + + + PopClient client = new PopHttpClient(key, secret); + PddOpenKmsEncryptBatchRequest request = new PddOpenKmsEncryptBatchRequest(); + com.pdd.pop.sdk.http.api.pop.request.PddOpenKmsEncryptBatchRequest.DataListItem listItem= new com.pdd.pop.sdk.http.api.pop.request.PddOpenKmsEncryptBatchRequest.DataListItem(); + List list = new ArrayList(); +// listItem.setData("18387136897"); +// listItem.setSearch(true); +// listItem.setType("phone"); + listItem.setData("广东省深圳市龙华区民治民康花园C6"); + listItem.setSearch(false); + listItem.setType("simple"); + list.add(listItem); + request.setDataList(list); + PddOpenKmsEncryptBatchResponse response = client.syncInvoke(request, session_key); + System.out.println(JsonUtil.transferToJson(response)); + +// PddOpenDecryptMaskBatchRequest request2 = new PddOpenDecryptMaskBatchRequest(); +// com.pdd.pop.sdk.http.api.pop.request.PddOpenDecryptMaskBatchRequest.DataListItem listItem2 = new com.pdd.pop.sdk.http.api.pop.request.PddOpenDecryptMaskBatchRequest.DataListItem(); + + /* + PopClient client = new PopHttpClient(key, secret); + PddOpenDecryptBatchRequest request = new PddOpenDecryptBatchRequest(); + DataListItem listItem = new DataListItem(); + listItem.setEncryptedData("$NviYtZQrrA0R$AAAAAABtvYYAAAAAAACjACxOy8j51hB28L6WMOk2w8o=$0$$"); + listItem.setDataTag("phone"); + List list = new ArrayList(); + list.add(listItem); + request.setDataList(list); + PddOpenDecryptBatchResponse response = client.syncInvoke(request, session_key); + System.out.println(JsonUtil.transferToJson(response)); + */ + /* + PopClient client = new PopHttpClient(key, secret); + PddOpenKmsDecryptBatchRequest request = new PddOpenKmsDecryptBatchRequest(); + com.since.emp.test.dto.PddOpenKmsDecryptBatchRequest.DataListItem listItem = new com.since.emp.test.dto.PddOpenKmsDecryptBatchRequest.DataListItem(); + listItem.setEncryptedData("$NviYtZQrrA0R$AAAAAABtvYYAAAAAAACjACxOy8j51hB28L6WMOk2w8o=$0$$"); + List list = new ArrayList(); + list.add(listItem); + request.setDataList(list); + Object response = client.syncInvoke(request, session_key); + System.out.println("response:" + new Gson().toJson(response)); + System.out.println(JsonUtil.transferToJson(response)); + */ + + } + public static boolean isEncryptData(String data) { + + + char SEP_PHONE = '$'; + char SEP_ID = '#'; + char SEP_NORMAL = '~'; + Pattern BASE64_PATTERN = Pattern.compile("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); + + + if (null == data || data.length() < 44) { + return false; + } + if (data.charAt(0) != data.charAt(data.length() - 1)) { + return false; + } + + + char separator = data.charAt(0); + String[] dataArray = StringUtils.split(data, separator); + if (dataArray.length < 2 || !StringUtils.isNumeric(dataArray[dataArray.length - 1])) { + return false; + } + + + if (separator == SEP_PHONE || separator == SEP_ID) { + if (dataArray.length != 3) { + return false; + } + if (data.charAt(data.length() - 2) == separator) { + return BASE64_PATTERN.matcher(dataArray[0]).matches() && BASE64_PATTERN.matcher(dataArray[1]).matches() && dataArray[1].length()>=44; + } else { + return BASE64_PATTERN.matcher(dataArray[1]).matches() && dataArray[1].length()>=44; + } + } + + + if (separator == SEP_NORMAL) { + if (data.charAt(data.length() - 2) == separator) { + if (dataArray.length != 3) { + return false; + } + return BASE64_PATTERN.matcher(dataArray[0]).matches() && BASE64_PATTERN.matcher(dataArray[1]).matches() && dataArray[0].length()>=44; + } else { + if (dataArray.length != 2) { + return false; + } + return BASE64_PATTERN.matcher(dataArray[0]).matches() && dataArray[0].length()>=44; + } + } + return false; + } + + + /** + * 发货 + * + * @date 2019年7月4日 + * @return void + * @author Lewis + */ + public static void delivery() { + try { + PopClient client = new PopHttpClient(key, secret); + PddLogisticsOnlineSendRequest request = new PddLogisticsOnlineSendRequest(); + request.setOrderSn("190528-217783338051324"); + request.setLogisticsId(115L); + request.setTrackingNumber("75151327695784"); +// request.setRefundAddressId("str"); + PddLogisticsOnlineSendResponse response = client.syncInvoke(request, session_key); + System.out.println(JsonUtil.transferToJson(response)); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * 批量获取接口,未使用SDK + * + * @date 2019年7月4日 + * @return void + * @author Lewis + */ + private static void getOrder() { + PostMethod httpMethod = new PostMethod(url); + + int page_now = 1; + int page_rows = 100; + String time_start = "2019-06-12 14:30:00"; + String time_end = "2019-06-12 14:40:00"; + try { + long timestamp = System.currentTimeMillis() / 1000; + int order_status = 3; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String signStr = "access_token" + session_key + "client_id" + key + "data_type" + "JSON" + "end_updated_at" + + sdf.parse(time_end).getTime() / 1000 + "is_lucky_flag" + "0" + "order_status" + order_status + + "page" + page_now + "page_size" + page_rows + "refund_status" + "5" + "start_updated_at" + + sdf.parse(time_start).getTime() / 1000 + "timestamp" + timestamp + "type" + + "pdd.order.number.list.increment.get"; + + String signStrMD5 = md5.MD5(secret + signStr + secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.number.list.increment.get&data_type=JSON×tamp=" + timestamp + + "&client_id=" + key + "&access_token=" + session_key + "&is_lucky_flag=0&order_status=" + + order_status + "&start_updated_at=" + sdf.parse(time_start).getTime() / 1000 + "&end_updated_at=" + + sdf.parse(time_end).getTime() / 1000 + "&page_size=" + page_rows + "&page=" + page_now + + "&refund_status=5&sign=" + signStrMD5; + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonString = resBuffer.toString(); + System.out.println(jsonString); + } catch (HttpException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + + } + + /** + * 订单详情获取接口,未使用SDK + * + * @date 2019年7月4日 + * @return void + * @author Lewis + */ + private static void getOrderInfo() { + PostMethod httpMethod = new PostMethod(url); + String tid = "201027-413283451820486"; + try { + long timestamp = System.currentTimeMillis() / 1000; + String signStr = "access_token" + session_key + "client_id" + key + "data_type" + "JSON" + "order_sn" + tid + + "timestamp" + timestamp + "type" + "pdd.order.information.get"; + String signStrMD5 = md5.MD5(secret + signStr + secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.information.get&data_type=JSON×tamp=" + timestamp + "&client_id=" + + key + "&access_token=" + session_key + "&order_sn=" + tid + "&sign=" + signStrMD5; + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.getHttpConnectionManager().getParams().setConnectionTimeout(30 * 1000);// 连接超时时长五秒钟 + client.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000);// 响应超时时长五秒钟 + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String jsonStr = resBuffer.toString(); + System.out.println(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 释放连接 + httpMethod.releaseConnection(); + } + } + + + public static void getOrderListBySDK() { + int order_status = 3; + int page_now = 1; + int page_rows = 100; + String time_start = "2019-06-12 14:30:00"; + String time_end = "2019-06-12 14:40:00"; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + PopClient client = new PopHttpClient(key, secret); + PddOrderNumberListIncrementGetRequest request = new PddOrderNumberListIncrementGetRequest(); + request.setIsLuckyFlag(0); + request.setOrderStatus(order_status); + request.setStartUpdatedAt(sdf.parse(time_start).getTime() / 1000); + request.setEndUpdatedAt(sdf.parse(time_end).getTime() / 1000); + request.setPageSize(page_rows); + request.setPage(page_now); + request.setRefundStatus(5); + PddOrderNumberListIncrementGetResponse response = client.syncInvoke(request, session_key); + System.out.println(JsonUtil.transferToJson(response)); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void getOrderInfoBySDK() { + try { + String orderId = "190528-217783338051324"; + PopClient client = new PopHttpClient(key, secret); + + PddOrderInformationGetRequest request = new PddOrderInformationGetRequest(); + request.setOrderSn(orderId); + PddOrderInformationGetResponse response = client.syncInvoke(request, session_key); + System.out.println(JsonUtil.transferToJson(response)); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void getLogisticsCompany() { + try { + PopClient client = new PopHttpClient(key, secret); + PddLogisticsCompaniesGetRequest request = new PddLogisticsCompaniesGetRequest(); + PddLogisticsCompaniesGetResponse response = client.syncInvoke(request); + System.out.println(JsonUtil.transferToJson(response)); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/since/emp/test/PingAnDemo.java b/src/com/since/emp/test/PingAnDemo.java new file mode 100644 index 0000000..69a83d6 --- /dev/null +++ b/src/com/since/emp/test/PingAnDemo.java @@ -0,0 +1,93 @@ +package com.since.emp.test; + +import java.util.List; + +import org.json.JSONObject; + +import com.google.gson.Gson; +import com.pajk.justice.openapi.biz.common.JkClient; +import com.pajk.justice.openapi.biz.common.QueryEnv; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.PageQueryTradeAllResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.PageQueryTradeIncrementResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.QueryTradeDetailResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeDetailResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.TradeResult; +import com.pajk.justice.openapi.biz.model.reuslt.trade.b2c.UpdateEmsResult; +import com.pajk.justice.openapi.biz.request.trade.b2c.PageQueryTradeAllRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.PageQueryTradeIncrementRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.QueryTradeDetailRequest; +import com.pajk.justice.openapi.biz.request.trade.b2c.UpdateEmsRequest; + +/** + * + * @filename PingAnDemo.java + * @description + * @author Luke + * @date 2018年10月30日 下午2:30:23 + */ +public class PingAnDemo { + + public static void main(String[] args) { + try { + /* + * 根据创建时间获取订单 + */ + /* + JkClient jkClient = new JkClient("tongshuntang_01", "aad31ed6b2f32ae371aed7533973cdb9", QueryEnv.TEST); + PageQueryTradeAllRequest request = new PageQueryTradeAllRequest(); + // QueryTradeDetailRequest request = new QueryTradeDetailRequest(); + // request.setTradeId("111586500003"); + request.setSellerId(123453140705L); + request.setStartTime("2018-10-28 00:00:00"); + request.setEndTime("2018-11-03 16:00:00"); + request.setStatus("WAIT_DELIVERY"); + request.setPageNo(1); + request.setPageSize(10); + PageQueryTradeAllResult result = jkClient.execute(request); + System.out.println(result.getTotalCount()); + List model = result.getModel(); + // QueryTradeDetailResult execute = jkClient.execute(request); + // TradeDetailResult model = execute.getModel(); + System.out.println(model); + */ + + /* + * 发货接口 + */ + /* + long sellerId = 21319590608L; + String tradeId = "9283360303"; + long carrierId = 200002L; + String trackingNumber = "12313124323"; + String operator = "test"; + JkClient jkClient = new JkClient("tongshuntang_01", "aad31ed6b2f32ae371aed7533973cdb9", QueryEnv.TEST); + UpdateEmsRequest request = new UpdateEmsRequest(); + request.setSellerId(sellerId); + request.setTradeId(tradeId); + request.setCarrierId(carrierId); + request.setTrackingNumber(trackingNumber); + request.setOperator(operator); + + UpdateEmsResult result = jkClient.execute(request); + */ + + + JkClient jkClient = new JkClient("tongshuntang_01", "a86199bc0a87b6470be985e3ada330b1", QueryEnv.PROD); + PageQueryTradeIncrementRequest request = new PageQueryTradeIncrementRequest(); + //QueryTradeDetailRequest request = new QueryTradeDetailRequest(); + request.setSellerId(42680690509L); + request.setStartTime("2018-11-20 00:00:00"); + request.setEndTime("2018-11-20 11:00:00"); + request.setStatus("WAIT_DELIVERY"); + request.setPageNo(1); + request.setPageSize(10); + //request.setTradeId("2443521580907"); + PageQueryTradeIncrementResult execute = jkClient.execute(request); + Gson gn= new Gson(); + String json = gn.toJson(execute); + System.out.println(json); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/since/emp/test/PopClientDemo.java b/src/com/since/emp/test/PopClientDemo.java new file mode 100644 index 0000000..d163de1 --- /dev/null +++ b/src/com/since/emp/test/PopClientDemo.java @@ -0,0 +1,123 @@ +package com.since.emp.test; + +import org.json.JSONArray; +import org.json.JSONObject; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.sdk.http.PopClient; +import com.pdd.pop.sdk.http.PopHttpClient; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsListGetRequest; +import com.pdd.pop.sdk.http.api.pop.request.PddGoodsQuantityUpdateRequest; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsListGetResponse; +import com.pdd.pop.sdk.http.api.pop.response.PddGoodsQuantityUpdateResponse; + +public class PopClientDemo { + + public static void main(String[] args) throws Exception { +// if (testUpdatePdd()) { +// System.out.println("更新成功!"); +// } else { +// System.out.println("更新失败!"); +// } + updatePddGoods(); + + } + + public static boolean testUpdatePdd() throws Exception { + String clientId = "1df7fba5e96a4527ab16e475a44a45a3"; + String clientSecret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + String accessToken = "86d5f51b69534f66999205d5fb7065ce73caa27b"; + PopClient client = new PopHttpClient(clientId, clientSecret); + String outer_id = "002.01.05.311"; + PddGoodsListGetRequest request = new PddGoodsListGetRequest(); + request.setOuterId(outer_id); + PddGoodsListGetResponse response = client.syncInvoke(request, accessToken); + String transferToJson = JsonUtil.transferToJson(response); + System.out.println("transferToJson:" + transferToJson); + JSONObject json = new JSONObject(transferToJson); + + if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + int error_code = error_response.getInt("error_code"); + String error_msg = error_response.getString("error_msg"); + System.out.println("错误编码:" + error_code + ",异常信息:" + error_msg); + return false; + } + JSONObject goods_list_get_response = null; + if (json.has("goods_list_get_response")) { + goods_list_get_response = json.getJSONObject("goods_list_get_response"); + System.out.println("mark-------->"); + } else { + return false; + } + int total_count = goods_list_get_response.getInt("total_count"); + System.out.println("total_count-------->" + total_count); + JSONArray goods_list_array = null; + + if (goods_list_get_response.has("goods_list")) { + goods_list_array = goods_list_get_response.getJSONArray("goods_list"); + } else { + return false; + } + for (int i = 0; i < goods_list_array.length(); i++) { + JSONObject goods_list = goods_list_array.getJSONObject(i); + System.out.println("goods_list:" + goods_list); + long goods_id = goods_list.getLong("goods_id"); + + System.out.println("goods_id:" + goods_id); + JSONArray sku_list = goods_list.getJSONArray("sku_list"); + for (int j = 0; j < sku_list.length(); j++) { + JSONObject sku_list_json = sku_list.getJSONObject(j); + String goods_outer_id = sku_list_json.getString("outer_id"); + if (outer_id.equals(goods_outer_id)) { + long sku_id = sku_list_json.getLong("sku_id"); + long sku_quantity = sku_list_json.getLong("sku_quantity"); + System.out.println("sku_id:" + sku_id + ",sku_quantity:" + sku_quantity); + } + + } + } + return true; + + } + + public static boolean updatePddGoods() throws Exception { + String clientId = "1df7fba5e96a4527ab16e475a44a45a3"; + String clientSecret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + String accessToken = "86d5f51b69534f66999205d5fb7065ce73caa27b"; + PopClient client = new PopHttpClient(clientId, clientSecret); + PddGoodsQuantityUpdateRequest pddGoodsQuantityUpdateRequest = new PddGoodsQuantityUpdateRequest(); + pddGoodsQuantityUpdateRequest.setGoodsId(1771741863L); + pddGoodsQuantityUpdateRequest.setQuantity(10L); + pddGoodsQuantityUpdateRequest.setSkuId(31204076021L); + pddGoodsQuantityUpdateRequest.setOuterId("002.01.05.311"); + PddGoodsQuantityUpdateResponse pddGoodsQuantityUpdateResponse = client.syncInvoke(pddGoodsQuantityUpdateRequest, + accessToken); + String pddGoodsQuantityUpdateResponseStr = JsonUtil.transferToJson(pddGoodsQuantityUpdateResponse); + System.out.println(pddGoodsQuantityUpdateResponseStr); + JSONObject json = new JSONObject(pddGoodsQuantityUpdateResponseStr); + // 判断接口是否异常 + + if (json.has("error_response")) { + JSONObject error_response = json.getJSONObject("error_response"); + int error_code = error_response.getInt("error_code"); + String error_msg = error_response.getString("error_msg"); + System.out.println("错误编码:" + error_code + ",异常信息:" + error_msg); + return false; + } + // 成功响应 + if (json.has("goods_quantity_update_response")) { + JSONObject goods_quantity_update_response = json.getJSONObject("goods_quantity_update_response"); + String is_success = goods_quantity_update_response.getString("is_success"); + if (is_success.equals("true")) { + + System.out.println("mark---------------------------->库存更新成功!"); + + } else { + System.out.println("mark---------------------------->库存更新失败!"); + } + } + return false; + } + +} diff --git a/src/com/since/emp/test/PressureTest.java b/src/com/since/emp/test/PressureTest.java new file mode 100644 index 0000000..f9cac82 --- /dev/null +++ b/src/com/since/emp/test/PressureTest.java @@ -0,0 +1,525 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.DataParse; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.ReOrderSync; +import com.since.emp.service.StorageUpdate; + +public class PressureTest extends OrderSyncs { + private static Logger logger; + private static String config_filename = "config_all.ini"; + private static String[][] items; + private static String storageUpdateTime; + int count_pressure = 0; + + public static void main(String[] args) { +// logger = Logger.getLogger(OrderSyncs.class); +// PropertyConfigurator.configure("log4j.properties"); + ConfigurationSource source; + String relativePath = "log4j2.properties"; +// String filePath = CONFIG_PATH + System.getProperty("file.separator") + relativePath; + + logger = (Logger) LogManager.getLogger(PressureTest.class.getName()); + + // 读取文件配置 + if (initFileConfig() == false) { + logger.info("【初始化】文件读取配置失败"); + return; + } + logger.info("【初始化】文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.info("【初始化】数据库读取配置失败"); + logger.error(PressureTest.class, e); + return; + } + logger.info("【初始化】数据库读取配置成功"); + + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, "1970-01-01 00:00:00", + "1970-01-01 00:00:00"); + storageUpdate.start(); + + IniReader iniReader = null; + try { + iniReader = new IniReader(config_filename); + } catch (Exception e) { + logger.error(PressureTest.class, e); + } + long platform_code = Long.valueOf(iniReader.getValue("sttest", "platform_code")); + int orderCount = 1000; + ThreadTest tt = new PressureTest().new ThreadTest(orderCount, platform_code, + (int) (Math.random() * 2) == 1 ? "否" : "否"); + tt.start(); + } + + class ThreadTest extends Thread { + private int num; + private long count; + private String seller_note; + + public ThreadTest(int num, long count, String seller_note) { + this.num = num; + this.count = count; + this.seller_note = seller_note; + } + + public synchronized void run() { + while (num > 0) { +// for (int i = 0; i < 100; i++) { + num--; + count++; + TradeInfo tradeInfo = new TradeInfo(); + // tradeInfo.orders[0] tradeInfo.orders[0] = new + // tradeInfo.orders[0](); + tradeInfo.orders = new OrderInfo[1]; + tradeInfo.orders[0] = new OrderInfo(); + // tradeInfo.orders[1] = new tradeInfo.orders[0](); + + // String commodity_code = ""; + // commodity_code="C14666"; + + // OMS + // tradeInfo.entrust_type = 0; + // tradeInfo.entrust_time = ""; //new + // SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new + // Date()); + + tradeInfo.tid = (tradeInfo.tid + (++count_pressure)) + "";// TODO + /* + * if (count_pressure >0 && count_pressure<=10000) { + * tradeInfo.orders[0].platform_seller_code = "002.01.05.447";//TODO + * tradeInfo.type = "step"; } else if (count_pressure >10000 && + * count_pressure<=20000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.203";//TODO tradeInfo.type = "step"; }else if (count_pressure + * >20000 && count_pressure<=30000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.202";//TODO tradeInfo.type = "step"; } else if (count_pressure + * >30000 && count_pressure<=40000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.461";//TODO tradeInfo.type = "step"; } else if (count_pressure + * >40000 && count_pressure<=50000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.339";//TODO tradeInfo.type = "step"; } else if (count_pressure + * >50000 && count_pressure<=60000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.306";//TODO tradeInfo.type = "step"; } else if (count_pressure + * >60000 && count_pressure<=70000){ tradeInfo.orders[0].platform_seller_code = + * "002.03.16.160";//TODO tradeInfo.type = "step"; } else if (count_pressure + * >70000 && count_pressure<=80000){ tradeInfo.orders[0].platform_seller_code = + * "002.01.05.583";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >80000 && count_pressure<=90000) { tradeInfo.orders[0].platform_seller_code = + * "002.01.05.584";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >90000 && count_pressure<=100000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.585";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >100000 && count_pressure<=110000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.586";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >110000 && count_pressure<=120000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.587";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >120000 && count_pressure<=130000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.704";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >130000 && count_pressure<=140000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.519";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >140000 && count_pressure<=150000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.520";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >150000 && count_pressure<=160000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.641";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >160000 && count_pressure<=170000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.187";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >170000 && count_pressure<=180000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.188";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >180000 && count_pressure<=190000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.651";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >190000 && count_pressure<=200000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.652";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >200000 && count_pressure<=210000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.01";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >210000 && count_pressure<=220000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.02";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >220000 && count_pressure<=230000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.015";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >230000 && count_pressure<=240000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.103";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >240000 && count_pressure<=250000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.140";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >250000 && count_pressure<=260000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.049";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >260000 && count_pressure<=270000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.050";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >270000 && count_pressure<=280000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.128";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >280000 && count_pressure<=290000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.170";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >290000 && count_pressure<=300000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.171";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >300000 && count_pressure<=310000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.367";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >310000 && count_pressure<=320000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.366";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >320000 && count_pressure<=330000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.052";//TODO tradeInfo.type = "fixed"; } else if (count_pressure + * >330000 && count_pressure<=340000) { tradeInfo.orders[0].platform_seller_code + * = "002.01.05.342";//TODO tradeInfo.type = "fixed"; } else { + * tradeInfo.orders[0].platform_seller_code = "002.01.05.049";//TODO + * tradeInfo.type = "fixed"; } + */ + + if (count_pressure % 35 == 0) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.447";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 1) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.203";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 2) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.202";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 3) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.461";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 4) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.339";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 5) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.306";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 6) { + tradeInfo.orders[0].platform_seller_code = "002.03.16.160";// TODO + tradeInfo.type = "step"; + } else if (count_pressure % 35 == 7) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.583";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 8) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.584";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 9) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.585";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 10) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.586";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 11) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.587";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 12) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.704";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 13) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.519";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 14) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.520";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 15) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.641";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 16) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.187";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 17) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.188";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 18) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.651";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 19) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.652";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 20) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.01";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 21) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.02";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 22) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.015";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 23) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.103";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 24) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.140";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 25) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.049";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 26) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.050";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 27) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.128";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 28) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.170";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 29) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.171";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 30) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.367";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 31) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.366";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 32) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.052";// TODO + tradeInfo.type = "fixed"; + } else if (count_pressure % 35 == 33) { + tradeInfo.orders[0].platform_seller_code = "002.01.05.342";// TODO + tradeInfo.type = "fixed"; + } else { + tradeInfo.orders[0].platform_seller_code = "002.01.05.049";// TODO + tradeInfo.type = "fixed"; + } + + // tradeInfo.orders[1].platform_seller_code = "002.03"; + tradeInfo.seller_memo = ""; + + tradeInfo.delivery_mode_id = 2; + tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; + tradeInfo.tid = String.valueOf(count); + tradeInfo.brand = "膳魔师"; + tradeInfo.adjust_fee = "32"; + tradeInfo.alipay_id = "3434"; + tradeInfo.alipay_no = "5435"; + tradeInfo.buyer_memo = ""; + tradeInfo.buyer_message = ""; + tradeInfo.buyer_nick = "李逵"; + tradeInfo.buyer_obtain_point_fee = 20; + tradeInfo.buyer_rate = false; + tradeInfo.cod_fee = "dfaf"; + tradeInfo.cod_status = "NEW_CREATED"; + tradeInfo.company_code = "31201608100018"; + // tradeInfo.company_code = "122"; + tradeInfo.shop_code = "20160810000010"; + // tradeInfo.shop_code = "2017092586"; + tradeInfo.created = "2017-10-24 12:00:00"; + tradeInfo.discount_fee = "0"; + tradeInfo.has_post_fee = false; + tradeInfo.money = "1"; + tradeInfo.num = 1; + tradeInfo.status = "WAIT_SELLER_SEND_GOODS"; + tradeInfo.pay_time = "2017-11-11 01:00:00"; + tradeInfo.storage_code = "201608101"; + // tradeInfo.storage_code = "201709251"; + tradeInfo.pay_mode_id = 6; + tradeInfo.invoice_type = 0; + tradeInfo.receiver_country = ""; + if (tradeInfo.receiver_country.equals("")) { + tradeInfo.receiver_country = "中国"; + } + tradeInfo.receiver_state = "上海"; + tradeInfo.receiver_city = "上海市"; + tradeInfo.receiver_district = "浦东新区"; + tradeInfo.receiver_zip = "110000"; + tradeInfo.receiver_name = "胡一菲"; + tradeInfo.receiver_address = "上海上海市浦东新区世纪大道甲一号"; + tradeInfo.receiver_mobile = "13113244565"; + tradeInfo.platform_code = "002"; + tradeInfo.seller_flag = 0; + + tradeInfo.pay_money = "1"; + tradeInfo.product_fee = "88"; + tradeInfo.post_fee = "0"; + tradeInfo.orders[0].buyer_rate = true; + tradeInfo.orders[0].cid = "2"; + // tradeInfo.orders[0].commodity_code = items[0][0]; + tradeInfo.orders[0].num = 1; + tradeInfo.orders[0].discount_fee = "0"; + tradeInfo.orders[0].price = "180"; + tradeInfo.orders[0].payment = "200.07"; + tradeInfo.orders[0].sku_properties_name = "8"; + tradeInfo.orders[0].total_fee = "60"; + tradeInfo.orders[0].adjust_fee = "2"; + tradeInfo.orders[0].status = "1111"; + tradeInfo.orders[0].title = "买一送一"; + tradeInfo.orders[0].divide_order_fee = "0.0"; + tradeInfo.orders[0].part_mjz_discount = "0.0"; + tradeInfo.orders[0].oid = count + "_123"; + + /* + * tradeInfo.orders[1].buyer_rate = true; tradeInfo.orders[1].cid = "2"; // + * tradeInfo.orders[0].commodity_code = items[0][0]; tradeInfo.orders[1].num = + * 1; tradeInfo.orders[1].discount_fee = "0"; tradeInfo.orders[1].price = "180"; + * tradeInfo.orders[1].payment = "200.07"; + * tradeInfo.orders[1].sku_properties_name = "8"; tradeInfo.orders[1].total_fee + * = "60"; tradeInfo.orders[1].adjust_fee = "2"; tradeInfo.orders[1].status = + * "1111"; tradeInfo.orders[1].title = "买一送一"; + * tradeInfo.orders[1].divide_order_fee = "0.0"; + * tradeInfo.orders[1].part_mjz_discount = "0.0"; + */ + // tradeInfo.orders[1] = new tradeInfo.orders[0](); + // + // tradeInfo.orders[1].commodity_code = "002.01.05.642"; + // tradeInfo.orders[1].buyer_rate = true; + // tradeInfo.orders[1].cid = "2"; + //// tradeInfo.orders[0].commodity_code = items[0][0]; + // tradeInfo.orders[1].num = 1; + // tradeInfo.orders[1].discount_fee = "0"; + // tradeInfo.orders[1].price = "180"; + // tradeInfo.orders[1].payment = "200.07"; + // tradeInfo.orders[1].sku_properties_name = "8"; + // tradeInfo.orders[1].total_fee = "60"; + // tradeInfo.orders[1].adjust_fee = "2"; + // tradeInfo.orders[1].status = "1111"; + // tradeInfo.orders[1].title = "买一送一"; + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); +// } + try { + Thread.sleep(1); + // Thread.yield(); + } catch (Exception e) { + logger.error(PressureTest.class, e); + } + } + } + } + + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = new ArrayList(); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = new ArrayList(); + config.plats.add(pc); + } + res = true; + } catch (IOException e) { + logger.error(PressureTest.class, e); + } catch (Exception e) { + logger.error(PressureTest.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + if (conn == null) { + return false; + } + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + + String sql = "select " + "c.platform_code," + "c.code as app_code," + "c.key as app_key," + + "c.secret as app_secret," + "a.company_code as shop_company_code," + "a.code as shop_code," + + "a.name as shop_name," + "a.session_key as shop_session_key," + "b.name as shop_brand" + " from " + + "tb_shop a," + "tb_brand_dic b," + "tb_platform_app c" + " where " + "a.brand_code = b.code" + + " and a.del_flag = 1" + " and a.app_code = c.code" + " and c.del_flag = 1" + + " and a.company_code = b.company_code"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 先判断app是否存在 + String plat_code = rs.getString("platform_code"); + String app_code = rs.getString("app_code"); + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig plat_config = config.plats.get(i); + if (plat_code.equals(plat_config.plat_code)) { + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.brand = rs.getString("shop_brand"); + for (int j = 0; j < plat_config.apps.size(); j++) { + AppConfig app_config = plat_config.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = new ArrayList(); + appConfig.shops.add(shopConfig); + plat_config.apps.add(appConfig); + } + break; + } + } + } + res = true; + } catch (Exception e) { + logger.error(PressureTest.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + conn = null; + } + } + return res; + } +} diff --git a/src/com/since/emp/test/ReadLog.java b/src/com/since/emp/test/ReadLog.java new file mode 100644 index 0000000..983786d --- /dev/null +++ b/src/com/since/emp/test/ReadLog.java @@ -0,0 +1,39 @@ +package com.since.emp.test; + +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Test; + +import com.google.gson.Gson; + +public class ReadLog { + @Test + public void test() { + try { + Stream stringStream = Files + .lines(Paths.get("C:\\Users\\Lewis\\Desktop\\a.log"), Charset.defaultCharset()) + .filter(s->s.startsWith("SELECT")); + List words = stringStream.collect(Collectors.toList()); + Map map = new HashMap(); + for (String line : words) { + if (map.containsKey(line)) { + Integer value = map.get(line); + map.put(line, ++value); + }else { + map.put(line, 1); + } + } + System.out.println(new Gson().toJson(map)); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/since/emp/test/RefundInfoTest.java b/src/com/since/emp/test/RefundInfoTest.java new file mode 100644 index 0000000..0a60cc3 --- /dev/null +++ b/src/com/since/emp/test/RefundInfoTest.java @@ -0,0 +1,221 @@ +package com.since.emp.test; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.RefundInfo; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.DataParse; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.RefundOrderHandler; +import com.since.emp.service.StorageUpdate; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.since.emp.service.OrderSyncs.PlatConfig; +import com.since.emp.service.OrderSyncs.ShopConfig; + +public class RefundInfoTest extends OrderSyncs{ + + private static Logger logger; + private static String config_filename = "config_all.ini"; + private static String[][] items; + private static String storageUpdateTime; + public static int order_count; + public static int platform_code; + + public static void main(String[] args) { + + logger = (Logger) LogManager.getLogger(StOrderSync.class.getName()); + refundOrderHandler = new RefundOrderHandler(); + refundOrderHandler.start(); + // 读取文件配置 + if (initFileConfig() == false) { + logger.info("【初始化】文件读取配置失败"); + return; + } + logger.info("【初始化】文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.info("【初始化】数据库读取配置失败"); + e.printStackTrace(); + return; + } + logger.info("【初始化】数据库读取配置成功"); + + /* + * if (initFilexls() == false) { OrderSyncs.logger.info("【初始化】表格数据读取失败"); } + * OrderSyncs.logger.info("【初始化】表格数据读取成功"); + */ + + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, "1970-01-01 00:00:00", + "1970-01-01 00:00:00"); + storageUpdate.start(); + + // int count2 = 12-27-10;// 平台订单号 +// long platform_code = 202007140000002L;// 平台订单号 TODO +// int num = 3815; + while (order_count > 0) { + order_count--; + RefundInfo refundInfo = new RefundInfo(); + refundInfo.reason = "不想要了"; + refundInfo.desc = "反正就是不想要了"; + refundInfo.bill_type = 1; + refundInfo.company_code = "31201608100018"; + refundInfo.company_type = 2; + refundInfo.tid = String.valueOf(platform_code); + refundInfo.refund_id = String.valueOf(platform_code * 2); + refundInfo.shop_code = "20160810000010"; + refundInfo.refund_fee=119.60; + OrderSyncs.refundOrderHandler.refundInfoQueue.add(refundInfo); + try { + Thread.sleep(1); + // Thread.yield(); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + platform_code++; + } + } + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + order_count = Integer.valueOf(iniReader.getValue("sttest", "orderCount")); + platform_code = Integer.valueOf(iniReader.getValue("sttest", "platform_code")); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = new ArrayList(); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = new ArrayList(); + config.plats.add(pc); + } + res = true; + } catch (IOException e) { + logger.error(StOrderSync.class, e); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + + String sql = "select " + "c.platform_code," + "c.code as app_code," + "c.key as app_key," + + "c.secret as app_secret," + "a.company_code as shop_company_code," + "a.code as shop_code," + + "a.name as shop_name," + "a.session_key as shop_session_key," + "b.name as shop_brand" + " from " + + "tb_shop a," + "tb_brand_dic b," + "tb_platform_app c" + " where " + "a.brand_code = b.code" + + " and a.del_flag = 1" + " and a.app_code = c.code" + " and c.del_flag = 1" + + " and a.company_code = b.company_code"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 先判断app是否存在 + String plat_code = rs.getString("platform_code"); + String app_code = rs.getString("app_code"); + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig plat_config = config.plats.get(i); + if (plat_code.equals(plat_config.plat_code)) { + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.brand = rs.getString("shop_brand"); + for (int j = 0; j < plat_config.apps.size(); j++) { + AppConfig app_config = plat_config.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = new ArrayList(); + appConfig.shops.add(shopConfig); + plat_config.apps.add(appConfig); + } + break; + } + } + } + res = true; + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + conn = null; + } + } + return res; + } + + +} diff --git a/src/com/since/emp/test/RuwiiMall_Simple.java b/src/com/since/emp/test/RuwiiMall_Simple.java new file mode 100644 index 0000000..7776f1f --- /dev/null +++ b/src/com/since/emp/test/RuwiiMall_Simple.java @@ -0,0 +1,180 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection_MiHe; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; + +import com.since.emp.base.OrderInfo; + +/** + * + * @className:RuwiiMall_Simple + * @description:软维微商城测试类(010) + * @author:Sunshine + * @date:2019年4月1日 上午11:24:08 + */ +public class RuwiiMall_Simple extends OrderSyncs { + private static Logger logger; + // public static OrderSyncs orderSyncs; + + public static void main(String[] args) throws Exception { + // logger = (Logger) LogManager.getLogger(RuwiiMall_Simple.class.getName()); + // OrderSyncs.provinceDic(); + // logger = getLogger("RuwiiMall_Simple"); + // Map tradeInfo = getTradeInfo("2019-04-01 10:42:15"); + // for (Entry tradeInfo_str : tradeInfo.entrySet()) { + // TradeInfo info = tradeInfo_str.getValue(); + // System.out.println(info); + // } + + Boolean b1 = true; + boolean b2 = false; + System.out.println(b1); + System.out.println(b2); + System.out.println(b1==true); + + } + + // 获取订单信息并将点单信息放入map中(获取指定时间段内的已付款订单(order_status=5)) + + public static Map getTradeInfo(String create_time) throws Exception { + DbPoolConnection_MiHe dbpc = DbPoolConnection_MiHe.getInstance(); + DruidPooledConnection conn = dbpc.getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + Map tradeInfo_Map = new HashMap(); + // 先查询订单表 + String get_sale_order_sql = "select pay_order_code,platform_code,quantity,money,buyer_nick_name," + + "buyer_name,buyer_address,order_address,buyer_telephone,buyer_email,pay_time,pay_money," + + "trade_mode_id,is_invoice,order_status,create_time,update_time " + + "from tb_sale_order WHERE order_status=5 and create_time>=?"; + ps = conn.prepareStatement(get_sale_order_sql); + ps.setString(1, create_time);// 根据时间查订单 + rs = ps.executeQuery(); + while (rs.next()) { + TradeInfo tradeInfo = new TradeInfo(); + tradeInfo.platform_code = rs.getString("platform_code");// 平台编码 + tradeInfo.tid = rs.getString("pay_order_code");// 订单编码(ID) + tradeInfo.status = rs.getString("order_status");// 订单状态 + tradeInfo.money = rs.getString("money");// 订单总金额 + tradeInfo.pay_money = rs.getString("pay_money");// 付款金额 + tradeInfo.num = rs.getInt("quantity");// 订单商品总数量 + tradeInfo.pay_time = rs.getString("pay_time");// 付款时间 + tradeInfo.created = rs.getString("create_time");// 创建时间 + tradeInfo.receiver_name = rs.getString("buyer_name");// 收件人姓名 + tradeInfo.buyer_nick = rs.getString("buyer_nick_name");// 收件人昵称 + tradeInfo.receiver_phone = rs.getString("buyer_telephone");// 收件人电话 + tradeInfo.receiver_mobile = rs.getString("buyer_telephone");// 收件人电话 + // 收件人地址处理 + String address_str = rs.getString("order_address"); + String[] address_info = address_str.split("\\|"); + for (int i = 0; i < address_info.length; i++) { + if (i == 0) { + tradeInfo.receiver_country = address_info[i];// 国家 + } else if (i == 1) { + tradeInfo.receiver_state = address_info[i];// 省 + } else if (i == 2) { + tradeInfo.receiver_city = address_info[i];// 市 + } else if (i == 3) { + tradeInfo.receiver_district = address_info[i];// 区 + } + + } + if ("北京市,上海市,天津市,重庆市,台湾市".indexOf(tradeInfo.receiver_state) > -1) { + tradeInfo.receiver_state = tradeInfo.receiver_state.replaceAll("市", ""); + } + int diccode = OrderSyncs.getDicCode(OrderSyncs.stateDic, tradeInfo.receiver_state); + if (diccode == 2) { + tradeInfo.receiver_state += "省"; + } else if (diccode == 3) { + tradeInfo.receiver_state += "自治区"; + } else if (diccode == 4) { + tradeInfo.receiver_state += "回族自治区"; + } else if (diccode == 5) { + tradeInfo.receiver_state += "维吾尔自治区"; + } else if (diccode == 6) { + tradeInfo.receiver_state += "壮族自治区"; + } + // 查询订单详情 + tradeInfo.orders = getOrderItemsByOrderId(tradeInfo.tid); + + tradeInfo_Map.put(tradeInfo.tid, tradeInfo); + } + + return tradeInfo_Map; + } + + /** + * + * @title: getOrderItemsByOrderId + * @description: 根据订单号获取订单详情 + * @param pay_order_code + * @throws Exception + */ + public static OrderInfo[] getOrderItemsByOrderId(String pay_order_code) throws Exception { + DbPoolConnection_MiHe dbpc = DbPoolConnection_MiHe.getInstance(); + DruidPooledConnection conn = dbpc.getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + String get_sale_order_items = "select commodity_code,quantity,unit_price,money,commodity_title " + + "from tb_sale_order_items where sale_order_code=?"; + ps = conn.prepareStatement(get_sale_order_items); + ps.setString(1, pay_order_code);// 根据时间查订单 + rs = ps.executeQuery(); + OrderInfo[] orders = {}; + while (rs.next()) { + OrderInfo orderInfo = new OrderInfo(); + orderInfo.platform_seller_code = rs.getString("commodity_code"); + orderInfo.num = rs.getInt("quantity"); + orderInfo.price = rs.getString("unit_price"); + orderInfo.payment = rs.getString("money"); + orderInfo.title = rs.getString("commodity_title"); + orders = Arrays.copyOf(orders, orders.length + 1); + orders[orders.length - 1] = orderInfo; + } + System.out.println(orders); + return orders; + } + + /** + * + * @title: getLogger + * @description: 获取日志 + * @param className + * @return + */ + public static Logger getLogger(String className) { + + ConfigurationSource source; + String relativePath = "log4j2.properties"; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = (Logger) LogManager.getLogger(className); + return logger; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/com/since/emp/test/ScheduledThreadPoolExecutorTest.java b/src/com/since/emp/test/ScheduledThreadPoolExecutorTest.java new file mode 100644 index 0000000..45766f1 --- /dev/null +++ b/src/com/since/emp/test/ScheduledThreadPoolExecutorTest.java @@ -0,0 +1,89 @@ +package com.since.emp.test; + +import java.util.Vector; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +import com.since.emp.base.thread.ScheduledThreadPool; + +/** + * @description + * @author Lewis + * @file_name ScheduledThreadPoolExecutorTest.java + * @date 2019年4月22日 + */ +public class ScheduledThreadPoolExecutorTest { + static Logger logger; + private static ScheduledThreadPoolExecutor scheduledThreadPool; + public static void main(String[] args) { + logger = (Logger) LogManager.getLogger(ScheduledThreadPoolExecutorTest.class.getName()); +// try { +// threadPool = ThreadPool.getInstance(); +// +// } catch (Exception e) { +// logger.error(this, e); +// } + Test1 t1 = new ScheduledThreadPoolExecutorTest(). new Test1(); + } + + class Test1 { + + + public Test1() { + scheduledThreadPool = ScheduledThreadPool.getInstance(); + for (int i = 0; i < 1000; i++) { + TestThread1 tt1 = new TestThread1(i); + scheduledThreadPool.scheduleAtFixedRate(tt1, 0, 500, TimeUnit.MILLISECONDS); + + } + +// TestThread2 tt2 = new TestThread2(); +// scheduledThreadPool.scheduleAtFixedRate(tt2, 1000, 800, TimeUnit.MILLISECONDS); + } + } + + class TestThread1 extends Thread { + int i; + + public TestThread1(int i) { + this.i = i; + } + + @Override + public void run() { +// logger.info("1111-1:" + i); + System.out.println("1111-1:" + i); + try { + Thread.sleep(24*60*60 *1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +// Vector vector = new Vector(); +// vector.add(1); +// if (vector.size() > 0) { +// vector.remove(0); +// vector.get(0); +// vector.remove(0); +// } + +// try { +// Thread.sleep(24*1000*3600); +// } catch (InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// System.out.println("1111-2:" +i); + } + } + + class TestThread2 extends Thread { + @Override + public void run() { + System.out.println("2222"); + } + } +} \ No newline at end of file diff --git a/src/com/since/emp/test/ScheduledThreadPoolTest.java b/src/com/since/emp/test/ScheduledThreadPoolTest.java new file mode 100644 index 0000000..eb57a27 --- /dev/null +++ b/src/com/since/emp/test/ScheduledThreadPoolTest.java @@ -0,0 +1,46 @@ +package com.since.emp.test; + +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import com.since.emp.base.thread.ScheduledThreadPool; +import com.since.emp.base.thread.ThreadPool; + +/** + * @description + * @author Lewis + * @file_name ScheduledThreadPoolTest.java + * @date 2019年7月4日 + */ +public class ScheduledThreadPoolTest { + ThreadPoolExecutor threadPool = ThreadPool.getInstance(); + ThreadTest tt = new ThreadTest(); + public static void main(String[] args) { + + ScheduledThreadPoolExecutor scheduledThreadPool = ScheduledThreadPool.getInstance(); + System.out.println(scheduledThreadPool.getActiveCount()); + + scheduledThreadPool.scheduleAtFixedRate(new ScheduledThreadPoolTest() .new ThreadTest1(), 0, 500, TimeUnit.MILLISECONDS); + } + class ThreadTest1 extends Thread { + @Override + public void run() { + threadPool.execute(tt); + } + } + class ThreadTest extends Thread { + @Override + public void run() { + System.out.println(this.getId()); + System.out.println("test1"); + try { + Thread.sleep(10*1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("test2"); + } + } +} + diff --git a/src/com/since/emp/test/StOrderSync.java b/src/com/since/emp/test/StOrderSync.java new file mode 100644 index 0000000..0003ff6 --- /dev/null +++ b/src/com/since/emp/test/StOrderSync.java @@ -0,0 +1,553 @@ +package com.since.emp.test; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.ShopMessage; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.DataParse; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.StorageUpdate; + +public class StOrderSync extends OrderSyncs { + private static Logger logger; + private static String config_filename = "config_all.ini"; + private static String[][] items; + private static String storageUpdateTime; + public static int order_count; + public static int platform_code; + + public static void main(String[] args) { + + logger = (Logger) LogManager.getLogger(StOrderSync.class.getName()); + + // 读取文件配置 + if (initFileConfig() == false) { + logger.info("【初始化】文件读取配置失败"); + return; + } + logger.info("【初始化】文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.info("【初始化】数据库读取配置失败"); + e.printStackTrace(); + return; + } + logger.info("【初始化】数据库读取配置成功"); + + /* + * if (initFilexls() == false) { OrderSyncs.logger.info("【初始化】表格数据读取失败"); } + * OrderSyncs.logger.info("【初始化】表格数据读取成功"); + */ + + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, "1970-01-01 00:00:00", + "1970-01-01 00:00:00"); + storageUpdate.start(); + + // int count2 = 12-27-10;// 平台订单号 +// long platform_code = 202007140000002L;// 平台订单号 TODO +// int num = 3815; + while (order_count > 0) { + order_count--; + + TradeInfo tradeInfo = new TradeInfo();// 淘宝交易信息实例 + // OrderInfo orderInfo = new OrderInfo(); + tradeInfo.orders = new OrderInfo[1];// 淘宝订单信息实例 + tradeInfo.orders[0] = new OrderInfo(); + + String money = "300"; + + tradeInfo.storage_code = "20180416779";// 仓库编码 + +// switch (order_count%2) { +// case 0: +// tradeInfo.orders[0].platform_seller_code = "111";//自发商品: +// break; +// case 1: +// tradeInfo.orders[0].platform_seller_code = "0101";//自发商品 +// break; +// case 0: + tradeInfo.orders[0].platform_seller_code = "002.01.05.63";//代发商品 +// break; +// case 1: +// tradeInfo.orders[0].platform_seller_code = "00000";//代发商品 +// break; +// default: +// break; +// } + tradeInfo.company_code = "122";// 公司编码 + tradeInfo.shop_code = "2017092586";// 店铺编码 + tradeInfo.company_type = 2;// 2:普通商家,3:品牌商 + + tradeInfo.obm_company_code = ""; + tradeInfo.shopMessage = new ShopMessage(); + tradeInfo.shopMessage.setOrder_sync_lock_flag(1); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(""); + // tradeInfo.storage_code = "201712181";//仓库编码1700-842946 + // tradeInfo.orders[0].platform_seller_code = "001";//平台商家编码 + // tradeInfo.company_code = "139";//公司编码 + // tradeInfo.shop_code = "20171221134";//店铺编码 + // tradeInfo.company_type = 2;//2:普通商家,3:品牌商 + + // tradeInfo.storage_code = "20180528223"; + // tradeInfo.orders[0].platform_seller_code = "632.008"; + // tradeInfo.company_code = "144"; + // tradeInfo.shop_code = "20171223155"; + // tradeInfo.company_type = 3;//2:普通商家,3:品牌商 + + // tradeInfo.orders[0].platform_seller_code = "002.01.05.297"; + // if("是".equals(type)){ + tradeInfo.type = ""; + // }else{ + // tradeInfo.type = "fixed"; + // } + // if("是".equals(seller_note)){ + // tradeInfo.seller_memo = "8888"; + // } + + tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; + // tradeInfo.trade_type = "taobao_trade_TradeBuyerStepPay"; + tradeInfo.tid = String.valueOf(platform_code);// TODO 修改了平台单号 + // tradeInfo.tid = "330146"; + + tradeInfo.brand = "膳魔师"; + tradeInfo.adjust_fee = "0"; + tradeInfo.alipay_id = "3434"; + tradeInfo.alipay_no = "5435"; + // tradeInfo.buyer_memo = "买家备注"; + tradeInfo.seller_memo = ""; + tradeInfo.buyer_message = ""; + tradeInfo.invoice_type = 0;// 0:无发票,5:普通发票,6:增值税普通发票,7:增值税专用发票 + tradeInfo.invoice_money = "100"; + tradeInfo.invoice_phone = "12345679810"; + tradeInfo.invoice_email = "4651@13513.com"; + tradeInfo.address_telephone = "啥该是暗精灵解放大路积分拉到房间里131565616"; + tradeInfo.bank_of_deposit_account_number = "中国建设很行146515346354531231"; + tradeInfo.tax_id = "d422dfadfdfA0"; + tradeInfo.invoice_title = "中国总公司"; + tradeInfo.invoice_content = "要开票哦"; + + tradeInfo.delivery_mode_id = 2; + + tradeInfo.buyer_nick = "松下五十六"; + tradeInfo.buyer_obtain_point_fee = 20; + tradeInfo.buyer_rate = false; + tradeInfo.cod_fee = "dfaf"; + tradeInfo.cod_status = "NEW_CREATED"; + // tradeInfo.company_code = "31201608100018"; + + tradeInfo.discount_fee = "0"; + tradeInfo.has_post_fee = true; + tradeInfo.money = money; + tradeInfo.num = 2; + tradeInfo.status = "WAIT_SELLER_SEND_GOODS"; + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + // long time = System.currentTimeMillis(); + String time = df.format(new Date()); + + tradeInfo.pay_time = time;// TODO 付款时间 + tradeInfo.created = time; + tradeInfo.pay_mode_id = 2; + + tradeInfo.receiver_country = ""; + if (tradeInfo.receiver_country.equals("")) { + tradeInfo.receiver_country = "中国"; + } + + // tradeInfo.receiver_state = "山东省"; + // tradeInfo.receiver_city = "菏泽市"; + // tradeInfo.receiver_district = "定陶区"; + + // tradeInfo.receiver_state = "上海"; + // tradeInfo.receiver_city = "上海市"; + // tradeInfo.receiver_district = "浦东新区"; + // tradeInfo.receiver_zip = "110000"; + // tradeInfo.receiver_name = "-**"; + // tradeInfo.receiver_address = "上海上海市浦东新区世纪大道甲一号"; + + tradeInfo.receiver_state = "上海"; + tradeInfo.receiver_city = "上海市"; + tradeInfo.receiver_district = "普陀区"; + + // tradeInfo.receiver_state = "上海"; + // tradeInfo.receiver_city = "上海市"; + // tradeInfo.receiver_district = "普陀区"; + + // tradeInfo.receiver_state = "湖北省"; + // tradeInfo.receiver_city = "黄石市"; + // tradeInfo.receiver_district = "西塞山区"; + // + // tradeInfo.receiver_state = "辽宁省"; + // tradeInfo.receiver_city = "大连市"; + // tradeInfo.receiver_district = "甘井子区"; + + // tradeInfo.receiver_state = "福建省"; + // tradeInfo.receiver_city = "厦门市"; + // tradeInfo.receiver_district = "集美区"; + + tradeInfo.receiver_zip = "110000"; + tradeInfo.receiver_name = "jal"; + tradeInfo.receiver_address = "北纬路甲一号"; + + tradeInfo.receiver_mobile = "13112314565"; + tradeInfo.platform_code = "002"; + + tradeInfo.pay_money = money; + tradeInfo.product_fee = "387"; + tradeInfo.post_fee = "8"; + tradeInfo.orders[0].buyer_rate = true; + tradeInfo.orders[0].cid = "2"; + // tradeInfo.orders[0].commodity_code = items[0][0]; + tradeInfo.orders[0].num = 2;// 商品数量 + tradeInfo.orders[0].discount_fee = "0"; + tradeInfo.orders[0].price = "287"; + tradeInfo.orders[0].payment = "287"; + tradeInfo.orders[0].sku_properties_name = "8"; + tradeInfo.orders[0].total_fee = "287"; + tradeInfo.orders[0].adjust_fee = "0"; + tradeInfo.orders[0].status = "1111"; + tradeInfo.orders[0].title = "买一送一"; + tradeInfo.orders[0].gift_type = 1; + tradeInfo.orders[0].divide_order_fee = "150"; + tradeInfo.orders[0].order_buyer_payment = "150"; + tradeInfo.orders[0].buyer_rate = true; + tradeInfo.orders[0].cid = "2"; + // tradeInfo.orders[0].commodity_code = items[0][0]; + + // 第二件商品 +// tradeInfo.orders[1] = new OrderInfo(); +// tradeInfo.orders[1].platform_seller_code = "008";// "632.008";//平台商家编码 +// tradeInfo.orders[1].buyer_rate = true; +// tradeInfo.orders[1].cid = "2"; +// // tradeInfo.orders[0].commodity_code = items[0][0]; +// tradeInfo.orders[1].num = 2; +// tradeInfo.orders[1].discount_fee = "0"; +// tradeInfo.orders[1].price = "180"; +// tradeInfo.orders[1].payment = "200.07"; +// tradeInfo.orders[1].sku_properties_name = "8"; +// tradeInfo.orders[1].total_fee = "60"; +// tradeInfo.orders[1].adjust_fee = "2"; +// tradeInfo.orders[1].status = "1111"; +// tradeInfo.orders[1].title = "不送不送"; +// tradeInfo.orders[1].gift_type = 1; +// tradeInfo.orders[1].divide_order_fee = "180"; +// tradeInfo.orders[1].order_buyer_payment = "180"; +// tradeInfo.orders[1].buyer_rate = true; +// tradeInfo.orders[1].cid = "2"; +// tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + // + // tradeInfo.orders[2] = new OrderInfo(); + // tradeInfo.orders[2].platform_seller_code = "999"; + // tradeInfo.orders[2].buyer_rate = true; tradeInfo.orders[1].cid ="2"; + // // tradeInfo.orders[0].commodity_code = items[0][0]; + // tradeInfo.orders[2].num = 1; + // tradeInfo.orders[2].discount_fee ="0"; + // tradeInfo.orders[2].price = "180"; + // tradeInfo.orders[2].payment = "200.07"; + // tradeInfo.orders[2].sku_properties_name = "8"; + // tradeInfo.orders[2].total_fee = "60"; + // tradeInfo.orders[2].adjust_fee = "2"; tradeInfo.orders[1].status= "1111"; + // tradeInfo.orders[2].title = "不送不送"; + // tradeInfo.orders[2].gift_type = 1; + // tradeInfo.orders[2].divide_order_fee = "180"; + // tradeInfo.orders[2].order_buyer_payment= "180"; + // tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + //// + // tradeInfo.orders[3] = new OrderInfo(); + //// tradeInfo.orders[3].platform_seller_code = "009"; + // tradeInfo.orders[3].platform_seller_code = "006.0888"; + // tradeInfo.orders[3].buyer_rate = true; tradeInfo.orders[1].cid ="2"; + // // tradeInfo.orders[0].commodity_code = items[0][0]; + // tradeInfo.orders[3].num = 4; + // tradeInfo.orders[3].discount_fee ="0"; + // tradeInfo.orders[3].price = "180"; + // tradeInfo.orders[3].payment = "200.07"; + // tradeInfo.orders[3].sku_properties_name = "8"; + // tradeInfo.orders[3].total_fee = "60"; + // tradeInfo.orders[3].adjust_fee = "2"; tradeInfo.orders[1].status= "1111"; + // tradeInfo.orders[3].title = "不送不送"; + // tradeInfo.orders[3].gift_type = 1; + // tradeInfo.orders[3].divide_order_fee = "180"; + // tradeInfo.orders[3].order_buyer_payment= "180"; + // tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + //// + /* + * tradeInfo.orders[2] = new OrderInfo(); tradeInfo.orders[2].commodity_code = + * "002.01.05.297"; tradeInfo.orders[2].buyer_rate = true; + * tradeInfo.orders[2].cid = "2"; // tradeInfo.orders[0].commodity_code = + * items[0][0]; tradeInfo.orders[2].num = 1; tradeInfo.orders[2].discount_fee = + * "0"; tradeInfo.orders[2].price = "180"; tradeInfo.orders[2].payment = + * "200.07"; tradeInfo.orders[2].sku_properties_name = "8"; + * tradeInfo.orders[2].total_fee = "60"; tradeInfo.orders[2].adjust_fee = "2"; + * tradeInfo.orders[2].status = "1111"; tradeInfo.orders[2].title = "不送不送"; + */ + // OrderSyncs.dataParse.pretradeQueue.add(tradeInfo);// 预售订单 TODO + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); + // count2++; + try { + Thread.sleep(1); + // Thread.yield(); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + platform_code++; + } + } + + /* + * + * + * ExecutorService es = Executors.newCachedThreadPool(); int count = 0; // for + * (int i = 0; i < items.length; i++) { for (int j = 0; j < 1; j++) { // + * if("".equals(items[i][0])){ // continue; // } // if(i==0){ // count = 320000; + * // }else{ // count += Integer.valueOf(items[i-1][3]); // } + * + * // ThreadTest tt =new StOrderSync() .new + * ThreadTest(Integer.valueOf(items[i][3]),count,items[i][0],items[i][1], + * items[i][2]); ThreadTest tt =new StOrderSync() .new + * ThreadTest(20000,400000,"002.01.05.297","否",""); es.execute(tt); + * + * } + * + * + * } + * + * class ThreadTest extends Thread { private int num; private int count; private + * String commodity_code; private String type; private String seller_note; + * public ThreadTest(int num,int count,String commodity_code,String type,String + * seller_note){ this.num = num; this.count = count; this.commodity_code = + * commodity_code; this.seller_note = seller_note; this.type = type; } + * + * public synchronized void run() { while (num > 0) { num--; count++; TradeInfo + * tradeInfo = new TradeInfo(); // OrderInfo orderInfo = new OrderInfo(); + * tradeInfo.orders = new OrderInfo[1]; tradeInfo.orders[0] = new OrderInfo(); + * + * tradeInfo.orders[0].commodity_code = commodity_code; if("是".equals(type)){ + * tradeInfo.type = "step"; }else{ tradeInfo.type = "fixed"; } + * if("是".equals(seller_note)){ tradeInfo.seller_memo = "8888"; } + * + * tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; tradeInfo.tid = + * String.valueOf(count); tradeInfo.brand = "膳魔师"; tradeInfo.adjust_fee = "32"; + * tradeInfo.alipay_id = "3434"; tradeInfo.alipay_no = "5435"; + * tradeInfo.buyer_memo = "fdafd"; // tradeInfo.buyer_message = "分篮测试"; + * tradeInfo.buyer_nick = "会飞的猪"; tradeInfo.buyer_obtain_point_fee = 20; + * tradeInfo.buyer_rate = false; tradeInfo.cod_fee = "dfaf"; + * tradeInfo.cod_status = "NEW_CREATED"; // tradeInfo.company_code = + * "31201608100018"; tradeInfo.company_code = "0001"; // tradeInfo.shop_code = + * "20160810000010"; tradeInfo.shop_code = "20160810000010"; tradeInfo.created = + * "2016-11-11 05:00:00"; tradeInfo.discount_fee = "0"; tradeInfo.has_post_fee = + * false; tradeInfo.money = "500"; tradeInfo.num = 1; tradeInfo.status = + * "WAIT_SELLER_SEND_GOODS"; tradeInfo.pay_time = "2017-04-25 15:00:00"; + * tradeInfo.pay_mode_id = 6; tradeInfo.invoice_type = 0; + * tradeInfo.receiver_country = ""; if (tradeInfo.receiver_country.equals("")) { + * tradeInfo.receiver_country = "中国"; } tradeInfo.receiver_state = "上海"; + * tradeInfo.receiver_city = "上海市"; tradeInfo.receiver_district = "浦东新区"; + * tradeInfo.receiver_zip = "110000"; tradeInfo.receiver_name = "-**"; + * tradeInfo.receiver_address = "上海上海市浦东新区世纪大道甲一号"; tradeInfo.receiver_mobile = + * "131****4565"; tradeInfo.platform_code = "002"; + * + * tradeInfo.pay_money = "500"; tradeInfo.product_fee = "88"; tradeInfo.post_fee + * = "0"; tradeInfo.orders[0].buyer_rate = true; tradeInfo.orders[0].cid = "2"; + * // tradeInfo.orders[0].commodity_code = items[0][0]; tradeInfo.orders[0].num + * = 1; tradeInfo.orders[0].discount_fee = "0"; tradeInfo.orders[0].price = + * "180"; tradeInfo.orders[0].payment = "200.07"; + * tradeInfo.orders[0].sku_properties_name = "8"; tradeInfo.orders[0].total_fee + * = "60"; tradeInfo.orders[0].adjust_fee = "2"; tradeInfo.orders[0].status = + * "1111"; tradeInfo.orders[0].title = "买一送一"; + * + * + * // tradeInfo.orders[1] = new OrderInfo(); // // + * tradeInfo.orders[1].commodity_code = "002.01.05.642"; // + * tradeInfo.orders[1].buyer_rate = true; // tradeInfo.orders[1].cid = "2"; //// + * tradeInfo.orders[0].commodity_code = items[0][0]; // tradeInfo.orders[1].num + * = 1; // tradeInfo.orders[1].discount_fee = "0"; // tradeInfo.orders[1].price + * = "180"; // tradeInfo.orders[1].payment = "200.07"; // + * tradeInfo.orders[1].sku_properties_name = "8"; // + * tradeInfo.orders[1].total_fee = "60"; // tradeInfo.orders[1].adjust_fee = + * "2"; // tradeInfo.orders[1].status = "1111"; // tradeInfo.orders[1].title = + * "买一送一"; OrderSyncs.dataParse.tradeQueue.add(tradeInfo); try { + * Thread.sleep(1); // Thread.yield(); } catch (Exception e) { + * e.printStackTrace(); } } } } + */ + + /* + * private static boolean initFilexls() { boolean res = false; jxl.Workbook + * readwb = null; try { InputStream instream = new FileInputStream("test.xls"); + * + * readwb = Workbook.getWorkbook(instream); Sheet readsheet = + * readwb.getSheet(3); int rsColumns = readsheet.getColumns(); int rsRows = + * readsheet.getRows(); items = new String[rsRows-3][rsColumns-1]; for (int i = + * 0; i < rsRows-3; i++) { for (int j = 0; j < rsColumns-1; j++) { Cell cell = + * readsheet.getCell(j+1, i+3); items[i][j] = cell.getContents(); } } res = + * true; } catch (Exception e) { e.printStackTrace(); } finally { + * readwb.close(); } return res; } + * + * /* private static boolean initFilexls() { Connection conn = null; + * PreparedStatement ps = null; conn = OrderSyncs.dbUtil.getDbConn(); int count + * = 0; + * + * boolean res = false; jxl.Workbook readwb = null; try { InputStream instream = + * new FileInputStream("新实1-6月收发存2.xls"); + * + * readwb = Workbook.getWorkbook(instream); Sheet readsheet = + * readwb.getSheet(2);//读取表格里面的第3张表 // int rsColumns = readsheet.getColumns(); + * // int rsRows = readsheet.getRows(); items = new String[1647][3]; for (int i + * = 0; i < 1647; i++) { for (int j = 0; j < 3; j++) { Cell cell = + * readsheet.getCell(j+2, i+2); items[i][j] = cell.getContents(); } } for (int i + * = 0; i < items.length; i++) { String sql = + * "update tb_psi set quantity=?,cost=? where model='"+items[i][0]+ + * "' and create_time=?"; ps = conn.prepareStatement(sql); ps.setInt(1, + * Integer.valueOf(items[i][1])); ps.setFloat(2, Float.valueOf(items[i][2])); // + * ps.setString(3, items[i][0]); ps.setString(3, "2016-06-30 23:59:59"); // + * ps.setDate(, x); // System.out.print(items[i][j]+"\t"); if(ps.executeUpdate() + * == 0){ OrderSyncs.logger.info(items[i][0]+"未找到,update失败!"); count++; }else{ + * OrderSyncs.logger.info(items[i][0]+"成功"); } + * + * } OrderSyncs.logger.info("未成功条目数为:"+count); res = true; } catch (Exception e) + * { e.printStackTrace(); } finally { readwb.close(); } return res; } + */ + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + order_count = Integer.valueOf(iniReader.getValue("sttest", "orderCount")); + platform_code = Integer.valueOf(iniReader.getValue("sttest", "platform_code")); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = new ArrayList(); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = new ArrayList(); + config.plats.add(pc); + } + res = true; + } catch (IOException e) { + logger.error(StOrderSync.class, e); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + + String sql = "select " + "c.platform_code," + "c.code as app_code," + "c.key as app_key," + + "c.secret as app_secret," + "a.company_code as shop_company_code," + "a.code as shop_code," + + "a.name as shop_name," + "a.session_key as shop_session_key," + "b.name as shop_brand" + " from " + + "tb_shop a," + "tb_brand_dic b," + "tb_platform_app c" + " where " + "a.brand_code = b.code" + + " and a.del_flag = 1" + " and a.app_code = c.code" + " and c.del_flag = 1" + + " and a.company_code = b.company_code"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 先判断app是否存在 + String plat_code = rs.getString("platform_code"); + String app_code = rs.getString("app_code"); + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig plat_config = config.plats.get(i); + if (plat_code.equals(plat_config.plat_code)) { + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.brand = rs.getString("shop_brand"); + for (int j = 0; j < plat_config.apps.size(); j++) { + AppConfig app_config = plat_config.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = new ArrayList(); + appConfig.shops.add(shopConfig); + plat_config.apps.add(appConfig); + } + break; + } + } + } + res = true; + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + conn = null; + } + } + return res; + } + +} diff --git a/src/com/since/emp/test/StOrderSync2.java b/src/com/since/emp/test/StOrderSync2.java new file mode 100644 index 0000000..f77257a --- /dev/null +++ b/src/com/since/emp/test/StOrderSync2.java @@ -0,0 +1,647 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.Config; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.FenxiaoInfo; +import com.since.emp.base.IniReader; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.DataParse; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.StorageUpdate; + +public class StOrderSync2 extends OrderSyncs { + + private static Logger logger; + private static String config_filename = "config_all.ini"; + private static String[][] items; + private static String storageUpdateTime; + public static int order_count; + public static int platform_code; + + public static void main(String[] args) { + + logger = (Logger) LogManager.getLogger(StOrderSync2.class.getName()); + + // 读取文件配置 + if (initFileConfig() == false) { + logger.info("【初始化】文件读取配置失败"); + return; + } + logger.info("【初始化】文件读取配置成功"); + + // 从数据库读取各app及店铺参数 + try { + getConfigFromDB(); + } catch (Exception e) { + logger.info("【初始化】数据库读取配置失败"); + e.printStackTrace(); + return; + } + logger.info("【初始化】数据库读取配置成功"); + + /* + * if (initFilexls() == false) { OrderSyncs.logger.info("【初始化】表格数据读取失败"); } + * OrderSyncs.logger.info("【初始化】表格数据读取成功"); + */ + + // 数据处理类启动 + dataParse = new DataParse(); + dataParse.start(); + + storageUpdate = new StorageUpdate(config.plats, storageUpdateTime, "1970-01-01 00:00:00", + "1970-01-01 00:00:00"); + storageUpdate.start(); + + long count2 = platform_code;// 平台订单号 + int num = order_count; + + while (num > 0) { + num--; + + TradeInfo tradeInfo = new TradeInfo(); + // OrderInfo orderInfo = new OrderInfo(); + + if (platform_code < 6999) { + tradeInfo.orders = new OrderInfo[1]; + } else { + tradeInfo.orders = new OrderInfo[2]; + } + + String money = "380"; + + tradeInfo.storage_code = "201801291";// 仓库编码 + + tradeInfo.company_code = "162";// 公司编码 + tradeInfo.shop_code = "20180524202";// 店铺编码 + tradeInfo.company_type = 2;// 2:普通商家,3:品牌商 + +// tradeInfo.storage_code = "201712181";//仓库编码1700-842946 +// tradeInfo.orders[0].platform_seller_code = "001";//平台商家编码 +// tradeInfo.company_code = "139";//公司编码 +// tradeInfo.shop_code = "20171221134";//店铺编码 +// tradeInfo.company_type = 2;//2:普通商家,3:品牌商 + +// tradeInfo.storage_code = "201712231"; +// tradeInfo.orders[0].platform_seller_code = "002.03.025"; +// tradeInfo.company_code = "144"; +// tradeInfo.shop_code = "20180202207"; +// tradeInfo.company_type = 3;//2:普通商家,3:品牌商 + +// tradeInfo.orders[0].platform_seller_code = "002.01.05.297"; + // if("是".equals(type)){ + tradeInfo.type = "fixed"; + // }else{ + // tradeInfo.type = "fixed"; + // } + // if("是".equals(seller_note)){ + // tradeInfo.seller_memo = "8888"; + // } + + tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; +// tradeInfo.trade_type = "taobao_trade_TradeBuyerStepPay"; + tradeInfo.tid = String.valueOf(count2); + // tradeInfo.tid = "330146"; + + tradeInfo.brand = ""; + tradeInfo.adjust_fee = "0"; + tradeInfo.alipay_id = "3434"; + tradeInfo.alipay_no = "5435"; + // tradeInfo.buyer_memo = "买家备注"; + tradeInfo.seller_memo = ""; + tradeInfo.buyer_message = ""; + tradeInfo.invoice_type = 0;// 0:无发票,1:有发票 + tradeInfo.invoice_money = "100"; + tradeInfo.delivery_mode_id = 2; + + tradeInfo.buyer_nick = "曾小贤"; + tradeInfo.buyer_obtain_point_fee = 20; + tradeInfo.buyer_rate = false; + tradeInfo.cod_fee = "dfaf"; + tradeInfo.cod_status = "NEW_CREATED"; +// tradeInfo.company_code = "31201608100018"; + + tradeInfo.discount_fee = "0"; + tradeInfo.has_post_fee = true; + tradeInfo.money = money; + if (platform_code < 6999) { + tradeInfo.num = 1; + } else { + tradeInfo.num = 2; + } + tradeInfo.status = "WAIT_SELLER_SEND_GOODS"; + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 + long time = System.currentTimeMillis(); + Date now = new Date(time); + tradeInfo.pay_time = df.format(now); + tradeInfo.created = "2018-06-22 10:00:00"; + tradeInfo.pay_mode_id = 2; + + tradeInfo.receiver_country = ""; + if (tradeInfo.receiver_country.equals("")) { + tradeInfo.receiver_country = "中国"; + } + +// tradeInfo.receiver_state = "山东省"; +// tradeInfo.receiver_city = "菏泽市"; +// tradeInfo.receiver_district = "定陶区"; + + // tradeInfo.receiver_state = "上海"; + // tradeInfo.receiver_city = "上海市"; + // tradeInfo.receiver_district = "浦东新区"; + // tradeInfo.receiver_zip = "110000"; + // tradeInfo.receiver_name = "-**"; + // tradeInfo.receiver_address = "上海上海市浦东新区世纪大道甲一号"; + + tradeInfo.receiver_state = "上海"; + tradeInfo.receiver_city = "上海市"; + tradeInfo.receiver_district = "普陀区"; + +// tradeInfo.receiver_state = "上海"; +// tradeInfo.receiver_city = "上海市"; +// tradeInfo.receiver_district = "普陀区"; + +// tradeInfo.receiver_state = "湖北省"; +// tradeInfo.receiver_city = "黄石市"; +// tradeInfo.receiver_district = "西塞山区"; +// +// tradeInfo.receiver_state = "辽宁省"; +// tradeInfo.receiver_city = "大连市"; +// tradeInfo.receiver_district = "甘井子区"; + +// tradeInfo.receiver_state = "福建省"; +// tradeInfo.receiver_city = "厦门市"; +// tradeInfo.receiver_district = "集美区"; + + tradeInfo.receiver_zip = "110000"; + tradeInfo.receiver_name = "光谷神奇"; + tradeInfo.receiver_address = "桃林路18号A座24楼"; + + tradeInfo.receiver_mobile = "13112314565"; + tradeInfo.platform_code = "002"; + + tradeInfo.pay_money = money; + tradeInfo.product_fee = "387"; + tradeInfo.post_fee = "8"; + if (platform_code > 5999 && platform_code < 6999) { + tradeInfo.orders[0] = new OrderInfo(); + tradeInfo.orders[0].buyer_rate = true; + + tradeInfo.orders[0].platform_seller_code = "015";// "632.008";//平台商家编码 + + tradeInfo.orders[0].cid = "2"; + tradeInfo.orders[0].num = 1; + tradeInfo.orders[0].discount_fee = "0"; + tradeInfo.orders[0].price = "287"; + tradeInfo.orders[0].payment = "287"; + tradeInfo.orders[0].sku_properties_name = "8"; + tradeInfo.orders[0].total_fee = "287"; + tradeInfo.orders[0].adjust_fee = "0"; + tradeInfo.orders[0].status = "1111"; + tradeInfo.orders[0].title = "买一送一"; + tradeInfo.orders[0].gift_type = 1; + tradeInfo.orders[0].divide_order_fee = "150"; + tradeInfo.orders[0].order_buyer_payment = "150"; + + } else { + tradeInfo.orders[0] = new OrderInfo(); + tradeInfo.orders[1] = new OrderInfo(); + tradeInfo.orders[0].buyer_rate = true; + if (platform_code > 6999 && platform_code < 7999) { + tradeInfo.orders[0].platform_seller_code = "011";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "012";// "632.008";//平台商家编码 + } else if (platform_code > 7999 && platform_code < 8999) { + tradeInfo.orders[0].platform_seller_code = "015";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 + } else if (platform_code > 8999 && platform_code < 9999) { + tradeInfo.orders[0].platform_seller_code = "018";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "022";// "632.008";//平台商家编码 + } else if (platform_code > 9999 && platform_code < 10999) { + tradeInfo.orders[0].platform_seller_code = "021";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 + } else if (platform_code > 10999 && platform_code < 11999) { + tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "021";// "632.008";//平台商家编码 + } else if (platform_code > 11999 && platform_code < 12999) { + tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "016";// "632.008";//平台商家编码 + } else if (platform_code > 12999 && platform_code < 13999) { + tradeInfo.orders[0].platform_seller_code = "016";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "020";// "632.008";//平台商家编码 + } else if (platform_code > 13999 && platform_code < 14999) { + tradeInfo.orders[0].platform_seller_code = "015";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "020";// "632.008";//平台商家编码 + } else if (platform_code > 14999 && platform_code < 15999) { + tradeInfo.orders[0].platform_seller_code = "017";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "021";// "632.008";//平台商家编码 + } else if (platform_code > 15999 && platform_code < 16999) { + tradeInfo.orders[0].platform_seller_code = "020";// "632.008";//平台商家编码 + tradeInfo.orders[1].platform_seller_code = "030";// "632.008";//平台商家编码 + } + tradeInfo.orders[0].cid = "2"; + tradeInfo.orders[0].num = 1; + tradeInfo.orders[0].discount_fee = "0"; + tradeInfo.orders[0].price = "287"; + tradeInfo.orders[0].payment = "287"; + tradeInfo.orders[0].sku_properties_name = "8"; + tradeInfo.orders[0].total_fee = "287"; + tradeInfo.orders[0].adjust_fee = "0"; + tradeInfo.orders[0].status = "1111"; + tradeInfo.orders[0].title = "买一送一"; + tradeInfo.orders[0].gift_type = 1; + tradeInfo.orders[0].divide_order_fee = "150"; + tradeInfo.orders[0].order_buyer_payment = "150"; + +// if (platform_code> 6999 && platform_code < 7999) { +// +// } else if (platform_code> 3999 && platform_code < 4999) { +// tradeInfo.orders[1].platform_seller_code = "024";//"632.008";//平台商家编码 +// } else if (platform_code > 4999 && platform_code < 5999) { +// tradeInfo.orders[1].platform_seller_code = "019";//"632.008";//平台商家编码 +// } + tradeInfo.orders[1].buyer_rate = true; + tradeInfo.orders[1].cid = "2"; + tradeInfo.orders[1].num = 1; + tradeInfo.orders[1].discount_fee = "0"; + tradeInfo.orders[1].price = "180"; + tradeInfo.orders[1].payment = "200.07"; + tradeInfo.orders[1].sku_properties_name = "8"; + tradeInfo.orders[1].total_fee = "60"; + tradeInfo.orders[1].adjust_fee = "2"; + tradeInfo.orders[1].status = "1111"; + tradeInfo.orders[1].title = "不送不送"; + tradeInfo.orders[1].gift_type = 1; + tradeInfo.orders[1].divide_order_fee = "180"; + tradeInfo.orders[1].order_buyer_payment = "180"; + tradeInfo.fenxiaoInfo = new FenxiaoInfo(); + } +// else { +// tradeInfo.orders[0] = new OrderInfo(); +// tradeInfo.orders[0].buyer_rate = true; +// if (platform_code> 2999 && platform_code < 3999) { +// tradeInfo.orders[0].platform_seller_code = "010";//"632.008";//平台商家编码 +// } else if (platform_code> 3999 && platform_code < 4999) { +// tradeInfo.orders[0].platform_seller_code = "022";//"632.008";//平台商家编码 +// } else if (platform_code > 4999 && platform_code < 5999) { +// tradeInfo.orders[0].platform_seller_code = "013";//"632.008";//平台商家编码 +// } +// tradeInfo.orders[0].cid = "2"; +// tradeInfo.orders[0].num = 1; +// tradeInfo.orders[0].discount_fee = "0"; +// tradeInfo.orders[0].price = "287"; +// tradeInfo.orders[0].payment = "287"; +// tradeInfo.orders[0].sku_properties_name = "8"; +// tradeInfo.orders[0].total_fee = "287"; +// tradeInfo.orders[0].adjust_fee = "0"; +// tradeInfo.orders[0].status = "1111"; +// tradeInfo.orders[0].title = "买一送一"; +// tradeInfo.orders[0].gift_type = 1; +// tradeInfo.orders[0].divide_order_fee = "150"; +// tradeInfo.orders[0].order_buyer_payment= "150"; +// +// +// tradeInfo.orders[1] = new OrderInfo(); +// if (platform_code> 2999 && platform_code < 3999) { +// tradeInfo.orders[1].platform_seller_code = "015";//"632.008";//平台商家编码 +// } else if (platform_code> 3999 && platform_code < 4999) { +// tradeInfo.orders[1].platform_seller_code = "024";//"632.008";//平台商家编码 +// } else if (platform_code > 4999 && platform_code < 5999) { +// tradeInfo.orders[1].platform_seller_code = "019";//"632.008";//平台商家编码 +// } +// tradeInfo.orders[1].buyer_rate = true; +// tradeInfo.orders[1].cid ="2"; +// tradeInfo.orders[1].num = 1; +// tradeInfo.orders[1].discount_fee ="0"; +// tradeInfo.orders[1].price = "180"; +// tradeInfo.orders[1].payment = "200.07"; +// tradeInfo.orders[1].sku_properties_name = "8"; +// tradeInfo.orders[1].total_fee = "60"; +// tradeInfo.orders[1].adjust_fee = "2"; tradeInfo.orders[1].status= "1111"; +// tradeInfo.orders[1].title = "不送不送"; +// tradeInfo.orders[1].gift_type = 1; +// tradeInfo.orders[1].divide_order_fee = "180"; +// tradeInfo.orders[1].order_buyer_payment= "180"; +// tradeInfo.fenxiaoInfo = new FenxiaoInfo(); +// +// tradeInfo.orders[2] = new OrderInfo(); +// if (platform_code> 2999 && platform_code < 3999) { +// tradeInfo.orders[2].platform_seller_code = "018";//"632.008";//平台商家编码 +// } else if (platform_code> 3999 && platform_code < 4999) { +// tradeInfo.orders[2].platform_seller_code = "025";//"632.008";//平台商家编码 +// } else if (platform_code > 4999 && platform_code < 5999) { +// tradeInfo.orders[2].platform_seller_code = "025";//"632.008";//平台商家编码 +// } +// tradeInfo.orders[2].buyer_rate = true; +// tradeInfo.orders[1].cid ="2"; +// tradeInfo.orders[2].num = 1; +// tradeInfo.orders[2].discount_fee ="0"; +// tradeInfo.orders[2].price = "180"; +// tradeInfo.orders[2].payment = "200.07"; +// tradeInfo.orders[2].sku_properties_name = "8"; +// tradeInfo.orders[2].total_fee = "60"; +// tradeInfo.orders[2].adjust_fee = "2"; tradeInfo.orders[1].status= "1111"; +// tradeInfo.orders[2].title = "不送不送"; +// tradeInfo.orders[2].gift_type = 1; +// tradeInfo.orders[2].divide_order_fee = "180"; +// tradeInfo.orders[2].order_buyer_payment= "180"; +// tradeInfo.fenxiaoInfo = new FenxiaoInfo(); +// } + +// + +//// +// tradeInfo.orders[3] = new OrderInfo(); +//// tradeInfo.orders[3].platform_seller_code = "009"; +// tradeInfo.orders[3].platform_seller_code = "006.0888"; +// tradeInfo.orders[3].buyer_rate = true; tradeInfo.orders[1].cid ="2"; +// // tradeInfo.orders[0].commodity_code = items[0][0]; +// tradeInfo.orders[3].num = 4; +// tradeInfo.orders[3].discount_fee ="0"; +// tradeInfo.orders[3].price = "180"; +// tradeInfo.orders[3].payment = "200.07"; +// tradeInfo.orders[3].sku_properties_name = "8"; +// tradeInfo.orders[3].total_fee = "60"; +// tradeInfo.orders[3].adjust_fee = "2"; tradeInfo.orders[1].status= "1111"; +// tradeInfo.orders[3].title = "不送不送"; +// tradeInfo.orders[3].gift_type = 1; +// tradeInfo.orders[3].divide_order_fee = "180"; +// tradeInfo.orders[3].order_buyer_payment= "180"; +// tradeInfo.fenxiaoInfo = new FenxiaoInfo(); +//// + /* + * tradeInfo.orders[2] = new OrderInfo(); tradeInfo.orders[2].commodity_code = + * "002.01.05.297"; tradeInfo.orders[2].buyer_rate = true; + * tradeInfo.orders[2].cid = "2"; // tradeInfo.orders[0].commodity_code = + * items[0][0]; tradeInfo.orders[2].num = 1; tradeInfo.orders[2].discount_fee = + * "0"; tradeInfo.orders[2].price = "180"; tradeInfo.orders[2].payment = + * "200.07"; tradeInfo.orders[2].sku_properties_name = "8"; + * tradeInfo.orders[2].total_fee = "60"; tradeInfo.orders[2].adjust_fee = "2"; + * tradeInfo.orders[2].status = "1111"; tradeInfo.orders[2].title = "不送不送"; + */ + // OrderSyncs.dataParse.tradeQueue_Success.add(tradeInfo); + OrderSyncs.dataParse.tradeQueue.add(tradeInfo); +// OrderSyncs.dataParse.pretradeQueue.add(tradeInfo); + count2++; + try { + Thread.sleep(1); + // Thread.yield(); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + } + } + + /* + * + * + * ExecutorService es = Executors.newCachedThreadPool(); int count = 0; // for + * (int i = 0; i < items.length; i++) { for (int j = 0; j < 1; j++) { // + * if("".equals(items[i][0])){ // continue; // } // if(i==0){ // count = 320000; + * // }else{ // count += Integer.valueOf(items[i-1][3]); // } + * + * // ThreadTest tt =new StOrderSync() .new + * ThreadTest(Integer.valueOf(items[i][3]),count,items[i][0],items[i][1], + * items[i][2]); ThreadTest tt =new StOrderSync() .new + * ThreadTest(20000,400000,"002.01.05.297","否",""); es.execute(tt); + * + * } + * + * + * } + * + * class ThreadTest extends Thread { private int num; private int count; private + * String commodity_code; private String type; private String seller_note; + * public ThreadTest(int num,int count,String commodity_code,String type,String + * seller_note){ this.num = num; this.count = count; this.commodity_code = + * commodity_code; this.seller_note = seller_note; this.type = type; } + * + * public synchronized void run() { while (num > 0) { num--; count++; TradeInfo + * tradeInfo = new TradeInfo(); // OrderInfo orderInfo = new OrderInfo(); + * tradeInfo.orders = new OrderInfo[1]; tradeInfo.orders[0] = new OrderInfo(); + * + * tradeInfo.orders[0].commodity_code = commodity_code; if("是".equals(type)){ + * tradeInfo.type = "step"; }else{ tradeInfo.type = "fixed"; } + * if("是".equals(seller_note)){ tradeInfo.seller_memo = "8888"; } + * + * tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; tradeInfo.tid = + * String.valueOf(count); tradeInfo.brand = "膳魔师"; tradeInfo.adjust_fee = "32"; + * tradeInfo.alipay_id = "3434"; tradeInfo.alipay_no = "5435"; + * tradeInfo.buyer_memo = "fdafd"; // tradeInfo.buyer_message = "分篮测试"; + * tradeInfo.buyer_nick = "会飞的猪"; tradeInfo.buyer_obtain_point_fee = 20; + * tradeInfo.buyer_rate = false; tradeInfo.cod_fee = "dfaf"; + * tradeInfo.cod_status = "NEW_CREATED"; // tradeInfo.company_code = + * "31201608100018"; tradeInfo.company_code = "0001"; // tradeInfo.shop_code = + * "20160810000010"; tradeInfo.shop_code = "20160810000010"; tradeInfo.created = + * "2016-11-11 05:00:00"; tradeInfo.discount_fee = "0"; tradeInfo.has_post_fee = + * false; tradeInfo.money = "500"; tradeInfo.num = 1; tradeInfo.status = + * "WAIT_SELLER_SEND_GOODS"; tradeInfo.pay_time = "2017-04-25 15:00:00"; + * tradeInfo.pay_mode_id = 6; tradeInfo.invoice_type = 0; + * tradeInfo.receiver_country = ""; if (tradeInfo.receiver_country.equals("")) { + * tradeInfo.receiver_country = "中国"; } tradeInfo.receiver_state = "上海"; + * tradeInfo.receiver_city = "上海市"; tradeInfo.receiver_district = "浦东新区"; + * tradeInfo.receiver_zip = "110000"; tradeInfo.receiver_name = "-**"; + * tradeInfo.receiver_address = "上海上海市浦东新区世纪大道甲一号"; tradeInfo.receiver_mobile = + * "131****4565"; tradeInfo.platform_code = "002"; + * + * tradeInfo.pay_money = "500"; tradeInfo.product_fee = "88"; tradeInfo.post_fee + * = "0"; tradeInfo.orders[0].buyer_rate = true; tradeInfo.orders[0].cid = "2"; + * // tradeInfo.orders[0].commodity_code = items[0][0]; tradeInfo.orders[0].num + * = 1; tradeInfo.orders[0].discount_fee = "0"; tradeInfo.orders[0].price = + * "180"; tradeInfo.orders[0].payment = "200.07"; + * tradeInfo.orders[0].sku_properties_name = "8"; tradeInfo.orders[0].total_fee + * = "60"; tradeInfo.orders[0].adjust_fee = "2"; tradeInfo.orders[0].status = + * "1111"; tradeInfo.orders[0].title = "买一送一"; + * + * + * // tradeInfo.orders[1] = new OrderInfo(); // // + * tradeInfo.orders[1].commodity_code = "002.01.05.642"; // + * tradeInfo.orders[1].buyer_rate = true; // tradeInfo.orders[1].cid = "2"; //// + * tradeInfo.orders[0].commodity_code = items[0][0]; // tradeInfo.orders[1].num + * = 1; // tradeInfo.orders[1].discount_fee = "0"; // tradeInfo.orders[1].price + * = "180"; // tradeInfo.orders[1].payment = "200.07"; // + * tradeInfo.orders[1].sku_properties_name = "8"; // + * tradeInfo.orders[1].total_fee = "60"; // tradeInfo.orders[1].adjust_fee = + * "2"; // tradeInfo.orders[1].status = "1111"; // tradeInfo.orders[1].title = + * "买一送一"; OrderSyncs.dataParse.tradeQueue.add(tradeInfo); try { + * Thread.sleep(1); // Thread.yield(); } catch (Exception e) { + * e.printStackTrace(); } } } } + */ + + /* + * private static boolean initFilexls() { boolean res = false; jxl.Workbook + * readwb = null; try { InputStream instream = new FileInputStream("test.xls"); + * + * readwb = Workbook.getWorkbook(instream); Sheet readsheet = + * readwb.getSheet(3); int rsColumns = readsheet.getColumns(); int rsRows = + * readsheet.getRows(); items = new String[rsRows-3][rsColumns-1]; for (int i = + * 0; i < rsRows-3; i++) { for (int j = 0; j < rsColumns-1; j++) { Cell cell = + * readsheet.getCell(j+1, i+3); items[i][j] = cell.getContents(); } } res = + * true; } catch (Exception e) { e.printStackTrace(); } finally { + * readwb.close(); } return res; } + * + * /* private static boolean initFilexls() { Connection conn = null; + * PreparedStatement ps = null; conn = OrderSyncs.dbUtil.getDbConn(); int count + * = 0; + * + * boolean res = false; jxl.Workbook readwb = null; try { InputStream instream = + * new FileInputStream("新实1-6月收发存2.xls"); + * + * readwb = Workbook.getWorkbook(instream); Sheet readsheet = + * readwb.getSheet(2);//读取表格里面的第3张表 // int rsColumns = readsheet.getColumns(); + * // int rsRows = readsheet.getRows(); items = new String[1647][3]; for (int i + * = 0; i < 1647; i++) { for (int j = 0; j < 3; j++) { Cell cell = + * readsheet.getCell(j+2, i+2); items[i][j] = cell.getContents(); } } for (int i + * = 0; i < items.length; i++) { String sql = + * "update tb_psi set quantity=?,cost=? where model='"+items[i][0]+ + * "' and create_time=?"; ps = conn.prepareStatement(sql); ps.setInt(1, + * Integer.valueOf(items[i][1])); ps.setFloat(2, Float.valueOf(items[i][2])); // + * ps.setString(3, items[i][0]); ps.setString(3, "2016-06-30 23:59:59"); // + * ps.setDate(, x); // System.out.print(items[i][j]+"\t"); if(ps.executeUpdate() + * == 0){ OrderSyncs.logger.info(items[i][0]+"未找到,update失败!"); count++; }else{ + * OrderSyncs.logger.info(items[i][0]+"成功"); } + * + * } OrderSyncs.logger.info("未成功条目数为:"+count); res = true; } catch (Exception e) + * { e.printStackTrace(); } finally { readwb.close(); } return res; } + */ + /** + * initConfig 初始化配置 + */ + private static boolean initFileConfig() { + boolean res = false; + try { + IniReader iniReader = new IniReader(config_filename); + order_count = Integer.valueOf(iniReader.getValue("sttest", "orderCount")); + platform_code = Integer.valueOf(iniReader.getValue("sttest", "platform_code")); + storageUpdateTime = iniReader.getValue("storageUpdateTime", "interval"); + config = new Config(); + config.db_host = iniReader.getValue("mysql", "host"); + config.db_port = iniReader.getValue("mysql", "port"); + config.db_name = iniReader.getValue("mysql", "name"); + config.db_user = iniReader.getValue("mysql", "user"); + config.db_password = iniReader.getValue("mysql", "password"); + // 读入所有平台参数 + config.globe_plats = iniReader.getValue("globe", "plats"); + String[] plat_array = config.globe_plats.split(","); + config.plats = new ArrayList(); + for (int i = 0; i < plat_array.length; i++) { + PlatConfig pc = new PlatConfig(); + pc.plat_name = plat_array[i]; + pc.plat_code = iniReader.getValue(plat_array[i], "plat_code"); + pc.api_url = iniReader.getValue(plat_array[i], "api_url"); + pc.tmc_url = iniReader.getValue(plat_array[i], "tmc_url"); + pc.init_time = iniReader.getValue(plat_array[i], "init_time"); + pc.apps = new ArrayList(); + config.plats.add(pc); + } + res = true; + } catch (IOException e) { + logger.error(StOrderSync.class, e); + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } + return res; + } + + /** + * getConfigFromDB 从数据库读取配置 + * + * @throws Exception + */ + private static boolean getConfigFromDB() { + boolean res = false; + // Druid连接池管理数据库连接 + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + Statement statement = null; + try { + conn = dbpc.getConnection(); + statement = conn.createStatement(); + + String sql = "select " + "c.platform_code," + "c.code as app_code," + "c.key as app_key," + + "c.secret as app_secret," + "a.company_code as shop_company_code," + "a.code as shop_code," + + "a.name as shop_name," + "a.session_key as shop_session_key," + "b.name as shop_brand" + " from " + + "tb_shop a," + "tb_brand_dic b," + "tb_platform_app c" + " where " + "a.brand_code = b.code" + + " and a.del_flag = 1" + " and a.app_code = c.code" + " and c.del_flag = 1" + + " and a.company_code = b.company_code"; + ResultSet rs = statement.executeQuery(sql); + while (rs.next()) { + // 先判断app是否存在 + String plat_code = rs.getString("platform_code"); + String app_code = rs.getString("app_code"); + Boolean found = false; + for (int i = 0; i < config.plats.size(); i++) { + PlatConfig plat_config = config.plats.get(i); + if (plat_code.equals(plat_config.plat_code)) { + // 构造店铺 + shopConfig = new ShopConfig(); + shopConfig.code = rs.getString("shop_code"); + shopConfig.name = rs.getString("shop_name"); + shopConfig.session_key = rs.getString("shop_session_key"); + shopConfig.company_code = rs.getString("shop_company_code"); + shopConfig.brand = rs.getString("shop_brand"); + for (int j = 0; j < plat_config.apps.size(); j++) { + AppConfig app_config = plat_config.apps.get(j); + if (app_code.equals(app_config.code)) { + // 找到app可以直接添加店铺 + app_config.shops.add(shopConfig); + found = true; + break; + } + } + if (!found) { + // 未找到app,需要同步添加app和店铺 + AppConfig appConfig = new AppConfig(); + appConfig.code = rs.getString("app_code"); + appConfig.key = rs.getString("app_key"); + appConfig.secret = rs.getString("app_secret"); + appConfig.shops = new ArrayList(); + appConfig.shops.add(shopConfig); + plat_config.apps.add(appConfig); + } + break; + } + } + } + res = true; + } catch (Exception e) { + logger.error(StOrderSync.class, e); + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + statement = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(StOrderSync.class, e); + } + conn = null; + } + } + return res; + } + +} diff --git a/src/com/since/emp/test/StOrderSync_lx.java b/src/com/since/emp/test/StOrderSync_lx.java new file mode 100644 index 0000000..96295d2 --- /dev/null +++ b/src/com/since/emp/test/StOrderSync_lx.java @@ -0,0 +1,129 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.concurrent.ThreadPoolExecutor; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; + +public class StOrderSync_lx { + private static Logger logger; + private static ThreadPoolExecutor threadPool; + + static { + ConfigurationSource source; + String relativePath = "log4j2.properties"; + // String filePath = CONFIG_PATH + System.getProperty("file.separator") + + // relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = LogManager.getLogger(OrderSyncs.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws InterruptedException { + logger = (Logger) LogManager.getLogger(StOrderSync_lx.class); + threadPool = ThreadPool.getInstance(); + + long startTime = System.currentTimeMillis(); + int count = 5000; + for (int i = 0; i < count; i++) { + threadPool.execute(new StOrderSync_lx().new SelectTestThread()); + } + + while (true) { + if (threadPool.getCompletedTaskCount() >= count) { + long endTime = System.currentTimeMillis(); +// logger.info(count + "次查询,共计耗时:" + ((endTime - startTime) / 1000.0) + "s"); + logger.info(count + "次写入,共计耗时:" + ((endTime - startTime) / 1000.0) + "s"); + System.exit(0); + } + Thread.sleep(1); + } + + } + + class SelectTestThread extends Thread { + @Override + public void run() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + + try { + conn = dbpc.getConnection(); + /*查询测试 + String sql = "SELECT _getUnsendQuantity('144','2017092586','C15472') as quantity"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + */ + String sql = "INSERT INTO `EMP3`.`tb_sale_order`(code,brand_list,quantity,money,type,original_sale_order_code,pay_money,receivables_money,pay_time,invoice_type,pay_mode_id,shop_code,cur_money,cur_quantity,company_code,storage_code)\r\n" + + "values(20000,'阿玛尼 ',1,123.0,2,20000,123.0,123.0,'2020-11-05 05:21:16',1,0,'2017092586',123.0,1,122,'201709251');" ; + ps = conn.prepareStatement(sql); + ps.executeUpdate(); + + + + } catch (SQLException e) { + logger.error(StOrderSync_lx.class, e); + } catch (Exception e) { + logger.error(StOrderSync_lx.class, e); + } finally { + + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(StOrderSync_lx.class, e); + } catch (Exception e) { + logger.error(StOrderSync_lx.class, e); + } + rs = null; + } + + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(StOrderSync_lx.class, e); + } catch (Exception e) { + logger.error(StOrderSync_lx.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(StOrderSync_lx.class, e); + } catch (Exception e) { + logger.error(StOrderSync_lx.class, e); + } + conn = null; + } + dbpc = null; + } + } + + } + +} diff --git a/src/com/since/emp/test/SubmitLogSimple.java b/src/com/since/emp/test/SubmitLogSimple.java new file mode 100644 index 0000000..54e8e35 --- /dev/null +++ b/src/com/since/emp/test/SubmitLogSimple.java @@ -0,0 +1,19 @@ +package com.since.emp.test; + +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.SubmitLog; + +public class SubmitLogSimple extends OrderSyncs { + + public static void main(String[] args) { + + submitLog = new SubmitLog(); + submitLog.start(); + + for (int i = 0; i < 1001; i++) { + OrderSyncs.submitLog.ychLogQueue.add(String.valueOf(551629231522592209L + i)); + } + + } + +} diff --git a/src/com/since/emp/test/TaobaoTest.java b/src/com/since/emp/test/TaobaoTest.java new file mode 100644 index 0000000..eafdd1a --- /dev/null +++ b/src/com/since/emp/test/TaobaoTest.java @@ -0,0 +1,131 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; + +import com.since.emp.service.OrderSync; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.internal.util.StringUtils; +import com.taobao.api.request.ItemPromotionRuleGetRequest; +import com.taobao.api.request.RefundGetRequest; +import com.taobao.api.request.RefundsReceiveGetRequest; +import com.taobao.api.request.SkusCustomGetRequest; +import com.taobao.api.response.ItemPromotionRuleGetResponse; +import com.taobao.api.response.RefundGetResponse; +import com.taobao.api.response.RefundsReceiveGetResponse; +import com.taobao.api.response.SkusCustomGetResponse; + +public class TaobaoTest { + private static Logger logger; + + public static void main(String[] args) { + ConfigurationSource source; + String relativePath = "log4j2.properties"; +// String filePath = CONFIG_PATH + System.getProperty("file.separator") + relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = (Logger) LogManager.getLogger(OrderSync.class.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + try { + + /** + * 获取单个订单 + */ + + /* + * TaobaoClient client = new + * DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", + * "031bf6cd609cc38b3fed39c8041a2a89"); TradeFullinfoGetRequest req = new + * TradeFullinfoGetRequest(); req.setFields( + * "seller_nick,tid,type,status,payment,alipay_no,created,pay_time,buyer_nick,buyer_message,seller_memo,post_fee,total_fee,adjust_fee,discount_fee" + * + + * ",receiver_name,receiver_country,receiver_state,receiver_city,receiver_district,receiver_address,receiver_mobile,receiver_phone,receiver_zip,orders.divide_order_fee,orders.part_mjz_discount,orders.sku_id,orders.num_iid,orders.oid,seller_flag" + * + + * ",orders.outer_sku_id,orders.outer_iid,orders.num,orders.price,orders.payment,orders.title,orders.sku_properties_name,orders.discount_fee,orders.status,orders.adjust_fee,orders.total_fee,modified" + * ); req.setTid(885325536029487164L); TradeFullinfoGetResponse rsp = + * client.execute(req, + * "620112905c616a21a21ca7cb138c840cd4c4cegef7dc2a23087452825"); + * System.out.println(rsp.getBody()); /* 根据订单创建时间获取订单 + */ + /* + * TaobaoClient client = new + * DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", + * "031bf6cd609cc38b3fed39c8041a2a89"); TradesSoldGetRequest req = new + * TradesSoldGetRequest(); req.setFields("tid"); req.setStartCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-11 00:00:00")); + * req.setEndCreated(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-11 18:59:59")); + * req.setStatus("WAIT_SELLER_SEND_GOODS"); req.setType("fixed,step"); // + * req.setExtType("service"); req.setPageNo(1L); req.setPageSize(20L); + * TradesSoldGetResponse rsp = client.execute(req, + * "620112905c616a21a21ca7cb138c840cd4c4cegef7dc2a23087452825"); String + * jsonString = rsp.getBody(); logger.info("获取订单详情:{}", jsonString); + */ + + /** + * 获取退款列表 + */ + /* + * TaobaoClient client = new + * DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", + * "031bf6cd609cc38b3fed39c8041a2a89"); RefundsReceiveGetRequest req = new + * RefundsReceiveGetRequest(); req. + * setFields("refund_id, tid, title,buyer_nick, seller_nick, total_fee, status, created, refund_fee,refund_phase" + * ); // req.setStatus("WAIT_SELLER_AGREE"); // req.setBuyerNick("hz0799"); // + * req.setType("fixed"); + * req.setStartModified(StringUtils.parseDateTime("2020-03-12 00:00:00")); + * req.setEndModified(StringUtils.parseDateTime("2020-03-12 10:00:00")); + * req.setPageNo(1L); req.setPageSize(100L); req.setUseHasNext(true); + * RefundsReceiveGetResponse rsp = client.execute(req, + * "6201b00egibecc3d3812a350ac6543b8151a0750ec0b27d836315067"); + * System.out.println(rsp.getBody()); + */ + + /** + * 获取单个退款单 + */ + /* + * TaobaoClient client = new + * DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", + * "031bf6cd609cc38b3fed39c8041a2a89"); RefundGetRequest req = new + * RefundGetRequest(); req.setFields("reason,desc,refund_fee"); + * req.setRefundId(84967776153901617L); RefundGetResponse rsp = + * client.execute(req, + * "6201b00egibecc3d3812a350ac6543b8151a0750ec0b27d836315067"); String + * refundString = rsp.getBody(); System.out.println(refundString); + */ + + /** + * 获取商品参加的活动列表 + */ + TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", "031bf6cd609cc38b3fed39c8041a2a89"); + ItemPromotionRuleGetRequest req = new ItemPromotionRuleGetRequest(); + req.setItemId(13620105861L); + ItemPromotionRuleGetResponse response = client.execute(req, "6201002cb7ZZd16d49ce4ad322b4e65238c960d9a382aa3811691369"); + System.out.println(response.getBody()); + + TaobaoClient client1 = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", "031bf6cd609cc38b3fed39c8041a2a89"); + SkusCustomGetRequest req1 = new SkusCustomGetRequest(); + req1.setOuterId("002.01.05.101"); + req1.setFields("sku_id,num_iid,quantity"); + SkusCustomGetResponse rsp1; + rsp1 = client1.execute(req1, "6201002cb7ZZd16d49ce4ad322b4e65238c960d9a382aa3811691369"); + System.out.println(rsp1.getBody()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/since/emp/test/Test.java b/src/com/since/emp/test/Test.java new file mode 100644 index 0000000..34f346b --- /dev/null +++ b/src/com/since/emp/test/Test.java @@ -0,0 +1,348 @@ +package com.since.emp.test; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.URL; +import java.net.URLConnection; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.URIException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.util.URIUtil; +import org.apache.http.HttpEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.json.JSONObject; + +import com.coo8.api.Coo8Client; +import com.coo8.api.DefaultCoo8Client; +import com.coo8.api.request.order.OrdersGetRequest; +import com.coo8.api.response.order.OrdersGetResponse; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.OrderSyncs.AppConfig; +import com.taobao.api.ApiException; +import com.taobao.api.DefaultTaobaoClient; +import com.taobao.api.TaobaoClient; +import com.taobao.api.request.FenxiaoOrdersGetRequest; +import com.taobao.api.request.SkusCustomGetRequest; +import com.taobao.api.response.FenxiaoOrdersGetResponse; +import com.taobao.api.response.SkusCustomGetResponse; + +import net.sf.json.JSON; +import net.sf.json.xml.XMLSerializer; + +public class Test { + private static Logger logger; + public static void main(String[] args) throws HttpException, IOException, ParseException { + ConfigurationSource source; + String relativePath = "log4j2.properties"; +// String filePath = CONFIG_PATH + System.getProperty("file.separator") + relativePath; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = (Logger) LogManager.getLogger(OrderSync.class.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + /* + TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "21367340", "a4a165a88288afea63c8707f48c11c7c"); + FenxiaoOrdersGetRequest req = new FenxiaoOrdersGetRequest(); +// req.setStatus("WAIT_BUYER_PAY"); + req.setStartCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-12-11 00:00:00")); + req.setEndCreated(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-12-11 18:59:59")); +// req.setTimeType("trade_time_type"); + req.setPageNo(1L); + req.setPageSize(10L); +// req.setPurchaseOrderId(120121243L);//不管是按时间段还是订单均不需要这个值 + req.setFields("supplier_from,supplier_username,distributor_username,created,alipay_no,total_fee,post_fee,distributor_payment,snapshot_url,pay_time,consign_time,modified,supplier_memo,fenxiao_id,pay_type,trade_type,distributor_from,id,status,buyer_nick,memo,tc_order_id,shipping,logistics_company_name,logistics_id,isv_custom_key,isv_custom_value,end_time,supplier_flag,buyer_payment,order_messages.message_time,order_messages.message_title,order_messages.message_content,order_messages.pic_url,sub_purchase_orders.item_outer_id,sub_purchase_orders.sku_outer_id,sub_purchase_orders.sku_properties,sub_purchase_orders.snapshot_url,sub_purchase_orders.created,sub_purchase_orders.status,sub_purchase_orders.refund_fee,sub_purchase_orders.id,sub_purchase_orders.fenxiao_id,sub_purchase_orders.sku_id,sub_purchase_orders.tc_order_id,sub_purchase_orders.item_id,sub_purchase_orders.order_200_status,sub_purchase_orders.auction_price,sub_purchase_orders.num,sub_purchase_orders.title,sub_purchase_orders.price,sub_purchase_orders.total_fee,sub_purchase_orders.distributor_payment,sub_purchase_orders.buyer_payment,sub_purchase_orders.bill_fee,sub_purchase_orders.sc_item_id,sub_purchase_orders.tc_preferential_type,sub_purchase_orders.tc_discount_fee,sub_purchase_orders.tc_adjust_fee,sub_purchase_orders.discount_fee,sub_purchase_orders.promotion_type,sub_purchase_orders.auction_sku_id,sub_purchase_orders.auction_id,sub_purchase_orders.old_sku_properties,buyer_taobao_id,features.attr_key,features.attr_value"); +// req.setTcOrderId(108925340365487164L); + FenxiaoOrdersGetResponse rsp = client.execute(req, "6100704421171263fZZ068eccf1be5f5549bfa2e00f25453182109001"); + System.out.println(rsp.getBody()); + */ + /*TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "23811642", "031bf6cd609cc38b3fed39c8041a2a89"); + FenxiaoOrdersGetRequest req = new FenxiaoOrdersGetRequest(); + req.setTcOrderId(122565521280450840L); + req.setFields( + "fenxiao_id,tc_order_id,supplier_memo,status,trade_type,alipay_no,distributor_payment,created,modified,pay_time,post_fee,buyer_nick,receiver,memo,order_messages,total_fee,distributor_username," + + "sub_purchase_orders.item_outer_id,sub_purchase_orders.sku_outer_id,sub_purchase_orders.sku_id,sub_purchase_orders.item_id,sub_purchase_orders.num,sub_purchase_orders.price,sub_purchase_orders.distributor_payment," + + "sub_purchase_orders.title,sub_purchase_orders.sku_properties,sub_purchase_orders.fenxiao_id,sub_purchase_orders.tc_discount_fee,sub_purchase_orders.total_fee,sub_purchase_orders.tc_adjust_fee,sub_purchase_orders.status"); + FenxiaoOrdersGetResponse rsp = client.execute(req, "6201800dfh064c9c088622b282595bcd2dcd7008313855c1890866445"); + String tradeInfoStr = rsp.getBody(); + logger.info("分销-代销订单返回:" + tradeInfoStr);*/ + /** + * 国美api调用 + */ + /* + try { + Coo8Client cc = new DefaultCoo8Client("http://gw.gome.com.cn/router", "8e497b224ce84e0ba13177c82990d419","8a89cd57956d4dcdb27702af62871f72"); + OrdersGetRequest ordersRequest = new OrdersGetRequest(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ordersRequest.setStartDate(df.parse("2018-03-20 00:00:00")); + ordersRequest.setEndDate(df.parse("2018-03-21 00:00:00")); + ordersRequest.setStatus("DL");// 订单状态( + // PR:初始,PP:订单处理中,EX:已出库,DL:已妥投,CWS:客服取消-待商家确认,CWC:商家申请取消,DFC:发货失败取消 + // ,RCC:客服取消,RV:拒收,RT:拒收已退回库房) + ordersRequest.setPageSize(100);// 每页记录数(最大100,默认值:100) + ordersRequest.setPageNo(1);// 页码(取值范围 大于零的整数, 默认值 1) + OrdersGetResponse getResponse = cc.execute(ordersRequest); + String jsonString = getResponse.getBody(); + System.out.println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + */ + /** + * 新版国美调用 + */ + /* + try { + GmosClient client = new DefaultGmosClient(url, appKey, secret); + GomeOrderOrdersGetRequest request = new GomeOrderOrdersGetRequest(); + //详细参数信息请参考API详情页面。 + request.setOrderNo("932324242"); + request.setStartDate("2016-10-10 10:20:30"); + request.setEndDate("2016-10-10 10:20:30"); + request.setStatus("EX"); + request.setFields("orderId,orderNo,vendorId,subOrderType,payType,status,customerRemark,freightPrice,itemTotalPrice,orderTotalPrice,payment,orderTime,payTime,payStatus,endOrderTime,orderChangeTime,exTime,trackingNo,gomeFreight,addressShortName,packageNum,trackingCompany,warehouseId,warehouseName,blacklistId,blacklistType,reason,consignee,userId,orderDetails,partDiscountPrice,couponValue,paymentDiscount,idType,idNum,idName,salesModel,opinionDesc,headType,orderServiceType"); + request.setPageNo(1); + request.setPageSize(100); + GomeOrderOrdersGetResponse response = client.execute(request); + System.out.println(response.getBody()); + } catch (Exception e) { + // TODO: handle exception + } + */ + + + /** + * 拼多多全量查询api调用-只能查询未发货状态的所有订单 + */ + /* + PostMethod httpMethod = new PostMethod("http://gw-api.pinduoduo.com/api/router"); + AppConfig appConfig = new AppConfig(); + appConfig.key="1df7fba5e96a4527ab16e475a44a45a3"; + appConfig.secret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + int page_now = 1; + String session_key= "f782ce89684c4b229f8b9e5f54da4607c9fbe3c4"; + int page_rows = 20; + String signStr = "access_token"+session_key+"client_id"+appConfig.key+"data_type"+ "JSON"+ + "order_status"+ 1+ + "page"+ page_now+ + "page_size"+page_rows+ + "timestamp"+System.currentTimeMillis()/1000+ + "type"+"pdd.order.number.list.get"; + String signStrMD5 = MD5(appConfig.secret + signStr + appConfig.secret).toUpperCase();// 签名字符串转MD5 + System.out.println(signStrMD5); + String queryString = "?type=pdd.order.number.list.get&sign="+signStrMD5+"&client_id="+appConfig.key+"&page="+page_now+"&page_size="+page_rows+"&data_type=JSON×tamp="+System.currentTimeMillis()/1000+"&order_status=1&access_token="+session_key; +// String header = URIUtil.encodeQuery("http://gw-api.pinduoduo.com/api/router"); +// String params = URIUtil.encodeQuery("type=pdd.order.number.list.get&sign="+signStrMD5+"&client_id="+appConfig.key+"&page="+page_now+"&page_size="+page_rows+"&data_type=JSON×tamp="+System.currentTimeMillis()/1000+"&order_status=1&access_token="+session_key); +// System.out.println(sendPost(header, params)); +// + */ + /** + * 拼多多增量查询api调用-时间跨度是30分钟以内 + */ + + long timestamp = System.currentTimeMillis()/1000; + + + PostMethod httpMethod = new PostMethod("http://gw-api.pinduoduo.com/api/router"); + AppConfig appConfig = new AppConfig(); + appConfig.key="1df7fba5e96a4527ab16e475a44a45a3"; + appConfig.secret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + int page_now = 1; + String session_key= "bc0ff4b2b54f4467b4f5d811ea0806e305c12462-1"; + int page_rows = 100; + String signStr = "access_token"+session_key+ + "client_id"+appConfig.key+ + "data_type"+ "JSON"+ + "end_updated_at" + new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).parse("2018-07-04 11:40:00").getTime()/1000+ + "is_lucky_flag" + "0"+ + "order_status"+ 1+ + "page"+ page_now+ + "page_size"+page_rows+ + "refund_status" + "5"+ + "start_updated_at" + new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).parse("2018-07-04 10:40:00").getTime()/1000+ + "timestamp"+timestamp+ + "type"+"pdd.order.number.list.increment.get"; + String signStrMD5 = MD5(appConfig.secret + signStr + appConfig.secret).toUpperCase();// 签名字符串转MD5 + String queryString = "?type=pdd.order.number.list.increment.get&data_type=JSON×tamp="+timestamp+"&client_id="+appConfig.key+"&access_token="+session_key+"&is_lucky_flag=0&order_status=1&start_updated_at="+new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).parse("2018-07-04 10:40:00").getTime()/1000+"&end_updated_at="+new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).parse("2018-07-04 11:40:00").getTime()/1000+"&page_size="+page_rows+"&page="+page_now+"&refund_status=5&sign="+signStrMD5; + + /** + * 拼多多单个订单详情查询api调用 + */ + /* + PostMethod httpMethod = new PostMethod("http://gw-api.pinduoduo.com/api/router"); + AppConfig appConfig = new AppConfig(); + appConfig.key="1df7fba5e96a4527ab16e475a44a45a3"; + appConfig.secret = "1338799e27fade4acd67dd1d5ebb7a5b6dc19c8e"; + String session_key= "f782ce89684c4b229f8b9e5f54da4607c9fbe3c4"; + String signStr = "access_token"+session_key+"client_id"+appConfig.key+"data_type"+ "JSON"+"order_sn"+"180503-271996104963467"+"timestamp"+System.currentTimeMillis()/1000+"type"+"pdd.order.information.get"; + String signStrMD5 = MD5(appConfig.secret + signStr + appConfig.secret).toUpperCase();// 签名字符串转MD5 + System.out.println(signStrMD5); + String queryString = "?type=pdd.order.information.get&data_type=JSON×tamp="+System.currentTimeMillis()/1000+"&client_id="+appConfig.key+"&access_token="+session_key+"&order_sn="+"180503-271996104963467"+"&sign="+signStrMD5; + */ + + + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.executeMethod(httpMethod); + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resJson= resBuffer.toString(); +// String jsonString = xmlToJson(resxml);// 将xml转为json + System.out.println(resJson); +// HttpEntity entity = response.getEntity(); +// String temp=EntityUtils.toString(entity, "UTF-8"); +// +// String result=new String(temp.getBytes("ISO-8859-1"),"utf-8") + + /* + String time_start = "2018-03-20 00:00:00"; + String time_end = "2018-03-29 00:00:00"; + String signStr = appConfig.secret + "app_key" + appConfig.key + "format" + "xml" + "method" + + "dangdang.orders.list.get" + "session" + session_key + "sign_method" + "md5" + + "timestamp" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "v" + "1.0" + + appConfig.secret;// 组成签名字符串 + String signStrMD5 = MD5(signStr);// 签名字符串转MD5 + String queryString = "?v=1.0" + "&sign=" + signStrMD5 + "&sign_method=" + "md5" + "×tamp=" + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "&app_key=" + appConfig.key + + "&method=" + "dangdang.orders.list.get" + "&format=" + "xml" + "&session=" + + session_key + "&os=101" + "&p=" + page_now + "&pageSize=" + page_rows + + "&lastModifyTime_start=" + time_start + "&lastModifyTime_end=" + time_end; + httpMethod.setQueryString(URIUtil.encodeQuery(queryString)); + HttpClient client = new HttpClient(); + client.executeMethod(httpMethod); + // 处理返回信息 + InputStream resStream = httpMethod.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(resStream, "gbk")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + String resxml = resBuffer.toString(); + String jsonString = xmlToJson(resxml);// 将xml转为json + System.out.println(jsonString); + */ + } + + /** + * 32位MD5加密 + * + * @param sourceStr + * @return + */ + private static String MD5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (NoSuchAlgorithmException e) { + logger.error(e); + } catch (Exception e) { + logger.error(e); + } + return result; + } + /** + * 向指定 URL 发送POST方法的请求 + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) { + PrintWriter out = null; + BufferedReader in = null; + String result = ""; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); +// conn.setRequestProperty("Content-Type", "application/json"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + //1.获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + //2.中文有乱码的需要将PrintWriter改为如下 + //out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8") + // 发送请求参数 + out.print(param); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + } catch (Exception e) { + e.printStackTrace(); + } + //使用finally块来关闭输出流、输入流 + finally{ + try{ + if(out!=null){ + out.close(); + } + if(in!=null){ + in.close(); + } + } + catch(IOException ex){ + ex.printStackTrace(); + } + } + return result; + } + +} diff --git a/src/com/since/emp/test/Test2.java b/src/com/since/emp/test/Test2.java new file mode 100644 index 0000000..6813c2a --- /dev/null +++ b/src/com/since/emp/test/Test2.java @@ -0,0 +1,16 @@ +package com.since.emp.test; + +import java.util.Vector; + +import org.junit.Test; + +import com.since.emp.util.HttpRequest; + +public class Test2 { + @Test + public void test() { + HttpRequest request = new HttpRequest(); + String sendGet = request.sendGet("https://api.mch.weixin.qq.com/v3/certificates", "", ""); + System.out.println(sendGet); + } +} diff --git a/src/com/since/emp/test/ThreadPoolTest.java b/src/com/since/emp/test/ThreadPoolTest.java new file mode 100644 index 0000000..a542972 --- /dev/null +++ b/src/com/since/emp/test/ThreadPoolTest.java @@ -0,0 +1,60 @@ +package com.since.emp.test; + +import java.util.concurrent.ThreadPoolExecutor; + +import com.since.emp.base.thread.ThreadPool; +import com.since.emp.service.OrderSyncs; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author Lewis + * @description + * @file_name ThreadPoolTest.java + * @date 2019年4月22日 + */ +public class ThreadPoolTest extends OrderSyncs { + private static Logger logger = LogManager.getLogger(ThreadPoolTest.class.getName()); + private static ThreadPoolExecutor threadPool; + + public static void main(String[] args) { + threadPool = ThreadPool.getInstance(); + for (int i = 0; i < 100; i++) { + TestThread tt = new TestThread(threadPool, "Thread--" + i); + +// tt.setName("Thread:" + i); + threadPool.execute(tt); +// try { +// Thread.sleep(10); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + + +} + +class TestThread extends OrderSyncs implements Runnable { + private static Logger logger = LogManager.getLogger(TestThread.class.getName()); + private ThreadPoolExecutor threadPool; + private String name; + + public TestThread(ThreadPoolExecutor threadPool, String name) { + this.threadPool = threadPool; + this.name = name; + } + + @Override + public void run() { +// System.out.println(this.getId()); + try { + threadPool = ThreadPool.getInstance(); + logger.info("线程:" + name + "启动"); + Thread.sleep(10 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} + diff --git a/src/com/since/emp/test/VipTest.java b/src/com/since/emp/test/VipTest.java new file mode 100644 index 0000000..47e3545 --- /dev/null +++ b/src/com/since/emp/test/VipTest.java @@ -0,0 +1,173 @@ +package com.since.emp.test; + +import com.google.gson.Gson; + +public class VipTest { + + public static void main(String[] args) throws Exception { +// VopTest vopTest = new VopTest(); +// Map map = new HashMap(); +// map.put("status", "10");//订单状态. 10:订单已审核, 22:订单已发货, 25:已签收, , 70:已拒收, 97:订单已取消 +// map.put("query_start_time", "2018-11-01 00:00:00");//查询时间段的开始时间 +// map.put("query_end_time", "2018-11-03 14:00:00");//查询时间段的结束时间 +// map.put("date_type", "1");//查询时间类型,默认按修改时间查询。1为按订单创建时间查询;其它数字为按订单最后修改时间 +// map.put("limit", 50 + "");//每页数量,默认50 最大200 +// map.put("page", 1 + "");//查询时间段的结束时间 +//// map.put("accessToken", "E925E9FC31FA3CBCE1608752A37B0191F022F644"); +// +// String busiParams = new Gson().toJson(map);// 拼接应用级参数 +// Configure configure = new Configure(); +// configure.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644").setAppKey("b83148b6").setAppSecrect("7588A8FAC373C5B3F3F85F20FDD0B24B").setFormat("JSON") +// .setService("vipapis.marketplace.delivery.SovDeliveryService").setMethod("getOrders") +// .setTimestamp(String.valueOf(System.currentTimeMillis() / 1000)).setVersion("1.0.0") +// .setUrl("http://gw.vipapis.com").setBusinessData(busiParams);// 业务参数 +// +// Map sysParams = vopTest.doSign(configure); +// HttpPost post = new HttpPost(configure.getUrl() + "?" + WebUtil.getQueryString(sysParams)); +// post.setEntity(new StringEntity(busiParams, WebUtil.getContentType(configure.getFormat()))); +// // 响应结果/ +// HttpResponse response = HttpClientBuilder.create().build().execute(post); +// String doResponse = vopTest.doResponse(response); +// System.out.println(doResponse); + + + + + + +// try { +// vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client=new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); +// com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); +// invocationContext.setAppKey("b83148b6"); +// invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); +// invocationContext.setAppURL("http://gw.vipapis.com"); +// invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); +// invocationContext.setLanguage("en"); +// vipapis.marketplace.delivery.GetOrdersRequest request1 = new vipapis.marketplace.delivery.GetOrdersRequest(); +//// java.util.HashSet status2 = new java.util.HashSet(); +//// status2.add("10"); +//// request1.setStatus(status2); +//// request1.setQuery_start_time("2001-11-03 00:00:00"); +//// request1.setQuery_end_time("2018-11-03 00:00:00"); +//// request1.setDate_type(1); +// request1.setLimit(200); +// request1.setPage(3); +// System.out.println(new Gson().toJson(client.getOrders(request1))); +// } catch(com.vip.osp.sdk.exception.OspException e){ +// System.out.println(e.getReturnCode()); +// } + + /* + * 订单详情获取接口 + */ + /* + try { + vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client=new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); + invocationContext.setAppKey("b83148b6"); + invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + invocationContext.setAppURL("http://gw.vipapis.com"); + invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); +// invocationContext.setLanguage("zh"); + java.util.HashSet order_ids1 = new java.util.HashSet(); + order_ids1.add("18110255349142"); + System.out.println(new Gson().toJson(client.getOrderDetail(order_ids1))); + } catch(com.vip.osp.sdk.exception.OspException e){ + e.printStackTrace(); + } + */ + /* + * 刷新授权接口 + */ + /* + try { + vipapis.oauth.OauthServiceHelper.OauthServiceClient client=new vipapis.oauth.OauthServiceHelper.OauthServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); + invocationContext.setAppKey("b83148b6"); + invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + invocationContext.setAppURL("http://gw.vipapis.com"); + invocationContext.setLanguage("en"); + vipapis.oauth.RefreshTokenRequest request1 = new vipapis.oauth.RefreshTokenRequest(); + request1.setRefresh_token("3859EB77435B14BE64099FB77957F719B6BA1EF2"); + request1.setClient_id("b83148b6"); + request1.setClient_secret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + request1.setRequest_client_ip("192.168.1.172");//此配置必传,但是唯品会并不会校验正确性 + System.out.println(new Gson().toJson(client.refreshToken(request1))); + } catch(com.vip.osp.sdk.exception.OspException e){ + e.printStackTrace(); + } + */ + /* + * 订单导出接口 + */ + /* + try { + vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient client=new vipapis.marketplace.delivery.SovDeliveryServiceHelper.SovDeliveryServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); + invocationContext.setAppKey("b83148b6"); + invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + invocationContext.setAppURL("http://gw.vipapis.com"); + invocationContext.setLanguage("en"); + invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); + vipapis.marketplace.delivery.ExportOrderByIdRequest request1 = new vipapis.marketplace.delivery.ExportOrderByIdRequest(); + java.util.ArrayList order_ids2 = new java.util.ArrayList(); + order_ids2.add("18111206165185"); + request1.setOrder_ids(order_ids2); + System.out.println(new Gson ().toJson(client.exportOrderById(request1))); + } catch(com.vip.osp.sdk.exception.OspException e){ + e.printStackTrace(); + } + */ + + /* + * 获取售后订单列表 + */ + + try { + vipapis.marketplace.asc.AscServiceHelper.AscServiceClient client=new vipapis.marketplace.asc.AscServiceHelper.AscServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); + invocationContext.setAppKey("b83148b6"); + invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); + invocationContext.setAppURL("http://gw.vipapis.com"); + invocationContext.setLanguage("en"); + vipapis.marketplace.asc.GetAscsRequest request1 = new vipapis.marketplace.asc.GetAscsRequest(); +// request1.setOrder_id("order_id"); + request1.setQuery_start_time("2018-11-03 00:00:00"); + request1.setQuery_end_time("2018-11-15 15:00:00"); +// request1.setAsc_type((byte)0); +// request1.setAsc_status((byte)0); +// request1.setRefund_status(1); + request1.setLimit(100); + request1.setPage(1); +// request1.setOperator("operator"); + System.out.println(new Gson().toJson(client.getAscs(request1))); + } catch(com.vip.osp.sdk.exception.OspException e){ + e.printStackTrace(); + } + + + /* + * 获取售后订单详单 + */ + /* + try { + vipapis.marketplace.asc.AscServiceHelper.AscServiceClient client=new vipapis.marketplace.asc.AscServiceHelper.AscServiceClient(); + com.vip.osp.sdk.context.InvocationContext invocationContext=com.vip.osp.sdk.context.InvocationContext.Factory.getInstance(); + invocationContext.setAppKey("b83148b6"); + invocationContext.setAppSecret("7588A8FAC373C5B3F3F85F20FDD0B24B"); + invocationContext.setAccessToken("E925E9FC31FA3CBCE1608752A37B0191F022F644"); + invocationContext.setAppURL("http://gw.vipapis.com"); + invocationContext.setLanguage("en"); + vipapis.marketplace.asc.GetAscInfoRequest request1 = new vipapis.marketplace.asc.GetAscInfoRequest(); + request1.setAsc_sn("310296541"); +// request1.setOperator("operator"); + System.out.println(new Gson().toJson(client.getAscInfo(request1))); + } catch(com.vip.osp.sdk.exception.OspException e){ + e.printStackTrace(); + } + */ + + } + +} diff --git a/src/com/since/emp/test/WeimobDemo.java b/src/com/since/emp/test/WeimobDemo.java new file mode 100644 index 0000000..8d7bb62 --- /dev/null +++ b/src/com/since/emp/test/WeimobDemo.java @@ -0,0 +1,81 @@ +package com.since.emp.test; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; + +import org.json.JSONArray; + +import com.google.gson.Gson; +import com.since.emp.base.HttpRequestCode; +import com.since.emp.base.weimob.MerchantOrderListQueryByCreateTimeParameter; +import com.since.emp.base.weimob.WeimobOrderRequestByCreateTimeParams; +import com.since.emp.util.HttpRequest; + +public class WeimobDemo { + public static void main(String[] args) { + try { + /* + * 刷新session_key + */ + /* + String app_key = "184060A363CC1168D361CCF0BC214219"; + String app_secret = "4583B97CCCA2A65063E9791DE9A86DC9"; + String refresh_token = "8d0128d9-ee01-48c9-b4dd-bdc8eadfb7c7"; + String url = "https://dopen.weimob.com/fuwu/b/oauth2/token?grant_type=refresh_token&client_id=" + app_key + "&client_secret=" + + app_secret + "&refresh_token=" + refresh_token; + + HttpRequest httpRequest = new HttpRequest(); + String result = httpRequest.sendPost(url, "", HttpRequestCode.CONTENT_TEXT); + System.out.println(result); + */ + /* + * 批量查询订单 + */ + + String uri = "https://dopen.weimob.com"; + String session_key = "3849dbde-368e-4892-bcee-accd604be309"; + String time_start = "2019-08-20 00:00:00"; + String time_end = "2019-08-21 14:00:00"; + + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String url = uri + "/api/1_0/ec/order/queryOrderList?accesstoken=" + + session_key; + WeimobOrderRequestByCreateTimeParams weimobOrderRequestByCreateTimeParams = new WeimobOrderRequestByCreateTimeParams(); + weimobOrderRequestByCreateTimeParams.page_size = 50;// 分页条数(取值范围【1,50】) + weimobOrderRequestByCreateTimeParams.page_num = 1;// 分页页码(从1开始) + weimobOrderRequestByCreateTimeParams.queryParameter = new MerchantOrderListQueryByCreateTimeParameter(); + weimobOrderRequestByCreateTimeParams.queryParameter.createStartTime = sdf.parse(time_start).getTime(); + weimobOrderRequestByCreateTimeParams.queryParameter.createEndTime = sdf.parse(time_end).getTime(); + weimobOrderRequestByCreateTimeParams.queryParameter.orderStatuses = new ArrayList(); + weimobOrderRequestByCreateTimeParams.queryParameter.orderStatuses.add(1); + Gson gson = new Gson(); + String params = gson.toJson(weimobOrderRequestByCreateTimeParams); + System.out.println(params); + HttpRequest httpRequest = new HttpRequest(); + + String jsonString = httpRequest.sendPost(url, params, HttpRequestCode.CONTENT_TEXT, "TestLogTitle"); + System.out.println(jsonString); + + + /* + * 根据订单号获取订单 + */ + /* + JSONArray array = new JSONArray(); + String uri = "https://dopen.weimob.com"; + String session_key = "2f4c81f8-fd98-4f57-82a7-6b96050e7250"; + String url = uri + "/api/1_0/ec/order/queryOrderDetail?accesstoken=" + + session_key; + String orderId = "9312421014726"; + String params = "{\"orderNo\": " + orderId + " }"; + HttpRequest httpRequest = new HttpRequest(); + String jsonString = httpRequest.sendPost(url, params, HttpRequestCode.CONTENT_TEXT, "TestLogTitle"); + System.out.println(jsonString); + */ + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/since/emp/test/XiaoHongShuTest2.java b/src/com/since/emp/test/XiaoHongShuTest2.java new file mode 100644 index 0000000..4764f83 --- /dev/null +++ b/src/com/since/emp/test/XiaoHongShuTest2.java @@ -0,0 +1,48 @@ +package com.since.emp.test; + +import java.io.IOException; +import java.util.Date; + +import org.junit.Test; + +import com.alibaba.fastjson.JSON; +import com.doudian.open.api.afterSale_List.AfterSaleListRequest; +import com.doudian.open.api.afterSale_List.data.AfterSaleListData; +import com.doudian.open.api.afterSale_List.param.AfterSaleListParam; +import com.xiaohongshu.fls.opensdk.client.PackageClient; +import com.xiaohongshu.fls.opensdk.entity.BaseResponse; +import com.xiaohongshu.fls.opensdk.entity.packages.request.GetPackageListRequest; +import com.xiaohongshu.fls.opensdk.entity.packages.response.GetPackagesListResponse; + +public class XiaoHongShuTest2 { + /** + * + * @Title: test + * @Description: 批量订单接口 + * @author Lewis + * @throws IOException + * @throws + */ + @Test + public void test() throws IOException { + PackageClient client = new PackageClient("https://ark.xiaohongshu.com/ark/open_api/v3/common_controller", + "4b2251edc4cc4b1bb8b7", "2.0", "4f7b0e3b24128db5033f1b9d91fb89fb"); + GetPackageListRequest request = new GetPackageListRequest(); +// request.setAccessToken("token-4bdd37960de8481c872453da0b00d561-12365e3434e1442ca63cd46d6a618616"); + // 开始时间,2022-02-17 14:00:39 + request.setStartTime((new Date().getTime()-100000001)/1000); + // 结束时间,2022-02-17 14:52:09 + request.setEndTime((new Date().getTime()-100000000)/1000); + // 包裹状态,0全部 1已下单待付款 2已支付处理中 3清关中 4待发货 5部分发货 6待收货 7已完成 8已关闭 9已取消 10换货申请中 + request.setPackageStatus(4); + /* + * startTime/endTime对应的时间类型,1 创建时间 限制 end-start<=24h、2 更新时间 限制 end-start<=30min + * 倒序拉取 最后一页到第一页 + * + */ + request.setTimeType(1); + BaseResponse execute = client.execute(request, + "token-4bdd37960de8481c872453da0b00d561-12365e3434e1442ca63cd46d6a618616"); + System.out.println(JSON.toJSONString(execute.getData())); + } +} diff --git a/src/com/since/emp/test/XiaoHongShu_Simple.java b/src/com/since/emp/test/XiaoHongShu_Simple.java new file mode 100644 index 0000000..cf4992d --- /dev/null +++ b/src/com/since/emp/test/XiaoHongShu_Simple.java @@ -0,0 +1,237 @@ +package com.since.emp.test; + +import com.since.emp.util.HttpRequest; +import com.since.emp.util.JsonUtil; +import com.since.emp.util.MD5Util; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; + +/** + * @className:XiaoHongShu_Simple + * @description:小红书测试 + * @author:Sunshine + * @date:2019年2月27日 下午2:08:49 + */ +public class XiaoHongShu_Simple { + private static String url = "https://ark.xiaohongshu.com/ark/open_api/v0/packages/latest_packages?";// 正式地址 + + // private static String appkey = "f7f71ffb1b"; + // private static String appsecret = "1c8f865d321c9bdcb4cdf9272655a46f"; + private static String appkey = "230efe0d83"; + private static String appsecret = "0066558fd3dbd7da95268b766cc3d964"; + private static String timestamp = System.currentTimeMillis() / 1000 + ""; + + public static void main(String[] args) { + // get_current_orders(); + // get_order_status(); + get_order_list(); + } + + public static String get_order_list() { + try { + String url = "https://ark.xiaohongshu.com/ark/open_api/v0/packages?"; + String page_no = "1"; + String page_size = "20"; + String start_time = date2TimeStamp("2020-11-03 10:00:00", "yyyy-MM-dd HH:mm:ss"); + ; + String end_time = date2TimeStamp("2020-11-03 15:00:00", "yyyy-MM-dd HH:mm:ss"); + ; + String sign = "/ark/open_api/v0/packages?" + "app-key=" + appkey + "&end_time=" + end_time + "&page_no=" + + page_no + "&page_size=" + page_size + "&start_time=" + start_time + "×tamp=" + timestamp + + appsecret; + + String sign1 = "/ark/open_api/v0/packages?" + "app-key=" + appkey + "×tamp=" + timestamp + appsecret; + + String request_str = "end_time=" + end_time + "&start_time=" + start_time + "&page_no=" + page_no + + "&page_size=" + page_size; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + + //String sendGet = sendGet(url + resquest_str, timestamp, appkey, signStr); + String s = new HttpRequest().xiaoHongShuSendGet(url + request_str, timestamp, appkey, signStr); + System.out.println(s); + } catch (Exception e) { + e.printStackTrace(); + + } + return null; + } + + /** + * @return + * @title: getLatest_packages + * @description: 获取即时订单 + */ + public static String get_current_orders() { + String sendGet = ""; + try { + + // {"app-key":"7bcf42acea","app-secret":"6712056340360dc552fb737846d0c253"} + // 7bcf42acea + // 6712056340360dc552fb737846d0c253 + // String url_test = + // "http://flssandbox.xiaohongshu.com/ark/open_api/v0/packages/latest_packages?";// + // 测试地址 + String url_test = "https://ark.xiaohongshu.com/ark/open_api/v0/packages/latest_packages?"; + // 测试环境 + String order_time_from = date2TimeStamp("2019-10-26 10:10:00", "yyyy-MM-dd HH:mm:ss"); // Int 是 + // 查询订单创建时间的开始时间,Unix-Time时间戳 + + String order_time_to = date2TimeStamp("2019-10-26 10:35:00", "yyyy-MM-dd HH:mm:ss"); // Int 是 + // 查询订单创建时间的结束时间,Unix-Time时间戳 + String page_no = "1"; // Int 否 查询当前分页,从1开始计数 + String page_size = "1"; // Int 否 分页大小, 默认50,最大值不超过100 + + String sign = "/ark/open_api/v0/packages/latest_packages?" + "app-key=" + appkey + "order_time_from=" + + order_time_from + "&order_time_to" + order_time_to + "&page_no=" + page_no + "&page_size=" + + page_size + "×tamp=" + timestamp + appsecret; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + System.out.println("signStr=======================>" + signStr); + String request_str = "order_time_from=" + order_time_from + "&order_time_to=" + order_time_to + "&page_no=" + + page_no + "&page_size=" + page_size; + Map map = new HashMap(); + map.put("order_time_from", order_time_from); + map.put("order_time_to", order_time_to); + map.put("page_no", page_no); + map.put("page_size", page_size); + String json_str = JsonUtil.objectToJson(map); + System.out.println("json_str======================>" + json_str); + String s = new HttpRequest().xiaoHongShuSendGet(url + request_str, timestamp, appkey, signStr); + System.out.println(s); + } catch (Exception e) { + e.printStackTrace(); + } + + return sendGet; + + } + + /** + * @return + * @title: get_order_status + * @description: 获取订单状态 + */ + public static String get_order_status() { + String package_ids = "P551666822645520771,P551662971630375661,P551663457792483531,P551665377798780981"; + // P551662971630375661 + // P551665377798780981 + // P551663457792483531 + // P551666822645520771 10:33 + String url_test = "http://flssandbox.xiaohongshu.com/ark/open_api/v0/packages/packages_status?";// 测试地址 + String sign = "/ark/open_api/v0/packages/packages_status?" + "app-key=" + appkey + "package_ids=" + package_ids + + appsecret; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + System.out.println("signStr=======================>" + signStr); + String request_str = "package_ids=" + package_ids; + Map map = new HashMap(); + map.put("package_ids", package_ids); + String json_str = JsonUtil.objectToJson(map); + System.out.println("json_str======================>" + json_str); + String s = new HttpRequest().xiaoHongShuSendGet(url + request_str, timestamp, appkey, signStr); + System.out.println(s); + return s; + + } + + /** + * @return + * @title: get_order_items + * @description: 获取订单详情 + */ + public static String get_order_items() { + String package_id = "P552270047362591271"; + String url_test = "http://flssandbox.xiaohongshu.com/ark/open_api/v0/packages/";// 测试地址 + String sign = "/ark/open_api/v0/packages/" + "app-key=" + appkey + "package_id=" + package_id + appsecret; + MD5Util md5Util = new MD5Util(); + String signStr = md5Util.MD5(sign); + System.out.println("signStr=======================>" + signStr); + String request_str = "package_id=" + package_id; + Map map = new HashMap(); + map.put("package_id", package_id); + String json_str = JsonUtil.objectToJson(map); + System.out.println("json_str======================>" + json_str); + String s = new HttpRequest().xiaoHongShuSendGet(url + request_str, timestamp, appkey, signStr); + System.out.println(s); + System.out.println("获取订单详情响应信息:" + s); + return s; + } + +// public static String sendGet1(String url, String timestamp, String appkey, String sign) { +// String result = StringUtils.EMPTY; +// CloseableHttpClient httpClient = createSSLClientDefault(); +// // CloseableHttpClient httpClient = HttpClients.createDefault(); +// HttpGet httpGet = new HttpGet(url); +// httpGet.addHeader("timestamp", timestamp); +// httpGet.addHeader("app-key", appkey); +// httpGet.addHeader("sign", sign); +// httpGet.addHeader("content-type", "application/json;charset=utf8"); +// httpGet.setConfig(RequestConfig.custom().setConnectTimeout(1000).build()); +// try { +// CloseableHttpResponse response = httpClient.execute(httpGet); +// HttpEntity entity = response.getEntity(); +// int status = response.getStatusLine().getStatusCode(); +// System.out.println(status); +// if (status == HttpStatus.SC_OK) { +// HttpEntity responseEntity = response.getEntity(); +// result = EntityUtils.toString(responseEntity, "UTF-8"); +// } +// } catch (ClientProtocolException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// System.out.println("标记1" + result); +// return result; +// } + + /** + * 日期格式字符串转换成时间戳 + * + * @param date_str 字符串日期 + * @param format 如:yyyy-MM-dd HH:mm:ss + * @return + */ + public static String date2TimeStamp(String date_str, String format) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(format); + return String.valueOf(sdf.parse(date_str).getTime() / 1000); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + +// /** +// * +// * @title: createSSLClientDefault +// * @description: 设置忽略SSL认证 +// * @return +// */ +// public static CloseableHttpClient createSSLClientDefault() { +// try { +// +// SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { +// +// // 信任所有 +// @Override +// public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { +// return true; +// } +// }).build(); +// SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); +// return HttpClients.custom().setSSLSocketFactory(sslsf).build(); +// } catch (KeyManagementException e) { +// e.printStackTrace(); +// } catch (NoSuchAlgorithmException e) { +// e.printStackTrace(); +// } catch (KeyStoreException e) { +// e.printStackTrace(); +// } +// return HttpClients.createDefault(); +// } + +} diff --git a/src/com/since/emp/test/YitiaoTest.java b/src/com/since/emp/test/YitiaoTest.java new file mode 100644 index 0000000..ce6c354 --- /dev/null +++ b/src/com/since/emp/test/YitiaoTest.java @@ -0,0 +1,442 @@ +package com.since.emp.test; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.json.JSONObject; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.since.emp.base.DbPoolConnection; +import com.since.emp.base.OrderInfo; +import com.since.emp.base.TradeInfo; +import com.since.emp.service.OrderSync; +import com.since.emp.service.OrderSyncs; +import com.yit.openapi.sdk.client.ApiAccessor; +import com.yit.openapi.sdk.client.ApiContext; +import com.yit.openapi.sdk.client.BaseRequest; +import com.yit.openapi.sdk.client.ServerResponse; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetOrderByPeriod; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder; +import com.yit.openapi.sdk.client.api.request.LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_SearchOrderParam; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_YitOrderInfo; +import com.yit.openapi.sdk.client.api.resp.Api_LOGISTICSOPENAPI_YitOrderInfo_ArrayResp; + +import net.sf.json.JSONArray; + +public class YitiaoTest extends OrderSyncs{ + private static Logger logger; + //public static Logger logger;// 日志 + public static OrderSyncs orderSyncs; + public static String privateKey = "MIICXQIBAAKBgQDxZI2ZCyYRzQq3z3rYVDeyCzXGSgBgP5/FKS08A69VYzkzndrk\n" + + "rLbPN7x7m65mSmj/YNr5hiQBwgTXv3rZjgGQpvO/AwO6y5EMDviFUFG85WWpF6uH\n" + + "bdtVODyLywD1Qj4qDuf9NWl7wGnORNyeEOGU2UkiUEfwNkEQ8nLW8YuS4QIDAQAB\n" + + "AoGAHoJB7zTcg+VxVFfxw8OpImSOUFhsAb4o2EdjAzHICDe5NA/gaYR2umvl841y\n" + + "llUTPiukoWLVzC8UY5w8z6BGDB5ktbMr0w2KdekPph4YTComYy5dkfJN4lFOZKEQ\n" + + "DJVdoyaU/1+hR8Icra7FtDk9Zuj2a+lOv4ek3nAWHKdNORECQQD9Djt3mtpplRVx\n" + + "d4zaVqYMS1wAAJu1o6sNuhk228FXaB7ogw7MzJGOBt98U1f8ACNh6Z+MozpA/NJU\n" + + "cSwaZryVAkEA9DOUy074QyeHHmXz3RqDaM09lb5h4TR2THwlBQ6uyhlfjKED5nnD\n" + + "Do1X0jqdy+QA/FLH+P+0fkthqrExxCPeHQJBAJxK1wW3GaDOWFEdUlxj2eiL/sVt\n" + + "mr4j2PkAcKRGM/KlNznKADETQ+7hZdSmsRfOigvmPAmjos4SmGFZCLFBtMUCQFQC\n" + + "ksPGrR3dMVzB0j1Ua7TYNsGXN3EUbUYux0WQIY2hYP+uPPtDFFmjQn0ucS69h6FG\n" + + "kUkWHu/72uOwBeDmPfkCQQD3Q+R6e++LZFkCeRuTPiJLcvvuadHJEYgfH0Hf3jkl\n" + + "kDBz97GhZmpq9CWTr6cNggFeQxb1hNbVcp6p6Gb9y6nS"; + public static String publicKey = ""; + + public static String tpId = "afc26891388c0a70"; + + public static void main(String[] args) throws Exception { + logger = (Logger) LogManager.getLogger(OrderSync.class.getName()); + // String shopConfig_name = "{\r\n" + // + " \"publickey\": + // \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6re5DjGavdcB3nJmSXQVJRZsy\\n+QJz1VkDhyuBSVjgCxU7cN56FzrY/tMx58ocGTbrkpBGhG1JW2v8ArnAaP4q95QE\\nIdKc0ATprrWyZys41PWUF/SDO9EHDoHloN4uPyyI5G4wQq9iBdGAmOX2AZ9YQGHl\\nzzpP/Wf93VcAbSWrWwIDAQAB\",\r\n" + // + " \"privatekey\": + // \"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALqt7kOMZq91wHec\\nmZJdBUlFmzL5AnPVWQOHK4FJWOALFTtw3noXOtj+0zHnyhwZNuuSkEaEbUlba/wC\\nucBo/ir3lAQh0pzQBOmutbJnKzjU9ZQX9IM70QcOgeWg3i4/LIjkbjBCr2IF0YCY\\n5fYBn1hAYeXPOk/9Z/3dVwBtJatbAgMBAAECgYBedS2vXjaDJ7jYjROj3I+VMLRE\\nCX11MQnWYCniREPFMbZvmj/oVSLAs8gXY2p/5z5D2qhIFi/aQ3kTTinBMx8Prrag\\nRT9RtwFyTlT8iPlHr6CUxBHcExHdvNWY9DoTZdNS4k3a6QMjh5PQQdFZ3dfsEOD4\\nLpk9FwW1IEDDa50gSQJBAO1MHMFqg2HsW2r/U7VgreZHA74QF+utBsm2mxFHlPNC\\ntyvfK6IIWAt5KSE7BBMmszXQhK/j7lanDdgzBqb7A2cCQQDJZIORG2UDYeCFmX2g\\n5MsEHDzVBSCZrFoD2AnYokQ5T34h8fhigb9j64Hz9hvJklxEZ7rgoBX6kf/Wpu5a\\nejPtAkBbaTySjZN6/2/f8eevMUUMNkMMzmpIkWjR/5QQvgB1DTg+oEPQsWIpWU0s\\nze0t63SRwHe8whMoMkY1CMMBRCT1AkBcB26H1LjoPsXWxzk9WM/c5Pp3bYxkLPpF\\nX2fAcwYyGj1NTcFvYlMPWgNcdE5mYld/etdO5lik1CrQ8B9jgQxRAkAYEWrS4tat\\nqrt6dPjpfV0K+5aGn6Z7mXVxZPa3o0+i7SyiwYR/vvMokN5NfOkFpGGCXH/c2KOO\\nrMg0OOI2YKqD\",\r\n" + // + " \"tpid\": \"ec7e8420b533ea82\"\r\n" + "}"; + // + // String shopConfig_name1="{\r\n" + + // " \"tpid\": \"afc26891388c0a70\",\r\n" + + // " \"publickey\": \"\",\r\n" + + // " \"privatekey\": + // \"MIICXQIBAAKBgQDxZI2ZCyYRzQq3z3rYVDeyCzXGSgBgP5/FKS08A69VYzkzndrk\\nrLbPN7x7m65mSmj/YNr5hiQBwgTXv3rZjgGQpvO/AwO6y5EMDviFUFG85WWpF6uH\\nbdtVODyLywD1Qj4qDuf9NWl7wGnORNyeEOGU2UkiUEfwNkEQ8nLW8YuS4QIDAQAB\\nAoGAHoJB7zTcg+VxVFfxw8OpImSOUFhsAb4o2EdjAzHICDe5NA/gaYR2umvl841y\\nllUTPiukoWLVzC8UY5w8z6BGDB5ktbMr0w2KdekPph4YTComYy5dkfJN4lFOZKEQ\\nDJVdoyaU/1+hR8Icra7FtDk9Zuj2a+lOv4ek3nAWHKdNORECQQD9Djt3mtpplRVx\\nd4zaVqYMS1wAAJu1o6sNuhk228FXaB7ogw7MzJGOBt98U1f8ACNh6Z+MozpA/NJU\\nDo1X0jqdy+QA/FLH+P+0fkthqrExxCPeHQJBAJxK1wW3GaDOWFEdUlxj2eiL/sVt\\nmr4j2PkAcKRGM/KlNznKADETQ+7hZdSmsRfOigvmPAmjos4SmGFZCLFBtMUCQFQC\\nksPGrR3dMVzB0j1Ua7TYNsGXN3EUbUYux0WQIY2hYP+uPPtDFFmjQn0ucS69h6FG\\nkUkWHu/72uOwBeDmPfkCQQD3Q+R6e++LZFkCeRuTPiJLcvvuadHJEYgfH0Hf3jkl\\nkDBz97GhZmpq9CWTr6cNggFeQxb1hNbVcp6p6Gb9y6nS\"\r\n" + // + + // "}"; + // int lastId = 0; + // System.out.println(shopConfig_name); + // JSONObject shopConfig_json = new JSONObject(shopConfig_name); + // String sellerId = shopConfig_json.getString("tpid"); + // System.out.println("sellerId:" + sellerId); + // String app_key = shopConfig_json.getString("publickey"); + // System.out.println("app_key:" + app_key); + // String app_secret = shopConfig_json.getString("privatekey"); + // System.out.println("app_secret:" + app_secret); + // getUnDownloadedPendingDeliveryOrder(lastId, sellerId, app_key, app_secret); + + // getUnDownloadedPendingDeliveryOrder(); + System.out.println("<-----------------------------------华丽的分割线----------------------------->"); +// String shopConfig2 = getShopConfig(); +// JSONObject shopConfig_json = new JSONObject(shopConfig2); +// tpId = shopConfig_json.getString("tpid"); +// publicKey = shopConfig_json.getString("publickey"); +// privateKey = shopConfig_json.getString("privatekey"); + getUnDownloadedPendingDeliveryOrderByLastId(0); +// getOrderByPeriod(0); + + } + + /** + * + * @title: getUnDownloadedPendingDeliveryOrderByLastId + * @description: 查询订单id大于lastId,且未下载过的待发货订单, + * 每次最多返回200条订单数据,当返回条数不足200条时说明没有更多的未下载的待发货订单 + * @param lastId + */ + private static String getUnDownloadedPendingDeliveryOrderByLastId(int lastId) { + //Logger logger2 = getLogger("test"); + LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId getUnDownloadedPendingDeliveryOrderByLastId = new LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrderByLastId( + lastId); + // 生产接口地址:https://open.yit.com/apigw/m.api + // 测试接口地址:https://open-test.yit.com/apigw/m.api + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor + .fillApiResponse(new BaseRequest[] { getUnDownloadedPendingDeliveryOrderByLastId }); + String serverResponseString = JSON.toJSONString(serverResponse); + net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(serverResponseString); + int returnCode = jsonObject.getInt("returnCode");// 平台返回状态码 0:正常返回 ,-180:SIGNATURE_ERROR 签名错误 + String order_jsonString = null; // ,其他为未知异常 + if (returnCode == 0) { + List orderList = getUnDownloadedPendingDeliveryOrderByLastId + .getResponse().value; + order_jsonString = JSON.toJSONString(orderList); + logger.info("getUnDownloadedPendingDeliveryOrderByLastId:" + serverResponseString); + logger.info("getUnDownloadedPendingDeliveryOrderByLastId:" + order_jsonString); + // 解析订单 + parseOrderList(order_jsonString); + } else if (returnCode == -180) { + System.out.println("签名错误!"); + } else { + System.out.println("未知的异常!"); + + } + return order_jsonString; + + } + + /** + * + * @title: getOrderByPeriod + * @description: 按付款时间查询时间段内的所有订单,最多查询30天的订单 + * @param lastId + * @param sellerId + * @param app_key + * @param app_secret + */ + private static void getOrderByPeriod(int lastId) { + //Logger logger2 = getLogger("test"); + Api_LOGISTICSOPENAPI_SearchOrderParam param = new Api_LOGISTICSOPENAPI_SearchOrderParam(); + param.lastId = lastId; + param.size = 200; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, -30); + long currentTime = System.currentTimeMillis() - 30 * 60 * 10000; + Date date = new Date(currentTime); + param.startDate = date; + + param.endDate = new Date(); // 最多查询30天时间间隔 + param.status = ""; + LogisticsOpenApi_GetOrderByPeriod getOrderByPeriod = new LogisticsOpenApi_GetOrderByPeriod(param); + ApiAccessor apiAccessor = getApiAccessor(); + + ServerResponse serverResponse = apiAccessor.fillApiResponse(new BaseRequest[] { getOrderByPeriod }); + String serverResponseString = JSON.toJSONString(serverResponse); + logger.info("getOrderByPeriod:" + serverResponseString); + Api_LOGISTICSOPENAPI_YitOrderInfo_ArrayResp res =getOrderByPeriod.getResponse(); + + System.out.println("mark------------------------>"+JSON.toJSONString(res)); + + List orderList = getOrderByPeriod.getResponse().value; + String order_jsonString = JSON.toJSONString(orderList); + logger.info("getOrderByPeriod:" + order_jsonString); + // 解析订单 + parseOrderList1(order_jsonString); + } + + /** + * + * @title: parseOrderList + * @description: 解析获取到的订单信息 + * @param order_jsonString + * @return + */ + private static void parseOrderList1(String order_jsonString) { + //Logger logger2 = getLogger("test"); + // 1.将获取的订单遍历,遍历看是否获取完(订单总数小于200),若小于200,则本次已经获取完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传, + // 若订单总数大于200,将数据存储起来,与下次获取到的订单合并,合并完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传。 + int lastId = 0; + int count = 0;// 用于统计当次获取的订单数量 + ArrayList tradeList = new ArrayList(); + JSONArray jsonArray = (JSONArray) JSONArray.fromObject(order_jsonString); + HashMap map = new HashMap(); + int jsonArraySize = jsonArray.size(); + logger.info("getOrderByPeriod:本次获取到订单数" + jsonArraySize); + int[] ids = new int[jsonArraySize]; + for (int i = 0; i < jsonArraySize; i++) { + net.sf.json.JSONObject order = jsonArray.getJSONObject(i); + TradeInfo singleOrder = parseOrder(order); + ids[i] = order.getInt("id");// 将本次获取的订单id放入数组,用于回传 + if (map.containsKey(singleOrder.tid)) { + TradeInfo tradeInfo = map.get(singleOrder.tid); + // 将金额和数量等信息加到订单里面 + tradeInfo.num = (tradeInfo.num + singleOrder.num); + tradeInfo.money = ((Double.parseDouble(tradeInfo.money) + Double.parseDouble(singleOrder.money) + "")); + tradeInfo.pay_money = ((Double.parseDouble(tradeInfo.pay_money) + + Double.parseDouble(singleOrder.pay_money) + "")); + map.put(tradeInfo.tid, tradeInfo); + } else { + map.put(singleOrder.tid, singleOrder); + } + count++; + // 如果该批订单有200条,那么可能会有下一页,记下该页的最后一个id,用于下一页查询 + + if (i == 199) { + lastId = order.getInt("id"); + //logger2.info(lastId); + } + + } + // logger2.info("mark========================================>>>>>>>>>>>"+confirmDownload(ids)); + + logger.info("getOrderByPeriod:count-------------------------------------->" + count); + for (Map.Entry entry : map.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + tradeList.add(tradeInfo); + } + + if (count == 200) { + getOrderByPeriod(lastId); + count = 0; + } + + } + + /** + * @title: getUnDownloadedPendingDeliveryOrder + * @description: 查询未下载过的待发货订单,每次最多返回200条订单数据,当返回条数不足200条时说明没有更多的未下载的待发货订单 + * @param lastId + * @param sellerId + * @param app_key + * @param app_secret + */ + private static void getUnDownloadedPendingDeliveryOrder() { + //Logger logger2 = getLogger("test"); + LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder getUnDownloadedPendingDeliveryOrder = new LogisticsOpenApi_GetUnDownloadedPendingDeliveryOrder(); + + // 生产接口地址:https://open.yit.com/apigw/m.api + // 测试接口地址:https://open-test.yit.com/apigw/m.api + ApiAccessor apiAccessor = getApiAccessor(); + ServerResponse serverResponse = apiAccessor + .fillApiResponse(new BaseRequest[] { getUnDownloadedPendingDeliveryOrder }); + String serverResponseString = JSON.toJSONString(serverResponse); + List orderList = getUnDownloadedPendingDeliveryOrder.getResponse().value; + String order_jsonString = JSON.toJSONString(orderList); + //logger2.info("getUnDownloadedPendingDeliveryOrder:" + order_jsonString); + //logger2.info("getUnDownloadedPendingDeliveryOrder:" + serverResponseString); + + } + + /** + * + * @title: parseOrderList + * @description: 解析获取到的订单信息 + * @param order_jsonString + * @return + */ + private static void parseOrderList(String order_jsonString) { + //Logger logger2 = getLogger("test"); + // 1.将获取的订单遍历,遍历看是否获取完(订单总数小于200),若小于200,则本次已经获取完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传, + // 若订单总数大于200,将数据存储起来,与下次获取到的订单合并,合并完毕,将订单放置数据解析队列,调用确认下载订单接口,将已下载的订单回传。 + int lastId = 0; + int count = 0;// 用于统计当次获取的订单数量 + ArrayList tradeList = new ArrayList(); + JSONArray jsonArray = (JSONArray) JSONArray.fromObject(order_jsonString); + HashMap map = new HashMap(); + int jsonArraySize = jsonArray.size(); + logger.info("getUnDownloadedPendingDeliveryOrderByLastId:本次获取到订单数" + jsonArraySize); + int[] ids = new int[jsonArraySize]; + for (int i = 0; i < jsonArraySize; i++) { + net.sf.json.JSONObject order = jsonArray.getJSONObject(i); + TradeInfo singleOrder = parseOrder(order); + ids[i] = order.getInt("id");// 将本次获取的订单id放入数组,用于回传 + if (map.containsKey(singleOrder.tid)) { + TradeInfo tradeInfo = map.get(singleOrder.tid); + // 将金额和数量等信息加到订单里面 + tradeInfo.num = (tradeInfo.num + singleOrder.num); + tradeInfo.money = ((Double.parseDouble(tradeInfo.money) + Double.parseDouble(singleOrder.money) + "")); + tradeInfo.pay_money = ((Double.parseDouble(tradeInfo.pay_money) + + Double.parseDouble(singleOrder.pay_money) + "")); + map.put(tradeInfo.tid, tradeInfo); + } else { + map.put(singleOrder.tid, singleOrder); + } + count++; + // 如果该批订单有200条,那么可能会有下一页,记下该页的最后一个id,用于下一页查询 + + if (i == 199) { + lastId = order.getInt("id"); + //logger2.info(lastId); + } + + } + // logger2.info("mark========================================>>>>>>>>>>>"+confirmDownload(ids)); + + logger.info("getUnDownloadedPendingDeliveryOrderByLastId:本次获取到订单数count-------------------------------------->" + count); + for (Map.Entry entry : map.entrySet()) { + TradeInfo tradeInfo = entry.getValue(); + tradeList.add(tradeInfo); + } + + if (count == 200) { + getUnDownloadedPendingDeliveryOrderByLastId(lastId); + count = 0; + } + + } + + /** + * + * @title: parseOrder + * @description: 解析订单详情 + * @param order + * @return + */ + private static TradeInfo parseOrder(net.sf.json.JSONObject order) { + + try { + //Logger logger2 = getLogger("test"); + TradeInfo tradeInfo = new TradeInfo(); + OrderInfo orderInfo = new OrderInfo(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + orderInfo.oid = order.getString("id");// 订单商品id,用于分页和确认下载订单 + + // 订单详情信息 + net.sf.json.JSONObject yitOrderDetailInfo = order.getJSONObject("yitOrderDetailInfo"); + + tradeInfo.obm_company_code = "";// 品牌商公司编码,只有代发订单有值 + tradeInfo.invoice_type = yitOrderDetailInfo.getBoolean("hasInvoice") ? 5 : 0;// 是否能开发票 + JSONArray note = yitOrderDetailInfo.getJSONArray("note");// 外部备注 + for (int i = 0; i < note.size(); i++) { + tradeInfo.buyer_message = tradeInfo.buyer_message + note.getString(i); + } + long orderPayTime = yitOrderDetailInfo.getLong("orderPayTime"); + tradeInfo.pay_time = sdf.format(new Date(orderPayTime / 1000));// 支付时间 + tradeInfo.status = yitOrderDetailInfo.getString("status");// 订单状态 CANCEL 已取消, CONFIRMED 已确认, SIGNED 已签收, + // STOCK_OUT 已发货, WAIT_DELIVERY 待发货 + tradeInfo.tid = yitOrderDetailInfo.getString("subOrderNo");// 一条订单编号 + + // 订单商品信息 + net.sf.json.JSONObject yitProductInfo = order.getJSONObject("yitProductInfo"); + orderInfo.sku_id = yitProductInfo.getString("itemId");// 一条sku + orderInfo.sku_properties_name = yitProductInfo.getString("optionText");// 商品规格 + orderInfo.title = yitProductInfo.getString("productName");// 商品名称 + orderInfo.num = yitProductInfo.getInt("quantity");// 数量 + orderInfo.adjust_fee = "0"; + orderInfo.total_fee = (yitProductInfo.getInt("totalPrice") / 100.0) + "";// 总价 (单位:分) + orderInfo.price = (yitProductInfo.getInt("unitPrice") / 100.0) + "";// 单价 (单位:分) + orderInfo.platform_seller_code = yitProductInfo.getString("vendorSku");// 供应商sku + tradeInfo.num = orderInfo.num;// 商品购买数量 + + // 收件人信息 + net.sf.json.JSONObject yitReceiverInfo = order.getJSONObject("yitReceiverInfo"); + tradeInfo.receiver_country = "中国"; + tradeInfo.receiver_state = yitReceiverInfo.getString("province");// 省 + tradeInfo.receiver_city = yitReceiverInfo.getString("city");// 市 + tradeInfo.receiver_district = yitReceiverInfo.getString("region");// 区 + tradeInfo.receiver_phone = yitReceiverInfo.getString("phone");// 收货人手机 + tradeInfo.receiver_mobile = yitReceiverInfo.getString("phone");// 收货人电话 + + String fullAddress = yitReceiverInfo.getString("fullAddress");// 详细地址 + tradeInfo.receiver_address = tradeInfo.receiver_state + " " + tradeInfo.receiver_city + " " + + tradeInfo.receiver_district + " " + fullAddress;// 收货人详细地址 + tradeInfo.adjust_fee = "0"; + tradeInfo.platform_code = "020"; + tradeInfo.pay_money = orderInfo.total_fee;// 买家实付金额 + tradeInfo.money = orderInfo.total_fee;// 商家实收金额 + tradeInfo.discount_fee = "0.0"; + OrderInfo[] orders = new OrderInfo[1]; + orders[0] = orderInfo; + tradeInfo.orders = orders; + // logger2.info(tradeInfo); + return tradeInfo; + } catch (Exception e) { + return null; + } + + } + + /** + * + * @title: getApiAccessor + * @description: 一条账户校验 + * @param tpId + * @param publicKey + * @param privateKey + * @return + */ + private static ApiAccessor getApiAccessor() { + ApiContext context = ApiContext.getCurrent(); + context.setThirdPartyId(tpId); + context.setClientPK(publicKey, privateKey); + ApiAccessor apiAccessor = new ApiAccessor(context, 3000, 3000, "https://open-test.yit.com/apigw/m.api"); + return apiAccessor; + } + + public static Logger getLogger(String className) { + + ConfigurationSource source; + String relativePath = "log4j2.properties"; + String filePath = relativePath; + File log4jFile = new File(filePath); + try { + if (log4jFile.exists()) { + source = new ConfigurationSource(new FileInputStream(log4jFile), log4jFile); + Configurator.initialize(null, source); + logger = (Logger) LogManager.getLogger(className); + return logger; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String getShopConfig() throws Exception { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = dbpc.getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + String platform_account=""; + String sql = "select platform_account from tb_shop where platform_code = '020'"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while(rs.next()) { + platform_account =rs.getString("platform_account"); + } + System.out.println(platform_account); + return platform_account; + } + +} diff --git a/src/com/since/emp/test/YouzanDemo.java b/src/com/since/emp/test/YouzanDemo.java new file mode 100644 index 0000000..21a08d5 --- /dev/null +++ b/src/com/since/emp/test/YouzanDemo.java @@ -0,0 +1,75 @@ +package com.since.emp.test; + +import java.text.SimpleDateFormat; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.gson.Gson; +import com.youzan.open.sdk.client.auth.Sign; +import com.youzan.open.sdk.client.auth.Token; +import com.youzan.open.sdk.client.core.DefaultYZClient; +import com.youzan.open.sdk.client.core.YZClient; +import com.youzan.open.sdk.client.oauth.model.OAuthToken; +import com.youzan.open.sdk.gen.v3_0_0.api.YouzanTradesSoldGet; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetParams; +import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult; +import com.youzan.open.sdk.util.http.DefaultHttpClient; +import com.youzan.open.sdk.util.http.HttpClient; +import com.youzan.open.sdk.util.json.JsonUtils; + +public class YouzanDemo { + public static void main(String[] args) { + // 获取订单 +// String appKey = "690230e1534b0b24bb"; +// String appSecret = "10278e5cf2195b1e9385206cccf4c139"; + try { + YZClient client = new DefaultYZClient(new Token("89c69a88945237a3958e5a129bc3fc12")); +// new Sign(appKey, appSecret) + YouzanTradesSoldGetParams youzanTradesSoldGetParams = new YouzanTradesSoldGetParams(); + + youzanTradesSoldGetParams.setStartUpdate(new + SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-03-13 00:00:00")); + youzanTradesSoldGetParams.setEndUpdate(new + SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-03-14 18:00:00")); + youzanTradesSoldGetParams.setPageSize(Long.valueOf(20)); + youzanTradesSoldGetParams.setPageNo(Long.valueOf(1)); // +// youzanTradesSoldGetParams.setStatus("WAIT_SELLER_SEND_GOODS"); + youzanTradesSoldGetParams.setType("NORMAL"); + + YouzanTradesSoldGet youzanTradesSoldGet = new YouzanTradesSoldGet(); + youzanTradesSoldGet.setAPIParams(youzanTradesSoldGetParams); + YouzanTradesSoldGetResult result = client.invoke(youzanTradesSoldGet); + System.out.println(new Gson().toJson(result)); + } catch (Exception e) { + e.printStackTrace(); + } + + +// new YouzanDemo().refreshToken(); + } + + // 刷新token + public OAuthToken refreshToken() { + + try { + HttpClient httpClient = new DefaultHttpClient(); + HttpClient.Params params = HttpClient.Params.custom().add("client_id", "690230e1534b0b24bb") + .add("client_secret", "10278e5cf2195b1e9385206cccf4c139").add("grant_type", "refresh_token") + .add("refresh_token", "324d6faac6ee307bbdf8ffbc1d1de773") + .setContentType(ContentType.APPLICATION_FORM_URLENCODED).build(); + String resp = httpClient.post("https://open.youzan.com/oauth/token", params); + System.out.println(resp); + if (StringUtils.isBlank(resp) || !resp.contains("access_token")) { + throw new RuntimeException(resp); + } + return JsonUtils.toBean(resp, new TypeReference() { + + }); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/com/since/emp/test/dto/PddOpenKmsDecryptBatchRequest.java b/src/com/since/emp/test/dto/PddOpenKmsDecryptBatchRequest.java new file mode 100644 index 0000000..8dc0da7 --- /dev/null +++ b/src/com/since/emp/test/dto/PddOpenKmsDecryptBatchRequest.java @@ -0,0 +1,76 @@ +package com.since.emp.test.dto; + +import com.pdd.pop.sdk.common.util.JsonUtil; +import com.pdd.pop.ext.fasterxml.jackson.annotation.JsonProperty; +import com.pdd.pop.sdk.http.api.pop.response.PddOpenDecryptBatchResponse; +import com.pdd.pop.sdk.http.HttpMethod; +import com.pdd.pop.sdk.http.PopBaseHttpRequest; + +import java.util.List; +import java.util.Map; + +public class PddOpenKmsDecryptBatchRequest extends PopBaseHttpRequest { + + /** + * 数据列表, 默认列表大小不超过100 + */ + @JsonProperty("data_list") + private List dataList; + + @Override + public String getVersion() { + return "V1"; + } + + @Override + public String getDataType() { + return "JSON"; + } + +// @Override + public Integer getPlatform() { + return 0; + } + + @Override + public String getType() { + return "pdd.open.kms.decrypt.batch"; + } + + @Override + public HttpMethod getHttpMethod() { + return HttpMethod.POST; + } + + @Override + public Class getResponseClass() { + return PddOpenDecryptBatchResponse.class; + } + + @Override + protected void setUserParams(Map params) { + setUserParam(params, "data_list", dataList); + } + + public void setDataList(List dataList) { + this.dataList = dataList; + } + + public static class DataListItem { + + /** + * 密文 + */ + @JsonProperty("encrypted_data") + private String encryptedData; + + public void setEncryptedData(String encryptedData) { + this.encryptedData = encryptedData; + } + + @Override + public String toString() { + return JsonUtil.transferToJson(this); + } + } +} \ No newline at end of file diff --git a/src/com/since/emp/test/vo/CityVo.java b/src/com/since/emp/test/vo/CityVo.java new file mode 100644 index 0000000..bb56c66 --- /dev/null +++ b/src/com/since/emp/test/vo/CityVo.java @@ -0,0 +1,28 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/10 15:16 + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CityVo { + /** + * 城市id编码 + */ + private String city_id; + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/test/vo/CombineStatusVO.java b/src/com/since/emp/test/vo/CombineStatusVO.java new file mode 100644 index 0000000..7ae46dc --- /dev/null +++ b/src/com/since/emp/test/vo/CombineStatusVO.java @@ -0,0 +1,26 @@ +package com.since.emp.test.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CombineStatusVO { + /** + * 订单状态,","分隔多个状态 order_status : 1 在线支付订单待支付;货到付款订单待确认 2 备货中(只有此状态下,才可发货) 4 + * 已取消:(1.未支付时用户或客服取消订单;2.用户超时未支付,系统自动取消订单;3.货到付款订单,用户拒收;4.订单付款未发货时,触发平台风控,取消订单) + */ + private String order_status; + + /** + * 订单状态,","分隔多个状态 流程状态,仅支持103 - 预售订单已支付定金未付尾款 + * + * + */ + private String main_status; +} diff --git a/src/com/since/emp/test/vo/DouDianOrderListQueryVO.java b/src/com/since/emp/test/vo/DouDianOrderListQueryVO.java new file mode 100644 index 0000000..4146eff --- /dev/null +++ b/src/com/since/emp/test/vo/DouDianOrderListQueryVO.java @@ -0,0 +1,107 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; + +/** + * @Description: 抖音店铺业务级批量订单入参 + * @ClassName: DouDianOrderListQueryRequestParams + * @author Lewis + * @date 2021-4-8 11:39:07 + * + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DouDianOrderListQueryVO { + /** + * 商品,number型代表商品ID,其它代表商品名称 + */ + private String product; + + /** + * app渠道:0 站外 1 火山 2 抖音 3 头条 4 西瓜 5 微信 6 值点app 7 头条lite 8 懂车帝 9 皮皮虾 11 抖音极速版 12 TikTok 13 musically 14 穿山甲 15 火山极速版 16 服务市场 + */ + private Integer b_type; + + /** + * 售后状态:all-全部,in_aftersale-售后中,refund-退款中,refund_success-退款成功,refund_fail-退款失败,exchange_success-换货成功 aftersale_close-售后关闭 + */ + private String after_sale_status_desc; + + /** + * 物流单号 + */ + private String tracking_no; + + /** + * 预售类型:1 全款预售 + */ + private Integer presell_type; + + /** + * 订类型:0-普通订单 2-虚拟订单 4-平台券码 5-商家券码 + */ + private Integer order_type; + + /** + * 下单时间:开始 + */ + private Long create_time_start; + + /** + * 下单时间:截止 + */ + private Long create_time_end; + + /** + * 异常订单,1-异常取消,2-风控审核中 + */ + private Integer abnormal_order; + + /** + * 交易类型,1 拼团订单,2 定金预售 + */ + private Integer trade_type; + + /** + * 状态组合查询,直接输入状态码 order_status:1订单状态,","分隔多个状态 main_status:103主流程状态,","分隔多个状态 + */ + private ArrayList combine_status; + + /** + * 更新时间:开始 + */ + private Long update_time_start; + + /** + * 更新时间:截止 + */ + private Long update_time_end; + + /** 单页大小,限制100以内 */ + private Integer size; + + /** 页码,0页开始 */ + private Integer page; + + /** 1、默认按订单创建时间搜索2、值为“create_time”:按订单创建时间;值为“update_time”:按订单更新时间 */ + private String order_by; + + /** + * 排序类型,小到大或大到小,默认大到小 + */ + private Boolean order_asc; + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } + +} diff --git a/src/com/since/emp/test/vo/DouDianSignVO.java b/src/com/since/emp/test/vo/DouDianSignVO.java new file mode 100644 index 0000000..9159c06 --- /dev/null +++ b/src/com/since/emp/test/vo/DouDianSignVO.java @@ -0,0 +1,40 @@ +package com.since.emp.test.vo; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: 抖音店铺请求参数,对应抖音平台的请求入参,不能使用驼峰命名变量 + * @ClassName: DouDianSignVO + * @author Lewis + * @date 2021-4-8 10:44:51 + * + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class DouDianSignVO{ + /** 标准json类型,里面是业务参数按照参数名的字符串大小排序具体参数值,参考每个接口的参数表 */ + private String param_json; + /** 调用的API接口名称 */ + private String method; + /** 应用创建完成后被分配的key */ + private String app_key; + /** 用于调用 API 的 access_token */ + private String access_token; + /** 时间格式,格式要求为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2016-01-01 12:00:00 */ + private String timestamp; + /** API协议版本,当前版本为2 */ + private String v; + /** 签名 */ + private String sign; + /** + * 签名算法类型(不传则默认为"md5")1. md5。表示用md5算法加密字符串 2. hmac-sha256。表示用hmac_sha_256算法加密字符串 + */ +// private String sign_method; +} diff --git a/src/com/since/emp/test/vo/NumFreeChangInfo.java b/src/com/since/emp/test/vo/NumFreeChangInfo.java new file mode 100644 index 0000000..b5e8ed3 --- /dev/null +++ b/src/com/since/emp/test/vo/NumFreeChangInfo.java @@ -0,0 +1,31 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/15 17:34 + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class NumFreeChangInfo { + /** + * 订单数量 + */ + private int refund_total_num; + /** + * 订单金额 + */ + private int refund_total_amount; + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/test/vo/OrderDetialVO.java b/src/com/since/emp/test/vo/OrderDetialVO.java new file mode 100644 index 0000000..510c7fc --- /dev/null +++ b/src/com/since/emp/test/vo/OrderDetialVO.java @@ -0,0 +1,32 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/11 14:40 + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class OrderDetialVO { + /** + * 店铺订单号 + */ + private String shop_order_id; + /** + * 订单号 + */ + private String order_id; + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/test/vo/PageParamVo.java b/src/com/since/emp/test/vo/PageParamVo.java new file mode 100644 index 0000000..9a0d8d9 --- /dev/null +++ b/src/com/since/emp/test/vo/PageParamVo.java @@ -0,0 +1,34 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: 分页参数 + * @Author: wg + * @Date: 2021/6/17 11:15 + */ + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class PageParamVo { + /** + * 页码 + */ + private int page; + + /** + * 每页大小 + */ + private int pageSize; + + public String toJsonString() { + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/test/vo/ProvinceVo.java b/src/com/since/emp/test/vo/ProvinceVo.java new file mode 100644 index 0000000..d24959e --- /dev/null +++ b/src/com/since/emp/test/vo/ProvinceVo.java @@ -0,0 +1,28 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/10 15:16 + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ProvinceVo { + /** + * 省会编码 + */ + private String province_id; + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/test/vo/RefundVO.java b/src/com/since/emp/test/vo/RefundVO.java new file mode 100644 index 0000000..71556c9 --- /dev/null +++ b/src/com/since/emp/test/vo/RefundVO.java @@ -0,0 +1,136 @@ +package com.since.emp.test.vo; + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @Description: + * @Author: wg + * @Date: 2021/6/7 18:22 + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class RefundVO { + /** + * 订单号 + */ + private String order_id; + + /** + * 页数(默认值为0,第一页从0开始) + */ + private Integer page; + + /** + * 订单排序方式:最近的在前,1;最近的在后,0 默认1 + */ + private Integer is_desc; + + /** + * 0是所有,-1是正常,1是异常 + */ + private Integer risk_flag; + + /** + * 排序字段,apply_time 售后申请时间;update_time 售后更新时间;默认apply_time + */ + private String order_by; + + /** + * 每页订单数(默认为10,最大100) + */ + private Integer size; + + /** + * 查询开始时间,若order_by传入apply_time以售后申请时间查询;若order_by传入update_time以售后更新时间查询 + */ + private String start_time; + + /** + * 查询结束时间,若order_by传入apply_time以售后申请时间查询;若order_by传入update_time以售后更新时间查询 + */ + private String end_time; + + /** + * 售后状态 1: 所有, + * 2: PreSaleAllAudit,发货前退款待处理 + * 3: RefundAudit,发货后仅退款待处理 + * 4: ReturnAudit,退货待处理 + * 5: ExchangeAudit,换货待处理 + * 6: RefundFail,同意退款、 + * 退款失败 7: AuditRefund,同意退款、退款成功 + * 8: AfterSaleAudit,待商家处理 + * 9: ReturnReceive,待商家收货 + * 10: AuditRefunding,同意退款,退款中 + * 11: ArbitratePending,仲裁中 + * 12: Close,售后关闭 + * 13: ReturnShip,待买家退货 + * 14: WaitBuyerReceive,换货待用户收货 + * 15: ExchangeSuccess,换货成功 + * 16: Refuse,拒绝售后 + * 17: ReceiveRefuse,退货后拒绝退款 + * 18: UploadRefund,待商家上传退款凭证 + */ + private Integer status; + + /** + * 0: TypeReturn, 退货 + * 1: TypeRefund, 售后仅退款 + * 2: TypePreSaleAll, 售前退款 + * 3: TypeExchange, 换货 + * 5: TypeAll, 所有 + */ + private Integer type; + + /** + 1: LogisticsStatusAll, 所有 + 2: Shipped, 已发货 + 3: NotShipped, 未发货 + */ + private Integer logistics_status; + + /** + 售后id + */ + private Integer aftersale_id; + + /** + 支付方式 1: PayTpeAll, 所有 + 2: Cod, 货到付款 + 3: Online, 在线支付 + */ + private Integer pay_type; + + /** + 仲裁状态 1: ArbitrationStatusAll, 所有 + 2: ArbitrationStatusNone, 无仲裁 + 3: Pending, 仲裁中 + 4: Finished,仲裁结束 + */ + private Integer arbitrate_status; + + /** + 退款类型 0: Origin, 原路退回 + 1: Offline, 线下退款 + 2: Imprest,预付款退款 + 3: Pledge,保证金退款 + 4: None,无需退款 + 5: RefundTypeAll, 所有 + */ + private Integer refund_type; + + /** + * 物流单号 + */ + private Integer logistics_code; + + public String toJsonString(){ + String jsonString = JSON.toJSONString(this); + return jsonString; + } +} diff --git a/src/com/since/emp/util/Base64Util.java b/src/com/since/emp/util/Base64Util.java new file mode 100644 index 0000000..bb00535 --- /dev/null +++ b/src/com/since/emp/util/Base64Util.java @@ -0,0 +1,73 @@ +package com.since.emp.util; + +/** + * @description + * @author Lewis + * @file_name dd.java + * @date 2019年1月31日 + */ + +import java.io.UnsupportedEncodingException; +import java.util.Base64; +import java.util.Base64.Decoder; +import java.util.Base64.Encoder; + +public class Base64Util { + /** + * @Description: 将 s 进行 BASE64 编码 + * @Title: encode + * @author Lewis + * @param s + * @return res + */ + public static String encode(String s) { + if (s == null) + return null; + String res = ""; + + try { + Encoder encoder = Base64.getEncoder(); + res = encoder.encodeToString(s.getBytes("utf-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return res; + } +/** + * @Description: 将 ss 进行 BASE64 编码 + * @Title: encode + * @author Lewis + * @param ss + * @return res + */ + public static String encode(byte[] ss) { + String res = ""; + try { + Encoder encoder = Base64.getEncoder(); + res = encoder.encodeToString(ss); + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + + /** + * @Description: 将 BASE64 编码的字符串 s 进行解码 + * @Title: decode + * @author Lewis + * @param s + * @return res + */ + public static String decode(String s) { + if (s == null) + return null; + try { + + Decoder decoder = Base64.getDecoder(); + byte[] b = decoder.decode(s.getBytes()); + return new String(b, "utf-8"); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/com/since/emp/util/CloseUtil.java b/src/com/since/emp/util/CloseUtil.java new file mode 100644 index 0000000..d0d65da --- /dev/null +++ b/src/com/since/emp/util/CloseUtil.java @@ -0,0 +1,26 @@ +package com.since.emp.util; + +import java.util.Objects; + +/** + * @author zh + * @Date 2021/8/17 + * 关闭资源工具类 + */ +public class CloseUtil { + + public static void close(AutoCloseable... closeables) { + try { + if (Objects.isNull(closeables) || closeables.length < 1) { + return; + } + for (AutoCloseable closeable : closeables) { + if (Objects.nonNull(closeable)) { + closeable.close(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/since/emp/util/ConvertUtil.java b/src/com/since/emp/util/ConvertUtil.java new file mode 100644 index 0000000..346c83f --- /dev/null +++ b/src/com/since/emp/util/ConvertUtil.java @@ -0,0 +1,87 @@ +package com.since.emp.util; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: 转换类工具 + * @ClassName: ConvertUtil + * @author Lewis + * @date 2021-3-11 15:33:15 + * + */ +public class ConvertUtil { + private static final Logger logger = (Logger) LogManager.getLogger(ConvertUtil.class); + /** + * @Description:对象转Map + * @Title: object2Map + * @author Lewis + * @param obj + * @return Map + * @throws Exception + */ + public Map object2Map(Object obj) throws Exception { + Map map = new HashMap<>(); + if (obj == null) { + return map; + } + Class clazz = obj.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + map.put(field.getName(), field.get(obj)); + } + return map; + } + /** + * 对象转byte + * @param obj + * @return + */ + public byte[] ObjectToByte(Object obj) { + byte[] bytes = null; + try { + // object to bytearray + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + ObjectOutputStream oo = new ObjectOutputStream(bo); + oo.writeObject(obj); + + bytes = bo.toByteArray(); + + bo.close(); + oo.close(); + } catch (Exception e) { + logger.info(ConvertUtil.class,e); + } + return bytes; + } + + /** + * byte转对象 + * @param bytes + * @return + */ + public Object ByteToObject(byte[] bytes) { + Object obj = null; + try { + // bytearray to object + ByteArrayInputStream bi = new ByteArrayInputStream(bytes); + ObjectInputStream oi = new ObjectInputStream(bi); + + obj = oi.readObject(); + bi.close(); + oi.close(); + } catch (Exception e) { + logger.info(ConvertUtil.class,e); + } + return obj; + } +} diff --git a/src/com/since/emp/util/DouDianSignUtil.java b/src/com/since/emp/util/DouDianSignUtil.java new file mode 100644 index 0000000..807c305 --- /dev/null +++ b/src/com/since/emp/util/DouDianSignUtil.java @@ -0,0 +1,195 @@ +package com.since.emp.util; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.Iterator; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Logger; + + +import com.google.gson.Gson; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.google.gson.GsonBuilder; + + +public class DouDianSignUtil { + private static final Logger logger = (Logger) LogManager.getLogger(DouDianSignUtil.class); + + /** + * @param params + * @return 排序好的参数字符串 + * @throws Exception + * @Description: 对接口《业务级》入参根据首字母进行排序,入参为对象的json字符串 + * @Title: sortParams + * @author Lewis + */ + public String sortParams(Map params) throws Exception { + SortedMap map = new TreeMap(); + params.forEach((key, value) -> { + map.put(key, value); + }); + return new Gson().toJson(map); + } + + /** + * @param plainText + * @return md5字符串 + * @throws Exception + * @Description:生成md5字符串 + * @Title: stringToMD5 + * @author Lewis + */ + public String stringToMD5(String plainText) throws Exception { + byte[] secretBytes = null; + try { + secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes("UTF-8")); + + StringBuilder md5code = new StringBuilder(new BigInteger(1, secretBytes).toString(16)); + while (md5code.length() < 32) { + md5code.insert(0, "0"); + } + return md5code.toString(); + } catch (Exception e) { + logger.error(this, e); + throw e; + } + } + + /** + * + * @param params + * @return 排序好的参数 + * @throws Exception + * @Description: 生成参数sign的字符串 + * @Title: buildSignString + * @author Lewis + */ + public String buildSignString(String appSecret, Map params) throws Exception { + + if (params == null || params.size() == 0) { + return ""; + } + + List keys = new ArrayList<>(); + for (Map.Entry entry : params.entrySet()) { + String key = entry.getKey(); + if ("sign".equals(entry.getKey()) || "access_token".equals(entry.getKey())) { + continue; + } + if (StringUtils.isEmpty((String) params.get(key))) { + continue; + } + keys.add(key); + } + + Collections.sort(keys); + + StringBuilder buf = new StringBuilder(); + buf.append(appSecret); + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = (String) params.get(key); + buf.append(key).append(value); + } + buf.append(appSecret); + return buf.toString(); + } + + /** + * + * @param params + * @return 排序好的参数 + * @throws Exception + * @Description: 生成请求参数的字符串 + * @Title: buildSignString + * @author Lewis + */ + public String buildRequestString(Map params) throws Exception { + if (params == null || params.size() == 0) { + return ""; + } + StringBuilder buf = new StringBuilder(); + params.forEach((k, v) -> { + buf.append(k).append("=").append(v).append("&"); + }); + //删除buf最后一个& + return buf.substring(0, buf.length() - 1); + } + + /** + * @param jsonStr + * @return 封装在treemap的有序参数 + * @throws Exception + * @Description: JSON转顺序排序的Map + * @Title: jsonToMap + * @author Lewis + */ + public Map jsonToMap(String jsonStr) throws Exception { + Map treeMap = new TreeMap(); + JSONObject json = JSONObject.parseObject(jsonStr, Feature.OrderedField);//Feature.OrderedField实现解析后保存不乱序 + Iterator keys = json.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + Object value = json.get(key); + //判断传入kay-value中是否含有""或null + if (json.get(key) == null || value == null || value.toString().length() == 0) { + //当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-value + continue; + } + // 判断是否为JSONArray(json数组) + if (value instanceof JSONArray) { + JSONArray jsonArray = (JSONArray) value; + List arrayList = new ArrayList<>(); + for (Object object : jsonArray) { + // 判断是否为JSONObject,如果是 转化成TreeMap + if (object instanceof JSONObject) { + object = jsonToMap(object.toString()); + } + arrayList.add(object); + } + treeMap.put(key, arrayList); + } else { + //判断该JSON中是否嵌套JSON + boolean flag = isJSONValid(value.toString()); + if (flag) { + //若嵌套json了,通过递归再对嵌套的json(即子json)进行排序 + value = jsonToMap(value.toString()); + } + // 其他基础类型直接放入treeMap + // JSONObject可进行再次解析转换 + treeMap.put(key, value); + } + } + return treeMap; + } + + /** + * @param json + * @return 是JSON返回true, 否则false + * @Description: 校验是否是JSON字符串 + * @Title: isJSONValid + * @author Lewis + */ + public boolean isJSONValid(String json) { + try { + JSONObject.parseObject(json); + } catch (JSONException ex) { + return false; + } catch (Exception ex) { + return false; + } + return true; + } +} diff --git a/src/com/since/emp/util/EmojiFilterUtil.java b/src/com/since/emp/util/EmojiFilterUtil.java new file mode 100644 index 0000000..c228ad2 --- /dev/null +++ b/src/com/since/emp/util/EmojiFilterUtil.java @@ -0,0 +1,75 @@ +package com.since.emp.util; + +import org.apache.commons.lang.StringUtils; + +/** + * @description 检验字符串是否包含emoji表情,如果包含则移除 + * @author Lewis + * @file_name EmojiFilterUtil.java + * @date 2019年1月9日 + */ +public class EmojiFilterUtil { + /** + * 检测是否有emoji表情 + * @param source + * @return + */ + public static boolean containsEmoji(String source) { + int len = source.length(); + for (int i = 0; i < len; i++) { + char codePoint = source.charAt(i); + if (!isEmojiCharacter(codePoint)) { + //如果不能匹配,则该字符是Emoji表情 + return true; + } + } + return false; + + } + /** + * 判断是否是Emoji + * @param codePoint 比较的单个字符 + * @return + */ + public static boolean isEmojiCharacter(char codePoint) { + return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) + || (codePoint == 0xD) + || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) + || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) + || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)); + } + + /** + * 过滤emoji 或者 其他非文字类型的字符 + * + * @param source + * @return + */ + public static String filterEmoji(String source) { + if (StringUtils.isBlank(source)) { + return source; + } + StringBuilder buf = null; + int len = source.length(); + for (int i = 0; i < len; i++) { + char codePoint = source.charAt(i); + if (isEmojiCharacter(codePoint)) { + if (buf == null) { + buf = new StringBuilder(source.length()); + } + buf.append(codePoint); + } + } + if (buf == null) { + return ""; + } else { + if (buf.length() == len) { + buf = null; + return source; + } else { + return buf.toString(); + } + } + } + +} diff --git a/src/com/since/emp/util/ExcelCopyUtil.java b/src/com/since/emp/util/ExcelCopyUtil.java new file mode 100644 index 0000000..be16b0b --- /dev/null +++ b/src/com/since/emp/util/ExcelCopyUtil.java @@ -0,0 +1,94 @@ +package com.since.emp.util; + +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class ExcelCopyUtil { + @SuppressWarnings("incomplete-switch") + public void copyTemplate(String exTemplateFilePath, int exTemplateFilePathRow, String targetFilePath, String msg) + throws Exception { + // 配置原始表的数据源 + XSSFWorkbook exWorkbook = new XSSFWorkbook(new FileInputStream(exTemplateFilePath)); + // 读取原始表第一个Sheet + XSSFSheet exSheet = exWorkbook.getSheetAt(0); + // 读取原始表的列数,以第二列的长度为准 + short exColumnNum = exSheet.getRow(1).getLastCellNum(); + // 配置目标表的数据源 + XSSFWorkbook targetWorkbook = new XSSFWorkbook(new FileInputStream(targetFilePath)); + // 读取目标表第一个Sheet + XSSFSheet targetSheet = targetWorkbook.getSheetAt(0); + // 读取目标表的行数 + int targetRowNum = targetSheet.getLastRowNum(); + + // 读取原始表指定的行 +// Row exRow = exSheet.getRow(exTemplateFilePathRow); + // 在目标表创建新的一行 + targetSheet.createRow(targetRowNum + 1); + + // 列加一,用于存放msg信息 + ++exColumnNum; + for (int i = 0; i < exColumnNum; i++) { + // 最后一行前面的单元格都是订单信息,最后一个单元格是错误信息 + XSSFCell exCell = exWorkbook.getSheetAt(0).getRow(exTemplateFilePathRow).getCell(i); + // 创建单元格 + targetSheet.getRow(targetRowNum + 1).createCell(i); + XSSFCell targetCell = targetSheet.getRow(targetRowNum + 1).getCell(i); +// Cell exCell = exRow.getCell(i); + // 设置单元格style +// CellStyle exCellStyle = exCell.getCellStyle(); +// targetSheet.getRow(targetRowNum + 1).getCell(i).setCellStyle(exCellStyle); + // 设置单元格type + targetCell.getCellStyle().setLocked(false); + if (i < exColumnNum - 1) { + try { + exCell.getCellTypeEnum(); + } catch (NullPointerException e) { + continue; + } + switch (exCell.getCellTypeEnum()) { + case BOOLEAN: + targetCell.setCellValue(exCell.getBooleanCellValue()); + break; + case ERROR: + targetCell.setCellErrorValue(exCell.getErrorCellValue()); + break; + case FORMULA: + targetCell.setCellFormula(parseFormula(exCell.getCellFormula())); + break; + case NUMERIC: + targetCell.setCellValue(exCell.getNumericCellValue()); + break; + case STRING: + targetCell.setCellValue(exCell.getRichStringCellValue()); + break; + } + } else { + targetCell.setCellValue(msg); + } + + FileOutputStream fos = new FileOutputStream(targetFilePath); + targetWorkbook.write(fos); + fos.close(); + } + + } + + private String parseFormula(String pPOIFormula) { + final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$ + StringBuffer result = null; + int index; + result = new StringBuffer(); + index = pPOIFormula.indexOf(cstReplaceString); + if (index >= 0) { + result.append(pPOIFormula.substring(0, index)); + result.append(pPOIFormula.substring(index + cstReplaceString.length())); + } else { + result.append(pPOIFormula); + } + return result.toString(); + } +} diff --git a/src/com/since/emp/util/HttpRequest.java b/src/com/since/emp/util/HttpRequest.java new file mode 100644 index 0000000..70ddd76 --- /dev/null +++ b/src/com/since/emp/util/HttpRequest.java @@ -0,0 +1,285 @@ +package com.since.emp.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLConnection; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.since.emp.base.HttpRequestCode; + +/** + * http请求,除了传url和params,还需要指定content-Type的类型 + * @author Lewis + *2018年10月31日 + *HttpRequest + */ +public class HttpRequest { + private static final Logger logger =LogManager.getLogger(HttpRequest.class); + + public HttpRequest() { + + } + + /** + * http get请求方法 + */ + public String sendGet(String url, String param, String logTitle) { + String result = ""; + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + URL realUrl = new URL(urlNameString); + // 打开和URL之间的连接 + URLConnection connection = realUrl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + // 连接超时时长30秒 + connection.setConnectTimeout(30 * 1000); + // 响应超时时长30秒 + connection.setReadTimeout(30 * 1000); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 建立实际的连接 + connection.connect(); + // 获取所有响应头字段 + // Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段 + // for (String key : map.keySet()) { + // System.out.println(key + "--->" + map.get(key)); + // } + // 定义 BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + + } catch (Exception e) { + logger.info("【" + logTitle + "】发送GET请求出现异常!" + e); + logger.error(this, e); + } + // 使用finally块来关闭输入流 + finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e2) { + logger.error(this, e2); + } + } + return result; + } + + /** + * 向指定 URL 发送POST方法的请求 + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public String sendPost(String url, String params, int status, String logTitle) throws Exception { + + PrintWriter out = null; + BufferedReader in = null; + String result = ""; + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 连接超时时间五秒 + conn.setConnectTimeout(30 * 1000); + // 响应超时时长五秒 + conn.setReadTimeout(30 * 1000); + // conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + // conn.setRequestProperty("Content-Type", "form-data;charset=utf-8"); + if (HttpRequestCode.REQUEST_INFO.containsKey(status)) { + conn.setRequestProperty("Content-Type", HttpRequestCode.REQUEST_INFO.get(status)); + } + + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 1.获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 2.中文有乱码的需要将PrintWriter改为如下 + // out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8") + // 发送请求参数 + out.print(params); + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + } catch (Exception e) { + logger.info("【" + logTitle + "】发送POST请求出现异常!" + e); + logger.error(this, e); + } + // 使用finally块来关闭输出流、输入流 + finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return result; + + } + + /** + * + * @title: getOrderRequest + * @description: 调用接口,获取订单 + * @param url + * @return response_json + * @throws HttpException + * @throws IOException + */ + public String getOrderRequest(String url) { + String response = ""; + InputStream resStream = null; + BufferedReader br = null; + try { + HttpMethod getMethod = new GetMethod(url); + HttpClient httpClient = new HttpClient(); + httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000); + httpClient.getHttpConnectionManager().getParams().setSoTimeout(30000); + httpClient.executeMethod(getMethod); + resStream = getMethod.getResponseBodyAsStream(); + br = new BufferedReader(new InputStreamReader(resStream, "utf-8")); + StringBuffer resBuffer = new StringBuffer(); + String resTemp = ""; + while ((resTemp = br.readLine()) != null) { + resBuffer.append(resTemp); + } + response = resBuffer.toString(); + } catch (HttpException e) { + logger.error(this, e); + } catch (UnsupportedEncodingException e) { + logger.error(this, e); + } catch (IOException e) { + logger.error(this, e); + } finally { + try { + if (resStream != null) { + resStream.close(); + } + } catch (Exception e2) { + logger.error(this, e2); + } + try { + if (br != null) { + br.close(); + } + } catch (Exception e2) { + logger.error(this, e2); + } + + } + return response; + } + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + logger.error(e); + } finally { + try { + response.close(); + } catch (IOException e) { + logger.error(e); + } + } + return resultString; + } + + /** + * http get请求方法 + */ + public String xiaoHongShuSendGet(String url, String timestamp, String app_key, String signStr) { + BufferedReader in = null; + StringBuffer sbuffer = new StringBuffer(""); + try { +// String urlNameString = url + "?" + param; + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection connection = realUrl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + // 连接超时时长30秒 + connection.setConnectTimeout(30 * 1000); + // 响应超时时长30秒 + connection.setReadTimeout(30 * 1000); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.setRequestProperty("app-key", app_key); + connection.setRequestProperty("timestamp", timestamp); + connection.setRequestProperty("sign", signStr); + // 建立实际的连接 + connection.connect(); + // 定义 BufferedReader输入流来读取URL的响应 + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + sbuffer.append(line); + } + + } catch (Exception e) { + logger.error(this, e); + } + // 使用finally块来关闭输入流 + finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception e2) { + logger.error(this, e2); + } + } + return sbuffer.toString(); + } + +} diff --git a/src/com/since/emp/util/JsonUtil.java b/src/com/since/emp/util/JsonUtil.java new file mode 100644 index 0000000..350789a --- /dev/null +++ b/src/com/since/emp/util/JsonUtil.java @@ -0,0 +1,71 @@ +package com.since.emp.util; + +import java.util.List; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * + * @className JsonUtil.java + * @author Sunshine + * @description JSON工具类 + * @createTime 2019年2月17日 下午5:59:22 + */ +public class JsonUtil { + // 定义jackson对象 + private static final ObjectMapper MAPPER = new ObjectMapper(); + + /** + * + * @description 将对象转换成json字符串。 + * @param data + * @return + */ + public static String objectToJson(Object data) { + try { + String string = MAPPER.writeValueAsString(data); + return string; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * + * @description 将json结果集转化为对象 + * @param jsonData + * @param beanType + * @return + */ + public static T jsonToPojo(String jsonData, Class beanType) { + try { + T t = MAPPER.readValue(jsonData, beanType); + return t; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * + * @description 将json数据转换成pojo对象list + * @param jsonData + * @param beanType + * @return + */ + public static List jsonToList(String jsonData, Class beanType) { + JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); + try { + List list = MAPPER.readValue(jsonData, javaType); + return list; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/com/since/emp/util/MD5Util.java b/src/com/since/emp/util/MD5Util.java new file mode 100644 index 0000000..9a6647a --- /dev/null +++ b/src/com/since/emp/util/MD5Util.java @@ -0,0 +1,42 @@ +package com.since.emp.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class MD5Util { + private static final Logger logger = LogManager.getLogger(MD5Util.class); + + /** + * 32位MD5加密 + * + * @param sourceStr + * @return + */ + public String MD5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes()); + byte b[] = md.digest(); + int i; + StringBuffer buf = new StringBuffer(""); + for (int offset = 0; offset < b.length; offset++) { + i = b[offset]; + if (i < 0) + i += 256; + if (i < 16) + buf.append("0"); + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (NoSuchAlgorithmException e) { + logger.error(this, e); + } catch (Exception e) { + logger.error(this, e); + } + return result; + } +} diff --git a/src/com/since/emp/util/ParseAddressUtil.java b/src/com/since/emp/util/ParseAddressUtil.java new file mode 100644 index 0000000..1c59ed1 --- /dev/null +++ b/src/com/since/emp/util/ParseAddressUtil.java @@ -0,0 +1,756 @@ +package com.since.emp.util; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.DbPoolConnection; + +/** + * @Description: 通过地址字符串解析出省市区和详细地址 同时,可以解析出电话 + * @ClassName: ParseAddressUtil + * @author Lewis + * @date 2021-8-25 17:58:14 + * + */ +public class ParseAddressUtil { + + private static final Logger logger = LogManager.getLogger(ParseAddressUtil.class); + + /** + * + * @Title: getTextRecognitionInfo + * @Description: 通过字符串解析详细地址 + * @author Lewis + * @param text + * @return Map + * @throws Exception + * @throws Exception + */ + public static Map getTextRecognitionInfo(String text) throws Exception { + // 移除所有符号 + String details = text.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "") + .trim(); + if (details.startsWith("中国")) { + details = details.replaceFirst("中国", ""); + } + // 直接完整匹配省市区 + Map row = addressResolution(details); + // 匹配文本中的电话号码 + String phone = ""; + Pattern phoneReg = Pattern.compile("\\d{7,17}"); + Matcher phoneMatcher = phoneReg.matcher(details); + while (phoneMatcher.find()) { + phone = phoneMatcher.group(); + } + phoneReg = Pattern.compile("1[345678]\\d{9}"); + phoneMatcher = phoneReg.matcher(details); + while (phoneMatcher.find()) { + phone = phoneMatcher.group(); + details = details.replaceFirst(phone, ""); + } + details = details.replaceFirst(phone, ""); + + // 解析省 + int provinceLength = 0; + String provinceTemp = ""; + // 可以完整匹配出来地址 + if (row.size() == 4 && (row.get("city") != null && !"市".equals(row.get("city"))) + && (row.get("county") != null && !"".equals(row.get("county")))) { + return row; + } else { + // 查询所有的省 + List provinceList = getprovice(); + for (String province : provinceList) { + String tem; + if (province.contains("省")) { + tem = province.replace("省", ""); + } else if (province.contains("市")) { + tem = province.replace("市", ""); + } else if (province.contains("壮族自治区")) { + tem = province.replace("壮族自治区", ""); + } else if (province.contains("维吾尔自治区")) { + tem = province.replace("维吾尔自治区", ""); + } else if (province.contains("回族自治区")) { + tem = province.replace("回族自治区", ""); + } else if (province.contains("特别行政区")) { + tem = province.replace("特别行政区", ""); + } else if (province.contains("特别行政区")) { + tem = province.replace("特别行政区", ""); + } else if (province.contains("自治区")) { + tem = province.replace("自治区", ""); + } else { + tem = province; + } + if (details.startsWith(tem)) { + if (tem.length() > provinceLength) { + provinceLength = tem.length(); + provinceTemp = tem; + row.put("province", province); + break; + } + } + } + } + String name = details.substring(0, details.indexOf(provinceTemp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + int orLen = details.length(); + String province = row.get("province") == null ? "" : row.get("province"); + if (details.indexOf(province) < 8) { + details = details.replaceFirst(row.get("province") == null ? "" : row.get("province"), ""); + } + + int newLen = details.length(); + if (orLen == newLen) { + details = details.replaceFirst(provinceTemp, ""); + } + + int cityLength = 0; + String cityTemp = ""; + // 解析市 + if (row.get("province") != null) { + List cityList = getcity(row.get("province")); + for (String city : cityList) { + String tem; + if (city.contains("市")) { + tem = city.replace("市", ""); + } else if (city.contains("自治县")) { + tem = city.replace("自治县", ""); + } else if (city.contains("县")) { + tem = city.replace("县", ""); + } else if (city.contains("自治洲")) { + tem = city.replace("自治洲", ""); + } else if (city.contains("地区")) { + tem = city.replace("地区", ""); + } else if (city.contains("盟")) { + tem = city.replace("盟", ""); + } else { + tem = city; + } + + if (details.startsWith(tem)) { + if (tem.length() > cityLength) { + cityLength = tem.length(); + cityTemp = tem; + row.put("city", city); + break; + } + } + + } + } else { + List cityList = getcity(); + for (String city : cityList) { + String tem; + if (city.contains("市")) { + tem = city.replace("市", ""); + } else if (city.contains("自治县")) { + tem = city.replace("自治县", ""); + } else if (city.contains("自治洲")) { + tem = city.replace("自治洲", ""); + } else if (city.contains("县")) { + tem = city.replace("县", ""); + } else if (city.contains("盟")) { + tem = city.replace("盟", ""); + } else if (city.contains("地区")) { + tem = city.replace("地区", ""); + } else { + tem = city; + } + + if (details.startsWith(tem)) { + if (tem.length() > cityLength) { + cityLength = tem.length(); + cityTemp = tem; +// cityCode = city.getRegionId(); +// region.setCity(city.getRegionName()); +// region.setProvinceCode(city.getRegionParentId()); +// region.setProvince(regionMapper.selectByPrimaryKey(city.getRegionParentId()).getRegionName()); + row.put("city", city); + row.put("province", getProvinceByCityName(city)); + } + } + + } + + } + + name = details.substring(0, details.indexOf(cityTemp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + orLen = details.length(); + details = details.replaceFirst(row.get("city") == null ? "" : row.get("city"), ""); + newLen = details.length(); + if (newLen == orLen) { + details = details.replaceFirst(cityTemp, ""); + } + + String countyTmp = ""; + String specialCity = row.get("city") == null ? "" : row.get("city"); + if ((!"".equals(specialCity)) && ("中山市".indexOf(specialCity) > -1 || "东莞市".indexOf(specialCity) > -1)) { + row.put("county", "城区"); + } else { + // 解析区 + int countyLength = 0; + + if (row.get("city") != null) { + List countyList = getCountyByCityName(row.get("city")); + for (String county : countyList) { + String tem; + if (county.contains("市")) { + tem = county.replace("市", ""); + } else if (county.contains("区")) { + tem = county.replace("区", ""); + } else if (county.contains("县")) { + tem = county.replace("县", ""); + } else if (county.contains("镇")) { + tem = county.replace("镇", ""); + } else if (county.contains("旗")) { + tem = county.replace("旗", ""); + } else if (county.contains("街道")) { + tem = county.replace("街道", ""); + } else if (county.contains("乡")) { + tem = county.replace("乡", ""); + } else if (county.contains("农场")) { + tem = county.replace("农场", ""); + } else if (county.contains("兵团")) { + tem = county.replace("兵团", ""); + } else { + tem = county; + } + + if (details.startsWith(tem)) { + if (tem.length() > countyLength) { + countyLength = tem.length(); + countyTmp = tem; +// region.setCounty(county.getRegionName()); + row.put("county", county); + } + } + + } + } else { + + List cityList = getcity(row.get("province")); + + for (String city : cityList) { + List countyList = getCountyByCityName(city); + + for (String county : countyList) { + String tem; + if (county.contains("市")) { + tem = county.replace("市", ""); + } else if (county.contains("区")) { + tem = county.replace("区", ""); + } else if (county.contains("县")) { + tem = county.replace("县", ""); + } else if (county.contains("镇")) { + tem = county.replace("镇", ""); + } else if (county.contains("旗")) { + tem = county.replace("旗", ""); + } else if (county.contains("街道")) { + tem = county.replace("街道", ""); + } else if (county.contains("乡")) { + tem = county.replace("乡", ""); + } else if (county.contains("农场")) { + tem = county.replace("农场", ""); + } else if (county.contains("兵团")) { + tem = county.replace("兵团", ""); + } else { + tem = county; + } + if (details.startsWith(tem)) { + if (tem.length() > countyLength) { + countyLength = tem.length(); + countyTmp = tem; +// region.setCity(city.getRegionName()); +// region.setCounty(county.getRegionName()); + row.put("city", city); + row.put("county", county); + } + } + } + + } + + } + + if (row.get("county") == null) { + row.put("county", ""); + } + } + + name = details.substring(0, details.indexOf(countyTmp)); +// data.put("name", name); + details = details.replaceFirst(name, ""); + orLen = details.length(); + details = details.replaceFirst(row.get("county") == null ? "" : row.get("county"), ""); + newLen = details.length(); + if (orLen == newLen) { + details = details.replaceFirst(countyTmp, ""); + } + row.put("detail", text); +// System.out.println("row:"+row); + if (row.size() == 4 && (row.get("city") != null && !"市".equals(row.get("city"))) + && (row.get("county") != null && !"".equals(row.get("county")))) { + return row; + } else { + return new HashMap(); + } + } + + /** + * @Description: 解析方法1,简单匹配,效率较高,但是解析成功率较低 + * @Title: addressResolution + * @author Lewis + * @param address + * @return map + */ + public static Map addressResolution(String address) { + String regex = "(?[^省]+^自治区|.*?自治区|.*?省|.*?行政区|.*?市)(?上海城区|北京城区|天津城区|重庆城区|重庆郊县|[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|香港岛|九龙|新界|澳门半岛|离岛|.*?市|.*?县)"; + String countyRegex = "(?121团炮台镇|井陉县|正定县|行唐县|灵寿县|高邑县|深泽县|赞皇县|无极县|平山县|元氏县|赵县|辛集市|晋州市|新乐市|滦县|滦南县|乐亭县|迁西县|玉田县|遵化市|迁安市|青龙满族自治县|昌黎县|卢龙县|临漳县|成安县|大名县|涉县|磁县|邱县|鸡泽县|广平县|馆陶县|魏县|曲周县|武安市|邢台县|临城县|内丘县|柏乡县|隆尧县|任县|南和县|宁晋县|巨鹿县|新河县|广宗县|平乡县|威县|清河县|临西县|南宫市|沙河市|涞水县|阜平县|定兴县|唐县|高阳县|容城县|涞源县|望都县|安新县|易县|曲阳县|蠡县|顺平县|博野县|雄县|涿州市|定州市|安国市|高碑店市|张北县|康保县|沽源县|尚义县|蔚县|阳原县|怀安县|怀来县|涿鹿县|赤城县|承德县|兴隆县|滦平县|隆化县|丰宁满族自治县|宽城满族自治县|围场满族蒙古族自治县|平泉市|沧县|青县|东光县|海兴县|盐山县|肃宁县|南皮县|吴桥县|献县|孟村回族自治县|泊头市|任丘市|黄骅市|河间市|固安县|永清县|香河县|大城县|文安县|大厂回族自治县|霸州市|三河市|枣强县|武邑县|武强县|饶阳县|安平县|故城县|景县|阜城县|深州市|清徐县|阳曲县|娄烦县|古交市|阳高县|天镇县|广灵县|灵丘县|浑源县|左云县|大同县|平定县|盂县|长治县|襄垣县|屯留县|平顺县|黎城县|壶关县|长子县|武乡县|沁县|沁源县|潞城市|沁水县|阳城县|陵川县|泽州县|高平市|山阴县|应县|右玉县|怀仁县|榆社县|左权县|和顺县|昔阳县|寿阳县|太谷县|祁县|平遥县|灵石县|介休市|临猗县|万荣县|闻喜县|稷山县|新绛县|绛县|垣曲县|夏县|平陆县|芮城县|永济市|河津市|定襄县|五台县|代县|繁峙县|宁武县|静乐县|神池县|五寨县|岢岚县|河曲县|保德县|偏关县|原平市|曲沃县|翼城县|襄汾县|洪洞县|古县|安泽县|浮山县|吉县|乡宁县|大宁县|隰县|永和县|蒲县|汾西县|侯马市|霍州市|文水县|交城县|兴县|临县|柳林县|石楼县|岚县|方山县|中阳县|交口县|孝义市|汾阳市|土默特左旗|托克托县|和林格尔县|清水河县|武川县|土默特右旗|固阳县|达尔罕茂明安联合旗|阿鲁科尔沁旗|巴林左旗|巴林右旗|林西县|克什克腾旗|翁牛特旗|喀喇沁旗|宁城县|敖汉旗|科尔沁左翼中旗|科尔沁左翼后旗|开鲁县|库伦旗|奈曼旗|扎鲁特旗|霍林郭勒市|达拉特旗|准格尔旗|鄂托克前旗|鄂托克旗|杭锦旗|乌审旗|伊金霍洛旗|阿荣旗|莫力达瓦达斡尔族自治旗|鄂伦春自治旗|鄂温克族自治旗|陈巴尔虎旗|新巴尔虎左旗|新巴尔虎右旗|满洲里市|牙克石市|扎兰屯市|额尔古纳市|根河市|五原县|磴口县|乌拉特前旗|乌拉特中旗|乌拉特后旗|杭锦后旗|卓资县|化德县|商都县|兴和县|凉城县|察哈尔右翼前旗|察哈尔右翼中旗|察哈尔右翼后旗|四子王旗|丰镇市|乌兰浩特市|阿尔山市|科尔沁右翼前旗|科尔沁右翼中旗|扎赉特旗|突泉县|二连浩特市|锡林浩特市|阿巴嘎旗|苏尼特左旗|苏尼特右旗|东乌珠穆沁旗|西乌珠穆沁旗|太仆寺旗|镶黄旗|正镶白旗|正蓝旗|多伦县|阿拉善左旗|阿拉善右旗|额济纳旗|康平县|法库县|新民市|长海县|瓦房店市|庄河市|台安县|岫岩满族自治县|海城市|抚顺县|新宾满族自治县|清原满族自治县|本溪满族自治县|桓仁满族自治县|宽甸满族自治县|东港市|凤城市|黑山县|义县|凌海市|北镇市|盖州市|大石桥市|阜新蒙古族自治县|彰武县|辽阳县|灯塔市|盘山县|铁岭县|西丰县|昌图县|调兵山市|开原市|朝阳县|建平县|喀喇沁左翼蒙古族自治县|北票市|凌源市|绥中县|建昌县|兴城市|农安县|榆树市|德惠市|永吉县|蛟河市|桦甸市|舒兰市|磐石市|梨树县|伊通满族自治县|公主岭市|双辽市|东丰县|东辽县|通化县|辉南县|柳河县|梅河口市|集安市|抚松县|靖宇县|长白朝鲜族自治县|临江市|前郭尔罗斯蒙古族自治县|长岭县|乾安县|扶余市|镇赉县|通榆县|洮南市|大安市|延吉市|图们市|敦化市|珲春市|龙井市|和龙市|汪清县|安图县|依兰县|方正县|宾县|巴彦县|木兰县|通河县|延寿县|尚志市|五常市|龙江县|依安县|泰来县|甘南县|富裕县|克山县|克东县|拜泉县|讷河市|鸡东县|虎林市|密山市|萝北县|绥滨县|集贤县|友谊县|宝清县|饶河县|肇州县|肇源县|林甸县|杜尔伯特蒙古族自治县|嘉荫县|铁力市|桦南县|桦川县|汤原县|同江市|富锦市|抚远市|勃利县|林口县|绥芬河市|海林市|宁安市|穆棱市|东宁市|嫩江县|逊克县|孙吴县|北安市|五大连池市|望奎县|兰西县|青冈县|庆安县|明水县|绥棱县|安达市|肇东市|海伦市|呼玛县|塔河县|漠河县|江阴市|宜兴市|丰县|沛县|睢宁县|新沂市|邳州市|溧阳市|常熟市|张家港市|昆山市|太仓市|海安县|如东县|启东市|如皋市|海门市|东海县|灌云县|灌南县|涟水县|盱眙县|金湖县|响水县|滨海县|阜宁县|射阳县|建湖县|东台市|宝应县|仪征市|高邮市|丹阳市|扬中市|句容市|兴化市|靖江市|泰兴市|沭阳县|泗阳县|泗洪县|桐庐县|淳安县|建德市|象山县|宁海县|余姚市|慈溪市|永嘉县|平阳县|苍南县|文成县|泰顺县|瑞安市|乐清市|嘉善县|海盐县|海宁市|平湖市|桐乡市|德清县|长兴县|安吉县|新昌县|诸暨市|嵊州市|武义县|浦江县|磐安县|兰溪市|义乌市|东阳市|永康市|常山县|开化县|龙游县|江山市|岱山县|嵊泗县|三门县|天台县|仙居县|温岭市|临海市|玉环市|青田县|缙云县|遂昌县|松阳县|云和县|庆元县|景宁畲族自治县|龙泉市|长丰县|肥东县|肥西县|庐江县|巢湖市|芜湖县|繁昌县|南陵县|无为县|怀远县|五河县|固镇县|凤台县|寿县|当涂县|含山县|和县|濉溪县|枞阳县|怀宁县|潜山县|太湖县|宿松县|望江县|岳西县|桐城市|歙县|休宁县|黟县|祁门县|来安县|全椒县|定远县|凤阳县|天长市|明光市|临泉县|太和县|阜南县|颍上县|界首市|砀山县|萧县|灵璧县|泗县|霍邱县|舒城县|金寨县|霍山县|涡阳县|蒙城县|利辛县|东至县|石台县|青阳县|郎溪县|广德县|泾县|绩溪县|旌德县|宁国市|闽侯县|连江县|罗源县|闽清县|永泰县|平潭县|福清市|仙游县|明溪县|清流县|宁化县|大田县|尤溪县|沙县|将乐县|泰宁县|建宁县|永安市|惠安县|安溪县|永春县|德化县|金门县|石狮市|晋江市|南安市|云霄县|漳浦县|诏安县|长泰县|东山县|南靖县|平和县|华安县|龙海市|顺昌县|浦城县|光泽县|松溪县|政和县|邵武市|武夷山市|建瓯市|长汀县|上杭县|武平县|连城县|漳平市|霞浦县|古田县|屏南县|寿宁县|周宁县|柘荣县|福安市|福鼎市|南昌县|安义县|进贤县|浮梁县|乐平市|莲花县|上栗县|芦溪县|武宁县|修水县|永修县|德安县|都昌县|湖口县|彭泽县|瑞昌市|共青城市|庐山市|分宜县|余江县|贵溪市|信丰县|大余县|上犹县|崇义县|安远县|龙南县|定南县|全南县|宁都县|于都县|兴国县|会昌县|寻乌县|石城县|瑞金市|吉安县|吉水县|峡江县|新干县|永丰县|泰和县|遂川县|万安县|安福县|永新县|井冈山市|奉新县|万载县|上高县|宜丰县|靖安县|铜鼓县|丰城市|樟树市|高安市|南城县|黎川县|南丰县|崇仁县|乐安县|宜黄县|金溪县|资溪县|广昌县|玉山县|铅山县|横峰县|弋阳县|余干县|鄱阳县|万年县|婺源县|德兴市|平阴县|济阳县|商河县|胶州市|平度市|莱西市|桓台县|高青县|沂源县|滕州市|利津县|广饶县|长岛县|龙口市|莱阳市|莱州市|蓬莱市|招远市|栖霞市|海阳市|临朐县|昌乐县|青州市|诸城市|寿光市|安丘市|高密市|昌邑市|微山县|鱼台县|金乡县|嘉祥县|汶上县|泗水县|梁山县|曲阜市|邹城市|宁阳县|东平县|新泰市|肥城市|荣成市|乳山市|五莲县|莒县|沂南县|郯城县|沂水县|兰陵县|费县|平邑县|莒南县|蒙阴县|临沭县|宁津县|庆云县|临邑县|齐河县|平原县|夏津县|武城县|乐陵市|禹城市|阳谷县|莘县|茌平县|东阿县|冠县|高唐县|临清市|惠民县|阳信县|无棣县|博兴县|邹平县|曹县|单县|成武县|巨野县|郓城县|鄄城县|东明县|中牟县|巩义市|荥阳市|新密市|新郑市|登封市|杞县|通许县|尉氏县|兰考县|孟津县|新安县|栾川县|嵩县|汝阳县|宜阳县|洛宁县|伊川县|偃师市|宝丰县|叶县|鲁山县|郏县|舞钢市|汝州市|安阳县|汤阴县|滑县|内黄县|林州市|浚县|淇县|新乡县|获嘉县|原阳县|延津县|封丘县|长垣县|卫辉市|辉县市|修武县|博爱县|武陟县|温县|沁阳市|孟州市|清丰县|南乐县|范县|台前县|濮阳县|鄢陵县|襄城县|禹州市|长葛市|舞阳县|临颍县|渑池县|卢氏县|义马市|灵宝市|南召县|方城县|西峡县|镇平县|内乡县|淅川县|社旗县|唐河县|新野县|桐柏县|邓州市|民权县|睢县|宁陵县|柘城县|虞城县|夏邑县|永城市|罗山县|光山县|新县|商城县|固始县|潢川县|淮滨县|息县|扶沟县|西华县|商水县|沈丘县|郸城县|淮阳县|太康县|鹿邑县|项城市|西平县|上蔡县|平舆县|正阳县|确山县|泌阳县|汝南县|遂平县|新蔡县|阳新县|大冶市|郧西县|竹山县|竹溪县|房县|丹江口市|远安县|兴山县|秭归县|长阳土家族自治县|五峰土家族自治县|宜都市|当阳市|枝江市|南漳县|谷城县|保康县|老河口市|枣阳市|宜城市|京山县|沙洋县|钟祥市|孝昌县|大悟县|云梦县|应城市|安陆市|汉川市|公安县|监利县|江陵县|石首市|洪湖市|松滋市|团风县|红安县|罗田县|英山县|浠水县|蕲春县|黄梅县|麻城市|武穴市|嘉鱼县|通城县|崇阳县|通山县|赤壁市|随县|广水市|恩施市|利川市|建始县|巴东县|宣恩县|咸丰县|来凤县|鹤峰县|长沙县|浏阳市|宁乡市|宁乡县|株洲县|攸县|茶陵县|炎陵县|醴陵市|湘潭县|湘乡市|韶山市|衡阳县|衡南县|衡山县|衡东县|祁东县|耒阳市|常宁市|邵东县|新邵县|邵阳县|隆回县|洞口县|绥宁县|新宁县|城步苗族自治县|武冈市|岳阳县|华容县|湘阴县|平江县|汨罗市|临湘市|安乡县|汉寿县|澧县|临澧县|桃源县|石门县|津市市|慈利县|桑植县|南县|桃江县|安化县|沅江市|桂阳县|宜章县|永兴县|嘉禾县|临武县|汝城县|桂东县|安仁县|资兴市|祁阳县|东安县|双牌县|道县|江永县|宁远县|蓝山县|新田县|江华瑶族自治县|中方县|沅陵县|辰溪县|溆浦县|会同县|麻阳苗族自治县|新晃侗族自治县|芷江侗族自治县|靖州苗族侗族自治县|通道侗族自治县|洪江市|双峰县|新化县|冷水江市|涟源市|吉首市|泸溪县|凤凰县|花垣县|保靖县|古丈县|永顺县|龙山县|始兴县|仁化县|翁源县|乳源瑶族自治县|新丰县|乐昌市|南雄市|澳门大学横琴校区(由澳门管辖)|南澳县|台山市|开平市|鹤山市|恩平市|遂溪县|徐闻县|廉江市|雷州市|吴川市|高州市|化州市|信宜市|广宁县|怀集县|封开县|德庆县|四会市|博罗县|惠东县|龙门县|大埔县|丰顺县|五华县|平远县|蕉岭县|兴宁市|海丰县|陆河县|陆丰市|紫金县|龙川县|连平县|和平县|东源县|阳西县|阳春市|佛冈县|阳山县|连山壮族瑶族自治县|连南瑶族自治县|英德市|连州市|饶平县|揭西县|惠来县|普宁市|新兴县|郁南县|罗定市|隆安县|马山县|上林县|宾阳县|横县|柳城县|鹿寨县|融安县|融水苗族自治县|三江侗族自治县|阳朔县|灵川县|全州县|兴安县|永福县|灌阳县|龙胜各族自治县|资源县|平乐县|荔浦县|恭城瑶族自治县|苍梧县|藤县|蒙山县|岑溪市|合浦县|上思县|东兴市|灵山县|浦北县|平南县|桂平市|容县|陆川县|博白县|兴业县|北流市|田东县|平果县|德保县|那坡县|凌云县|乐业县|田林县|西林县|隆林各族自治县|靖西市|昭平县|钟山县|富川瑶族自治县|南丹县|天峨县|凤山县|东兰县|罗城仫佬族自治县|环江毛南族自治县|巴马瑶族自治县|都安瑶族自治县|大化瑶族自治县|忻城县|象州县|武宣县|金秀瑶族自治县|合山市|扶绥县|宁明县|龙州县|大新县|天等县|凭祥市|西沙群岛|南沙群岛|中沙群岛的岛礁及其海域|城口县|丰都县|垫江县|忠县|云阳县|奉节县|巫山县|巫溪县|石柱土家族自治县|秀山土家族苗族自治县|酉阳土家族苗族自治县|彭水苗族土家族自治县|金堂县|大邑县|蒲江县|新津县|都江堰市|彭州市|邛崃市|崇州市|简阳市|荣县|富顺县|米易县|盐边县|泸县|合江县|叙永县|古蔺县|中江县|广汉市|什邡市|绵竹市|三台县|盐亭县|梓潼县|北川羌族自治县|平武县|江油市|旺苍县|青川县|剑阁县|苍溪县|蓬溪县|射洪县|大英县|威远县|资中县|隆昌市|犍为县|井研县|夹江县|沐川县|峨边彝族自治县|马边彝族自治县|峨眉山市|南部县|营山县|蓬安县|仪陇县|西充县|阆中市|仁寿县|洪雅县|丹棱县|青神县|宜宾县|江安县|长宁县|高县|珙县|筠连县|兴文县|屏山县|岳池县|武胜县|邻水县|华蓥市|宣汉县|开江县|大竹县|渠县|万源市|荥经县|汉源县|石棉县|天全县|芦山县|宝兴县|通江县|南江县|平昌县|安岳县|乐至县|马尔康市|汶川县|理县|茂县|松潘县|九寨沟市|金川县|小金县|黑水县|壤塘县|阿坝县|若尔盖县|红原县|康定市|泸定县|丹巴县|九龙县|雅江县|道孚县|炉霍县|甘孜县|新龙县|德格县|白玉县|石渠县|色达县|理塘县|巴塘县|乡城县|稻城县|得荣县|西昌市|木里藏族自治县|盐源县|德昌县|会理县|会东县|宁南县|普格县|布拖县|金阳县|昭觉县|喜德县|冕宁县|越西县|甘洛县|美姑县|雷波县|开阳县|息烽县|修文县|清镇市|水城县|盘州市|桐梓县|绥阳县|正安县|道真仡佬族苗族自治县|务川仡佬族苗族自治县|凤冈县|湄潭县|余庆县|习水县|赤水市|仁怀市|普定县|镇宁布依族苗族自治县|关岭布依族苗族自治县|紫云苗族布依族自治县|大方县|黔西县|金沙县|织金县|纳雍县|威宁彝族回族苗族自治县|赫章县|江口县|玉屏侗族自治县|石阡县|思南县|印江土家族苗族自治县|德江县|沿河土家族自治县|松桃苗族自治县|兴义市|兴仁县|普安县|晴隆县|贞丰县|望谟县|册亨县|安龙县|凯里市|黄平县|施秉县|三穗县|镇远县|岑巩县|天柱县|锦屏县|剑河县|台江县|黎平县|榕江县|从江县|雷山县|麻江县|丹寨县|都匀市|福泉市|荔波县|贵定县|瓮安县|独山县|平塘县|罗甸县|长顺县|龙里县|惠水县|三都水族自治县|富民县|宜良县|石林彝族自治县|嵩明县|禄劝彝族苗族自治县|寻甸回族彝族自治县|安宁市|马龙县|陆良县|师宗县|罗平县|富源县|会泽县|宣威市|澄江县|通海县|华宁县|易门县|峨山彝族自治县|新平彝族傣族自治县|元江哈尼族彝族傣族自治县|施甸县|龙陵县|昌宁县|腾冲市|鲁甸县|巧家县|盐津县|大关县|永善县|绥江县|镇雄县|彝良县|威信县|水富县|玉龙纳西族自治县|永胜县|华坪县|宁蒗彝族自治县|宁洱哈尼族彝族自治县|墨江哈尼族自治县|景东彝族自治县|景谷傣族彝族自治县|镇沅彝族哈尼族拉祜族自治县|江城哈尼族彝族自治县|孟连傣族拉祜族佤族自治县|澜沧拉祜族自治县|西盟佤族自治县|凤庆县|云县|永德县|镇康县|双江拉祜族佤族布朗族傣族自治县|耿马傣族佤族自治县|沧源佤族自治县|楚雄市|双柏县|牟定县|南华县|姚安县|大姚县|永仁县|元谋县|武定县|禄丰县|个旧市|开远市|蒙自市|弥勒市|屏边苗族自治县|建水县|石屏县|泸西县|元阳县|红河县|金平苗族瑶族傣族自治县|绿春县|河口瑶族自治县|文山市|砚山县|西畴县|麻栗坡县|马关县|丘北县|广南县|富宁县|景洪市|勐海县|勐腊县|大理市|漾濞彝族自治县|祥云县|宾川县|弥渡县|南涧彝族自治县|巍山彝族回族自治县|永平县|云龙县|洱源县|剑川县|鹤庆县|瑞丽市|芒市|梁河县|盈江县|陇川县|泸水市|福贡县|贡山独龙族怒族自治县|兰坪白族普米族自治县|香格里拉市|德钦县|维西傈僳族自治县|林周县|当雄县|尼木县|曲水县|墨竹工卡县|南木林县|江孜县|定日县|萨迦县|拉孜县|昂仁县|谢通门县|白朗县|仁布县|康马县|定结县|仲巴县|亚东县|吉隆县|聂拉木县|萨嘎县|岗巴县|江达县|贡觉县|类乌齐县|丁青县|察雅县|八宿县|左贡县|芒康县|洛隆县|边坝县|工布江达县|米林县|墨脱县|波密县|察隅县|朗县|扎囊县|贡嘎县|桑日县|琼结县|曲松县|措美县|洛扎县|加查县|隆子县|错那县|浪卡子县|嘉黎县|比如县|聂荣县|安多县|申扎县|索县|班戈县|巴青县|尼玛县|双湖县|普兰县|札达县|噶尔县|日土县|革吉县|改则县|措勤县|蓝田县|周至县|宜君县|凤翔县|岐山县|扶风县|眉县|陇县|千阳县|麟游县|凤县|太白县|三原县|泾阳县|乾县|礼泉县|永寿县|彬县|长武县|旬邑县|淳化县|武功县|兴平市|潼关县|大荔县|合阳县|澄城县|蒲城县|白水县|富平县|韩城市|华阴市|延长县|延川县|子长县|志丹县|吴起县|甘泉县|富县|洛川县|宜川县|黄龙县|黄陵县|城固县|洋县|西乡县|勉县|宁强县|略阳县|镇巴县|留坝县|佛坪县|府谷县|靖边县|定边县|绥德县|米脂县|佳县|吴堡县|清涧县|子洲县|神木市|汉阴县|石泉县|宁陕县|紫阳县|岚皋县|平利县|镇坪县|旬阳县|白河县|洛南县|丹凤县|商南县|山阳县|镇安县|柞水县|永登县|皋兰县|榆中县|永昌县|靖远县|会宁县|景泰县|清水县|秦安县|甘谷县|武山县|张家川回族自治县|民勤县|古浪县|天祝藏族自治县|肃南裕固族自治县|民乐县|临泽县|高台县|山丹县|泾川县|灵台县|崇信县|华亭县|庄浪县|静宁县|金塔县|瓜州县|肃北蒙古族自治县|阿克塞哈萨克族自治县|玉门市|敦煌市|庆城县|环县|华池县|合水县|正宁县|宁县|镇原县|通渭县|陇西县|渭源县|临洮县|漳县|岷县|成县|文县|宕昌县|康县|西和县|礼县|徽县|两当县|临夏市|临夏县|康乐县|永靖县|广河县|和政县|东乡族自治县|积石山保安族东乡族撒拉族自治县|合作市|临潭县|卓尼县|舟曲县|迭部县|玛曲县|碌曲县|夏河县|大通回族土族自治县|湟中县|湟源县|民和回族土族自治县|互助土族自治县|化隆回族自治县|循化撒拉族自治县|门源回族自治县|祁连县|海晏县|刚察县|同仁县|尖扎县|泽库县|河南蒙古族自治县|共和县|同德县|贵德县|兴海县|贵南县|玛沁县|班玛县|甘德县|达日县|久治县|玛多县|玉树市|杂多县|称多县|治多县|囊谦县|曲麻莱县|格尔木市|德令哈市|乌兰县|都兰县|天峻县|海西蒙古族藏族自治州直辖|永宁县|贺兰县|灵武市|平罗县|盐池县|同心县|青铜峡市|西吉县|隆德县|泾源县|彭阳县|中宁县|海原县|乌鲁木齐县|鄯善县|托克逊县|巴里坤哈萨克自治县|伊吾县|昌吉市|阜康市|呼图壁县|玛纳斯县|奇台县|吉木萨尔县|木垒哈萨克自治县|博乐市|阿拉山口市|精河县|温泉县|库尔勒市|轮台县|尉犁县|若羌县|且末县|焉耆回族自治县|和静县|和硕县|博湖县|阿克苏市|温宿县|库车县|沙雅县|新和县|拜城县|乌什县|阿瓦提县|柯坪县|阿图什市|阿克陶县|阿合奇县|乌恰县|喀什市|疏附县|疏勒县|英吉沙县|泽普县|莎车县|叶城县|麦盖提县|岳普湖县|伽师县|巴楚县|塔什库尔干塔吉克自治县|和田市|和田县|墨玉县|皮山县|洛浦县|策勒县|于田县|民丰县|伊宁市|奎屯市|霍尔果斯市|伊宁县|察布查尔锡伯自治县|霍城县|巩留县|新源县|昭苏县|特克斯县|尼勒克县|塔城市|乌苏市|额敏县|沙湾县|托里县|裕民县|和布克赛尔蒙古自治县|阿勒泰市|布尔津县|富蕴县|福海县|哈巴河县|青河县|吉木乃县|喀尔交镇|恰勒什海乡|托普铁热克镇|别斯铁热克乡|吉木乃镇|托斯特乡|兵团一八六团|乌拉斯特镇|兵团一五二团|向阳街道|红山街道|东城街道|石河子乡|老街街道|北泉镇|新城街道|阿拉尔农场|幸福路街道|兵团第一师幸福农场|兵团七团|兵团十一团|兵团第一师水利水电工程处|青松路街道|托喀依乡|兵团八团|中心监狱|兵团第一师塔里木灌区水利管理处|兵团十四团|兵团十二团|兵团十三团|金银川路街道|兵团十六团|兵团十团|南口街道|兵团四十九团|兵团图木舒克市永安坝|兵团五十一团|前海街道|兵团图木舒克市喀拉拜勒镇|永安坝街道|齐干却勒街道|兵团五十团|兵团五十三团|兵团四十四团|兵团一零二团|军垦路街道|人民路街道|兵团一零一团|兵团一零三团|青湖路街道|兵团二十九团|农二师三十团|兵团六十八团|都拉塔口岸|兵团六十六团|兵团六十三团|兵团六十七团|兵团六十四团|乌尔其乡|普恰克其乡|兵团皮山农场|兵团二二四团|兵团四十七团|博斯坦乡|喀拉喀什镇|阔依其乡|兵团一牧场|乌鲁克萨依乡|奴尔乡|兵团一零三|坡头镇|梨林镇|思礼镇|大峪镇|五龙口镇|王屋镇|玉泉街道|轵城镇|济水街道|沁园街道|下冶镇|天坛街道|克井镇|邵原镇|北海街道|承留镇|沙湖镇|工业园区|畜禽良种场|豆河镇|通海口镇|胡场镇|长倘口镇|五湖渔场|杨林尾镇|干河街道|西流河镇|赵西垸林场|九合垸原种场|彭场镇|沔城回族镇|龙华山街道|沙湖原种场|陈场镇|郭河镇|排湖风景区|郑场镇|沙嘴街道|张沟镇|毛嘴镇|三伏潭镇|积玉口镇|广华街道|泰丰街道|潜江经济开发区|周矶管理区|周矶街道|总口管理区|高场街道|王场镇|运粮湖管理区|园林街道|白鹭湖管理区|竹根滩镇|渔洋镇|熊口镇|后湖管理区|熊口管理区|江汉石油管理局|张金镇|杨市街道|老新镇|龙湾镇|浩口原种场|浩口镇|高石碑镇|胡市镇|多祥镇|黄潭镇|沉湖管委会|横林镇|马湾镇|干驿镇|蒋湖农场|小板镇|多宝镇|岳口镇|蒋场镇|石家河镇|彭市镇|竟陵街道|九真镇|佛子山镇|侨乡街道开发区|麻洋镇|杨林街道|白茅湖农场|汪场镇|渔薪镇|净潭乡|卢市镇|皂市镇|拖市镇|张港镇|下谷坪土家族乡|木鱼镇|新华镇|九湖镇|宋洛乡|松柏镇|红坪镇|阳日镇|常平镇|莞城街道|望牛墩镇|大朗镇|麻涌镇|黄江镇|凤岗镇|樟木头镇|东莞生态园|松山湖管委会|桥头镇|石龙镇|寮步镇|高埗镇|塘厦镇|厚街镇|谢岗镇|虎门镇|南城街道|虎门港管委会|横沥镇|企石镇|东坑镇|东城街道|石排镇|洪梅镇|沙田镇|长安镇|道滘镇|大岭山镇|清溪镇|茶山镇|中堂镇|万江街道|石碣镇|横栏镇|三角镇|五桂山街道|东升镇|神湾镇|火炬开发区街道|小榄镇|南朗镇|古镇镇|民众镇|港口镇|三乡镇|石岐区街道|大涌镇|南头镇|黄圃镇|东区街道|阜沙镇|板芙镇|西区街道|坦洲镇|南区街道|沙溪镇|东凤镇|洋浦经济开发区|光村镇|兰洋镇|海头镇|和庆镇|华南热作学院|国营蓝洋农场|中和镇|王五镇|木棠镇|东成镇|新州镇|南丰镇|排浦镇|国营西培农场|雅星镇|国营八一农场|国营西联农场|白马井镇|那大镇|峨蔓镇|大成镇|三都镇|南圣镇|毛阳镇|国营畅好农场|番阳镇|水满乡|通什镇|畅好乡|毛道乡|嘉积镇|会山镇|国营东升农场|国营东太农场|彬村山华侨农场|万泉镇|大路镇|潭门镇|国营东红农场|中原镇|长坡镇|龙江镇|塔洋镇|博鳌镇|阳江镇|石壁镇|东阁镇|国营罗豆农场|文教镇|会文镇|锦山镇|翁田镇|东郊镇|国营东路农场|铺前镇|龙楼镇|冯坡镇|国营南阳农场|昌洒镇|公坡镇|蓬莱镇|抱罗镇|潭牛镇|东路镇|文城镇|重兴镇|礼纪镇|国营东兴农场|后安镇|国营东和农场|万城镇|和乐镇|大茂镇|山根镇|龙滚镇|兴隆华侨农场|三更罗镇|北大镇|长丰镇|地方国营六连林场|国营新中农场|南桥镇|东澳镇|东方华侨农场|新龙镇|江边乡|国营广坝农场|天安乡|东河镇|感城镇|三家镇|四更镇|大田镇|板桥镇|八所镇|黄竹镇|新竹镇|国营中瑞农场|富文镇|岭口镇|定城镇|雷鸣镇|翰林镇|国营南海农场|龙河镇|国营金鸡岭农场|龙湖镇|龙门镇|国营中建农场|屯城镇|南吕镇|坡心镇|新兴镇|国营中坤农场|西昌镇|枫木镇|南坤镇|乌坡镇|永发镇|福山镇|中兴镇|桥头镇|金江镇|老城镇|文儒镇|国营红岗农场|瑞溪镇|国营红光农场|大丰镇|加乐镇|国营昆仑农场|国营金安农场|国营西达农场|国营和岭农场|仁兴镇|南宝镇|博厚镇|和舍镇|东英镇|调楼镇|波莲镇|多文镇|国营加来农场|新盈镇|临城镇|皇桐镇|国营红华农场|七坊镇|金波乡|南开乡|荣邦乡|青松乡|国营龙江农场|邦溪镇|元门乡|国营白沙农场|牙叉镇|细水乡|打安镇|阜龙乡|国营邦溪农场|国营霸王岭林场|十月田镇|石碌镇|海南矿业联合有限公司|七叉镇|乌烈镇|叉河镇|王下乡|海尾镇|国营红林农场|昌化镇|国营山荣农场|莺歌海镇|国营乐光农场|万冲镇|利国镇|国营保国农场|抱由镇|九所镇|国营莺歌海盐场|黄流镇|大安镇|佛罗镇|尖峰镇|千家镇|志仲镇|国营尖峰岭林业公司|椰林镇|黎安镇|群英乡|新村镇|国营吊罗山林业公司|本号镇|光坡镇|文罗镇|国营南平农场|隆广镇|提蒙乡|三才镇|国营岭门农场|英州镇|海南保亭热带作物研究所|新政镇|加茂镇|国营新星农场|保城镇|国营金江农场|南林乡|国营三道农场|毛感乡|响水镇|什玲镇|三道镇|六弓乡|吊罗山乡|国营加钗农场|和平镇|国营乌石农场|什运乡|湾岭镇|国营阳江农场|国营黎母山林业公司|营根镇|上安乡|中平镇|黎母山镇|国营长征农场|红毛镇|长征镇|峪泉镇|新城镇|文殊镇|雄关区|镜铁区|长城区|[^区]+区)"; + String detailAddress = "?(?.*)"; + Matcher matcher = Pattern.compile(regex + countyRegex + detailAddress).matcher(address); + String province, city, county, detail; + Map row = new LinkedHashMap<>(3); + while (matcher.find()) { + province = matcher.group("province"); + row.put("province", province == null ? null : province.trim()); + city = matcher.group("city"); + row.put("city", city == null ? null : city.trim()); + county = matcher.group("county"); + row.put("county", county == null ? null : county.trim()); + detail = matcher.group("detail"); + row.put("detail", detail == null ? "" : detail.trim()); + } + return row; + } + + /** + * @Description: 查询所有的省级名称 + * @Title: getprovice + * @author Lewis + * @return List + */ + public static List getprovice() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "select name from tb_admin_dic where type = 2 and parent_code=1"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 查询所有的市级名称 + * @Title: getcity + * @author Lewis + * @return List + */ + public static List getcity() { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "select name from tb_admin_dic where type = 3"; + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 查询指定省的市级名称 + * @Title: getcity + * @author Lewis + * @return List + */ + public static List getcity(String province) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic WHERE parent_code=(SELECT code FROM tb_admin_dic WHERE NAME=? AND TYPE=2)"; + ps = conn.prepareStatement(sql); + ps.setString(1, province); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + String provice = rs.getString("name"); + list.add(provice); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 根据市级名称查询所属的省级名称 + * @Title: getcity + * @author Lewis + * @return String + */ + public static String getProvinceByCityName(String city) throws Exception { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic where code= (SELECT parent_code FROM tb_admin_dic WHERE NAME=? AND TYPE=3);"; + ps = conn.prepareStatement(sql); + ps.setString(1, city); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + return rs.getString("name"); + } + throw new RuntimeException(); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 根据市级名称查询所有的区县 + * @Title: getcity + * @author Lewis + * @return List + */ + public static List getCountyByCityName(String city) throws Exception { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + ResultSet rs = null; + String sql = ""; + PreparedStatement ps = null; + List list = new ArrayList(); + try { + conn = dbpc.getConnection(); + + sql = "SELECT name FROM tb_admin_dic where parent_code= (SELECT code FROM tb_admin_dic WHERE NAME=? AND TYPE=3)"; + ps = conn.prepareStatement(sql); + ps.setString(1, city); + rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name") == null) { + continue; + } + list.add(rs.getString("name")); + } + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } finally { + + try { + conn.setAutoCommit(true); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + rs = null; + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + + /** + * @Description: 将不能解析的地址写入数据库 + * @Title: getprovice + * @author Lewis + */ + public static void insertUnmatchAddress(String address) { + DbPoolConnection dbpc = DbPoolConnection.getInstance(); + DruidPooledConnection conn = null; + String sql = ""; + PreparedStatement ps = null; + try { + conn = dbpc.getConnection(); + + sql = "insert into tb_unmatch_address(address) values(?)"; + ps = conn.prepareStatement(sql); + ps.setString(1, address); + ps.executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + ps = null; + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + logger.error(ParseAddressUtil.class, e); + } catch (Exception e) { + logger.error(ParseAddressUtil.class, e); + } + conn = null; + } + dbpc = null; + + } + } + +} diff --git a/src/com/since/emp/util/ProvinceLevelMunicipalityConstants.java b/src/com/since/emp/util/ProvinceLevelMunicipalityConstants.java new file mode 100644 index 0000000..7268df5 --- /dev/null +++ b/src/com/since/emp/util/ProvinceLevelMunicipalityConstants.java @@ -0,0 +1,26 @@ +package com.since.emp.util; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: 直辖市常量 + * @ClassName: ProvinceLevelMunicipalityEnum + * @author Lewis + * @date 2021-7-2 14:43:32 + * + */ +public class ProvinceLevelMunicipalityConstants { + public ProvinceLevelMunicipalityConstants() { + + } + + public static Map provinceLevelMunicipalityMap = new HashMap(); + static { + provinceLevelMunicipalityMap.put("北京市", ""); + provinceLevelMunicipalityMap.put("上海市", ""); + provinceLevelMunicipalityMap.put("天津市", ""); + provinceLevelMunicipalityMap.put("重庆市", ""); + } + +} diff --git a/src/com/since/emp/util/SecurityUtil.java b/src/com/since/emp/util/SecurityUtil.java new file mode 100644 index 0000000..2081346 --- /dev/null +++ b/src/com/since/emp/util/SecurityUtil.java @@ -0,0 +1,121 @@ +package com.since.emp.util; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.Base64.Decoder; +import java.util.Base64.Encoder; + +/** + * + * @className:SecurityUtil + * @description:加密工具类 + * @author:Sunshine + * @date:2019年2月1日 上午9:58:11 + */ +public class SecurityUtil { + /** + * @description MD5加密 + * @param inputText + * @return + */ + public static String e(String inputText) { + return md5(inputText); + } + + /** + * @description MD5和SHA双重加密 + * @param inputText + * @return + */ + public static String md5AndSha(String inputText) { + return sha(md5(inputText)); + } + + /** + * @description md5加密 + * @param inputText + * @return + */ + public static String md5(String inputText) { + return encrypt(inputText, "md5"); + } + + /** + * @description sha加密 + * @param inputText + * @return + */ + public static String sha(String inputText) { + return encrypt(inputText, "sha-1"); + } + + /** + * @description md5或者sha-1加密 + * @param inputText 要加密的内容 + * @param algorithmName 加密算法名称:md5或者sha-1,不区分大小写 + * @return + */ + private static String encrypt(String inputText, String algorithmName) { + if (inputText == null || "".equals(inputText.trim())) { + throw new IllegalArgumentException("请输入要加密的内容!"); + } + if (algorithmName == null || "".equals(algorithmName.trim())) { + algorithmName = "md5"; + } + String encryptText = null; + try { + MessageDigest m = MessageDigest.getInstance(algorithmName); + m.update(inputText.getBytes("UTF8")); + byte s[] = m.digest(); + // m.digest(inputText.getBytes("UTF8")); + return hex(s); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return encryptText; + } + + /** + * 返回十六进制字符串 + * + * @param arr + * @return + */ + private static String hex(byte[] arr) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < arr.length; ++i) { + sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString(); + } + + /** + * @description base64加密 + * @param bstr + * @return String + */ + public static String BAS64Encode(byte[] bstr) { + Encoder encoder = Base64.getEncoder(); + return encoder.encodeToString(bstr); + } + + /** + * @description base64解密 + * @param str + * @return string + */ + public static byte[] decode(String str) { + byte[] bt = null; + try { + Decoder decoder = Base64.getDecoder(); + bt = decoder.decode(str); + } catch (Exception e) { + e.printStackTrace(); + } + return bt; + } +} diff --git a/src/com/since/emp/util/SqlUtil.java b/src/com/since/emp/util/SqlUtil.java new file mode 100644 index 0000000..17f8a05 --- /dev/null +++ b/src/com/since/emp/util/SqlUtil.java @@ -0,0 +1,206 @@ +package com.since.emp.util; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.since.emp.base.*; +import com.since.emp.service.OrderSyncs; +import com.since.emp.service.csv.constants.Constants; +import org.apache.commons.lang.StringUtils; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.HashSet; +import java.util.Set; + +/** + * @author zh + * @Date 2021/8/18 + */ +public class SqlUtil { + + private static DbPoolConnection poolConnection = DbPoolConnection.getInstance(); + + /** + * 判断地址是否存在 + * + * @param parentCode 地址的父级编码 + * @param name 地址名称 + * @return 返回查询的地址编码 + */ + public static String getAddress(String parentCode, String name) { + String parent = ""; + + String sql = "select code from tb_admin_dic where name = ? and parent_code = ?"; + DruidPooledConnection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + try { + connection = poolConnection.getConnection(); + preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, name); + preparedStatement.setString(2, parentCode); + resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + parent = resultSet.getString(1); + } + return parent; + } catch (Exception e) { + throwException(e); + } finally { + CloseUtil.close(resultSet, preparedStatement, connection); + } + return null; + } + + /** + * 判断商家是否存在 + * + * @param shopCode 店铺编码 + * @return true 存在 false 不存在 + */ + public static Boolean isShopExist(String shopCode) { + if (shopCode == null) { + return false; + } + String code = ""; + String sql = "select code from tb_shop where code = ?"; + DruidPooledConnection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + try { + connection = poolConnection.getConnection(); + preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, shopCode); + resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + code = resultSet.getString(1); + } + + } catch (Exception e) { + throwException(e); + } finally { + CloseUtil.close(resultSet, preparedStatement, connection); + } + return StringUtils.isNotBlank(code); + } + + /** + * 判断地址是否存在 + * + * @param parentCode 地址的父级编码 + * @return 返回查询的所有下级地址单位 + */ + public static Set getNextAddress(String parentCode) { + String parent = ""; + Set set = new HashSet<>(); + String sql = "select name from tb_admin_dic where parent_code = ?"; + DruidPooledConnection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + try { + connection = poolConnection.getConnection(); + preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, parentCode); + resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + parent = resultSet.getString(1); + set.add(parent); + } + return set; + } catch (Exception e) { + throwException(e); + } finally { + CloseUtil.close(resultSet, preparedStatement, connection); + } + return null; + } + + /** + * 添加 TradeInfo 默认数据 + * + * @param tradeInfo + * @param ip + */ + public static void initDefaultTradeData(TradeInfo tradeInfo, ImportParams ip, String path) { + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + conn = poolConnection.getConnection(); + String sql = "select a.order_sync_lock_flag,a.order_sync_lock_keyword,a.storage_code,a.platform_code,a.delivery_mode_id,a.company_code,b.type from tb_shop a,tb_company b where a.code=? and a.company_code=b.code"; + ps = conn.prepareStatement(sql); + ps.setString(1, tradeInfo.shop_code); + rs = ps.executeQuery(); + if (rs.next()) { + tradeInfo.company_code = rs.getString("company_code"); + tradeInfo.delivery_mode_id = rs.getInt("delivery_mode_id"); + tradeInfo.storage_code = rs.getString("storage_code"); + tradeInfo.company_type = rs.getInt("type"); + tradeInfo.obm_company_code = ""; + tradeInfo.platform_code = rs.getString("platform_code"); + tradeInfo.shopMessage = new ShopMessage(); + int orderSyncLockFlag = rs.getInt("order_sync_lock_flag"); + String orderSyncLocKeyword = rs.getString("order_sync_lock_keyword") == null + ? "" + : rs.getString("order_sync_lock_keyword"); + tradeInfo.shopMessage.setOrder_sync_lock_flag(orderSyncLockFlag); + tradeInfo.shopMessage.setOrder_sync_lock_keyword(orderSyncLocKeyword); + tradeInfo.trade_type2 = 2; + tradeInfo.adjust_fee = "0"; + tradeInfo.export_file_path = path + ip.in_path; + tradeInfo.out_path = path + ip.in_path.trim().replace(Constants.CSV_FILE_SUFFIX, Constants.CSV_ERROR_SUFFIX); + tradeInfo.replenish_code = ip.code; + if ("001".equals(tradeInfo.platform_code) + || "012".equals(tradeInfo.platform_code) + || "002".equals(tradeInfo.platform_code)) { + tradeInfo.platform_code = "002"; + tradeInfo.trade_type = "taobao_trade_TradeBuyerPay"; + } + } + } catch (Exception e) { + throwException(e); + } finally { + CloseUtil.close(rs, ps, conn); + } + + } + + public static boolean checkShopByCompanyCode(String shopCode, String companyCode) { + DruidPooledConnection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + conn = poolConnection.getConnection(); + String sql = "select 1 " + + "from tb_shop a,tb_company b " + + "where a.code= ? and a.company_code=b.code AND b.code= ?;"; + ps = conn.prepareStatement(sql); + ps.setString(1, shopCode); + ps.setString(2, companyCode); + rs = ps.executeQuery(); + if (rs.next()) { + return false; + } + } catch (Exception e) { + throwException(e); + return true; + } finally { + CloseUtil.close(rs, ps, conn); + } + return true; + } + + /** + * 抛出异常 + * + * @param throwable + */ + private static void throwException(Throwable throwable) { + try { + throw throwable; + } catch (Throwable e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/since/emp/util/TimeUtil.java b/src/com/since/emp/util/TimeUtil.java new file mode 100644 index 0000000..8ec9287 --- /dev/null +++ b/src/com/since/emp/util/TimeUtil.java @@ -0,0 +1,51 @@ +package com.since.emp.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author Lewis + * @Description: 时间转换工具类 + * @ClassName: TimeUtil + * @date 2021-11-5 11:13:56 + */ +public class TimeUtil { + /** + * @throws ParseException + * @throws + * @Title: getDifferenceValue + * @Description: 获取指定时间与当前的差值,单位为分钟 + * @author Lewis + */ + public static long getDifferenceValue(String allocateTime) throws Exception { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date allocateDate = sdf.parse(allocateTime); + long differenceTime = allocateDate.getTime() - System.currentTimeMillis(); + //将毫秒转换为分钟 + return differenceTime / 60 * 1000; + } + + /** + * 时间字符串 转毫秒数 + * @param text + * @return + * @throws Exception + */ + public static long getTimeMillisecond(String text) throws Exception { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.parse(text).getTime(); + } + + + /** + * 毫秒数 转 时间字符串 + * @param m + * @return + * @throws Exception + */ + public static String getTimeMillisecondString(long m) throws Exception { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(new Date(m)); + } +} diff --git a/tp.properties b/tp.properties new file mode 100644 index 0000000..371b660 --- /dev/null +++ b/tp.properties @@ -0,0 +1,22 @@ +corePoolSize=4 +maximumPoolSize=10 +keepAliveTime=5 +queueSize=20 + + + + + + + + + + + + + + + + + + diff --git a/拆单业务逻辑.pdf b/拆单业务逻辑.pdf new file mode 100644 index 0000000..35ad36d Binary files /dev/null and b/拆单业务逻辑.pdf differ