Commit 7dd98321 authored by superman's avatar superman

update

parent 55cc492a
...@@ -2,38 +2,60 @@ ...@@ -2,38 +2,60 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="ec208c71-5ff8-4642-a786-fad4f24be9b8" name="Default" comment=""> <list default="true" id="ec208c71-5ff8-4642-a786-fad4f24be9b8" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/NextPrve/NextPrve.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/Layout/Layout.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductContactForm/ProductContactForm.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/Layout/Layout.less" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductDateTimeForm/ProductDateTimeForm.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/MainHeader.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductDocumentsForm/ProductDocumentsForm.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductForm/ContactForm.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductElementForm/ProductElementForm.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductForm/DateTimeStatusForm.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductForm/ElementForm.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductForm/HuikuanInfoForm.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Announcement/List.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/components/ProductForm/ShouyiYongjingForm.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Product/Product.less" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Remittance/Audit/EditItem.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/reducers/announcement.js" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Remittance/Audit/List.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/sagas/announcement.js" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/Trade/EditItem.jsx" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/services/announcement.js" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/containers/index.js" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ProductBaseElement/ProductBaseElement.jsx" afterPath="" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/reducers/contract.js" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/YongjingSuanFaItem/YongjingSuanFaItem.jsx" afterPath="" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/reducers/remittance.js" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/containers/Product/AddItem.less" afterPath="" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/sagas/contract.js" />
<change type="MOVED" beforePath="$PROJECT_DIR$/src/components/ProductBaseInfo/ProductBaseInfo.jsx" afterPath="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.jsx" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/sagas/remittance.js" />
<change type="MOVED" beforePath="$PROJECT_DIR$/src/components/ProductBaseInfo/ProductBaseInfo.less" afterPath="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.less" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/services/contract.js" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/services/remittance.js" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.less" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ProductContactForm/ProductContactForm.jsx" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ProductDateTimeForm/ProductDateTimeForm.jsx" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ProductElementForm/ProductElementForm.jsx" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/src/containers/Product/Item.jsx" afterPath="" />
<change type="MOVED" beforePath="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.jsx" afterPath="$PROJECT_DIR$/src/components/ProductForm/BaseInfoForm.jsx" />
<change type="MOVED" beforePath="$PROJECT_DIR$/src/components/ProductDocumentsForm/ProductDocumentsForm.jsx" afterPath="$PROJECT_DIR$/src/components/ProductForm/DocumentsForm.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/package.json" afterPath="$PROJECT_DIR$/package.json" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/proxy.config.js" afterPath="$PROJECT_DIR$/proxy.config.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/proxy.config.js" afterPath="$PROJECT_DIR$/proxy.config.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx" afterPath="$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx" afterPath="$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Announcement/List.jsx" afterPath="$PROJECT_DIR$/src/containers/Announcement/List.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/App/App.jsx" afterPath="$PROJECT_DIR$/src/containers/App/App.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/App/App.less" afterPath="$PROJECT_DIR$/src/containers/App/App.less" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/App/App.less" afterPath="$PROJECT_DIR$/src/containers/App/App.less" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/Item.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/Item.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/List.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/List.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/List.jsx" afterPath="$PROJECT_DIR$/src/containers/Product/List.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Product/Product.less" afterPath="$PROJECT_DIR$/src/containers/Product/Product.less" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/AddItem.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/AddItem.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/Commission.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/Commission.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/Contract.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/Contract.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/Item.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/Item.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/Item.less" afterPath="$PROJECT_DIR$/src/containers/Trade/Item.less" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/List.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/List.jsx" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/containers/Trade/List.jsx" afterPath="$PROJECT_DIR$/src/containers/Trade/List.jsx" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/reducers/product.js" afterPath="$PROJECT_DIR$/src/reducers/product.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/entries/index.less" afterPath="$PROJECT_DIR$/src/entries/index.less" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/reducers/announcement.js" afterPath="$PROJECT_DIR$/src/reducers/announcement.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/reducers/trade.js" afterPath="$PROJECT_DIR$/src/reducers/trade.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/routes/index.js" afterPath="$PROJECT_DIR$/src/routes/index.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/routes/index.js" afterPath="$PROJECT_DIR$/src/routes/index.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/sagas/product.js" afterPath="$PROJECT_DIR$/src/sagas/product.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/sagas/announcement.js" afterPath="$PROJECT_DIR$/src/sagas/announcement.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/sagas/trade.js" afterPath="$PROJECT_DIR$/src/sagas/trade.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/announcement.js" afterPath="$PROJECT_DIR$/src/services/announcement.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/product.js" afterPath="$PROJECT_DIR$/src/services/product.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/product.js" afterPath="$PROJECT_DIR$/src/services/product.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/user.js" afterPath="$PROJECT_DIR$/src/services/user.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/trade.js" afterPath="$PROJECT_DIR$/src/services/trade.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/xFetch.js" afterPath="$PROJECT_DIR$/src/services/xFetch.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/services/xFetch.js" afterPath="$PROJECT_DIR$/src/services/xFetch.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/utils.js" afterPath="$PROJECT_DIR$/src/utils.js" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/utils.js" afterPath="$PROJECT_DIR$/src/utils.js" />
</list> </list>
...@@ -58,23 +80,11 @@ ...@@ -58,23 +80,11 @@
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="product.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/services/product.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="17" column="39" selection-start-line="17" selection-start-column="39" selection-end-line="17" selection-end-column="39" />
<folding>
<element signature="e#0#30#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="EditItem.jsx" pinned="false" current-in-tab="false"> <file leaf-file-name="EditItem.jsx" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="750"> <state relative-caret-position="480">
<caret line="64" column="93" selection-start-line="64" selection-start-column="93" selection-end-line="64" selection-end-column="93" /> <caret line="32" column="49" selection-start-line="0" selection-start-column="0" selection-end-line="99" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
...@@ -82,11 +92,11 @@ ...@@ -82,11 +92,11 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="index.js" pinned="false" current-in-tab="false"> <file leaf-file-name="List.jsx" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/routes/index.js"> <entry file="file://$PROJECT_DIR$/src/containers/Remittance/Audit/List.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="477"> <state relative-caret-position="990">
<caret line="48" column="75" selection-start-line="48" selection-start-column="75" selection-end-line="48" selection-end-column="75" /> <caret line="115" column="63" selection-start-line="115" selection-start-column="49" selection-end-line="115" selection-end-column="63" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
...@@ -94,45 +104,43 @@ ...@@ -94,45 +104,43 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="xFetch.js" pinned="false" current-in-tab="true"> <file leaf-file-name="xFetch.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/services/xFetch.js"> <entry file="file://$PROJECT_DIR$/src/services/xFetch.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225"> <state relative-caret-position="330">
<caret line="15" column="8" selection-start-line="15" selection-start-column="8" selection-end-line="15" selection-end-column="8" /> <caret line="22" column="53" selection-start-line="22" selection-start-column="53" selection-end-line="22" selection-end-column="53" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="AddItem.jsx" pinned="false" current-in-tab="false"> <file leaf-file-name="remittance.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx"> <entry file="file://$PROJECT_DIR$/src/services/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525"> <state relative-caret-position="105">
<caret line="53" column="93" selection-start-line="53" selection-start-column="93" selection-end-line="53" selection-end-column="93" /> <caret line="7" column="48" selection-start-line="7" selection-start-column="48" selection-end-line="7" selection-end-column="48" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#30#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="announcement.js" pinned="false" current-in-tab="false"> <file leaf-file-name="remittance.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/services/announcement.js"> <entry file="file://$PROJECT_DIR$/src/reducers/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120"> <state relative-caret-position="240">
<caret line="8" column="37" selection-start-line="8" selection-start-column="37" selection-end-line="8" selection-end-column="37" /> <caret line="17" column="60" selection-start-line="17" selection-start-column="60" selection-end-line="17" selection-end-column="60" />
<folding> <folding />
<element signature="e#0#30#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="announcement.js" pinned="false" current-in-tab="false"> <file leaf-file-name="remittance.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/sagas/announcement.js"> <entry file="file://$PROJECT_DIR$/src/sagas/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="469"> <state relative-caret-position="492">
<caret line="74" column="59" selection-start-line="74" selection-start-column="35" selection-end-line="74" selection-end-column="59" /> <caret line="49" column="44" selection-start-line="49" selection-start-column="44" selection-end-line="49" selection-end-column="44" />
<folding> <folding>
<element signature="e#0#38#0" expanded="true" /> <element signature="e#0#38#0" expanded="true" />
</folding> </folding>
...@@ -140,37 +148,47 @@ ...@@ -140,37 +148,47 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="AddItem.jsx" pinned="false" current-in-tab="false"> <file leaf-file-name="announcement.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/containers/Product/AddItem.jsx"> <entry file="file://$PROJECT_DIR$/src/services/announcement.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15"> <state relative-caret-position="0">
<caret line="105" column="19" selection-start-line="105" selection-start-column="4" selection-end-line="105" selection-end-column="19" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#30#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="announcement.js" pinned="false" current-in-tab="false"> <file leaf-file-name="announcement.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/reducers/announcement.js"> <entry file="file://$PROJECT_DIR$/src/sagas/announcement.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="420"> <state relative-caret-position="135">
<caret line="28" column="13" selection-start-line="28" selection-start-column="13" selection-end-line="28" selection-end-column="13" /> <caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="52" selection-end-column="1" />
<folding> <folding>
<element signature="e#0#44#0" expanded="true" /> <element signature="e#0#38#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="product.js" pinned="false" current-in-tab="false"> <file leaf-file-name="index.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/sagas/product.js"> <entry file="file://$PROJECT_DIR$/src/containers/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="15" column="35" selection-start-line="15" selection-start-column="35" selection-end-line="15" selection-end-column="35" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="EditItem.jsx" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/containers/Remittance/Audit/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="582"> <state relative-caret-position="-15">
<caret line="119" column="1" selection-start-line="100" selection-start-column="0" selection-end-line="119" selection-end-column="1" /> <caret line="38" column="21" selection-start-line="38" selection-start-column="4" selection-end-line="38" selection-end-column="21" />
<folding> <folding>
<element signature="e#0#38#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
...@@ -189,57 +207,57 @@ ...@@ -189,57 +207,57 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/src/sagas/user.js" />
<option value="$PROJECT_DIR$/src/containers/Login/Login.jsx" />
<option value="$PROJECT_DIR$/src/sagas/todos.js" />
<option value="$PROJECT_DIR$/src/services/trade.js" />
<option value="$PROJECT_DIR$/src/sagas/trade.js" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/src/containers/Trade/Commission.js" />
<option value="$PROJECT_DIR$/src/containers/Trade/Item.less" />
<option value="$PROJECT_DIR$/src/containers/Trade/Contract.jsx" />
<option value="$PROJECT_DIR$/src/entries/index.less" />
<option value="$PROJECT_DIR$/src/containers/Login/Login.less" />
<option value="$PROJECT_DIR$/src/components/ProductBaseElement/ProductBaseElement.jsx" />
<option value="$PROJECT_DIR$/src/containers/Product/AddItem.less" />
<option value="$PROJECT_DIR$/src/containers/Trade/Item.jsx" />
<option value="$PROJECT_DIR$/src/reducers/trade.js" />
<option value="$PROJECT_DIR$/src/containers/App/App.jsx" /> <option value="$PROJECT_DIR$/src/containers/App/App.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductBaseInfo/ProductBaseInfo.less" /> <option value="$PROJECT_DIR$/src/containers/Layout/Layout.jsx" />
<option value="$PROJECT_DIR$/src/services/user.js" /> <option value="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.less" />
<option value="$PROJECT_DIR$/src/components/ProductBaseInfo/ProductBaseInfo.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfo.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductDateTimeFrom/ProductDateTimeFrom.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/List.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductDocumentsForm/ProductDocumentsForm.jsx" />
<option value="$PROJECT_DIR$/src/components/YongjingSuanFaItem/YongjingSuanFaItem.jsx" />
<option value="$PROJECT_DIR$/src/utils.js" />
<option value="$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx" />
<option value="$PROJECT_DIR$/src/containers/App/App.less" />
<option value="$PROJECT_DIR$/src/components/ProductContactForm/ProductContactForm.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/AddItem.jsx" />
<option value="$PROJECT_DIR$/src/reducers/product.js" />
<option value="$PROJECT_DIR$/src/components/ProductDateTimeForm/ProductDateTimeForm.jsx" />
<option value="$PROJECT_DIR$/src/containers/Product/Product.less" /> <option value="$PROJECT_DIR$/src/containers/Product/Product.less" />
<option value="$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx" /> <option value="$PROJECT_DIR$/src/containers/App/App.less" />
<option value="$PROJECT_DIR$/src/sagas/product.js" /> <option value="$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.jsx" /> <option value="$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.jsx" />
<option value="$PROJECT_DIR$/src/components/NextPrve/NextPrve.jsx" /> <option value="$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductElementForm/ProductElementForm.jsx" /> <option value="$PROJECT_DIR$/src/components/ProductElementForm/ProductElementForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductDateTimeForm/ProductDateTimeForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductDocumentsForm/ProductDocumentsForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductContactForm/ProductContactForm.jsx" />
<option value="$PROJECT_DIR$/src/sagas/trade.js" />
<option value="$PROJECT_DIR$/src/components/BackButton.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/ElementForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/ContactForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/DateTimeStatusForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/HuikuanInfoForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/ShouyiYongjingForm.jsx" />
<option value="$PROJECT_DIR$/src/components/ProductForm/DocumentsForm.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/List.jsx" />
<option value="$PROJECT_DIR$/src/utils.js" />
<option value="$PROJECT_DIR$/src/components/MainHeader.jsx" />
<option value="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" /> <option value="$PROJECT_DIR$/src/containers/Product/AddItem.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/Contract.jsx" />
<option value="$PROJECT_DIR$/src/containers/Layout/Layout.less" />
<option value="$PROJECT_DIR$/src/containers/Trade/Commission.jsx" />
<option value="$PROJECT_DIR$/src/entries/index.less" />
<option value="$PROJECT_DIR$/src/reducers/trade.js" />
<option value="$PROJECT_DIR$/src/containers/Trade/AddItem.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/EditItem.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/Item.less" />
<option value="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" /> <option value="$PROJECT_DIR$/src/containers/Product/EditItem.jsx" />
<option value="$PROJECT_DIR$/proxy.config.js" /> <option value="$PROJECT_DIR$/src/components/ProductForm/BaseInfoForm.jsx" />
<option value="$PROJECT_DIR$/src/containers/Trade/Item.jsx" />
<option value="$PROJECT_DIR$/src/containers/Product/List.jsx" /> <option value="$PROJECT_DIR$/src/containers/Product/List.jsx" />
<option value="$PROJECT_DIR$/src/containers/Product/Item.jsx" />
<option value="$PROJECT_DIR$/src/routes/index.js" />
<option value="$PROJECT_DIR$/src/containers/Announcement/List.jsx" /> <option value="$PROJECT_DIR$/src/containers/Announcement/List.jsx" />
<option value="$PROJECT_DIR$/src/services/product.js" />
<option value="$PROJECT_DIR$/src/sagas/announcement.js" />
<option value="$PROJECT_DIR$/src/reducers/announcement.js" />
<option value="$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx" /> <option value="$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx" />
<option value="$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx" /> <option value="$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx" />
<option value="$PROJECT_DIR$/src/services/announcement.js" /> <option value="$PROJECT_DIR$/src/containers/Remittance/AuditList.jsx" />
<option value="$PROJECT_DIR$/src/containers/Audit/Remittance/List.jsx" />
<option value="$PROJECT_DIR$/src/routes/index.js" />
<option value="$PROJECT_DIR$/src/containers/Audit/Remittance/EditItem.jsx" />
<option value="$PROJECT_DIR$/src/reducers/audit.js" />
<option value="$PROJECT_DIR$/src/sagas/audit.js" />
<option value="$PROJECT_DIR$/src/containers/index.js" />
<option value="$PROJECT_DIR$/src/services/xFetch.js" /> <option value="$PROJECT_DIR$/src/services/xFetch.js" />
<option value="$PROJECT_DIR$/src/services/remittance.js" />
<option value="$PROJECT_DIR$/src/sagas/remittance.js" />
<option value="$PROJECT_DIR$/src/reducers/remittance.js" />
<option value="$PROJECT_DIR$/src/containers/Remittance/Audit/EditItem.jsx" />
</list> </list>
</option> </option>
</component> </component>
...@@ -436,95 +454,11 @@ ...@@ -436,95 +454,11 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="Announcement" /> <option name="myItemId" value="Remittance" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ShouyiYongjingForm" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ProductElementForm" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ProductDocumentsForm" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="ProductDateTimeForm" /> <option name="myItemId" value="Audit" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
...@@ -542,33 +476,11 @@ ...@@ -542,33 +476,11 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="components" /> <option name="myItemId" value="containers" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ProductContactForm" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="ProductBaseInfoForm" /> <option name="myItemId" value="Announcement" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
...@@ -589,32 +501,6 @@ ...@@ -589,32 +501,6 @@
<option name="myItemId" value="components" /> <option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="NextPrve" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="shuniu-admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="components" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="HuikuanInfoForm" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH> </PATH>
</subPane> </subPane>
</pane> </pane>
...@@ -638,14 +524,30 @@ ...@@ -638,14 +524,30 @@
<property name="JavaScriptWeakerCompletionTypeGuess" value="true" /> <property name="JavaScriptWeakerCompletionTypeGuess" value="true" />
<property name="FullScreen" value="true" /> <property name="FullScreen" value="true" />
<property name="nodejs_interpreter_path" value="/usr/local/bin/node" /> <property name="nodejs_interpreter_path" value="/usr/local/bin/node" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="100" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="102" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="106" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="900" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="100" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="102" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="106" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="900" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/containers/Login/images" /> <recent name="$PROJECT_DIR$/src/containers/Remittance/Audit" />
<recent name="$PROJECT_DIR$/src/containers/NotFound" /> <recent name="$PROJECT_DIR$/src/containers/Remittance" />
<recent name="$PROJECT_DIR$/src/components/Home" /> <recent name="$PROJECT_DIR$/src/containers/Audit" />
<recent name="$PROJECT_DIR$/src/components/App" /> <recent name="$PROJECT_DIR$/src/components" />
<recent name="$PROJECT_DIR$/src/components/App/" /> <recent name="$PROJECT_DIR$/src/containers/Audit/Remittance" />
</key> </key>
</component> </component>
<component name="RunManager"> <component name="RunManager">
...@@ -1077,12 +979,12 @@ ...@@ -1077,12 +979,12 @@
<workItem from="1468394206076" duration="1879000" /> <workItem from="1468394206076" duration="1879000" />
<workItem from="1468396235889" duration="33823000" /> <workItem from="1468396235889" duration="33823000" />
<workItem from="1468540294765" duration="94258000" /> <workItem from="1468540294765" duration="94258000" />
<workItem from="1468995021353" duration="45019000" /> <workItem from="1468995021353" duration="106735000" />
</task> </task>
<servers /> <servers />
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="174979000" /> <option name="totallyTimeSpent" value="236695000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
...@@ -1103,9 +1005,9 @@ ...@@ -1103,9 +1005,9 @@
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32896653" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32896653" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32876712" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32786885" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32739726" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24071082" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24071082" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
...@@ -1122,6 +1024,32 @@ ...@@ -1122,6 +1024,32 @@
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" /> <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
</layout> </layout>
<layout-to-restore>
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.329235" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32896653" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32739726" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24071082" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32876712" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="5" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout-to-restore>
</component> </component>
<component name="Vcs.Log.UiProperties"> <component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USER_GROUPS"> <option name="RECENTLY_FILTERED_USER_GROUPS">
...@@ -1136,476 +1064,479 @@ ...@@ -1136,476 +1064,479 @@
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
<option name="time" value="2" /> <option name="time" value="3" />
</breakpoint-manager> </breakpoint-manager>
<watches-manager /> <watches-manager />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/entries/index.js"> <entry file="file://$PROJECT_DIR$/node_modules/antd/lib/style/themes/default.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-361"> <state relative-caret-position="-1121">
<caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" /> <caret line="61" column="0" selection-start-line="61" selection-start-column="0" selection-end-line="61" selection-end-column="0" />
<folding> <folding />
<element signature="e#0#22#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/entries/index.html"> <entry file="file://$PROJECT_DIR$/node_modules/antd/package.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75"> <state relative-caret-position="-3285">
<caret line="5" column="32" selection-start-line="5" selection-start-column="32" selection-end-line="5" selection-end-column="32" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/sagas/user.js"> <entry file="file://$PROJECT_DIR$/node_modules/antd/lib/style/index.css">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105"> <state relative-caret-position="-6491">
<caret line="10" column="32" selection-start-line="10" selection-start-column="32" selection-end-line="10" selection-end-column="32" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/services/trade.js"> <entry file="file://$PROJECT_DIR$/node_modules/antd/lib/style/index.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="135"> <state relative-caret-position="0">
<caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding />
<element signature="e#0#30#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/.gitignore"> <entry file="file://$PROJECT_DIR$/node_modules/antd/lib/style/index.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45"> <state relative-caret-position="0">
<caret line="3" column="0" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/entries/index.less"> <entry file="file://$PROJECT_DIR$/node_modules/antd/lib/style/css.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105"> <state relative-caret-position="0">
<caret line="7" column="35" selection-start-line="7" selection-start-column="35" selection-end-line="7" selection-end-column="35" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Login/Login.less"> <entry file="file://$PROJECT_DIR$/webpack.config.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="165">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="4" selection-end-column="1" /> <caret line="11" column="15" selection-start-line="11" selection-start-column="15" selection-end-line="11" selection-end-column="15" />
<folding /> <folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/sagas/todos.js"> <entry file="file://$PROJECT_DIR$/package.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="405"> <state relative-caret-position="184">
<caret line="30" column="2" selection-start-line="30" selection-start-column="5" selection-end-line="33" selection-end-column="8" /> <caret line="48" column="6" selection-start-line="48" selection-start-column="6" selection-end-line="48" selection-end-column="6" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/sagas/trade.js"> <entry file="file://$PROJECT_DIR$/src/containers/App/App.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="570"> <state relative-caret-position="1215">
<caret line="51" column="5" selection-start-line="48" selection-start-column="4" selection-end-line="51" selection-end-column="5" /> <caret line="82" column="26" selection-start-line="82" selection-start-column="26" selection-end-line="82" selection-end-column="26" />
<folding> <folding>
<element signature="e#0#38#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/reducers/trade.js"> <entry file="file://$PROJECT_DIR$/src/components/Layout/Layout.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285"> <state relative-caret-position="255">
<caret line="19" column="45" selection-start-line="19" selection-start-column="45" selection-end-line="19" selection-end-column="45" /> <caret line="17" column="7" selection-start-line="17" selection-start-column="7" selection-end-line="17" selection-end-column="7" />
<folding> <folding>
<element signature="e#0#44#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/Commission.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="27"> <state relative-caret-position="0">
<caret line="21" column="6" selection-start-line="0" selection-start-column="0" selection-end-line="60" selection-end-column="0" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding />
<element signature="e#0#50#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/Contract.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Product/Product.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="222"> <state relative-caret-position="165">
<caret line="21" column="6" selection-start-line="18" selection-start-column="4" selection-end-line="21" selection-end-column="6" /> <caret line="11" column="28" selection-start-line="11" selection-start-column="28" selection-end-line="11" selection-end-column="28" />
<folding> <folding />
<element signature="e#0#50#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/Item.less"> <entry file="file://$PROJECT_DIR$/src/containers/App/App.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-72"> <state relative-caret-position="-402">
<caret line="16" column="19" selection-start-line="16" selection-start-column="19" selection-end-line="16" selection-end-column="19" /> <caret line="75" column="25" selection-start-line="75" selection-start-column="25" selection-end-line="75" selection-end-column="25" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/App/App.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Login/Login.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240"> <state relative-caret-position="225">
<caret line="36" column="67" selection-start-line="36" selection-start-column="67" selection-end-line="36" selection-end-column="67" /> <caret line="22" column="42" selection-start-line="22" selection-start-column="11" selection-end-line="22" selection-end-column="42" />
<folding> <folding>
<element signature="e#0#52#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/reducers/user.js"> <entry file="file://$PROJECT_DIR$/src/sagas/trade.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165"> <state relative-caret-position="495">
<caret line="12" column="33" selection-start-line="12" selection-start-column="26" selection-end-line="12" selection-end-column="33" /> <caret line="75" column="32" selection-start-line="75" selection-start-column="32" selection-end-line="75" selection-end-column="32" />
<folding>
<element signature="e#0#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/components/BackButton.jsx">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="15" column="1" selection-start-line="15" selection-start-column="1" selection-end-line="15" selection-end-column="1" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/Item.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/ContactForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1665"> <state relative-caret-position="612">
<caret line="119" column="20" selection-start-line="119" selection-start-column="20" selection-end-line="119" selection-end-column="90" /> <caret line="128" column="25" selection-start-line="128" selection-start-column="25" selection-end-line="128" selection-end-column="25" />
<folding> <folding>
<element signature="e#0#50#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Login/Login.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/DateTimeStatusForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="282"> <state relative-caret-position="612">
<caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" /> <caret line="148" column="25" selection-start-line="148" selection-start-column="25" selection-end-line="148" selection-end-column="25" />
<folding> <folding>
<element signature="e#0#50#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/services/user.js"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/ElementForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="135"> <state relative-caret-position="612">
<caret line="9" column="45" selection-start-line="9" selection-start-column="45" selection-end-line="9" selection-end-column="45" /> <caret line="145" column="25" selection-start-line="139" selection-start-column="24" selection-end-line="145" selection-end-column="25" />
<folding> <folding>
<element signature="e#0#30#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductBaseElement/ProductBaseElement.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/HuikuanInfoForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="374"> <state relative-caret-position="612">
<caret line="42" column="32" selection-start-line="42" selection-start-column="32" selection-end-line="42" selection-end-column="32" /> <caret line="91" column="25" selection-start-line="91" selection-start-column="25" selection-end-line="91" selection-end-column="25" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/List.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/ShouyiYongjingForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="402"> <state relative-caret-position="462">
<caret line="119" column="38" selection-start-line="119" selection-start-column="38" selection-end-line="119" selection-end-column="38" /> <caret line="162" column="54" selection-start-line="162" selection-start-column="54" selection-end-line="162" selection-end-column="54" />
<folding> <folding>
<element signature="e#0#50#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/YongjingSuanFaItem/YongjingSuanFaItem.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/DocumentsForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="554"> <state relative-caret-position="375">
<caret line="67" column="26" selection-start-line="51" selection-start-column="12" selection-end-line="67" selection-end-column="26" /> <caret line="52" column="8" selection-start-line="52" selection-start-column="8" selection-end-line="52" selection-end-column="8" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductDocumentsForm/ProductDocumentsForm.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/List.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="420"> <state relative-caret-position="312">
<caret line="28" column="45" selection-start-line="28" selection-start-column="36" selection-end-line="28" selection-end-column="45" /> <caret line="35" column="17" selection-start-line="35" selection-start-column="17" selection-end-line="35" selection-end-column="17" />
<folding> <folding>
<element signature="e#0#50#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ShouyiYongjingForm/ShouyiYongjingForm.jsx"> <entry file="file://$PROJECT_DIR$/src/utils.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="540"> <state relative-caret-position="27">
<caret line="140" column="103" selection-start-line="140" selection-start-column="103" selection-end-line="140" selection-end-column="103" /> <caret line="59" column="51" selection-start-line="59" selection-start-column="51" selection-end-line="59" selection-end-column="51" />
<folding> <folding />
<element signature="e#0#50#0" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/AddItem.less"> <entry file="file://$PROJECT_DIR$/src/components/MainHeader.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60"> <state relative-caret-position="60">
<caret line="4" column="7" selection-start-line="4" selection-start-column="7" selection-end-line="4" selection-end-column="7" /> <caret line="4" column="8" selection-start-line="4" selection-start-column="8" selection-end-line="4" selection-end-column="8" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductContactForm/ProductContactForm.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Product/AddItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300"> <state relative-caret-position="210">
<caret line="106" column="72" selection-start-line="106" selection-start-column="48" selection-end-line="106" selection-end-column="72" /> <caret line="143" column="8" selection-start-line="143" selection-start-column="8" selection-end-line="143" selection-end-column="80" />
<folding> <folding>
<element signature="e#0#50#0" expanded="false" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/utils.js"> <entry file="file://$PROJECT_DIR$/src/components/Layout/Layout.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="249"> <state relative-caret-position="15">
<caret line="25" column="72" selection-start-line="25" selection-start-column="72" selection-end-line="25" selection-end-column="72" /> <caret line="1" column="20" selection-start-line="1" selection-start-column="20" selection-end-line="1" selection-end-column="20" />
<folding> <folding />
<element signature="n#!!doc" expanded="false" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductDateTimeForm/ProductDateTimeForm.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/Commission.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255"> <state relative-caret-position="387">
<caret line="88" column="20" selection-start-line="88" selection-start-column="20" selection-end-line="88" selection-end-column="20" /> <caret line="72" column="24" selection-start-line="72" selection-start-column="24" selection-end-line="72" selection-end-column="24" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.less"> <entry file="file://$PROJECT_DIR$/src/entries/index.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75"> <state relative-caret-position="150">
<caret line="5" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="5" selection-end-column="0" /> <caret line="11" column="28" selection-start-line="11" selection-start-column="28" selection-end-line="11" selection-end-column="28" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/App/App.less"> <entry file="file://$PROJECT_DIR$/src/reducers/trade.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240"> <state relative-caret-position="30">
<caret line="16" column="12" selection-start-line="16" selection-start-column="4" selection-end-line="16" selection-end-column="12" /> <caret line="3" column="19" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/Product.less"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="357">
<caret line="196" column="41" selection-start-line="193" selection-start-column="32" selection-end-line="196" selection-end-column="41" />
<folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/Item.less">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180"> <state relative-caret-position="210">
<caret line="12" column="24" selection-start-line="12" selection-start-column="24" selection-end-line="12" selection-end-column="24" /> <caret line="14" column="4" selection-start-line="14" selection-start-column="4" selection-end-line="14" selection-end-column="4" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Trade/AddItem.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Product/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60"> <state relative-caret-position="402">
<caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" /> <caret line="108" column="103" selection-start-line="108" selection-start-column="103" selection-end-line="108" selection-end-column="103" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/HuikuanInfoForm/HuikuanInfoForm.jsx"> <entry file="file://$PROJECT_DIR$/src/components/ProductForm/BaseInfoForm.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330"> <state relative-caret-position="465">
<caret line="22" column="0" selection-start-line="22" selection-start-column="0" selection-end-line="25" selection-end-column="5" /> <caret line="115" column="69" selection-start-line="115" selection-start-column="69" selection-end-line="115" selection-end-column="69" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/NextPrve/NextPrve.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/Item.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252"> <state relative-caret-position="381">
<caret line="25" column="0" selection-start-line="25" selection-start-column="0" selection-end-line="25" selection-end-column="0" /> <caret line="38" column="95" selection-start-line="38" selection-start-column="95" selection-end-line="38" selection-end-column="95" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/proxy.config.js"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/Contract.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="672"> <state relative-caret-position="267">
<caret line="78" column="2" selection-start-line="78" selection-start-column="2" selection-end-line="78" selection-end-column="2" /> <caret line="64" column="8" selection-start-line="64" selection-start-column="8" selection-end-line="64" selection-end-column="94" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/List.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Product/List.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="477"> <state relative-caret-position="342">
<caret line="58" column="48" selection-start-line="58" selection-start-column="27" selection-end-line="58" selection-end-column="48" /> <caret line="134" column="52" selection-start-line="133" selection-start-column="8" selection-end-line="134" selection-end-column="52" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/Item.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Trade/AddItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="327"> <state relative-caret-position="522">
<caret line="65" column="57" selection-start-line="65" selection-start-column="57" selection-end-line="65" selection-end-column="57" /> <caret line="87" column="101" selection-start-line="87" selection-start-column="20" selection-end-line="87" selection-end-column="101" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductBaseInfoForm/ProductBaseInfoForm.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Announcement/List.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="447"> <state relative-caret-position="462">
<caret line="249" column="32" selection-start-line="247" selection-start-column="20" selection-end-line="249" selection-end-column="32" /> <caret line="129" column="33" selection-start-line="126" selection-start-column="24" selection-end-line="129" selection-end-column="33" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/reducers/product.js"> <entry file="file://$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="417"> <state relative-caret-position="252">
<caret line="30" column="6" selection-start-line="22" selection-start-column="4" selection-end-line="30" selection-end-column="6" /> <caret line="51" column="97" selection-start-line="50" selection-start-column="8" selection-end-line="51" selection-end-column="97" />
<folding /> <folding>
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/components/ProductElementForm/ProductElementForm.jsx"> <entry file="file://$PROJECT_DIR$/src/routes/index.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-90"> <state relative-caret-position="30">
<caret line="83" column="22" selection-start-line="83" selection-start-column="22" selection-end-line="83" selection-end-column="22" /> <caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Announcement/List.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75"> <state relative-caret-position="480">
<caret line="5" column="0" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" /> <caret line="32" column="49" selection-start-line="0" selection-start-column="0" selection-end-line="99" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/EditItem.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/index.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-870"> <state relative-caret-position="225">
<caret line="1" column="0" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="36" /> <caret line="15" column="35" selection-start-line="15" selection-start-column="35" selection-end-line="15" selection-end-column="35" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/services/product.js"> <entry file="file://$PROJECT_DIR$/src/services/xFetch.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255"> <state relative-caret-position="330">
<caret line="17" column="39" selection-start-line="17" selection-start-column="39" selection-end-line="17" selection-end-column="39" /> <caret line="22" column="53" selection-start-line="22" selection-start-column="53" selection-end-line="22" selection-end-column="53" />
<folding> <folding />
<element signature="e#0#30#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/sagas/product.js"> <entry file="file://$PROJECT_DIR$/src/services/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="582"> <state relative-caret-position="105">
<caret line="119" column="1" selection-start-line="100" selection-start-column="0" selection-end-line="119" selection-end-column="1" /> <caret line="7" column="48" selection-start-line="7" selection-start-column="48" selection-end-line="7" selection-end-column="48" />
<folding> <folding>
<element signature="e#0#38#0" expanded="true" /> <element signature="e#0#30#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/reducers/announcement.js"> <entry file="file://$PROJECT_DIR$/src/services/announcement.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="420"> <state relative-caret-position="0">
<caret line="28" column="13" selection-start-line="28" selection-start-column="13" selection-end-line="28" selection-end-column="13" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#44#0" expanded="true" /> <element signature="e#0#30#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/sagas/announcement.js"> <entry file="file://$PROJECT_DIR$/src/sagas/announcement.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="469"> <state relative-caret-position="135">
<caret line="74" column="59" selection-start-line="74" selection-start-column="35" selection-end-line="74" selection-end-column="59" /> <caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="52" selection-end-column="1" />
<folding> <folding>
<element signature="e#0#38#0" expanded="true" /> <element signature="e#0#38#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Product/AddItem.jsx"> <entry file="file://$PROJECT_DIR$/src/sagas/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15"> <state relative-caret-position="492">
<caret line="105" column="19" selection-start-line="105" selection-start-column="4" selection-end-line="105" selection-end-column="19" /> <caret line="49" column="44" selection-start-line="49" selection-start-column="44" selection-end-line="49" selection-end-column="44" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#38#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Announcement/AddItem.jsx"> <entry file="file://$PROJECT_DIR$/src/reducers/remittance.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525"> <state relative-caret-position="240">
<caret line="53" column="93" selection-start-line="53" selection-start-column="93" selection-end-line="53" selection-end-column="93" /> <caret line="17" column="60" selection-start-line="17" selection-start-column="60" selection-end-line="17" selection-end-column="60" />
<folding> <folding />
<element signature="e#0#50#0" expanded="true" />
</folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/containers/Announcement/EditItem.jsx"> <entry file="file://$PROJECT_DIR$/src/containers/Remittance/Audit/List.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="750"> <state relative-caret-position="990">
<caret line="64" column="93" selection-start-line="64" selection-start-column="93" selection-end-line="64" selection-end-column="93" /> <caret line="115" column="63" selection-start-line="115" selection-start-column="49" selection-end-line="115" selection-end-column="63" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/routes/index.js"> <entry file="file://$PROJECT_DIR$/src/containers/Remittance/Audit/EditItem.jsx">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="477"> <state relative-caret-position="-15">
<caret line="48" column="75" selection-start-line="48" selection-start-column="75" selection-end-line="48" selection-end-column="75" /> <caret line="38" column="21" selection-start-line="38" selection-start-column="4" selection-end-line="38" selection-end-column="21" />
<folding> <folding>
<element signature="e#0#50#0" expanded="true" /> <element signature="e#0#50#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/src/services/announcement.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="8" column="37" selection-start-line="8" selection-start-column="37" selection-end-line="8" selection-end-column="37" />
<folding>
<element signature="e#0#30#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/services/xFetch.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="15" column="8" selection-start-line="15" selection-start-column="8" selection-end-line="15" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
</component> </component>
<component name="masterDetails"> <component name="masterDetails">
<states> <states>
......
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
"redux": "^3.5.2", "redux": "^3.5.2",
"redux-actions": "0.9.x", "redux-actions": "0.9.x",
"redux-async-connect": "^1.0.0-rc4", "redux-async-connect": "^1.0.0-rc4",
"redux-saga": "^0.10.4" "redux-saga": "^0.10.4",
"src": "^1.1.2"
}, },
"devDependencies": { "devDependencies": {
"atool-test-mocha": "^0.1.4", "atool-test-mocha": "^0.1.4",
...@@ -44,6 +45,9 @@ ...@@ -44,6 +45,9 @@
"pre-commit": "1.x", "pre-commit": "1.x",
"redbox-react": "^1.2.2" "redbox-react": "^1.2.2"
}, },
"theme": {
"primary-color": "#1DA57A"
},
"pre-commit": [ "pre-commit": [
"lint" "lint"
], ],
...@@ -53,4 +57,4 @@ ...@@ -53,4 +57,4 @@
"start": "dora --plugins \"proxy,webpack,webpack-hmr,livereload?enableJs=false&injectHost=127.0.0.1,browser-history?index=/src/entries/index.html\"", "start": "dora --plugins \"proxy,webpack,webpack-hmr,livereload?enableJs=false&injectHost=127.0.0.1,browser-history?index=/src/entries/index.html\"",
"test": "atool-test-mocha ./src/**/__tests__/*-test.js" "test": "atool-test-mocha ./src/**/__tests__/*-test.js"
} }
} }
\ No newline at end of file
...@@ -74,6 +74,6 @@ module.exports = { ...@@ -74,6 +74,6 @@ module.exports = {
}) })
},100); },100);
}, },
// '/api/*': 'http://react.yanky.cn/', '/api/*': 'http://react.yanky.cn/',
'/api/*': 'http://192.168.1.126:8080/' // '/api/*': 'http://192.168.1.126:8080/'
}; };
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table
} from 'antd';
@Form.create()
export default class HuikuanInfoForm extends Component {
constructor(props, context) {
super(props, context);
}
static propsType = {
product: PropTypes.object
};
handleSubmit(e){
e.preventDefault();
const data = this.props.form.getFieldsValue();
const {product} = this.props;
data.id = product.id;
console.log('收到表单值:', data);
this.props.dispatch({
type:'UPDATE_PRODUCT_ITEM',
item: data
});
}
render() {
const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 14},
};
const {form:{getFieldProps}, product:{fundRaisedAccount}} = this.props;
return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="名称" {...formItemLayout} wrapperCol={{span:6}}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.name', {initialValue: fundRaisedAccount.name})} />
</Form.Item>
<Form.Item label="银行帐号" {...formItemLayout} wrapperCol={{span:6}}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.number',{initialValue:fundRaisedAccount.number})} />
</Form.Item>
<Form.Item label="开户行" {...formItemLayout}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.bank',{initialValue:fundRaisedAccount.bank})} />
</Form.Item>
<Form.Item label="打款须知" {...formItemLayout}>
<Input type="textarea" rows={10} placeholder="" {...getFieldProps('fundRaisedAccount.memo',{initialValue:fundRaisedAccount.memo})} />
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button>
</Form.Item>
</Form>
);
}
}
import React, {Component, PropTypes} from 'react';
import {Router, Route, IndexRoute, Link} from 'react-router';
export default class Layout extends Component {
render() {
const {children, headerClassName, contentClassName, footerClassName, header, footer} = this.props;
const styles = require('./Layout.less');
return (
<section className={styles.layout}>
{header}
<div className={[styles.content, contentClassName].join(' ')}>
{children}
</div>
{footer}
</section>
);
}
}
.layout {
font-size: 14px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
& > .content {
flex: 1;
overflow: auto;
}
}
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Breadcrumb
} from 'antd';
export default class MainHeader extends Component {
static propType = {
breadcrumb: PropTypes.array,
title: PropTypes.node
};
render() {
const {breadcrumb, title} = this.props;
return (
<div className="main-header">
<Row>
<Col span="8">
<Breadcrumb>
{ breadcrumb.map((b, i)=><Breadcrumb.Item key={i}>{b}</Breadcrumb.Item>) }
</Breadcrumb>
</Col>
</Row>
<Row>
<Col span="20">
<h1 className="tac">{title}</h1>
</Col>
</Row>
</div>
);
}
}
.imgPriviewDialog{
:global(.ant-modal-content){
background-color: transparent;
}
}
...@@ -17,15 +17,20 @@ import { ...@@ -17,15 +17,20 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin
} from 'antd'; } from 'antd';
import {PRODUCT_STATUS, arrayRemoveIndex, UUID} from '../../utils'; import {
UUID,
const ProductStatus = Object.keys(PRODUCT_STATUS); formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
@Form.create() @Form.create()
export default class ProductBaseInfoForm extends Component { export default class BaseInfoForm extends Component {
static propsType = { static propsType = {
cates: PropTypes.array, cates: PropTypes.array,
...@@ -42,32 +47,25 @@ export default class ProductBaseInfoForm extends Component { ...@@ -42,32 +47,25 @@ export default class ProductBaseInfoForm extends Component {
priviewImage: '', priviewImage: '',
fileList: [] fileList: []
}; };
}
const {itemPic} = props.product; componentWillMount(){
const {itemPic} = this.props.product;
if (itemPic) { if (itemPic) {
this.state.fileList.push({ this.setState({
uid: UUID(), fileList:[{
status: 'done', uid: UUID(),
url: itemPic, status: 'done',
thumbUrl: itemPic + '!t' url: itemPic,
thumbUrl: itemPic + '!t'
}]
}); });
} else { } else {
console.log('没有找到商品主图', props.product); console.log('没有找到商品主图', this.props.product);
} }
} }
handleCancel() {
this.setState({
priviewVisible: false,
});
};
onChange(value) {
console.log(value);
};
handleSubmit(e) { handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
...@@ -93,48 +91,8 @@ export default class ProductBaseInfoForm extends Component { ...@@ -93,48 +91,8 @@ export default class ProductBaseInfoForm extends Component {
}; };
handleUpload(info) {
let fileList = info.fileList;
// 3. 按照服务器返回信息筛选成功上传的文件
fileList = fileList.filter((file) => {
if (file.response) {
return file.response.status === 1;
}
return true;
});
// 1. 上传列表数量的限制
// 只显示最近上传的一个,旧的会被新的顶掉
fileList = fileList.slice(-1);
// 2. 读取远程路径并显示链接
fileList = fileList.map((file) => {
if (file.response) {
// 组件会将 file.url 作为链接进行展示
//file.url = file.response.url;
const {result, status, message} = file.response;
if (status === 1 && result && result.length >= 1 && result[0].url) {
file.url = result[0].url;
file.thumbUrl = result[0].url + '!t';
}
}
return file;
});
this.setState({fileList});
};
render() { render() {
const {user, cates, product, loading, form:{getFieldProps}} = this.props;
const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 14},
};
const {user, cates, product, form:{getFieldProps}} = this.props;
let productCate = []; let productCate = [];
...@@ -142,115 +100,146 @@ export default class ProductBaseInfoForm extends Component { ...@@ -142,115 +100,146 @@ export default class ProductBaseInfoForm extends Component {
productCate = [product.categoryParentId, product.categoryId]; productCate = [product.categoryParentId, product.categoryId];
} }
const styles = require('./ProductBaseInfoForm.less');
return ( return (
<div> <Spin spinning={loading}>
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="商品类目" {...formItemLayout} wrapperCol={{span: 6}}> <Form.Item label="产品类目" {...smallFormItemLayout}>
<Cascader <Cascader options={cates} placeholder="请选产品类目"
options={cates} {...getFieldProps('categoryId', {
defaultValue={productCate} initialValue: productCate
{...getFieldProps('categoryId', {initialValue: productCate})} })}
placeholder="请选产品类目"/> />
</Form.Item> </Form.Item>
<Form.Item label="商品标题" {...formItemLayout}> <Form.Item label="产品短标题" {...smallFormItemLayout}>
<Input placeholder="商品标题" {...getFieldProps('itemTitle', {initialValue: product.itemTitle})} /> <Input placeholder="产品短标题"
{...getFieldProps('itemShortTitle', {
initialValue: product.itemShortTitle,
})}
/>
</Form.Item> </Form.Item>
<Form.Item label="商品短标题" {...formItemLayout} wrapperCol={{span: 6}}> <Form.Item label="产品标题" {...formItemLayout}>
<Input placeholder="商品短标题" <Input placeholder="产品标题"
{...getFieldProps('itemShortTitle', {initialValue: product.itemShortTitle})} /> {...getFieldProps('itemTitle', {
initialValue: product.itemTitle
})}
/>
</Form.Item> </Form.Item>
<Form.Item label="商品主图" {...formItemLayout}> <Form.Item label="产品简介" {...formItemLayout}>
<Input type="textarea" rows={5} placeholder="产品简介"
{...getFieldProps('summary', {
initialValue: product.summary
})}
/>
</Form.Item>
<Form.Item label="产品主图" {...formItemLayout}>
<Upload action="/api/fileUpload/upload" listType="picture-card" <Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true} multiple={true}
headers={{ headers={{
authorization: user && user.token, authorization: user && user.token,
}} }}
onChange={this.handleUpload.bind(this)} onChange={info=>this.setState({fileList: handleUpload(info, 1)})}
onPreview={(file) => { onPreview={file => {
this.setState({ this.setState({
priviewImage: file.url, priviewImage: file.url,
priviewVisible: true, priviewVisible: true
}); });
}} }}
fileList={this.state.fileList}> fileList={this.state.fileList}>
<Icon type="upload"/> <Icon type="upload"/>
<div className="ant-upload-text">上传照片</div> <div className="ant-upload-text">上传照片</div>
</Upload> </Upload>
<Modal visible={this.state.priviewVisible} footer={null} <Modal footer={null}
width="100vw" width="100vw"
className={styles.imgPriviewDialog} visible={this.state.priviewVisible}
className="img-priview-dialog"
style={{height:'100vh', background:'transparent'}} style={{height:'100vh', background:'transparent'}}
onCancel={this.handleCancel.bind(this)}> onCancel={()=>this.setState({ priviewVisible: false })}>
<img src={this.state.priviewImage} style={{maxWidth:'100%'}}/> <img src={this.state.priviewImage} style={{maxWidth:'100%'}}/>
</Modal> </Modal>
</Form.Item> </Form.Item>
<Form.Item label="商品简介" {...formItemLayout}> <Form.Item label="募集目标" help="本期额度, 可以输入100万, 2亿等" {...smallFormItemLayout}>
<Input type="textarea" rows={5} <Input placeholder="募集目标"
placeholder="商品简介" {...getFieldProps('fundRaisedTarget', {
{...getFieldProps('summary', {initialValue: product.summary})} /> initialValue: product.fundRaisedTarget
</Form.Item> })}
<Form.Item label="募集目标" help="本期额度, 可以输入100万, 2亿等" {...formItemLayout} wrapperCol={{span:6}}> />
<Input placeholder="" {...getFieldProps('fundRaisedTarget', {
initialValue: product.fundRaisedTarget
})} />
</Form.Item> </Form.Item>
<Form.Item label="产品期限" help="例如:半年期" {...formItemLayout} wrapperCol={{span:6}}> <Form.Item label="产品期限" help="例如:半年期" {...smallFormItemLayout}>
<Input placeholder="" {...getFieldProps('duration', { <Input placeholder="" {...getFieldProps('duration', {
initialValue: product.duration initialValue: product.duration
})} /> })} />
</Form.Item> </Form.Item>
<Form.Item label="起投金额" help="最小购买份额" {...formItemLayout} wrapperCol={{span:6}}> <Form.Item label="起投金额" help="最小购买份额" {...smallFormItemLayout}>
<Input placeholder="" {...getFieldProps('minimumAmount', { <Input placeholder=""
initialValue: product.minimumAmount {...getFieldProps('minimumAmount', {
})} /> initialValue: product.minimumAmount
})}
/>
</Form.Item> </Form.Item>
<Form.Item label="已预约" help="此处的已预约只用于显示" {...formItemLayout} wrapperCol={{span:6}}> <Form.Item label="已预约" help="此处的已预约只用于显示" {...smallFormItemLayout} >
{ {
((typeof product.fundReservationOver !== 'undefined') && ( product.fundReservationOver !== '')) ? ((typeof product.fundReservationOver !== 'undefined') && ( product.fundReservationOver !== '')) ?
<div style={{maxWidth:500}}> <div style={{maxWidth:500}}>
<Input addonAfter={"实际:"+ product.fundReservationOver} <Input addonAfter={"实际:"+ product.fundReservationOver}
{...getFieldProps('fundReservationOverFake', { {...getFieldProps('fundReservationOverFake', {
initialValue: product.fundReservationOverFake initialValue: product.fundReservationOverFake
})} /> })}
/>
</div> </div>
: :
<Input {...getFieldProps('fundReservationOverFake', { <Input
initialValue: product.fundReservationOverFake {...getFieldProps('fundReservationOverFake', {
})} /> initialValue: product.fundReservationOverFake
})}
/>
} }
</Form.Item> </Form.Item>
<Form.Item label="已募集" help="此处的已募集只用于显示" {...formItemLayout} wrapperCol={{span:6}}> <Form.Item label="已募集" help="此处的已募集只用于显示" {...smallFormItemLayout}>
{ {
((typeof product.fundRaisedOver !== 'undefined') && (product.fundRaisedOver !== '')) ? ((typeof product.fundRaisedOver !== 'undefined') && (product.fundRaisedOver !== '')) ?
<div style={{maxWidth:500}}> <div style={{maxWidth:500}}>
<Input addonAfter={"实际:"+ product.fundRaisedOver} <Input addonAfter={"实际:"+ product.fundRaisedOver}
{...getFieldProps('fundRaisedOverFake', { {...getFieldProps('fundRaisedOverFake', {
initialValue: product.fundRaisedOverFake initialValue: product.fundRaisedOverFake
})} /> })}
/>
</div> </div>
: :
<Input {...getFieldProps('fundRaisedOverFake', { <Input
initialValue: product.fundRaisedOverFake {...getFieldProps('fundRaisedOverFake', {
})} /> initialValue: product.fundRaisedOverFake
})}
/>
} }
</Form.Item> </Form.Item>
<Form.Item label="产品所属公司" {...formItemLayout} wrapperCol={{span: 6}}> <Form.Item label="产品所属公司" {...smallFormItemLayout} >
<Input placeholder="产品所属公司" <Input placeholder="产品所属公司"
{...getFieldProps('company', {initialValue: product.company})} /> {...getFieldProps('company', {
initialValue: product.company
})}
/>
</Form.Item> </Form.Item>
<Form.Item label="所属公司网址" {...formItemLayout} wrapperCol={{span: 6}}> <Form.Item label="所属公司网址" {...smallFormItemLayout}>
<Input placeholder="所属公司网址" <Input placeholder="所属公司网址"
{...getFieldProps('website', {initialValue: product.website})} /> {...getFieldProps('website', {
initialValue: product.website
})}
/>
</Form.Item> </Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item> </Form.Item>
</Form> </Form>
</Spin>
</div>
); );
} }
} }
......
...@@ -16,26 +16,15 @@ import { ...@@ -16,26 +16,15 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {arrayRemoveIndex, UUID} from '../../utils';
export function CreateBaseElement() {
return {key: UUID()};
}
export function BaseElementTransform(arr) {
return Object.keys(objs).map(key=>({
key: UUID(),
name: key,
mobile: objs[key]
}));
}
@Form.create() @Form.create()
export default class ProductContactForm extends Component { export default class ContactForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -98,40 +87,49 @@ export default class ProductContactForm extends Component { ...@@ -98,40 +87,49 @@ export default class ProductContactForm extends Component {
} }
render() { render() {
const {form:{getFieldProps}} = this.props; const {form:{getFieldProps}, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
{ <Form.Item>
this.state.staffs.map((item, index)=> {
<div key={item.key} style={{marginBottom:8}}> this.state.staffs.map((item, index)=>
<Input.Group> <div key={item.key} style={{marginBottom:8}}>
<Col span="6"> <Input.Group>
<Input placeholder="姓名" <Col span="6">
{...getFieldProps(index + '.name', { <Input placeholder="姓名"
initialValue: item.name {...getFieldProps(index + '.name', {
})} /> initialValue: item.name
</Col> })} />
<Col span="10"> </Col>
<Input placeholder="电话" <Col span="10">
{...getFieldProps(index + '.mobile', { <Input placeholder="电话"
initialValue: item.mobile {...getFieldProps(index + '.mobile', {
})}/> initialValue: item.mobile
</Col> })}/>
<Col span="4"> </Col>
<Icon type="cross" onClick={this.handleRemove.bind(this, index)}/> <Col span="4">
</Col> <Icon type="cross" title="删除" onClick={this.handleRemove.bind(this, index)}/>
</Input.Group> </Col>
</div> </Input.Group>
) </div>
} )
</Form.Item> }
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Form.Item>
<Button onClick={this.handleAdd.bind(this)} style={{marginRight:'1em'}}><Icon <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
type="plus"/>添加</Button> <Button onClick={this.handleAdd.bind(this)} style={{marginRight:'1em'}}><Icon
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> type="plus"/>添加</Button>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Form> {
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
...@@ -16,17 +16,25 @@ import { ...@@ -16,17 +16,25 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {
PRODUCT_STATUS,
formatDateTime,
arrayRemoveIndex,
UUID,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout
} from '../../utils';
import {PRODUCT_STATUS, formatDateTime} from '../../utils'; const ProductStatus = Object.keys(PRODUCT_STATUS).filter(key=>key != -9);
const ProductStatus = Object.keys(PRODUCT_STATUS);
@Form.create() @Form.create()
export default class ProductDateTimeForm extends Component { export default class DateTimeSatausForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
...@@ -69,11 +77,8 @@ export default class ProductDateTimeForm extends Component { ...@@ -69,11 +77,8 @@ export default class ProductDateTimeForm extends Component {
} }
render() { render() {
const formItemLayout = {
labelCol: {span: 4}, const {product, loading, form:{getFieldProps}, isCreate} = this.props;
wrapperCol: {span: 14},
};
const {cates, product, form:{getFieldProps}, isCreate} = this.props;
const { const {
fundReservationStartTime, fundReservationStartTime,
fundRaisedEndTime, fundRaisedEndTime,
...@@ -84,58 +89,67 @@ export default class ProductDateTimeForm extends Component { ...@@ -84,58 +89,67 @@ export default class ProductDateTimeForm extends Component {
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
{ <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
!isCreate && {
<Form.Item label="商品状态" {...formItemLayout} wrapperCol={{span:20}}> !isCreate &&
<Radio.Group {...getFieldProps('status', {initialValue: product.status + ''})}> <Form.Item label="产品状态" {...formItemLayout} wrapperCol={{span:20}}>
{ <Radio.Group {...getFieldProps('status', {initialValue: product.status + ''})}>
ProductStatus.map((status, index)=> {
<Radio.Button key={status} data-value={status} ProductStatus.map((status, index)=>
value={status}>{PRODUCT_STATUS[status]}</Radio.Button> <Radio.Button key={status} data-value={status}
) value={status}>{PRODUCT_STATUS[status]}</Radio.Button>
} )
</Radio.Group> }
</Radio.Group>
</Form.Item>
}
<Form.Item label="预约开始时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择预约开始时间"
{...getFieldProps('fundReservationStartTime', {
initialValue: fundReservationStartTime ? formatDateTime(fundReservationStartTime) : ''
})}
/>
</Form.Item>
<Form.Item label="募集开始与结束时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundRaisedStartTime', {
initialValue: [
fundReservationStartTime ? formatDateTime(fundReservationStartTime) : '',
fundRaisedEndTime ? formatDateTime(fundRaisedEndTime) : ''
]
})}
/>
</Form.Item>
<Form.Item label="汇款结束时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择汇款结束时间"
{...getFieldProps('remittanceEndTime', {
initialValue: remittanceEndTime ? formatDateTime(remittanceEndTime) : ''
})}
/>
</Form.Item>
<Form.Item label="基金成立与到期时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundEstablishedTime', {
initialValue: [
fundEstablishedTime ? formatDateTime(fundEstablishedTime) : '',
fundExpireTime ? formatDateTime(fundExpireTime) : ''
]
})}
/>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item> </Form.Item>
} </Form>
<Form.Item label="预约开始时间" {...formItemLayout}> </Spin>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择预约开始时间"
{...getFieldProps('fundReservationStartTime', {
initialValue: fundReservationStartTime ? formatDateTime(fundReservationStartTime) : ''
})}
/>
</Form.Item>
<Form.Item label="募集开始与结束时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundRaisedStartTime', {
initialValue: [
fundReservationStartTime ? formatDateTime(fundReservationStartTime) : '',
fundRaisedEndTime ? formatDateTime(fundRaisedEndTime) : ''
]
})}
/>
</Form.Item>
<Form.Item label="汇款结束时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择汇款结束时间"
{...getFieldProps('remittanceEndTime', {
initialValue: remittanceEndTime ? formatDateTime(remittanceEndTime) : ''
})}
/>
</Form.Item>
<Form.Item label="基金成立与到期时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundEstablishedTime', {
initialValue: [
fundEstablishedTime ? formatDateTime(fundEstablishedTime) : '',
fundExpireTime ? formatDateTime(fundExpireTime) : ''
]
})}
/>
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button>
</Form.Item>
</Form>
); );
} }
} }
...@@ -16,13 +16,21 @@ import { ...@@ -16,13 +16,21 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {UUID} from '../../utils'; import {
arrayRemoveIndex,
UUID,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
@Form.create() @Form.create()
export default class ProductDocumentsForm extends Component { export default class DocumentsForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -41,37 +49,14 @@ export default class ProductDocumentsForm extends Component { ...@@ -41,37 +49,14 @@ export default class ProductDocumentsForm extends Component {
}; };
handleUpload(info) { componentWillMount(){
let fileList = info.fileList;
// 3. 按照服务器返回信息筛选成功上传的文件
fileList = fileList.filter((file) => {
if (file.response) {
return file.response.status === 1;
}
return true;
});
// 2. 读取远程路径并显示链接
fileList = fileList.map((file) => {
if (file.response) {
// 组件会将 file.url 作为链接进行展示
//file.url = file.response.url;
const {result, status, message} = file.response;
if (status === 1 && result && result.length >= 1 && result[0].url) {
file.url = result[0].url;
}
}
return file;
});
this.setState({fileList});
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const files = []; const files = [];
this.state.fileList.forEach(file=>{ this.state.fileList.forEach(file=> {
files.push({ files.push({
name: file.name, name: file.name,
file: file.url file: file.url
...@@ -89,29 +74,39 @@ export default class ProductDocumentsForm extends Component { ...@@ -89,29 +74,39 @@ export default class ProductDocumentsForm extends Component {
item: data item: data
}); });
} }
render() { render() {
const {user, product} = this.props; const {user, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{maxWidth:'800px', margin:'auto'}}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{maxWidth:'800px', margin:'auto'}}>
<Upload.Dragger action="/api/fileUpload/upload" <Form.Item>
multiple={true} <Upload.Dragger action="/api/fileUpload/upload"
headers={{ multiple={true}
authorization: user && user.token, headers={{
}} authorization: user && user.token,
onChange={this.handleUpload.bind(this)} }}
fileList={this.state.fileList}> onChange={info=>this.setState({fileList: handleUpload(info)})}
<p className="ant-upload-drag-icon"> fileList={this.state.fileList}>
<Icon type="inbox"/> <p className="ant-upload-drag-icon">
</p> <Icon type="inbox"/>
<p className="ant-upload-text">点击或将文件拖拽到此区域上传</p> </p>
<p className="ant-upload-hint">支持单个或批量上传,严禁上传公司内部资料及其他违禁文件</p> <p className="ant-upload-text">点击或将文件拖拽到此区域上传</p>
</Upload.Dragger> <p className="ant-upload-hint">支持单个或批量上传,严禁上传公司内部资料及其他违禁文件</p>
</Form.Item> </Upload.Dragger>
<Form.Item style={{marginTop:30, textAlign:'center'}}> </Form.Item>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> <Form.Item style={{marginTop:30, textAlign:'center'}}>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Form> {
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
...@@ -16,12 +16,12 @@ import { ...@@ -16,12 +16,12 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {arrayRemoveIndex, UUID} from '../../utils';
export function CreateBaseElement() { export function CreateBaseElement() {
return {key: UUID()}; return {key: UUID()};
} }
...@@ -35,7 +35,7 @@ export function BaseElementTransform(objs) { ...@@ -35,7 +35,7 @@ export function BaseElementTransform(objs) {
} }
@Form.create() @Form.create()
export default class HuikuanInfoForm extends Component { export default class ElementForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -97,40 +97,56 @@ export default class HuikuanInfoForm extends Component { ...@@ -97,40 +97,56 @@ export default class HuikuanInfoForm extends Component {
} }
render() { render() {
const {form:{getFieldProps}} = this.props; const {form:{getFieldProps}, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<h3>可以设置以下要素,或者自定义其他要素</h3> <Form.Item>
<p>总规模、投资亮点、托管方、结算方式、资金用途、融资方、担保主体、风控措施、还款来源、发行方、认购起点、大小额配比</p> <h3>可以设置以下要素,或者自定义其他要素</h3>
</Form.Item> <p>总规模、投资亮点、托管方、结算方式、资金用途、融资方、担保主体、风控措施、还款来源、发行方、认购起点、大小额配比</p>
<Form.Item> </Form.Item>
{ <Form.Item>
this.state.elements.map((item, index)=> {
<div key={item.key} style={{marginBottom:8}}> this.state.elements.map((item, index)=>
<Input.Group> <div key={item.key} style={{marginBottom:8}}>
<Col span="6"> <Input.Group>
<Input <Col span="6">
placeholder="标题" {...getFieldProps(index + '.title', {initialValue: item.title})} /> <Input placeholder="标题"
</Col> {...getFieldProps(index + '.title', {
<Col span="10"> initialValue: item.title
<Input type="textarea" placeholder="内容" autosize })}
{...getFieldProps(index + '.content', {initialValue: item.content})}/> />
</Col> </Col>
<Col span="4"> <Col span="10">
<Icon type="cross" onClick={this.handleRemoveElement.bind(this, index)}/> <Input type="textarea" placeholder="内容" autosize
</Col> {...getFieldProps(index + '.content', {
</Input.Group> initialValue: item.content
</div> })}
) />
} </Col>
</Form.Item> <Col span="4">
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> <Icon type="cross" title="删除"
<Button onClick={this.handleAddElement.bind(this)} style={{marginRight:'1em'}}><Icon onClick={this.handleRemoveElement.bind(this, index)}/>
type="plus"/>添加</Button> </Col>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> </Input.Group>
</Form.Item> </div>
</Form> )
}
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button onClick={this.handleAddElement.bind(this)} style={{marginRight:'1em'}}><Icon
type="plus"/>添加</Button>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
@Form.create()
export default class HuikuanInfoForm extends Component {
constructor(props, context) {
super(props, context);
}
static propsType = {
product: PropTypes.object
};
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
const {product} = this.props;
data.id = product.id;
console.log('收到表单值:', data);
this.props.dispatch({
type: 'UPDATE_PRODUCT_ITEM',
item: data
});
}
render() {
const {form:{getFieldProps}, product:{fundRaisedAccount}, loading} = this.props;
return (
<Spin spinning={loading}>
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="名称" help="接收打款帐户名称" {...smallFormItemLayout} >
<Input placeholder="名称"
{...getFieldProps('fundRaisedAccount.name', {
initialValue: fundRaisedAccount.name
})}
/>
</Form.Item>
<Form.Item label="银行帐号" help="接收打款银行帐号" {...smallFormItemLayout}>
<Input placeholder="银行帐号"
{...getFieldProps('fundRaisedAccount.number', {
initialValue: fundRaisedAccount.number
})}
/>
</Form.Item>
<Form.Item label="开户行" help="接收打款银行开户行" {...formItemLayout}>
<Input placeholder="开户行"
{...getFieldProps('fundRaisedAccount.bank', {
initialValue: fundRaisedAccount.bank
})}
/>
</Form.Item>
<Form.Item label="打款须知" help="接收打款的一些必要告知信息" {...formItemLayout}>
<Input type="textarea" rows={10} placeholder=""
{...getFieldProps('fundRaisedAccount.memo', {
initialValue: fundRaisedAccount.memo
})}
/>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
);
}
}
...@@ -16,13 +16,13 @@ import { ...@@ -16,13 +16,13 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, formatMoney} from '../../utils'; import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {UUID} from '../../utils';
export function YongjingTransform(arr) { export function YongjingTransform(arr) {
return arr.map(item=>({ return arr.map(item=>({
...@@ -76,18 +76,18 @@ export default class ShouyiYongjingForm extends Component { ...@@ -76,18 +76,18 @@ export default class ShouyiYongjingForm extends Component {
this.setState({yongjing: yongjing}); this.setState({yongjing: yongjing});
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const formData = this.props.form.getFieldsValue(); const formData = this.props.form.getFieldsValue();
const commissionAlg = []; const commissionAlg = [];
const data = { const data = {
id: this.props.product.id id: this.props.product.id
}; };
Object.keys(formData).forEach(key=>{ Object.keys(formData).forEach(key=> {
if(/^[\d]+$/g.test(key)){ if (/^[\d]+$/g.test(key)) {
commissionAlg.push(formData[key]); commissionAlg.push(formData[key]);
}else{ } else {
data[key] = formData[key]; data[key] = formData[key];
} }
}); });
...@@ -96,75 +96,84 @@ export default class ShouyiYongjingForm extends Component { ...@@ -96,75 +96,84 @@ export default class ShouyiYongjingForm extends Component {
console.log(data); console.log(data);
this.props.dispatch({ this.props.dispatch({
type:'UPDATE_PRODUCT_ITEM', type: 'UPDATE_PRODUCT_ITEM',
item: data item: data
}); });
} }
render() { render() {
const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 14},
};
const {form:{getFieldProps}, product} = this.props; const {form:{getFieldProps}, product, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item label="佣金结算方式" help="例如: 打款结佣、成立结佣" {...formItemLayout} wrapperCol={{span:6}}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="佣金结算方式" {...getFieldProps('settlement', { <Form.Item label="佣金结算方式" help="例如: 打款结佣、成立结佣" {...smallFormItemLayout}>
initialValue:product.settlement <Input placeholder="佣金结算方式"
})} /> {...getFieldProps('settlement', {
</Form.Item> initialValue: product.settlement
<Form.Item label="产品的预期收益" {...formItemLayout} wrapperCol={{span:6}}> })}
<Input placeholder="产品的预期收益" {...getFieldProps('productProspectiveReturn', { />
initialValue:product.productProspectiveReturn </Form.Item>
})} /> <Form.Item label="产品的预期收益" help="浮动或百分比" {...smallFormItemLayout}>
</Form.Item> <Input placeholder="产品的预期收益"
<Form.Item label="佣金算法" {...formItemLayout}> {...getFieldProps('productProspectiveReturn', {
<Input.Group> initialValue: product.productProspectiveReturn
<Col span="5" className="tac">最小投资额</Col> })}
<Col span="5" className="tac">最大投资额</Col> />
<Col span="5" className="tac">收益</Col> </Form.Item>
<Col span="5" className="tac">佣金</Col> <Form.Item label="佣金算法" {...formItemLayout}>
</Input.Group> <Input.Group>
{ <Col span="5" className="tac">最小投资额</Col>
this.state.yongjing.map((item, index)=> <Col span="5" className="tac">最大投资额</Col>
<div key={item.key}> <Col span="5" className="tac">收益</Col>
<Input.Group> <Col span="5" className="tac">佣金</Col>
<Col span="5"> </Input.Group>
<Input {...getFieldProps(index + '.min', {initialValue: item.min})} /> {
</Col> this.state.yongjing.map((item, index)=>
<Col span="5"> <div key={item.key}>
<Input {...getFieldProps(index+ '.max', {initialValue: item.max})}/> <Input.Group>
</Col> <Col span="5">
<Col span="5"> <Input {...getFieldProps(index + '.min', {initialValue: item.min})} />
<Input {...getFieldProps(index+'.sy', {initialValue: item.sy})}/> </Col>
</Col> <Col span="5">
<Col span="5"> <Input {...getFieldProps(index + '.max', {initialValue: item.max})}/>
<Input {...getFieldProps(index+'.yj', {initialValue: item.yj})}/> </Col>
</Col> <Col span="5">
<Col span="4"> <Input {...getFieldProps(index + '.sy', {initialValue: item.sy})}/>
<Icon type="cross" onClick={this.handleRemoveYongjin.bind(this, index)}/> </Col>
</Col> <Col span="5">
</Input.Group> <Input {...getFieldProps(index + '.yj', {initialValue: item.yj})}/>
</div> </Col>
) <Col span="4">
} <Icon type="cross" onClick={this.handleRemoveYongjin.bind(this, index)}/>
<Row style={{marginTop:15}}> </Col>
<Col span="20" className="tac"> </Input.Group>
<Button style={{marginRight:'.5em'}} </div>
onClick={this.handleAddYongjing.bind(this)}><Icon )
type="plus"/>添加</Button> }
</Col> <Row style={{marginTop:15}}>
</Row> <Col span="20" className="tac">
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Col>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> </Row>
</Form.Item> </Form.Item>
</Form> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button style={{marginRight:'1em'}}
onClick={this.handleAddYongjing.bind(this)}><Icon
type="plus"/>添加</Button>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
......
...@@ -17,46 +17,59 @@ import { ...@@ -17,46 +17,59 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin
} from 'antd'; } from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({ @connect(state=>({
loading: state.announcement.loading, loading: state.announcement.loading,
})) }))
@Form.create() @Form.create()
export default class AddItem extends Component{ export default class AddItem extends Component {
constructor(props, content) { constructor(props, content) {
super(props, content); super(props, content);
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
data.itemId = this.props.location.query.itemId; data.itemId = this.props.location.query.itemId;
console.log(data); console.log(data);
this.props.dispatch({ this.props.dispatch({
type:'CREATE_ANNOUNCEMENT_ITEM', type: 'CREATE_ANNOUNCEMENT_ITEM',
data data
}); });
} }
render = ()=> { render = ()=> {
const {loading, form:{getFieldProps}} = this.props; const {loading, form:{getFieldProps}, location:{query}} = this.props;
const formItemLayout = {
labelCol: {span: 4}, const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '添加公告']}
wrapperCol: {span: 14}, title={(query.title ? query.title + ' - ' : '') + '添加公告'}/>);
}; return (
return( <Layout header={header}>
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item label="标题" {...formItemLayout}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="公告标题" {...getFieldProps('title')} /> <Form.Item label="标题" {...formItemLayout}>
</Form.Item> <Input placeholder="公告标题" {...getFieldProps('title')} />
<Form.Item label="内容" {...formItemLayout}> </Form.Item>
<Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement')} /> <Form.Item label="内容" {...formItemLayout}>
</Form.Item> <Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement')} />
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Form.Item>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>创建</Button> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>创建</Button>
</Form> <Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Spin>
</Layout>
); );
} }
} }
...@@ -17,8 +17,14 @@ import { ...@@ -17,8 +17,14 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin
} from 'antd'; } from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({ @connect(state=>({
loading: state.announcement.loading, loading: state.announcement.loading,
announcement: state.announcement.item, announcement: state.announcement.item,
...@@ -30,10 +36,8 @@ export default class EditItem extends Component { ...@@ -30,10 +36,8 @@ export default class EditItem extends Component {
} }
componentWillMount() { componentDidMount() {
if (!(this.props.announcement && this.props.announcement.id)) { this.fetchItem(this.props.params.id);
this.fetchItem(this.props.params.id);
}
}; };
fetchItem(id) { fetchItem(id) {
...@@ -46,28 +50,50 @@ export default class EditItem extends Component { ...@@ -46,28 +50,50 @@ export default class EditItem extends Component {
handleSubmit(e) { handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
data.id = this.props.announcement.id;
console.log(data); console.log(data);
this.props.dispatch({
type: 'UPDATE_ANNOUNCEMENT_ITEM',
data
});
} }
render() { render() {
const {announcement, loading, form:{getFieldProps}} = this.props; const {announcement, loading, form:{getFieldProps}, location:{query}} = this.props;
const formItemLayout = {
labelCol: {span: 4}, const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '修改公告']}
wrapperCol: {span: 14}, title={(query && query.title ? query.title + ' - ' : '') + '修改公告'}/>);
};
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Layout header={header}>
<Form.Item label="标题" {...formItemLayout}> <Spin spinning={loading}>
<Input placeholder="公告标题" {...getFieldProps('title', {initialValue: announcement.title})} /> {
</Form.Item> announcement &&
<Form.Item label="内容" {...formItemLayout}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement', {initialValue: announcement.announcement})} /> <Form.Item label="标题" {...formItemLayout}>
</Form.Item> <Input placeholder="公告标题"
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> {...getFieldProps('title', {
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button> initialValue: announcement.title
</Form.Item> })} />
</Form> </Form.Item>
<Form.Item label="内容" {...formItemLayout}>
<Input placeholder="公告内容" autosize={{ minRows: 5 }} type="textarea"
{...getFieldProps('announcement', {
initialValue: announcement.announcement
})} />
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon
type="save"/>修改</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
}
</Spin>
</Layout>
); );
} }
} }
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon, Button} from 'antd'; import {Table, Icon, Button, Switch, Form} from 'antd';
import {serialize, formatDateTime, productStatusToString} from '../../utils'; import {serialize, formatDateTime, productStatusToString, footerFormSubmitLayout} from '../../utils';
import {Link} from 'react-router'; import {Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 60
}, {
title: '标题',
dataIndex: 'title',
key: 'title',
}, {
title: '创建时间',
dataIndex: 'dateCreated',
key: 'dateCreated',
width: 150,
className: 'tac',
render: (dateCreated, record)=>(
<span>
{dateCreated && formatDateTime(dateCreated)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{status?'有效':'无效'}</span>)
}, {
title: '操作',
key: 'operation',
width: 120,
className: 'tac',
render: (text, record)=>(
<span>
<a href={'/product/item?id='+ record.id}></a>
</span>
)
}
];
@connect(state=>({ @connect(state=>({
items: state.announcement.items, items: state.announcement.items,
loading: state.announcement.loading, loading: state.announcement.loading,
...@@ -58,7 +19,7 @@ export default class List extends Component { ...@@ -58,7 +19,7 @@ export default class List extends Component {
} }
componentWillMount() { componentDidMount() {
this.fetchList(this.props.location.query); this.fetchList(this.props.location.query);
}; };
...@@ -74,13 +35,10 @@ export default class List extends Component { ...@@ -74,13 +35,10 @@ export default class List extends Component {
} }
render() { render() {
const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props; const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const pagination = { const pagination = {
total: total, total: total,
pageSize: parseInt(query.s, 10) || 10, pageSize: parseInt(query.s, 10) || 10,
...@@ -101,17 +59,79 @@ export default class List extends Component { ...@@ -101,17 +59,79 @@ export default class List extends Component {
} }
}; };
return <div> const columns = [
<h1>公告列表</h1> {
<Link to={'/announcement/create?itemId='+ query.itemId}><Button><Icon type="plus"/>添加</Button></Link> title: 'ID',
<Table className="ant-table" columns={columns} dataIndex: 'id',
dataSource={Array.isArray(items)?items:[]} key: 'id',
loading={loading} width: 60
pagination={pagination} }, {
scroll={{ y: window.innerHeight-290 }} title: '标题',
onRowClick={this.handleRowClick.bind(this)} dataIndex: 'title',
/> key: 'title',
</div>; }, {
title: '内容',
dataIndex: 'announcement',
key: 'announcement'
}, {
title: '创建时间',
dataIndex: 'dateCreated',
key: 'dateCreated',
width: 150,
className: 'tac',
render: (dateCreated, record)=>(
<span>
{dateCreated && formatDateTime(dateCreated)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (text, record)=>(
<span onClick={e=>{e.stopPropagation(); e.preventDefault();}}>
<Switch checkedChildren="开" unCheckedChildren="关" defaultChecked={record.status}
onChange={checked=>{
this.props.dispatch({
type:'UPDATE_ANNOUNCEMENT_ITEM',
data:{
id: record.id,
status: checked ? 1: 0
}
})
}}
/>
</span>
)
}
];
const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '公告列表']}
title={(query.title ? query.title + ' - ' : '') + '公告列表'}/>);
return (
<Layout header={header}>
<Form horizontal>
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]}
loading={loading}
pagination={pagination}
onRowClick={this.handleRowClick.bind(this)}
/>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Link to={'/announcement/create?itemId='+ query.itemId + '&title='+ query.title}>
<Button size="large"><Icon type="plus"/>添加</Button>
</Link>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Layout>
);
} }
} }
......
import React, { Component, PropTypes } from 'react'; import React, {Component, PropTypes} from 'react';
import { Router, Route, IndexRoute, Link } from 'react-router'; import {Router, Route, IndexRoute, Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import {Collapse, Menu, Icon} from 'antd';
import { Collapse } from 'antd';
const Panel = Collapse.Panel; const Panel = Collapse.Panel;
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
export default class App extends Component { export default class App extends Component {
...@@ -19,37 +19,99 @@ export default class App extends Component { ...@@ -19,37 +19,99 @@ export default class App extends Component {
store: PropTypes.object.isRequired store: PropTypes.object.isRequired
}; };
render(){ render() {
const styles = require('./App.less'); const styles = require('./App.less');
const mainMenu = [
{
title: '产品管理',
items: [
{
to: '/products',
cn: '产品列表',
en: 'Products'
}, {
to: '/products/create',
cn: '添加产品',
en: 'Add Products'
}
]
}, {
title: '订单管理',
items: [
{
to: '/trades',
cn: '订单列表',
en: 'Trades'
}
]
}, {
title: '审核管理',
items: [
{
to: '/remittance/audits',
cn: '报单审核',
en: 'Remittance Audits'
}
]
}
];
const logo = require('./images/logo.png');
return ( return (
<div className={styles.normal}> <div className={styles.normal}>
<div className={styles.head}> <div className={styles.head}>
<h1>枢纽科技</h1> <img className="page-logo" src={'/'+logo} title="枢纽科技" alt="枢纽科技"/>
</div> </div>
<div className={styles.content}> <div className={styles.content}>
<div className={styles.side}> <div className={styles.side}>
<Collapse accordion> <Menu mode="inline" defaultOpenKeys={['sub1']}>
<Panel header="产品管理"> <SubMenu key="sub1" title={<span><Icon type="mail" /><span>业务管理</span></span>}>
<Link to="/products">产品列表</Link><br/> {
<Link to="/products/create">增加产品</Link> mainMenu.map((menu, mi)=>
</Panel> <MenuItemGroup title={menu.title} key={mi}>
<Panel header="订单管理"> {
<Link to="/trades">订单列表</Link><br/> menu.items.map((item, ii)=>
</Panel> <Menu.Item key={[mi,ii].join('-')}>
</Collapse> <MenuItemContent {...item}/>
</Menu.Item>
)
}
</MenuItemGroup>
)
}
</SubMenu>
</Menu>
</div> </div>
<div className={styles.main}> <div className={styles.main}>
{this.props.children} {this.props.children}
</div> </div>
</div> </div>
<div className={styles.foot}> <div className={styles.foot}>
Built with react, react-router, redux, redux-saga, ant-tool, css-modules, antd... 杭州枢纽科技有限公司 荣誉出品 <a href="mailto:bainx@vip.qq.com">问题反馈</a>
</div> </div>
</div> </div>
); );
} }
} }
class MenuItemContent extends Component {
static propType = {
to: PropTypes.string,
cn: PropTypes.string,
en: PropTypes.string,
}
render() {
const {to, cn, en} = this.props;
return (
<Link to={to}>
<span>
<span className="cn">{cn}</span>
<span className="en">{en}</span>
</span>
</Link>
);
}
}
......
...@@ -6,40 +6,144 @@ ...@@ -6,40 +6,144 @@
} }
.head { .head {
background: #364171; background: #fff;
height: 80px; height: 75px;
padding: 8px; padding: 8px;
color: #fff; color: #364171;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #e0e0e0;
:global {
.page-logo {
margin: 20px 0 0 30px;
}
}
} }
.content { .content {
flex: 1; flex: 1;
display: flex; display: flex;
background-color: #e9ecf3;
padding: 20px 30px 0;
} }
.side { .side {
padding: 8px; /**/
width: 20%; width: 250px;
min-width: 200px; //min-width: 250px;
max-width: 250px; //max-width: 300px;
background: #fafafa; background: #fff;
border-right: 1px solid #ccc; border-right: 1px solid #e9e9e9;
margin-right: 0px; margin-right: 0px;
padding: 30px 0 0;
border-radius: 5px 0 0 5px;
:global {
.ant-menu-inline,
.ant-menu-vertical {
border-right: 0;
}
}
} }
.main { .main {
padding: 8px; display: flex;
flex-direction: column;
height: 100%;
padding: 10px 20px;
flex: 1 0 auto; flex: 1 0 auto;
overflow: auto; overflow: hidden;
background: #fff;
border-radius: 0 5px 5px 0;
h1 {
font-size: 24px;
color: #404040;
font-weight: 400;
line-height: 40px;
margin-bottom: 24px;
margin-top: 8px;
font-family: lato, Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
}
h2 {
font-size: 22px;
color: #505050;
font-weight: 400;
line-height: 36px;
}
h3 {
font-size: 18px;
color: #606060;
font-weight: 400;
line-height: 30px;
}
//& > section {
// display: flex;
// flex-direction: column;
// height: 100%;
// overflow: auto;
// & > header {
// h1 {
// line-height: 30px;
// margin: 0;
// }
// :global {
// .ant-breadcrumb {
// & > span {
// line-height: 42px;
// }
// }
// }
// }
// & > * {
// &:nth-child(2){
// flex: 1;
// overflow: auto;
// display: flex;
// flex-direction: column;
// :global{
// .content{
// flex:1;
// }
// }
//
// }
// }
//}
:global {
.tac {
text-align: center !important;
}
.main-header {
border-bottom: 1px solid #eaeaea;
margin-bottom: 20px;
h1 {
margin-bottom: 10px;
}
}
}
} }
.foot { .foot {
background: #fafafa; //background: #fafafa;
border-top: 1px solid #ccc; //border-top: 1px solid #e0e0e0;
padding: 8px; padding: 8px;
font-size: 12px;
text-align: center;
a {
margin-left: .5em;
opacity: .8;
}
} }
:global(.tac){ :global {
text-align: center !important; .img-priview-dialog {
.ant-modal-content {
background-color: transparent;
img {
margin: auto;
display: block;
}
}
}
} }
...@@ -18,16 +18,18 @@ import { ...@@ -18,16 +18,18 @@ import {
DatePicker, DatePicker,
Table, Table,
Spin, Spin,
Breadcrumb
} from 'antd'; } from 'antd';
import HuikuanInfoForm from '../../components/HuikuanInfoForm/HuikuanInfoForm'; import HuikuanInfoForm from '../../components/ProductForm/HuikuanInfoForm';
import ProductBaseInfoForm from '../../components/ProductBaseInfoForm/ProductBaseInfoForm'; import BaseInfoForm from '../../components/ProductForm/BaseInfoForm';
import ShouyiYongjingForm from '../../components/ShouyiYongjingForm/ShouyiYongjingForm'; import ShouyiYongjingForm from '../../components/ProductForm/ShouyiYongjingForm';
import ProductElementForm from '../../components/ProductElementForm/ProductElementForm'; import ElementForm from '../../components/ProductForm/ElementForm';
import ProductDateTimeForm from '../../components/ProductDateTimeForm/ProductDateTimeForm'; import DateTimeStatusForm from '../../components/ProductForm/DateTimeStatusForm';
import ProductDocumentsForm from '../../components/ProductDocumentsForm/ProductDocumentsForm'; import DocumentsForm from '../../components/ProductForm/DocumentsForm';
import ProductContactForm from '../../components/ProductContactForm/ProductContactForm'; import ContactForm from '../../components/ProductForm/ContactForm';
import MainHeader from '../../components/MainHeader';
import Layout from '../../components/Layout/Layout';
class PublishForm extends Component { class PublishForm extends Component {
constructor(props, content) { constructor(props, content) {
...@@ -51,7 +53,7 @@ class PublishForm extends Component { ...@@ -51,7 +53,7 @@ class PublishForm extends Component {
return ( return (
<div style={{textAlign:'center'}}> <div style={{textAlign:'center'}}>
<h1>请确认产品各项信息已经填写完整!</h1> <h1>请确认产品各项信息已经填写完整!</h1>
<Button type="primary" loading={this.props.loading} onClick={this.handlePublish.bind(this)} > <Button type="primary" loading={this.props.loading} onClick={this.handlePublish.bind(this)}>
<Icon type="solution"/>发布 <Icon type="solution"/>发布
</Button> </Button>
</div> </div>
...@@ -85,15 +87,15 @@ export default class AddItem extends Component { ...@@ -85,15 +87,15 @@ export default class AddItem extends Component {
componentWillMount() { componentWillMount() {
const {product, cates} = this.props; const {cates} = this.props;
if (!cates || !cates.length) { if (!cates || !cates.length) {
this.fetchCates(); this.fetchCates();
} }
if (!product || !product.id) {
this.props.dispatch({ this.props.dispatch({
type: 'CREATE_PRODUCT_ITEM' type: 'CREATE_PRODUCT_ITEM'
}); });
}
}; };
fetchCates() { fetchCates() {
...@@ -111,7 +113,7 @@ export default class AddItem extends Component { ...@@ -111,7 +113,7 @@ export default class AddItem extends Component {
const tabs = [{ const tabs = [{
tab: '基本信息', tab: '基本信息',
children: ProductBaseInfoForm children: BaseInfoForm
}, { }, {
tab: '收益佣金', tab: '收益佣金',
children: ShouyiYongjingForm children: ShouyiYongjingForm
...@@ -120,37 +122,37 @@ export default class AddItem extends Component { ...@@ -120,37 +122,37 @@ export default class AddItem extends Component {
children: HuikuanInfoForm children: HuikuanInfoForm
}, { }, {
tab: '基本要素', tab: '基本要素',
children: ProductElementForm children: ElementForm
}, { }, {
tab: '时间', tab: '时间',
children: ProductDateTimeForm children: DateTimeStatusForm
}, { }, {
tab: '相关附件', tab: '相关附件',
children: ProductDocumentsForm children: DocumentsForm
}, { }, {
tab: '服务经理', tab: '服务经理',
children: ProductContactForm children: ContactForm
}, { }, {
tab: '发布', tab: '发布',
children: PublishForm children: PublishForm
}].map((tabPane, index)=> { }].map((tabPane, index)=> {
tabPane.key = 'tabs-pane-' + (index + 1); tabPane.key = 'tabs-pane-' + (index + 1);
tabPane.disabled = index != this.state.step - 1; //tabPane.disabled = index != this.state.step - 1;
return tabPane; return tabPane;
}); });
const header = <MainHeader breadcrumb={['产品管理', '添加产品']} title="添加产品"/>;
return ( return (
<div className={styles.normal}> <Layout header={header}>
<Tabs ref="tabs" className={styles.tabs} tabPosition="left" > <Tabs className={styles.tabs} tabPosition="left">
{ tabs.map(tp=> { tabs.map(tp=>
<Tabs.TabPane tab={tp.tab} key={tp.key} > <Tabs.TabPane tab={tp.tab} key={tp.key}>
{product && <tp.children {...this.props} /> } {product && <tp.children {...this.props} /> }
</Tabs.TabPane> </Tabs.TabPane>
)} )}
</Tabs> </Tabs>
</div> </Layout>
); );
} }
} }
......
...@@ -17,17 +17,19 @@ import { ...@@ -17,17 +17,19 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin Spin,
Breadcrumb
} from 'antd'; } from 'antd';
import HuikuanInfoForm from '../../components/HuikuanInfoForm/HuikuanInfoForm'; import HuikuanInfoForm from '../../components/ProductForm/HuikuanInfoForm';
import ProductBaseInfoForm from '../../components/ProductBaseInfoForm/ProductBaseInfoForm'; import BaseInfoForm from '../../components/ProductForm/BaseInfoForm';
import ShouyiYongjingForm from '../../components/ShouyiYongjingForm/ShouyiYongjingForm'; import ShouyiYongjingForm from '../../components/ProductForm/ShouyiYongjingForm';
import ProductElementForm from '../../components/ProductElementForm/ProductElementForm'; import ElementForm from '../../components/ProductForm/ElementForm';
import ProductDateTimeForm from '../../components/ProductDateTimeForm/ProductDateTimeForm'; import DateTimeStatusForm from '../../components/ProductForm/DateTimeStatusForm';
import ProductDocumentsForm from '../../components/ProductDocumentsForm/ProductDocumentsForm'; import DocumentsForm from '../../components/ProductForm/DocumentsForm';
import ProductContactForm from '../../components/ProductContactForm/ProductContactForm'; import ContactForm from '../../components/ProductForm/ContactForm';
import MainHeader from '../../components/MainHeader';
import Layout from '../../components/Layout/Layout';
@connect(state=>({ @connect(state=>({
cates: state.product.cates, cates: state.product.cates,
...@@ -53,9 +55,7 @@ export default class EditItem extends Component { ...@@ -53,9 +55,7 @@ export default class EditItem extends Component {
if (!this.props.cates.length) { if (!this.props.cates.length) {
this.fetchCates(); this.fetchCates();
} }
if (!(this.props.product && this.props.product.id)) { this.fetchItem(this.props.params.id);
this.fetchItem(this.props.params.id);
}
}; };
fetchCates() { fetchCates() {
...@@ -73,35 +73,52 @@ export default class EditItem extends Component { ...@@ -73,35 +73,52 @@ export default class EditItem extends Component {
render = ()=> { render = ()=> {
const {product} = this.props; const {product} = this.props;
const styles = require('./Product.less');
const tabs = [{
tab: '基本信息',
children: BaseInfoForm
}, {
tab: '收益佣金',
children: ShouyiYongjingForm
}, {
tab: '汇款账号',
children: HuikuanInfoForm
}, {
tab: '基本要素',
children: ElementForm
}, {
tab: '时间状态',
children: DateTimeStatusForm
}, {
tab: '相关附件',
children: DocumentsForm
}, {
tab: '服务经理',
children: ContactForm
}].map((tabPane, index)=> {
tabPane.key = 'tabs-pane-' + (index + 1);
return tabPane;
});
const header = (<MainHeader breadcrumb={['产品管理', '产品详情']}
title={(product && product.itemShortTitle ? product.itemShortTitle + ' - ' : '') + '产品详情'}/>);
return ( return (
<Spin spinning={this.props.loading}> <Layout header={header}>
<Tabs tabPosition="top"> <Tabs className={styles.tabs} tabPosition="left">
<Tabs.TabPane tab="基本信息" key="tab-pane-1"> { tabs.map(tp=>
{ product && <ProductBaseInfoForm {...this.props}/> } <Tabs.TabPane tab={tp.tab} key={tp.key}>
</Tabs.TabPane> {product && <tp.children {...this.props} /> }
<Tabs.TabPane tab="收益与佣金" key="tab-pane-2"> </Tabs.TabPane>
{ product && <ShouyiYongjingForm {...this.props}/> } )}
</Tabs.TabPane>
<Tabs.TabPane tab="汇款账号" key="tab-pane-4">
{ product && <HuikuanInfoForm {...this.props}/> }
</Tabs.TabPane>
<Tabs.TabPane tab="基本要素" key="tab-pane-5">
{ product && <ProductElementForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="时间状态" key="tab-pane-6">
{ product && <ProductDateTimeForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="相关附件" key="tab-pane-7">
{ product && <ProductDocumentsForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="服务经理" key="tab-pane-8">
{ product && <ProductContactForm {...this.props} /> }
</Tabs.TabPane>
</Tabs> </Tabs>
</Spin> </Layout>
); );
} }
} }
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {Link} from 'react-router';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
@connect(state=>({
item: state.product.item,
loading: state.product.loading
}))
export default class Item extends Component {
componentWillMount() {
this.fetchItem(this.props.params.id);
};
fetchItem(id) {
this.props.dispatch({
type: 'FETCH_PRODUCT_ITEM',
id
});
};
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
render() {
const tw = 6;
const vw = 18;
const styles = require('../Trade/Item.less');
const {item, loading} = this.props;
return (
<Spin spinning={loading}>
{
item &&
<div className={styles.trade}>
<div className={styles.tradeTable}>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品短标题</Col>
<Col span={vw}>{item.itemShortTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
</div>
<p>
<Button onClick={this.handleGoBack.bind(this)}>返回</Button>
<Link to={'/products/'+ item.id+'/edit'}><Button>编辑</Button></Link>
<Link to={'/announcement?itemId='+item.id}><Button>公告</Button></Link>
<Link
to={'/trades/create/'+ item.id+'?title='+ item.itemShortTitle}><Button>报单</Button></Link>
</p>
</div>
}
</Spin>
);
}
}
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon} from 'antd'; import {Table, Icon, Breadcrumb, Row, Col, Pagination} from 'antd';
import {serialize, formatDateTime, productStatusToString} from '../../utils'; import {
serialize,
formatDateTime,
productStatusToString,
productEnableCreateTrade
} from '../../utils';
import {Link} from 'react-router'; import {Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
const columns = [ const columns = [
{ {
...@@ -16,32 +24,32 @@ const columns = [ ...@@ -16,32 +24,32 @@ const columns = [
dataIndex: 'cateId', dataIndex: 'cateId',
key: 'cateId', key: 'cateId',
width: 80, width: 80,
className:'tac', className: 'tac',
render: (cateId, record)=>(<span data-cate-id={cateId}>{record.cateName}</span>) render: (cateId, record)=>(<span data-cate-id={cateId}>{record.cateName}</span>)
}, { }, {
title: '标题', title: '标题',
dataIndex: 'shortTitle', dataIndex: 'shortTitle',
key: 'shortTitle', key: 'shortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>) render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 15)}</span>)
}, { }, {
title: '募集比率', title: '募集比率',
dataIndex: 'rate', dataIndex: 'rate',
key: 'rate', key: 'rate',
width:120, width: 120,
className:'tac', className: 'tac',
}, { }, {
title: '状态', title: '状态',
dataIndex: 'status', dataIndex: 'status',
key: 'status', key: 'status',
width:120, width: 80,
className:'tac', className: 'tac',
render: (status, record)=>(<span data-status={status}>{productStatusToString(status)}</span>) render: (status, record)=>(<span data-status={status}>{productStatusToString(status)}</span>)
}, { }, {
title: '创建时间', title: '创建时间',
dataIndex: 'dateCreated', dataIndex: 'dateCreated',
key: 'dateCreated', key: 'dateCreated',
width:150, width: 150,
className:'tac', className: 'tac',
render: (dateCreated, record)=>( render: (dateCreated, record)=>(
<span> <span>
{dateCreated && formatDateTime(dateCreated)} {dateCreated && formatDateTime(dateCreated)}
...@@ -50,15 +58,21 @@ const columns = [ ...@@ -50,15 +58,21 @@ const columns = [
}, { }, {
title: '操作', title: '操作',
key: 'operation', key: 'operation',
width:120, width: 120,
className:'tac', className: 'tac',
render: (text, record)=>( render: (text, product)=>(
<span> <span>
<a href={'/product/item?id='+ record.id}>详情</a> <Link to={'/announcement?itemId='+product.id+'&title='+product.shortTitle}
<span className="ant-divider"></span> onClick={e=>e.stopPropagation()}>公告</Link>
<Link to={'/announcement?itemId='+record.id} onClick={e=>e.stopPropagation()}>公告</Link> {
<span className="ant-divider"></span> productEnableCreateTrade(product.status) &&
<Link to={'/trades/add/'+record.id+'?title='+record.shortTitle}>报单</Link> <span>
<span className="ant-divider"></span>
<Link to={'/trades/create?itemId='+product.id+'&title='+product.shortTitle}
onClick={e=>e.stopPropagation()}>报单</Link>
</span>
}
</span> </span>
) )
} }
...@@ -76,7 +90,7 @@ export default class List extends Component { ...@@ -76,7 +90,7 @@ export default class List extends Component {
} }
componentWillMount() { componentDidMount() {
this.fetchList(this.props.location.query); this.fetchList(this.props.location.query);
}; };
...@@ -87,8 +101,8 @@ export default class List extends Component { ...@@ -87,8 +101,8 @@ export default class List extends Component {
}); });
}; };
handleRowClick({id}){ handleRowClick({id}) {
this.props.history.push('/products/'+id+'/edit'); this.props.history.push('/products/' + id);
} }
...@@ -117,16 +131,20 @@ export default class List extends Component { ...@@ -117,16 +131,20 @@ export default class List extends Component {
} }
}; };
return <div> const header = (<MainHeader breadcrumb={['产品管理', '产品列表']}
<h1>产品列表</h1> title="产品列表"/>);
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]} return (
loading={loading} <Layout header={header}>
pagination={pagination} <Table className="ant-table" columns={columns}
scroll={{ y: window.innerHeight-290 }} dataSource={Array.isArray(items)?items:[]}
onRowClick={this.handleRowClick.bind(this)} loading={loading}
/> pagination={pagination}
</div>; scroll={{ y: window.innerHeight-380 }}
onRowClick={this.handleRowClick.bind(this)}
/>
</Layout>
);
} }
} }
......
.normal {
.tabs {
flex: 1;
display: flex; display: flex;
flex-direction: column;
height: 100%; height: 100%;
.tabs { &:global(.ant-tabs-top) {
flex: 1; flex-direction: column;
display: flex;
:global { :global {
.tablist { .ant-tabs-content {
display: flex;
& > div {
flex: 1;
}
} }
.ant-tabs-content{ }
flex: 1; }
:global {
.tablist {
}
.ant-tabs-content {
flex: 1;
height: 100%;
.ant-tabs-tabpane {
height: 100%;
overflow: auto;
} }
} }
} }
......
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({
loading: state.remittance.loading,
audit: state.remittance.audit,
}))
@Form.create()
export default class EditItem extends Component {
constructor() {
super(...arguments);
}
componentDidMount() {
this.fetchItem(this.props.params.id);
};
fetchItem(id) {
this.props.dispatch({
type: 'FETCH_AUDIT_ITEM',
id
});
};
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
data.id = this.props.audit.id;
console.log(data);
// this.props.dispatch({
// type: 'UPDATE_AUDIT_ITEM',
// data
// });
}
render() {
const {audit, loading, form:{getFieldProps}, location:{query}} = this.props;
const header = (<MainHeader breadcrumb={['审核管理', '报单审核','审核详情']}
title={(audit && audit.title ? audit.title + ' - ' : '') + '审核详情'}/>);
return (
<Layout header={header}>
<Spin spinning={loading}>
{
audit &&
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="产品募集情况" {...formItemLayout}>
<Input placeholder="公告标题"
{...getFieldProps('title', {
initialValue: audit.title
})} />
</Form.Item>
<Form.Item label="内容" {...formItemLayout}>
<Input placeholder="公告内容" autosize={{ minRows: 5 }} type="textarea"
{...getFieldProps('announcement', {
initialValue: audit.announcement
})} />
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon
type="save"/>修改</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
}
</Spin>
</Layout>
);
}
}
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {Table, Icon} from 'antd';
import {Link} from 'react-router';
import {serialize, formatDateTime, tradeStatusToString} from '../../../utils';
import Layout from '../../../components/Layout/Layout';
import MainHeader from '../../../components/MainHeader';
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 70
}, {
title: '产品',
dataIndex: 'itemShortTitle',
key: 'itemShortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>)
}, {
title: '投资人',
dataIndex: 'buyerName',
key: 'buyerName',
width: 100,
className: 'tac',
}, {
title: '预约额度',
dataIndex: 'reservationAmount',
key: 'reservationAmount',
width: 80,
className: 'tac',
}, {
title: '报单时间',
dataIndex: 'submitReceiptTime',
key: 'submitReceiptTime',
width: 150,
className: 'tac',
render: (submitReceiptTime, record)=>(
<span>
{submitReceiptTime && formatDateTime(submitReceiptTime)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{tradeStatusToString(status)}</span>)
}, {
title: '操作',
key: 'operation',
width: 60,
// fixed:'right',
className: 'tac',
render: (text, record)=>(
<span>
<Link to={'/trades/contract/'+ record.id} onClick={e=>e.stopPropagation()}>审核</Link>
</span>
)
}
];
@connect(state=>({
items: state.remittance.audits,
loading: state.remittance.loading,
total: state.remittance.total,
}))
export default class List extends Component {
constructor(props, context) {
super(props, context);
}
componentDidMount() {
this.fetchList(this.props.location.query);
};
fetchList(query) {
this.props.dispatch({
type: 'FETCH_AUDIT_LIST',
query
});
}
handleRowClick({id}) {
this.props.history.push('/remittance/audits/' + id);
}
render() {
const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const pagination = {
total: total,
pageSize: parseInt(query.s, 10) || 10,
current: parseInt(query.p, 10) || 1,
showSizeChanger: true,
onShowSizeChange: (current, pageSize)=> {
console.log('Current: ', current, '; PageSize: ', pageSize);
query.p = current;
query.s = pageSize;
replace(pathname + '?' + serialize(query));
this.fetchList(query);
},
onChange: (current) => {
console.log('Current: ', current);
query.p = current;
replace(pathname + '?' + serialize(query));
this.fetchList(query);
}
};
const header = (<MainHeader breadcrumb={['审核管理', '报单审核']}
title="审核列表"/>);
return (
<Layout header={header}>
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]}
loading={loading}
pagination={pagination}
scroll={{ y: window.innerHeight-380 }}
onRowClick={this.handleRowClick.bind(this)}
/>
</Layout>
);
}
}
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Form, Input, Button, Checkbox, message, Tabs, DatePicker, Upload, Icon, Modal} from 'antd'; import {
Form,
Input,
Button,
Checkbox,
message,
Tabs,
DatePicker,
Upload,
Icon,
Modal,
Breadcrumb,
Row,
Col,
Spin
} from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
@connect(state=>({
loading: state.trade.loading,
user: state.user,
item: state.trade.item
}))
@Form.create() @Form.create()
export default class AddItem extends Component { export default class AddItem extends Component {
...@@ -11,110 +41,162 @@ export default class AddItem extends Component { ...@@ -11,110 +41,162 @@ export default class AddItem extends Component {
this.state = { this.state = {
priviewVisible: false, priviewVisible: false,
priviewImage: '', priviewImage: '',
identityCardList: [],
bankCardList: [],
receiptList: [],
signaturePages: []
}; };
} }
handleCancel() { componentWillReceiveProps(nextProps) {
this.setState({ const {item} = nextProps;
priviewVisible: false, if (item && item.id) {
this.props.history.push('/trades/' + item.id);
this.props.dispatch({
type: 'INIT_TRADE'
});
}
}
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
data.itemId = this.props.location.query.itemId;
console.log(data);
if (data.remittance.remittanceTime) {
data.remittance.remittanceTime = formatDateTime(data.remittance.remittanceTime);
}
this.props.dispatch({
type: 'CREATE_TRADE_ITEM',
data,
push: this.props.history.push,
}); });
} }
render() { render() {
const formItemLayout = {
labelCol: {span: 6},
wrapperCol: {span: 14},
};
const props = {
action: '/upload.do',
listType: 'picture-card',
defaultFileList: [{
uid: -1,
name: 'xxx.png',
status: 'done',
url: 'https://os.alipayobjects.com/rmsportal/NDbkJhpzmLxtPhB.png',
thumbUrl: 'https://os.alipayobjects.com/rmsportal/NDbkJhpzmLxtPhB.png',
}],
onPreview: (file) => {
this.setState({
priviewImage: file.url,
priviewVisible: true,
});
},
};
return (
<div>
<Form horizontal>
<Form.Item {...formItemLayout} label="产品"> const {loading, form:{getFieldProps}, location:{query}, user} = this.props;
<Input value={this.props.location.query.title} readOnly/>
<Input type="hidden"/> const header = (<MainHeader breadcrumb={['订单管理', '创建订单']}
</Form.Item> title={(query.title ? query.title + ' - ' : '') + '报单'}/>);
<Form.Item {...formItemLayout} label="理财师手机号">
<Input /> return (
</Form.Item> <Layout header={header}>
<Form.Item {...formItemLayout} label="投资人姓名"> <Spin spinning={loading}>
<Input /> <Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{height:'100%'}}>
</Form.Item> <Form.Item {...smallFormItemLayout} label="理财师手机号" help="请准确核对理财师手机号码">
<Form.Item {...formItemLayout} label="投资人身份证号码"> <Input {...getFieldProps('user.mobile')} />
<Input /> </Form.Item>
</Form.Item> <Form.Item {...smallFormItemLayout} label="投资人姓名" help="请如实填写投资人姓名">
<Form.Item {...formItemLayout} label="投资人身份证正反面照片"> <Input {...getFieldProps('buyer.name')} />
<Upload {...props}> </Form.Item>
<Icon type="plus"/> <Form.Item {...smallFormItemLayout} label="投资人身份证号码" help="请如实填写投资人18位身份证号码">
<div className="ant-upload-text">上传照片</div> <Input placeholder="" {...getFieldProps('buyer.identityCardNumber')} />
</Upload> </Form.Item>
<Modal visible={this.state.priviewVisible} footer={null} <Form.Item {...formItemLayout} label="投资人身份证正反面照片">
onCancel={this.handleCancel.bind(this)}> <Upload action="/api/fileUpload/upload" listType="picture-card"
<img alt="example" src={this.state.priviewImage}/> multiple={true}
</Modal> headers={{
</Form.Item> authorization: user && user.token,
<Form.Item {...formItemLayout} label="投资人实际打款金额"> }}
<Input /> onChange={info=>this.setState({identityCardList: handleUpload(info, 2)})}
</Form.Item> onPreview={file => {
<Form.Item {...formItemLayout} label="投资人实际打款时间"> this.setState({
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择时间"/> priviewImage: file.url,
</Form.Item> priviewVisible: true
<Form.Item {...formItemLayout} label="投资人银行卡开户行"> });
<Input /> }}
</Form.Item> fileList={this.state.identityCardList}>
<Form.Item {...formItemLayout} label="投资人银行卡照片"> <Icon type="upload"/>
<Upload {...props}> <div className="ant-upload-text">上传照片</div>
<Icon type="plus"/> </Upload>
<div className="ant-upload-text">上传照片</div> </Form.Item>
</Upload> <Form.Item {...smallFormItemLayout} label="投资人实际打款金额" help="请如实填写投资人实际打款金额">
<Modal visible={this.state.priviewVisible} footer={null} <Input placeholder="520万" {...getFieldProps('remittance.remittanceAmount')} />
onCancel={this.handleCancel.bind(this)}> </Form.Item>
<img alt="example" src={this.state.priviewImage}/> <Form.Item {...formItemLayout} label="投资人实际打款时间">
</Modal> <DatePicker showTime
</Form.Item> format="yyyy-MM-dd HH:mm:ss"
<Form.Item {...formItemLayout} label="投资人打款凭条照片"> placeholder="请选择时间"
<Upload {...props}> {...getFieldProps('remittance.remittanceTime')}
<Icon type="plus"/> />
<div className="ant-upload-text">上传照片</div> </Form.Item>
</Upload> <Form.Item {...formItemLayout} label="投资人银行卡开户行">
<Modal visible={this.state.priviewVisible} footer={null} <Input placeholder="中国工商银行杭州文一西路支行" {...getFieldProps('remittance.bankBranch')} />
onCancel={this.handleCancel.bind(this)}> </Form.Item>
<img alt="example" src={this.state.priviewImage}/> <Form.Item {...formItemLayout} label="投资人银行卡照片">
</Modal> <Upload action="/api/fileUpload/upload" listType="picture-card"
</Form.Item> headers={{
<Form.Item {...formItemLayout} className="clearfix" label="投资人合同签字页照片"> authorization: user && user.token,
<Upload {...props}> }}
<Icon type="plus"/> onChange={info=>this.setState({bankCardList: handleUpload(info, 1)})}
<div className="ant-upload-text">上传照片</div> onPreview={file => {
</Upload> this.setState({
<Modal visible={this.state.priviewVisible} footer={null} priviewImage: file.url,
onCancel={this.handleCancel.bind(this)}> priviewVisible: true
<img alt="example" src={this.state.priviewImage}/> });
}}
fileList={this.state.bankCardList}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...formItemLayout} label="投资人打款凭条照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true}
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({receiptList: handleUpload(info)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.receiptList}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...formItemLayout} className="clearfix" label="投资人合同签字页照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true}
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({signaturePages: handleUpload(info)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.signaturePages}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>创建订单</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
<Modal footer={null}
width="100vw"
visible={this.state.priviewVisible}
className="img-priview-dialog"
style={{height:'100vh', background:'transparent'}}
onCancel={()=>this.setState({ priviewVisible: false })}>
<img src={this.state.priviewImage} style={{maxWidth:'100%'}}/>
</Modal> </Modal>
</Form.Item> </Form>
<Form.Item wrapperCol={{ span: 14, offset: 6 }}> </Spin>
<Button type="primary" style={{marginRight:'1em'}}>提交</Button> </Layout>
<Button onClick={(e)=>{e.preventDefault(); this.props.history.goBack();}}>返回</Button>
</Form.Item>
</Form>
</div>
); );
} }
} }
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Form, Input, Button, Checkbox, message, Row, Col} from 'antd'; import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
@connect(state=>({ @connect(state=>({
item: state.trade.item item: state.trade.item,
loading: state.trade.loading
})) }))
@Form.create()
export default class Commission extends Component { export default class Commission extends Component {
componentWillMount() { componentWillMount() {
...@@ -16,45 +46,81 @@ export default class Commission extends Component { ...@@ -16,45 +46,81 @@ export default class Commission extends Component {
}); });
}; };
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
handleCommission(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
alert('二次确认后发放'); alert('ok');
this.props.dispatch({
type: 'SETTLEMENT_TRADE_ITEM',
id: this.props.item.id
})
} }
render() { render() {
const {item} = this.props;
const styles = require('./Item.less'); const {item, loading, form:{getFieldProps}, location:{query}} = this.props;
const tw = 8;
const vw = 16; const header = (<MainHeader breadcrumb={['订单管理', '订单详情', '佣金发放']}
title={(item && item.shortTitle + ' - ' || '') + '佣金发放'}/>);
return ( return (
<div className={styles.trade}> <Layout header={header}>
<h1 className="tac">佣金发放</h1> <Spin spinning={loading}>
<div className={styles.tradeTable}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="产品" {...smallFormItemLayout}>
<Col span={tw}>产品</Col> <p>{item && item.title}</p>
<Col span={vw}>{item.title}</Col> </Form.Item>
</Row>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="确认打款金额" {...smallFormItemLayout}>
<Col span={tw}>确认打款金额</Col> <Input placeholder="确认打款金额"
<Col span={vw}>{item.remittanceAmount}</Col> readOnly
</Row> {...getFieldProps('remittanceAmount', {
initialValue: item && item.remittanceAmount
<Row type="flex" justify="space-around" align="middle"> })} />
<Col span={tw}>实际佣金</Col> </Form.Item>
<Col span={vw}>{item.realReturn && item.realReturn.yj}</Col> <Form.Item label="实际佣金" {...smallFormItemLayout}>
</Row> <Input placeholder="实际佣金"
</div> readOnly
<p> {...getFieldProps('realReturn', {
<Button onClick={this.handleGoBack.bind(this)}>返回</Button> initialValue: item && item.realReturn && item.realReturn.yj
<Button onClick={this.handleCommission.bind(this)}>发放</Button> })} />
</p> </Form.Item>
</div> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>发放</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Spin>
</Layout>
); );
} }
} }
// <div className={styles.trade}>
// <div className={styles.tradeTable}>
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>产品</Col>
// <Col span={vw}>{item.title}</Col>
// </Row>
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>确认打款金额</Col>
// <Col span={vw}>{item.remittanceAmount}</Col>
// </Row>
//
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>实际佣金</Col>
// <Col span={vw}>{item.realReturn && item.realReturn.yj}</Col>
// </Row>
// </div>
// <p>
// <Button onClick={this.handleGoBack.bind(this)}>返回</Button>
// {
// (item.status == 11 || item.status == 21) &&
// <Button onClick={this.handleCommission.bind(this)}>发放</Button>
// }
// </p>
// </div>
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Form, Input, Button, Checkbox, message, Row, Col} from 'antd'; import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
@connect(state=>({ @connect(state=>({
item: state.trade.item loading: state.contract.loading,
trade: state.contract.trade,
shipping: state.contract.shipping
})) }))
@Form.create()
export default class Contract extends Component { export default class Contract extends Component {
componentWillMount() { componentDidMount() {
const {dispatch, params:{id}} = this.props; const {dispatch, params:{id}} = this.props;
dispatch({ dispatch({
type: 'FETCH_TRADE_ITEM', type: 'FETCH_CONTRACT_ITEM',
id id
}); });
}; };
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
alert('实现保存物流订单号的流程'); const data = this.props.form.getFieldsValue();
data.id = this.props.trade.id;
console.log(data);
this.props.dispatch({
type: 'UPDATE_CONTRACT_ITEM',
data
});
} }
render() { render() {
const {item} = this.props;
const styles = require('./Item.less'); const {trade, shipping, loading, form:{getFieldProps}, location:{query}} = this.props;
const tw = 8;
const vw = 16; const header = (<MainHeader breadcrumb={['订单管理', '订单详情', '合同物流']}
title="合同物流详情"/>);
return ( return (
<div className={styles.trade}> <Layout header={header} >
<h1 className="tac">合同物流</h1> <Spin spinning={loading}>
<div className={styles.tradeTable}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="产品" {...smallFormItemLayout}>
<Col span={tw}>产品</Col> <p>{trade && trade.itemTitle}</p>
<Col span={vw}>{item.title}</Col> </Form.Item>
</Row> <Form.Item label="顺丰运单" {...smallFormItemLayout}>
<Row type="flex" justify="space-around" align="middle"> <Input placeholder="请填写顺丰运单编号"
<Col span={tw}>确认打款金额</Col> {...getFieldProps('expressNO', {
<Col span={vw}>{item.remittanceAmount}</Col> initialValue: shipping && shipping.expressNO
</Row> })} />
<Row type="flex" justify="space-around" align="middle"> </Form.Item>
<Col span={tw}>实际佣金</Col> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Col span={vw}>{item.realReturn && item.realReturn.yj}</Col> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Row> <Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
<Row type="flex" justify="space-around" align="middle"> style={{marginLeft:'1em'}}>
<Col span={tw} className="isRequire">顺丰运单</Col> <Icon type="rollback"/>返回
<Col span={vw}><Input placeholder="请填写顺丰运单编号" /></Col> </Button>
</Row> </Form.Item>
</div> </Form>
<p> </Spin>
<Button onClick={this.handleGoBack.bind(this)}>返回</Button> </Layout>
<Button onClick={this.handleSubmit.bind(this)}>保存</Button>
</p>
</div>
); );
} }
} }
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {
Form,
Input,
Button,
Checkbox,
message,
Tabs,
DatePicker,
Upload,
Icon,
Modal,
Breadcrumb,
Row,
Col,
Spin
} from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout
} from '../../utils';
@connect(state=>({
loading: state.trade.loading,
user: state.user,
item: state.trade.item
}))
@Form.create()
export default class EditItem extends Component {
constructor() {
super(...arguments);
this.state = {
priviewVisible: false,
priviewImage: '',
identityCardList: [],
bankCardList: [],
receiptList: [],
signaturePages: []
};
}
componentDidMount() {
const {dispatch, params:{id}} = this.props;
dispatch({
type: 'FETCH_TRADE_ITEM',
id
});
};
componentWillReceiveProps(nextProps) {
console.log(nextProps);
}
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
data.itemId = this.props.location.query.itemId;
console.log(data);
if (data.remittance.remittanceTime) {
data.remittance.remittanceTime = formatDateTime(data.remittance.remittanceTime);
}
// this.props.dispatch({
// type: 'CREATE_TRADE_ITEM',
// data,
// push: this.props.history.push,
// });
}
render() {
const {item, loading, form:{getFieldProps}, location:{query}, user} = this.props;
const header = (<MainHeader breadcrumb={['订单管理', '订单详情']}
title={((item && item.title) ? item.title + ' - ' : '') + '订单详情'}/>);
return (
<Layout header={header}>
<Spin spinning={loading}>
{
item &&
<Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{height:'100%'}}>
<Form.Item {...smallFormItemLayout} label="理财师手机号" help="请准确核对理财师手机号码">
<Input {...getFieldProps('user.mobile', {
initialValue: ''
})} />
</Form.Item>
<Form.Item {...smallFormItemLayout} label="投资人姓名" help="请如实填写投资人姓名">
<Input {...getFieldProps('buyer.name', {
initialValue: item.buyerName
})} />
</Form.Item>
<Form.Item {...smallFormItemLayout} label="投资人身份证号码" help="请如实填写投资人18位身份证号码">
<Input placeholder="" {...getFieldProps('buyer.identityCardNumber', {
initialValue: item.buyerIdentityCardNumber
})} />
</Form.Item>
<Form.Item {...formItemLayout} label="投资人身份证照片" help="投资人身份证正反面照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true}
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({identityCardList: handleUpload(info, 2)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.identityCardList}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...smallFormItemLayout} label="投资人实际打款金额" help="请如实填写投资人实际打款金额">
<Input placeholder="520万" {...getFieldProps('remittance.remittanceAmount')} />
</Form.Item>
<Form.Item {...formItemLayout} label="投资人实际打款时间">
<DatePicker showTime
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择时间"
{...getFieldProps('remittance.remittanceTime')}
/>
</Form.Item>
<Form.Item {...formItemLayout} label="投资人银行卡开户行">
<Input placeholder="中国工商银行杭州文一西路支行" {...getFieldProps('remittance.bankBranch')} />
</Form.Item>
<Form.Item {...formItemLayout} label="投资人银行卡照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({bankCardList: handleUpload(info, 1)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.bankCardList}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...formItemLayout} label="投资人打款凭条照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true}
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({receiptList: handleUpload(info)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.receiptList}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...formItemLayout} className="clearfix" label="投资人合同签字页照片">
<Upload action="/api/fileUpload/upload" listType="picture-card"
multiple={true}
headers={{
authorization: user && user.token,
}}
onChange={info=>this.setState({signaturePages: handleUpload(info)})}
onPreview={file => {
this.setState({
priviewImage: file.url,
priviewVisible: true
});
}}
fileList={this.state.signaturePages}>
<Icon type="upload"/>
<div className="ant-upload-text">上传照片</div>
</Upload>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon
type="save"/>修改</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
<Modal footer={null}
width="100vw"
visible={this.state.priviewVisible}
className="img-priview-dialog"
style={{height:'100vh', background:'transparent'}}
onCancel={()=>this.setState({ priviewVisible: false })}>
<img src={this.state.priviewImage} style={{maxWidth:'100%'}}/>
</Modal>
</Form>
}
</Spin>
</Layout>
);
}
}
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Link} from 'react-router'; import {Link} from 'react-router';
import {Form, Input, Button, Checkbox, message, Row, Col} from 'antd'; import {Form, Input, Button, Checkbox, message, Row, Col, Spin, Icon} from 'antd';
import { import {
formatDateTime, formatDateTime,
tradeStatusToString, tradeStatusToString,
tradeCreateTypeToString tradeCreateTypeToString
} from '../../utils'; } from '../../utils';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
@connect(state=>({ @connect(state=>({
loading: state.trade.loading,
item: state.trade.item item: state.trade.item
})) }))
export default class Item extends Component { export default class Item extends Component {
componentWillMount() { componentDidMount() {
const {dispatch, params:{id}} = this.props; const {dispatch, params:{id}} = this.props;
dispatch({ dispatch({
type: 'FETCH_TRADE_ITEM', type: 'FETCH_TRADE_ITEM',
...@@ -21,106 +25,124 @@ export default class Item extends Component { ...@@ -21,106 +25,124 @@ export default class Item extends Component {
}); });
}; };
handleGoBack(e){ handleGoBack(e) {
e.preventDefault(); e.preventDefault();
this.props.history.goBack(); this.props.history.goBack();
}; };
render() { render() {
const {item} = this.props; const {item, loading} = this.props;
const styles = require('./Item.less'); const styles = require('./Item.less');
const tw = 8; const tw = 8;
const vw = 16; const vw = 16;
const header = (<MainHeader breadcrumb={['订单管理', '订单详情']}
title={((item && item.title) ? item.title + ' - ' : '') + '订单详情'}/>);
return ( return (
<div className={styles.trade}> <Layout header={header}>
<div className={styles.tradeTable}> {
item ?
<Row type="flex" justify="space-around" align="middle"> <div className={styles.trade}>
<Col span={tw}>产品</Col> <div className={styles.tradeTable}>
<Col span={vw}>{item.title}</Col> <Row type="flex" justify="space-around" align="middle">
</Row> <Col span={tw}>产品</Col>
<Row type="flex" justify="space-around" align="middle"> <Col span={vw}>{item.title}</Col>
<Col span={tw}>募集开始时间</Col> </Row>
<Col span={vw}>{formatDateTime(item.fundRaisedStartTime)}</Col> <Row type="flex" justify="space-around" align="middle">
</Row> <Col span={tw}>募集开始时间</Col>
<Row type="flex" justify="space-around" align="middle"> <Col
<Col span={tw}>募集结束时间</Col> span={vw}>{item.fundRaisedStartTime && formatDateTime(item.fundRaisedStartTime)}</Col>
<Col span={vw}>{formatDateTime(item.fundRaisedEndTime)}</Col> </Row>
</Row> <Row type="flex" justify="space-around" align="middle">
<Row type="flex" justify="space-around" align="middle"> <Col span={tw}>募集结束时间</Col>
<Col span={tw}>状态</Col> <Col
<Col span={vw}>{tradeStatusToString(item.status)}</Col> span={vw}>{item.fundRaisedEndTime && formatDateTime(item.fundRaisedEndTime)}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>创建类型</Col> <Col span={tw}>状态</Col>
<Col span={vw}>{tradeCreateTypeToString(item.type)}</Col> <Col span={vw}>{tradeStatusToString(item.status)}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>预约时间</Col> <Col span={tw}>创建类型</Col>
<Col span={vw}>{formatDateTime(item.reservationTime)}</Col> <Col span={vw}>{tradeCreateTypeToString(item.type)}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>预约金额</Col> <Col span={tw}>预约时间</Col>
<Col span={vw}>{item.reservationAmount}</Col> <Col span={vw}>{formatDateTime(item.reservationTime)}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>预期回报</Col> <Col span={tw}>预约金额</Col>
<Col span={vw}> <Col span={vw}>{item.reservationAmount}</Col>
{ </Row>
item.prospectiveReturn && item.prospectiveReturn.sy && <Row type="flex" justify="space-around" align="middle">
<span>{'收益 ' + item.prospectiveReturn.sy}</span> <Col span={tw}>预期回报</Col>
} <Col span={vw}>
{ {
item.prospectiveReturn && item.prospectiveReturn.yj && item.prospectiveReturn && item.prospectiveReturn.sy &&
<span>{'佣金 ' + item.prospectiveReturn.yj}</span> <span>{'收益 ' + item.prospectiveReturn.sy}</span>
} }
</Col> {
</Row> item.prospectiveReturn && item.prospectiveReturn.yj &&
<Row type="flex" justify="space-around" align="middle"> <span>{'佣金 ' + item.prospectiveReturn.yj}</span>
<Col span={tw}>报单时间</Col> }
<Col span={vw}>{formatDateTime(item.submitReceiptTime)}</Col> </Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>打款审核时间</Col> <Col span={tw}>报单时间</Col>
<Col span={vw}>{formatDateTime(item.remittanceAuditTime)}</Col> <Col
</Row> span={vw}>{item.submitReceiptTime && formatDateTime(item.submitReceiptTime)}</Col>
<Row type="flex" justify="space-around" align="middle"> </Row>
<Col span={tw}>确认打款金额</Col> <Row type="flex" justify="space-around" align="middle">
<Col span={vw}>{item.remittanceAmount}</Col> <Col span={tw}>打款审核时间</Col>
</Row> <Col
span={vw}>{item.remittanceAuditTime && formatDateTime(item.remittanceAuditTime)}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>确认打款金额</Col>
<Col span={vw}>{item.remittanceAmount}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>实际回报</Col> <Col span={tw}>实际回报</Col>
<Col span={vw}> <Col span={vw}>
{ {
item.realReturn && item.realReturn.sy && item.realReturn && item.realReturn.sy &&
<span>{'收益 ' + item.realReturn.sy}</span> <span>{'收益 ' + item.realReturn.sy}</span>
} }
{ {
item.realReturn && item.realReturn.yj && item.realReturn && item.realReturn.yj &&
<span>{'佣金 ' + item.realReturn.yj}</span> <span>{'佣金 ' + item.realReturn.yj}</span>
} }
</Col> </Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>买家名字</Col> <Col span={tw}>买家名字</Col>
<Col span={vw}>{item.buyerName}</Col> <Col span={vw}>{item.buyerName}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>买家身份证</Col> <Col span={tw}>买家身份证</Col>
<Col span={vw}>{item.buyerIdentityCardNumber}</Col> <Col span={vw}>{item.buyerIdentityCardNumber}</Col>
</Row> </Row>
<Row type="flex" justify="space-around" align="middle"> <Row type="flex" justify="space-around" align="middle">
<Col span={tw}>创建时间</Col> <Col span={tw}>创建时间</Col>
<Col span={vw}>{formatDateTime(item.dateCreated)}</Col> <Col span={vw}>{item.dateCreated && formatDateTime(item.dateCreated)}</Col>
</Row> </Row>
</div> </div>
<p> <p>
<Button onClick={this.handleGoBack.bind(this)}>返回</Button> {
<Link to={'/trades/commission/'+ item.id}><Button>发放佣金</Button></Link> (item.status == 11 || item.status == 21) &&
<Link to={'/trades/contract/'+ item.id}><Button>邮寄合同</Button></Link> <Link to={'/trades/commission/'+ item.id}><Button>发放佣金</Button></Link>
</p> }
</div> <Link to={'/trades/contract/'+ item.id}><Button>邮寄合同</Button></Link>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</p>
</div>
:
<Spin loading={loading}/>
}
</Layout>
); );
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
} }
.tradeTable { .tradeTable {
border-top: 1px solid #e9e9e9; //border-top: 1px solid #e9e9e9;
border-bottom: 1px solid #e9e9e9; border-bottom: 1px solid #e9e9e9;
//max-width: 800px; //max-width: 800px;
//margin: auto; //margin: auto;
......
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon} from 'antd'; import {Table, Icon, Breadcrumb, Row, Col} from 'antd';
import { Link } from 'react-router'; import {Link} from 'react-router';
import {serialize, formatDateTime, tradeStatusToString} from '../../utils'; import {serialize, formatDateTime, tradeStatusToString} from '../../utils';
import Layout from '../../components/Layout/Layout';
const columns = [ const columns = [
{ {
title: '订单ID', title: '订单ID',
dataIndex: 'id', dataIndex: 'id',
key: 'id', key: 'id',
width:80, width: 70,
// fixed:'left' // fixed:'left'
}, { }, {
title: '产品', title: '产品',
dataIndex: 'shortTitle', dataIndex: 'shortTitle',
key: 'shortTitle', key: 'shortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>) render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 15)}</span>)
}, { }, {
title: '预约时间', title: '预约时间',
dataIndex: 'reservationTime', dataIndex: 'reservationTime',
key: 'reservationTime', key: 'reservationTime',
width:130, width: 150,
className:'tac', className: 'tac',
render: (reservationTime, record)=>( render: (reservationTime, record)=>(
<span> <span>
{reservationTime && formatDateTime(reservationTime)} {reservationTime && formatDateTime(reservationTime)}
...@@ -33,38 +33,44 @@ const columns = [ ...@@ -33,38 +33,44 @@ const columns = [
title: '投资人', title: '投资人',
dataIndex: 'buyerName', dataIndex: 'buyerName',
key: 'buyerName', key: 'buyerName',
width:100, width: 80,
className:'tac', className: 'tac',
}, { }, {
title: '预约额度', title: '预约额度',
dataIndex: 'reservationAmount', dataIndex: 'reservationAmount',
key: 'reservationAmount', key: 'reservationAmount',
width:100, width: 100,
className:'tac', className: 'tac',
}, { }, {
title: '实际打款', title: '实际打款',
dataIndex: 'remittanceAmount', dataIndex: 'remittanceAmount',
key: 'remittanceAmount', key: 'remittanceAmount',
width:100, width: 100,
className:'tac', className: 'tac',
}, { }, {
title: '进度', title: '进度',
dataIndex: 'status', dataIndex: 'status',
key: 'status', key: 'status',
width:150, width: 160,
className:'tac', className: 'tac',
render: (status, record)=>(<span data-status={status}>{tradeStatusToString(status)}</span>) render: (status, record)=>(<span data-status={status}>{tradeStatusToString(status)}</span>)
}, { }, {
title: '操作', title: '操作',
key: 'operation', key: 'operation',
width:140, width: 140,
// fixed:'right', // fixed:'right',
className:'tac', className: 'tac',
render: (text, record)=>( render: (text, record)=>(
<span> <span>
<Link to={'/trades/contract/'+ record.id} onClick={e=>e.stopPropagation()}>合同</Link> <Link to={'/trades/contract/'+ record.id} onClick={e=>e.stopPropagation()}>合同</Link>
<span className="ant-divider"></span> {
<Link to={'/trades/commission/'+ record.id} onClick={e=>e.stopPropagation()}>佣金</Link> (record.status == 11 || record.status == 21) &&
<span>
<span className="ant-divider"></span>
<Link to={'/trades/commission/'+ record.id} onClick={e=>e.stopPropagation()}>佣金</Link>
</span>
}
</span> </span>
) )
} }
...@@ -86,20 +92,20 @@ export default class List extends Component { ...@@ -86,20 +92,20 @@ export default class List extends Component {
this.fetchList(this.props.location.query); this.fetchList(this.props.location.query);
}; };
fetchList(query){ fetchList(query) {
this.props.dispatch({ this.props.dispatch({
type: 'FETCH_TRADE_LIST', type: 'FETCH_TRADE_LIST',
query query
}); });
} }
handleRowClick({id}){ handleRowClick({id}) {
this.props.history.push('/trades/'+id); this.props.history.push('/trades/' + id);
} }
render() { render() {
const { total, items, loading, history:{replace}, location:{pathname, query}} = this.props; const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const pagination = { const pagination = {
total: total, total: total,
...@@ -121,13 +127,36 @@ export default class List extends Component { ...@@ -121,13 +127,36 @@ export default class List extends Component {
} }
}; };
return <Table className="ant-table" columns={columns} const breadcrumb = ['订单管理', '订单列表'];
dataSource={Array.isArray(items)?items:[]}
loading={loading} const header = (
pagination={pagination} <div className="main-header">
scroll={{ y: window.innerHeight-245 }} <Row>
onRowClick={this.handleRowClick.bind(this)} <Col span="8">
/>; <Breadcrumb>
{ breadcrumb.map((b, i)=><Breadcrumb.Item key={i}>{b}</Breadcrumb.Item>) }
</Breadcrumb>
</Col>
</Row>
<Row>
<Col span="20">
<h1 className="tac">订单列表</h1>
</Col>
</Row>
</div>
);
return (
<Layout header={header}>
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]}
loading={loading}
pagination={pagination}
scroll={{ y: window.innerHeight-380 }}
onRowClick={this.handleRowClick.bind(this)}
/>
</Layout>
);
} }
} }
......
export Home from './Home/Home';
export NotFound from './NotFound/NotFound';
export Login from './Login/Login';
export App from './App/App';
export ProductList from './Product/List';
export ProductAddItem from './Product/AddItem';
export ProductEditItem from './Product/EditItem';
export TradeList from './Trade/List';
export TradeItem from './Trade/Item';
export Commission from './Trade/Commission';
export Contract from './Trade/Contract';
export TradeAddItem from './Trade/AddItem';
export AnnouncementList from './Announcement/List';
export AnnouncementEditItem from './Announcement/EditItem';
export AnnouncementAddItem from './Announcement/AddItem';
export RemittanceAuditList from './Remittance/Audit/List';
...@@ -3,8 +3,48 @@ ...@@ -3,8 +3,48 @@
html, body, #root { html, body, #root {
height: 100%; height: 100%;
font-size: 14px; font-size: 14px;
background-color: #e9ecf3;
} }
.ant-table{ label,
.ant-form-item {
font-size: 14px !important; font-size: 14px !important;
.ant-form-explain {
font-size: 12px;
}
} }
.ant-btn {
font-weight: 400 !important;
}
.ant-table {
font-size: 14px !important;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
& > div {
&:first-child {
flex: 1
}
}
}
.ant-menu-vertical,
.ant-menu-inline,
.ant-menu-item-group-list {
& > .ant-menu-item,
& > .ant-menu-submenu > .ant-menu-submenu-title {
.cn {
font-size: 14px;
}
.en {
font-size: 10px;
margin-left: .5em;
opacity: .45;
font-style: italic;
font-weight: 300;
}
}
}
} }
...@@ -29,6 +29,15 @@ const announcement = handleActions({ ...@@ -29,6 +29,15 @@ const announcement = handleActions({
['CREATE_ANNOUNCEMENT_ITEM_FAILED'](state, action){ ['CREATE_ANNOUNCEMENT_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false} return {...state, err: action.err, loading: false}
}, },
['UPDATE_ANNOUNCEMENT_ITEM'](state){
return {...state, loading: true}
},
['UPDATE_ANNOUNCEMENT_ITEM_SUCCESS'](state, action){
return {...state, loading: false, item: action.item}
},
['UPDATE_ANNOUNCEMENT_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false}
},
}, { }, {
items: [], items: [],
loading: false, loading: false,
......
import {handleActions} from 'redux-actions';
import {combineReducer} from 'redux';
const contract = handleActions({
['FETCH_CONTRACT_ITEM'](state){
return {...state, loading: true}
},
['FETCH_CONTRACT_ITEM_SUCCESS'](state, action){
return {...state, loading: false, trade:action.trade, shipping:action.shipping}
},
['FETCH_CONTRACT_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false}
},
['UPDATE_CONTRACT_ITEM'](state){
return {...state, loading: true}
},
['UPDATE_CONTRACT_ITEM_SUCCESS'](state, action){
return {...state, loading: false, shipping:action.shipping}
},
['UPDATE_CONTRACT_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false}
}
}, {
loading: false,
});
export default contract;
import {handleActions} from 'redux-actions';
import {combineReducer} from 'redux';
const audit = handleActions({
['FETCH_AUDIT_LIST'](state) {
return {...state, loading: true,};
},
['FETCH_AUDIT_LIST_SUCCESS'](state, action) {
return {...state, loading: false, audits: action.items, total: action.total};
},
['FETCH_AUDIT_LIST_FAILED'](state, action) {
return {...state, err: action.err, loading: false};
},
['FETCH_AUDIT_ITEM'](state) {
return {...state, loading: true,};
},
['FETCH_AUDIT_ITEM_SUCCESS'](state, action) {
return {...state, loading: false, audit: action.item};
},
['FETCH_AUDIT_ITEM_FAILED'](state, action) {
return {...state, err: action.err, loading: false};
},
}, {
audits: [],
loading: false,
});
export default audit;
import {handleActions} from 'redux-actions'; import {handleActions} from 'redux-actions';
import {combineReducer} from 'redux'; import {combineReducer} from 'redux';
const initState = {
items: [],
loading: false,
};
const trade = handleActions({ const trade = handleActions({
['INIT_TRADE'](){
return {...initState};
},
['FETCH_TRADE_LIST'](state) { ['FETCH_TRADE_LIST'](state) {
return {...state, loading: true,}; return {...state, loading: true,};
}, },
...@@ -19,11 +27,25 @@ const trade = handleActions({ ...@@ -19,11 +27,25 @@ const trade = handleActions({
}, },
['FETCH_TRADE_ITEM_FAILED'](state, action){ ['FETCH_TRADE_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false} return {...state, err: action.err, loading: false}
},
['CREATE_TRADE_ITEM'](state){
return {...state, loading: true}
},
['CREATE_TRADE_ITEM_SUCCESS'](state, action){
return {...state, loading: false, item: action.item, createSuccess: true}
},
['CREATE_TRADE_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false}
},
['SETTLEMENT_TRADE_ITEM'](state){
return {...state, loading: true};
},
['SETTLEMENT_TRADE_ITEM_SUCCESS'](state, action){
return {...state, loading: false,};
},
['SETTLEMENT_TRADE_ITEM_FAILED'](state, action){
return {...state, err: action.err, loading: false};
} }
}, { }, initState);
item: {},
items: [],
loading: false,
});
export default trade; export default trade;
import React, {PropTypes, Component} from 'react'; import React, {PropTypes, Component} from 'react';
import {Route, IndexRoute, Link} from 'react-router'; import {Route, IndexRoute, Link} from 'react-router';
import Home from '../containers/Home/Home'; import {
import NotFound from '../containers/NotFound/NotFound'; Home,
import Login from '../containers/Login/Login'; NotFound,
import App from '../containers/App/App'; Login,
import ProductList from '../containers/Product/List'; App,
import ProductAddItem from '../containers/Product/AddItem'; ProductList,
import ProductEditItem from '../containers/Product/EditItem'; ProductAddItem,
import ProductItem from '../containers/Product/Item'; ProductEditItem,
import TradeList from '../containers/Trade/List'; TradeList,
import TradeItem from '../containers/Trade/Item'; TradeItem,
import Commission from '../containers/Trade/Commission'; Commission,
import Contract from '../containers/Trade/Contract'; Contract,
import TradeAddItem from '../containers/Trade/AddItem'; TradeAddItem,
import AnnouncementList from '../containers/Announcement/List'; AnnouncementList,
import AnnouncementEditItem from '../containers/Announcement/EditItem'; AnnouncementEditItem,
import AnnouncementAddItem from '../containers/Announcement/AddItem'; AnnouncementAddItem,
RemittanceAuditList ,
} from '../containers/index';
export default (store)=> { export default (store)=> {
const requireAuth = (nextState, replace, cb) => { const requireAuth = (nextState, replace, cb) => {
...@@ -30,28 +31,32 @@ export default (store)=> { ...@@ -30,28 +31,32 @@ export default (store)=> {
<Route path="/"> <Route path="/">
<Route onEnter={requireAuth} component={App}> <Route onEnter={requireAuth} component={App}>
<IndexRoute component={Home}/> <IndexRoute component={Home}/>
<Route path="products" > <Route path="products">
<IndexRoute component={ProductList} /> <IndexRoute component={ProductList}/>
<Route path="create" component={ProductAddItem} /> <Route path="create" component={ProductAddItem}/>
<Route path=":id" component={ProductItem} /> <Route path=":id" component={ProductEditItem}/>
<Route path=":id/edit" component={ProductEditItem} />
</Route> </Route>
<Route path="trades" > <Route path="trades">
<IndexRoute component={TradeList} /> <IndexRoute component={TradeList}/>
<Route path=":id" component={TradeItem} /> <Route path="create" component={TradeAddItem}/>
<Route path="commission/:id" component={Commission} /> <Route path=":id" component={TradeItem}/>
<Route path="contract/:id" component={Contract} /> <Route path="commission/:id" component={Commission}/>
<Route path="create/:pid" component={TradeAddItem} /> <Route path="contract/:id" component={Contract}/>
</Route> </Route>
<Route path="announcement"> <Route path="announcement">
<IndexRoute component={AnnouncementList} /> <IndexRoute component={AnnouncementList}/>
<Route path="create" component={AnnouncementAddItem} /> <Route path="create" component={AnnouncementAddItem}/>
<Route path=":id/edit" component={AnnouncementEditItem} /> <Route path=":id/edit" component={AnnouncementEditItem}/>
</Route>
<Route path="remittance">
<Route path="audits">
<IndexRoute component={RemittanceAuditList} />
</Route>
</Route> </Route>
<Route path="/actived" component={Home}/> <Route path="/actived" component={Home}/>
<Route path="/completed" component={Home}/> <Route path="/completed" component={Home}/>
</Route> </Route>
<Route path="/login" component={Login} /> <Route path="/login" component={Login}/>
<Route path="*" component={NotFound}/> <Route path="*" component={NotFound}/>
</Route> </Route>
); );
......
import {takeLatest} from 'redux-saga'; import {takeLatest} from 'redux-saga';
import {take, call, put, fork, cancel, select} from 'redux-saga/effects'; import {take, call, put, fork, cancel, select} from 'redux-saga/effects';
import {fetchList, fetchItem, createItem} from '../services/announcement'; import {fetchList, fetchItem, createItem, updateItem} from '../services/announcement';
import {message} from 'antd'; import {message} from 'antd';
function* getList(query) { function* getList(query) {
...@@ -56,9 +56,10 @@ function* watchItem() { ...@@ -56,9 +56,10 @@ function* watchItem() {
function* addItem(data) { function* addItem(data) {
try{ try{
const item = yield call(createItem, data); const item = yield call(createItem, data);
message.success('创建成功!');
yield put({ yield put({
type: 'CREATE_ANNOUNCEMENT_ITEM_SUCCESS', type: 'CREATE_ANNOUNCEMENT_ITEM_SUCCESS',
item item: {...item, ...data}
}); });
}catch(err){ }catch(err){
console.log(err); console.log(err);
...@@ -77,8 +78,33 @@ function* watchAdd() { ...@@ -77,8 +78,33 @@ function* watchAdd() {
} }
} }
function* editItem(data) {
try{
const item = yield call(updateItem, data);
yield put({
type: 'UPDATE_ANNOUNCEMENT_ITEM_SUCCESS',
item
});
}catch(err){
console.log(err);
message.error(err);
yield put({
type:'UPDATE_ANNOUNCEMENT_ITEM_FAILED',
err
});
}
}
function* watchEdit() {
while (true) {
const {data} = yield take('UPDATE_ANNOUNCEMENT_ITEM');
yield fork(editItem, data);
}
}
export default function*() { export default function*() {
yield fork(watchList); yield fork(watchList);
yield fork(watchItem); yield fork(watchItem);
yield fork(watchAdd); yield fork(watchAdd);
yield fork(watchEdit);
} }
import {takeLatest} from 'redux-saga';
import {take, call, put, fork, cancel, select} from 'redux-saga/effects';
import {fetchItem, updateItem} from '../services/contract';
import {message} from 'antd';
function* getItem(id) {
try {
const {trade, shipping} = yield call(fetchItem, id);
yield put({
type: 'FETCH_CONTRACT_ITEM_SUCCESS',
trade,
shipping
});
} catch (err) {
console.log(err);
message.error(err);
yield put({
type: 'FETCH_CONTRACT_ITEM_FAILED',
err,
});
}
}
function* watchItem() {
while (true) {
const {id} = yield take('FETCH_CONTRACT_ITEM');
yield fork(getItem, id);
}
}
function* editItem(data) {
try{
yield call(updateItem, data);
message.success('修改成功!');
yield put({
type: 'UPDATE_CONTRACT_ITEM_SUCCESS'
});
}catch(err){
console.log(err);
message.error(err);
yield put({
type:'UPDATE_CONTRACT_ITEM_FAILED',
err
});
}
}
function* watchEdit() {
while (true) {
const {data} = yield take('UPDATE_CONTRACT_ITEM');
yield fork(editItem, data);
}
}
export default function*() {
yield fork(watchItem);
yield fork(watchEdit);
}
import {takeLatest} from 'redux-saga';
import {take, call, put, fork, cancel, select} from 'redux-saga/effects';
import {fetchAuditList, fetchAuditItem} from '../services/remittance';
import {message} from 'antd';
function* getAuditList(query) {
try {
const {total, audits} = yield call(fetchAuditList, query);
yield put({
type: 'FETCH_AUDIT_LIST_SUCCESS',
total,
items: audits
});
} catch (err) {
console.log(err);
message.error(err);
yield put({
type: 'FETCH_AUDIT_LIST_FAILED',
err,
});
}
}
function* watchAuditList() {
while (true) {
const {query} = yield take('FETCH_AUDIT_LIST');
yield fork(getAuditList, query);
}
}
function* getAuditItem(id) {
try {
const item = yield call(fetchAuditItem, id);
yield put({
type: 'FETCH_AUDIT_ITEM_SUCCESS',
item
});
} catch (err) {
console.log(err);
message.error(err);
yield put({
type: 'FETCH_AUDIT_ITEM_FAILED',
err
});
}
}
function* watchAuditItem() {
while (true) {
const {id} = yield take('FETCH_AUDIT_ITEM');
yield fork(getAuditItem, id);
}
}
export default function*() {
yield fork(watchAuditList);
yield fork(watchAuditItem);
// yield fork(watchAdd);
// yield fork(watchEdit);
}
import {takeLatest} from 'redux-saga'; import {takeLatest} from 'redux-saga';
import {take, call, put, fork, cancel, select} from 'redux-saga/effects'; import {take, call, put, fork, cancel, select} from 'redux-saga/effects';
import {fetchList, fetchItem} from '../services/trade'; import {fetchList, fetchItem, createItem, settlementItem} from '../services/trade';
import {message} from 'antd'; import {message} from 'antd';
function* getList(query) { function* getList(query) {
try { try {
const {total, items} = yield call(fetchList, query); const {total, trades} = yield call(fetchList, query);
yield put({ yield put({
type: 'FETCH_TRADE_LIST_SUCCESS', type: 'FETCH_TRADE_LIST_SUCCESS',
total, total,
items items: trades
}); });
} catch (err) { } catch (err) {
console.log(err); console.log(err);
...@@ -52,9 +52,59 @@ function* watchTradeItem() { ...@@ -52,9 +52,59 @@ function* watchTradeItem() {
} }
} }
function* addItem(data) {
try {
const item = yield call(createItem, data);
message.success('创建成功!');
yield put({
type: 'CREATE_TRADE_ITEM_SUCCESS',
item
});
} catch (err) {
console.log(err);
message.error(err);
yield put({
type: 'CREATE_TRADE_ITEM_FAILED',
err,
});
}
}
function* watchAdd() {
while (true) {
const {data} = yield take('CREATE_TRADE_ITEM');
yield fork(addItem, data);
}
}
function* settlement(id) {
try {
yield call(settlementItem, id);
message.success('发放成功!');
yield put({
type: 'SETTLEMENT_TRADE_ITEM_SUCCESS'
});
} catch (err) {
console.log(err);
message.error(err);
yield put({
type: 'SETTLEMENT_TRADE_ITEM_FAILED',
err,
});
}
}
function* watchSettlement() {
while (true) {
const {id} = yield take('SETTLEMENT_TRADE_ITEM');
yield fork(settlement, id);
}
}
export default function*() { export default function*() {
yield fork(watchTradeList); yield fork(watchTradeList);
yield fork(watchTradeItem); yield fork(watchTradeItem);
yield fork(watchAdd);
yield fork(watchSettlement);
} }
...@@ -2,7 +2,9 @@ import xFetch from './xFetch'; ...@@ -2,7 +2,9 @@ import xFetch from './xFetch';
import {serialize} from '../utils'; import {serialize} from '../utils';
export async function fetchList(query) { export async function fetchList(query) {
return xFetch('/api/announcement' + '?' + serialize(query)); const data = {...query};
delete data.title;
return xFetch('/api/announcements' + '?' + serialize(data));
} }
export async function fetchItem(id) { export async function fetchItem(id) {
...@@ -10,8 +12,15 @@ export async function fetchItem(id) { ...@@ -10,8 +12,15 @@ export async function fetchItem(id) {
} }
export async function createItem(item) { export async function createItem(item) {
return xFetch('/api/announcement/save', { return xFetch('/api/announcements/save', {
method: 'POST', method: 'POST',
body: serialize(item) body: serialize(item)
}); });
} }
export async function updateItem(item) {
return xFetch('/api/announcements/'+item.id, {
method: 'PUT',
body: serialize(item)
});
}
import xFetch from './xFetch';
import {serialize} from '../utils';
export async function fetchItem(id) {
return xFetch('/api/contacts/' + id);
}
export async function updateItem(data) {
const id = data.id;
delete data.id;
return xFetch('/api/contacts/' + id, {
method:'PUT',
body: serialize(data)
});
}
...@@ -16,7 +16,6 @@ export async function fetchItem(id) { ...@@ -16,7 +16,6 @@ export async function fetchItem(id) {
} }
export async function updateItem(item){ export async function updateItem(item){
return xFetch('/api/products/'+ item.id, { return xFetch('/api/products/'+ item.id, {
method:'PUT', method:'PUT',
body: serialize(item) body: serialize(item)
......
import xFetch from './xFetch';
import {serialize} from '../utils';
export async function fetchAuditList(query) {
return xFetch('/api/remittance/audits' +'?' + serialize(query));
}
export async function fetchAuditItem(id) {
return xFetch('/api/remittance/audits/'+id);
}
// export async function fetchItem(id) {
// return xFetch('/api/trades/'+ id);
// }
//
// export async function createItem(data){
// return xFetch('/api/trades', {
// method:'POST',
// body: serialize(data)
// });
// }
//
// export async function settlementItem(id){
// return xFetch('/api/trade/commission/settlement/'+id);
// }
import xFetch from './xFetch'; import xFetch from './xFetch';
import {params} from '../utils'; import {serialize} from '../utils';
export async function fetchList(query) { export async function fetchList(query) {
return xFetch('/api/trades' +'?' + params(query)); return xFetch('/api/trades' +'?' + serialize(query));
} }
export async function fetchItem(id) { export async function fetchItem(id) {
return xFetch('/api/trades/'+ id); return xFetch('/api/trades/'+ id);
} }
export async function createItem(data){
return xFetch('/api/trades', {
method:'POST',
body: serialize(data)
});
}
export async function settlementItem(id){
return xFetch('/api/trade/commission/settlement/'+id);
}
...@@ -6,6 +6,7 @@ const errorMessages = (res) => `${res.status} ${res.statusText}`; ...@@ -6,6 +6,7 @@ const errorMessages = (res) => `${res.status} ${res.statusText}`;
function check401(res) { function check401(res) {
if (res.status === 401) { if (res.status === 401) {
location.href = '/login'; location.href = '/login';
//console.log('401');
} }
return res; return res;
} }
......
...@@ -5,17 +5,21 @@ ...@@ -5,17 +5,21 @@
export function serialize(obj, prefix) { export function serialize(obj, prefix) {
var str = []; var str = [];
for (var p in obj) { Object.keys(obj).map(p=> {
if (obj.hasOwnProperty(p)) { let v = obj[p];
var k = prefix ? prefix + "." + p : p, v = obj[p]; if (p && typeof v !== 'undefined') {
if (typeof v !== 'undefined') { let k = prefix ? prefix + "." + p : p;
str.push(typeof v == "object" ? if (typeof v == 'object') {
serialize(v, k) : v = serialize(v, k);
encodeURIComponent(k) + "=" + encodeURIComponent(v)); if (v) {
str.push(v);
}
} else {
str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
} }
} }
} });
return str.join("&"); return str.length ? str.join("&") : '';
} }
...@@ -53,23 +57,27 @@ export const productStatusToString = status => { ...@@ -53,23 +57,27 @@ export const productStatusToString = status => {
return PRODUCT_STATUS[status] || '未定义'; return PRODUCT_STATUS[status] || '未定义';
}; };
export const productEnableCreateTrade = status => {
return status > 1 && status < 17;
}
export const tradeStatusToString = status => { export const tradeStatusToString = status => {
switch (status) { switch (status) {
case 1 : case 1 :
return '未报单,等待客户打款'; return '未报单';
case 10: case 10:
return '已报单,等待验资'; return '待验资';
case 11: case 11:
return '验资成功,等待项目成立'; return '验资成功,成立';
case 16: case 16:
return '验资失败,资金未到账'; return '验资失败,资金未到账';
case 12: case 12:
return '待成立'; return '产品待成立';
case 21: case 21:
return '项目已成立'; return '产品已成立';
case 22: case 22:
return '项目成立'; return '产品已成立';
case 31: case 31:
return '交易关闭'; return '交易关闭';
case 32: case 32:
...@@ -116,3 +124,52 @@ export function formatMoney(money = 0) { ...@@ -116,3 +124,52 @@ export function formatMoney(money = 0) {
} }
return ret; return ret;
} }
export const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 16},
};
export const smallFormItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 10}
};
export const footerFormSubmitLayout = {
wrapperCol: {span: 16, offset: 4}
};
export function filterUploadSuccess(fileList) {
return fileList.filter((file) => {
if (file.response) {
return file.response.status === 1;
}
return true;
});
}
export function transformUploadThumbUrl(fileList) {
return fileList.map((file) => {
if (file.response) {
// 组件会将 file.url 作为链接进行展示
//file.url = file.response.url;
const {result, status, message} = file.response;
if (status === 1 && result && result.length >= 1 && result[0].url) {
file.url = result[0].url;
file.thumbUrl = result[0].url + '!t';
}
}
return file;
});
}
export function handleUpload(info, limit){
let fileList = filterUploadSuccess(info.fileList);
if(limit){
fileList = fileList.slice(-1 * limit);
}
return transformUploadThumbUrl(fileList);
}
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