Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
zhangzhonghua
/
BoneHouse_Business_APP
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e09dbcef
authored
Apr 17, 2022
by
lhc
1
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
feat: 增加全局搜索
parent
33704d0c
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2578 additions
and
1893 deletions
app/Router.js
app/action/SelfAction.js
app/containers/common/listDataComponent/PicTitDetaiCalcu.js
app/containers/selfOrder/module/ChooseProductPage.js
app/containers/selfOrder/module/SearchPage.js
app/Router.js
View file @
e09dbcef
import
React
,
{
Component
}
from
'react'
;
import
{
Easing
,
Animated
}
from
'react-native'
;
import
{
createStackNavigator
,
createAppContainer
}
from
'react-navigation'
;
import
LoginPage
from
'./containers/login/LoginPage'
;
import
HomePage
from
'./containers/home/HomePage'
;
import
SelfOrderPage
from
'./containers/selfOrder/SelfOrderPage'
;
import
ChooseProductPage
from
'./containers/selfOrder/module/ChooseProductPage'
;
import
EditThirdLevelPage
from
'./containers/selfOrder/module/EditThirdLevelPage'
;
import
EquipConsuPage
from
'./containers/equipConsu/EquipConsuPage'
;
import
ConsumDetailsPage
from
'./containers/equipConsu/module/ConsumDetailsPage'
;
import
ChargeDetailsPage
from
'./containers/equipConsu/module/ChargeDetailsPageRef'
;
import
FillUnitPricePage
from
'./containers/equipConsu/module/FillUnitPricePage'
;
import
OrdersPage
from
'./containers/equipConsu/module/OrdersPage'
;
import
ShowDetailPage
from
'./containers/equipConsu/module/ShowDetailPage'
;
import
QuickOrderPage
from
'./containers/quickOrder/QuickOrderPage'
;
import
surgeryTemplatePage
from
'./containers/quickOrder/module/surgeryTemplatePage'
;
import
surgeryDetailsPage
from
'./containers/quickOrder/module/surgeryDetailsPage'
;
import
TransOrderPage
from
'./containers/transOrder/TransOrderPage'
;
import
DeviceInfoPage
from
'./containers/deviceInfo/DeviceInfoPage'
;
import
TransSearchPage
from
'./containers/transOrder/module/TransSearchPage'
;
import
HistoricalOrderPage
from
'./containers/historicalOrder/HistoricalOrderPage'
;
import
LineOrderPage
from
'./containers/historicalOrder/module/LineOrderPage'
;
import
SubSuccPage
from
'./containers/common/SubSuccPage'
;
import
BarCodePage
from
'./containers/common/BarCodePage'
;
import
React
,
{
Component
}
from
'react'
import
{
Easing
,
Animated
}
from
'react-native'
import
{
createStackNavigator
,
createAppContainer
}
from
'react-navigation'
import
LoginPage
from
'./containers/login/LoginPage'
import
HomePage
from
'./containers/home/HomePage'
import
SelfOrderPage
from
'./containers/selfOrder/SelfOrderPage'
import
ChooseProductPage
from
'./containers/selfOrder/module/ChooseProductPage'
import
SearchPage
from
'./containers/selfOrder/module/SearchPage'
import
EditThirdLevelPage
from
'./containers/selfOrder/module/EditThirdLevelPage'
import
EquipConsuPage
from
'./containers/equipConsu/EquipConsuPage'
import
ConsumDetailsPage
from
'./containers/equipConsu/module/ConsumDetailsPage'
import
ChargeDetailsPage
from
'./containers/equipConsu/module/ChargeDetailsPageRef'
import
FillUnitPricePage
from
'./containers/equipConsu/module/FillUnitPricePage'
import
OrdersPage
from
'./containers/equipConsu/module/OrdersPage'
import
ShowDetailPage
from
'./containers/equipConsu/module/ShowDetailPage'
import
QuickOrderPage
from
'./containers/quickOrder/QuickOrderPage'
import
surgeryTemplatePage
from
'./containers/quickOrder/module/surgeryTemplatePage'
import
surgeryDetailsPage
from
'./containers/quickOrder/module/surgeryDetailsPage'
import
TransOrderPage
from
'./containers/transOrder/TransOrderPage'
import
DeviceInfoPage
from
'./containers/deviceInfo/DeviceInfoPage'
import
TransSearchPage
from
'./containers/transOrder/module/TransSearchPage'
import
HistoricalOrderPage
from
'./containers/historicalOrder/HistoricalOrderPage'
import
LineOrderPage
from
'./containers/historicalOrder/module/LineOrderPage'
import
SubSuccPage
from
'./containers/common/SubSuccPage'
import
BarCodePage
from
'./containers/common/BarCodePage'
// 结算
import
Settlement
from
'../src/pages/settlement/index'
;
import
SettlementCollection
from
'../src/pages/settlement/collection'
;
import
SettlementDetail
from
'../src/pages/settlement/detail'
;
import
SettlementSaleDetail
from
'../src/pages/settlement/saleDetail'
;
import
SettlementReject
from
'../src/pages/settlement/reject'
;
import
Settlement
from
'../src/pages/settlement/index'
import
SettlementCollection
from
'../src/pages/settlement/collection'
import
SettlementDetail
from
'../src/pages/settlement/detail'
import
SettlementSaleDetail
from
'../src/pages/settlement/saleDetail'
import
SettlementReject
from
'../src/pages/settlement/reject'
// 分销开票
import
DistributeInvoice
from
'../src/pages/invoice/distribution'
;
import
DistributeInvoiceApplyDetail
from
'../src/pages/invoice/distribution/detail'
;
import
DistributeInvoiceCollections
from
'../src/pages/invoice/distribution/collection'
;
import
DistributeInvoiceCollectionDetail
from
'../src/pages/invoice/distribution/collection_detail'
;
import
DistributeInvoice
from
'../src/pages/invoice/distribution'
import
DistributeInvoiceApplyDetail
from
'../src/pages/invoice/distribution/detail'
import
DistributeInvoiceCollections
from
'../src/pages/invoice/distribution/collection'
import
DistributeInvoiceCollectionDetail
from
'../src/pages/invoice/distribution/collection_detail'
// 直销开票
import
DirectionInvoice
from
'../src/pages/invoice/direct'
;
import
DirectionInvoiceCollections
from
'../src/pages/invoice/direct/collections'
;
import
DirectionInvoiceApplyDetail
from
'../src/pages/invoice/direct/detail'
;
import
DirectionInvoice
from
'../src/pages/invoice/direct'
import
DirectionInvoiceCollections
from
'../src/pages/invoice/direct/collections'
import
DirectionInvoiceApplyDetail
from
'../src/pages/invoice/direct/detail'
const
Router
=
createAppContainer
(
createStackNavigator
({
LoginPage
:
{
screen
:
LoginPage
},
HomePage
:
{
screen
:
HomePage
},
SelfOrderPage
:
{
screen
:
SelfOrderPage
},
ChooseProductPage
:
{
screen
:
ChooseProductPage
},
EditThirdLevelPage
:
{
screen
:
EditThirdLevelPage
},
EquipConsuPage
:
{
screen
:
EquipConsuPage
},
ConsumDetailsPage
:
{
screen
:
ConsumDetailsPage
},
ChargeDetailsPage
:
{
screen
:
ChargeDetailsPage
},
FillUnitPricePage
:
{
screen
:
FillUnitPricePage
},
OrdersPage
:
{
screen
:
OrdersPage
},
ShowDetailPage
:
{
screen
:
ShowDetailPage
},
QuickOrderPage
:
{
screen
:
QuickOrderPage
},
surgeryTemplatePage
:
{
screen
:
surgeryTemplatePage
},
surgeryDetailsPage
:
{
screen
:
surgeryDetailsPage
},
TransOrderPage
:
{
screen
:
TransOrderPage
},
DeviceInfoPage
:
{
screen
:
DeviceInfoPage
},
TransSearchPage
:
{
screen
:
TransSearchPage
},
HistoricalOrderPage
:
{
screen
:
HistoricalOrderPage
},
LineOrderPage
:
{
screen
:
LineOrderPage
},
SubSuccPage
:
{
screen
:
SubSuccPage
},
BarCodePage
:
{
screen
:
BarCodePage
},
Settlement
:
{
screen
:
Settlement
},
SettlementCollection
:
{
screen
:
SettlementCollection
},
SettlementReject
:
{
screen
:
SettlementReject
},
SettlementDetail
:
{
screen
:
SettlementDetail
},
SettlementSaleDetail
:
{
screen
:
SettlementSaleDetail
},
DistributeInvoice
:
{
screen
:
DistributeInvoice
},
DistributeInvoiceApplyDetail
:
{
screen
:
DistributeInvoiceApplyDetail
},
DistributeInvoiceCollections
:
{
screen
:
DistributeInvoiceCollections
},
DistributeInvoiceCollectionDetail
:
{
screen
:
DistributeInvoiceCollectionDetail
},
DirectionInvoice
:
{
screen
:
DirectionInvoice
},
DirectionInvoiceCollections
:
{
screen
:
DirectionInvoiceCollections
},
DirectionInvoiceApplyDetail
:
{
screen
:
DirectionInvoiceApplyDetail
},
},
{
navigationOptions
:
{
gesturesEnabled
:
true
const
Router
=
createAppContainer
(
createStackNavigator
(
{
LoginPage
:
{
screen
:
LoginPage
},
HomePage
:
{
screen
:
HomePage
},
SelfOrderPage
:
{
screen
:
SelfOrderPage
},
ChooseProductPage
:
{
screen
:
ChooseProductPage
},
SearchPage
:
{
screen
:
SearchPage
},
EditThirdLevelPage
:
{
screen
:
EditThirdLevelPage
},
EquipConsuPage
:
{
screen
:
EquipConsuPage
},
ConsumDetailsPage
:
{
screen
:
ConsumDetailsPage
},
ChargeDetailsPage
:
{
screen
:
ChargeDetailsPage
},
FillUnitPricePage
:
{
screen
:
FillUnitPricePage
},
OrdersPage
:
{
screen
:
OrdersPage
},
ShowDetailPage
:
{
screen
:
ShowDetailPage
},
QuickOrderPage
:
{
screen
:
QuickOrderPage
},
surgeryTemplatePage
:
{
screen
:
surgeryTemplatePage
},
surgeryDetailsPage
:
{
screen
:
surgeryDetailsPage
},
TransOrderPage
:
{
screen
:
TransOrderPage
},
DeviceInfoPage
:
{
screen
:
DeviceInfoPage
},
TransSearchPage
:
{
screen
:
TransSearchPage
},
HistoricalOrderPage
:
{
screen
:
HistoricalOrderPage
},
LineOrderPage
:
{
screen
:
LineOrderPage
},
SubSuccPage
:
{
screen
:
SubSuccPage
},
BarCodePage
:
{
screen
:
BarCodePage
},
Settlement
:
{
screen
:
Settlement
},
SettlementCollection
:
{
screen
:
SettlementCollection
},
SettlementReject
:
{
screen
:
SettlementReject
},
SettlementDetail
:
{
screen
:
SettlementDetail
},
SettlementSaleDetail
:
{
screen
:
SettlementSaleDetail
},
DistributeInvoice
:
{
screen
:
DistributeInvoice
},
DistributeInvoiceApplyDetail
:
{
screen
:
DistributeInvoiceApplyDetail
},
DistributeInvoiceCollections
:
{
screen
:
DistributeInvoiceCollections
},
DistributeInvoiceCollectionDetail
:
{
screen
:
DistributeInvoiceCollectionDetail
},
DirectionInvoice
:
{
screen
:
DirectionInvoice
},
DirectionInvoiceCollections
:
{
screen
:
DirectionInvoiceCollections
},
DirectionInvoiceApplyDetail
:
{
screen
:
DirectionInvoiceApplyDetail
},
},
headerMode
:
'none'
,
transitionConfig
:
()
=>
({
{
navigationOptions
:
{
gesturesEnabled
:
true
,
},
headerMode
:
'none'
,
transitionConfig
:
()
=>
({
transitionSpec
:
{
duration
:
300
,
easing
:
Easing
.
out
(
Easing
.
poly
(
4
)),
timing
:
Animated
.
timing
duration
:
300
,
easing
:
Easing
.
out
(
Easing
.
poly
(
4
)),
timing
:
Animated
.
timing
,
},
screenInterpolator
:
sceneProps
=>
{
const
{
layout
,
position
,
scene
}
=
sceneProps
;
const
{
index
}
=
scene
;
const
Width
=
layout
.
initWidth
;
//沿X轴平移
const
translateX
=
position
.
interpolate
({
inputRange
:
[
index
-
1
,
index
,
index
+
1
],
outputRange
:
[
Width
,
0
,
-
(
Width
-
10
)],
});
//透明度
const
opacity
=
position
.
interpolate
({
inputRange
:
[
index
-
1
,
index
-
0.99
,
index
],
outputRange
:
[
0
,
1
,
1
]
});
return
{
opacity
,
transform
:
[{
translateX
}]};
}
})
}))
const
{
layout
,
position
,
scene
}
=
sceneProps
const
{
index
}
=
scene
const
Width
=
layout
.
initWidth
//沿X轴平移
const
translateX
=
position
.
interpolate
({
inputRange
:
[
index
-
1
,
index
,
index
+
1
],
outputRange
:
[
Width
,
0
,
-
(
Width
-
10
)],
})
//透明度
const
opacity
=
position
.
interpolate
({
inputRange
:
[
index
-
1
,
index
-
0.99
,
index
],
outputRange
:
[
0
,
1
,
1
],
})
return
{
opacity
,
transform
:
[{
translateX
}]
}
},
}),
},
),
)
// const defaultGetStateForAction = Router.router.getStateForAction;
// Router.router.getStateForAction = ((action, state) => {
...
...
@@ -127,4 +130,4 @@ const Router = createAppContainer(createStackNavigator({
// return defaultGetStateForAction(action, state)
// })
export
default
Router
\ No newline at end of file
export
default
Router
app/action/SelfAction.js
View file @
e09dbcef
import
{
PostRequest
,
GetRequest
,
UploadRequest
}
from
'../network/RequestUtils'
;
import
{
show
,
getUrlParams
,
showWarnErrorMessage
,
showErrorMessage
,
dedupQuoteArray
}
from
'../utils/Utils'
;
import
{
exitLoginStatus
}
from
'./LoginAction'
;
import
{
PostRequest
,
GetRequest
,
UploadRequest
}
from
'../network/RequestUtils'
import
{
show
,
getUrlParams
,
showWarnErrorMessage
,
showErrorMessage
,
dedupQuoteArray
}
from
'../utils/Utils'
import
{
exitLoginStatus
}
from
'./LoginAction'
import
{
SELF_ORDER_LIST_DOING
,
SELF_ORDER_LIST_SUCCESS
,
SELF_ORDER_LIST_FAILURE
,
SELF_SUBMIT_DOING
,
SELF_SUBMIT_SUCCESS
,
SELF_SUBMIT_FAILURE
,
SELF_INIT_DATA
,
SET_SELECT_PRODUCT_OPTS
,
SET_LEND_ORDER_VALUES
}
from
'../base/ActionTypes'
;
SELF_ORDER_LIST_DOING
,
SELF_ORDER_LIST_SUCCESS
,
SELF_ORDER_LIST_FAILURE
,
SELF_SUBMIT_DOING
,
SELF_SUBMIT_SUCCESS
,
SELF_SUBMIT_FAILURE
,
SELF_INIT_DATA
,
SET_SELECT_PRODUCT_OPTS
,
SET_LEND_ORDER_VALUES
,
}
from
'../base/ActionTypes'
import
local_inter_mock
from
'../containers/selfOrder/module/mock/inter_mock'
import
*
as
R
from
'ramda'
// 获取组织 params={access_token:''}
export
function
requestSelfOrganizations
(
params
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/authorized_inventory/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取组织 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
organizations
}
}
=
res
dispatch
(
requestListDataSuccess
(
organizations
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// show(res.error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取组织'
)
// console.log('------err--获取组织----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/authorized_inventory/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取组织 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
organizations
},
}
=
res
dispatch
(
requestListDataSuccess
(
organizations
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// show(res.error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取组织'
)
// console.log('------err--获取组织----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
}
// 获取未定单据借货设置 params={access_token:'', org_code:'', customer_code: '', bill_to_site_code: '', ship_to_site_code: '', process_code: ''}
export
function
requestQuickSurColSetting
(
params
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/collect_setting/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取未定单据借货设置 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
{
data
}
=
res
let
filterOpt
=
dedupQuoteArray
(
data
,
'source_inv_code'
)
dispatch
(
requestListDataSuccess
(
filterOpt
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
);
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// }else if(res.status === 404){
// show('请求接口不存在,请联系管理员!')
// dispatch(requestListDataFail());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
// console.log('------err-====获取未定单据借货设置----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取未定单据借货设置'
);
})
}
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/collect_setting/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取未定单据借货设置 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
{
data
}
=
res
let
filterOpt
=
dedupQuoteArray
(
data
,
'source_inv_code'
)
dispatch
(
requestListDataSuccess
(
filterOpt
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// }else if(res.status === 404){
// show('请求接口不存在,请联系管理员!')
// dispatch(requestListDataFail());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
// console.log('------err-====获取未定单据借货设置----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取未定单据借货设置'
)
})
}
}
export
const
reqSelfOrganizations
=
async
(
global_domain_config
,
params
)
=>
{
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/authorized_inventory/search'
,
params
))
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/authorized_inventory/search'
,
params
))
}
export
const
reqOrgDepartments
=
async
(
global_domain_config
,
params
)
=>
{
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/sale_relationship/search'
,
params
))
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/sale_relationship/search'
,
params
))
}
// 获取客户名称 params={access_token:'', org_code:'', seller_code:''}
export
function
requestSelfSurgeryHospital
(
params
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/seller_customer/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取客户名称 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
customers
}
}
=
res
dispatch
(
requestListDataSuccess
(
customers
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取客户名称'
)
// console.log('------err--====获取客户名称----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/seller_customer/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取客户名称 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
customers
},
}
=
res
dispatch
(
requestListDataSuccess
(
customers
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取客户名称'
)
// console.log('------err--====获取客户名称----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
}
export
const
reqSelfSurgeryHospital
=
async
(
global_domain_config
,
params
)
=>
{
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/seller_customer/search'
,
params
))
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/sale/seller_customer/search'
,
params
))
}
// 获取订单类型 params={access_token:'', value_set_code:'SUR_ORDER_TYPE'}
export
function
requestSelfOrderType
(
params
,
url
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
// GetRequest(global_domain_config, getUrlParams('/system/value_set/search', params))
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
// GetRequest(global_domain_config, getUrlParams('/system/value_set/search', params))
if
(
!
url
)
{
url
=
'/system/order_type/search'
}
GetRequest
(
global_domain_config
,
getUrlParams
(
url
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取订单类型 res====='
,
res
)
// 兼容老的接口,有的环境没有实现获取订单类型接口
if
(
res
.
status
===
404
)
{
return
dispatch
(
requestSelfOrderType
(
params
,
'/system/value_set/search'
))
}
if
(
res
.
error_code
==
0
)
{
let
data
=
[]
if
(
R
.
includes
(
'order_type'
,
url
))
{
data
=
R
.
map
(
R
.
applySpec
({
value_name
:
R
.
prop
(
'order_type_name'
),
value_code
:
R
.
prop
(
'order_type_code'
),
}),
)(
res
.
data
)
}
else
{
data
=
res
.
data
.
sys_values
}
dispatch
(
requestListDataSuccess
(
data
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
})
.
catch
(
err
=>
{
if
(
!
url
)
{
url
=
'/system/order_type/search'
requestSelfOrderType
(
params
,
'/system/value_set/search'
)
}
else
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取订单类型'
)
}
GetRequest
(
global_domain_config
,
getUrlParams
(
url
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取订单类型 res====='
,
res
);
// 兼容老的接口,有的环境没有实现获取订单类型接口
if
(
res
.
status
===
404
)
{
return
dispatch
(
requestSelfOrderType
(
params
,
'/system/value_set/search'
))
}
if
(
res
.
error_code
==
0
)
{
let
data
=
[]
if
(
R
.
includes
(
'order_type'
,
url
))
{
data
=
R
.
map
(
R
.
applySpec
({
value_name
:
R
.
prop
(
'order_type_name'
),
value_code
:
R
.
prop
(
'order_type_code'
),
}))(
res
.
data
)
}
else
{
data
=
res
.
data
.
sys_values
}
dispatch
(
requestListDataSuccess
(
data
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
})
.
catch
(
err
=>
{
if
(
!
url
)
{
requestSelfOrderType
(
params
,
'/system/value_set/search'
)
}
else
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取订单类型'
)
}
})
}
})
}
}
// 获取配台模板 params={access_token:'', org_code:'', seller_code: 'shi.ming', customer_code: '', surgery_type: '', doctor_name: ''}
export
function
requestSelfTemplateCollect
(
params
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_header/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取配台模板 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
surgery_template_headers
}
}
=
res
dispatch
(
requestListDataSuccess
(
surgery_template_headers
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取配台模板'
)
// console.log('------err--====获取配台模板----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_header/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取配台模板 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
{
data
:
{
surgery_template_headers
},
}
=
res
dispatch
(
requestListDataSuccess
(
surgery_template_headers
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取配台模板'
)
// console.log('------err--====获取配台模板----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
}
// 获取手术类型 params={access_token:'', value_set_code:'ORTHOPEDICS_PRODUCT_CLASS'}
export
function
requestSelfSurgeryType
(
params
)
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
());
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/system/value_set/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取手术类型 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
typeOption
=
[]
let
{
data
:
{
value_set_code
,
sys_values
}
}
=
res
if
(
value_set_code
===
'ORTHOPEDICS_PRODUCT_CLASS'
&&
sys_values
&&
sys_values
.
length
)
{
typeOption
=
sys_values
}
dispatch
(
requestListDataSuccess
(
typeOption
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取手术类型'
)
// console.log('------err--====获取手术类型----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestListDataing
())
let
{
global_domain_config
}
=
getState
().
login
GetRequest
(
global_domain_config
,
getUrlParams
(
'/system/value_set/search'
,
params
))
.
then
(
res
=>
{
console
.
log
(
'获取手术类型 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
typeOption
=
[]
let
{
data
:
{
value_set_code
,
sys_values
},
}
=
res
if
(
value_set_code
===
'ORTHOPEDICS_PRODUCT_CLASS'
&&
sys_values
&&
sys_values
.
length
)
{
typeOption
=
sys_values
}
dispatch
(
requestListDataSuccess
(
typeOption
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestListDataFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestListDataFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestListDataFail
,
'获取手术类型'
)
// console.log('------err--====获取手术类型----', Object.keys(err), err)
// show(err.error);
// dispatch(requestListDataFail());
})
}
}
function
requestListDataing
()
{
return
{
type
:
SELF_ORDER_LIST_DOING
}
return
{
type
:
SELF_ORDER_LIST_DOING
,
}
}
export
function
requestListDataSuccess
(
data
)
{
return
{
type
:
SELF_ORDER_LIST_SUCCESS
,
rawData
:
data
}
return
{
type
:
SELF_ORDER_LIST_SUCCESS
,
rawData
:
data
,
}
}
function
requestListDataFail
()
{
return
{
type
:
SELF_ORDER_LIST_FAILURE
}
return
{
type
:
SELF_ORDER_LIST_FAILURE
,
}
}
// 上传语音
export
const
requestSelfAudio
=
async
(
global_domain_config
,
params
)
=>
{
let
{
access_token
,
path
}
=
params
let
formData
=
new
FormData
()
let
soundPath
=
`file://
${
path
}
`
let
fileName
=
path
.
substring
(
path
.
lastIndexOf
(
'/'
)
+
1
,
path
.
length
)
let
file
=
{
uri
:
soundPath
,
type
:
"multipart/form-data"
,
name
:
fileName
}
formData
.
append
(
'file'
,
file
)
return
await
UploadRequest
(
global_domain_config
,
getUrlParams
(
'/dingding/upload_media'
,
{
access_token
}),
formData
)
let
{
access_token
,
path
}
=
params
let
formData
=
new
FormData
()
let
soundPath
=
`file://
${
path
}
`
let
fileName
=
path
.
substring
(
path
.
lastIndexOf
(
'/'
)
+
1
,
path
.
length
)
let
file
=
{
uri
:
soundPath
,
type
:
'multipart/form-data'
,
name
:
fileName
}
formData
.
append
(
'file'
,
file
)
return
await
UploadRequest
(
global_domain_config
,
getUrlParams
(
'/dingding/upload_media'
,
{
access_token
}),
formData
)
}
// 提交数据
export
function
requestSelfSumbit
({
access_token
,
...
params
})
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestSubmiting
());
let
{
global_domain_config
}
=
getState
().
login
PostRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/collect_order/via_data/create'
,
{
access_token
:
access_token
}),
params
)
// PostRequest(global_domain_config, getUrlParams('/order/sur_requirement/create', {access_token: access_token}), params)
.
then
(
res
=>
{
console
.
log
(
'提交数据 res====='
,
res
);
if
(
res
.
error_code
==
0
)
{
let
{
data
}
=
res
dispatch
(
requestSubmitSuccess
(
data
));
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestSubmitFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestSubmitFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestSubmitFail
,
'提交数据'
)
// console.log('------err--====提交数据----', Object.keys(err), err)
// show(err.error);
// dispatch(requestSubmitFail());
})
}
export
function
requestSelfSumbit
({
access_token
,
...
params
})
{
return
(
dispatch
,
getState
)
=>
{
dispatch
(
requestSubmiting
())
let
{
global_domain_config
}
=
getState
().
login
PostRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/collect_order/via_data/create'
,
{
access_token
:
access_token
}),
params
,
)
// PostRequest(global_domain_config, getUrlParams('/order/sur_requirement/create', {access_token: access_token}), params)
.
then
(
res
=>
{
console
.
log
(
'提交数据 res====='
,
res
)
if
(
res
.
error_code
==
0
)
{
let
{
data
}
=
res
dispatch
(
requestSubmitSuccess
(
data
))
}
else
{
showWarnErrorMessage
(
dispatch
,
res
,
exitLoginStatus
,
requestSubmitFail
)
}
// else if(res.error_code === 41006) {
// show('登录过期,请重新登录');
// dispatch(exitLoginStatus());
// } else {
// let error_msg = res.error_msg || res.message
// show(error_msg);
// dispatch(requestSubmitFail());
// }
})
.
catch
(
err
=>
{
showErrorMessage
(
dispatch
,
err
,
requestSubmitFail
,
'提交数据'
)
// console.log('------err--====提交数据----', Object.keys(err), err)
// show(err.error);
// dispatch(requestSubmitFail());
})
}
}
// 选择产品-供应商信息查询接口
export
const
reqPurSupplierSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_1
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/pur_supplier/search'
,
params
))
// return local_inter_mock.inter_1
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/pur_supplier/search'
,
params
))
}
// 选择产品-产品信息分类查询接口
export
const
reqProCategorySearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_2
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/item/search'
,
params
))
// return local_inter_mock.inter_2
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/item/search'
,
params
))
}
// 选择产品-手术套包头查询接口
export
const
reqSurTempHeadSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_3
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_header/search'
,
params
))
// return local_inter_mock.inter_3
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_header/search'
,
params
))
}
// 选择产品-手术套包行查询接口
export
const
reqSurTempLineSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_4
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_line/search'
,
params
))
// return local_inter_mock.inter_4
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/surgery/template_line/search'
,
params
))
}
// 选择产品-螺钉盒(器械包)头查询接口
export
const
reqNailEquipHeadSearch
=
async
(
global_domain_config
,
params
)
=>
{
// if(params.category_code === '1301'){
// return local_inter_mock.inter_5
// }else {
// return local_inter_mock.inter_55
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package_header/search'
,
params
))
// if(params.category_code === '1301'){
// return local_inter_mock.inter_5
// }else {
// return local_inter_mock.inter_55
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package_header/search'
,
params
))
}
// 选择产品-螺钉盒明细查询接口
export
const
reqNailBoxLineSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_6
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/nail_box_template_detail/search'
,
params
))
// return local_inter_mock.inter_6
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/nail_box_template_detail/search'
,
params
))
}
// 选择产品-器械包明细查询接口
export
const
reqEquipPackageLineSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_7
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package/search'
,
params
))
// return local_inter_mock.inter_7
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package/search'
,
params
))
}
// 选择产品-螺钉盒明细/器械包明细查询接口
export
const
reqNailAndEquipSearch
=
async
(
global_domain_config
,
params
)
=>
{
// if(params.nail_box_flag == 'Y'){
// return local_inter_mock.inter_6
// }else {
// return local_inter_mock.inter_77
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package_detail/search'
,
params
))
// if(params.nail_box_flag == 'Y'){
// return local_inter_mock.inter_6
// }else {
// return local_inter_mock.inter_77
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/inventory/item_package_detail/search'
,
params
))
}
// 选择产品-零散器械查询接口
export
const
reqScatEquipmentSearch
=
async
(
global_domain_config
,
params
)
=>
{
// return local_inter_mock.inter_8
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/tool/search'
,
params
))
// return local_inter_mock.inter_8
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/tool/search'
,
params
))
}
// 选择产品-单点耗材查询接口
export
const
reqSingleConsumSearch
=
async
(
global_domain_config
,
params
)
=>
{
// if(params.leftIndex && params.leftIndex%2 === 0){
// return local_inter_mock.inter_9
// }else {
// return local_inter_mock.inter_99
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/item_detail/search'
,
params
))
// if(params.leftIndex && params.leftIndex%2 === 0){
// return local_inter_mock.inter_9
// }else {
// return local_inter_mock.inter_99
// }
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/item_detail/search'
,
params
))
}
export
const
reqGlobalSearch
=
async
(
global_domain_config
,
params
)
=>
{
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
'/order/item/global_search'
,
params
))
}
function
requestSubmiting
()
{
return
{
type
:
SELF_SUBMIT_DOING
}
return
{
type
:
SELF_SUBMIT_DOING
,
}
}
function
requestSubmitSuccess
(
data
)
{
return
{
type
:
SELF_SUBMIT_SUCCESS
,
rawData
:
data
}
return
{
type
:
SELF_SUBMIT_SUCCESS
,
rawData
:
data
,
}
}
function
requestSubmitFail
()
{
return
{
type
:
SELF_SUBMIT_FAILURE
}
return
{
type
:
SELF_SUBMIT_FAILURE
,
}
}
// 初始化数据
export
function
setSelfInitData
()
{
return
{
type
:
SELF_INIT_DATA
}
return
{
type
:
SELF_INIT_DATA
,
}
}
// 存储选择产品数据
export
function
setSelectProductOpts
(
data
)
{
return
{
type
:
SET_SELECT_PRODUCT_OPTS
,
rawData
:
data
}
return
{
type
:
SET_SELECT_PRODUCT_OPTS
,
rawData
:
data
,
}
}
/**
...
...
@@ -415,7 +428,7 @@ export function setSelectProductOpts(data) {
* @return {*}
*/
export
async
function
requestSurgeryType
(
global_domain_config
,
params
)
{
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
`/inventory/category/search`
,
params
))
return
await
GetRequest
(
global_domain_config
,
getUrlParams
(
`/inventory/category/search`
,
params
))
}
/**
...
...
@@ -424,22 +437,22 @@ export async function requestSurgeryType(global_domain_config, params) {
* @return {*}
*/
export
function
getLendOrderCodeValues
()
{
return
(
dispatch
,
getState
)
=>
{
let
{
global_domain_config
,
token
}
=
getState
().
login
const
params
=
{
access_token
:
token
,
value_set_code
:
'OBS_MOBILE_LEND_ORDER'
}
GetRequest
(
global_domain_config
,
getUrlParams
(
'/system/value_set/search'
,
params
)).
then
(
res
=>
{
const
values
=
R
.
pathOr
([],
[
'data'
,
'sys_values'
])(
res
)
dispatch
(
setLendOrderCodeValues
(
values
))
})
return
(
dispatch
,
getState
)
=>
{
let
{
global_domain_config
,
token
}
=
getState
().
login
const
params
=
{
access_token
:
token
,
value_set_code
:
'OBS_MOBILE_LEND_ORDER'
,
}
GetRequest
(
global_domain_config
,
getUrlParams
(
'/system/value_set/search'
,
params
)).
then
(
res
=>
{
const
values
=
R
.
pathOr
([],
[
'data'
,
'sys_values'
])(
res
)
dispatch
(
setLendOrderCodeValues
(
values
))
})
}
}
export
function
setLendOrderCodeValues
(
values
)
{
return
{
type
:
SET_LEND_ORDER_VALUES
,
values
}
return
{
type
:
SET_LEND_ORDER_VALUES
,
values
,
}
}
app/containers/common/listDataComponent/PicTitDetaiCalcu.js
View file @
e09dbcef
import
React
,
{
Component
}
from
'react'
;
import
{
StyleSheet
,
Image
,
Text
,
TouchableOpacity
,
View
}
from
'react-native'
;
import
{
connect
}
from
'react-redux'
;
import
{
first_text_color
,
font_family_medium
,
font_family_regular
,
font_family_semibold
,
home_background_color
,
icon_style
,
pxSize
,
second_text_size
,
third_text_color
,
third_text_size
,
list_tit_color
,
list_str_color
,
list_one_color
,
list_thr_color
,
list_one_light_color
}
from
'../../../base/BaseStyle'
;
import
PictureZoom
from
'../../common/listDataComponent/PictureZoom'
;
import
LocalVariable
from
'../LocalVariable'
;
const
PropTypes
=
require
(
'prop-types'
);
import
React
,
{
Component
}
from
'react'
import
{
StyleSheet
,
Image
,
Text
,
TouchableOpacity
,
View
}
from
'react-native'
import
{
connect
}
from
'react-redux'
import
{
first_text_color
,
font_family_medium
,
font_family_regular
,
font_family_semibold
,
home_background_color
,
icon_style
,
pxSize
,
second_text_size
,
third_text_color
,
third_text_size
,
list_tit_color
,
list_str_color
,
list_one_color
,
list_thr_color
,
list_one_light_color
,
}
from
'../../../base/BaseStyle'
import
PictureZoom
from
'../../common/listDataComponent/PictureZoom'
import
LocalVariable
from
'../LocalVariable'
const
PropTypes
=
require
(
'prop-types'
)
/**
* 列表组件,图片-标题(提示)-计算/关闭
*/
class
PicTitDetaiCalcu
extends
Component
{
static
propTypres
=
{
listItem
:
PropTypes
.
object
,
listIndex
:
PropTypes
.
number
,
listStyleBox
:
PropTypes
.
object
,
listStyleTit
:
PropTypes
.
object
,
listStyleTip
:
PropTypes
.
object
,
listStyleCalBtn
:
PropTypes
.
object
,
listPicType
:
PropTypes
.
string
,
// 每一列图片类型
subCalCallBack
:
PropTypes
.
func
,
// 计算后回调给父组件
calField
:
PropTypes
.
string
,
// 计算的字段名
titCallBack
:
PropTypes
.
func
,
// 标题回调函数
titText
:
PropTypes
.
string
,
// 标题
titTextTit
:
PropTypes
.
string
,
tipTextStr
:
PropTypes
.
string
,
tipTextStrTit
:
PropTypes
.
string
,
tipTextOne
:
PropTypes
.
string
,
tipTextOneTit
:
PropTypes
.
string
,
tipTextTwo
:
PropTypes
.
string
,
tipTextTwoTit
:
PropTypes
.
string
,
tipTextThr
:
PropTypes
.
string
,
tipTextThrTit
:
PropTypes
.
string
,
listImgIcon
:
PropTypes
.
string
,
listStyleImg
:
PropTypes
.
objec
,
plusCallBack
:
PropTypes
.
func
,
// 加法的回调函数
reduceCallBack
:
PropTypes
.
func
,
// 减法的回调函数
showClearIcon
:
PropTypes
.
bool
,
// 展示减少x图标,不展示加减
showClearIndex
:
PropTypes
.
number
,
// 展示index
listCardActIndex
:
PropTypes
.
number
,
// 父级index = 展示index
listStyleClearBtn
:
PropTypes
.
object
,
clearCallBack
:
PropTypes
.
func
,
// 清空图标回调函数
onlyShowNum
:
PropTypes
.
bool
,
// 只展示数字
onlyShowSelect
:
PropTypes
.
bool
,
// 只能单选
listMaxNum
:
PropTypes
.
number
,
// 数量限制最大值
listShowOthOptFlag
:
PropTypes
.
bool
,
// 展示耗材详情
}
static
propTypres
=
{
listItem
:
PropTypes
.
object
,
listIndex
:
PropTypes
.
number
,
listStyleBox
:
PropTypes
.
object
,
listStyleTit
:
PropTypes
.
object
,
listStyleTip
:
PropTypes
.
object
,
listStyleCalBtn
:
PropTypes
.
object
,
listPicType
:
PropTypes
.
string
,
// 每一列图片类型
subCalCallBack
:
PropTypes
.
func
,
// 计算后回调给父组件
calField
:
PropTypes
.
string
,
// 计算的字段名
titCallBack
:
PropTypes
.
func
,
// 标题回调函数
titText
:
PropTypes
.
string
,
// 标题
titTextTit
:
PropTypes
.
string
,
tipTextStr
:
PropTypes
.
string
,
tipTextStrTit
:
PropTypes
.
string
,
tipTextOne
:
PropTypes
.
string
,
tipTextOneTit
:
PropTypes
.
string
,
tipTextTwo
:
PropTypes
.
string
,
tipTextTwoTit
:
PropTypes
.
string
,
tipTextThr
:
PropTypes
.
string
,
tipTextThrTit
:
PropTypes
.
string
,
listImgIcon
:
PropTypes
.
string
,
listStyleImg
:
PropTypes
.
objec
,
plusCallBack
:
PropTypes
.
func
,
// 加法的回调函数
reduceCallBack
:
PropTypes
.
func
,
// 减法的回调函数
showClearIcon
:
PropTypes
.
bool
,
// 展示减少x图标,不展示加减
showClearIndex
:
PropTypes
.
number
,
// 展示index
listCardActIndex
:
PropTypes
.
number
,
// 父级index = 展示index
listStyleClearBtn
:
PropTypes
.
object
,
clearCallBack
:
PropTypes
.
func
,
// 清空图标回调函数
onlyShowNum
:
PropTypes
.
bool
,
// 只展示数字
onlyShowSelect
:
PropTypes
.
bool
,
// 只能单选
listMaxNum
:
PropTypes
.
number
,
// 数量限制最大值
listShowOthOptFlag
:
PropTypes
.
bool
,
// 展示耗材详情
constructor
(
props
)
{
super
(
props
)
this
.
state
=
{
listPicTypeArr
:
[
'ROUND'
,
'SQUARE'
,
'RECTANGLE'
],
picStyleArr
:
[
'round_pic'
,
'square_pic'
,
'rectan_pic'
],
showOtherFlag
:
true
,
showOtherTitle
:
'点击隐藏具体详情'
,
}
}
constructor
(
props
)
{
super
(
props
);
this
.
state
=
{
listPicTypeArr
:
[
'ROUND'
,
'SQUARE'
,
'RECTANGLE'
],
picStyleArr
:
[
'round_pic'
,
'square_pic'
,
'rectan_pic'
],
showOtherFlag
:
true
,
showOtherTitle
:
'点击隐藏具体详情'
}
}
// 单选点击
handelSelectCheck
(
item
,
index
)
{
item
.
select
=
!!!
item
.
select
this
.
props
.
subCalCallBack
(
item
,
index
)
}
// 单选点击
handelSelectCheck
(
item
,
index
)
{
item
.
select
=
!!!
item
.
select
this
.
props
.
subCalCallBack
(
item
,
index
)
/**
* 点击加减
* @param {object} item 当前小类数据
* @param {number} index 当前角标
* @param {boolean} isPlus 默认减法 false,加法 true,
*/
handelCalculation
(
item
,
index
,
isPlus
)
{
let
{
calField
,
plusCallBack
,
reduceCallBack
}
=
this
.
props
if
(
!
isPlus
&&
reduceCallBack
)
{
reduceCallBack
(
item
,
index
)
return
}
/**
* 点击加减
* @param {object} item 当前小类数据
* @param {number} index 当前角标
* @param {boolean} isPlus 默认减法 false,加法 true,
*/
handelCalculation
(
item
,
index
,
isPlus
)
{
let
{
calField
,
plusCallBack
,
reduceCallBack
}
=
this
.
props
if
(
!
isPlus
&&
reduceCallBack
)
{
reduceCallBack
(
item
,
index
)
return
}
if
(
isPlus
&&
plusCallBack
)
{
plusCallBack
(
item
,
index
)
return
}
item
[
calField
]
=
Number
(
item
[
calField
])
if
(
Number
.
isNaN
(
item
[
calField
]))
{
item
[
calField
]
=
0
}
if
(
isPlus
)
{
item
[
calField
]
+=
1
}
else
if
(
!
isPlus
&&
item
[
calField
]
>
0
)
{
item
[
calField
]
-=
1
}
this
.
props
.
subCalCallBack
(
item
,
index
)
if
(
isPlus
&&
plusCallBack
)
{
plusCallBack
(
item
,
index
)
return
}
// 具体详情
showAllTip
(){
let
{
showOtherFlag
}
=
this
.
state
let
curShowOtherTitle
=
showOtherFlag
?
'点击查看具体详情'
:
'点击隐藏具体详情'
this
.
setState
({
showOtherFlag
:
!
showOtherFlag
,
showOtherTitle
:
curShowOtherTitle
})
item
[
calField
]
=
Number
(
item
[
calField
])
if
(
Number
.
isNaN
(
item
[
calField
]))
{
item
[
calField
]
=
0
}
if
(
isPlus
)
{
item
[
calField
]
+=
1
}
else
if
(
!
isPlus
&&
item
[
calField
]
>
0
)
{
item
[
calField
]
-=
1
}
this
.
props
.
subCalCallBack
(
item
,
index
)
}
render
()
{
let
{
listItem
,
listIndex
,
calField
,
listStyleBox
,
listStyleTit
,
listStyleTip
,
listStyleCalBtn
,
listPicType
,
titCallBack
,
titText
,
tipTextStr
,
tipTextOne
,
tipTextTwo
,
tipTextThr
,
listImgIcon
,
listStyleImg
,
showClearIcon
,
showClearIndex
,
listCardActIndex
,
listStyleClearBtn
,
clearCallBack
,
onlyShowNum
,
onlyShowSelect
,
titTextTit
,
tipTextStrTit
,
tipTextOneTit
,
tipTextTwoTit
,
tipTextThrTit
,
global_domain_config
,
listMaxNum
,
listShowOthOptFlag
}
=
this
.
props
let
{
listPicTypeArr
,
picStyleArr
,
showOtherFlag
,
showOtherTitle
}
=
this
.
state
// 具体详情
showAllTip
()
{
let
{
showOtherFlag
}
=
this
.
state
let
curShowOtherTitle
=
showOtherFlag
?
'点击查看具体详情'
:
'点击隐藏具体详情'
this
.
setState
({
showOtherFlag
:
!
showOtherFlag
,
showOtherTitle
:
curShowOtherTitle
,
})
}
let
picOthStyle
=
''
if
(
listPicTypeArr
.
indexOf
(
listPicType
)
>
-
1
)
{
picOthStyle
=
picStyleArr
[
listPicTypeArr
.
indexOf
(
listPicType
)]
}
let
valIsZero
=
Boolean
(
listItem
[
calField
]
===
0
)
let
calIcon
=
require
(
'../../../images/plur_icon_big.png'
)
if
(
!
valIsZero
)
{
calIcon
=
require
(
'../../../images/plur_big_act.png'
)
}
let
defSelIcon
=
require
(
'../../../images/radio_no.png'
)
if
(
onlyShowSelect
&&
listItem
.
select
)
{
defSelIcon
=
require
(
'../../../images/radio_yes.png'
)
}
let
showPlusIcon
=
true
if
(
listMaxNum
&&
listItem
[
calField
]
===
listMaxNum
)
{
showPlusIcon
=
false
}
let
cur_photos
=
[]
if
(
listItem
[
listImgIcon
]
instanceof
Array
)
{
listItem
[
listImgIcon
].
map
((
iconIt
)
=>
{
cur_photos
.
push
({
url
:
global_domain_config
+
'/jeecg-boot/sys/common/view/'
+
iconIt
})
})
if
(
listItem
[
listImgIcon
].
length
===
0
){
cur_photos
[
0
]
=
(
require
(
'../../../images/not_img.png'
))
}
}
else
if
(
typeof
listItem
[
listImgIcon
]
===
'string'
){
cur_photos
[
0
]
=
{
url
:
global_domain_config
+
'/jeecg-boot/sys/common/view/'
+
listItem
[
listImgIcon
]
}
}
return
(
<
View
style
=
{[
styles
.
ri_inner
,
listStyleBox
]}
>
{(
listImgIcon
&&
cur_photos
.
length
>
0
)
?
<
PictureZoom
listImageIndex
=
{
0
}
listImageUrls
=
{
cur_photos
}
listStyleImage
=
{[
styles
.
oth_img_box
,
styles
[
picOthStyle
],
listStyleImg
]}
listPicType
=
{
listPicType
}
/
>
:
null
}
<
View
style
=
{
styles
.
ri_text_box
}
>
<
TouchableOpacity
activeOpacity
=
{
titCallBack
?
.
8
:
1
}
onPress
=
{()
=>
{
titCallBack
?
titCallBack
(
listItem
,
listIndex
)
:
{}
}}
style
=
{
styles
.
oth_box
}
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
thr_ot
,
listStyleTit
]}
>
{
listItem
[
titText
]
?
`
${
listIndex
+
1
}
.
${
listItem
[
titText
]}
`
:
''
}
{
!
listItem
[
titText
]
&&
titTextTit
?
`
${
listIndex
+
1
}
.
${
titTextTit
}
: 无`
:
''
}
<
/Text
>
{
tipTextStrTit
?
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_str
,
listStyleTip
]}
>
{
`
${
tipTextStrTit
}
:`
}
{
listItem
[
tipTextStr
]
?
listItem
[
tipTextStr
]
:
'无'
}
<
/Text> : null
}
{
tipTextOneTit
?
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_one
,
listStyleTip
]}
>
{
`
${
tipTextOneTit
}
:`
}
{
listItem
[
tipTextOne
]
?
listItem
[
tipTextOne
]
:
'无'
}
<
/Text> : null
}
{
tipTextTwoTit
?
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_two
,
listStyleTip
]}
>
{
`
${
tipTextTwoTit
}
:`
}
{
listItem
[
tipTextTwo
]
?
listItem
[
tipTextTwo
]
:
'无'
}
<
/Text> : null
}
{
tipTextThrTit
?
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_thr
,
listStyleTip
]}
>
{
`
${
tipTextThrTit
}
:`
}
{
listItem
[
tipTextThr
]
?
listItem
[
tipTextThr
]
:
'无'
}
<
/Text> : null
}
{
listShowOthOptFlag
&&
listItem
[
LocalVariable
.
SUPER_SEL_ALL_ARR
]
?
<
View
>
<
TouchableOpacity
activeOpacity
=
{.
8
}
onPress
=
{()
=>
this
.
showAllTip
()}
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_thr
,
listStyleTip
]}
>
{
showOtherTitle
}
<
/Text
>
<
/TouchableOpacity
>
{
showOtherFlag
?
listItem
[
LocalVariable
.
SUPER_SEL_ALL_ARR
].
map
((
item
,
item_index
)
=>
{
return
<
View
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_one
,
listStyleTip
]}
>
{
item_index
+
1
}.
{
item
.
item_name
}
-
<
Text
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_main
,
listStyleTip
]}
>
{
item
.
manufacturer_product_code
}
-
{
item
.
specification
}
<
/Text> - {item.general_name} x {item
[
LocalVariable.QUANTITY_FIELD
]
}
<
/Text
>
<
/View
>
})
:
null
}
<
/View> : null
}
<
/TouchableOpacity
>
<
/View
>
{
(
showClearIcon
&&
listCardActIndex
===
showClearIndex
)
?
<
View
style
=
{
styles
.
btn_cle_box
}
>
<
TouchableOpacity
activeOpacity
=
{.
9
}
style
=
{[
styles
.
btn_clear_inner
,
listStyleClearBtn
]}
onPress
=
{()
=>
clearCallBack
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
icon_cle_btn
]}
>
<
Image
source
=
{
require
(
'../../../images/close_icon.png'
)}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity
>
<
/View>
:
<
View
style
=
{[
styles
.
ri_num_box
,
onlyShowNum
?
styles
.
show_num_box
:
null
]}
>
{(
listItem
[
calField
]
!==
0
&&
!
onlyShowNum
&&
!
onlyShowSelect
)
?
<
TouchableOpacity
activeOpacity
=
{.
9
}
style
=
{[
styles
.
btn_inner
,
listStyleCalBtn
]}
onPress
=
{()
=>
this
.
handelCalculation
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
thr_num_btn
,
styles
.
thr_btn_left
]}
>
<
Image
source
=
{
require
(
'../../../images/less_icon_big.png'
)}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity> : null
}
{(
listItem
[
calField
]
!==
0
&&
!
onlyShowSelect
)
?
<
Text
style
=
{[
styles
.
thr_num
,
onlyShowNum
?
styles
.
show_num
:
null
]}
>
{
listItem
[
calField
]}
<
/Text> : null
}
{(
!
onlyShowNum
&&
!
onlyShowSelect
&&
showPlusIcon
)
?
<
TouchableOpacity
activeOpacity
=
{.
9
}
style
=
{[
styles
.
btn_inner
,
listStyleCalBtn
]}
onPress
=
{()
=>
this
.
handelCalculation
(
listItem
,
listIndex
,
true
)}
>
<
View
style
=
{[
styles
.
thr_num_btn
,
styles
.
thr_btn_right
]}
>
<
Image
source
=
{
calIcon
}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity> : null
}
render
()
{
let
{
listItem
,
listIndex
,
calField
,
listStyleBox
,
listStyleTit
,
listStyleTip
,
listStyleCalBtn
,
listPicType
,
titCallBack
,
titText
,
tipTextStr
,
tipTextOne
,
tipTextTwo
,
tipTextThr
,
listImgIcon
,
listStyleImg
,
showClearIcon
,
showClearIndex
,
listCardActIndex
,
listStyleClearBtn
,
clearCallBack
,
onlyShowNum
,
onlyShowSelect
,
titTextTit
,
tipTextStrTit
,
tipTextOneTit
,
tipTextTwoTit
,
tipTextThrTit
,
global_domain_config
,
listMaxNum
,
listShowOthOptFlag
,
}
=
this
.
props
let
{
listPicTypeArr
,
picStyleArr
,
showOtherFlag
,
showOtherTitle
}
=
this
.
state
{
onlyShowSelect
?
<
TouchableOpacity
activeOpacity
=
{.
9
}
style
=
{[
styles
.
btn_sel_inner
]}
onPress
=
{()
=>
this
.
handelSelectCheck
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
thr_sel_btn
]}
>
<
Image
source
=
{
defSelIcon
}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity> : nul
l
}
<
/View
>
}
<
/View
>
);
let
picOthStyle
=
''
if
(
listPicTypeArr
.
indexOf
(
listPicType
)
>
-
1
)
{
picOthStyle
=
picStyleArr
[
listPicTypeArr
.
indexOf
(
listPicType
)]
}
}
let
valIsZero
=
Boolean
(
listItem
[
calField
]
===
0
)
let
calIcon
=
require
(
'../../../images/plur_icon_big.png'
)
if
(
!
valIsZero
)
{
calIcon
=
require
(
'../../../images/plur_big_act.png'
)
}
let
defSelIcon
=
require
(
'../../../images/radio_no.png'
)
if
(
onlyShowSelect
&&
listItem
.
select
)
{
defSelIcon
=
require
(
'../../../images/radio_yes.png'
)
}
let
showPlusIcon
=
true
if
(
listMaxNum
&&
listItem
[
calField
]
===
listMaxNum
)
{
showPlusIcon
=
false
}
let
cur_photos
=
[]
if
(
listItem
[
listImgIcon
]
instanceof
Array
)
{
listItem
[
listImgIcon
].
map
(
iconIt
=>
{
cur_photos
.
push
({
url
:
global_domain_config
+
'/jeecg-boot/sys/common/view/'
+
iconIt
})
})
if
(
listItem
[
listImgIcon
].
length
===
0
)
{
cur_photos
[
0
]
=
require
(
'../../../images/not_img.png'
)
}
}
else
if
(
typeof
listItem
[
listImgIcon
]
===
'string'
)
{
cur_photos
[
0
]
=
{
url
:
global_domain_config
+
'/jeecg-boot/sys/common/view/'
+
listItem
[
listImgIcon
]
}
}
return
(
<
View
style
=
{[
styles
.
ri_inner
,
listStyleBox
]}
>
{
listImgIcon
&&
cur_photos
.
length
>
0
?
(
<
PictureZoom
listImageIndex
=
{
0
}
listImageUrls
=
{
cur_photos
}
listStyleImage
=
{[
styles
.
oth_img_box
,
styles
[
picOthStyle
],
listStyleImg
]}
listPicType
=
{
listPicType
}
/
>
)
:
null
}
<
View
style
=
{
styles
.
ri_text_box
}
>
<
TouchableOpacity
activeOpacity
=
{
titCallBack
?
0.8
:
1
}
onPress
=
{()
=>
{
titCallBack
?
titCallBack
(
listItem
,
listIndex
)
:
{}
}}
style
=
{
styles
.
oth_box
}
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
thr_ot
,
listStyleTit
]}
>
{
listItem
[
titText
]
?
`
${
listIndex
+
1
}
.
${
listItem
[
titText
]}
`
:
''
}
{
!
listItem
[
titText
]
&&
titTextTit
?
`
${
listIndex
+
1
}
.
${
titTextTit
}
: 无`
:
''
}
<
/Text
>
{
tipTextStrTit
?
(
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_str
,
listStyleTip
]}
>
{
`
${
tipTextStrTit
}
:`
}
{
listItem
[
tipTextStr
]
?
listItem
[
tipTextStr
]
:
'无'
}
<
/Text
>
)
:
null
}
{
tipTextOneTit
?
(
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_one
,
listStyleTip
]}
>
{
`
${
tipTextOneTit
}
:`
}
{
listItem
[
tipTextOne
]
?
listItem
[
tipTextOne
]
:
'无'
}
<
/Text
>
)
:
null
}
{
tipTextTwoTit
?
(
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_two
,
listStyleTip
]}
>
{
`
${
tipTextTwoTit
}
:`
}
{
listItem
[
tipTextTwo
]
?
listItem
[
tipTextTwo
]
:
'无'
}
<
/Text
>
)
:
null
}
{
tipTextThrTit
?
(
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_thr
,
listStyleTip
]}
>
{
`
${
tipTextThrTit
}
:`
}
{
listItem
[
tipTextThr
]
?
listItem
[
tipTextThr
]
:
'无'
}
<
/Text
>
)
:
null
}
{
listShowOthOptFlag
&&
listItem
[
LocalVariable
.
SUPER_SEL_ALL_ARR
]
?
(
<
View
>
<
TouchableOpacity
activeOpacity
=
{
0.8
}
onPress
=
{()
=>
this
.
showAllTip
()}
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_thr
,
listStyleTip
]}
>
{
showOtherTitle
}
<
/Text
>
<
/TouchableOpacity
>
{
showOtherFlag
?
listItem
[
LocalVariable
.
SUPER_SEL_ALL_ARR
].
map
((
item
,
item_index
)
=>
{
return
(
<
View
>
<
Text
numberOfLines
=
{
3
}
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_one
,
listStyleTip
]}
>
{
item_index
+
1
}.
{
item
.
item_name
}
-
{
' '
}
<
Text
style
=
{[
styles
.
ri_te_ot
,
styles
.
te_ot_main
,
listStyleTip
]}
>
{
item
.
manufacturer_product_code
}
-
{
item
.
specification
}
<
/Text>{' '
}
-
{
item
.
general_name
}
x
{
item
[
LocalVariable
.
QUANTITY_FIELD
]}
<
/Text
>
<
/View
>
)
})
:
null
}
<
/View
>
)
:
null
}
<
/TouchableOpacity
>
<
/View
>
{
showClearIcon
&&
listCardActIndex
===
showClearIndex
?
(
<
View
style
=
{
styles
.
btn_cle_box
}
>
<
TouchableOpacity
activeOpacity
=
{
0.9
}
style
=
{[
styles
.
btn_clear_inner
,
listStyleClearBtn
]}
onPress
=
{()
=>
clearCallBack
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
icon_cle_btn
]}
>
<
Image
source
=
{
require
(
'../../../images/close_icon.png'
)}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity
>
<
/View
>
)
:
(
<
View
style
=
{[
styles
.
ri_num_box
,
onlyShowNum
?
styles
.
show_num_box
:
null
]}
>
{
listItem
[
calField
]
&&
!
onlyShowNum
&&
!
onlyShowSelect
?
(
<
TouchableOpacity
activeOpacity
=
{
0.9
}
style
=
{[
styles
.
btn_inner
,
listStyleCalBtn
]}
onPress
=
{()
=>
this
.
handelCalculation
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
thr_num_btn
,
styles
.
thr_btn_left
]}
>
<
Image
source
=
{
require
(
'../../../images/less_icon_big.png'
)}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity
>
)
:
null
}
{
listItem
[
calField
]
&&
!
onlyShowSelect
?
(
<
Text
style
=
{[
styles
.
thr_num
,
onlyShowNum
?
styles
.
show_num
:
null
]}
>
{
listItem
[
calField
]}
<
/Text
>
)
:
null
}
{
!
onlyShowNum
&&
!
onlyShowSelect
&&
showPlusIcon
?
(
<
TouchableOpacity
activeOpacity
=
{
0.9
}
style
=
{[
styles
.
btn_inner
,
listStyleCalBtn
]}
onPress
=
{()
=>
this
.
handelCalculation
(
listItem
,
listIndex
,
true
)}
>
<
View
style
=
{[
styles
.
thr_num_btn
,
styles
.
thr_btn_right
]}
>
<
Image
source
=
{
calIcon
}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity
>
)
:
null
}
{
onlyShowSelect
?
(
<
TouchableOpacity
activeOpacity
=
{
0.9
}
style
=
{[
styles
.
btn_sel_inner
]}
onPress
=
{()
=>
this
.
handelSelectCheck
(
listItem
,
listIndex
)}
>
<
View
style
=
{[
styles
.
thr_sel_btn
]}
>
<
Image
source
=
{
defSelIcon
}
style
=
{
icon_style
}
><
/Image
>
<
/View
>
<
/TouchableOpacity
>
)
:
null
}
<
/View
>
)}
<
/View
>
)
}
}
const
styles
=
StyleSheet
.
create
({
ri_inner
:
{
flexDirection
:
'row'
,
justifyContent
:
'space-between'
,
alignItems
:
'center'
,
paddingTop
:
16
,
paddingBottom
:
12
,
borderBottomWidth
:
1
,
borderColor
:
'rgba(241, 241, 241, 0.87)'
},
ri_text_box
:
{
flex
:
1
},
ri_te_ot
:
{
fontSize
:
third_text_size
,
color
:
third_text_color
,
fontFamily
:
font_family_regular
,
paddingBottom
:
2
},
oth_box
:
{
paddingBottom
:
2
},
thr_ot
:
{
fontFamily
:
font_family_medium
,
fontSize
:
second_text_size
,
color
:
list_tit_color
,
paddingBottom
:
4
},
te_ot_str
:
{
fontFamily
:
font_family_semibold
,
color
:
list_str_color
},
te_ot_one
:
{
color
:
list_one_color
},
te_ot_two
:
{
color
:
list_one_color
},
te_ot_thr
:
{
color
:
list_thr_color
},
te_ot_main
:
{
color
:
list_one_light_color
},
oth_img_box
:
{
width
:
pxSize
(
58
),
height
:
pxSize
(
58
),
justifyContent
:
'center'
,
alignItems
:
'center'
,
marginRight
:
3
,
padding
:
3
},
round_pic
:
{
borderColor
:
'rgba(0, 0, 0, 0.12)'
,
borderWidth
:
.
5
,
borderRadius
:
50
,
},
square_pic
:
{},
rectan_pic
:
{
width
:
pxSize
(
60
),
height
:
pxSize
(
40
),
},
thr_num_btn
:
{
width
:
pxSize
(
24
),
height
:
pxSize
(
30
)
},
thr_sel_btn
:
{
width
:
pxSize
(
22
),
height
:
pxSize
(
22
)
},
btn_inner
:
{},
btn_sel_inner
:
{},
btn_cle_box
:
{
marginRight
:
3
,
paddingHorizontal
:
4
,
paddingVertical
:
4
},
btn_clear_inner
:
{},
icon_cle_btn
:
{
width
:
pxSize
(
22
),
height
:
pxSize
(
22
)
},
ri_num_box
:
{
flexDirection
:
'row'
,
alignItems
:
'center'
,
marginLeft
:
3
,
backgroundColor
:
home_background_color
},
show_num_box
:
{
backgroundColor
:
null
},
thr_btn_left
:
{},
thr_btn_right
:
{},
thr_num
:
{
minWidth
:
pxSize
(
28
),
textAlign
:
'center'
,
fontFamily
:
font_family_regular
,
fontSize
:
14
,
color
:
first_text_color
},
show_num
:
{
fontSize
:
18
}
ri_inner
:
{
flexDirection
:
'row'
,
justifyContent
:
'space-between'
,
alignItems
:
'center'
,
paddingTop
:
16
,
paddingBottom
:
12
,
borderBottomWidth
:
1
,
borderColor
:
'rgba(241, 241, 241, 0.87)'
,
},
ri_text_box
:
{
flex
:
1
,
},
ri_te_ot
:
{
fontSize
:
third_text_size
,
color
:
third_text_color
,
fontFamily
:
font_family_regular
,
paddingBottom
:
2
,
},
oth_box
:
{
paddingBottom
:
2
,
},
thr_ot
:
{
fontFamily
:
font_family_medium
,
fontSize
:
second_text_size
,
color
:
list_tit_color
,
paddingBottom
:
4
,
},
te_ot_str
:
{
fontFamily
:
font_family_semibold
,
color
:
list_str_color
,
},
te_ot_one
:
{
color
:
list_one_color
,
},
te_ot_two
:
{
color
:
list_one_color
,
},
te_ot_thr
:
{
color
:
list_thr_color
,
},
te_ot_main
:
{
color
:
list_one_light_color
,
},
oth_img_box
:
{
width
:
pxSize
(
58
),
height
:
pxSize
(
58
),
justifyContent
:
'center'
,
alignItems
:
'center'
,
marginRight
:
3
,
padding
:
3
,
},
round_pic
:
{
borderColor
:
'rgba(0, 0, 0, 0.12)'
,
borderWidth
:
0
.5
,
borderRadius
:
50
,
},
square_pic
:
{},
rectan_pic
:
{
width
:
pxSize
(
60
),
height
:
pxSize
(
40
),
},
thr_num_btn
:
{
width
:
pxSize
(
24
),
height
:
pxSize
(
30
),
},
thr_sel_btn
:
{
width
:
pxSize
(
22
),
height
:
pxSize
(
22
),
},
btn_inner
:
{},
btn_sel_inner
:
{},
btn_cle_box
:
{
marginRight
:
3
,
paddingHorizontal
:
4
,
paddingVertical
:
4
,
},
btn_clear_inner
:
{},
icon_cle_btn
:
{
width
:
pxSize
(
22
),
height
:
pxSize
(
22
),
},
ri_num_box
:
{
flexDirection
:
'row'
,
alignItems
:
'center'
,
marginLeft
:
3
,
backgroundColor
:
home_background_color
,
},
show_num_box
:
{
backgroundColor
:
null
,
},
thr_btn_left
:
{},
thr_btn_right
:
{},
thr_num
:
{
minWidth
:
pxSize
(
28
),
textAlign
:
'center'
,
fontFamily
:
font_family_regular
,
fontSize
:
14
,
color
:
first_text_color
,
},
show_num
:
{
fontSize
:
18
,
},
})
const
mapStateToProps
=
(
state
)
=>
{
return
{
global_domain_config
:
state
.
login
.
global_domain_config
}
const
mapStateToProps
=
state
=>
{
return
{
global_domain_config
:
state
.
login
.
global_domain_config
,
}
}
const
mapDispatchToProps
=
(
dispatch
)
=>
{
return
{
// exitLoginStatus: () => {
// dispatch(exitLoginStatus())
// },
}
const
mapDispatchToProps
=
dispatch
=>
{
return
{
// exitLoginStatus: () => {
// dispatch(exitLoginStatus())
// },
}
}
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
PicTitDetaiCalcu
)
;
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
PicTitDetaiCalcu
)
app/containers/selfOrder/module/ChooseProductPage.js
View file @
e09dbcef
This diff could not be displayed because it is too large.
app/containers/selfOrder/module/SearchPage.js
0 → 100644
View file @
e09dbcef
import
React
,
{
Component
}
from
'react'
import
{
icon_style
,
list_common_item
,
safe_view
,
foundation_color
}
from
'../../../base/BaseStyle'
import
{
View
,
StyleSheet
,
Image
,
TextInput
,
SafeAreaView
,
ScrollView
,
FlatList
}
from
'react-native'
import
HeadBackItem
from
'../../common/HeadBackItem'
import
{
PicListNoData
}
from
'../../common/CellTextStyle'
import
PicTitDetaiCalcu
from
'../../common/listDataComponent/PicTitDetaiCalcu'
import
LocalVariable
from
'../../common/LocalVariable'
import
{
reqGlobalSearch
,
reqSingleConsumSearch
,
reqProCategorySearch
}
from
'../../../action/SelfAction'
import
ChooseCardList
from
'../../common/listDataComponent/ChooseCardList'
import
{
connect
}
from
'react-redux'
import
{
cloneObject
}
from
'../../../utils/Utils'
// import ChooseCardList from '../../common/listDataComponent/ChooseCardList';
import
LoadingModel
from
'../../common/listDataComponent/LoadingModel'
import
{
Width
}
from
'../../../base/BaseStyle'
class
SearchPage
extends
Component
{
constructor
(
props
)
{
super
(
props
)
this
.
state
=
{
defalutLeftItem
:
[
{
category_code
:
LocalVariable
.
SURGICAL_TEMPLATE
,
category_name
:
'手术套包'
,
cate_local_icon
:
require
(
'../../../images/surg_temp.png'
),
},
{
category_code
:
LocalVariable
.
NAIL_BOX
,
category_name
:
'钉盒'
,
cate_local_icon
:
require
(
'../../../images/screw_box.png'
),
},
{
category_code
:
LocalVariable
.
EQUIPMENT_BAG
,
category_name
:
'器械包'
,
cate_local_icon
:
require
(
'../../../images/equip_bag.png'
),
},
{
category_code
:
LocalVariable
.
SCATTERED_EQUIPMENT
,
category_name
:
'零散器械'
,
cate_local_icon
:
require
(
'../../../images/auxili_tool.png'
),
},
],
searchValue
:
'金属脊柱'
,
dataList
:
[],
topActiveIndex
:
0
,
}
}
componentDidMount
()
{
this
.
getSearchData
()
}
// 获取搜索数据
async
getSearchData
()
{
const
{
navigation
,
global_domain_config
,
token
}
=
this
.
props
const
{
topActiveIndex
,
searchValue
}
=
this
.
state
const
{
selfData
,
topProcOptionList
}
=
navigation
.
state
.
params
const
{
authorizations
}
=
selfData
const
productLineCategory
=
authorizations
?.
product_line_category_list
?.
map
(
item
=>
item
.
product_line_category_code
)
?.
join
(
','
)
console
.
log
(
'topProcOptionList'
,
topProcOptionList
[
topActiveIndex
])
const
params
=
{
accessToken
:
token
,
orgCode
:
selfData
.
org_code
,
manufacturerCode
:
topProcOptionList
[
topActiveIndex
].
supplier_code
,
productLineCategory
,
keyword
:
encodeURIComponent
(
searchValue
),
// pageSize: 9999,
}
this
.
refs
.
LoadingModel
.
show
()
const
single_all_search
=
await
reqGlobalSearch
(
global_domain_config
,
JSON
.
parse
(
JSON
.
stringify
(
params
)))
this
.
refs
.
LoadingModel
.
hide
()
console
.
log
(
'single_all_search'
,
single_all_search
)
this
.
setState
({
dataList
:
single_all_search
?.
data
?.
item
?
single_all_search
?.
data
?.
item
:
[],
})
}
// 获取搜索到的类目
async
getLeftOptionList
(
item
)
{
const
{
navigation
,
global_domain_config
,
token
}
=
this
.
props
const
{
topProcOptionList
}
=
navigation
.
state
.
params
const
{
defalutLeftItem
,
topActiveIndex
}
=
this
.
state
const
params
=
{
access_token
:
token
,
manufacturer_code
:
topProcOptionList
[
topActiveIndex
].
supplier_code
,
}
console
.
log
(
'params='
,
params
)
this
.
refs
.
LoadingModel
.
show
()
const
pro_scate_search
=
await
reqProCategorySearch
(
global_domain_config
,
params
)
this
.
refs
.
LoadingModel
.
hide
()
console
.
log
(
'res_2 : '
,
pro_scate_search
)
if
(
pro_scate_search
.
error_code
===
0
)
{
const
{
data
}
=
pro_scate_search
let
newData
=
defalutLeftItem
.
concat
(
data
.
item
)
// 记录找到的菜单的index
let
index
=
-
1
newData
=
newData
.
map
((
ele
,
i
)
=>
{
let
selectedQuantity
=
ele
[
LocalVariable
.
SELECTED_QUQNTITY
]
||
0
if
(
ele
.
category_code
===
item
.
big_category
.
category_code
)
{
index
=
i
selectedQuantity
+=
1
}
return
{
...
ele
,
[
LocalVariable
.
SELECTED_QUQNTITY
]:
selectedQuantity
,
[
LocalVariable
.
LOCAL_SECOND_DATA
]:
[],
}
})
return
Promise
.
resolve
({
newData
,
index
})
}
return
Promise
.
resolve
([])
}
// 获取搜索到的类目商品数据
async
getLocalSecondData
(
item
)
{
const
that
=
this
const
{
navigation
,
global_domain_config
,
token
}
=
this
.
props
const
{
topActiveIndex
}
=
this
.
state
const
{
topProcOptionList
,
selfData
}
=
navigation
.
state
.
params
let
params
=
{
access_token
:
token
,
category_code
:
item
.
big_category
.
category_code
,
manufacturer_code
:
topProcOptionList
[
topActiveIndex
].
supplier_code
,
org_code
:
selfData
.
org_code
,
// leftIndex: leftIndex, // 测试
}
console
.
log
(
'params='
,
params
)
this
.
refs
.
LoadingModel
.
show
()
const
single_all_search
=
await
reqSingleConsumSearch
(
global_domain_config
,
params
)
this
.
refs
.
LoadingModel
.
hide
()
console
.
log
(
'res_3 : '
,
single_all_search
)
if
(
single_all_search
.
error_code
===
0
)
{
const
{
data
}
=
single_all_search
const
{
details
,
items
}
=
data
if
(
details
)
{
const
newData
=
details
.
map
(
ele
=>
{
let
quantity
=
ele
[
LocalVariable
.
QUANTITY_FIELD
]
||
0
if
(
ele
.
item_code
===
item
.
item_code
)
{
quantity
+=
1
}
return
{
...
ele
,
[
LocalVariable
.
ONLY_TWO_LEVELS
]:
true
,
[
LocalVariable
.
QUANTITY_FIELD
]:
quantity
,
}
})
console
.
log
(
'res_3:newData'
,
newData
)
return
Promise
.
resolve
(
newData
)
}
else
if
(
items
)
{
// 如果是四层结构
const
newData
=
items
.
map
(
ele
=>
{
let
quantity
=
ele
[
LocalVariable
.
QUANTITY_FIELD
]
||
0
if
(
ele
.
category_code
===
item
.
middle_category
.
category_code
)
{
quantity
+=
1
console
.
log
(
'ele.length'
,
ele
.
details
.
length
)
}
return
{
...
ele
,
[
LocalVariable
.
QUANTITY_FIELD
]:
quantity
,
details
:
ele
.
details
.
map
(
ele1
=>
{
let
quantity1
=
ele1
[
LocalVariable
.
QUANTITY_FIELD
]
||
0
if
(
ele1
.
item_code
===
item
.
item_code
)
{
quantity1
+=
1
console
.
log
(
'item.item_code'
,
item
.
item_code
)
console
.
log
(
'ele1'
,
ele1
)
}
return
{
...
ele1
,
[
LocalVariable
.
ONLY_TWO_LEVELS
]:
true
,
[
LocalVariable
.
QUANTITY_FIELD
]:
quantity1
,
}
}),
}
})
return
Promise
.
resolve
(
newData
)
}
}
return
Promise
.
resolve
([])
}
// 把后台给的数据转成商品列表的格式,并添加数量
async
formatToTopProcOptionList
(
item
)
{
const
{
navigation
}
=
this
.
props
let
{
topProcOptionList
}
=
navigation
.
state
.
params
const
{
topActiveIndex
}
=
this
.
state
// 大类列表
let
{
leftOptionList
}
=
topProcOptionList
[
topActiveIndex
]
// 找搜索出来商品对应的大类
let
leftOptionListItem
=
leftOptionList
.
find
(
ele
=>
ele
.
category_code
===
item
.
big_category
?.
category_code
)
console
.
log
(
'leftOptionListItem'
,
leftOptionListItem
)
if
(
leftOptionListItem
)
{
console
.
log
(
'已存在'
)
// 如果大类已存在
leftOptionListItem
[
'selectedQuantity'
]
+=
1
// 找耗材
let
localSecondDataItem
=
leftOptionListItem
.
localSecondData
?.
find
(
ele
=>
{
if
(
ele
.
item_code
===
item
.
item_code
)
{
return
true
}
// 找中类
if
(
ele
.
details
&&
item
.
middle_category
)
{
if
(
ele
.
category_code
===
item
.
middle_category
.
category_code
)
{
console
.
log
(
'ele.category_code'
,
ele
.
category_code
)
return
true
}
return
false
}
return
false
})
// 如果找到
if
(
localSecondDataItem
)
{
// 查找对应的产品 并添加数量、
const
{
details
}
=
localSecondDataItem
if
(
details
)
{
// 如果是4层
const
detail
=
details
.
find
(
ele
=>
ele
.
item_code
===
item
.
item_code
)
detail
[
LocalVariable
.
QUANTITY_FIELD
]
+=
1
}
// 一般情况
localSecondDataItem
[
LocalVariable
.
QUANTITY_FIELD
]
+=
1
}
else
{
// 如果找不到对应的产品
const
localSecondData
=
await
this
.
createLocalSecondData
(
item
)
leftOptionListItem
.
localSecondData
=
localSecondData
console
.
log
(
'localSecondDataItem'
,
localSecondDataItem
)
}
}
else
{
// 如果找不到当前商品大类,代表大类列表未加载
// 搜索出所有大类,并加入
leftOptionList
=
await
this
.
createLeftOptionList
(
item
)
console
.
log
(
'leftOptionList'
,
leftOptionList
)
}
topProcOptionList
[
topActiveIndex
]
=
{
...
topProcOptionList
[
topActiveIndex
],
[
LocalVariable
.
SELECTED_QUQNTITY
]:
topProcOptionList
[
topActiveIndex
][
LocalVariable
.
SELECTED_QUQNTITY
]
+
1
,
leftOptionList
:
leftOptionList
.
map
(
ele
=>
{
const
childrenLineData
=
this
.
getChildrenLineData
(
ele
.
localSecondData
)
console
.
log
(
'selectedDataArr'
,
childrenLineData
)
return
{
...
ele
,
[
LocalVariable
.
SELECTED_DATA_ARR
]:
childrenLineData
,
}
}),
}
return
Promise
.
resolve
(
topProcOptionList
)
}
// 创建大类
async
createLeftOptionList
(
item
)
{
// 获取该厂家下所有大类
let
{
newData
:
newLeftOptionList
,
index
}
=
await
this
.
getLeftOptionList
(
item
)
console
.
log
(
'newLeftOptionList'
,
newLeftOptionList
)
const
localSecondData
=
await
this
.
getLocalSecondData
(
item
)
newLeftOptionList
[
index
]
=
{
...
newLeftOptionList
[
index
],
localSecondData
,
}
console
.
log
(
'newLeftOptionList_index'
,
newLeftOptionList
[
index
])
return
Promise
.
resolve
(
newLeftOptionList
)
}
// 统计后塞入购物车
getChildrenLineData
=
data
=>
{
console
.
log
(
'getChildrenLineData'
,
data
)
return
data
.
filter
(
item
=>
item
.
quantity
>
0
)
}
// 返回每一列元素
renderContColumnItem
(
item
,
index
)
{
const
{
navigation
}
=
this
.
props
const
{
setTopProcOptionListCallBack
}
=
navigation
.
state
.
params
return
(
<
SafeAreaView
style
=
{
styles
.
column_container
}
key
=
{
'item_code'
+
index
}
>
<
PicTitDetaiCalcu
listItem
=
{
item
}
listIndex
=
{
index
}
calField
=
{
LocalVariable
.
QUANTITY_FIELD
}
subCalCallBack
=
{(
item
,
idx
)
=>
{}}
titText
=
{
'manufacturer_product_code'
}
tipTextStr
=
{
'item_name'
}
tipTextOne
=
{
'general_name'
}
tipTextTwo
=
{
'specification'
}
titTextTit
=
{
'厂家产品代码'
}
tipTextStrTit
=
{
'物料名称'
}
tipTextOneTit
=
{
'通用名称'
}
tipTextTwoTit
=
{
'规格型号'
}
listImgIcon
=
{
'photos'
}
plusCallBack
=
{(
item
,
index
)
=>
{
setTopProcOptionListCallBack
(
this
.
formatToTopProcOptionList
(
item
).
then
(
data
=>
{
this
.
props
.
navigation
.
goBack
()
return
Promise
.
resolve
(
data
)
}),
)
}}
// reduceCallBack={() => this.props.handleAllPlusReduce(item, index)}
/
>
<
/SafeAreaView
>
)
}
handleTopNav
(
topItem
,
topActiveIndex
)
{
this
.
setState
(
{
topActiveIndex
,
},
()
=>
{
this
.
getSearchData
()
},
)
}
inputSearchValue
(
text
)
{
this
.
setState
({
searchValue
:
text
},
()
=>
{
this
.
getSearchData
()
})
}
render
()
{
const
{
navigation
}
=
this
.
props
const
{
title
,
topProcOptionList
}
=
navigation
.
state
.
params
const
{
dataList
,
topActiveIndex
}
=
this
.
state
const
cur_icon
=
'supplier_icon'
console
.
log
(
'dataList'
,
dataList
)
return
(
<
SafeAreaView
style
=
{
safe_view
}
>
<
HeadBackItem
title
=
{
title
}
navigation
=
{
navigation
}
/
>
<
View
style
=
{
list_common_item
.
ser_cont
}
>
<
TextInput
placeholder
=
{
'请输入搜索关键词'
}
style
=
{
list_common_item
.
ser_text_input
}
// defaultValue={this.state.searchValue}
onChangeText
=
{
text
=>
this
.
inputSearchValue
(
text
)}
/
>
<
View
style
=
{
list_common_item
.
ser_img_box
}
>
<
Image
source
=
{
require
(
'../../../images/search_icon.png'
)}
style
=
{
icon_style
}
/
>
<
/View
>
<
/View
>
<
ChooseCardList
cardStyleBox
=
{
styles
.
chooseCardList_box
}
cardScrollEnabled
=
{
true
}
cardHorizontal
=
{
true
}
cardShowsHorizontalScrollIndicator
=
{
false
}
cardStyleListItem
=
{
styles
.
top_inner
}
cardListOptions
=
{
topProcOptionList
}
// cardItemTitle={cur_title}
cardItemIcon
=
{
cur_icon
}
curActIndex
=
{
topActiveIndex
}
cardCallBack
=
{(
item
,
index
)
=>
this
.
handleTopNav
(
item
,
index
)}
cardCountName
=
{
LocalVariable
.
SELECTED_QUQNTITY
}
cardStyleType
=
{
'GRAPHICS'
}
cardCouStyle
=
{
styles
.
top_cot_num
}
cardShowDefIcon
=
{
true
}
/
>
<
ScrollView
showsVerticalScrollIndicator
=
{
false
}
>
{
dataList
.
length
>
0
?
(
<
FlatList
keyExtractor
=
{
item
=>
item
.
id
}
data
=
{
dataList
}
extraData
=
{
this
.
state
}
renderItem
=
{({
item
,
index
})
=>
this
.
renderContColumnItem
(
item
,
index
)}
/
>
)
:
(
<
PicListNoData
/>
)}
<
/ScrollView
>
<
LoadingModel
ref
=
"LoadingModel"
/>
<
/SafeAreaView
>
)
}
}
const
styles
=
StyleSheet
.
create
({
top_box
:
{
width
:
Width
(),
paddingHorizontal
:
20
,
paddingTop
:
12
,
},
chooseCardList_box
:
{
width
:
Width
(),
height
:
58
,
backgroundColor
:
foundation_color
,
paddingHorizontal
:
20
,
paddingTop
:
12
,
borderBottomColor
:
'#F4F4F4'
,
borderBottomWidth
:
1
,
},
top_inner
:
{
borderBottomColor
:
foundation_color
,
minWidth
:
60
,
paddingBottom
:
10
,
},
top_cot_num
:
{
right
:
8
,
},
column_container
:
{
marginBottom
:
10
,
paddingHorizontal
:
10
,
paddingVertical
:
6
,
backgroundColor
:
foundation_color
,
},
})
// export default SearchPage
const
mapStateToProps
=
state
=>
{
return
{
userInfo
:
state
.
login
.
userInfo
,
token
:
state
.
login
.
token
,
loginState
:
state
.
login
.
loginState
,
global_domain_config
:
state
.
login
.
global_domain_config
,
local_sele_pro_options
:
state
.
selfOrder
.
local_sele_pro_options
,
}
}
export
default
connect
(
mapStateToProps
)(
SearchPage
)
lhc
@lhc
mentioned in commit
4b2389b1
Apr 18, 2022
mentioned in commit
4b2389b1
mentioned in commit 4b2389b1e49a9f4523a6541642241f5d77c1bcf0
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment