Commit feec315a by peii

Merge branch 'develop' into product

parents 8145d1cb 84708222
......@@ -42,6 +42,12 @@ import DirectionInvoice from '../src/pages/invoice/direct'
import DirectionInvoiceCollections from '../src/pages/invoice/direct/collections'
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(
createStackNavigator(
{
......@@ -79,6 +85,10 @@ const Router = createAppContainer(
DirectionInvoice: { screen: DirectionInvoice },
DirectionInvoiceCollections: { screen: DirectionInvoiceCollections },
DirectionInvoiceApplyDetail: { screen: DirectionInvoiceApplyDetail },
ConsumeFee: { screen: ConsumeFee },
MixConsume: { screen: MixConsume },
MixConsumeForm: { screen: MixConsumeForm },
MixConsumeItems: { screen: MixConsumeItems },
},
{
navigationOptions: {
......
......@@ -10,12 +10,13 @@ import {
SET_VERSION_APK,
SET_DOMAIN_FROM_ORIGIN,
SET_SYSPROFILE,
SET_SYSVALUESET,
SET_NAVIGATION,
SET_ORGANIZATION
} from '../base/ActionTypes';
import { GetRequest, PostRequest } from '../network/RequestUtils';
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) {
return (dispatch, getState) => {
......@@ -28,6 +29,7 @@ export function requestLogin(params) {
show('登录成功');
dispatch(loginSuccess(res, params.data.user_name, params.data.user_password));
dispatch(getSysProfiles())
dispatch(getSysValueSets())
} else {
show(`当前用户没有菜单权限,\n请联系管理员配置!`)
dispatch(loginFailure())
......@@ -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: 设置系统配置
* @param {*} code
......@@ -204,6 +226,14 @@ export function setSysProfiles(code, value) {
}
}
function setSysValueSets(code, value) {
return {
type: SET_SYSVALUESET,
code,
value
}
}
/**
* @description: 设置路由
* @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 @@
* @FilePath: /BoneHouse_Business_APP/app/base/ActionTypes.js
* @Author: peii
* @Date: 2022-01-04 10:18:02
* @LastEditTime: 2022-01-11 21:06:24
* @LastEditTime: 2022-10-12 17:41:42
* @LastEditors: PEII
* @Vision: 1.0
* @Description:
......@@ -20,6 +20,7 @@ export const SET_DOMAIN_FROM_ORIGIN = 'SET_DOMAIN_FROM_ORIGIN'
export const SET_VERSION_APK="SET_VERSION_APK"
export const GET_SYSPROFILE = "GET_SYSPROFILE"
export const SET_SYSPROFILE = "SET_SYSPROFILE"
export const SET_SYSVALUESET = "SET_SYSVALUESET"
export const SET_NAVIGATION = "SET_NAVIGATION"
export const SET_ORGANIZATION = "SET_ORGANIZATION"
//-----------self order---------------------
......@@ -82,4 +83,7 @@ export const DEVICE_INFORMATION_UPDATE_FAILURE = "DEVICE_INFORMATION_UPDATE_FAIL
//-----------settlement information---------------------
export const SET_SETTLEMENT_STATUS = 'SET_SETTLEMENT_STATUS'
export const SET_INVOICE_STATUS = 'SET_INVOICE_STATUS'
export const SET_AR_INVOICE_STATUS = 'SET_AR_INVOICE_STATUS'
\ No newline at end of file
export const SET_AR_INVOICE_STATUS = 'SET_AR_INVOICE_STATUS'
//----------- 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 {
typeName: typeName,
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 {
title: '消耗确认',
page: 'EquipConsuPage',
},
MOBILE_MIX_CONSUME: {
icon: require('../../images/equip_consu.png'),
title: '报单消耗',
page: 'MixConsume',
},
MOBILE_SELF_HELP_ORDER: {
icon: require('../../images/self_order.png'),
title: '自助下单',
......
import React, { Component } from 'react'
import { ActionSheet } from '@ant-design/react-native'
import { View, Text, Modal, SafeAreaView, TextInput, StyleSheet, TouchableOpacity } from 'react-native'
import {
safe_view,
......
......@@ -133,9 +133,17 @@ class ChooseProductPage extends Component {
handleGoBack() {
let { topProcOptionList, originManufacterList } = this.state
let { setSelectProductOpts } = this.props
setSelectProductOpts(originManufacterList)
console.log('originManufacterList', originManufacterList)
this.props.navigation.state.params.productCallBack(originManufacterList)
const res = R.map(item => {
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()
}
......@@ -874,6 +882,7 @@ class ChooseProductPage extends Component {
// if (leftActiveIndex) {
return (
<TouchableOpacity
activeOpacity={1}
onPress={() => {
navigation.navigate('SearchPage', {
title: `选择产品`,
......
......@@ -18,9 +18,9 @@ import LocalVariable from '../../common/LocalVariable'
import { reqGlobalSearch, reqSingleConsumSearch, reqProCategorySearch } from '../../../action/SelfAction'
import ChooseCardList from '../../common/listDataComponent/ChooseCardList'
import { connect } from 'react-redux'
// import ChooseCardList from '../../common/listDataComponent/ChooseCardList';
import StatusBarView from '../../common/StatusBarView'
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 * as R from 'ramda'
class SearchPage extends Component {
......@@ -113,10 +113,13 @@ class SearchPage extends Component {
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 productLineCategory = R.compose(
R.join(','),
R.pluck('product_line_category_code'),
R.unnest,
R.pluck('product_line_category_list'),
)(authorizations || [])
const params = {
accessToken: token,
orgCode: selfData.org_code,
......@@ -130,6 +133,7 @@ class SearchPage extends Component {
this.refs.LoadingModel.hide()
console.log('single_all_search', single_all_search)
const oldData = data.item
this.setState({
data: {
...single_all_search?.data,
......@@ -326,6 +330,7 @@ class SearchPage extends Component {
show('添加成功')
},
)
console.log(JSON.stringify(topProcOptionList));
return Promise.resolve(topProcOptionList)
}
......@@ -403,66 +408,74 @@ class SearchPage extends Component {
console.log('dataList', data.item)
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}
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}
/>
<View style={styles.container}>
<StatusBarView isReactStackNavigator={true} backgroundColor={promary_color} barStyle="light-content" />
<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)}
<View style={safe_view}>
<HeadBackItem title={title} navigation={navigation} />
<View style={list_common_item.ser_cont}>
<TextInput
placeholder={'请输入搜索关键词'}
style={list_common_item.ser_text_input}
onChangeText={text => this.inputSearchValue(text)}
/>
)}
{data.item.length === data.total && data?.item?.length > 0 && (
<View>
<Text style={{ textAlign: 'center', lineHeight: 40 }}>没有更多数据了</Text>
<View style={list_common_item.ser_btn}>
<TouchableOpacity
onPress={() => {
this.initData()
}}
>
<Text style={list_common_item.ser_text_btn}>搜索</Text>
</TouchableOpacity>
</View>
)}
{!data?.item?.length && <PicListNoData />}
</ScrollView>
<LoadingModel ref="LoadingModel" />
</SafeAreaView>
<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}>
{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({
container: {
flex: 1,
backgroundColor: home_background_color,
},
top_box: {
width: Width(),
paddingHorizontal: 20,
......
......@@ -2,8 +2,8 @@
* @FilePath: /BoneHouse_Business_APP/app/reducers/index.js
* @Author: peii
* @Date: 2021-02-03 20:59:10
* @LastEditTime: 2021-12-21 16:57:13
* @LastEditors: peii
* @LastEditTime: 2022-08-04 17:36:19
* @LastEditors: PEII
* @Vision: 1.0
* @Description:
*/
......@@ -17,6 +17,7 @@ import histor from './module/histor';
import trans from './module/trans';
import deviceInfo from './module/deviceInfo';
import settlement from './module/settlement';
import mixConsume from './module/mixConsume';
const loginConfig = {
key: 'login',
......@@ -74,6 +75,13 @@ const settlementConfig = {
blackList: []
}
const mixConsumeConfig = {
key: 'mixConsume',
storage,
debug: false,
blackList: []
}
const rootReducer = {
login: persistReducer(loginConfig,login),
selfOrder: persistReducer(selfConfig,selfOrder),
......@@ -83,6 +91,7 @@ const rootReducer = {
trans: persistReducer(transConfig, trans),
deviceInfo: persistReducer(deviceConfig, deviceInfo),
settlement: persistReducer(settlementConfig, settlement),
mixConsume: persistReducer(mixConsumeConfig, mixConsume),
}
export default rootReducer;
\ No newline at end of file
......@@ -10,6 +10,7 @@ import {
SET_VERSION_APK,
SET_DOMAIN_FROM_ORIGIN,
SET_SYSPROFILE,
SET_SYSVALUESET,
SET_NAVIGATION,
SET_ORGANIZATION
} from '../../base/ActionTypes';
......@@ -29,7 +30,11 @@ const defaultState = {
OBS_SHOW_ORG_FLAG: 'Y',
SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y',
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: []
}
......@@ -39,9 +44,15 @@ export const originSysProfiles = {
OBS_SHOW_ORG_FLAG: 'Y',
SUR_MOBILE_HISTORY_SALE_PRICE_SHOW_FLAG: 'Y',
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) => {
switch (action.type) {
case LOGIN_DOING:
......@@ -96,6 +107,13 @@ export default login = (state = defaultState, action) => {
[action.code]: action.value
}
})
case SET_SYSVALUESET:
return Object.assign({}, state, {
sysValueSets: {
...state.sysValueSets,
[action.code]: action.value
}
})
case SET_NAVIGATION:
return Object.assign({}, state, {
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 // 按钮色
dis_sub_color = #BBBBBB // 禁用按钮色
input_background_color = #efefef // 输入框底色
btn_color = #ffffff // 按钮字体颜色
saperate_color = #fefefe
// 字体色
primary_text_color = #000000 // 主字颜色
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 {
View,
Text,
Image,
TouchableOpacity,
ScrollView,
Alert,
Linking,
Platform,
} from 'react-native'
import { View, Text, Image, TouchableOpacity, ScrollView, Alert, Linking, Platform } from 'react-native'
import { IFormField, IOption } from 'bonehouse'
import * as R from 'ramda'
import ImagePicker from 'react-native-image-picker'
import Toast, { Positions } from 'react-native-root-toast'
import { isBlank, show, isRequired, isNotBlank, g } from '../../utils/utils'
import styles from './image.styl'
// import Container from '../../inversify'
// import { TYPES } from '../../inversify/types'
// import Service from '../../services/service'
// const service: Service = Container.get(TYPES.Service)
import service from '../../services/service'
type IProps = {
item: IFormField
......@@ -72,10 +69,7 @@ export default class ImageForm extends React.Component<IProps> {
if (res.error) {
const errMsgs = ['Camera permissions not granted', 'Photo library permissions not granted']
const errTips = [
'APP需要使用相机,请打开相机权限允许APP使用',
'APP需要使用相册,请打开相册权限允许APP使用',
]
const errTips = ['APP需要使用相机,请打开相机权限允许APP使用', 'APP需要使用相册,请打开相册权限允许APP使用']
for (const [idx, msg] of Object.entries(errMsgs)) {
if (R.indexOf(res.error, msg) > -1) {
......@@ -106,7 +100,7 @@ export default class ImageForm extends React.Component<IProps> {
formData.append('file', file)
try {
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)
let value = this.props.value || []
......
......@@ -66,11 +66,10 @@
&__multi
text-align left
width 100%
border-width 1px
border-color #ddd
padding 10px
border-radius 4px
margin-top 10px
padding 0px
margin-top 15px
flex 1
&-radio
flex 1
......
......@@ -10,15 +10,7 @@
*/
// @ts-nocheck
import React, { Component } from 'react'
import {
View,
Text,
ScrollView,
SafeAreaView,
TouchableOpacity,
ActivityIndicator,
KeyboardAvoidingView,
} from 'react-native'
import { View, Text, ScrollView, TouchableOpacity, ActivityIndicator, KeyboardAvoidingView } from 'react-native'
import { IFormField } from 'bonehouse'
import * as R from 'ramda'
import { FieldType } from '../../enums'
......@@ -58,7 +50,7 @@ export default class Form extends Component<IProps> {
}
componentDidMount() {
this.checkCanSubmit = debounce(this.checkCanSubmit.bind(this))
this.checkCanSubmit = debounce(this.checkSubmit.bind(this))
this.submitHandler = debounce(this.submitHandler.bind(this), 200)
}
......@@ -82,7 +74,7 @@ export default class Form extends Component<IProps> {
/**
* @description: 是否可以提交
*/
checkCanSubmit() {
checkSubmit() {
const { fields, data } = this.props
for (const item of fields) {
if (isBlank(item.rules)) continue
......@@ -90,15 +82,18 @@ export default class Form extends Component<IProps> {
// 校验是否可以提交
for (const rule of item.rules) {
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])) {
return this.setState({ canSubmit: false })
this.setState({ canSubmit: false })
return false
}
}
}
this.setState({ canSubmit: true })
return true
}
/**
......
......@@ -40,10 +40,17 @@ export default class Input extends Component<IProps> {
const { item, value, itemStyle } = this.props
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} />
<TextInput
ref={ref => (this.inputRef = ref)}
style={g(styles, {
'form-input': true,
'form-text-input': true,
......@@ -53,13 +60,14 @@ export default class Input extends Component<IProps> {
autoCapitalize="none"
placeholder={item.placeholder || '请输入'}
onChangeText={this.onChangeText}
multiline={item.multiline}
multiline={true}
numberOfLines={item.numberOfLines || 4}
maxLength={140}
placeholderTextColor={placehold_text_color}
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
* @Date: 2021-04-27 21:53:02
* @Vision: 1.0
......@@ -9,14 +9,11 @@
* 1.1 添加多选
*/
// @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 { Provider, Modal } from '@ant-design/react-native'
import { IOption } from 'bonehouse'
import * as R from 'ramda'
import { isBlank } from '../../utils/utils'
import { BottomModal } from '../modals/base/bottom'
import { FieldType } from '../../enums'
import { g } from '../../utils/utils'
import styles from './select-modal.styl'
......
......@@ -2,8 +2,8 @@
* @FilePath: /BoneHouse_Business_APP/src/components/header/header.tsx
* @Author: peii
* @Date: 2021-06-06 13:28:41
* @LastEditTime: 2021-12-28 16:37:50
* @LastEditors: peii
* @LastEditTime: 2022-10-10 17:18:24
* @LastEditors: PEII
* @Vision: 1.0
* @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 @@
*/
import React, { Component } from 'react'
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 * as R from 'ramda'
import { g, isBlank, isNotBlank } from '../../../utils/utils'
import container from '../../../inversify'
import { TYPES } from '../../../inversify/types'
import store from "../../../../app/store/configureStore";
// import container from '../../../inversify'
// import { TYPES } from '../../../inversify/types'
import styles from './fees.styl'
const store = container.get(TYPES.SysStore)
type IProps = {
item: IFormField
value: IFee[]
}
const getText = (code: string) => {
const feeTypes = store.sysValueSets.SUR_FEE_TYPE
return R.compose(R.prop('valueName'), R.find(R.propEq('valueCode', code)))(feeTypes)
const state = store.getState()
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) => {
......
......@@ -7,8 +7,8 @@ import { g, isBlank, isNotBlank } from '../../../utils/utils'
import styles from './selected-consumables.styl'
type IProps = {
value: ISurgeryCollectLine[]
item: IFormField
value: Partial<ISurgeryCollectLine>[]
item: Partial<IFormField>
}
export default (props: IProps) => {
......@@ -25,12 +25,12 @@ export default (props: IProps) => {
<Text style={g(styles, 'bd-title')}>耗材({R.length(value || [])})</Text>
{value.map((val, idx) => {
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')}>
{idx + 1}. {val.itemName}
</Text>
<Text style={g(styles, 'item-text')}>序列号: {val.serialNumber}</Text>
<Text style={g(styles, 'item-text')}>单价(¥): {val.salePrice}</Text>
<Text style={g(styles, 'item-text')}>序列号: {val.serialNumber || val.serial_number}</Text>
<Text style={g(styles, 'item-text')}>单价(¥): {val.salePrice || val.item_sale_price}</Text>
</View>
)
})}
......
......@@ -251,7 +251,7 @@ class Consume extends Component<IProps> {
field: 'surgeryFollowerCode',
label: '跟台员',
type: FieldType.SELECT,
placeholder: '请选择',
placeholder: '请选择',
options: [],
rules: [
{
......
......@@ -8,10 +8,12 @@
* @Revision:
*
*/
// @ts-nocheck
import React, { Component, useState } from 'react'
import { View, Text, FlatList, TouchableOpacity, Image, TextInput, ScrollView } from 'react-native'
import { inject, observer } from 'mobx-react'
import { toJS } from 'mobx'
// import { inject, observer } from 'mobx-react'
// import { toJS } from 'mobx'
import { connect } from 'react-redux'
import { IFee } from 'bonehouse'
import * as R from 'ramda'
import Header from '../../components/header/header'
......@@ -28,7 +30,7 @@ type IProps = {
}
}
class Fee extends Component<IProps> {
class Fee extends React.Component<IProps> {
state = {
feeLines: [
{
......@@ -68,12 +70,14 @@ class Fee extends Component<IProps> {
const feeTypes = R.compose(
R.map(
R.applySpec({
label: R.prop('valueName'),
value: R.prop('valueCode'),
label: R.prop('value_name'),
value: R.prop('value_code'),
}),
),
R.pathOr([], ['sysStore', 'sysValueSets', 'SUR_FEE_TYPE']),
R.pathOr([], ['sysValueSets', 'SUR_FEE_TYPE']),
)(this.props)
console.log(feeTypes, this.props);
this.setState({ feeTypes })
}, 0)
}
......@@ -160,10 +164,7 @@ class Fee extends Component<IProps> {
* @return {*}
*/
_text(value: string) {
return R.compose(
R.propOr('请选择', 'label'),
R.find(R.propEq('value', value)),
)(this.state.feeTypes)
return R.compose(R.propOr('请选择', 'label'), R.find(R.propEq('value', value)))(this.state.feeTypes)
}
/**
......@@ -179,7 +180,7 @@ class Fee extends Component<IProps> {
}
/**
* @description: 渲染单项
* @description: 渲染单项
* @param {*} item
* @param {*} index
* @return {*}
......@@ -206,10 +207,7 @@ class Fee extends Component<IProps> {
onPress={() => this.openModal(item, index)}
>
<Text style={g(styles, 'form-item__select-text')}>{this._text(item.feeType)}</Text>
<Image
style={g(styles, 'form-item__select-arrow')}
source={require('../../assets/images/arr_rig.png')}
/>
<Image style={g(styles, 'form-item__select-arrow')} source={require('../../assets/images/arr_rig.png')} />
</TouchableOpacity>
</View>
......@@ -257,11 +255,7 @@ class Fee extends Component<IProps> {
keyExtractor={item => R.toString(item.fid)}
/>
<TouchableOpacity
style={g(styles, 'btn', 'add-btn')}
activeOpacity={0.8}
onPress={this.addFeeHandler}
>
<TouchableOpacity style={g(styles, 'btn', 'add-btn')} activeOpacity={0.8} onPress={this.addFeeHandler}>
<Text style={g(styles, 'btn__text', 'add-btn__text')}>+添加</Text>
</TouchableOpacity>
</View>
......@@ -269,10 +263,7 @@ class Fee extends Component<IProps> {
<View style={g(styles, 'ft')}>
<TouchableOpacity
style={[
g(styles, 'btn'),
{ shadowColor: '#ccc', shadowOffset: { height: -6 }, shadowOpacity: 0.3 },
]}
style={[g(styles, 'btn'), { shadowColor: '#ccc', shadowOffset: { height: -6 }, shadowOpacity: 0.3 }]}
onPress={this.submitHandler}
>
<Text style={g(styles, 'btn__text')}>确定费用</Text>
......@@ -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 @@
* @FilePath: /BoneHouse_Business_APP/src/services/api.ts
* @Author: peii
* @Date: 2021-12-19 16:06:26
* @LastEditTime: 2022-01-11 18:20:31
* @LastEditTime: 2022-10-27 11:20:09
* @LastEditors: PEII
* @Vision: 1.0
* @Description: 未重构完全暂用的所有请求
......@@ -167,4 +167,26 @@ export default {
}) {
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'
import { isBlank, show, genPid } from '../utils/utils'
import { stringify } from 'querystring'
import store from '../../app/store/configureStore'
import { transformObject } from '../utils/transform'
interface RequestConfig {
url: string
......@@ -64,7 +65,7 @@ export const request = (args: Partial<RequestConfig>) => {
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
options = R.cond([
......
......@@ -6,13 +6,14 @@
* @Description: 网络服务
*
*/
import { request } from './request'
import { injectable } from 'inversify'
// @ts-nocheck
import { request } from './baseApi'
// import { injectable } from 'inversify'
const ctx = '/api/latest'
@injectable()
export default class Service {
// @injectable()
class Service {
/**
* 获取系统配置
*/
......@@ -118,3 +119,5 @@ export default class Service {
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
* @Date: 2021-04-24 22:45:15
* @Vision: 1.0
......@@ -11,6 +11,7 @@ import * as R from 'ramda'
import { Dimensions, Platform } from 'react-native'
import Toast from 'react-native-root-toast'
import { MsgType } from '../enums'
import store from '../../app/store/configureStore'
export const isBlank = R.anyPass([R.isNil, R.isEmpty])
......@@ -213,3 +214,24 @@ export const gender = R.cond([
[R.equals('2'), 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' {
customHandler?: Function
order?: number
minuteInterval?: number
symmetric?: string
}
export type IOrganization = {
......@@ -182,6 +183,7 @@ declare module 'bonehouse' {
supplierSerialNumber: string
surCollectLineNumber: string
surgeryCollectNumber: string
[key: string]: any
}
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