wushaodong 4 лет назад
Родитель
Сommit
90b3179b23

+ 0 - 1
android/app/build.gradle

@@ -201,7 +201,6 @@ android {
 dependencies {
     implementation project(':react-native-camera')
     implementation project(':react-native-webview')
-    implementation project(':react-native-charts-wrapper')
     implementation project(':react-native-fs')
     implementation project(':react-native-syan-image-picker-zzly')
     implementation project(':rn-fetch-blob')

+ 0 - 1
android/app/src/main/java/com/zzliaoyuan/decorate_touch/MainApplication.java

@@ -6,7 +6,6 @@ import com.facebook.react.PackageList;
 import com.facebook.react.ReactApplication;
 import org.reactnative.camera.RNCameraPackage;
 import com.reactnativecommunity.webview.RNCWebViewPackage;
-import com.github.wuxudong.rncharts.MPAndroidChartPackage;
 import com.facebook.react.ReactNativeHost;
 import com.facebook.react.ReactPackage;
 import com.facebook.soloader.SoLoader;

+ 0 - 2
android/settings.gradle

@@ -3,8 +3,6 @@ include ':react-native-camera'
 project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
 include ':react-native-webview'
 project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android')
-include 'react-native-charts-wrapper'
-project(':react-native-charts-wrapper').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-charts-wrapper/android')
 include ':react-native-fs'
 project(':react-native-fs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fs/android')
 include ':react-native-syan-image-picker-zzly'

+ 1 - 1
index.js

@@ -13,4 +13,4 @@ import {name as appName} from './app.json';
 AppRegistry.registerComponent(appName, () => App);
 
 // SyncStorage.set('baseURL', 'http://192.168.2.45:8887');
-SyncStorage.set('baseURL', 'http://zjk.zzliaoyuan.com/');
+SyncStorage.set('baseURL', 'http://zjk.zzliaoyuan.com');

+ 19 - 7
jscore/models/customer.js

@@ -4,7 +4,8 @@ import ResponseError from '../components/ResponseError';
 import TurnPage from '../components/TurnPage';
 import {REFRESH_STATE} from 'react-native-refresh-flatlist';
 
-let reportCustomerData = [], reviewTodayData = [], reviewRecordData = [], processRecordData = [], orderListData = [], checkCustomerData = [];
+let reportCustomerData = [], reviewTodayData = [], reviewRecordData = [], processRecordData = [], orderListData = [],
+    checkCustomerData = [];
 export default {
     namespace: 'customer',
     state: {
@@ -22,6 +23,7 @@ export default {
         processRecordRState: REFRESH_STATE.Ready,
         processRecordData: [],
         projectDict: [],
+        processImageData: [],
         customerDetail: {},
         processDetail: {},
         customerReviewDetail: {},
@@ -202,7 +204,7 @@ export default {
         * addCustomerProject({payload, callback}, {call, put}) {
             const response = yield call(customer.addCustomerProject, payload);
             if (!response.code) {
-                callback()
+                callback();
             } else {
                 ResponseError(response);
             }
@@ -210,7 +212,7 @@ export default {
         * checkReview({payload, callback}, {call, put}) {
             const response = yield call(customer.checkReview, payload);
             if (!response.code) {
-                callback()
+                callback();
             } else {
                 ResponseError(response);
             }
@@ -237,7 +239,7 @@ export default {
         * getProcess({payload, callback}, {call, put}) {
             const response = yield call(customer.getProcess, payload);
             if (!response.code) {
-                callback(response.data)
+                callback(response.data);
             } else {
                 ResponseError(response);
             }
@@ -245,7 +247,7 @@ export default {
         * addOrder({payload, callback}, {call, put}) {
             const response = yield call(customer.addOrder, payload);
             if (!response.code) {
-                callback()
+                callback();
             } else {
                 ResponseError(response);
             }
@@ -299,7 +301,7 @@ export default {
         * fetchProcessDict({payload, callback}, {call, put}) {
             const response = yield call(customer.queryProcessDict, payload);
             if (!response.code) {
-                callback(response.data)
+                callback(response.data);
             } else {
                 ResponseError(response);
             }
@@ -307,11 +309,21 @@ export default {
         * dispatchService({payload, callback}, {call, put}) {
             const response = yield call(customer.dispatchService, payload);
             if (!response.code) {
-                callback()
+                callback();
             } else {
                 ResponseError(response);
             }
         },
+        * fetchProcessImage({payload, callback}, {call, put}) {
+            yield put(createAction('queryList')({loading: true}));
+            const response = yield call(customer.queryProcessImage, payload);
+            if (!response.code) {
+                yield put(createAction('queryList')({processImageData: response.data, loading: false}));
+            } else {
+                yield put(createAction('queryList')({loading: false}));
+                ResponseError(response);
+            }
+        },
     },
     subscriptions: {
         setup({dispatch}) {

+ 298 - 0
jscore/pages/Sales/BrowseImage.js

@@ -0,0 +1,298 @@
+import React, {Component} from 'react';
+import {
+    View,
+    Text,
+    TouchableOpacity,
+    StyleSheet,
+    Dimensions,
+    FlatList,
+    Modal, Alert, ToastAndroid,
+} from 'react-native';
+
+import CameraRoll from '@react-native-community/cameraroll';
+import {createAction} from '../../utils';
+import {connect} from 'react-redux';
+import {ActivityIndicator, Provider} from '@ant-design/react-native';
+import {CachedImage} from 'react-native-cached-images-zzly';
+
+import ImageViewer from 'react-native-image-zoom-viewer';
+import RNFS from 'react-native-fs';
+import SyncStorage from 'sync-storage';
+
+const SCREEN_WIDTH = Dimensions.get('window').width;
+const SCREEN_HEIGHT = Dimensions.get('window').height;
+
+//const IMAGE_PLACEHOLDER = require('../../../assets/images/bg_mine_header.png');
+let subjectImages = [];
+
+let _subjectRows = {}, _answerRows = {};
+const baseURL = SyncStorage.get('baseURL');
+class Row extends Component {
+
+    constructor(props) {
+        super(props);
+        this.state = {
+            visible: false,
+        };
+    }
+
+    setVisible = (visible) => {
+        // this.props.visible = visible
+        this.setState({visible: visible});
+    };
+
+    calcSize = (item) => {
+        let width, height = 0;
+        if (item.width < SCREEN_WIDTH) {
+            width = item.width;
+        } else {
+            width = SCREEN_WIDTH - 20;
+        }
+        height = Math.floor((width * item.height) / item.width);
+        return {marginHorizontal: 5, marginVertical: 5, width, height};
+    };
+
+    render() {
+        const {row, id} = this.props;
+        const style = this.calcSize(row);
+        const height = Math.floor((SCREEN_WIDTH * row.height) / row.width) + 20;
+        const url = baseURL + row.picture
+        //console.log('id=' + id, 'visible=' + this.state.visible)
+        // if(!this.state.visible){
+        //     //取消网络图片的加载
+        //     ImageCache.get().cancel(row.uri);
+        // }
+        return (
+            <View style={{borderBottomWidth: 10, borderBottomColor: '#f5f5f5', height}}>
+                {
+                    this.state.visible && <CachedImage source={{uri: url}} style={style}/>
+                }
+            </View>
+        );
+    }
+
+}
+
+@connect(customer => ({...customer}))
+class BrowseImage extends Component {
+    // 进度浏览图片
+    constructor(props) {
+        super(props);
+        this.state = {
+            id: this.props.navigation.state.params.id,
+            subjectVisible: false,
+            saveImgVisible: false,
+            saveToLocal: '',
+            imageIndex: 0,
+        };
+    }
+
+    _keyExtractorSubject = (item, index) => String(index);
+
+    componentDidMount() {
+        this._fetchData();
+    }
+
+    _fetchData = () => {
+        this.props.dispatch(createAction('customer/fetchProcessImage')({id: this.state.id}));
+    };
+
+    _zoomImage = (id, type) => {
+        this.setState({subjectVisible: true, imageIndex: id});
+    };
+
+    renderSubjectItem(item, index) {
+        subjectImages.push({url: baseURL+item.picture});
+        return (
+                <TouchableOpacity onPress={() => this._zoomImage(index, 'S')}>
+                    <Row
+                        ref={el => {
+                            let key = String(index);
+                            _subjectRows[key] = el;
+                        }}
+                        id={index}
+                        row={item}
+                    />
+                </TouchableOpacity>
+        );
+    }
+
+    onViewableSubjectsChanged(info) {
+        info.changed.forEach((currentValue, index, arr) => {
+            _subjectRows[currentValue.key].setVisible(currentValue.isViewable);
+        });
+    }
+
+    _imgViewRender = () => {
+        return (
+            <View style={{
+                flexDirection: 'row',
+                justifyContent: 'flex-end',
+                margin: 20,
+            }}>
+                <Text style={{color: '#ff6633', marginRight: 10}}>长按保存图片</Text>
+                <TouchableOpacity style={{
+                    borderRadius: 20,
+                    borderWidth: 1,
+                    borderColor: '#ff6633',
+                }} onPress={() => this.setState({answerVisible: false, subjectVisible: false})}>
+                    <Text style={{
+                        fontFamily: 'iconfont',
+                        color: '#ff6633',
+                        fontSize: 20,
+                        textAlign: 'center',
+                    }}>{'\ue606'}</Text>
+                </TouchableOpacity>
+            </View>
+        );
+    };
+    _saveImgRender = (cancel, saveToLocal) => {
+        return (
+            <View style={{
+                flexDirection: 'row',
+                justifyContent: 'center',
+                margin: 20,
+                marginTop: SCREEN_HEIGHT - 200,
+            }}>
+                <TouchableOpacity style={{
+                    borderRadius: 20,
+                    backgroundColor: '#eee',
+                    paddingHorizontal: 10,
+                    paddingVertical: 5,
+                    borderColor: '#ff6633',
+                    borderWidth: 1,
+                    marginRight: 10,
+                }} onPress={() => cancel()}>
+                    <Text style={{
+                        fontFamily: 'iconfont',
+                        color: '#ff6633',
+                        fontSize: 20,
+                        textAlign: 'center',
+                    }}>取消</Text>
+                </TouchableOpacity>
+                <TouchableOpacity style={{
+                    borderRadius: 20,
+                    backgroundColor: '#eee',
+                    paddingHorizontal: 10,
+                    paddingVertical: 5,
+                    borderColor: '#ff6633',
+                    borderWidth: 1,
+                    marginRight: 10,
+                }} onPress={() => saveToLocal()}>
+                    <Text style={{
+                        fontFamily: 'iconfont',
+                        color: '#ff6633',
+                        fontSize: 20,
+                        textAlign: 'center',
+                    }}>保存</Text>
+                </TouchableOpacity>
+
+            </View>
+        );
+    };
+    savePhoto = (url) => {
+        const imgFile = url.split('/');
+        const imgDIR = `${RNFS.DocumentDirectoryPath}/${imgFile[imgFile.length - 1]}`;
+        const ret = RNFS.downloadFile(
+            {
+                fromUrl: url,
+                toFile: imgDIR,
+            });
+        ret.promise.then(res => {
+            if (res && res.statusCode === 200) {
+                let promise = CameraRoll.saveToCameraRoll('file://' + imgDIR, 'photo');
+                promise.then(function (result) {
+                    ToastAndroid.show('已保存到相册', ToastAndroid.SHORT);
+                    // Alert.alert('友情提醒', '已保存到相册!',
+                    //     [
+                    //         {text: '我知道了', style: 'cancel'},
+                    //     ]);
+                }).catch(function (error) {
+                    console.log(4444444444, error);
+                    // alert('保存失败!\n' + error);
+                    Alert.alert('友情提醒', '保存失败!',
+                        [
+                            {text: '我知道了', style: 'cancel'},
+                        ]);
+                });
+            }
+        });
+    };
+
+    render() {
+        const {processImageData, loading} = this.props.customer;
+
+        subjectImages = [];
+
+        let subjectsRender = '';
+        if (loading) {
+            subjectsRender = <Text style={styles.uploadText}>
+                努力加载中...
+            </Text>;
+        } else {
+            subjectsRender = <FlatList
+                data={processImageData}
+                renderItem={({item, index}) => this.renderSubjectItem(item, index)}
+                onViewableItemsChanged={this.onViewableSubjectsChanged}
+                keyExtractor={this._keyExtractorSubject}
+            />;
+
+        }
+
+        return (
+            <Provider>
+                {loading ?
+                    <ActivityIndicator
+                        animating={true}
+                        toast
+                        size="large"
+                        text="加载中..."
+                    /> :
+                    <View key="subject" backgroundColor='#fff'>
+                        {subjectsRender}
+                    </View>
+                }
+                <Modal
+                    visible={this.state.subjectVisible}
+                    transparent={true}
+                    animationType={'fade'}
+                    onRequestClose={() => this.setState({subjectVisible: false})}>
+                    <ImageViewer
+                        style={{menuContainer: -20}}
+                        imageUrls={subjectImages}
+                        index={this.state.imageIndex}
+                        renderHeader={() => this._imgViewRender()}
+                        saveToLocalByLongPress={true}
+                        menus={({cancel, saveToLocal}) => this._saveImgRender(cancel, saveToLocal)}
+                        onSave={(url) => this.savePhoto(url)}
+                    />
+                </Modal>
+
+            </Provider>
+        );
+
+    }
+}
+
+export const styles = StyleSheet.create({
+    uploadStyle: {
+        justifyContent: 'center',
+        padding: 10,
+        marginVertical: 10,
+    },
+    uploadText: {
+        textAlign: 'center',
+        padding: 3,
+        paddingTop: 10,
+        borderRadius: 5,
+        height: 35,
+        marginLeft: 2,
+        borderWidth: 1,
+        borderColor: '#ddd',
+        overflow: 'hidden',
+        fontFamily: 'iconfont',
+        fontSize: 14,
+        color: '#333',
+    },
+});
+export default BrowseImage;

+ 2 - 2
jscore/pages/Sales/checkCustomerDetail.js → jscore/pages/Sales/CheckCustomerDetail.js

@@ -12,7 +12,7 @@ import CallPhone from '../../components/CallPhone';
 import ComponentsStyles from '../../components/ComponentsStyles';
 
 @connect(customer => ({...customer}))
-class checkCustomerDetail extends Component {
+class CheckCustomerDetail extends Component {
     //  潜客跟踪
     constructor(props) {
         super(props);
@@ -220,5 +220,5 @@ const styles = StyleSheet.create({
     },
 });
 
-export default checkCustomerDetail;
+export default CheckCustomerDetail;
 

+ 1 - 1
jscore/pages/Sales/CheckCustomerList.js

@@ -57,7 +57,7 @@ class CheckCustomerList extends Component {
         const item = data.item;
         return (
             <TouchableOpacity style={ComponentsStyles.mainTouch}
-                              onPress={() => this.props.navigation.navigate('checkCustomerDetail', {
+                              onPress={() => this.props.navigation.navigate('CheckCustomerDetail', {
                                   id: item.id,
                               })}>
                 <View style={{flexDirection: 'row'}}>

+ 10 - 3
jscore/pages/Sales/Index.js

@@ -13,12 +13,13 @@ import WriteTrackReport from './WriteTrackReport';
 import EditCustomer from './EditCustomer';
 import WriteInternalReport from './WriteInternalReport';
 import CheckCustomerList from './CheckCustomerList';
-import checkCustomerDetail from './checkCustomerDetail';
+import CheckCustomerDetail from './CheckCustomerDetail';
 import CheckCustomer from './CheckCustomer';
 import UpdateProcess from './UpdateProcess';
 import ProcessList from './ProcessList';
 import ProcessDetail from './ProcessDetail';
 import DispatchProcess from './DispatchProcess';
+import BrowseImage from './BrowseImage';
 
 const HomeStack = createStackNavigator({
         SalesHome: {
@@ -87,8 +88,8 @@ const HomeStack = createStackNavigator({
                 title: '跟踪审核',
             },
         },
-        checkCustomerDetail: {
-            screen: checkCustomerDetail,
+        CheckCustomerDetail: {
+            screen: CheckCustomerDetail,
             navigationOptions: {
                 title: '审核详情',
             },
@@ -123,6 +124,12 @@ const HomeStack = createStackNavigator({
                 title: '分配进度',
             },
         },
+        BrowseImage: {
+            screen: BrowseImage,
+            navigationOptions: {
+                title: '资料图片',
+            },
+        },
     },
     {
         initialRouteName: 'SalesHome',

+ 30 - 8
jscore/pages/Sales/ProcessDetail.js

@@ -4,6 +4,7 @@ import {
     Text,
     StyleSheet,
     ScrollView,
+    TouchableOpacity,
     Dimensions, DeviceEventEmitter,
 } from 'react-native';
 import {Tabs, Provider, Button, List} from '@ant-design/react-native';
@@ -132,9 +133,22 @@ class ProcessDetail extends Component {
         </View>;
     };
 
+    gotoImage = (id, has_img) => {
+        if (has_img) {
+            this.props.navigation.navigate('BrowseImage',
+                {
+                    id: id,
+                },
+            );
+        }
+    };
+
     renderItem = (data) => {
         const item = data.item;
-        return <View style={styles.reportMain}>
+        return <TouchableOpacity
+            activeOpacity={0.9}
+            onPress={() => this.gotoImage(item.id, item.has_img)}
+            style={styles.reportMain}>
             <View style={styles.row5}>
                 <View style={ComponentsStyles.itemView}>
                     <Text style={ComponentsStyles.icon}>{'\ue619'} <Text
@@ -147,14 +161,22 @@ class ProcessDetail extends Component {
                 </View>
             </View>
             <View style={styles.row5}>
-                <Text style={ComponentsStyles.icon}>{'\ue6ed'} </Text>
-                <Text style={ComponentsStyles.font15}>{item.operation}</Text>
+                <View style={ComponentsStyles.itemView}>
+                    <Text style={ComponentsStyles.icon}>{'\ue6ed'} </Text>
+                    <Text style={ComponentsStyles.font15}>{item.operation}</Text>
+                </View>
+                {item.has_img &&
+                <View style={ComponentsStyles.itemViewEnd}>
+                    <Text style={ComponentsStyles.icon}>{'\ue61b'}</Text>
+                </View>
+                }
             </View>
-            <View style={styles.descView}>
-                <Text style={ComponentsStyles.font15}>备注</Text>
-                <Text style={[ComponentsStyles.font15, styles.descText]}>{item.notes}</Text>
+
+            <View style={styles.row5}>
+                <Text style={ComponentsStyles.icon}>{'\ue605'} </Text>
+                <Text style={[ComponentsStyles.font15, {width: '95%'}]}>{item.notes}</Text>
             </View>
-        </View>;
+        </TouchableOpacity>;
     };
 
     render() {
@@ -282,7 +304,7 @@ const styles = StyleSheet.create({
     },
     row5: {
         flexDirection: 'row',
-        paddingVertical: 5,
+        paddingVertical: 3,
     },
     red5: {
         fontSize: 15,

+ 17 - 7
jscore/pages/Sales/ReviewDetail.js

@@ -163,10 +163,10 @@ class ReviewDetail extends Component {
                            arrow="empty">
                     <Text style={ComponentsStyles.font15}>建档人</Text>
                 </List.Item>
-                <List.Item extra={<Text style={ComponentsStyles.font15}>{reviewDetailData.notes}</Text>}
-                           arrow="empty">
+                <View style={styles.descView}>
                     <Text style={ComponentsStyles.font15}>备注</Text>
-                </List.Item>
+                    <Text style={ComponentsStyles.font15}>{reviewDetailData.notes}</Text>
+                </View>
             </List>
         </View>;
     };
@@ -182,7 +182,7 @@ class ReviewDetail extends Component {
             </View>
             <View style={styles.row5}>
                 <Text style={ComponentsStyles.icon}>{'\ue6ed'} </Text>
-                <Text style={ComponentsStyles.font15}>{item.description}</Text>
+                <Text style={[ComponentsStyles.font15,{width:'95%'}]}>{item.description}</Text>
             </View>
             <View style={styles.row5}>
                 <Text style={ComponentsStyles.icon}>{'\ue6cc'} </Text>
@@ -191,12 +191,12 @@ class ReviewDetail extends Component {
 
             <View style={styles.row5}>
                 <Text style={styles.red5}>支援或放弃:</Text>
-                <Text style={ComponentsStyles.font15}>{item.instruction}</Text>
+                <Text style={[ComponentsStyles.font15,{width:'73%'}]}>{item.instruction}</Text>
             </View>
 
             <View style={styles.row5}>
                 <Text style={styles.red5}>审核:</Text>
-                <Text style={ComponentsStyles.font15}>{item.check_status_text}--{item.check_comment}</Text>
+                <Text style={[ComponentsStyles.font15,{width:'86%'}]}>{item.check_status_text}--{item.check_comment}</Text>
             </View>
         </View>;
     };
@@ -478,13 +478,23 @@ const styles = StyleSheet.create({
     },
     row5: {
         flexDirection: 'row',
-        paddingVertical: 5,
+        paddingVertical: 3,
     },
     red5: {
         fontSize: 15,
         color: 'red',
         padding: 2,
     },
+    descView: {
+        marginHorizontal: 15,
+        paddingVertical: 2,
+        borderBottomWidth: 1,
+        borderBottomColor: '#eee',
+    },
+    descText: {
+        color: '#928f8f',
+        paddingVertical: 2,
+    },
 });
 
 export default ReviewDetail;

+ 5 - 1
jscore/services/customer.js

@@ -34,7 +34,7 @@ export async function queryCheckCustomer(params) {
 }
 
 export async function getProcess(params) {
-    return request(`/order/get_process/?dispatch=1&customer_id=` + params.customer_id);
+    return request(`/order/get_process/?dispatch=1&customer_id=` + params.customer);
 }
 
 export async function queryOrderList(params) {
@@ -53,6 +53,10 @@ export async function queryProcessDict(params) {
     return request(`/option/get_option/?types=4`);
 }
 
+export async function queryProcessImage(params) {
+    return request(`/order/get_files/?${stringify(params)}`);
+}
+
 export async function dispatchUser(params) {
     let formdata = new FormData();
     formdata.append('user', params.user[0]);

+ 2 - 8
package.json

@@ -10,7 +10,6 @@
   },
   "dependencies": {
     "@ant-design/react-native": "^3.2.2",
-    "@react-native-community/art": "^1.2.0",
     "@react-native-community/async-storage": "^1.8.0",
     "@react-native-community/cameraroll": "^1.6.0",
     "@react-native-community/masked-view": "^0.1.6",
@@ -23,25 +22,20 @@
     "grapheme-splitter": "^1.0.4",
     "react": "16.9.0",
     "react-native": "0.61.5",
-    "react-native-action-button": "^2.8.5",
-    "react-native-autoheight-webview": "1.5.1",
     "react-native-cached-images-zzly": "^0.1.3",
     "react-native-camera": "^3.40.0",
-    "react-native-charts-wrapper": "^0.5.7",
     "react-native-datepicker": "^1.7.2",
-    "react-native-dismiss-keyboard": "^1.0.0",
-    "react-native-dropdown-menu": "^2.0.0",
     "react-native-elements": "^2.0.2",
     "react-native-fs": "^2.16.6",
     "react-native-gesture-handler": "^1.6.0",
     "react-native-gifted-chat": "^0.13.0",
     "react-native-icon-badge": "^1.1.3",
+    "react-native-image-zoom-viewer": "^2.2.7",
     "react-native-paper": "^3.6.0",
-    "react-native-progress": "^4.1.0",
     "react-native-refresh-flatlist": "^1.0.1",
     "react-native-safe-area-context": "^0.7.3",
     "react-native-screens": "^2.0.0-beta.6",
-    "react-native-svg": "^12.1.0",
+    "react-native-svg": "12.1.0",
     "react-native-syan-image-picker-zzly": "^1.0.1",
     "react-native-tableview-simple": "^2.4.1",
     "react-native-tree-select": "^2.0.9",