Commit f19d0929 by BANice

线上提交版

parent cf0bdc43
......@@ -10,6 +10,7 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/container" />
<excludeFolder url="file://$MODULE_DIR$/vendor/illuminate/contracts" />
<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/monolog/monolog" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
......
......@@ -19,6 +19,7 @@
<path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" />
<path value="$PROJECT_DIR$/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/vendor/psr/log" />
<path value="$PROJECT_DIR$/vendor/illuminate/events" />
</include_path>
</component>
<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"?>
<project version="4">
<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="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
......@@ -17,8 +50,8 @@
<file leaf-file-name="start.php" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/start.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1343">
<caret line="139" selection-start-line="139" selection-end-line="139" />
<state relative-caret-position="626">
<caret line="295" column="12" selection-start-line="295" selection-start-column="12" selection-end-line="295" selection-end-column="12" />
<folding>
<element signature="e#139#168#0#PHP" expanded="true" />
</folding>
......@@ -26,81 +59,88 @@
</provider>
</entry>
</file>
<file leaf-file-name="start_check_shed.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/start_check_shed.php">
<file leaf-file-name="Send.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/send/Send.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480">
<caret line="32" column="6" lean-forward="true" selection-start-line="32" selection-start-column="6" selection-end-line="32" selection-end-column="6" />
<state relative-caret-position="566">
<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#136#165#0#PHP" expanded="true" />
<element signature="e#115#131#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Push.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/Push.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file leaf-file-name="ChargerExceedMessage.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerExceedMessage.php">
<provider selected="true" editor-type-id="text-editor" />
<file leaf-file-name="Command.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/send/Command.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525">
<caret line="40" column="29" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ChargerTimeoutMessage.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.php">
<file leaf-file-name="StopChargerCommand.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/send/command/StopChargerCommand.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-418">
<caret line="69" selection-start-line="69" selection-end-line="69" />
<state relative-caret-position="-304">
<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>
</provider>
</entry>
</file>
<file leaf-file-name="ChargerStartMessage.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerStartMessage.php">
<file leaf-file-name="SaveOrder.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/order/SaveOrder.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="870">
<caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" />
<state relative-caret-position="225">
<caret line="21" column="20" selection-start-line="21" selection-start-column="20" selection-end-line="21" selection-end-column="20" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Log.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/Log.php">
<file leaf-file-name="start_check_shed.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/start_check_shed.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="27" selection-start-line="27" selection-end-line="27" />
<state relative-caret-position="-298">
<caret line="78" selection-start-line="78" selection-end-line="78" />
<folding>
<element signature="e#111#151#0#PHP" expanded="true" />
<element signature="e#136#165#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Logger.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/vendor/monolog/monolog/src/Monolog/Logger.php">
<file leaf-file-name="RedisSingle.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/redis/RedisSingle.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" />
<state relative-caret-position="555">
<caret line="42" lean-forward="true" selection-start-line="42" selection-end-line="42" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="composer.json" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/composer.json">
<file leaf-file-name="MyRedis.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/redis/MyRedis.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165">
<caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" />
<state relative-caret-position="440">
<caret line="39" column="51" selection-start-line="39" selection-start-column="51" selection-end-line="39" selection-end-column="51" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Connection.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Lib/mysql/Connection.php">
<file leaf-file-name="RedisKey.php" pinned="false" current-in-tab="false">
<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">
<state relative-caret-position="30">
<caret line="2" selection-start-line="2" selection-end-line="2" />
<state relative-caret-position="529">
<caret line="120" column="43" selection-start-line="120" selection-start-column="43" selection-end-line="120" selection-end-column="43" />
</state>
</provider>
</entry>
......@@ -112,12 +152,23 @@
<find>$queueWorker</find>
<find>Log</find>
<find>var_dump</find>
<find>data</find>
<find>43</find>
<find>$message['station_id']</find>
<find>$message</find>
<find>46</find>
</findStrings>
<replaceStrings>
<replace>$queue</replace>
<replace>Log::debug</replace>
<replace>message</replace>
<replace>$gatewayId</replace>
<replace>$stationId</replace>
</replaceStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
......@@ -134,11 +185,17 @@
<option value="$PROJECT_DIR$/Lib/tool/StringTool.php" />
<option value="$PROJECT_DIR$/Lib/Gateway.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$/Lib/Log.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.php" />
</list>
......@@ -172,6 +229,7 @@
<path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" />
<path value="$PROJECT_DIR$/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/vendor/psr/log" />
<path value="$PROJECT_DIR$/vendor/illuminate/events" />
</include_path>
</component>
<component name="ProjectFrameBounds" fullScreen="true">
......@@ -180,6 +238,7 @@
<option name="width" value="1920" />
<option name="height" value="1080" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
......@@ -196,7 +255,39 @@
<path>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
<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>
<item name="customer_charger_order" type="b2602c69:ProjectViewProjectNode" />
......@@ -209,6 +300,7 @@
</panes>
</component>
<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="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
......@@ -261,12 +353,14 @@
<workItem from="1530326497142" duration="731000" />
<workItem from="1530496499559" duration="38000" />
<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>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="82959000" />
<option name="totallyTimeSpent" value="135413000" />
</component>
<component name="TodoView">
<todo-panel id="selected-file">
......@@ -279,17 +373,19 @@
</component>
<component name="ToolWindowManager">
<frame x="1920" y="-58" width="1920" height="1080" extended-state="0" />
<editor active="true" />
<layout>
<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="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="Version Control" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="7" visible="true" weight="0.33706722" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.22896698" />
<window_info anchor="bottom" id="Version Control" order="7" />
<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.16400427" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<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 anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info id="Favorites" order="2" side_tool="true" />
......@@ -299,7 +395,6 @@
<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="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Find" order="1" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
......@@ -309,6 +404,27 @@
<option name="myLimit" value="2678400000" />
</component>
<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">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2040">
......@@ -316,281 +432,273 @@
</state>
</provider>
</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">
<state relative-caret-position="13785">
<caret line="919" column="20" selection-start-line="919" selection-start-column="20" selection-end-line="919" selection-end-column="20" />
</state>
<state relative-caret-position="-2" />
</provider>
</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">
<state relative-caret-position="825">
<caret line="61" column="8" selection-start-line="61" selection-start-column="8" selection-end-line="61" selection-end-column="8" />
<state relative-caret-position="120">
<caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/composer.json">
<entry file="file://$PROJECT_DIR$/Lib/Gateway.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="15" selection-start-line="15" selection-end-line="15" />
<state relative-caret-position="360">
<caret line="24" column="17" selection-start-line="24" selection-start-column="17" selection-end-line="24" selection-end-column="17" />
</state>
</provider>
</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">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1515">
<caret line="108" column="65" selection-start-line="108" selection-start-column="65" selection-end-line="108" selection-end-column="65" />
<state relative-caret-position="1335">
<caret line="96" column="20" selection-start-line="96" selection-start-column="20" selection-end-line="96" selection-end-column="20" />
<folding>
<element signature="e#110#132#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</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" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Wx.php">
<provider selected="true" editor-type-id="text-editor">
<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>
</provider>
</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/tool/ArrayToXml.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/Gateway.php">
<entry file="jar://$APPLICATION_HOME_DIR$/plugins/php/lib/php.jar!/stubs/PDO/PDO.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="345">
<caret line="23" column="7" selection-start-line="23" selection-start-column="7" selection-end-line="23" selection-end-column="7" />
<state relative-caret-position="12000">
<caret line="800" column="20" selection-start-line="800" selection-start-column="20" selection-end-line="800" selection-end-column="20" />
</state>
</provider>
</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">
<state relative-caret-position="2040">
<caret line="139" column="20" selection-start-line="139" selection-start-column="20" selection-end-line="139" selection-end-column="20" />
<state relative-caret-position="30">
<caret line="2" selection-start-line="2" selection-end-line="2" />
</state>
</provider>
</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">
<state relative-caret-position="13785">
<caret line="919" column="20" selection-start-line="919" selection-start-column="20" selection-end-line="919" selection-end-column="20" />
<state relative-caret-position="165">
<caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" />
</state>
</provider>
</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">
<state relative-caret-position="960">
<caret line="70" lean-forward="true" selection-start-line="70" selection-end-line="70" />
<state relative-caret-position="240">
<caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/Random.php" />
<entry file="file://$PROJECT_DIR$/src/Event.php" />
<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 file="file://$PROJECT_DIR$/Lib/api/message/Push.php">
<provider selected="true" editor-type-id="text-editor" />
</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" />
</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">
<state relative-caret-position="285">
<caret line="24" column="6" selection-start-line="24" selection-start-column="6" selection-end-line="24" selection-end-column="6" />
<state relative-caret-position="870">
<caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/composer.lock">
<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">
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerTimeoutMessage.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 relative-caret-position="960">
<caret line="69" selection-start-line="69" selection-end-line="69" />
</state>
</provider>
</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">
<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 relative-caret-position="300">
<caret line="21" column="14" selection-start-line="21" selection-start-column="14" selection-end-line="21" selection-end-column="14" />
</state>
</provider>
</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">
<state relative-caret-position="2040">
<caret line="139" column="20" selection-start-line="139" selection-start-column="20" selection-end-line="139" selection-end-column="20" />
<state relative-caret-position="60">
<caret line="4" column="10" selection-start-line="4" selection-start-column="10" selection-end-line="4" selection-end-column="10" />
</state>
</provider>
</entry>
<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">
<entry file="file://$PROJECT_DIR$/vendor/illuminate/database/Eloquent/Model.php">
<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>
</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">
<state relative-caret-position="120">
<caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
<state relative-caret-position="150">
<caret line="16" column="28" selection-start-line="16" selection-start-column="28" selection-end-line="16" selection-end-column="28" />
</state>
</provider>
</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">
<state relative-caret-position="360">
<caret line="24" column="17" selection-start-line="24" selection-start-column="17" selection-end-line="24" selection-end-column="17" />
<state relative-caret-position="789">
<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>
</provider>
</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/send/Command.php">
<entry file="file://$PROJECT_DIR$/Lib/cdz_order/state/Created.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="11" column="15" selection-start-line="11" selection-start-column="15" selection-end-line="11" selection-end-column="15" />
<state relative-caret-position="105">
<caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" />
</state>
</provider>
</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">
<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>
<element signature="e#121#138#0#PHP" expanded="true" />
<element signature="e#119#148#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</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">
<state relative-caret-position="1335">
<caret line="96" column="20" selection-start-line="96" selection-start-column="20" selection-end-line="96" selection-end-column="20" />
<state relative-caret-position="497">
<caret line="66" column="38" selection-start-line="66" selection-start-column="38" selection-end-line="66" selection-end-column="38" />
<folding>
<element signature="e#110#132#0#PHP" expanded="true" />
<element signature="e#124#136#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Lib/tool/Crc.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/wx/Wx.php">
<entry file="file://$PROJECT_DIR$/Lib/order_exception/Exception.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="150">
<caret line="15" column="11" selection-start-line="15" selection-start-column="11" selection-end-line="15" selection-end-column="11" />
<state relative-caret-position="120">
<caret line="13" column="10" selection-start-line="13" selection-start-column="10" selection-end-line="13" selection-end-column="10" />
</state>
</provider>
</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">
<state relative-caret-position="705">
<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>
<state relative-caret-position="-1093" />
</provider>
</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">
<state relative-caret-position="12000">
<caret line="800" column="20" selection-start-line="800" selection-start-column="20" selection-end-line="800" selection-end-column="20" />
<state relative-caret-position="120">
<caret line="14" column="15" selection-start-line="14" selection-start-column="15" selection-end-line="14" selection-end-column="15" />
</state>
</provider>
</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">
<state relative-caret-position="30">
<caret line="2" selection-start-line="2" selection-end-line="2" />
<state relative-caret-position="225">
<caret line="21" column="20" selection-start-line="21" selection-start-column="20" selection-end-line="21" selection-end-column="20" />
</state>
</provider>
</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">
<state relative-caret-position="165">
<caret line="11" column="31" selection-start-line="11" selection-start-column="31" selection-end-line="11" selection-end-column="31" />
<state relative-caret-position="529">
<caret line="120" column="43" selection-start-line="120" selection-start-column="43" selection-end-line="120" selection-end-column="43" />
</state>
</provider>
</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">
<state relative-caret-position="240">
<caret line="26" column="6" selection-start-line="26" selection-start-column="6" selection-end-line="26" selection-end-column="6" />
<state relative-caret-position="555">
<caret line="42" lean-forward="true" selection-start-line="42" selection-end-line="42" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Lib/api/message/Push.php">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/Lib/api/message/ChargerExceedMessage.php">
<provider selected="true" editor-type-id="text-editor" />
<entry file="file://$PROJECT_DIR$/Lib/send/Command.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525">
<caret line="40" column="29" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
</state>
</provider>
</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">
<state relative-caret-position="870">
<caret line="63" column="11" selection-start-line="63" selection-start-column="11" selection-end-line="63" selection-end-column="11" />
<state relative-caret-position="566">
<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>
</provider>
</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">
<state relative-caret-position="-418">
<caret line="69" selection-start-line="69" selection-end-line="69" />
<state relative-caret-position="-304">
<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>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/start_check_shed.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480">
<caret line="32" column="6" lean-forward="true" selection-start-line="32" selection-start-column="6" selection-end-line="32" selection-end-column="6" />
<state relative-caret-position="-298">
<caret line="78" selection-start-line="78" selection-end-line="78" />
<folding>
<element signature="e#136#165#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</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">
<state relative-caret-position="330">
<caret line="27" selection-start-line="27" selection-end-line="27" />
<folding>
<element signature="e#111#151#0#PHP" expanded="true" />
</folding>
<state relative-caret-position="440">
<caret line="39" column="51" selection-start-line="39" selection-start-column="51" selection-end-line="39" selection-end-column="51" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/start.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1343">
<caret line="139" selection-start-line="139" selection-end-line="139" />
<state relative-caret-position="626">
<caret line="295" column="12" selection-start-line="295" selection-start-column="12" selection-end-line="295" selection-end-column="12" />
<folding>
<element signature="e#139#168#0#PHP" expanded="true" />
</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
$message = $this->makeMessage();
//debug
if (Gateway::isUidOnline($clientUid) === 1) {
var_dump(['send_message' => $message,'time' => date('Y-m-d H:i:s')]);
Gateway::sendToUid($clientUid, $message);
$result = true;
......
......@@ -31,21 +31,28 @@ class StopChargerCommand extends Command
*/
private $gatewayMac;
/**
* @var int
*/
private $stopType = 41;
/**
* @var string
*/
protected $headerCtrl = '05';
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
$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 @@
"require": {
"illuminate/database": "^5.6",
"guzzlehttp/guzzle": "^6.3",
"monolog/monolog": "^1.23"
"monolog/monolog": "^1.23",
"illuminate/events": "^5.6"
}
}
......@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "964b5da01090400ae6a459d42bd37b10",
"content-hash": "47c9d4401aacfaf3641ef449fa2ecf37",
"packages": [
{
"name": "doctrine/inflector",
......@@ -402,6 +402,51 @@
"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",
"version": "v5.6.23",
"source": {
......
......@@ -14,6 +14,9 @@ use Lib\wx\Refund;
use Lib\send\Send;
use Lib\send\command\StopChargerCommand;
use Lib\Log;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
try {
......@@ -25,14 +28,13 @@ try {
try {
$queue = $rabbitMq->getQueue();
$queue->setName('queue_worker_check_order');
$queue->setFlags(AMQP_DURABLE);
} catch (Exception $exception) {
Log::debug($exception->getMessage());
Log::error($exception->getMessage());
}
......@@ -49,96 +51,130 @@ try {
}
Log::info('启动是否成功开始充电消费者');
try {
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
$capule = new Capsule();
$capule->addConnection([
$dsn = 'mysql:dbname=cdzpay;host=db.test.senthink.com';
$user = 'cdz';
$password = 'senthink123';
'driver' => 'mysql',
'host' => 'db.test.senthink.com',
'database' => 'cdzpay',
'username' => 'cdz',
'password' => 'senthink123',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
try {
$dbh = new PDO($dsn, $user, $password, [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
]);
$capule->setEventDispatcher(new Dispatcher(new Container()));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$capule->setAsGlobal();
} catch (PDOException $e) {
$capule->bootEloquent();
Log::error('connnection failed');
$message = json_decode($envelope->getBody(), true);
}
$orderId = $message['order_id'];
$data = json_decode($envelope->getBody(), true);
$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']);
Log::debug('data',$data);
$orderInfo = (Array)$orderInfo;
$outTradeNo = $orderInfo['out_trade_no'];
$orderId = $data['order_id'];
$totalFee = $orderInfo['pay_amount'];
$outTradeNo = $data['out_trade_no'];
$logicNum = $orderInfo['logic_num'];
$totalFee = $data['total_fee'];
$isCharger = $orderInfo['is_charger'];
$logicNum = $data['logic_num'];
$portId = (int)$orderInfo['port_id'];
$gatewayMac = $data['gateway_mac'];
$userId = $orderInfo['wx_user_id'];
$orderInfo = $dbh->query('SELECT is_charger,port_id ,state FROM wx_charger_orders WHERE id = ' . $orderId);
$gatewayId = $orderInfo['gateway_id'];
$orderInfo = $orderInfo->fetch();
$stationId = $orderInfo['station_id'];
$isCharger = $orderInfo['is_charger'];
$gatewayMac = Capsule::table('gateways')->where('id', $gatewayId)->first(['mac_address']);
$portId = (int)$orderInfo['port_id'];
$payType = $orderInfo['pay_type'];
if($orderInfo['state'] === 3)//如果已经退款直接抛弃
$gatewayMac = $gatewayMac->mac_address;
if ($orderInfo['state'] == 3)//如果已经退款直接抛弃
{
$queue->ack($envelope->getDeliveryTag());
return ;
Log::debug('已经退款', $orderInfo);
return;
}
//todo 订单的端口id是否和消息中的相同,如果不同则发生过端口改变,无视该条消息
// 订单的端口id是否和消息中的相同,如果不同则发生过端口改变,无视该条消息
switch ($isCharger) {
case -1:
//todo 退款
$refundDesc = '充电失败';
break;
case 13:
//todo 退款
$refundDesc = '充电口打开失败';
break;
case 14:
//todo 退款
$refundDesc = '充电口打开成功,但未插上插头';
break;
default:
break;
}
if ((int)$isCharger !== 12 && $portId === $data['port_id']) {
//is_charger不为12则未开始充电
//消息中的口子id与数据库中的口子id不同则更换过口子,消息作废
if ((int)$isCharger != 12) {
$date = date('Y-m-d H:i:s');
if ($data['pay_type'] === 1) {
$outRefundNo = time() . $totalFee . rand(10000, 999999);
Log::debug('退款');
try {
$openId = $data['openid'];
$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());
}
if ($payType === 1) {
$openId = $message['openid'];
$refund = new Refund();
......@@ -150,97 +186,95 @@ try {
$refund->setRefundFee($totalFee);
$outRefundNo = time() . $totalFee . rand(10000, 999999);
$refund->setOutRefundNo($outRefundNo);
if ($refund->refund() === true) {
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([
$outRefundNo,
$totalFee,
$data['gateway_id'],
$data['port_id'],
$data['station_id'],
$outTradeNo,
$totalFee,
date('Y-m-d H:i:s'),
'端口未检测到电动自行车,系统自动退款',
} catch (PDOException $exception) {
]);
Capsule::rollBack();
$dbh->commit();
Log::error($exception->getMessage());
} catch (PDOException $exception) {
$dbh->rollBack();
Log::error('微信支付退款,更新数据失败');
Log::debug($exception->getMessage());
}
}
} else {
$userId = $data['user_id'];
// 余额支付需要将余额加回钱包,消费金额减小.
try {
$dbh->beginTransaction();
$sql = "UPDATE wx_users SET `wallet_balance` = `wallet_balance` + ?, `total_cost` = `total_cost` - ? ,`current_cost` = `current_cost` - ? WHERE id = ?";
$updateBalance = $dbh->prepare($sql);
$updateBalance->execute([$totalFee, $totalFee, $totalFee, $userId]);
$updateOrder = "UPDATE wx_charger_orders SET `state` = ?, `refund_type` = ?,`refund_amount` = ? WHERE id = ?";
$updateOrder = $dbh->prepare($updateOrder);
$result = $updateOrder->execute([3, 1, $totalFee, $orderId]);
$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);
Capsule::beginTransaction();
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,
]);
$outRefundNo = time() . $totalFee . rand(10000, 999999);
Capsule::table('wx_users')->where('id', $userId)->update([
$insert = $insert = $insert->execute([
$outRefundNo,
$totalFee,
$data['gateway_id'],
$data['port_id'],
$data['station_id'],
$outTradeNo,
$totalFee,
date('Y-m-d H:i:s'),
'端口未检测到电动自行车,系统自动退款',
'wallet_balance' => Capsule::raw('wallet_balance +' . $totalFee),
'total_cost' => Capsule::raw('total_cost - ' . $totalFee),
'current_cost' => Capsule::raw('current_cost - ' . $totalFee),
'updated_at' => $date,
]);
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) {
Log::debug($exception->getMessage());
}
Capsule::rollBack();
Log::error($exception->getMessage());
}
}
......@@ -253,44 +287,36 @@ try {
$stopCommand->setLogicNum($logicNum);
$stopCommand->setStopType(43);
$send = new Send($stopCommand);
if ($send->send() === false) {
Log::debug('结束订单命令发送失败');
}else{
Log::debug('发送结束充电命令'.$orderId);
}
$redis = \Lib\redis\RedisSingle::getRedis();
//todo 更新订单表和存储退款表
$key = 'cdz:order:state:'.$orderId;
$redis->hSet($key,'isRefund',1);
}else{
$stopCommand = new StopChargerCommand();
if ($send->send() === false) {
$stopCommand->setOrderId($orderId);
Log::debug('结束订单命令发送失败');
$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());
......
......@@ -11,8 +11,11 @@ use Lib\rabbit_mq\MyRabbitMq;
use Lib\send\command\StopChargerCommand;
use Lib\Log;
use Lib\send\Send;
use Lib\api\message\ChargerTimeoutMessage;
use Lib\api\message\Push;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
use Lib\cdz_order\Order;
use Lib\redis\RedisSingle;
try {
$rabbitMq = new MyRabbitMq();
......@@ -46,75 +49,61 @@ try {
} catch (AMQPConnectionException $e) {
}
Log::info('启动消费者');
Log::info('启动检查口子脱落消费者');
try {
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
$dsn = 'mysql:dbname=cdzpay;host=db.test.senthink.com';
$user = 'cdz';
$password = 'senthink123';
$capule = new Capsule();
try {
$dbh = new PDO($dsn, $user, $password, [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
]);
$capule->addConnection([
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
'driver' => 'mysql',
'host' => 'db.test.senthink.com',
'database' => 'cdzpay',
'username' => 'cdz',
'password' => 'senthink123',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$data = json_decode($envelope->getBody(), true);
Log::debug('body',$data);
$orderId = $data['order_id'];
$capule->setEventDispatcher(new Dispatcher(new Container()));
$orderInfo = $dbh->query('SELECT is_stop,port_id,created_at,charger_time,wx_user_id FROM wx_charger_orders WHERE id = ' . $orderId);
$capule->setAsGlobal();
$orderInfo = $orderInfo->fetch();
$capule->bootEloquent();
//todo 查询口子状态是否为插口脱落,是则下发结束充电命令。
if(isset($orderInfo['port_id'])) {
try {
$redis = new \Redis();
$redis->pconnect('redis.test.senthink.com', 6379, 1);
$data = json_decode($envelope->getBody(), true);
$redis->select(4);
if (isset($data['order_id']) === false) {
$queue->ack($envelope->getDeliveryTag());
$portId = $orderInfo['port_id'];
return;
$redis->multi(2);
$redis->zScore('port:id_state:zset',$portId);
}
$orderId = $data['order_id'];
$redis->hGet('port:id_logic:hash',$portId);
$shedTime = $data['shed_time'];
$result = $redis->exec();
$portState = $result[0];
$order = new Order();
$order->setId($orderId);
$logicNum = $result['1'];
$orderCache = $order->getOrderCache(RedisSingle::getRedis());
if(!isset($logicNum))
{
Log::error('逻辑地址未找到');
if ($orderCache === false) {
$queue->ack($envelope->getDeliveryTag());
return ;
return;
}
}
if($portState == 14)
{
if (isset($orderCache['shedTime'])) {
if ($shedTime == $orderCache['shedTime']) {
if ($order->getStateCode() == 14) {
$gatewayMac = $data['gateway_mac'];
$stopCommand = new StopChargerCommand();
......@@ -123,45 +112,38 @@ try {
$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) {
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());
......
......@@ -7,8 +7,8 @@ $baseDir = dirname($vendorDir);
return array(
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/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',
);
......@@ -15,6 +15,7 @@ return array(
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'Lib\\' => array($baseDir . '/Lib'),
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support'),
'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'),
'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'),
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),
......
......@@ -8,9 +8,9 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/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',
);
......@@ -38,6 +38,7 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
'I' =>
array (
'Illuminate\\Support\\' => 19,
'Illuminate\\Events\\' => 18,
'Illuminate\\Database\\' => 20,
'Illuminate\\Contracts\\' => 21,
'Illuminate\\Container\\' => 21,
......@@ -91,6 +92,10 @@ class ComposerStaticInit8c119b004aa624b54e5609ed67b0bb28
array (
0 => __DIR__ . '/..' . '/illuminate/support',
),
'Illuminate\\Events\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/events',
),
'Illuminate\\Database\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/database',
......
......@@ -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",
"version": "v5.6.23",
"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