Commit f19d0929 by BANice

线上提交版

parent cf0bdc43
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/container" /> <excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/container" />
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/contracts" /> <excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/contracts" />
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/database" /> <excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/database" />
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/events" />
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/support" /> <excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/support" />
<excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" /> <excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nesbot/carbon" /> <excludeFolder url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" /> <path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" />
<path value="$PROJECT_DIR$/vendor/monolog/monolog" /> <path value="$PROJECT_DIR$/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/vendor/psr/log" /> <path value="$PROJECT_DIR$/vendor/psr/log" />
<path value="$PROJECT_DIR$/vendor/illuminate/events" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="7.2" /> <component name="PhpProjectSharedConfiguration" php_language_level="7.2" />
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="51473025-d333-486e-bf8a-0f5aa99abe65" name="Default" comment="" /> <list default="true" id="51473025-d333-486e-bf8a-0f5aa99abe65" name="Default" comment="">
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/Order.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/adaptor/UsingOrderAdaptor.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/order/SaveOrder.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/Charger.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/Created.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/Finish.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/Offline.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/Online.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/PortShed.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/State.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/cdz_order/state/WaitingCharger.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/order_exception/Exception.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/order_exception/OrderTrace.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/redis/MyRedis.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/redis/RedisKey.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/redis/RedisSingle.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/redis/user/UserUsingOrder.php" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Lib/redis/user/UserUsingPort.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/customer_charger_order.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/customer_charger_order.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/php.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/php.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Lib/send/Send.php" beforeDir="false" afterPath="$PROJECT_DIR$/Lib/send/Send.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php" beforeDir="false" afterPath="$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/composer.json" beforeDir="false" afterPath="$PROJECT_DIR$/composer.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/composer.lock" beforeDir="false" afterPath="$PROJECT_DIR$/composer.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/start.php" beforeDir="false" afterPath="$PROJECT_DIR$/start.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/start_check_shed.php" beforeDir="false" afterPath="$PROJECT_DIR$/start_check_shed.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_files.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_files.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_psr4.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_psr4.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/autoload_static.php" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/autoload_static.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/composer/installed.json" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/composer/installed.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/vendor/illuminate/database" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/illuminate/database" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" /> <option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
...@@ -17,8 +50,8 @@ ...@@ -17,8 +50,8 @@
<file leaf-file-name="start.php" pinned="false" current-in-tab="true"> <file leaf-file-name="start.php" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/start.php"> <entry file="file://$PROJECT_DIR$/start.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1343"> <state relative-caret-position="626">
<caret line="139" selection-start-line="139" selection-end-line="139" /> <caret line="295" column="12" selection-start-line="295" selection-start-column="12" selection-end-line="295" selection-end-column="12" />
<folding> <folding>
<element signature="e#139#168#0#PHP" expanded="true" /> <element signature="e#139#168#0#PHP" expanded="true" />
</folding> </folding>
...@@ -26,81 +59,88 @@ ...@@ -26,81 +59,88 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="start_check_shed.php" pinned="false" current-in-tab="false"> <file leaf-file-name="Send.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/start_check_shed.php"> <entry file="file://$PROJECT_DIR$/Lib/send/Send.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480"> <state relative-caret-position="566">
<caret line="32" column="6" lean-forward="true" selection-start-line="32" selection-start-column="6" selection-end-line="32" selection-end-column="6" /> <caret line="84" column="18" selection-start-line="84" selection-start-column="18" selection-end-line="84" selection-end-column="18" />
<folding> <folding>
<element signature="e#136#165#0#PHP" expanded="true" /> <element signature="e#115#131#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Push.php" pinned="false" current-in-tab="false"> <file leaf-file-name="Command.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/Push.php"> <entry file="file://$PROJECT_DIR$/Lib/send/Command.php">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor">
</entry> <state relative-caret-position="525">
</file> <caret line="40" column="29" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
<file leaf-file-name="ChargerExceedMessage.php" pinned="false" current-in-tab="false"> </state>
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerExceedMessage.php"> </provider>
<provider selected="true" editor-type-id="text-editor" />
</entry> </entry>
</file> </file>
<file leaf-file-name="ChargerTimeoutMessage.php" pinned="false" current-in-tab="false"> <file leaf-file-name="StopChargerCommand.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php"> <entry file="file://$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-418"> <state relative-caret-position="-304">
<caret line="69" selection-start-line="69" selection-end-line="69" /> <caret line="14" column="6" selection-start-line="14" selection-start-column="6" selection-end-line="14" selection-end-column="6" />
<folding>
<element signature="e#121#138#0#PHP" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="ChargerStartMessage.php" pinned="false" current-in-tab="false"> <file leaf-file-name="SaveOrder.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerStartMessage.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/order/SaveOrder.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="870"> <state relative-caret-position="225">
<caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" /> <caret line="21" column="20" selection-start-line="21" selection-start-column="20" selection-end-line="21" selection-end-column="20" />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Log.php" pinned="false" current-in-tab="false"> <file leaf-file-name="start_check_shed.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/Log.php"> <entry file="file://$PROJECT_DIR$/start_check_shed.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330"> <state relative-caret-position="-298">
<caret line="27" selection-start-line="27" selection-end-line="27" /> <caret line="78" selection-start-line="78" selection-end-line="78" />
<folding> <folding>
<element signature="e#111#151#0#PHP" expanded="true" /> <element signature="e#136#165#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Logger.php" pinned="false" current-in-tab="false"> <file leaf-file-name="RedisSingle.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php"> <entry file="file://$PROJECT_DIR$/Lib/redis/RedisSingle.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240"> <state relative-caret-position="555">
<caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" /> <caret line="42" lean-forward="true" selection-start-line="42" selection-end-line="42" />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="composer.json" pinned="false" current-in-tab="false"> <file leaf-file-name="MyRedis.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/composer.json"> <entry file="file://$PROJECT_DIR$/Lib/redis/MyRedis.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165"> <state relative-caret-position="440">
<caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" /> <caret line="39" column="51" selection-start-line="39" selection-start-column="51" selection-end-line="39" selection-end-column="51" />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Connection.php" pinned="false" current-in-tab="false"> <file leaf-file-name="RedisKey.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/mysql/Connection.php"> <entry file="file://$PROJECT_DIR$/Lib/redis/RedisKey.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file leaf-file-name="Order.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/Order.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30"> <state relative-caret-position="529">
<caret line="2" selection-start-line="2" selection-end-line="2" /> <caret line="120" column="43" selection-start-line="120" selection-start-column="43" selection-end-line="120" selection-end-column="43" />
</state> </state>
</provider> </provider>
</entry> </entry>
...@@ -112,12 +152,23 @@ ...@@ -112,12 +152,23 @@
<find>$queueWorker</find> <find>$queueWorker</find>
<find>Log</find> <find>Log</find>
<find>var_dump</find> <find>var_dump</find>
<find>data</find>
<find>43</find>
<find>$message['station_id']</find>
<find>$message</find>
<find>46</find>
</findStrings> </findStrings>
<replaceStrings> <replaceStrings>
<replace>$queue</replace> <replace>$queue</replace>
<replace>Log::debug</replace> <replace>Log::debug</replace>
<replace>message</replace>
<replace>$gatewayId</replace>
<replace>$stationId</replace>
</replaceStrings> </replaceStrings>
</component> </component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
...@@ -134,11 +185,17 @@ ...@@ -134,11 +185,17 @@
<option value="$PROJECT_DIR$/Lib/tool/StringTool.php" /> <option value="$PROJECT_DIR$/Lib/tool/StringTool.php" />
<option value="$PROJECT_DIR$/Lib/Gateway.php" /> <option value="$PROJECT_DIR$/Lib/Gateway.php" />
<option value="$PROJECT_DIR$/Lib/send/Command.php" /> <option value="$PROJECT_DIR$/Lib/send/Command.php" />
<option value="$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php" />
<option value="$PROJECT_DIR$/Lib/send/Send.php" />
<option value="$PROJECT_DIR$/composer.json" /> <option value="$PROJECT_DIR$/composer.json" />
<option value="$PROJECT_DIR$/Lib/Log.php" /> <option value="$PROJECT_DIR$/Lib/Log.php" />
<option value="$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php" /> <option value="$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php" />
<option value="$PROJECT_DIR$/vendor/illuminate/database/Capsule/Manager.php" />
<option value="$PROJECT_DIR$/Lib/send/Send.php" />
<option value="$PROJECT_DIR$/Lib/order_exception/Exception.php" />
<option value="$PROJECT_DIR$/Lib/order_exception/OrderTrace.php" />
<option value="$PROJECT_DIR$/Lib/cdz_order/state/Created.php" />
<option value="$PROJECT_DIR$/Lib/cdz_order/Order.php" />
<option value="$PROJECT_DIR$/Lib/redis/RedisSingle.php" />
<option value="$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php" />
<option value="$PROJECT_DIR$/start_check_shed.php" /> <option value="$PROJECT_DIR$/start_check_shed.php" />
<option value="$PROJECT_DIR$/start.php" /> <option value="$PROJECT_DIR$/start.php" />
</list> </list>
...@@ -172,6 +229,7 @@ ...@@ -172,6 +229,7 @@
<path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" /> <path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" />
<path value="$PROJECT_DIR$/vendor/monolog/monolog" /> <path value="$PROJECT_DIR$/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/vendor/psr/log" /> <path value="$PROJECT_DIR$/vendor/psr/log" />
<path value="$PROJECT_DIR$/vendor/illuminate/events" />
</include_path> </include_path>
</component> </component>
<component name="ProjectFrameBounds" fullScreen="true"> <component name="ProjectFrameBounds" fullScreen="true">
...@@ -180,6 +238,7 @@ ...@@ -180,6 +238,7 @@
<option name="width" value="1920" /> <option name="width" value="1920" />
<option name="height" value="1080" /> <option name="height" value="1080" />
</component> </component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView"> <component name="ProjectView">
<navigator proportions="" version="1"> <navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" /> <foldersAlwaysOnTop value="true" />
...@@ -196,7 +255,39 @@ ...@@ -196,7 +255,39 @@
<path> <path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" /> <item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" /> <item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="vendor" type="462c0819:PsiDirectoryNode" /> <item name="Lib" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="Lib" type="462c0819:PsiDirectoryNode" />
<item name="cdz_order" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="Lib" type="462c0819:PsiDirectoryNode" />
<item name="cdz_order" type="462c0819:PsiDirectoryNode" />
<item name="order" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="Lib" type="462c0819:PsiDirectoryNode" />
<item name="cdz_order" type="462c0819:PsiDirectoryNode" />
<item name="state" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="Lib" type="462c0819:PsiDirectoryNode" />
<item name="order_exception" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<item name="customer_charger_order" type="462c0819:PsiDirectoryNode" />
<item name="Lib" type="462c0819:PsiDirectoryNode" />
<item name="redis" type="462c0819:PsiDirectoryNode" />
</path> </path>
<path> <path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" /> <item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
...@@ -209,6 +300,7 @@ ...@@ -209,6 +300,7 @@
</panes> </panes>
</component> </component>
<component name="PropertiesComponent"> <component name="PropertiesComponent">
<property name="SearchEverywhereHistoryKey" value="&#9;FILE&#9;file:///Users/banice/ubuntu/senthink/customer_charger_order/start_check_shed.php" />
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" /> <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" /> <property name="nodejs_npm_path_reset_for_default_project" value="true" />
...@@ -261,12 +353,14 @@ ...@@ -261,12 +353,14 @@
<workItem from="1530326497142" duration="731000" /> <workItem from="1530326497142" duration="731000" />
<workItem from="1530496499559" duration="38000" /> <workItem from="1530496499559" duration="38000" />
<workItem from="1530780684621" duration="15711000" /> <workItem from="1530780684621" duration="15711000" />
<workItem from="1531129253744" duration="7330000" /> <workItem from="1531129253744" duration="16149000" />
<workItem from="1531278957683" duration="9558000" />
<workItem from="1531467679116" duration="34077000" />
</task> </task>
<servers /> <servers />
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="82959000" /> <option name="totallyTimeSpent" value="135413000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
...@@ -279,17 +373,19 @@ ...@@ -279,17 +373,19 @@
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="1920" y="-58" width="1920" height="1080" extended-state="0" /> <frame x="1920" y="-58" width="1920" height="1080" extended-state="0" />
<editor active="true" />
<layout> <layout>
<window_info anchor="bottom" id="TODO" order="6" weight="0.32977587" /> <window_info anchor="bottom" id="TODO" order="6" weight="0.32977587" />
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" /> <window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
<window_info anchor="bottom" id="Database Changes" order="7" show_stripe_button="false" /> <window_info anchor="bottom" id="Database Changes" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="File Transfer" order="7" weight="0.32892057" /> <window_info anchor="bottom" id="File Transfer" order="7" weight="0.200611" />
<window_info anchor="bottom" id="Run" order="2" /> <window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Version Control" order="7" show_stripe_button="false" /> <window_info anchor="bottom" id="Version Control" order="7" />
<window_info anchor="bottom" id="Terminal" order="7" visible="true" weight="0.33706722" /> <window_info anchor="bottom" id="Terminal" order="7" weight="0.11507128" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.22896698" /> <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.16400427" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" /> <window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="right" id="Database" order="3" /> <window_info anchor="right" id="Database" order="3" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" /> <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info id="Favorites" order="2" side_tool="true" /> <window_info id="Favorites" order="2" side_tool="true" />
...@@ -299,7 +395,6 @@ ...@@ -299,7 +395,6 @@
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="bottom" id="Message" order="0" /> <window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Find" order="1" />
</layout> </layout>
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
...@@ -309,6 +404,27 @@ ...@@ -309,6 +404,27 @@
<option name="myLimit" value="2678400000" /> <option name="myLimit" value="2678400000" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/rabbit_mq/MyRabbitMq.php" />
<entry file="file://$PROJECT_DIR$/vendor/composer/autoload_psr4.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/MyRabbitMq.php" />
<entry file="file://$PROJECT_DIR$/Lib/Hello.php" />
<entry file="file://$PROJECT_DIR$/Lib/rabbit.php" />
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/amqp/amqp.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="1286" column="20" selection-start-line="1286" selection-start-column="20" selection-end-line="1286" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Lib/rabbit_mq/MyRabbitMq.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-548">
<caret line="57" column="21" selection-start-line="57" selection-start-column="21" selection-end-line="57" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/mysqli/mysqli.php"> <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/mysqli/mysqli.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2040"> <state relative-caret-position="2040">
...@@ -316,281 +432,273 @@ ...@@ -316,281 +432,273 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/PDO/PDO.php"> <entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_key.pem">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_cert.pem">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/send/command/BalanceChargerCommand.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/send/command/ChargerCommand.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="13785"> <state relative-caret-position="-2" />
<caret line="919" column="20" selection-start-line="919" selection-start-column="20" selection-end-line="919" selection-end-column="20" />
</state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/start.php"> <entry file="file://$PROJECT_DIR$/Lib/tool/StringTool.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="825"> <state relative-caret-position="120">
<caret line="61" column="8" selection-start-line="61" selection-start-column="8" selection-end-line="61" selection-end-column="8" /> <caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/composer.json"> <entry file="file://$PROJECT_DIR$/Lib/Gateway.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225"> <state relative-caret-position="360">
<caret line="15" selection-start-line="15" selection-end-line="15" /> <caret line="24" column="17" selection-start-line="24" selection-start-column="17" selection-end-line="24" selection-end-column="17" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/ArrayToXml.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Refund.php"> <entry file="file://$PROJECT_DIR$/Lib/wx/Refund.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1515"> <state relative-caret-position="1335">
<caret line="108" column="65" selection-start-line="108" selection-start-column="65" selection-end-line="108" selection-end-column="65" /> <caret line="96" column="20" selection-start-line="96" selection-start-column="20" selection-end-line="96" selection-end-column="20" />
<folding> <folding>
<element signature="e#110#132#0#PHP" expanded="true" /> <element signature="e#110#132#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_key.pem"> <entry file="file://$PROJECT_DIR$/Lib/tool/Crc.php">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor" />
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Wx.php"> <entry file="file://$PROJECT_DIR$/Lib/wx/Wx.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="150"> <state relative-caret-position="150">
<caret line="15" column="11" lean-forward="true" selection-start-line="15" selection-start-column="11" selection-end-line="15" selection-end-column="11" /> <caret line="15" column="11" selection-start-line="15" selection-start-column="11" selection-end-line="15" selection-end-column="11" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_cert.pem"> <entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/PDO/PDO.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/ArrayToXml.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/Gateway.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="345"> <state relative-caret-position="12000">
<caret line="23" column="7" selection-start-line="23" selection-start-column="7" selection-end-line="23" selection-end-column="7" /> <caret line="800" column="20" selection-start-line="800" selection-start-column="20" selection-end-line="800" selection-end-column="20" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/mysqli/mysqli.php"> <entry file="file://$PROJECT_DIR$/Lib/mysql/Connection.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2040"> <state relative-caret-position="30">
<caret line="139" column="20" selection-start-line="139" selection-start-column="20" selection-end-line="139" selection-end-column="20" /> <caret line="2" selection-start-line="2" selection-end-line="2" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/PDO/PDO.php"> <entry file="file://$PROJECT_DIR$/composer.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="13785"> <state relative-caret-position="165">
<caret line="919" column="20" selection-start-line="919" selection-start-column="20" selection-end-line="919" selection-end-column="20" /> <caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/start.php"> <entry file="file://$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="960"> <state relative-caret-position="240">
<caret line="70" lean-forward="true" selection-start-line="70" selection-end-line="70" /> <caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/Random.php" /> <entry file="file://$PROJECT_DIR$/Lib/api/message/Push.php">
<entry file="file://$PROJECT_DIR$/src/Event.php" /> <provider selected="true" editor-type-id="text-editor" />
<entry file="file://$PROJECT_DIR$/vendor/autoload.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="4" column="47" lean-forward="true" selection-start-line="4" selection-start-column="47" selection-end-line="4" selection-end-column="47" />
</state>
</provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/vendor/composer/autoload_real.php"> <entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerExceedMessage.php">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor" />
</entry> </entry>
<entry file="file://$PROJECT_DIR$/vendor/guzzlehttp/guzzle/src/Client.php"> <entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerStartMessage.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285"> <state relative-caret-position="870">
<caret line="24" column="6" selection-start-line="24" selection-start-column="6" selection-end-line="24" selection-end-column="6" /> <caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/composer.lock"> <entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/rabbit_mq/MyRabbitMq.php" />
<entry file="file://$PROJECT_DIR$/vendor/composer/autoload_psr4.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/MyRabbitMq.php" />
<entry file="file://$PROJECT_DIR$/Lib/Hello.php" />
<entry file="file://$PROJECT_DIR$/Lib/rabbit.php" />
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/amqp/amqp.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15"> <state relative-caret-position="960">
<caret line="1286" column="20" selection-start-line="1286" selection-start-column="20" selection-end-line="1286" selection-end-column="20" /> <caret line="69" selection-start-line="69" selection-end-line="69" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/rabbit_mq/MyRabbitMq.php"> <entry file="file://$PROJECT_DIR$/vendor/illuminate/support/Traits/CapsuleManagerTrait.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-548"> <state relative-caret-position="300">
<caret line="57" column="21" selection-start-line="57" selection-start-column="21" selection-end-line="57" selection-end-column="21" /> <caret line="21" column="14" selection-start-line="21" selection-start-column="14" selection-end-line="21" selection-end-column="14" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/mysqli/mysqli.php"> <entry file="file://$PROJECT_DIR$/vendor/illuminate/contracts/Events/Dispatcher.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2040"> <state relative-caret-position="60">
<caret line="139" column="20" selection-start-line="139" selection-start-column="20" selection-end-line="139" selection-end-column="20" /> <caret line="4" column="10" selection-start-line="4" selection-start-column="10" selection-end-line="4" selection-end-column="10" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_key.pem"> <entry file="file://$PROJECT_DIR$/vendor/illuminate/database/Eloquent/Model.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/cert/apiclient_cert.pem">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/send/command/BalanceChargerCommand.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/send/command/ChargerCommand.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2" /> <state relative-caret-position="14430">
<caret line="974" column="20" selection-start-line="974" selection-start-column="20" selection-end-line="974" selection-end-column="20" />
</state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/StringTool.php"> <entry file="file://$PROJECT_DIR$/vendor/illuminate/database/Capsule/Manager.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120"> <state relative-caret-position="150">
<caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" /> <caret line="16" column="28" selection-start-line="16" selection-start-column="28" selection-end-line="16" selection-end-column="28" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/Gateway.php"> <entry file="file://$PROJECT_DIR$/Lib/Log.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="360"> <state relative-caret-position="789">
<caret line="24" column="17" selection-start-line="24" selection-start-column="17" selection-end-line="24" selection-end-column="17" /> <caret line="71" column="18" selection-start-line="71" selection-start-column="18" selection-end-line="71" selection-end-column="18" />
<folding>
<element signature="e#111#151#0#PHP" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/ArrayToXml.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/Created.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/send/Command.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90"> <state relative-caret-position="105">
<caret line="11" column="15" selection-start-line="11" selection-start-column="15" selection-end-line="11" selection-end-column="15" /> <caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/Finish.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/Offline.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/Online.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/redis/user/UserUsingPort.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90"> <state relative-caret-position="90">
<caret line="12" column="21" selection-start-line="12" selection-start-column="21" selection-end-line="12" selection-end-column="21" /> <caret line="11" selection-start-line="11" selection-end-line="11" />
<folding> <folding>
<element signature="e#121#138#0#PHP" expanded="true" /> <element signature="e#119#148#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Refund.php"> <entry file="file://$PROJECT_DIR$/Lib/order_exception/OrderTrace.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1335"> <state relative-caret-position="497">
<caret line="96" column="20" selection-start-line="96" selection-start-column="20" selection-end-line="96" selection-end-column="20" /> <caret line="66" column="38" selection-start-line="66" selection-start-column="38" selection-end-line="66" selection-end-column="38" />
<folding> <folding>
<element signature="e#110#132#0#PHP" expanded="true" /> <element signature="e#124#136#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/Crc.php"> <entry file="file://$PROJECT_DIR$/Lib/order_exception/Exception.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Wx.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="150"> <state relative-caret-position="120">
<caret line="15" column="11" selection-start-line="15" selection-start-column="11" selection-end-line="15" selection-end-column="11" /> <caret line="13" column="10" selection-start-line="13" selection-start-column="10" selection-end-line="13" selection-end-column="10" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/send/Send.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/WaitingCharger.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="705"> <state relative-caret-position="-1093" />
<caret line="54" column="20" selection-start-line="54" selection-start-column="20" selection-end-line="54" selection-end-column="20" />
<folding>
<element signature="e#115#131#0#PHP" expanded="true" />
</folding>
</state>
</provider> </provider>
</entry> </entry>
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/PDO/PDO.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/PortShed.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/State.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="12000"> <state relative-caret-position="120">
<caret line="800" column="20" selection-start-line="800" selection-start-column="20" selection-end-line="800" selection-end-column="20" /> <caret line="14" column="15" selection-start-line="14" selection-start-column="15" selection-end-line="14" selection-end-column="15" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/mysql/Connection.php"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/order/SaveOrder.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30"> <state relative-caret-position="225">
<caret line="2" selection-start-line="2" selection-end-line="2" /> <caret line="21" column="20" selection-start-line="21" selection-start-column="20" selection-end-line="21" selection-end-column="20" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/composer.json"> <entry file="file://$PROJECT_DIR$/Lib/cdz_order/Order.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165"> <state relative-caret-position="529">
<caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" /> <caret line="120" column="43" selection-start-line="120" selection-start-column="43" selection-end-line="120" selection-end-column="43" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php"> <entry file="file://$PROJECT_DIR$/Lib/redis/RedisKey.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/redis/RedisSingle.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240"> <state relative-caret-position="555">
<caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" /> <caret line="42" lean-forward="true" selection-start-line="42" selection-end-line="42" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/api/message/Push.php"> <entry file="file://$PROJECT_DIR$/Lib/send/Command.php">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor">
</entry> <state relative-caret-position="525">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerExceedMessage.php"> <caret line="40" column="29" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
<provider selected="true" editor-type-id="text-editor" /> </state>
</provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerStartMessage.php"> <entry file="file://$PROJECT_DIR$/Lib/send/Send.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="870"> <state relative-caret-position="566">
<caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" /> <caret line="84" column="18" selection-start-line="84" selection-start-column="18" selection-end-line="84" selection-end-column="18" />
<folding>
<element signature="e#115#131#0#PHP" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php"> <entry file="file://$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-418"> <state relative-caret-position="-304">
<caret line="69" selection-start-line="69" selection-end-line="69" /> <caret line="14" column="6" selection-start-line="14" selection-start-column="6" selection-end-line="14" selection-end-column="6" />
<folding>
<element signature="e#121#138#0#PHP" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/start_check_shed.php"> <entry file="file://$PROJECT_DIR$/start_check_shed.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480"> <state relative-caret-position="-298">
<caret line="32" column="6" lean-forward="true" selection-start-line="32" selection-start-column="6" selection-end-line="32" selection-end-column="6" /> <caret line="78" selection-start-line="78" selection-end-line="78" />
<folding> <folding>
<element signature="e#136#165#0#PHP" expanded="true" /> <element signature="e#136#165#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/Lib/Log.php"> <entry file="file://$PROJECT_DIR$/Lib/redis/MyRedis.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330"> <state relative-caret-position="440">
<caret line="27" selection-start-line="27" selection-end-line="27" /> <caret line="39" column="51" selection-start-line="39" selection-start-column="51" selection-end-line="39" selection-end-column="51" />
<folding>
<element signature="e#111#151#0#PHP" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/start.php"> <entry file="file://$PROJECT_DIR$/start.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1343"> <state relative-caret-position="626">
<caret line="139" selection-start-line="139" selection-end-line="139" /> <caret line="295" column="12" selection-start-line="295" selection-start-column="12" selection-end-line="295" selection-end-column="12" />
<folding> <folding>
<element signature="e#139#168#0#PHP" expanded="true" /> <element signature="e#139#168#0#PHP" expanded="true" />
</folding> </folding>
......
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:24
*/
namespace Lib\cdz_order;
use Lib\cdz_order\state\State;
class Order
{
/**
* @var int
*/
private $id;
/**
* @var string
*/
private $outTradeNo;
/**
* @var string
*/
private $createdTime = '';
/**
* @var int
*/
private $userId;
/**
* @var int
*/
private $payAmount;
/**
* @var int
*/
private $purchaseTime;
/**
* @var int
*/
private $portId;
/**
* @var int
*/
private $gatewayId;
/**
* @var string
*/
private $gatewayMac;
/**
* @var int
*/
private $stationId;
/**
* @var int
*/
private $portLogicId;
/**
* @var State
*/
private $currentState;
/**
* @var int
*/
private $stateCode;
/**
* @var array
*/
private $orderCache;
/**
* @var string
*/
private $portName;
/**
* @var string
*/
private $stationName;
public function __get($name)
{
return $this->$name;
}
/**
* @param \Redis $redis
* @return array|bool
*/
public function getOrderCache(\Redis $redis)
{
if(isset($this->orderCache) === false){
$keyName = State::ORDER_HASH_PREFIX . $this->id;
if ($redis->exists($keyName) == false) {
return false;
}
$this->orderCache = $redis->hGetAll($keyName);
foreach ($this->orderCache as $key => $value) {
$this->$key = $value;
}
}
return $this->orderCache;
}
public function setOrderCache(\Redis $redis, $orderCache): void
{
$this->orderCache = $orderCache;
$redis->hMset(State::ORDER_HASH_PREFIX . $this->id, $orderCache);
}
/**
* @return State
*/
public function getCurrentState(): State
{
return $this->currentState;
}
/**
* @param State $currentState
*/
public function setCurrentState(State $currentState): void
{
$this->currentState = $currentState;
}
/**
* @return int
*/
public function getStateCode(): int
{
return $this->stateCode;
}
/**
* @param int $stateCode
*/
public function setStateCode(int $stateCode): void
{
$this->stateCode = $stateCode;
}
/**
* @return string
*/
public function getCreatedTime(): string
{
return $this->createdTime;
}
/**
* @param string $createdTime
*/
public function setCreatedTime(string $createdTime): void
{
$this->createdTime = $createdTime;
}
/**
* @return int
*/
public function getUserId(): int
{
return $this->userId;
}
/**
* @param int $userId
*/
public function setUserId(int $userId): void
{
$this->userId = $userId;
}
/**
* @return int
*/
public function getPayAmount(): int
{
return $this->payAmount;
}
/**
* @param int $payAmount
*/
public function setPayAmount(int $payAmount): void
{
$this->payAmount = $payAmount;
}
/**
* @return int
*/
public function getPurchaseTime(): int
{
return $this->purchaseTime;
}
/**
* @param int $purchaseTime
*/
public function setPurchaseTime(int $purchaseTime): void
{
$this->purchaseTime = $purchaseTime;
}
/**
* @return int
*/
public function getPortId(): int
{
return $this->portId;
}
/**
* @param int $portId
*/
public function setPortId(int $portId): void
{
$this->portId = $portId;
}
/**
* @return int
*/
public function getGatewayId(): int
{
return $this->gatewayId;
}
/**
* @param int $gatewayId
*/
public function setGatewayId(int $gatewayId): void
{
$this->gatewayId = $gatewayId;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @param int $id
*/
public function setId(int $id): void
{
$this->id = $id;
}
/**
* @return string
*/
public function getGatewayMac(): string
{
return $this->gatewayMac;
}
/**
* @param string $gatewayMac
*/
public function setGatewayMac(string $gatewayMac): void
{
$this->gatewayMac = $gatewayMac;
}
/**
* @return int
*/
public function getPortLogicId(): int
{
return $this->portLogicId;
}
/**
* @param int $portLogicId
*/
public function setPortLogicId(int $portLogicId): void
{
$this->portLogicId = $portLogicId;
}
/**
* @return string
*/
public function getPortName(): string
{
return $this->portName;
}
/**
* @param string $portName
*/
public function setPortName(string $portName): void
{
$this->portName = $portName;
}
/**
* @return string
*/
public function getStationName(): string
{
return $this->stationName;
}
/**
* @param string $stationName
*/
public function setStationName(string $stationName): void
{
$this->stationName = $stationName;
}
/**
* @return int
*/
public function getStationId(): int
{
return $this->stationId;
}
/**
* @param int $stationId
*/
public function setStationId(int $stationId): void
{
$this->stationId = $stationId;
}
/**
* @return string
*/
public function getOutTradeNo(): string
{
return $this->outTradeNo;
}
/**
* @param string $outTradeNo
*/
public function setOutTradeNo(string $outTradeNo): void
{
$this->outTradeNo = $outTradeNo;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 下午6:22
*/
namespace Lib\cdz_order\adaptor;
use Lib\cdz_order\Order;
use Lib\redis\RedisSingle;
class UsingOrderAdaptor
{
private $order;
public function __construct(Order $order) {
$this->order = $order;
}
public function adaptor()
{
$orderCache = $this->order->getOrderCache(RedisSingle::getRedis());
return [
'port_id' => $orderCache['portId'],
'station_id' => $orderCache['stationId'],
'state' => $orderCache['stateCode'],
'order_id' => $orderCache['id'],
'charger_time' => $orderCache['purchaseTime'],
'created_at' => date('Y-m-d H:i:s',$orderCache['createdTime']),
'port_name' => $orderCache['portName'],
'order_amount' => number_format($orderCache['payAmount']/100,2),
'start_time' => isset($orderCache['startTime']) ? date('Y-m-d H:i:s',$orderCache['startTime']): null,
'end_time' => isset($orderCache['endTime']) ? date('Y-m-d H:i:s',$orderCache['endTime']) : null,
'shed_time' => isset($orderCache['shedTime']) ? date('Y-m-d H:i:s',$orderCache['shedTime']) : null,
'station_name' => $orderCache['stationName'],
];
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:34
*/
namespace Lib\cdz_order\order;
use Lib\cdz_order\Order;
use Lib\cdz_order\state\State;
class SaveOrder
{
protected $state;
protected $redis;
public function __construct(State $state)
{
$this->state = $state;
$this->redis = $state->getRedis();
}
public function saveCreatedTime()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[0], $this->state->getOrder()->getCreatedTime());
}
public function saveStartTime()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[2], $this->state->getStartTime());
}
public function saveShedTime()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[4], $this->state->getShedTime());
}
public function savePortOfflineTime()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[5], $this->state->getOfflineTime());
}
public function savePortOnlineTime()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[6], $this->state->getOnlineTime());
}
public function saveStateCode()
{
$this->redis->hSet($this->state->getKeyName(), State::FIELD[7], $this->state->getOrder()->getStateCode());
}
public function pipe()
{
$this->state->getRedis()->multi(2);
}
public function exec()
{
$this->state->getRedis()->exec();
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:36
*/
namespace Lib\cdz_order\state;
use Lib\cdz_order\Order;
class Charger extends State
{
public function __construct(Order $order, \Redis $redis) { parent::__construct($order, $redis); }
public function toCharger()
{
// TODO: Implement toCharger() method.
}
public function toPortShed()
{
// TODO: Implement toPortShed() method.
}
public function toPowerExceed()
{
// TODO: Implement toPowerExceed() method.
}
public function toFull()
{
// TODO: Implement toFull() method.
}
public function toFinish()
{
// TODO: Implement toFinish() method.
}
public function toOffline()
{
// TODO: Implement toOffline() method.
}
public function toOnline()
{
// TODO: Implement toOnline() method.
}
public function toWaiting()
{
// TODO: Implement toWaiting() method.
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午10:49
*/
namespace Lib\cdz_order\state;
use Lib\cdz_order\Order;
class Created extends State
{
/**
* Created constructor.
* @param Order $order
* @param \Redis $redis
* @throws \ReflectionException
*/
public function __construct(Order $order, \Redis $redis)
{
parent::__construct($order, $redis);
$reflection = new \ReflectionClass($order);
$properties = $reflection->getDefaultProperties();
$attributes = array_keys($properties);
foreach ($attributes as $attribute) {
$properties[$attribute] = $order->$attribute;
}
unset($properties['orderCache']);
$redis->hMset($this->keyName, $properties);
$redis->expire($this->keyName,60 * 60 * 24 * 2);
}
public function toCharger()
{
// TODO: Implement toCharger() method.
}
public function toPortShed()
{
// TODO: Implement toPortShed() method.
}
public function toPowerExceed()
{
// TODO: Implement toPowerExceed() method.
}
public function toFull()
{
// TODO: Implement toFull() method.
}
public function toFinish()
{
// TODO: Implement toFinish() method.
}
public function toOffline()
{
// TODO: Implement toOffline() method.
}
public function toOnline()
{
// TODO: Implement toOnline() method.
}
/**
* 创建的订单状态转变为等待充电
*/
public function toWaiting()
{
$this->order->setStateCode(-1);
$this->saveOrder->saveStateCode();
$this->order->setCurrentState(new WaitingCharger($this->order,$this->redis));
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:39
*/
namespace Lib\cdz_order\state;
class Finish
{
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午10:32
*/
namespace Lib\cdz_order\state;
use Lib\cdz_order\Order;
class Offline extends State
{
public function toWaiting()
{
// TODO: Implement toWaiting() method.
}
public function __construct(Order $order, \Redis $redis, int $offlineReason = 1)
{
parent::__construct($order, $redis);
$this->offlineReason = $offlineReason;
}
/**
*
*/
public function toCharger()
{
$purchaseTime = $this->order->getPurchaseTime();
$startTime = $this->getStartTime();
$offlineTime = $this->getOfflineTime();
$this->onlineTime = time();
if ($this->offlineReason == 1) {
$remainTime = $purchaseTime * 60 - ($offlineTime - $startTime);
$this->remainChargerTime = (int)ceil($remainTime / 60);
} else {
$remainTime = $purchaseTime * 60 - ($this->onlineTime - $startTime);
$this->remainChargerTime = $remainTime;
}
$this->saveOrder->savePortOnlineTime();
$this->order->setCurrentState(new Charger($this->order,$this->redis));
}
public function toPortShed()
{
// TODO: Implement toPortShed() method.
}
public function toPowerExceed()
{
// TODO: Implement toPowerExceed() method.
}
public function toFull()
{
// TODO: Implement toFull() method.
}
public function toFinish()
{
// TODO: Implement toFinish() method.
}
public function toOffline()
{
// TODO: Implement toOffline() method.
}
public function toOnline()
{
// TODO: Implement toOnline() method.
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午10:32
*/
namespace Lib\cdz_order\state;
class Online extends State
{
public function toCharger()
{
// TODO: Implement toCharger() method.
}
public function toPortShed()
{
// TODO: Implement toPortShed() method.
}
public function toPowerExceed()
{
// TODO: Implement toPowerExceed() method.
}
public function toFull()
{
// TODO: Implement toFull() method.
}
public function toFinish()
{
// TODO: Implement toFinish() method.
}
public function toOffline()
{
// TODO: Implement toOffline() method.
}
public function toOnline()
{
// TODO: Implement toOnline() method.
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:36
*/
namespace Lib\cdz_order\state;
class PortShed
{
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:30
*/
namespace Lib\cdz_order\state;
use Lib\cdz_order\Order;
use Lib\cdz_order\order\SaveOrder;
abstract class State
{
/**
* 订单状态包含的参数
*/
const FIELD = [
'createdTime',
'purchaseTime',
'startTime',
'finishTime',
'shedTime',
'offlineTime',
'onlineTime',
'stateCode',
];
/**
* 订单状态hash前缀
*/
const ORDER_HASH_PREFIX = 'cdz:order:state:';
/**
* @var Order
*/
protected $order;
/**
* @var SaveOrder
*/
protected $saveOrder;
/**
* @var string
*/
protected $keyName = '';
/**
* @var \Redis
*/
protected $redis;
/**
* @var string
*/
protected $shedTime;
/**
* @var string
*/
protected $startTime;
/**
* @var string
*/
protected $endTime;
/**
* @var string
*/
protected $offlineTime;
/**
* @var string
*/
protected $onlineTime;
/**
* @var int
*/
protected $offlineReason;
/**
* @var int
*/
protected $remainChargerTime;
/**
* State constructor.
* @param Order $order
* @param \Redis $redis
*/
public function __construct(Order $order, \Redis $redis)
{
$this->order = $order;
$this->redis = $redis;
$this->keyName = self::ORDER_HASH_PREFIX . $order->getId();
$this->saveOrder = new SaveOrder($this);
$orderCache = $order->getOrderCache($redis);
if (is_array($orderCache)) {
foreach ($orderCache as $key => $value) {
if (isset($value) === true) {
if (property_exists($this, $key) === true) {
$this->$key = $value;
}
}
}
}
}
abstract public function toCharger();
abstract public function toPortShed();
abstract public function toPowerExceed();
abstract public function toFull();
abstract public function toFinish();
abstract public function toOffline();
abstract public function toOnline();
abstract public function toWaiting();
/**
* @return Order
*/
public function getOrder(): Order
{
return $this->order;
}
/**
* @param Order $order
*/
public function setOrder(Order $order): void
{
$this->order = $order;
}
/**
* @return SaveOrder
*/
public function getSaveOrder(): SaveOrder
{
return $this->saveOrder;
}
/**
* @param SaveOrder $saveOrder
*/
public function setSaveOrder(SaveOrder $saveOrder): void
{
$this->saveOrder = $saveOrder;
}
/**
* @return string
*/
public function getKeyName(): string
{
return $this->keyName;
}
/**
* @param string $keyName
*/
public function setKeyName(string $keyName): void
{
$this->keyName = $keyName;
}
/**
* @return \Redis
*/
public function getRedis(): \Redis
{
return $this->redis;
}
/**
* @param \Redis $redis
*/
public function setRedis(\Redis $redis): void
{
$this->redis = $redis;
}
/**
* @return string
*/
public function getShedTime(): string
{
return $this->shedTime;
}
/**
* @param string $shedTime
*/
public function setShedTime(string $shedTime): void
{
$this->shedTime = $shedTime;
}
/**
* @return string
*/
public function getOfflineTime(): string
{
return $this->offlineTime;
}
/**
* @param string $offlineTime
*/
public function setOfflineTime(string $offlineTime): void
{
$this->offlineTime = $offlineTime;
}
/**
* @return string
*/
public function getOnlineTime(): string
{
return $this->onlineTime;
}
/**
* @param string $onlineTime
*/
public function setOnlineTime(string $onlineTime): void
{
$this->onlineTime = $onlineTime;
}
/**
* @return int
*/
public function getOfflineReason(): int
{
return $this->offlineReason;
}
/**
* @param int $offlineReason
*/
public function setOfflineReason(int $offlineReason): void
{
$this->offlineReason = $offlineReason;
}
/**
* @return int
*/
public function getRemainChargerTime(): int
{
return $this->remainChargerTime;
}
/**
* @param int $remainChargerTime
*/
public function setRemainChargerTime(int $remainChargerTime): void
{
$this->remainChargerTime = $remainChargerTime;
}
/**
* @return string
*/
public function getStartTime(): string
{
return $this->startTime;
}
/**
* @param string $startTime
*/
public function setStartTime(string $startTime): void
{
$this->startTime = $startTime;
}
/**
* @return string
*/
public function getEndTime(): string
{
return $this->endTime;
}
/**
* @param string $endTime
*/
public function setEndTime(string $endTime): void
{
$this->endTime = $endTime;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/16
* Time: 上午9:36
*/
namespace Lib\cdz_order\state;
use Lib\cdz_order\Order;
class WaitingCharger extends State
{
public function __construct(Order $order, \Redis $redis) { parent::__construct($order, $redis); }
public function toWaiting()
{
// TODO: Implement toWaiting() method.
}
/**
* 订单从等待充电转为开始充电状态
*/
public function toCharger(): void
{
$this->setStartTime(time());
$this->order->setStateCode(12);
$this->order->setCurrentState(new Charger($this->order, $this->redis));
$this->saveOrder->pipe();
$this->saveOrder->saveStartTime();
$this->saveOrder->saveStateCode();
$this->saveOrder->exec();
$this->order->setCurrentState(new Charger($this->order, $this->redis));
}
/**
* @throws \Exception
*/
public function toPortShed()
{
throw new \Exception(' waiting state can not change to port shed');
// TODO: Implement toPortShed() method.
}
/**
* @throws \Exception
*/
public function toPowerExceed()
{
throw new \Exception('waiting state can not change to power exceed');
// TODO: Implement toPowerExceed() method.
}
/**
* @throws \Exception
*/
public function toFull()
{
throw new \Exception('waiting state can not change to full state');
// TODO: Implement toFull() method.
}
public function toFinish()
{
// TODO: Implement toFinish() method.
}
/**
* 充电中口子发生离线,订单状态变为离线
*/
public function toOffline()
{
$this->offlineTime = time();
$this->saveOrder->savePortOfflineTime();
$this->order->setCurrentState(new Offline($this->order, $this->redis));
}
/**
* @throws \Exception
*/
public function toOnline()
{
throw new \Exception('waiting state can not change to online');
// TODO: Implement toOnline() method.
}
public function toChangePort(int $portId, string $portName,int $lastPortId,int $logicNum)
{
$this->order->setPortId($portId);
$this->order->setPortName($portName);
$this->redis->multi(2);
$this->redis->hMset($this->keyName, ['portId' => $portId, 'portName' => $portName,'portLogicId' => $logicNum]);
$this->redis->hDel('port:using_order_id',$lastPortId);
$this->redis->hSet('port:using_order_id',$portId,$this->order->getId());
$this->redis->zDelete('port:using_user_id',$lastPortId);
$this->redis->zAdd('port:using_user_id',$this->order->getUserId(),$portId);
$this->redis->exec();
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/10
* Time: 上午10:57
*/
namespace Lib\order_exception;
class Exception
{
const STATE_MESSAGE = [
'12' => '开始充电',
'10' => '口子离线',
'11' => '口子上线',
'13' => '开始充电失败(异常)',
'14' => '插口脱落',
'30' => '充电计时结束',
'31' => '远程关闭',
'32' => '插口脱落结束充电',
'34' => '功率超限结束充电',
'99' => '下发开始充电命令',
'98' => '更换充电口',
'97' => '下发结束充电命令',
'96' => '插口脱落超过10分钟,结束充电',
'95' => '3分钟未插上插头,结束充电并退款',
];
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/7/10
* Time: 上午11:09
*/
namespace Lib\order_exception;
use Lib\Log;
use Illuminate\Database\Capsule\Manager as Capsule;
class OrderTrace
{
/**
* @var string
*/
private $orderId ='';
/**
* @var string
*/
private $state = '';
/**
* @var array
*/
private $data = [];
/**
* OrderTrace constructor.
* @param string $state
*/
public function __construct($state = '') {
$this->state = $state;
}
/**
* @return string
*/
public function getOrderId(): string
{
return $this->orderId;
}
/**
* @param string $orderId
*/
public function setOrderId(string $orderId): void
{
$this->orderId = $orderId;
}
/**
* 按照state记录订单异常
*/
public function writeTrace()
{
if (!isset(Exception::STATE_MESSAGE[$this->state]))
{
Log::error('记录订单异常无次state'."($this->state)");
return ;
}
try{
$date = date('Y-m-d H:i:s');
Capsule::table('wx_charger_orders_exception')->insert([
'state' => $this->state,
'desc' => Exception::STATE_MESSAGE[$this->state],
'data' => json_encode($this->data),
'created_at' => $date,
'updated_at' => $date,
'order_id' => $this->orderId,
]);
}catch (\Exception $exception)
{
Log::error($exception->getMessage());
}
}
/**
* 记录订单异常
* @param int $state
* @param string $message
*/
public function writeRawTrace(int $state,string $message)
{
try{
$date = date('Y-m-d H:i:s');
Capsule::table('wx_charger_orders_exception')->insert([
'state' => $this->state,
'desc' => $message,
'data' => json_encode($this->data),
'created_at' => $date,
'updated_at' => $date,
'order_id' => $this->orderId,
]);
}catch (\Exception $exception)
{
Log::error($exception->getMessage());
}
}
/**
* @return array
*/
public function getData(): array
{
return $this->data;
}
/**
* @param array $data
*/
public function setData(array $data): void
{
$this->data = $data;
}
}
<?php
/**
* Created by PhpStorm.
* User: suhangyang
* Date: 2018/5/7
* Time: 下午4:55
*/
namespace Lib\redis;
use Illuminate\Support\Facades\Redis;
use Log;
class MyRedis
{
/**
* @var \Redis
*/
private $redis;
/**
* @var \Redis
*/
private $pipe;
/**
* @var bool
*/
private $isUsePipe = false;
public function __construct()
{
try {
$this->redis = new \Redis();
$this->redis->connect(env('REDIS_HOST'), 6379);
$this->redis->select(4);
} catch (\RedisException $exception) {
Log::error($exception->getMessage());
}
}
/**
* @return \Redis
*/
public function getRedis(): \Redis
{
return $this->redis;
}
/**
* @param \Redis $redis
*/
public function setRedis(\Redis $redis)
{
$this->redis = $redis;
}
public function getGatewayMacById($id)
{
if ($this->isUsePipe === true) {
return $this->pipe->hGet(RedisKey::GATEWAY_ID_MAC_HASH, $id);
}
return $this->redis->hGet(RedisKey::GATEWAY_ID_MAC_HASH, $id);
}
public function getPortLogicByMac($mac)
{
if ($this->isUsePipe === true) {
return $this->pipe->hGet(RedisKey::GATEWAY_PORT_MAC_LOGIC_ONEHASH, $mac);
}
return $this->redis->hGet(RedisKey::GATEWAY_PORT_MAC_LOGIC_ONEHASH, $mac);
}
public function getPortMacById($id)
{
if ($this->isUsePipe === true) {
return $this->pipe->hGet(RedisKey::GATEWAY_PORT_ID_MAC_HASH, $id);
}
return $this->redis->hGet(RedisKey::GATEWAY_PORT_ID_MAC_HASH, $id);
}
public function pipe()
{
$this->pipe = $this->redis->multi(\Redis::PIPELINE);
$this->isUsePipe = true;
return $this->redis;
}
/**
* @return array
*/
public function exec()
{
return $this->pipe->exec();
}
/**
* @return \Redis
*/
public function getPipe(): \Redis
{
return $this->pipe;
}
/**
* @param \Redis $pipe
*/
public function setPipe(\Redis $pipe)
{
$this->pipe = $pipe;
}
/**
* @return bool
*/
public function isUsePipe(): bool
{
return $this->isUsePipe;
}
/**
* @param bool $isUsePipe
*/
public function setIsUsePipe(bool $isUsePipe)
{
$this->isUsePipe = $isUsePipe;
}
}
<?php
/**
* Created by PhpStorm.
* User: suhangyang
* Date: 2018/5/11
* Time: 上午9:12
*/
namespace Lib\redis;
class RedisKey
{
const GATEWAY_PREFIX = 'cdz:gateway:';
const GATEWAY_PORT_LOGIC_MAC_HASH = ':port:logic_mac:hash';
const GATEWAY_PORT_MAC_LOGIC_HASH = ':port:mac_logic:hash';
const GATEWAY_PORT_MAC_LOGIC_ONEHASH = 'cdz:gateway:port_logic:hash';
const GATEWAY_PORT_ID_MAC_HASH = 'cdz:gateway:port:id_info:hash';
const GATEWAY_PORT_ID_LOGIC_HASH = 'cdz:gateway:port:id_logic:hash';
/**
* 网关
*/
const PORT_MAC_HASH = 'cdz:gateway:port:mac_logic_map:hash';
/**
* fixme
*/
const GATEWAY_PORT_HASH = 'cdz:gateway:port:hash';
/**
* 网关id映射mac地址hash
*/
const GATEWAY_ID_MAC_HASH = 'cdz:gateway:id_mac:hash';
/**
* 网关mac地址映射idhash
*/
const GATEWAY_MAC_ID_HASH = 'cdz:gateway:mac_id:hash';
/**
* 网关信息
*/
const GATEWAY_INFO = 'cdz:gateway:info:hash';
/**
* 口子状态zset
*/
const PORT_STATE = 'port:id_state:zset';
const GATEWAY_PORT_STATE = 'gateway:port:state:';
const STATION_PORT_STATE = 'station:port:state:';
const WX_USER_ID_OPENID_HASH ='cdz:wx_users:id_openid:hash';
const PORT_USING_ORDER_ID = 'port:using_order_id';
const PORT_USING_USER_ID = 'port:using_user_id';
const ORDER_STATE = 'cdz:order:state:zset';
/**
* 获取网关对应的口子的逻辑地址mac地址的hash KEY
* @param string $gatewayMac
* @return string
*/
public static function getGatewayPortLogicHashKey(string $gatewayMac)
{
return self::GATEWAY_PREFIX.$gatewayMac.self::GATEWAY_PORT_LOGIC_MAC_HASH;
}
public static function getGatewayPortMacHashKey(string $gatewayMac)
{
return self::GATEWAY_PREFIX.$gatewayMac.self::GATEWAY_PORT_MAC_LOGIC_HASH;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: suhangyang
* Date: 2018/5/15
* Time: 上午10:38
*/
namespace Lib\redis;
class RedisSingle
{
/**
* @var \Redis
*/
private static $redis = null;
/**
* @return \Redis
*/
public static function getRedis() : \Redis
{
if(is_null(static::$redis))
{
static::instance();
}
return static::$redis;
}
/**
* @return \Redis
*/
public static function instance()
{
if (is_null(static::$redis)) {
static::$redis = new \Redis();
static::$redis->connect('redis.test.senthink.com');
static::$redis->select(4);
}
return static::$redis;
}
public static function __callStatic($name, $arguments)
{
static::instance();
return call_user_func_array([static::$redis, $name], $arguments);
}
public static function pipe()
{
static::instance();
static::$redis = static::$redis->multi(2);
}
/**
* @return array
*/
public static function exec()
{
static::instance();
return static::$redis->exec();
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/5/31
* Time: 上午11:22
*/
namespace Lib\redis\user;
use Lib\balance\BalanceOrder;
use Lib\BaseOrder;
use Lib\redis\RedisSingle;
use Lib\wx\pay_notify\order\ChargerOrder;
use Lib\wx\pay_notify\order\ChargerOrderTime;
use Log;
class UserUsingOrder
{
const USER_USING_ORDERS = 'user:using:orders:';
const USER_USING_PORTS = 'port:using_user_id';
const ORDER_USING_PORTS = 'port:using_order_id';
/**
* @var \Redis
*/
private $redis;
/**
* @var int
*/
private $userId;
public function __construct()
{
$this->redis = RedisSingle::getRedis();
}
/**
* 添加用户正在使用的订单id
* @param \Redis $redis
* @param BaseOrder $baseOrder
*/
public function addUsingWxOrder(\Redis $redis, BaseOrder $baseOrder)
{
$this->redis = $redis;
if ($baseOrder instanceof ChargerOrderTime) {
$this->redis->hSet(self::ORDER_USING_PORTS, $baseOrder->getPort()->getPortId(), $baseOrder->getOrderId());
}
}
public function addUsingBalanceOrder(\Redis $redis, BalanceOrder $balanceOrder)
{
$this->redis = $redis;
$this->redis->hSet(self::ORDER_USING_PORTS,$balanceOrder->getPort()->getPortId(),$balanceOrder->getOrderId());
}
/**
* 更新端口正在使用的用户id
* @param int $portId
* @param int $userId
*/
public function setPortUsingUserId(int $portId, int $userId)
{
$this->redis->zAdd(self::USER_USING_PORTS, $userId, $portId);
}
/**
* 返回当前用户正在使用的端口号
* @return array
*/
public function getUserUsingPortId() : array
{
return $this->redis->zRangeByScore('port:using_user_id', $this->userId, $this->userId);
}
/**
* 获取端口正在使用的订单id
* @param $portId
* @return string
*/
public function getPortOrderId($portId)
{
return $this->redis->hGet(self::ORDER_USING_PORTS, $portId);
}
/**
* 获取端口正在使用的订单ids
* @param array $portsId
* @return array
*/
public function getPortsOrderId(array $portsId)
{
return $this->redis->hMGet(self::ORDER_USING_PORTS, $portsId);
}
/**
* @return int
*/
public function getUserId(): int
{
return $this->userId;
}
/**
* @param int $userId
*/
public function setUserId(int $userId): void
{
$this->userId = $userId;
}
/**
* @return \Redis
*/
public function getRedis(): \Redis
{
return $this->redis;
}
/**
* @param \Redis $redis
*/
public function setRedis(\Redis $redis): void
{
$this->redis = $redis;
}
}
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/5/31
* Time: 上午11:22
*/
namespace Lib\redis\user;
use Lib\balance\BalanceOrder;
use Lib\wx\pay_notify\order\ChargerOrder;
use Lib\wx\pay_notify\order\ChargerOrderTime;
class UserUsingPort
{
const USER_USING_ORDERS = 'user:orders:using:';
public function addUsingWxOrder(\Redis $redis, ChargerOrder $chargerOrder)
{
$userId = $chargerOrder->getUserId();
$key = self::USER_USING_ORDERS.$userId;
if($chargerOrder instanceof ChargerOrderTime)
{
$chargerTime = $chargerOrder->getChargerTime();
$orderId = $chargerOrder->getOrderId();
$redis->hSet($key,$orderId,json_encode([
'time' => $chargerTime,
]));
$ttl = $redis->ttl($key);
if($chargerTime * 60 > $ttl)
{
$redis->expire($key,$chargerTime * 60);
}
}
}
public function addUsingBalanceOrder(\Redis $redis,BalanceOrder $balanceOrder)
{
}
}
\ No newline at end of file
...@@ -92,13 +92,8 @@ class Send ...@@ -92,13 +92,8 @@ class Send
$message = $this->makeMessage(); $message = $this->makeMessage();
//debug
if (Gateway::isUidOnline($clientUid) === 1) { if (Gateway::isUidOnline($clientUid) === 1) {
var_dump(['send_message' => $message,'time' => date('Y-m-d H:i:s')]);
Gateway::sendToUid($clientUid, $message); Gateway::sendToUid($clientUid, $message);
$result = true; $result = true;
......
...@@ -31,21 +31,28 @@ class StopChargerCommand extends Command ...@@ -31,21 +31,28 @@ class StopChargerCommand extends Command
*/ */
private $gatewayMac; private $gatewayMac;
/**
* @var int
*/
private $stopType = 41;
/**
* @var string
*/
protected $headerCtrl = '05'; protected $headerCtrl = '05';
public function getMessageBody(): string public function getMessageBody(): string
{ {
$logicNum = sprintf('%02x',$this->logicNum); $logicNum = sprintf('%02x', $this->logicNum);
$orderId = sprintf('%012x', $this->orderId);
$orderId = sprintf('%012x',$this->orderId); $stopType = sprintf('%02x', $this->stopType);
return $this->messageBody = $logicNum.$orderId; return $this->messageBody = $logicNum . $orderId . $stopType;
} }
...@@ -125,6 +132,46 @@ class StopChargerCommand extends Command ...@@ -125,6 +132,46 @@ class StopChargerCommand extends Command
$this->headerCtrl = $headerCtrl; $this->headerCtrl = $headerCtrl;
} }
/**
* @return int
*/
public function getStopType(): int
{
return $this->stopType;
}
/**
* @param int $stopType
*/
public function setStopType(int $stopType): void
{
$this->stopType = $stopType;
}
/**
* @param string $messageBody
*/
public function setMessageBody(string $messageBody): void
{
$this->messageBody = $messageBody;
}
/**
* @param string $clientId
*/
public function setClientId(string $clientId): void
{
$this->clientId = $clientId;
}
/**
* @param string $clientUid
*/
public function setClientUid(string $clientUid): void
{
$this->clientUid = $clientUid;
}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"require": { "require": {
"illuminate/database": "^5.6", "illuminate/database": "^5.6",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^6.3",
"monolog/monolog": "^1.23" "monolog/monolog": "^1.23",
"illuminate/events": "^5.6"
} }
} }
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "964b5da01090400ae6a459d42bd37b10", "content-hash": "47c9d4401aacfaf3641ef449fa2ecf37",
"packages": [ "packages": [
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
...@@ -402,6 +402,51 @@ ...@@ -402,6 +402,51 @@
"time": "2018-05-21T14:36:25+00:00" "time": "2018-05-21T14:36:25+00:00"
}, },
{ {
"name": "illuminate/events",
"version": "v5.6.27",
"source": {
"type": "git",
"url": "https://github.com/illuminate/events.git",
"reference": "b6e73ed40478cef2ef98d5ddb27f333291606cea"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/events/zipball/b6e73ed40478cef2ef98d5ddb27f333291606cea",
"reference": "b6e73ed40478cef2ef98d5ddb27f333291606cea",
"shasum": ""
},
"require": {
"illuminate/container": "5.6.*",
"illuminate/contracts": "5.6.*",
"illuminate/support": "5.6.*",
"php": "^7.1.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.6-dev"
}
},
"autoload": {
"psr-4": {
"Illuminate\\Events\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "The Illuminate Events package.",
"homepage": "https://laravel.com",
"time": "2018-02-26T19:00:55+00:00"
},
{
"name": "illuminate/support", "name": "illuminate/support",
"version": "v5.6.23", "version": "v5.6.23",
"source": { "source": {
......
...@@ -14,6 +14,9 @@ use Lib\wx\Refund; ...@@ -14,6 +14,9 @@ use Lib\wx\Refund;
use Lib\send\Send; use Lib\send\Send;
use Lib\send\command\StopChargerCommand; use Lib\send\command\StopChargerCommand;
use Lib\Log; use Lib\Log;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
try { try {
...@@ -25,14 +28,13 @@ try { ...@@ -25,14 +28,13 @@ try {
try { try {
$queue = $rabbitMq->getQueue(); $queue = $rabbitMq->getQueue();
$queue->setName('queue_worker_check_order'); $queue->setName('queue_worker_check_order');
$queue->setFlags(AMQP_DURABLE); $queue->setFlags(AMQP_DURABLE);
} catch (Exception $exception) { } catch (Exception $exception) {
Log::debug($exception->getMessage()); Log::error($exception->getMessage());
} }
...@@ -49,96 +51,130 @@ try { ...@@ -49,96 +51,130 @@ try {
} }
Log::info('启动是否成功开始充电消费者');
try { try {
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) { $queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
$capule = new Capsule();
$capule->addConnection([
$dsn = 'mysql:dbname=cdzpay;host=db.test.senthink.com'; 'driver' => 'mysql',
$user = 'cdz'; 'host' => 'db.test.senthink.com',
$password = 'senthink123'; 'database' => 'cdzpay',
'username' => 'cdz',
try { 'password' => 'senthink123',
$dbh = new PDO($dsn, $user, $password, [ 'charset' => 'utf8',
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 'collation' => 'utf8_unicode_ci',
'prefix' => '',
]); ]);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $capule->setEventDispatcher(new Dispatcher(new Container()));
} catch (PDOException $e) { $capule->setAsGlobal();
Log::error('connnection failed'); $capule->bootEloquent();
} $message = json_decode($envelope->getBody(), true);
$data = json_decode($envelope->getBody(), true); $orderId = $message['order_id'];
Log::debug('data',$data); $orderInfo = Capsule::table('wx_charger_orders')->where('id', $orderId)->first(['is_charger', 'port_id', 'state', 'wx_user_id', 'is_charger', 'station_id', 'gateway_id', 'pay_amount', 'out_trade_no', 'logic_num', 'pay_type']);
$orderInfo = (Array)$orderInfo;
$orderId = $data['order_id']; $outTradeNo = $orderInfo['out_trade_no'];
$outTradeNo = $data['out_trade_no']; $totalFee = $orderInfo['pay_amount'];
$totalFee = $data['total_fee']; $logicNum = $orderInfo['logic_num'];
$logicNum = $data['logic_num']; $isCharger = $orderInfo['is_charger'];
$gatewayMac = $data['gateway_mac']; $portId = (int)$orderInfo['port_id'];
$orderInfo = $dbh->query('SELECT is_charger,port_id ,state FROM wx_charger_orders WHERE id = ' . $orderId); $userId = $orderInfo['wx_user_id'];
$orderInfo = $orderInfo->fetch(); $gatewayId = $orderInfo['gateway_id'];
$isCharger = $orderInfo['is_charger']; $stationId = $orderInfo['station_id'];
$portId = (int)$orderInfo['port_id']; $gatewayMac = Capsule::table('gateways')->where('id', $gatewayId)->first(['mac_address']);
$payType = $orderInfo['pay_type'];
$gatewayMac = $gatewayMac->mac_address;
if($orderInfo['state'] === 3)//如果已经退款直接抛弃 if ($orderInfo['state'] == 3)//如果已经退款直接抛弃
{ {
$queue->ack($envelope->getDeliveryTag()); $queue->ack($envelope->getDeliveryTag());
return ; Log::debug('已经退款', $orderInfo);
return;
} }
//todo 订单的端口id是否和消息中的相同,如果不同则发生过端口改变,无视该条消息 // 订单的端口id是否和消息中的相同,如果不同则发生过端口改变,无视该条消息
switch ($isCharger) { switch ($isCharger) {
case -1: case -1:
//todo 退款
$refundDesc = '充电失败'; $refundDesc = '充电失败';
break; break;
case 13: case 13:
//todo 退款
$refundDesc = '充电口打开失败'; $refundDesc = '充电口打开失败';
break; break;
case 14: case 14:
//todo 退款
$refundDesc = '充电口打开成功,但未插上插头'; $refundDesc = '充电口打开成功,但未插上插头';
break; break;
default:
break; break;
} }
if ((int)$isCharger !== 12 && $portId === $data['port_id']) { //is_charger不为12则未开始充电
//消息中的口子id与数据库中的口子id不同则更换过口子,消息作废
if ((int)$isCharger != 12) {
if ($data['pay_type'] === 1) { $date = date('Y-m-d H:i:s');
Log::debug('退款'); $outRefundNo = time() . $totalFee . rand(10000, 999999);
try {
$orderTrace = new \Lib\order_exception\OrderTrace('95');
$orderTrace->setOrderId($orderId);
$orderTrace->setData([
'out_refund_no' => $outRefundNo,
'refund_amount' => $totalFee,
'gateway_id' => $gatewayId,
'port_id' => $portId,
'station_id' => $stationId,
'out_trade_no' => $outTradeNo,
'total_fee' => $totalFee,
]);
$orderTrace->writeTrace();
} catch (Exception $exception) {
Log::error($exception->getMessage());
}
$openId = $data['openid'];
if ($payType === 1) {
$openId = $message['openid'];
$refund = new Refund(); $refund = new Refund();
...@@ -150,97 +186,95 @@ try { ...@@ -150,97 +186,95 @@ try {
$refund->setRefundFee($totalFee); $refund->setRefundFee($totalFee);
$outRefundNo = time() . $totalFee . rand(10000, 999999);
$refund->setOutRefundNo($outRefundNo); $refund->setOutRefundNo($outRefundNo);
if ($refund->refund() === true) { if ($refund->refund() === true) {
try { try {
$dbh->beginTransaction();
$sql = "UPDATE wx_charger_orders SET `refund_amount`=?, `state`=?, `refund_type`=? WHERE id= ?"; Capsule::beginTransaction();
$insertRefundRecord = "INSERT INTO wx_refund_orders (`out_refund_no`,`refund_amount`,`gateway_id`,`port_id`,`station_id`,`out_trade_no`,`total_fee`,`created_at`,`desc`) VALUES (?,?,?,?,?,?,?,?,?)"; Capsule::table('wx_refund_orders')->insert([
'out_refund_no' => $outRefundNo,
'refund_amount' => $totalFee,
'gateway_id' => $gatewayId,
'port_id' => $portId,
'station_id' => $stationId,
'out_trade_no' => $outTradeNo,
'total_fee' => $totalFee,
'created_at' => $date,
'updated_at' => $date,
'desc' => $refundDesc,
'wx_user_id' => $userId,
$result = $dbh->prepare($sql); ]);
$result = $result->execute([$totalFee, 3, 1, $orderId]); Capsule::table('wx_charger_orders')->where('id', $orderId)->update([
'state' => 3,
'refund_amount' => $totalFee,
'refund_type' => 1,
]);
$insert = $dbh->prepare($insertRefundRecord); Capsule::commit();
$insert = $insert = $insert->execute([ } catch (PDOException $exception) {
$outRefundNo,
$totalFee,
$data['gateway_id'],
$data['port_id'],
$data['station_id'],
$outTradeNo,
$totalFee,
date('Y-m-d H:i:s'),
'端口未检测到电动自行车,系统自动退款',
]); Capsule::rollBack();
$dbh->commit(); Log::error($exception->getMessage());
} catch (PDOException $exception) { Log::error('微信支付退款,更新数据失败');
$dbh->rollBack();
Log::debug($exception->getMessage());
} }
} }
} else { } else {
$userId = $data['user_id'];
// 余额支付需要将余额加回钱包,消费金额减小. // 余额支付需要将余额加回钱包,消费金额减小.
try { try {
$dbh->beginTransaction(); Capsule::beginTransaction();
$sql = "UPDATE wx_users SET `wallet_balance` = `wallet_balance` + ?, `total_cost` = `total_cost` - ? ,`current_cost` = `current_cost` - ? WHERE id = ?"; Capsule::table('wx_refund_orders')->insert([
'out_refund_no' => $outRefundNo,
$updateBalance = $dbh->prepare($sql); 'refund_amount' => $totalFee,
'gateway_id' => $gatewayId,
$updateBalance->execute([$totalFee, $totalFee, $totalFee, $userId]); 'port_id' => $portId,
'station_id' => $stationId,
$updateOrder = "UPDATE wx_charger_orders SET `state` = ?, `refund_type` = ?,`refund_amount` = ? WHERE id = ?"; 'out_trade_no' => $outTradeNo,
'total_fee' => $totalFee,
$updateOrder = $dbh->prepare($updateOrder); 'created_at' => $date,
'updated_at' => $date,
$result = $updateOrder->execute([3, 1, $totalFee, $orderId]); 'desc' => $refundDesc,
'wx_user_id' => $userId,
$insertRefundRecord = "INSERT INTO wx_refund_orders (`out_refund_no`,`refund_amount`,`gateway_id`,`port_id`,`station_id`,`out_trade_no`,`total_fee`,`created_at`,`desc`) VALUES (?,?,?,?,?,?,?,?,?)"; ]);
$insert = $dbh->prepare($insertRefundRecord);
$outRefundNo = time() . $totalFee . rand(10000, 999999); Capsule::table('wx_users')->where('id', $userId)->update([
$insert = $insert = $insert->execute([ 'wallet_balance' => Capsule::raw('wallet_balance +' . $totalFee),
$outRefundNo, 'total_cost' => Capsule::raw('total_cost - ' . $totalFee),
$totalFee, 'current_cost' => Capsule::raw('current_cost - ' . $totalFee),
$data['gateway_id'], 'updated_at' => $date,
$data['port_id'], ]);
$data['station_id'],
$outTradeNo,
$totalFee,
date('Y-m-d H:i:s'),
'端口未检测到电动自行车,系统自动退款',
Capsule::table('wx_charger_orders')->where('id', $orderId)->update([
'state' => 3,
'refund_amount' => $totalFee,
'refund_type' => 1,
'updated_at' => $date,
]); ]);
Log::debug($result); Capsule::commit();
$dbh->commit();
} catch (PDOException $exception) { } catch (PDOException $exception) {
Log::debug($exception->getMessage());
} Capsule::rollBack();
Log::error($exception->getMessage());
}
} }
...@@ -253,44 +287,36 @@ try { ...@@ -253,44 +287,36 @@ try {
$stopCommand->setLogicNum($logicNum); $stopCommand->setLogicNum($logicNum);
$stopCommand->setStopType(43);
$send = new Send($stopCommand); $send = new Send($stopCommand);
if ($send->send() === false) { $redis = \Lib\redis\RedisSingle::getRedis();
Log::debug('结束订单命令发送失败');
}else{
Log::debug('发送结束充电命令'.$orderId); $key = 'cdz:order:state:'.$orderId;
}
$redis->hSet($key,'isRefund',1);
//todo 更新订单表和存储退款表
if ($send->send() === false) {
}else{ Log::debug('结束订单命令发送失败');
$stopCommand = new StopChargerCommand();
$stopCommand->setOrderId($orderId);
$stopCommand->setGatewayMac($gatewayMac); } else {
$stopCommand->setLogicNum($logicNum); Log::debug('发送结束充电命令' . $orderId);
}
$send = new Send($stopCommand);
} else {
echo '已更改过口子,此消息作废处理'.PHP_EOL; Log::debug("已更改过口子,次消息作废");
} }
unset($dbh); Log::debug('receiver', ['message' => json_decode($envelope->getBody(), true), 'time' => date('H:i:s')]);
Log::debug(['message' => json_decode($envelope->getBody(),true), 'time' => date('H:i:s')]);
$queue->ack($envelope->getDeliveryTag()); $queue->ack($envelope->getDeliveryTag());
//$queue->ack($envelope->getDeliveryTag()); //$queue->ack($envelope->getDeliveryTag());
......
...@@ -11,8 +11,11 @@ use Lib\rabbit_mq\MyRabbitMq; ...@@ -11,8 +11,11 @@ use Lib\rabbit_mq\MyRabbitMq;
use Lib\send\command\StopChargerCommand; use Lib\send\command\StopChargerCommand;
use Lib\Log; use Lib\Log;
use Lib\send\Send; use Lib\send\Send;
use Lib\api\message\ChargerTimeoutMessage; use Illuminate\Database\Capsule\Manager as Capsule;
use Lib\api\message\Push; use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
use Lib\cdz_order\Order;
use Lib\redis\RedisSingle;
try { try {
$rabbitMq = new MyRabbitMq(); $rabbitMq = new MyRabbitMq();
...@@ -46,75 +49,61 @@ try { ...@@ -46,75 +49,61 @@ try {
} catch (AMQPConnectionException $e) { } catch (AMQPConnectionException $e) {
} }
Log::info('启动消费者'); Log::info('启动检查口子脱落消费者');
try { try {
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) { $queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
$dsn = 'mysql:dbname=cdzpay;host=db.test.senthink.com'; $capule = new Capsule();
$user = 'cdz';
$password = 'senthink123';
try { $capule->addConnection([
$dbh = new PDO($dsn, $user, $password, [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 'driver' => 'mysql',
'host' => 'db.test.senthink.com',
'database' => 'cdzpay',
'username' => 'cdz',
'password' => 'senthink123',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]); ]);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $capule->setEventDispatcher(new Dispatcher(new Container()));
} catch (PDOException $e) { $capule->setAsGlobal();
echo 'Connection failed: ' . $e->getMessage();
}
$capule->bootEloquent();
$data = json_decode($envelope->getBody(), true); $data = json_decode($envelope->getBody(), true);
Log::debug('body',$data); if (isset($data['order_id']) === false) {
$queue->ack($envelope->getDeliveryTag());
$orderId = $data['order_id'];
$orderInfo = $dbh->query('SELECT is_stop,port_id,created_at,charger_time,wx_user_id FROM wx_charger_orders WHERE id = ' . $orderId);
$orderInfo = $orderInfo->fetch();
//todo 查询口子状态是否为插口脱落,是则下发结束充电命令。
if(isset($orderInfo['port_id'])) {
try {
$redis = new \Redis();
$redis->pconnect('redis.test.senthink.com', 6379, 1);
$redis->select(4);
$portId = $orderInfo['port_id'];
$redis->multi(2); return;
$redis->zScore('port:id_state:zset',$portId);
$redis->hGet('port:id_logic:hash',$portId); }
$orderId = $data['order_id'];
$result = $redis->exec(); $shedTime = $data['shed_time'];
$portState = $result[0];
$logicNum = $result['1']; $order = new Order();
$order->setId($orderId);
if(!isset($logicNum)) $orderCache = $order->getOrderCache(RedisSingle::getRedis());
{
Log::error('逻辑地址未找到');
return ; if ($orderCache === false) {
$queue->ack($envelope->getDeliveryTag());
return;
} }
if($portState == 14)
{
if (isset($orderCache['shedTime'])) {
if ($shedTime == $orderCache['shedTime']) {
if ($order->getStateCode() == 14) {
$gatewayMac = $data['gateway_mac']; $gatewayMac = $data['gateway_mac'];
$stopCommand = new StopChargerCommand(); $stopCommand = new StopChargerCommand();
...@@ -123,45 +112,38 @@ try { ...@@ -123,45 +112,38 @@ try {
$stopCommand->setGatewayMac($gatewayMac); $stopCommand->setGatewayMac($gatewayMac);
$stopCommand->setLogicNum($logicNum); $stopCommand->setStopType(42);
$stopCommand->setLogicNum($order->getPortLogicId());
$send = new Send($stopCommand); $stopCommand->setClientUid($gatewayMac);
$send = new Send($stopCommand);
if ($send->send() === false) { if ($send->send() === false) {
Log::debug('结束订单命令发送失败'); Log::debug('结束订单命令发送失败(插口脱落十分钟)');
}else{
Log::debug('发送结束充电命令'.$orderId); } else {
}
Log::debug('发送结束充电命令', ['order_id' => $orderId, 'desc' => '插口脱落十分钟']);
$chargerTimeoutMessage = new ChargerTimeoutMessage();
$chargerTimeoutMessage->setStartTime($orderInfo['created_at']); }
$chargerTimeoutMessage->setChargerTime($orderInfo['charger_time']); $orderTrace = new \Lib\order_exception\OrderTrace(96);
$chargerTimeoutMessage->setFirst(date('Y-m-d H:i:s')); $orderTrace->setOrderId($orderId);
$push = new Push(); $orderTrace->writeTrace();
$push->push($chargerTimeoutMessage,$orderInfo['wx_user_id']);
} }
} catch (Exception $exception) {
Log::error($exception->getMessage());
} }
} }
$queue->ack($envelope->getDeliveryTag()); $queue->ack($envelope->getDeliveryTag());
......
...@@ -7,8 +7,8 @@ $baseDir = dirname($vendorDir); ...@@ -7,8 +7,8 @@ $baseDir = dirname($vendorDir);
return array( return array(
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
); );
...@@ -15,6 +15,7 @@ return array( ...@@ -15,6 +15,7 @@ return array(
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'Lib\\' => array($baseDir . '/Lib'), 'Lib\\' => array($baseDir . '/Lib'),
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support'), 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support'),
'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'),
'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'), 'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'),
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), 'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),
......
...@@ -8,9 +8,9 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28 ...@@ -8,9 +8,9 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
{ {
public static $files = array ( public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
); );
...@@ -38,6 +38,7 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28 ...@@ -38,6 +38,7 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
'I' => 'I' =>
array ( array (
'Illuminate\\Support\\' => 19, 'Illuminate\\Support\\' => 19,
'Illuminate\\Events\\' => 18,
'Illuminate\\Database\\' => 20, 'Illuminate\\Database\\' => 20,
'Illuminate\\Contracts\\' => 21, 'Illuminate\\Contracts\\' => 21,
'Illuminate\\Container\\' => 21, 'Illuminate\\Container\\' => 21,
...@@ -91,6 +92,10 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28 ...@@ -91,6 +92,10 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
array ( array (
0 => __DIR__ . '/..' . '/illuminate/support', 0 => __DIR__ . '/..' . '/illuminate/support',
), ),
'Illuminate\\Events\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/events',
),
'Illuminate\\Database\\' => 'Illuminate\\Database\\' =>
array ( array (
0 => __DIR__ . '/..' . '/illuminate/database', 0 => __DIR__ . '/..' . '/illuminate/database',
......
...@@ -409,6 +409,53 @@ ...@@ -409,6 +409,53 @@
] ]
}, },
{ {
"name": "illuminate/events",
"version": "v5.6.27",
"version_normalized": "5.6.27.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/events.git",
"reference": "b6e73ed40478cef2ef98d5ddb27f333291606cea"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/events/zipball/b6e73ed40478cef2ef98d5ddb27f333291606cea",
"reference": "b6e73ed40478cef2ef98d5ddb27f333291606cea",
"shasum": ""
},
"require": {
"illuminate/container": "5.6.*",
"illuminate/contracts": "5.6.*",
"illuminate/support": "5.6.*",
"php": "^7.1.3"
},
"time": "2018-02-26T19:00:55+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.6-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Illuminate\\Events\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "The Illuminate Events package.",
"homepage": "https://laravel.com"
},
{
"name": "illuminate/support", "name": "illuminate/support",
"version": "v5.6.23", "version": "v5.6.23",
"version_normalized": "5.6.23.0", "version_normalized": "5.6.23.0",
......
<?php
namespace Illuminate\Events;
use Illuminate\Container\Container;
use Illuminate\Contracts\Queue\Job;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class CallQueuedListener implements ShouldQueue
{
use InteractsWithQueue;
/**
* The listener class name.
*
* @var string
*/
public $class;
/**
* The listener method.
*
* @var string
*/
public $method;
/**
* The data to be passed to the listener.
*
* @var array
*/
public $data;
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries;
/**
* The timestamp indicating when the job should timeout.
*
* @var int
*/
public $timeoutAt;
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout;
/**
* Create a new job instance.
*
* @param string $class
* @param string $method
* @param array $data
* @return void
*/
public function __construct($class, $method, $data)
{
$this->data = $data;
$this->class = $class;
$this->method = $method;
}
/**
* Handle the queued job.
*
* @param \Illuminate\Container\Container $container
* @return void
*/
public function handle(Container $container)
{
$this->prepareData();
$handler = $this->setJobInstanceIfNecessary(
$this->job, $container->make($this->class)
);
call_user_func_array(
[$handler, $this->method], $this->data
);
}
/**
* Set the job instance of the given class if necessary.
*
* @param \Illuminate\Contracts\Queue\Job $job
* @param mixed $instance
* @return mixed
*/
protected function setJobInstanceIfNecessary(Job $job, $instance)
{
if (in_array(InteractsWithQueue::class, class_uses_recursive(get_class($instance)))) {
$instance->setJob($job);
}
return $instance;
}
/**
* Call the failed method on the job instance.
*
* The event instance and the exception will be passed.
*
* @param \Exception $e
* @return void
*/
public function failed($e)
{
$this->prepareData();
$handler = Container::getInstance()->make($this->class);
$parameters = array_merge($this->data, [$e]);
if (method_exists($handler, 'failed')) {
call_user_func_array([$handler, 'failed'], $parameters);
}
}
/**
* Unserialize the data if needed.
*
* @return void
*/
protected function prepareData()
{
if (is_string($this->data)) {
$this->data = unserialize($this->data);
}
}
/**
* Get the display name for the queued job.
*
* @return string
*/
public function displayName()
{
return $this->class;
}
/**
* Prepare the instance for cloning.
*
* @return void
*/
public function __clone()
{
$this->data = array_map(function ($data) {
return is_object($data) ? clone $data : $data;
}, $this->data);
}
}
<?php
namespace Illuminate\Events;
use Exception;
use ReflectionClass;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Container\Container;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Contracts\Broadcasting\Factory as BroadcastFactory;
use Illuminate\Contracts\Container\Container as ContainerContract;
class Dispatcher implements DispatcherContract
{
/**
* The IoC container instance.
*
* @var \Illuminate\Contracts\Container\Container
*/
protected $container;
/**
* The registered event listeners.
*
* @var array
*/
protected $listeners = [];
/**
* The wildcard listeners.
*
* @var array
*/
protected $wildcards = [];
/**
* The cached wildcard listeners.
*
* @var array
*/
protected $wildcardsCache = [];
/**
* The queue resolver instance.
*
* @var callable
*/
protected $queueResolver;
/**
* Create a new event dispatcher instance.
*
* @param \Illuminate\Contracts\Container\Container|null $container
* @return void
*/
public function __construct(ContainerContract $container = null)
{
$this->container = $container ?: new Container;
}
/**
* Register an event listener with the dispatcher.
*
* @param string|array $events
* @param mixed $listener
* @return void
*/
public function listen($events, $listener)
{
foreach ((array) $events as $event) {
if (Str::contains($event, '*')) {
$this->setupWildcardListen($event, $listener);
} else {
$this->listeners[$event][] = $this->makeListener($listener);
}
}
}
/**
* Setup a wildcard listener callback.
*
* @param string $event
* @param mixed $listener
* @return void
*/
protected function setupWildcardListen($event, $listener)
{
$this->wildcards[$event][] = $this->makeListener($listener, true);
$this->wildcardsCache = [];
}
/**
* Determine if a given event has listeners.
*
* @param string $eventName
* @return bool
*/
public function hasListeners($eventName)
{
return isset($this->listeners[$eventName]) || isset($this->wildcards[$eventName]);
}
/**
* Register an event and payload to be fired later.
*
* @param string $event
* @param array $payload
* @return void
*/
public function push($event, $payload = [])
{
$this->listen($event.'_pushed', function () use ($event, $payload) {
$this->dispatch($event, $payload);
});
}
/**
* Flush a set of pushed events.
*
* @param string $event
* @return void
*/
public function flush($event)
{
$this->dispatch($event.'_pushed');
}
/**
* Register an event subscriber with the dispatcher.
*
* @param object|string $subscriber
* @return void
*/
public function subscribe($subscriber)
{
$subscriber = $this->resolveSubscriber($subscriber);
$subscriber->subscribe($this);
}
/**
* Resolve the subscriber instance.
*
* @param object|string $subscriber
* @return mixed
*/
protected function resolveSubscriber($subscriber)
{
if (is_string($subscriber)) {
return $this->container->make($subscriber);
}
return $subscriber;
}
/**
* Fire an event until the first non-null response is returned.
*
* @param string|object $event
* @param mixed $payload
* @return array|null
*/
public function until($event, $payload = [])
{
return $this->dispatch($event, $payload, true);
}
/**
* Fire an event and call the listeners.
*
* @param string|object $event
* @param mixed $payload
* @param bool $halt
* @return array|null
*/
public function fire($event, $payload = [], $halt = false)
{
return $this->dispatch($event, $payload, $halt);
}
/**
* Fire an event and call the listeners.
*
* @param string|object $event
* @param mixed $payload
* @param bool $halt
* @return array|null
*/
public function dispatch($event, $payload = [], $halt = false)
{
// When the given "event" is actually an object we will assume it is an event
// object and use the class as the event name and this event itself as the
// payload to the handler, which makes object based events quite simple.
list($event, $payload) = $this->parseEventAndPayload(
$event, $payload
);
if ($this->shouldBroadcast($payload)) {
$this->broadcastEvent($payload[0]);
}
$responses = [];
foreach ($this->getListeners($event) as $listener) {
$response = $listener($event, $payload);
// If a response is returned from the listener and event halting is enabled
// we will just return this response, and not call the rest of the event
// listeners. Otherwise we will add the response on the response list.
if ($halt && ! is_null($response)) {
return $response;
}
// If a boolean false is returned from a listener, we will stop propagating
// the event to any further listeners down in the chain, else we keep on
// looping through the listeners and firing every one in our sequence.
if ($response === false) {
break;
}
$responses[] = $response;
}
return $halt ? null : $responses;
}
/**
* Parse the given event and payload and prepare them for dispatching.
*
* @param mixed $event
* @param mixed $payload
* @return array
*/
protected function parseEventAndPayload($event, $payload)
{
if (is_object($event)) {
list($payload, $event) = [[$event], get_class($event)];
}
return [$event, Arr::wrap($payload)];
}
/**
* Determine if the payload has a broadcastable event.
*
* @param array $payload
* @return bool
*/
protected function shouldBroadcast(array $payload)
{
return isset($payload[0]) &&
$payload[0] instanceof ShouldBroadcast &&
$this->broadcastWhen($payload[0]);
}
/**
* Check if event should be broadcasted by condition.
*
* @param mixed $event
* @return bool
*/
protected function broadcastWhen($event)
{
return method_exists($event, 'broadcastWhen')
? $event->broadcastWhen() : true;
}
/**
* Broadcast the given event class.
*
* @param \Illuminate\Contracts\Broadcasting\ShouldBroadcast $event
* @return void
*/
protected function broadcastEvent($event)
{
$this->container->make(BroadcastFactory::class)->queue($event);
}
/**
* Get all of the listeners for a given event name.
*
* @param string $eventName
* @return array
*/
public function getListeners($eventName)
{
$listeners = $this->listeners[$eventName] ?? [];
$listeners = array_merge(
$listeners,
$this->wildcardsCache[$eventName] ?? $this->getWildcardListeners($eventName)
);
return class_exists($eventName, false)
? $this->addInterfaceListeners($eventName, $listeners)
: $listeners;
}
/**
* Get the wildcard listeners for the event.
*
* @param string $eventName
* @return array
*/
protected function getWildcardListeners($eventName)
{
$wildcards = [];
foreach ($this->wildcards as $key => $listeners) {
if (Str::is($key, $eventName)) {
$wildcards = array_merge($wildcards, $listeners);
}
}
return $this->wildcardsCache[$eventName] = $wildcards;
}
/**
* Add the listeners for the event's interfaces to the given array.
*
* @param string $eventName
* @param array $listeners
* @return array
*/
protected function addInterfaceListeners($eventName, array $listeners = [])
{
foreach (class_implements($eventName) as $interface) {
if (isset($this->listeners[$interface])) {
foreach ($this->listeners[$interface] as $names) {
$listeners = array_merge($listeners, (array) $names);
}
}
}
return $listeners;
}
/**
* Register an event listener with the dispatcher.
*
* @param \Closure|string $listener
* @param bool $wildcard
* @return \Closure
*/
public function makeListener($listener, $wildcard = false)
{
if (is_string($listener)) {
return $this->createClassListener($listener, $wildcard);
}
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return $listener($event, $payload);
}
return $listener(...array_values($payload));
};
}
/**
* Create a class based listener using the IoC container.
*
* @param string $listener
* @param bool $wildcard
* @return \Closure
*/
public function createClassListener($listener, $wildcard = false)
{
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return call_user_func($this->createClassCallable($listener), $event, $payload);
}
return call_user_func_array(
$this->createClassCallable($listener), $payload
);
};
}
/**
* Create the class based event callable.
*
* @param string $listener
* @return callable
*/
protected function createClassCallable($listener)
{
list($class, $method) = $this->parseClassCallable($listener);
if ($this->handlerShouldBeQueued($class)) {
return $this->createQueuedHandlerCallable($class, $method);
}
return [$this->container->make($class), $method];
}
/**
* Parse the class listener into class and method.
*
* @param string $listener
* @return array
*/
protected function parseClassCallable($listener)
{
return Str::parseCallback($listener, 'handle');
}
/**
* Determine if the event handler class should be queued.
*
* @param string $class
* @return bool
*/
protected function handlerShouldBeQueued($class)
{
try {
return (new ReflectionClass($class))->implementsInterface(
ShouldQueue::class
);
} catch (Exception $e) {
return false;
}
}
/**
* Create a callable for putting an event handler on the queue.
*
* @param string $class
* @param string $method
* @return \Closure
*/
protected function createQueuedHandlerCallable($class, $method)
{
return function () use ($class, $method) {
$arguments = array_map(function ($a) {
return is_object($a) ? clone $a : $a;
}, func_get_args());
if ($this->handlerWantsToBeQueued($class, $arguments)) {
$this->queueHandler($class, $method, $arguments);
}
};
}
/**
* Determine if the event handler wants to be queued.
*
* @param string $class
* @param array $arguments
* @return bool
*/
protected function handlerWantsToBeQueued($class, $arguments)
{
if (method_exists($class, 'shouldQueue')) {
return $this->container->make($class)->shouldQueue($arguments[0]);
}
return true;
}
/**
* Queue the handler class.
*
* @param string $class
* @param string $method
* @param array $arguments
* @return void
*/
protected function queueHandler($class, $method, $arguments)
{
list($listener, $job) = $this->createListenerAndJob($class, $method, $arguments);
$connection = $this->resolveQueue()->connection(
$listener->connection ?? null
);
$queue = $listener->queue ?? null;
isset($listener->delay)
? $connection->laterOn($queue, $listener->delay, $job)
: $connection->pushOn($queue, $job);
}
/**
* Create the listener and job for a queued listener.
*
* @param string $class
* @param string $method
* @param array $arguments
* @return array
*/
protected function createListenerAndJob($class, $method, $arguments)
{
$listener = (new ReflectionClass($class))->newInstanceWithoutConstructor();
return [$listener, $this->propagateListenerOptions(
$listener, new CallQueuedListener($class, $method, $arguments)
)];
}
/**
* Propagate listener options to the job.
*
* @param mixed $listener
* @param mixed $job
* @return mixed
*/
protected function propagateListenerOptions($listener, $job)
{
return tap($job, function ($job) use ($listener) {
$job->tries = $listener->tries ?? null;
$job->timeout = $listener->timeout ?? null;
$job->timeoutAt = method_exists($listener, 'retryUntil')
? $listener->retryUntil() : null;
});
}
/**
* Remove a set of listeners from the dispatcher.
*
* @param string $event
* @return void
*/
public function forget($event)
{
if (Str::contains($event, '*')) {
unset($this->wildcards[$event]);
} else {
unset($this->listeners[$event]);
}
}
/**
* Forget all of the pushed listeners.
*
* @return void
*/
public function forgetPushed()
{
foreach ($this->listeners as $key => $value) {
if (Str::endsWith($key, '_pushed')) {
$this->forget($key);
}
}
}
/**
* Get the queue implementation from the resolver.
*
* @return \Illuminate\Contracts\Queue\Queue
*/
protected function resolveQueue()
{
return call_user_func($this->queueResolver);
}
/**
* Set the queue resolver implementation.
*
* @param callable $resolver
* @return $this
*/
public function setQueueResolver(callable $resolver)
{
$this->queueResolver = $resolver;
return $this;
}
}
<?php
namespace Illuminate\Events;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Queue\Factory as QueueFactoryContract;
class EventServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('events', function ($app) {
return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
return $app->make(QueueFactoryContract::class);
});
});
}
}
{
"name": "illuminate/events",
"description": "The Illuminate Events package.",
"license": "MIT",
"homepage": "https://laravel.com",
"support": {
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"require": {
"php": "^7.1.3",
"illuminate/container": "5.6.*",
"illuminate/contracts": "5.6.*",
"illuminate/support": "5.6.*"
},
"autoload": {
"psr-4": {
"Illuminate\\Events\\": ""
}
},
"extra": {
"branch-alias": {
"dev-master": "5.6-dev"
}
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment