Commit feec315a by peii

Merge branch 'develop' into product

parents 8145d1cb 84708222
...@@ -42,6 +42,12 @@ import DirectionInvoice from '../src/pages/invoice/direct' ...@@ -42,6 +42,12 @@ import DirectionInvoice from '../src/pages/invoice/direct'
import DirectionInvoiceCollections from '../src/pages/invoice/direct/collections' import DirectionInvoiceCollections from '../src/pages/invoice/direct/collections'
import DirectionInvoiceApplyDetail from '../src/pages/invoice/direct/detail' import DirectionInvoiceApplyDetail from '../src/pages/invoice/direct/detail'
// 混单消耗
import MixConsume from '../src/pages/mix_consume'
import MixConsumeForm from '../src/pages/mix_consume/form'
import MixConsumeItems from '../src/pages/mix_consume/consumeItems'
import ConsumeFee from '../src/pages/consume/fee'
const Router = createAppContainer( const Router = createAppContainer(
createStackNavigator( createStackNavigator(
{ {
...@@ -79,6 +85,10 @@ const Router = createAppContainer( ...@@ -79,6 +85,10 @@ const Router = createAppContainer(
DirectionInvoice: { screen: DirectionInvoice }, DirectionInvoice: { screen: DirectionInvoice },
DirectionInvoiceCollections: { screen: DirectionInvoiceCollections }, DirectionInvoiceCollections: { screen: DirectionInvoiceCollections },
DirectionInvoiceApplyDetail: { screen: DirectionInvoiceApplyDetail }, DirectionInvoiceApplyDetail: { screen: DirectionInvoiceApplyDetail },
ConsumeFee: { screen: ConsumeFee },
MixConsume: { screen: MixConsume },
MixConsumeForm: { screen: MixConsumeForm },
MixConsumeItems: { screen: MixConsumeItems },
}, },
{ {
navigationOptions: { navigationOptions: {
......
...@@ -10,12 +10,13 @@ import { ...@@ -10,12 +10,13 @@ import {
SET_VERSION_APK, SET_VERSION_APK,
SET_DOMAIN_FROM_ORIGIN, SET_DOMAIN_FROM_ORIGIN,
SET_SYSPROFILE, SET_SYSPROFILE,
SET_SYSVALUESET,
SET_NAVIGATION, SET_NAVIGATION,
SET_ORGANIZATION SET_ORGANIZATION
} from '../base/ActionTypes'; } from '../base/ActionTypes';
import { GetRequest, PostRequest } from '../network/RequestUtils'; import { GetRequest, PostRequest } from '../network/RequestUtils';
import { getUrlParams, show, showWarnErrorMessage, showErrorMessage, isNotBlank } from '../utils/Utils'; import { getUrlParams, show, showWarnErrorMessage, showErrorMessage, isNotBlank } from '../utils/Utils';
import { originSysProfiles } from '../reducers/module/login'; import { originSysProfiles, originSysValueSets } from '../reducers/module/login';
export function requestLogin(params) { export function requestLogin(params) {
return (dispatch, getState) => { return (dispatch, getState) => {
...@@ -28,6 +29,7 @@ export function requestLogin(params) { ...@@ -28,6 +29,7 @@ export function requestLogin(params) {
show('登录成功'); show('登录成功');
dispatch(loginSuccess(res, params.data.user_name, params.data.user_password)); dispatch(loginSuccess(res, params.data.user_name, params.data.user_password));
dispatch(getSysProfiles()) dispatch(getSysProfiles())
dispatch(getSysValueSets())
} else { } else {
show(`当前用户没有菜单权限,\n请联系管理员配置!`) show(`当前用户没有菜单权限,\n请联系管理员配置!`)
dispatch(loginFailure()) dispatch(loginFailure())
...@@ -190,6 +192,26 @@ export function getSysProfiles() { ...@@ -190,6 +192,26 @@ export function getSysProfiles() {
} }
} }
export function getSysValueSets() {
return (dispatch, getState) => {
let {global_domain_config, token } = getState().login
const getSysValueSet = (code) => {
const params = {
access_token: token,
value_set_code: code
}
requestSysValueSet(global_domain_config, params).then(res => {
console.log(code, res)
const value = R.pathOr(originSysValueSets[code], ['data', 'sys_values'])(res)
dispatch(setSysValueSets(code, value))
})
}
R.compose(R.map(getSysValueSet), R.keys)(originSysValueSets)
}
}
/** /**
* @description: 设置系统配置 * @description: 设置系统配置
* @param {*} code * @param {*} code
...@@ -204,6 +226,14 @@ export function setSysProfiles(code, value) { ...@@ -204,6 +226,14 @@ export function setSysProfiles(code, value) {
} }
} }
function setSysValueSets(code, value) {
return {
type: SET_SYSVALUESET,
code,
value
}
}
/** /**
* @description: 设置路由 * @description: 设置路由
* @param {*} navigation * @param {*} navigation
......
/*
* @FilePath: /BoneHouse_Business_APP/app/action/MixConsumeAction.js
* @Author: PEII
* @Date: 2022-08-04 17:49:19
* @LastEditTime: 2022-08-04 18:01:55
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 混单消耗Action
*/
import { SET_MIX_CONSUME_ORDERS } from '../base/ActionTypes'
export const setOrders = list => {
return {
type: SET_MIX_CONSUME_ORDERS,
payload: list,
}
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @FilePath: /BoneHouse_Business_APP/app/base/ActionTypes.js * @FilePath: /BoneHouse_Business_APP/app/base/ActionTypes.js
* @Author: peii * @Author: peii
* @Date: 2022-01-04 10:18:02 * @Date: 2022-01-04 10:18:02
* @LastEditTime: 2022-01-11 21:06:24 * @LastEditTime: 2022-10-12 17:41:42
* @LastEditors: PEII * @LastEditors: PEII
* @Vision: 1.0 * @Vision: 1.0
* @Description: * @Description:
...@@ -20,6 +20,7 @@ export const SET_DOMAIN_FROM_ORIGIN = 'SET_DOMAIN_FROM_ORIGIN' ...@@ -20,6 +20,7 @@ export const SET_DOMAIN_FROM_ORIGIN = 'SET_DOMAIN_FROM_ORIGIN'
export const SET_VERSION_APK="SET_VERSION_APK" export const SET_VERSION_APK="SET_VERSION_APK"
export const GET_SYSPROFILE = "GET_SYSPROFILE" export const GET_SYSPROFILE = "GET_SYSPROFILE"
export const SET_SYSPROFILE = "SET_SYSPROFILE" export const SET_SYSPROFILE = "SET_SYSPROFILE"
export const SET_SYSVALUESET = "SET_SYSVALUESET"
export const SET_NAVIGATION = "SET_NAVIGATION" export const SET_NAVIGATION = "SET_NAVIGATION"
export const SET_ORGANIZATION = "SET_ORGANIZATION" export const SET_ORGANIZATION = "SET_ORGANIZATION"
//-----------self order--------------------- //-----------self order---------------------
...@@ -82,4 +83,7 @@ export const DEVICE_INFORMATION_UPDATE_FAILURE = "DEVICE_INFORMATION_UPDATE_FAIL ...@@ -82,4 +83,7 @@ export const DEVICE_INFORMATION_UPDATE_FAILURE = "DEVICE_INFORMATION_UPDATE_FAIL
//-----------settlement information--------------------- //-----------settlement information---------------------
export const SET_SETTLEMENT_STATUS = 'SET_SETTLEMENT_STATUS' export const SET_SETTLEMENT_STATUS = 'SET_SETTLEMENT_STATUS'
export const SET_INVOICE_STATUS = 'SET_INVOICE_STATUS' export const SET_INVOICE_STATUS = 'SET_INVOICE_STATUS'
export const SET_AR_INVOICE_STATUS = 'SET_AR_INVOICE_STATUS' export const SET_AR_INVOICE_STATUS = 'SET_AR_INVOICE_STATUS'
\ No newline at end of file
//----------- mix consume order ---------------------
export const SET_MIX_CONSUME_ORDERS = 'SET_MIX_CONSUME_ORDERS'
\ No newline at end of file
...@@ -67,7 +67,7 @@ class BarCodePage extends Component { ...@@ -67,7 +67,7 @@ class BarCodePage extends Component {
typeName: typeName, typeName: typeName,
typeValue: data typeValue: data
} }
navigate(supPage.pageName, { barCodeData, title: supPage.title }) navigate(supPage.pageName, { barCodeData, title: supPage.title, _t: Date.now() })
} }
} }
......
...@@ -41,6 +41,11 @@ class HomePage extends Component { ...@@ -41,6 +41,11 @@ class HomePage extends Component {
title: '消耗确认', title: '消耗确认',
page: 'EquipConsuPage', page: 'EquipConsuPage',
}, },
MOBILE_MIX_CONSUME: {
icon: require('../../images/equip_consu.png'),
title: '报单消耗',
page: 'MixConsume',
},
MOBILE_SELF_HELP_ORDER: { MOBILE_SELF_HELP_ORDER: {
icon: require('../../images/self_order.png'), icon: require('../../images/self_order.png'),
title: '自助下单', title: '自助下单',
......
import React, { Component } from 'react' import React, { Component } from 'react'
import { ActionSheet } from '@ant-design/react-native'
import { View, Text, Modal, SafeAreaView, TextInput, StyleSheet, TouchableOpacity } from 'react-native' import { View, Text, Modal, SafeAreaView, TextInput, StyleSheet, TouchableOpacity } from 'react-native'
import { import {
safe_view, safe_view,
......
...@@ -133,9 +133,17 @@ class ChooseProductPage extends Component { ...@@ -133,9 +133,17 @@ class ChooseProductPage extends Component {
handleGoBack() { handleGoBack() {
let { topProcOptionList, originManufacterList } = this.state let { topProcOptionList, originManufacterList } = this.state
let { setSelectProductOpts } = this.props let { setSelectProductOpts } = this.props
setSelectProductOpts(originManufacterList)
console.log('originManufacterList', originManufacterList) const res = R.map(item => {
this.props.navigation.state.params.productCallBack(originManufacterList) const topItem = R.find(R.propEq('supplier_code', item.supplier_code))(topProcOptionList)
if (isNotBlank(topItem)) {
item = R.mergeDeepLeft(topItem, item)
}
return item
})(originManufacterList)
setSelectProductOpts(res)
this.props.navigation.state.params.productCallBack(res)
this.props.navigation.goBack() this.props.navigation.goBack()
} }
...@@ -874,6 +882,7 @@ class ChooseProductPage extends Component { ...@@ -874,6 +882,7 @@ class ChooseProductPage extends Component {
// if (leftActiveIndex) { // if (leftActiveIndex) {
return ( return (
<TouchableOpacity <TouchableOpacity
activeOpacity={1}
onPress={() => { onPress={() => {
navigation.navigate('SearchPage', { navigation.navigate('SearchPage', {
title: `选择产品`, title: `选择产品`,
......
...@@ -18,9 +18,9 @@ import LocalVariable from '../../common/LocalVariable' ...@@ -18,9 +18,9 @@ import LocalVariable from '../../common/LocalVariable'
import { reqGlobalSearch, reqSingleConsumSearch, reqProCategorySearch } from '../../../action/SelfAction' import { reqGlobalSearch, reqSingleConsumSearch, reqProCategorySearch } from '../../../action/SelfAction'
import ChooseCardList from '../../common/listDataComponent/ChooseCardList' import ChooseCardList from '../../common/listDataComponent/ChooseCardList'
import { connect } from 'react-redux' import { connect } from 'react-redux'
// import ChooseCardList from '../../common/listDataComponent/ChooseCardList'; import StatusBarView from '../../common/StatusBarView'
import LoadingModel from '../../common/listDataComponent/LoadingModel' import LoadingModel from '../../common/listDataComponent/LoadingModel'
import { Width } from '../../../base/BaseStyle' import { Width, home_background_color, promary_color } from '../../../base/BaseStyle'
import { show } from '../../../utils/Utils' import { show } from '../../../utils/Utils'
import * as R from 'ramda' import * as R from 'ramda'
class SearchPage extends Component { class SearchPage extends Component {
...@@ -113,10 +113,13 @@ class SearchPage extends Component { ...@@ -113,10 +113,13 @@ class SearchPage extends Component {
const { selfData, topProcOptionList } = navigation.state.params const { selfData, topProcOptionList } = navigation.state.params
const { authorizations } = selfData const { authorizations } = selfData
const productLineCategory = authorizations?.product_line_category_list const productLineCategory = R.compose(
?.map(item => item.product_line_category_code) R.join(','),
?.join(',') R.pluck('product_line_category_code'),
console.log('topProcOptionList', topProcOptionList[topActiveIndex]) R.unnest,
R.pluck('product_line_category_list'),
)(authorizations || [])
const params = { const params = {
accessToken: token, accessToken: token,
orgCode: selfData.org_code, orgCode: selfData.org_code,
...@@ -130,6 +133,7 @@ class SearchPage extends Component { ...@@ -130,6 +133,7 @@ class SearchPage extends Component {
this.refs.LoadingModel.hide() this.refs.LoadingModel.hide()
console.log('single_all_search', single_all_search) console.log('single_all_search', single_all_search)
const oldData = data.item const oldData = data.item
this.setState({ this.setState({
data: { data: {
...single_all_search?.data, ...single_all_search?.data,
...@@ -326,6 +330,7 @@ class SearchPage extends Component { ...@@ -326,6 +330,7 @@ class SearchPage extends Component {
show('添加成功') show('添加成功')
}, },
) )
console.log(JSON.stringify(topProcOptionList));
return Promise.resolve(topProcOptionList) return Promise.resolve(topProcOptionList)
} }
...@@ -403,66 +408,74 @@ class SearchPage extends Component { ...@@ -403,66 +408,74 @@ class SearchPage extends Component {
console.log('dataList', data.item) console.log('dataList', data.item)
return ( return (
<SafeAreaView style={safe_view}> <View style={styles.container}>
<HeadBackItem title={title} navigation={navigation} /> <StatusBarView isReactStackNavigator={true} backgroundColor={promary_color} barStyle="light-content" />
<View style={list_common_item.ser_cont}>
<TextInput
placeholder={'请输入搜索关键词'}
style={list_common_item.ser_text_input}
onChangeText={text => this.inputSearchValue(text)}
/>
<View style={list_common_item.ser_btn}>
<TouchableOpacity
onPress={() => {
this.initData()
}}
>
<Text style={list_common_item.ser_text_btn}>搜索</Text>
</TouchableOpacity>
</View>
<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} onScrollEndDrag={this.onMomentumScrollEnd}> <View style={safe_view}>
{data.item.length > 0 && ( <HeadBackItem title={title} navigation={navigation} />
<FlatList <View style={list_common_item.ser_cont}>
keyExtractor={item => item.id} <TextInput
data={data.item} placeholder={'请输入搜索关键词'}
extraData={this.state} style={list_common_item.ser_text_input}
renderItem={({ item, index }) => this.renderContColumnItem(item, index)} onChangeText={text => this.inputSearchValue(text)}
/> />
)} <View style={list_common_item.ser_btn}>
{data.item.length === data.total && data?.item?.length > 0 && ( <TouchableOpacity
<View> onPress={() => {
<Text style={{ textAlign: 'center', lineHeight: 40 }}>没有更多数据了</Text> this.initData()
}}
>
<Text style={list_common_item.ser_text_btn}>搜索</Text>
</TouchableOpacity>
</View> </View>
)} <View style={list_common_item.ser_img_box}>
{!data?.item?.length && <PicListNoData />} <Image source={require('../../../images/search_icon.png')} style={icon_style} />
</ScrollView> </View>
<LoadingModel ref="LoadingModel" /> </View>
</SafeAreaView> <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} onScrollEndDrag={this.onMomentumScrollEnd}>
{data.item.length > 0 && (
<FlatList
keyExtractor={item => item.id}
data={data.item}
extraData={this.state}
renderItem={({ item, index }) => this.renderContColumnItem(item, index)}
/>
)}
{data.item.length === data.total && data?.item?.length > 0 && (
<View>
<Text style={{ textAlign: 'center', lineHeight: 40 }}>没有更多数据了</Text>
</View>
)}
{!data?.item?.length && <PicListNoData />}
</ScrollView>
<LoadingModel ref="LoadingModel" />
</View>
</View>
) )
} }
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: home_background_color,
},
top_box: { top_box: {
width: Width(), width: Width(),
paddingHorizontal: 20, paddingHorizontal: 20,
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* @FilePath: /BoneHouse_Business_APP/app/reducers/index.js * @FilePath: /BoneHouse_Business_APP/app/reducers/index.js
* @Author: peii * @Author: peii
* @Date: 2021-02-03 20:59:10 * @Date: 2021-02-03 20:59:10
* @LastEditTime: 2021-12-21 16:57:13 * @LastEditTime: 2022-08-04 17:36:19
* @LastEditors: peii * @LastEditors: PEII
* @Vision: 1.0 * @Vision: 1.0
* @Description: * @Description:
*/ */
...@@ -17,6 +17,7 @@ import histor from './module/histor'; ...@@ -17,6 +17,7 @@ import histor from './module/histor';
import trans from './module/trans'; import trans from './module/trans';
import deviceInfo from './module/deviceInfo'; import deviceInfo from './module/deviceInfo';
import settlement from './module/settlement'; import settlement from './module/settlement';
import mixConsume from './module/mixConsume';
const loginConfig = { const loginConfig = {
key: 'login', key: 'login',
...@@ -74,6 +75,13 @@ const settlementConfig = { ...@@ -74,6 +75,13 @@ const settlementConfig = {
blackList: [] blackList: []
} }
const mixConsumeConfig = {
key: 'mixConsume',
storage,
debug: false,
blackList: []
}
const rootReducer = { const rootReducer = {
login: persistReducer(loginConfig,login), login: persistReducer(loginConfig,login),
selfOrder: persistReducer(selfConfig,selfOrder), selfOrder: persistReducer(selfConfig,selfOrder),
...@@ -83,6 +91,7 @@ const rootReducer = { ...@@ -83,6 +91,7 @@ const rootReducer = {
trans: persistReducer(transConfig, trans), trans: persistReducer(transConfig, trans),
deviceInfo: persistReducer(deviceConfig, deviceInfo), deviceInfo: persistReducer(deviceConfig, deviceInfo),
settlement: persistReducer(settlementConfig, settlement), settlement: persistReducer(settlementConfig, settlement),
mixConsume: persistReducer(mixConsumeConfig, mixConsume),
} }
export default rootReducer; export default rootReducer;
\ No newline at end of file
...@@ -10,6 +10,7 @@ import { ...@@ -10,6 +10,7 @@ import {
SET_VERSION_APK, SET_VERSION_APK,
SET_DOMAIN_FROM_ORIGIN, SET_DOMAIN_FROM_ORIGIN,
SET_SYSPROFILE, SET_SYSPROFILE,
SET_SYSVALUESET,
SET_NAVIGATION, SET_NAVIGATION,
SET_ORGANIZATION SET_ORGANIZATION
} from '../../base/ActionTypes'; } from '../../base/ActionTypes';
...@@ -29,7 +30,11 @@ const defaultState = { ...@@ -29,7 +30,11 @@ const defaultState = {
OBS_SHOW_ORG_FLAG: 'Y', OBS_SHOW_ORG_FLAG: 'Y',
SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y', SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y',
SUR_MOBILE_INV_PRODUCT_LINE_CATEGORY_FLAG: 0, SUR_MOBILE_INV_PRODUCT_LINE_CATEGORY_FLAG: 0,
OBS_MOBILE_APP_TITLE: '骨科智慧仓' OBS_MOBILE_APP_TITLE: '骨科智慧仓',
OBS_MOBILE_CONSU_DEPARTMENT_DISPLAY: 'N',
},
sysValueSets: {
SUR_FEE_TYPE: []
}, },
organizations: [] organizations: []
} }
...@@ -39,9 +44,15 @@ export const originSysProfiles = { ...@@ -39,9 +44,15 @@ export const originSysProfiles = {
OBS_SHOW_ORG_FLAG: 'Y', OBS_SHOW_ORG_FLAG: 'Y',
SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y', SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y',
SUR_MOBILE_INV_PRODUCT_LINE_CATEGORY_FLAG: 0, SUR_MOBILE_INV_PRODUCT_LINE_CATEGORY_FLAG: 0,
OBS_MOBILE_APP_TITLE: '骨科智慧仓' OBS_MOBILE_APP_TITLE: '骨科智慧仓',
OBS_MOBILE_CONSU_DEPARTMENT_DISPLAY: 'N',
}
export const originSysValueSets = {
SUR_FEE_TYPE: []
} }
export default login = (state = defaultState, action) => { export default login = (state = defaultState, action) => {
switch (action.type) { switch (action.type) {
case LOGIN_DOING: case LOGIN_DOING:
...@@ -96,6 +107,13 @@ export default login = (state = defaultState, action) => { ...@@ -96,6 +107,13 @@ export default login = (state = defaultState, action) => {
[action.code]: action.value [action.code]: action.value
} }
}) })
case SET_SYSVALUESET:
return Object.assign({}, state, {
sysValueSets: {
...state.sysValueSets,
[action.code]: action.value
}
})
case SET_NAVIGATION: case SET_NAVIGATION:
return Object.assign({}, state, { return Object.assign({}, state, {
navigation: action.navigation navigation: action.navigation
......
/*
* @FilePath: /BoneHouse_Business_APP/app/reducers/module/mixConsume.js
* @Author: PEII
* @Date: 2022-08-04 17:28:07
* @LastEditTime: 2022-10-21 12:54:50
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 混单消耗
*/
import { SET_MIX_CONSUME_ORDERS } from '../../base/ActionTypes'
const initState = {
orders: [],
}
export default (state = initState, action) => {
switch (action.type) {
case SET_MIX_CONSUME_ORDERS:
return Object.assign({}, state, {
orders: action.payload,
})
default:
return state
}
}
...@@ -8,6 +8,7 @@ btn_sub_color = #007EFF // 按钮色 ...@@ -8,6 +8,7 @@ btn_sub_color = #007EFF // 按钮色
dis_sub_color = #BBBBBB // 禁用按钮色 dis_sub_color = #BBBBBB // 禁用按钮色
input_background_color = #efefef // 输入框底色 input_background_color = #efefef // 输入框底色
btn_color = #ffffff // 按钮字体颜色 btn_color = #ffffff // 按钮字体颜色
saperate_color = #fefefe
// 字体色 // 字体色
primary_text_color = #000000 // 主字颜色 primary_text_color = #000000 // 主字颜色
title_text_color = #ffffff // 标题颜色 title_text_color = #ffffff // 标题颜色
......
/*
* @FilePath: /BoneHouse_Business_APP/src/components/form/image.tsx
* @Author: PEII
* @Date: 2022-08-02 16:15:54
* @LastEditTime: 2022-10-27 11:02:31
* @LastEditors: PEII
* @Vision: 1.0
* @Description:
*/
// @ts-nocheck
import React, { Component } from 'react' import React, { Component } from 'react'
import { import { View, Text, Image, TouchableOpacity, ScrollView, Alert, Linking, Platform } from 'react-native'
View,
Text,
Image,
TouchableOpacity,
ScrollView,
Alert,
Linking,
Platform,
} from 'react-native'
import { IFormField, IOption } from 'bonehouse' import { IFormField, IOption } from 'bonehouse'
import * as R from 'ramda' import * as R from 'ramda'
import ImagePicker from 'react-native-image-picker' import ImagePicker from 'react-native-image-picker'
import Toast, { Positions } from 'react-native-root-toast' import Toast, { Positions } from 'react-native-root-toast'
import { isBlank, show, isRequired, isNotBlank, g } from '../../utils/utils' import { isBlank, show, isRequired, isNotBlank, g } from '../../utils/utils'
import styles from './image.styl' import styles from './image.styl'
// import Container from '../../inversify' import service from '../../services/service'
// import { TYPES } from '../../inversify/types'
// import Service from '../../services/service'
// const service: Service = Container.get(TYPES.Service)
type IProps = { type IProps = {
item: IFormField item: IFormField
...@@ -72,10 +69,7 @@ export default class ImageForm extends React.Component<IProps> { ...@@ -72,10 +69,7 @@ export default class ImageForm extends React.Component<IProps> {
if (res.error) { if (res.error) {
const errMsgs = ['Camera permissions not granted', 'Photo library permissions not granted'] const errMsgs = ['Camera permissions not granted', 'Photo library permissions not granted']
const errTips = [ const errTips = ['APP需要使用相机,请打开相机权限允许APP使用', 'APP需要使用相册,请打开相册权限允许APP使用']
'APP需要使用相机,请打开相机权限允许APP使用',
'APP需要使用相册,请打开相册权限允许APP使用',
]
for (const [idx, msg] of Object.entries(errMsgs)) { for (const [idx, msg] of Object.entries(errMsgs)) {
if (R.indexOf(res.error, msg) > -1) { if (R.indexOf(res.error, msg) > -1) {
...@@ -106,7 +100,7 @@ export default class ImageForm extends React.Component<IProps> { ...@@ -106,7 +100,7 @@ export default class ImageForm extends React.Component<IProps> {
formData.append('file', file) formData.append('file', file)
try { try {
const loading = Toast.show('上传中', { duration: 60000, position: Toast.positions.CENTER }) const loading = Toast.show('上传中', { duration: 60000, position: Toast.positions.CENTER })
// const result = await service.uploadImg(formData) const result = await service.uploadImg(formData)
Toast.hide(loading) Toast.hide(loading)
let value = this.props.value || [] let value = this.props.value || []
......
...@@ -66,11 +66,10 @@ ...@@ -66,11 +66,10 @@
&__multi &__multi
text-align left text-align left
width 100% width 100%
border-width 1px
border-color #ddd border-color #ddd
padding 10px padding 0px
border-radius 4px margin-top 15px
margin-top 10px flex 1
&-radio &-radio
flex 1 flex 1
......
...@@ -10,15 +10,7 @@ ...@@ -10,15 +10,7 @@
*/ */
// @ts-nocheck // @ts-nocheck
import React, { Component } from 'react' import React, { Component } from 'react'
import { import { View, Text, ScrollView, TouchableOpacity, ActivityIndicator, KeyboardAvoidingView } from 'react-native'
View,
Text,
ScrollView,
SafeAreaView,
TouchableOpacity,
ActivityIndicator,
KeyboardAvoidingView,
} from 'react-native'
import { IFormField } from 'bonehouse' import { IFormField } from 'bonehouse'
import * as R from 'ramda' import * as R from 'ramda'
import { FieldType } from '../../enums' import { FieldType } from '../../enums'
...@@ -58,7 +50,7 @@ export default class Form extends Component<IProps> { ...@@ -58,7 +50,7 @@ export default class Form extends Component<IProps> {
} }
componentDidMount() { componentDidMount() {
this.checkCanSubmit = debounce(this.checkCanSubmit.bind(this)) this.checkCanSubmit = debounce(this.checkSubmit.bind(this))
this.submitHandler = debounce(this.submitHandler.bind(this), 200) this.submitHandler = debounce(this.submitHandler.bind(this), 200)
} }
...@@ -82,7 +74,7 @@ export default class Form extends Component<IProps> { ...@@ -82,7 +74,7 @@ export default class Form extends Component<IProps> {
/** /**
* @description: 是否可以提交 * @description: 是否可以提交
*/ */
checkCanSubmit() { checkSubmit() {
const { fields, data } = this.props const { fields, data } = this.props
for (const item of fields) { for (const item of fields) {
if (isBlank(item.rules)) continue if (isBlank(item.rules)) continue
...@@ -90,15 +82,18 @@ export default class Form extends Component<IProps> { ...@@ -90,15 +82,18 @@ export default class Form extends Component<IProps> {
// 校验是否可以提交 // 校验是否可以提交
for (const rule of item.rules) { for (const rule of item.rules) {
if (rule.required && isBlank(data[item.field])) { if (rule.required && isBlank(data[item.field])) {
return this.setState({ canSubmit: false }) this.setState({ canSubmit: false })
return false
} }
if (rule.pattern && R.complement(R.test)(rule.pattern, data[item.field])) { if (rule.pattern && R.complement(R.test)(rule.pattern, data[item.field])) {
return this.setState({ canSubmit: false }) this.setState({ canSubmit: false })
return false
} }
} }
} }
this.setState({ canSubmit: true }) this.setState({ canSubmit: true })
return true
} }
/** /**
......
...@@ -40,10 +40,17 @@ export default class Input extends Component<IProps> { ...@@ -40,10 +40,17 @@ export default class Input extends Component<IProps> {
const { item, value, itemStyle } = this.props const { item, value, itemStyle } = this.props
return ( return (
<View style={[g(styles, { 'form-item': true, 'form-item-multi': item.multiline }), itemStyle]}> <TouchableOpacity
style={[g(styles, { 'form-item': true, 'form-item-multi': item.multiline }), itemStyle]}
activeOpacity={1}
onPress={() => {
this.inputRef.focus()
}}
>
<Title item={item} /> <Title item={item} />
<TextInput <TextInput
ref={ref => (this.inputRef = ref)}
style={g(styles, { style={g(styles, {
'form-input': true, 'form-input': true,
'form-text-input': true, 'form-text-input': true,
...@@ -53,13 +60,14 @@ export default class Input extends Component<IProps> { ...@@ -53,13 +60,14 @@ export default class Input extends Component<IProps> {
autoCapitalize="none" autoCapitalize="none"
placeholder={item.placeholder || '请输入'} placeholder={item.placeholder || '请输入'}
onChangeText={this.onChangeText} onChangeText={this.onChangeText}
multiline={item.multiline} multiline={true}
numberOfLines={item.numberOfLines || 4} numberOfLines={item.numberOfLines || 4}
maxLength={140} maxLength={140}
placeholderTextColor={placehold_text_color} placeholderTextColor={placehold_text_color}
underlineColorAndroid="transparent" underlineColorAndroid="transparent"
textAlignVertical={item.multiline ? 'top' : 'center'}
/> />
</View> </TouchableOpacity>
) )
} }
} }
/* /*
* @FilePath: /BoneHouse_Hospital_APP/src/components/form/select-modal.tsx * @FilePath: /BoneHouse_Business_APP/src/components/form/select-modal.tsx
* @Author: peii * @Author: peii
* @Date: 2021-04-27 21:53:02 * @Date: 2021-04-27 21:53:02
* @Vision: 1.0 * @Vision: 1.0
...@@ -9,14 +9,11 @@ ...@@ -9,14 +9,11 @@
* 1.1 添加多选 * 1.1 添加多选
*/ */
// @ts-nocheck // @ts-nocheck
import React, { useEffect, useRef, useState, createRef } from 'react' import React, { useEffect, useState } from 'react'
import { View, Text, TouchableOpacity, ActivityIndicator, FlatList } from 'react-native' import { View, Text, TouchableOpacity, ActivityIndicator, FlatList } from 'react-native'
import { Provider, Modal } from '@ant-design/react-native'
import { IOption } from 'bonehouse' import { IOption } from 'bonehouse'
import * as R from 'ramda' import * as R from 'ramda'
import { isBlank } from '../../utils/utils'
import { BottomModal } from '../modals/base/bottom' import { BottomModal } from '../modals/base/bottom'
import { FieldType } from '../../enums'
import { g } from '../../utils/utils' import { g } from '../../utils/utils'
import styles from './select-modal.styl' import styles from './select-modal.styl'
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* @FilePath: /BoneHouse_Business_APP/src/components/header/header.tsx * @FilePath: /BoneHouse_Business_APP/src/components/header/header.tsx
* @Author: peii * @Author: peii
* @Date: 2021-06-06 13:28:41 * @Date: 2021-06-06 13:28:41
* @LastEditTime: 2021-12-28 16:37:50 * @LastEditTime: 2022-10-10 17:18:24
* @LastEditors: peii * @LastEditors: PEII
* @Vision: 1.0 * @Vision: 1.0
* @Description: * @Description:
*/ */
......
/*
* @FilePath: /BoneHouse_Business_APP/src/components/modals/alert/index.tsx
* @Author: PEII
* @Date: 2022-10-11 11:29:30
* @LastEditTime: 2022-10-11 11:35:44
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 提示
*/
// @ts-nocheck
import React, { Component } from 'react'
import { View, Text, TextInput, TouchableHighlight } from 'react-native'
import { inject, observer } from 'mobx-react'
import * as R from 'ramda'
import BaseModal from '../base/base'
import { placehold_text_color } from '../../../assets/styles/base'
import { g } from '../../../utils/utils'
import styles from './index.styl'
...@@ -10,24 +10,24 @@ ...@@ -10,24 +10,24 @@
*/ */
import React, { Component } from 'react' import React, { Component } from 'react'
import { View, Text, ScrollView, TouchableOpacity, Image } from 'react-native' import { View, Text, ScrollView, TouchableOpacity, Image } from 'react-native'
import { inject, observer } from 'mobx-react' // import { inject, observer } from 'mobx-react'
import { IFormField, IFee } from 'bonehouse' import { IFormField, IFee } from 'bonehouse'
import * as R from 'ramda' import * as R from 'ramda'
import { g, isBlank, isNotBlank } from '../../../utils/utils' import { g, isBlank, isNotBlank } from '../../../utils/utils'
import container from '../../../inversify' import store from "../../../../app/store/configureStore";
import { TYPES } from '../../../inversify/types' // import container from '../../../inversify'
// import { TYPES } from '../../../inversify/types'
import styles from './fees.styl' import styles from './fees.styl'
const store = container.get(TYPES.SysStore)
type IProps = { type IProps = {
item: IFormField item: IFormField
value: IFee[] value: IFee[]
} }
const getText = (code: string) => { const getText = (code: string) => {
const feeTypes = store.sysValueSets.SUR_FEE_TYPE const state = store.getState()
return R.compose(R.prop('valueName'), R.find(R.propEq('valueCode', code)))(feeTypes) const feeTypes = R.pathOr([], ['login', 'sysValueSets', 'SUR_FEE_TYPE'])(state)
return R.compose(R.prop('value_name'), R.find(R.propEq('value_code', code)))(feeTypes)
} }
export default (props: IProps) => { export default (props: IProps) => {
......
...@@ -7,8 +7,8 @@ import { g, isBlank, isNotBlank } from '../../../utils/utils' ...@@ -7,8 +7,8 @@ import { g, isBlank, isNotBlank } from '../../../utils/utils'
import styles from './selected-consumables.styl' import styles from './selected-consumables.styl'
type IProps = { type IProps = {
value: ISurgeryCollectLine[] value: Partial<ISurgeryCollectLine>[]
item: IFormField item: Partial<IFormField>
} }
export default (props: IProps) => { export default (props: IProps) => {
...@@ -25,12 +25,12 @@ export default (props: IProps) => { ...@@ -25,12 +25,12 @@ export default (props: IProps) => {
<Text style={g(styles, 'bd-title')}>耗材({R.length(value || [])})</Text> <Text style={g(styles, 'bd-title')}>耗材({R.length(value || [])})</Text>
{value.map((val, idx) => { {value.map((val, idx) => {
return ( return (
<View style={g(styles, 'item')} key={val.serialNumber}> <View style={g(styles, 'item')} key={val.serialNumber || val.serial_number}>
<Text style={g(styles, 'item-title')}> <Text style={g(styles, 'item-title')}>
{idx + 1}. {val.itemName} {idx + 1}. {val.itemName}
</Text> </Text>
<Text style={g(styles, 'item-text')}>序列号: {val.serialNumber}</Text> <Text style={g(styles, 'item-text')}>序列号: {val.serialNumber || val.serial_number}</Text>
<Text style={g(styles, 'item-text')}>单价(¥): {val.salePrice}</Text> <Text style={g(styles, 'item-text')}>单价(¥): {val.salePrice || val.item_sale_price}</Text>
</View> </View>
) )
})} })}
......
...@@ -251,7 +251,7 @@ class Consume extends Component<IProps> { ...@@ -251,7 +251,7 @@ class Consume extends Component<IProps> {
field: 'surgeryFollowerCode', field: 'surgeryFollowerCode',
label: '跟台员', label: '跟台员',
type: FieldType.SELECT, type: FieldType.SELECT,
placeholder: '请选择', placeholder: '请选择',
options: [], options: [],
rules: [ rules: [
{ {
......
...@@ -8,10 +8,12 @@ ...@@ -8,10 +8,12 @@
* @Revision: * @Revision:
* *
*/ */
// @ts-nocheck
import React, { Component, useState } from 'react' import React, { Component, useState } from 'react'
import { View, Text, FlatList, TouchableOpacity, Image, TextInput, ScrollView } from 'react-native' import { View, Text, FlatList, TouchableOpacity, Image, TextInput, ScrollView } from 'react-native'
import { inject, observer } from 'mobx-react' // import { inject, observer } from 'mobx-react'
import { toJS } from 'mobx' // import { toJS } from 'mobx'
import { connect } from 'react-redux'
import { IFee } from 'bonehouse' import { IFee } from 'bonehouse'
import * as R from 'ramda' import * as R from 'ramda'
import Header from '../../components/header/header' import Header from '../../components/header/header'
...@@ -28,7 +30,7 @@ type IProps = { ...@@ -28,7 +30,7 @@ type IProps = {
} }
} }
class Fee extends Component<IProps> { class Fee extends React.Component<IProps> {
state = { state = {
feeLines: [ feeLines: [
{ {
...@@ -68,12 +70,14 @@ class Fee extends Component<IProps> { ...@@ -68,12 +70,14 @@ class Fee extends Component<IProps> {
const feeTypes = R.compose( const feeTypes = R.compose(
R.map( R.map(
R.applySpec({ R.applySpec({
label: R.prop('valueName'), label: R.prop('value_name'),
value: R.prop('valueCode'), value: R.prop('value_code'),
}), }),
), ),
R.pathOr([], ['sysStore', 'sysValueSets', 'SUR_FEE_TYPE']), R.pathOr([], ['sysValueSets', 'SUR_FEE_TYPE']),
)(this.props) )(this.props)
console.log(feeTypes, this.props);
this.setState({ feeTypes }) this.setState({ feeTypes })
}, 0) }, 0)
} }
...@@ -160,10 +164,7 @@ class Fee extends Component<IProps> { ...@@ -160,10 +164,7 @@ class Fee extends Component<IProps> {
* @return {*} * @return {*}
*/ */
_text(value: string) { _text(value: string) {
return R.compose( return R.compose(R.propOr('请选择', 'label'), R.find(R.propEq('value', value)))(this.state.feeTypes)
R.propOr('请选择', 'label'),
R.find(R.propEq('value', value)),
)(this.state.feeTypes)
} }
/** /**
...@@ -179,7 +180,7 @@ class Fee extends Component<IProps> { ...@@ -179,7 +180,7 @@ class Fee extends Component<IProps> {
} }
/** /**
* @description: 渲染单项 * @description: 渲染单项
* @param {*} item * @param {*} item
* @param {*} index * @param {*} index
* @return {*} * @return {*}
...@@ -206,10 +207,7 @@ class Fee extends Component<IProps> { ...@@ -206,10 +207,7 @@ class Fee extends Component<IProps> {
onPress={() => this.openModal(item, index)} onPress={() => this.openModal(item, index)}
> >
<Text style={g(styles, 'form-item__select-text')}>{this._text(item.feeType)}</Text> <Text style={g(styles, 'form-item__select-text')}>{this._text(item.feeType)}</Text>
<Image <Image style={g(styles, 'form-item__select-arrow')} source={require('../../assets/images/arr_rig.png')} />
style={g(styles, 'form-item__select-arrow')}
source={require('../../assets/images/arr_rig.png')}
/>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
...@@ -257,11 +255,7 @@ class Fee extends Component<IProps> { ...@@ -257,11 +255,7 @@ class Fee extends Component<IProps> {
keyExtractor={item => R.toString(item.fid)} keyExtractor={item => R.toString(item.fid)}
/> />
<TouchableOpacity <TouchableOpacity style={g(styles, 'btn', 'add-btn')} activeOpacity={0.8} onPress={this.addFeeHandler}>
style={g(styles, 'btn', 'add-btn')}
activeOpacity={0.8}
onPress={this.addFeeHandler}
>
<Text style={g(styles, 'btn__text', 'add-btn__text')}>+添加</Text> <Text style={g(styles, 'btn__text', 'add-btn__text')}>+添加</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
...@@ -269,10 +263,7 @@ class Fee extends Component<IProps> { ...@@ -269,10 +263,7 @@ class Fee extends Component<IProps> {
<View style={g(styles, 'ft')}> <View style={g(styles, 'ft')}>
<TouchableOpacity <TouchableOpacity
style={[ style={[g(styles, 'btn'), { shadowColor: '#ccc', shadowOffset: { height: -6 }, shadowOpacity: 0.3 }]}
g(styles, 'btn'),
{ shadowColor: '#ccc', shadowOffset: { height: -6 }, shadowOpacity: 0.3 },
]}
onPress={this.submitHandler} onPress={this.submitHandler}
> >
<Text style={g(styles, 'btn__text')}>确定费用</Text> <Text style={g(styles, 'btn__text')}>确定费用</Text>
...@@ -308,4 +299,9 @@ function Label({ required, label }) { ...@@ -308,4 +299,9 @@ function Label({ required, label }) {
) )
} }
export default inject('consumeStore', 'sysStore')(observer(Fee)) // export default inject('consumeStore', 'sysStore')(observer(Fee))
const mapStateToProps = state => ({
sysValueSets: state.login.sysValueSets
})
export default connect(mapStateToProps)(Fee)
@import '../../../assets/styles/base.styl'
@import '../../../assets/styles/variable.styl'
.search
@extend .row
background-color primary_color
padding 15px
padding-top 5px
align-items center
margin-top -1px
&-box
background-color #fff
border-radius 24px
flex-direction row
align-items center
flex 1
&-input
padding 10px 20px
height 42px
font-size 18px
flex 1
&-icon
width 28px
height @width
margin-right 15px
\ No newline at end of file
/*
* @FilePath: /BoneHouse_Business_APP/src/pages/mix_consume/components/search.tsx
* @Author: PEII
* @Date: 2022-08-02 18:14:35
* @LastEditTime: 2022-10-21 14:59:47
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 搜索
*/
// @ts-nocheck
import React from 'react'
import { View, Text, FlatList, TouchableOpacity, ActivityIndicator, Image, TextInput } from 'react-native'
import { g } from '../../../utils/utils'
import styles from './search.styl'
export default ({ children, search, placeholder, onChange }) => {
return (
<View style={g(styles, 'search')}>
<View style={g(styles, 'search-box')}>
<TextInput
style={g(styles, 'search-input')}
onChangeText={text => onChange && onChange(text)}
placeholder={placeholder}
clearButtonMode="always"
clearTextOnFocus={true}
/>
<TouchableOpacity activeOpacity={0.8} onPress={() => search && search()}>
<Image source={require('../../../assets/images/search_icon.png')} style={g(styles, 'search-icon')}></Image>
</TouchableOpacity>
</View>
{children}
</View>
)
}
@import '../../assets/styles/base.styl'
@import '../../assets/styles/variable.styl'
.container
@extend .bg-gray
flex 1
.body
flex 1
.scan-icon
width 42px
height @width
margin-left 15px
.list
padding 16px
margin-bottom 16px
.item
@extend .row
background-color #fff
margin-bottom 16px
padding 16px
&-info
flex-grow 1
&-action
width 60px
align-self center
&-btn
background-color danger_color
justify-content center
align-items center
height 24px
&__text
color #fff
.footer
@extend .row
height 70px
background-color #fff
border-top-width 1px
border-top-color saperate_color
margin-bottom 20px
justify-content space-between
align-items center
padding 0 16px
&-num
font-size 16px
&-btns
@extend .row
&-btn
width 140px
margin-left 5px
background-color primary_color
text-align center
height 48px
border-radius 24px
justify-content center
align-items center
&__text
color #fff
font-size 18px
.loading
position absolute
width 100%
height 100%
&-inner
background-color rgba(0, 0, 0, 0.3)
\ No newline at end of file
/*
* @FilePath: /BoneHouse_Business_APP/src/pages/mix_consume/consumeItems.tsx
* @Author: PEII
* @Date: 2022-10-10 14:09:04
* @LastEditTime: 2022-10-27 11:55:34
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 扫码消耗项
*/
// @ts-nocheck
import React from 'react'
import { View, Text, ScrollView, Touchable, TouchableOpacity, Image, Alert, FlatList, Button } from 'react-native'
import * as R from 'ramda'
import { INavigation } from 'navigation'
import { connect } from 'react-redux'
import dayjs from 'dayjs'
import { g, isBlank, isNotBlank, show } from '../../utils/utils'
import Header from '../../components/header/header'
import Resolution from '../../components/common/Resolution'
import Searchbar from './components/search'
import Loading from '../../components/loading'
import api from '../../services/api'
import styles from './consumeItems.styl'
type IProps = {
navigation: INavigation
orders: any[]
setOrders: Function
}
class ConsumeItems extends React.Component<IProps> {
state = {
timestamp: 0,
order: null,
lines: [],
loading: false,
submiting: false,
searchValue: '',
}
componentDidMount(): void {
this.props.navigation.addListener('didFocus', () => {
const timestamp = this.props.navigation.getParam('_t', 0)
if (this.state.timestamp === timestamp) return
const codeValue = this.props.navigation.getParam('barCodeData')
if (isBlank(codeValue)) return
const code = codeValue.typeValue
this.requestItemBySrialNumber(code)
})
this.setLines()
}
setLines() {
const order = this.props.navigation.getParam('order')
const lines = R.propOr([], 'lines')(order)
this.setState({ order, lines })
}
/**
* @description: 根据序列号请求单号等信息
* @param {string} serialNumber
* @return {*}
*/
async requestItemBySrialNumber(serialNumber: string) {
if (isBlank(serialNumber)) {
return show('序列号不能为空')
}
this.setState({ loading: true })
const res = await api.getCollectOrderLines({ serial_number: serialNumber })
this.setState({ loading: false })
if (res.error_code !== 0) {
return show(res.error_msg || '请求失败')
}
let { lines } = this.state
const { order } = this.state
let list = R.pathOr([], ['data', 'lines'])(res)
if (isBlank(list)) {
return show('该条码无法找到物料')
}
const items = R.filter(R.propEq('customer_code', order.customer_code))(list)
if (isBlank(items)) {
return show(
`该物料借货客户【${list[0].customer_name}】与您选择的客户【${
order.customer_name || order.customer_code
}】不一致,请检查`,
)
}
lines = R.compose(R.uniqBy(R.prop('serial_number')), R.concat(lines), R.map(R.assoc('consumed_quantity', 1)))(items)
this.setState({ lines })
}
/**
* @description: 删除
* @param {*} item
* @return {*}
*/
onDeleteHandler(item) {
let { lines } = this.state
Alert.alert('提示', `确定删除物料序列: ${item.serial_number}?`, [
{
text: '取消',
},
{
text: '确定',
onPress: () => {
lines = R.reject(R.propEq('serial_number', item.serial_number))(lines)
this.setState({ lines })
},
},
])
}
/**
* @description: 保存或提交
* @return {*}
*/
saveHandler(submit = false) {
const callback = this.props.navigation.getParam('callback')
callback(submit, this.state.lines)
this.props.navigation.goBack()
}
render(): React.ReactNode {
const { navigation } = this.props
const title = '报单消耗'
const { lines, loading } = this.state
return (
<View style={g(styles, 'container', 'bg-gray')}>
<Resolution.FixWidthView>
<Header
title={title}
backCallback={() => {
navigation.goBack()
}}
/>
<Searchbar
placeholder="输入或扫描RFID序列号"
onChange={e => {
this.setState({ searchValue: e })
}}
search={() => {
this.requestItemBySrialNumber(this.state.searchValue)
}}
>
<TouchableOpacity
activeOpacity={0.8}
onPress={() => {
navigation.navigate('BarCodePage', {
title: '扫描RFID序列号',
supPage: { pageName: 'MixConsumeItems', title },
})
}}
>
<Image source={require('../../assets/images/scan.png')} style={g(styles, 'scan-icon')} />
</TouchableOpacity>
</Searchbar>
<View style={g(styles, 'body')}>
<FlatList
data={lines}
style={g(styles, 'list')}
keyExtractor={item => item.serial_number}
renderItem={props => <ListItem {...props} onDeleteHadnler={item => this.onDeleteHandler(item)} />}
></FlatList>
{loading && (
<View style={g(styles, 'loading')}>
<Loading style={g(styles, 'loading-inner')} text="请求条码数据,请稍等..." />
</View>
)}
</View>
<View style={g(styles, 'footer')}>
<Text style={g(styles, 'footer-num')}>已扫:{R.length(lines || [])}</Text>
<View style={g(styles, 'footer-btns')}>
<TouchableOpacity
activeOpacity={0.8}
style={g(styles, 'footer-btn')}
onPress={() => {
this.saveHandler()
}}
>
<Text style={g(styles, 'footer-btn__text')}>保存</Text>
</TouchableOpacity>
<TouchableOpacity
activeOpacity={0.8}
style={g(styles, 'footer-btn')}
onPress={() => this.saveHandler(true)}
>
<Text style={g(styles, 'footer-btn__text')}>生成消耗单</Text>
</TouchableOpacity>
</View>
</View>
</Resolution.FixWidthView>
</View>
)
}
}
const ListItem = ({ item, index, onDeleteHadnler }) => {
return (
<View style={g(styles, 'item')}>
<View style={g(styles, 'item-info')}>
<Text style={g(styles, 'info-text')}>
{index + 1}. {item.manufacturer_product_code}{' '}
</Text>
<Text style={g(styles, 'info-text')}>物料名称:{item.item_name}</Text>
<Text style={g(styles, 'info-text')}>通用名称:{item.general_name}</Text>
<Text style={g(styles, 'info-text')}>规格型号:{item.specification}</Text>
<Text style={g(styles, 'info-text')}>序列号:{item.serial_number}</Text>
<Text style={g(styles, 'info-text')}>生产批号:{item.production_batch_number}</Text>
<Text style={g(styles, 'info-text')}>生产序号:{item.production_serial_number}</Text>
<Text style={g(styles, 'info-text')}>生产日期:{format(item.production_date)}</Text>
<Text style={g(styles, 'info-text')}>过期日期:{format(item.expiration_date)}</Text>
</View>
<View style={g(styles, 'item-action')}>
<Button
title="删除"
style={g(styles, 'item-btn')}
color="rgb(211, 58, 58)"
onPress={() => onDeleteHadnler(item)}
></Button>
</View>
</View>
)
}
const format = (str: string) => {
return str && dayjs(str).format('YYYY-MM-DD')
}
const mapStateToProps = state => ({
orders: state.mixConsume.orders,
})
const mapDispatchToProps = dispatch => ({})
export default connect(mapStateToProps, mapDispatchToProps)(ConsumeItems)
@import '../../assets/styles/base.styl'
@import '../../assets/styles/variable.styl'
.container
@extend .bg-gray
flex 1
.scan-icon
width 42px
height @width
margin-left 15px
@import '../../assets/styles/base.styl'
@import '../../assets/styles/variable.styl'
.container
@extend .bg-gray
.add-btn
color title_text_color
font-size first_text_size
font-family font_family_regular
text-align right
.list
padding 15px
.item
background-color foundation_color
padding 15px
flex-direction row
border-bottom-width 1px
border-bottom-color rgb(228, 228, 228)
align-items center
&-last
border-bottom-width 0
&-info
flex 1
&-field
flex-direction row
&-key
width 80px
font-size 16px
color first_text_color
font-family font_family_semibold
&-val
font-size 16px
color third_text_color
font-family font_family_semibold
&-action
width 50px
/*
* @FilePath: /BoneHouse_Business_APP/src/pages/mix_consume/index.tsx
* @Author: PEII
* @Date: 2022-08-02 16:40:21
* @LastEditTime: 2022-10-13 17:52:12
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 混单报消耗
*/
// @ts-nocheck
import React from 'react'
import { View, Text, FlatList, TouchableOpacity, ActivityIndicator, Image, Button } from 'react-native'
import { connect } from 'react-redux'
import * as R from 'ramda'
import { INavigation } from 'navigation'
import debounce from 'debounce'
import Header from '../../components/header/header'
import Resolution from '../../components/common/Resolution'
import Search from './components/search'
import { isBlank, g, show } from '../../utils/utils'
import api from '../../services/api'
import { setOrders } from '../../../app/action/MixConsumeAction'
import styles from './index.styl'
type IProps = {
navigation: INavigation
list: any[]
setOrders: Function
}
type IState = {}
class MixConsume extends React.Component<IProps, IState> {
state = {
searchText: '',
}
componentDidMount() {}
/**
* @description:
* @return {*}
*/
addConsumeOrderHandler() {
const list = this.props.list
let order_number = R.compose(
R.ifElse(isBlank, R.always('10000'), n => R.compose(R.toString, R.add(1), parseInt)(n)),
R.last,
R.sort(R.ascend(R.identity)),
R.pluck('order_number'),
)(list || [])
this.props.navigation.navigate('MixConsumeForm', {
order: { order_number },
forceUpdate: () => {
this.forceUpdate()
},
deleteOrder: order => this.onDeleteHandler(order),
})
}
/**
* @description: 删除
* @param {*} item
* @return {*}
*/
onDeleteHandler(item) {
let { list } = this.props
list = R.compose(R.remove(R.__, 1, list), R.findIndex(R.propEq('order_number', item.order_number)))(list)
this.props.setOrders(list)
}
searchFilter(list) {
const { searchText } = this.state
const keys = ['order_number', 'customer_name']
const conds = R.map(key => {
return R.compose(R.includes(searchText), R.propOr('', key))
}, keys)
let orders = R.filter(R.anyPass(conds))(list)
return orders
}
render(): React.ReactNode {
const title = this.props.navigation.getParam('title', '骨科智慧仓')
let { list } = this.props
let orders = this.searchFilter(list)
return (
<View style={g(styles, 'container')}>
<Resolution.FixWidthView>
<Header
title={title}
backCallback={() => {
this.props.navigation.goBack()
}}
>
<TouchableOpacity activeOpacity={0.5} onPress={this.addConsumeOrderHandler.bind(this)}>
<Text style={g(styles, 'add-btn')}>新增</Text>
</TouchableOpacity>
</Header>
<View style={g(styles, 'body')}>
{/* 订单搜索 */}
<Search onChange={text => this.setState({ searchText: text })} placeholder="客户名称、扫码单"></Search>
{/* 临时单列表 */}
<FlatList
data={orders}
keyExtractor={order => order.order_number}
extraData={this.state.refresh}
renderItem={props => (
<OrderItem
list={list}
onPressHandler={() =>
this.props.navigation.navigate('MixConsumeForm', {
order: props.item,
forceUpdate: () => this.forceUpdate(),
deleteOrder: order => this.onDeleteHandler(order),
})
}
onDeleteHadnler={item => this.onDeleteHandler(item)}
{...props}
/>
)}
style={g(styles, 'list')}
></FlatList>
</View>
</Resolution.FixWidthView>
</View>
)
}
}
const OrderItem = ({ item, index, list, onPressHandler, onDeleteHadnler }) => {
const fields = [
{
key: 'order_number',
title: '临时单号:',
},
{
key: 'customer_name',
title: '客户名称:',
},
{
key: 'doctor_name',
title: '医生:',
},
{
key: 'patient_name',
title: '患者名称:',
},
{
key: 'scan_quantity',
title: '已扫数量:',
},
{
key: 'update_time',
title: '更新时间:',
},
]
return (
<View style={g(styles, { item: true, 'item-last': R.length(list) - 1 === index })}>
<TouchableOpacity style={g(styles, 'item-info')} activeOpacity={0.8} onPress={() => onPressHandler(item)}>
{fields.map(field => {
return (
<View style={g(styles, 'item-info-field')} key={field.key}>
<Text style={g(styles, 'item-info-key')}>{field.title}</Text>
<Text style={g(styles, 'item-info-val')}>{R.propOr('-', field.key, item)}</Text>
</View>
)
})}
</TouchableOpacity>
<View style={g(styles, 'item-action')}>
<Button
title="删除"
style={g(styles, 'item-btn')}
color="rgb(211, 58, 58)"
onPress={() => onDeleteHadnler(item)}
></Button>
</View>
</View>
)
}
const mapStateToProps = state => ({
list: state.mixConsume.orders,
})
const mapDispatchToProps = dispatch => ({
setOrders: orders => {
dispatch(setOrders(orders))
},
})
export default connect(mapStateToProps, mapDispatchToProps)(MixConsume)
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @FilePath: /BoneHouse_Business_APP/src/services/api.ts * @FilePath: /BoneHouse_Business_APP/src/services/api.ts
* @Author: peii * @Author: peii
* @Date: 2021-12-19 16:06:26 * @Date: 2021-12-19 16:06:26
* @LastEditTime: 2022-01-11 18:20:31 * @LastEditTime: 2022-10-27 11:20:09
* @LastEditors: PEII * @LastEditors: PEII
* @Vision: 1.0 * @Vision: 1.0
* @Description: 未重构完全暂用的所有请求 * @Description: 未重构完全暂用的所有请求
...@@ -167,4 +167,26 @@ export default { ...@@ -167,4 +167,26 @@ export default {
}) { }) {
return request({ url: `${v}/surgery/consume/update`, data, method: `POST` }) return request({ url: `${v}/surgery/consume/update`, data, method: `POST` })
}, },
/**
* @description: 借货订单行
* @param {object} data
* @return {*}
*/
getCollectOrderLines(data: {
serial_number?: string
raised_consume?: 'Y' | 'N'
surgery_collected_number?: string
}) {
return request({ url: `${v}/surgery/collected_order_line/search`, data })
},
/**
* @description: 订单组消耗
* @param {any} data
* @return {*}
*/
createGroupComsumeOrder(data: any) {
return request({ url: `${v}/surgery/consume_group_order/create`, data, method: 'POST' })
},
} }
...@@ -13,6 +13,7 @@ import * as R from 'ramda' ...@@ -13,6 +13,7 @@ import * as R from 'ramda'
import { isBlank, show, genPid } from '../utils/utils' import { isBlank, show, genPid } from '../utils/utils'
import { stringify } from 'querystring' import { stringify } from 'querystring'
import store from '../../app/store/configureStore' import store from '../../app/store/configureStore'
import { transformObject } from '../utils/transform'
interface RequestConfig { interface RequestConfig {
url: string url: string
...@@ -64,7 +65,7 @@ export const request = (args: Partial<RequestConfig>) => { ...@@ -64,7 +65,7 @@ export const request = (args: Partial<RequestConfig>) => {
options.url += R.ifElse(R.includes('?'), R.always('&' + accessToken), R.always('?' + accessToken))(options.url) options.url += R.ifElse(R.includes('?'), R.always('&' + accessToken), R.always('?' + accessToken))(options.url)
} }
} }
// args.data = transformObject(options.data, 'toLine') args.data = transformObject(options.data, 'toLine')
args.data = options.data args.data = options.data
options = R.cond([ options = R.cond([
......
...@@ -6,13 +6,14 @@ ...@@ -6,13 +6,14 @@
* @Description: 网络服务 * @Description: 网络服务
* *
*/ */
import { request } from './request' // @ts-nocheck
import { injectable } from 'inversify' import { request } from './baseApi'
// import { injectable } from 'inversify'
const ctx = '/api/latest' const ctx = '/api/latest'
@injectable() // @injectable()
export default class Service { class Service {
/** /**
* 获取系统配置 * 获取系统配置
*/ */
...@@ -118,3 +119,5 @@ export default class Service { ...@@ -118,3 +119,5 @@ export default class Service {
return request({ url: `${ctx}/surgery/consume_order/create`, data, method: 'post' }) return request({ url: `${ctx}/surgery/consume_order/create`, data, method: 'post' })
} }
} }
export default new Service()
\ No newline at end of file
/* /*
* @FilePath: /BoneHouse_Hospital_APP/src/utils/utils.ts * @FilePath: /BoneHouse_Business_APP/src/utils/utils.ts
* @Author: peii * @Author: peii
* @Date: 2021-04-24 22:45:15 * @Date: 2021-04-24 22:45:15
* @Vision: 1.0 * @Vision: 1.0
...@@ -11,6 +11,7 @@ import * as R from 'ramda' ...@@ -11,6 +11,7 @@ import * as R from 'ramda'
import { Dimensions, Platform } from 'react-native' import { Dimensions, Platform } from 'react-native'
import Toast from 'react-native-root-toast' import Toast from 'react-native-root-toast'
import { MsgType } from '../enums' import { MsgType } from '../enums'
import store from '../../app/store/configureStore'
export const isBlank = R.anyPass([R.isNil, R.isEmpty]) export const isBlank = R.anyPass([R.isNil, R.isEmpty])
...@@ -213,3 +214,24 @@ export const gender = R.cond([ ...@@ -213,3 +214,24 @@ export const gender = R.cond([
[R.equals('2'), R.always('女')], [R.equals('2'), R.always('女')],
[R.T, R.always('未知')], [R.T, R.always('未知')],
]) ])
/**
* @description: 获取登录时请求到的配置
* @param {string} profileCode
* @param {any} defaultValue
* @return {*}
*/
export const getSysProfile = (profileCode: string, defaultValue = '') => {
if (isBlank(store)) {
throw new Error('store为空')
}
const state = store.getState()
const profiles = state.login.sysProfiles
return R.propOr(defaultValue, profileCode)(profiles)
}
/**
* @description: 获取配置性的表单项显示隐藏及必填
* @return {*}
*/
export const getOrderSysProfile = R.compose(translateSysprofile, getSysProfile)
\ No newline at end of file
...@@ -61,6 +61,7 @@ declare module 'bonehouse' { ...@@ -61,6 +61,7 @@ declare module 'bonehouse' {
customHandler?: Function customHandler?: Function
order?: number order?: number
minuteInterval?: number minuteInterval?: number
symmetric?: string
} }
export type IOrganization = { export type IOrganization = {
...@@ -182,6 +183,7 @@ declare module 'bonehouse' { ...@@ -182,6 +183,7 @@ declare module 'bonehouse' {
supplierSerialNumber: string supplierSerialNumber: string
surCollectLineNumber: string surCollectLineNumber: string
surgeryCollectNumber: string surgeryCollectNumber: string
[key: string]: any
} }
export type IFee = { export type IFee = {
......
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 sign in to comment