From c41f5fe7fd28520935c31022c348238f75ab96f7 Mon Sep 17 00:00:00 2001
From: wtt <1985833171@qq.com>
Date: 星期三, 17 九月 2025 17:42:36 +0800
Subject: [PATCH] Merge branch 'Dev' of http://101.37.171.70:10101/r/~jhz/STUWMS into Dev

---
 pages/quyangdan/table.vue                                                  |    2 
 pages/zutuosaoma/form.vue                                                  |  682 ++++++++++
 uni_modules/zb-table/components/zb-table/zb-table.vue                      | 1345 +++++++++++++++++++++
 uni_modules/zb-table/package.json                                          |   81 +
 uni_modules/zb-table/components/zb-table/js/util.js                        |   51 
 pages.json                                                                 |   35 
 uni_modules/zb-table/components/zb-table/components/table-checkbox.vue     |  180 ++
 uni_modules/zb-table/components/zb-table/components/table-summary.vue      |   77 +
 pages/InnerHtmlPage/index.vue                                              |   26 
 pages/zutuosaoma/table.vue                                                 |   28 
 uni_modules/zb-table/readme.md                                             |  189 ++
 uni_modules/zb-table/components/zb-table/js/summary.js                     |   88 +
 uni_modules/zb-table/changelog.md                                          |  106 +
 uni_modules/zb-table/components/zb-table/components/table-side-summary.vue |   59 
 pages/chaituosaoma/form.vue                                                |  678 ++++++++++
 manifest.json                                                              |    2 
 uni_modules/zb-table/components/zb-table/components/zb-load-more.vue       |   50 
 utils/mpaasScan.js                                                         |    5 
 pages/white/white.vue                                                      |   26 
 pages/index/index.vue                                                      |   15 
 uni_modules/zb-table/components/zb-table/components/table-h5-summary.vue   |   78 +
 21 files changed, 3,793 insertions(+), 10 deletions(-)

diff --git a/manifest.json b/manifest.json
index 9e5b387..d639705 100644
--- a/manifest.json
+++ b/manifest.json
@@ -3,7 +3,9 @@
     "appid" : "__UNI__B002F49",
     "description" : "",
     "versionName" : "1.0.81",
+
     "versionCode" : 181,
+    "versionName" : "1.0.80",
     "transformPx" : false,
     /* 5+App鐗规湁鐩稿叧 */
     "app-plus" : {
diff --git a/pages.json b/pages.json
index f35caa3..9278ef0 100644
--- a/pages.json
+++ b/pages.json
@@ -767,6 +767,41 @@
             {
                 "navigationBarTitleText" : ""
             }
+        },
+        {
+            "path" : "pages/white/white",
+            "style" : 
+            {
+                "navigationBarTitleText" : ""
+            }
+        },
+        {
+            "path" : "pages/zutuosaoma/table",
+            "style" : 
+            {
+                "navigationBarTitleText" : "鏉$爜缁勬墭鍗曠紦瀛�"
+            }
+        },
+        {
+            "path" : "pages/zutuosaoma/form",
+            "style" : 
+            {
+                "navigationBarTitleText" : "鏉$爜缁勬墭鍗�"
+            }
+        },
+        {
+            "path" : "pages/zutuosaoma/table",
+            "style" : 
+            {
+                "navigationBarTitleText" : "缁勬墭鎵爜缂撳瓨"
+            }
+        },
+        {
+            "path" : "pages/chaituosaoma/form",
+            "style" : 
+            {
+                "navigationBarTitleText" : "鎷嗘墭鎵爜"
+            }
         }
     ],
     "tabBar": {
diff --git a/pages/InnerHtmlPage/index.vue b/pages/InnerHtmlPage/index.vue
index de8b460..db19589 100644
--- a/pages/InnerHtmlPage/index.vue
+++ b/pages/InnerHtmlPage/index.vue
@@ -20,17 +20,29 @@
                 })
             }
             let pageMode = e.pageMode || 'vertical'
-            if (pageMode == 'horizontal') {
-                plus.screen.lockOrientation('landscape-primary');
-            } else {
-                plus.screen.lockOrientation('portrait-primary');
-            }
+              // #ifdef APP-PLUS
+                uni.showLoading({
+                    title: "鍔犺浇涓�..."
+                })
+                setTimeout(() => {
+                    plus.screen.unlockOrientation();
+                    if (pageMode == 'horizontal') {
+                        plus.screen.lockOrientation('landscape-primary');
+                    } else {
+                        plus.screen.lockOrientation('portrait-primary');
+                    }
+                    uni.hideLoading();
+                }, 800)
+                //#endif
+
+            
 
         },
-        onUnload() {
+        async onUnload() {
             // 鎭㈠鍒扮珫灞�
+            plus.screen.unlockOrientation()
             plus.screen.lockOrientation('portrait-primary');
-        }
+        },
     }
 </script>
 
diff --git a/pages/chaituosaoma/form.vue b/pages/chaituosaoma/form.vue
new file mode 100644
index 0000000..5ca10b2
--- /dev/null
+++ b/pages/chaituosaoma/form.vue
@@ -0,0 +1,678 @@
+<template>
+    <view class="form">
+        <view class="form-base-info">
+            <view class="form-item">
+                <view class="title">绠辨潯鐮�</view>
+                <view class="right">
+                    <input type="text" :focus="HBarCodePackFocus" v-model="HBarCode_Pack" @confirm="GetMeesageByBarCode_Pack(HBarCode_Pack)" />
+                </view>
+                <view class="right-icon">
+                    <uni-icons class="right-icon" type="scan"
+                        style="background-color: #3A78FF;padding: 6rpx;color: #fff;border-radius: 100%;" size="20"
+                        @click="toScanCode"></uni-icons>
+                </view>
+            </view>
+            <!-- <view class="form-item">
+                <view class="title">鏉$爜</view>
+                <view class="right">
+                    <input type="text" :focus="HBarCodeFocus" v-model="HBarCode" @confirm="GetMeesageByBarCode(HBarCode)" />
+                </view>
+                <view class="right-icon">
+                    <uni-icons type="scan"
+                        style="background-color: #3A78FF;padding: 6rpx;color: #fff;border-radius: 100%;" size="20"
+                        @click="toScanCode2"></uni-icons>
+                </view>
+            </view> -->
+        </view>
+        <view class="tabs">
+            <view :class="tabs == 0 ? 'on':''" @tap="tabs = 0">瑁呯淇℃伅</view>
+            <view :class="tabs == 1 ? 'on':''" @tap="tabs = 1">鍗曟嵁淇℃伅</view>
+        </view>
+        <!-- 瑁呯淇℃伅 -->
+        <view v-if="tabs == 0">
+            <zb-table id="list-table" :style="{height: `${listTableHeight}px`}" :columns="columns" :data="listData"
+                :show-header="true" :border="true" :row-key="row => row.index" @toggleRowSelection="handleSelect"
+                @toggleAllSelection="handleSelectAll" />
+        </view>
+        <!-- 鍗曟嵁淇℃伅 -->
+        <view v-if="tabs == 1">
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁鏃ユ湡</view>
+                    <view class="right">
+                        <uni-datetime-picker type="date" v-model="hform.HDate">
+                            <input type="text" v-model="hform.HDate" />
+                        </uni-datetime-picker>
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍒跺崟浜�</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HMaker" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁鍙�</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HBillNo" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁ID</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HInterID" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">缁勭粐</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HStockOrgName" />
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="bottom-btn" id="bottom-btn">
+            <button class="btn-a" size="mini" @tap="cmdSubmit">鎷嗙</button>
+            <view style="flex: 1;"></view>
+            <!-- <button class="btn-d" size="mini" @tap="cmdDelete">鍒犻櫎</button> -->
+            <button class="btn-c" size="mini" @tap="cmdExit">閫�鍑�</button>
+        </view>
+    </view>
+</template>
+
+<script>
+    import dayjs from 'dayjs'
+    import {
+        getUserInfo
+    } from "../../utils/auth";
+    import {
+        CommonUtils
+    } from "@/utils/common.js"
+    import {
+        MpaasScan
+    } from "@/utils/mpaasScan.js"
+    export default {
+        data() {
+            return {
+                // 璁$畻鍒楄〃楂樺害
+                bottomBtnTop: 0,
+                listTableTop: 0,
+                // 鍏叡鍙橀噺 
+                HBarCodePackFocus: false,
+                HBarCodeFocus: false,
+                HBarCode_Pack: '', //绠辨潯鐮�
+                HBarCode: '', // 鍖呮潯鐮�
+                tabs: 0,
+                HBillType: '3783',
+                HBillSubType: '1', //瀛愮被鍨嬶紙1鎷嗙銆�2鎷嗘墭锛�
+                OperationType: 1, //鎿嶄綔绫诲瀷锛�1鏂板銆�2浠庣紦瀛樺垪琛ㄤ腑杩斿洖锛�
+                HMaterNumber_Pack: "", //鎵樻潯鐮佸搴旂墿鏂欎唬鐮�
+                listOption: [],
+                listData: [],
+                columns: [
+                    {
+                        type: 'selection',
+                        fixed: true,
+                        width: 50
+                    },
+                    {
+                        name: 'index',
+                        label: '搴忓彿',
+                        width: 60
+                    },
+                    {
+                        name: '鏉$爜缂栧彿',
+                        label: '鏉$爜缂栧彿',
+                        width: 200,
+                    },
+                    {
+                        name: '鏁伴噺',
+                        label: '鏁伴噺',
+                        width: 100,
+                    },
+                    {
+                        name: '鐗╂枡浠g爜',
+                        label: '鐗╂枡浠g爜',
+                        width: 200,
+                    },
+                    {
+                        name: '鐗╂枡鍚嶇О',
+                        label: '鐗╂枡鍚嶇О',
+                        width: 200,
+                    },
+                    {
+                        name: '鏉$爜涓暟',
+                        label: '鏉$爜涓暟',
+                        width: 100,
+                    }
+                ],
+                selectedRows: [], // 瀛樺偍閫変腑鐨勬暟鎹�
+                HModName: "Sc_PackUnionBill_Packing_PDA",
+                ModRightName: "CE_PackUnionBill_Packing", //妯″潡鏉冮檺鍙傛暟
+                titleData: [], //涓嶉渶瑕佹樉绀虹殑瀛楁
+                OperationType: 1, //浠庣紦瀛樺垪琛ㄤ腑杩斿洖鏁版嵁绫诲瀷锛�1鏂板銆�2浠庣紦瀛樺垪琛ㄤ腑杩斿洖锛�
+                HBarCode_Pack_Temp: "", //浠庣紦瀛樺垪琛ㄤ腑杩斿洖绠辨潯鐮�
+
+                // 琛ㄥ崟鎻愪氦鍊�
+                hform: {
+                    HDate: dayjs(new Date()).format('YYYY-MM-DD'),
+                    HMaker: getUserInfo()['Czymc'],
+                    HBillNo: '',
+                    HInterID: '',
+                    HStockOrgName: uni.getStorageSync("Organization"),
+                    HStockOrgID: uni.getStorageSync("OrganizationID"),
+                },
+                // 鍒嗛〉妯″潡鍏冩暟鎹�
+                paginationMeta: {
+
+                }
+            }
+        },
+        methods: {
+            async HBarCodeFocusRefresh(){
+              this.HBarCode = ''
+              this.HBarCodeFocus = false
+              await this.$nextTick()
+              this.HBarCodeFocus = true
+            },
+            async HBarCodePackFocusRefresh(){
+              this.HBarCode_Pack = ''
+              this.HBarCodePackFocus = false
+              await this.$nextTick()
+              this.HBarCodePackFocus = true
+            },
+            toScanCode() {
+                MpaasScan.scanCode((scanCode) => {
+                    this.HBarCode_Pack = scanCode
+                    this.GetMeesageByBarCode_Pack(HBarCode_Pack)
+                })
+            },
+            GetMeesageByBarCode_Pack(HBarCode_Pack) {
+                // 鑾峰彇鎵樻潯鐮佸搴旂殑鏁版嵁
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/Get_PackBarCode_UnPackUnionBill_Json',
+                    data: {
+                       
+                        HBillSubType: this.HBillSubType,
+                        HBarCode_Pack: HBarCode_Pack
+                    },
+                    resFunction: (res) => {
+                        let {
+                            data,
+                            count,
+                            Message,
+                            list
+                        } = res.data
+                        if (count == 1) {
+                            CommonUtils.playSound(1)
+                            this.hform.HBillNo = data[0].HBillNo
+                            this.hform.HInterID = data[0].HInterID
+                            this.HMaterNumber_Pack = data[0].HMaterNumber
+                            this.DisBillEntryList();
+                            uni.showToast({
+                                icon: 'none',
+                                title: Message
+                            })
+                        } else {
+                            CommonUtils.playSound(1)
+                            this.HBarCodePackFocusRefresh()
+                            uni.showToast({
+                                icon: 'none',
+                                title: Message
+                            })
+                        }
+                    }
+                })
+            },
+            toScanCode2() {
+                MpaasScan.scanCode((scanCode) => {
+                    this.HBarCode = scanCode
+                    GetMeesageByBarCode(scanCode)
+                })
+            },
+            GetMeesageByBarCode(HBarCode) {
+                // 鑾峰彇鍖呮潯鐮佸搴旂殑鏁版嵁 
+                let HBarCode_Pack = this.HBarCode_Pack
+                let sOldBarCode = this.HBarCode
+                let HDeleteFlag = sOldBarCode.substring(0, 1)
+                let sBarCode = sOldBarCode.slice(1)
+                if (!HBarCode_Pack) {
+                    return uni.showToast({
+                        icon: 'none',
+                        title: '鎵樻潯鐮佷负绌猴紝璇峰厛鎵弿鎵樻潯鐮�',
+                    })
+                }
+
+                if (HDeleteFlag == '*') {
+                    if (!sBarCode) {
+                        return uni.showToast({
+                            icon: 'none',
+                            title: '璇锋壂鎻忚鍒犻櫎鐨勭鏉$爜',
+                        })
+                    } else {
+                        this.HBarCodeFocusRefresh()
+                    }
+                    CommonUtils.doRequest2({
+                        url: '/WEBSController/set_DelPackUnionBill_Temp_Pack_Json',
+                        data: {
+                            "HInterID": this.hform.HInterID,
+                            "HBarCode": sBarCode,
+                            "HBillType": this.HBillType
+                        },
+                        resFunction: (res) => {
+                            let {
+                                data,
+                                count,
+                                Message
+                            } = res.data
+                            if (count == 1) {
+                                CommonUtils.playSound(1)
+                                this.DisBillEntryList()
+                            } else {
+                                CommonUtils.playSound(0)
+                                uni.showToast({
+                                    icon: 'none',
+                                    title: Message
+                                })
+                            }
+                        }
+                    })
+                } else {
+                    let sBarCode = this.HBarCode
+                    if (!sBarCode) {
+                        return uni.showToast({
+                            icon: 'none',
+                            title: '绠辨潯鐮佷笉鑳戒负绌猴紝璇锋壂鎻忕鏉$爜',
+                        })
+                    }
+                    CommonUtils.doRequest2({
+                        url: '/WEBSController/Get_BarCode_PackUnionBill_New_Json',
+                        data: {
+                            "HInterID": this.hform.HInterID,
+                            "HBarCode": sBarCode,
+                            "HBillType": this.HBillType,
+                            "HBillNo": this.hform.HBillNo,
+                            "HBillSubType": this.HBillSubType,
+                            "HBarCode_Pack": HBarCode_Pack,
+                            "HMaterNumber_Pack": this.HMaterNumber_Pack,
+                            "HMaker": this.hform.HMaker,
+                            "HStockOrgID": this.hform.HStockOrgID
+                        },
+                        resFunction: (res) => {
+                            let {
+                                data,
+                                count,
+                                Message
+                            } = res.data
+                            if (count == 1) {
+                                CommonUtils.playSound(1)
+                                this.HBarCodeFocusRefresh()
+                                this.DisBillEntryList()
+                            } else {
+                                CommonUtils.playSound(0)
+                                this.HBarCodeFocusRefresh()
+                                uni.showToast({
+                                    icon: 'none',
+                                    title: Message
+                                })
+                            }
+                        }
+                    })
+                }
+            },
+            DisBillEntryList() {
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/GetBillEntry_Tmp_Pack_Json',
+                    data: {
+                        "HInterID": this.hform.HInterID,
+                        "HBillNo": this.hform.HBillNo,
+                        "HBillType": this.HBillType
+                    },
+                    resFunction: (res) => {
+                        let {
+                            count,
+                            data,
+                            Message
+                        } = res.data
+                        if (count == 1) {
+                            this.listData = []
+                            for (let i = 0; i < data.length; i++) {
+                                this.listData.push(Object.assign(data[i], {
+                                    index: i
+                                }))
+                            }
+                        } else {
+                            // 娌℃湁浠讳綍璁板綍瑙嗕负浠�0寮�濮嬫柊澧�
+                            this.listData = []
+                        }
+                    }
+                })
+            },
+            handleSelect(selected, array) {
+                this.selectedRows = array
+            },
+            handleSelectAll(selected, array) {
+                this.selectedRows = array
+            },
+            getMaxNo() {
+                CommonUtils.doRequest2({
+                    url: "/WEBSController/GetMaxBillNoAndID_Json",
+                    data: {
+                        "HBillType": this.HBillType
+                    },
+                    resFunction: (d) => {
+                        console.log('d: ', d);
+                        let {
+                            count,
+                            data,
+                            Message
+                        } = d.data
+                        if (count == 1) {
+                            this.hform.HInterID = data[0].HInterID;
+                            this.hform.HBillNo = data[0].HBillNo
+                        } else {
+
+                            uni.showModal({
+                                title: "娓╅Θ鎻愮ず",
+                                showCancel: false,
+                                content: Message
+
+                            })
+
+                        }
+                    }
+                })
+            },
+            submitPreCheck() {
+                if (CommonUtils.isEmpty(this.hform.HInterID)) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '鍗曟嵁鍐呯爜鑾峰彇澶辫触锛岄敊璇殑鍗曟嵁鍐呯爜锛�'
+                    })
+                    return false
+                }
+                if (CommonUtils.isEmpty(this.hform.HBillNo)) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '鍗曟嵁鍙疯幏鍙栧け璐ワ紝閿欒鐨勫崟鎹彿锛�'
+                    })
+                    return false
+                }
+                if (this.listData.length < 1) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '娌℃湁鎵爜淇℃伅锛岃鍏堟壂鎻忔潯鐮侊紝纭鏃犺鍚庡啀鎻愪氦锛�'
+                    })
+                    return false
+                }
+                return true
+            },
+            cmdDelete() {
+                console.log('this.selectedRows: ', this.selectedRows);
+                if (this.selectedRows.length != 1) {
+                    return uni.showToast({
+                        icon: 'none',
+                        title: '璇烽�夋嫨涓�琛岃褰曪紝杩涜鍒犻櫎锛�'
+                    })
+                }
+                uni.showModal({
+                    title: '鍒犻櫎纭',
+                    content: '纭瑕佸垹闄ら�変腑琛屾墍鏈夋壂鐮佽褰曪紵鍒犻櫎鍚庡皢涓嶅彲鎭㈠!',
+                    success: () => {
+                        if (confirm) {
+                            CommonUtils.doRequest2({
+                                url: '/WEBSController/set_DelPackUnionBill_Temp_Pack_Json',
+                                data: {
+                                    HInterID: this.hform.HInterID,
+                                    HBillType: this.HBillType,
+                                    HBarCode: this.selectedRows[0].HBarCode
+                                },
+                                resFunction: (res) => {
+                                    let {
+                                        data,
+                                        count,
+                                        Message
+                                    } = res.data
+                                    if (count == 1) {
+                                        CommonUtils.playSound(1)
+                                        uni.showToast({
+                                            icon: 'none',
+                                            title: Message
+                                        })
+                                        this.DisBillEntryList()
+                                    } else {
+                                        CommonUtils.playSound(0)
+                                        uni.showToast({
+                                            icon: 'none',
+                                            title: Message
+                                        })
+                                    }
+                                }
+                            })
+                        }
+                    }
+                })
+            },
+            cmdSubmit() {
+                let checkRes = this.submitPreCheck()
+                if (!checkRes) {
+                    return
+                }
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/set_SaveUnPackUnionBill_Json',
+                    data: {
+                        "HInterID": this.hform.HInterID,
+                        "HBillNo": this.hform.HBillNo,
+                        "HBarCode_Pack": this.HBarCode_Pack,
+                        "HMaker": this.hform.HMaker,
+                    },
+                    resFunction: (res) => {
+                        let {data, count, Message} = res.data
+                        if(count == 1){
+                            uni.showModal({
+                                title: '娓╅Θ鎻愮ず',
+                                content: Message,
+                                confirmText: "鏂板",
+                                cancelText: '鍏抽棴',
+                                success: ({confirm,cancel}) => {
+                                    if(confirm) {
+                                        uni.redirectTo({
+                                            url: "/pages/zutuosaoma/form"
+                                        })
+                                    }
+                                    
+                                    if(cancel) {
+                                        uni.navigateBack()
+                                    }
+                                }
+                            })
+                        }else {
+                            uni.showToast({
+                                icon:'none',
+                                title: Message
+                            })
+                        }
+                    }
+                })
+            },
+            cmdExit() {
+                uni.navigateBack()
+            }
+        },
+        computed: {
+            listTableHeight: {
+                get() {
+                    return this.bottomBtnTop - this.listTableTop - 10
+                }
+            }
+        },
+        async onReady() {
+            // #ifndef MP-WEIXIN
+            let query = uni.createSelectorQuery().in(this)
+            query.select("#bottom-btn")
+                .boundingClientRect((data) => {
+                    if (data) {
+                        this.bottomBtnTop = data.top
+                    } else {
+                        console.log("鏈壘鍒�#bottom-btn鑺傜偣");
+                    }
+                })
+                .exec();
+            query.select("#list-table")
+                .boundingClientRect((data) => {
+                    if (data) {
+                        this.listTableTop = data.top
+                    } else {
+                        console.log("鏈壘鍒�#list-table鑺傜偣");
+                    }
+                })
+                .exec();
+            // #endif
+        },
+        onLoad(e) {
+            this.OperationType = e.OperationType || 1
+            this.HBarCode_Pack_Temp = e.CommonUtils || ""
+
+            if (this.OperationType == 1) {
+                this.getMaxNo()
+            } else if (this.OperationType == 2) {
+
+            }
+        }
+    }
+</script>
+
+<style lang="scss">
+    input {
+        width: inherit;
+        padding: 8rpx 20rpx;
+        font-size: 30rpx;
+    }
+
+    .form {
+        display: flex;
+        flex-direction: column;
+        gap: 20rpx;
+
+        .form-base-info {
+            display: flex;
+            flex-direction: column;
+            gap: 10rpx;
+            box-sizing: border-box;
+            padding: 30rpx;
+        }
+
+        .bill-info {
+            display: flex;
+            flex-direction: column;
+            gap: 10rpx;
+            box-sizing: border-box;
+            padding: 16rpx 30rpx;
+        }
+
+        .form-item {
+            display: flex;
+            flex-direction: row;
+            gap: 10rpx;
+
+            .title {
+                width: 5rem;
+                flex-shrink: 0;
+            }
+
+            .right {
+                flex: 1;
+                border-radius: 22rpx;
+                border: 1px solid #acacac;
+            }
+
+            .disabled {
+                border: 1px solid #e4e4e4;
+                background-color: #e4e4e4;
+            }
+
+            .right-icon {
+                flex-shrink: 0;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+            }
+
+        }
+    }
+
+    .tabs {
+        width: 100%;
+        display: flex;
+        border-bottom: 1px solid #ddd;
+        margin: 20rpx 0;
+
+        view {
+            width: 25%;
+            font-size: 30rpx;
+            color: #555;
+            text-align: center;
+            padding: 16rpx 0;
+        }
+
+        .on {
+            color: #3a78ff;
+            font-weight: bold;
+            border-bottom: 3px solid #3a78ff;
+        }
+    }
+
+    .bottom-btn {
+        width: 100%;
+        box-sizing: border-box;
+        // height: 120rpx;
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        background-color: #fff;
+        box-shadow: 0 2rpx 10rpx 2rpx rgba(0, 0, 0, 0.4);
+        padding: 30rpx 40rpx 40rpx 40rpx;
+        display: flex;
+        flex-direction: row;
+        gap: 10rpx;
+
+        button {
+            border-radius: 50rpx;
+            width: 180rpx;
+            height: 66rpx;
+            line-height: 66rpx;
+            font-size: 28rpx;
+        }
+
+        .btn-a {
+            background-color: #3A78FF;
+            color: #fff;
+        }
+
+        .btn-b {
+            background-color: #41a863;
+            color: #fff;
+        }
+
+        .btn-c {
+            background-color: #acacac;
+            color: #fff;
+            // position: absolute;
+            // right: 120rpx;
+        }
+
+        .btn-d {
+            background-color: #ff8901;
+            color: #fff;
+        }
+    }
+    
+</style>
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 65fa8a4..0cc7315 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -210,7 +210,20 @@
 						url: `/pages/InnerHtmlPage/index?src=http://172.16.72.15:8999/index.aspx?name=${getUserInfo()['HICNumber']}&pageTitle=妫�楠屾姤鍛�&pageMode=horizontal`,
 						id: 24,
 						hidden: false,
-					},
+					},{
+                        img: '../../static/icon/icon8.png',
+                        text: '缁勬墭鎵爜',
+                        url: `/pages/zutuosaoma/form`,
+                        id: 25,
+                        hidden: false,
+                    },
+                    {
+                        img: '../../static/icon/icon8.png',
+                        text: '鎷嗘墭鎵爜',
+                        url: `/pages/chaituosaoma/form`,
+                        id: 26,
+                        hidden: false,
+                    }
 					],
 					// itemData: [{
 					// 		img: '../../static/icon/icon1.png',
diff --git a/pages/quyangdan/table.vue b/pages/quyangdan/table.vue
index ed0a009..ed247e7 100644
--- a/pages/quyangdan/table.vue
+++ b/pages/quyangdan/table.vue
@@ -447,6 +447,8 @@
                     width: 100%;
                 }
             }
+            
+            
         }
 
         input {
diff --git a/pages/white/white.vue b/pages/white/white.vue
new file mode 100644
index 0000000..a8f4551
--- /dev/null
+++ b/pages/white/white.vue
@@ -0,0 +1,26 @@
+<template>
+    <view>
+        
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'white',
+        data() {
+            return {
+                
+            }
+        },
+        onLoad: () => {
+            uni.navigateBack()
+        },
+        methods: {
+            
+        }
+    }
+</script>
+
+<style>
+
+</style>
diff --git a/pages/zutuosaoma/form.vue b/pages/zutuosaoma/form.vue
new file mode 100644
index 0000000..b6c1725
--- /dev/null
+++ b/pages/zutuosaoma/form.vue
@@ -0,0 +1,682 @@
+<template>
+    <view class="form">
+        <view class="form-base-info">
+            <view class="form-item">
+                <view class="title">鎵樻潯鐮�</view>
+                <view class="right">
+                    <input type="text" :focus="HBarCodePackFocus" v-model="HBarCode_Pack" @confirm="GetMeesageByBarCode_Pack(HBarCode_Pack)" />
+                </view>
+                <view class="right-icon">
+                    <uni-icons class="right-icon" type="scan"
+                        style="background-color: #3A78FF;padding: 6rpx;color: #fff;border-radius: 100%;" size="20"
+                        @click="toScanCode"></uni-icons>
+                </view>
+            </view>
+            <view class="form-item">
+                <view class="title">鏉$爜</view>
+                <view class="right">
+                    <input type="text" :focus="HBarCodeFocus" v-model="HBarCode" @confirm="GetMeesageByBarCode(HBarCode)" />
+                </view>
+                <view class="right-icon">
+                    <uni-icons type="scan"
+                        style="background-color: #3A78FF;padding: 6rpx;color: #fff;border-radius: 100%;" size="20"
+                        @click="toScanCode2"></uni-icons>
+                </view>
+            </view>
+        </view>
+        <view class="tabs">
+            <view :class="tabs == 0 ? 'on':''" @tap="tabs = 0">瑁呯淇℃伅</view>
+            <view :class="tabs == 1 ? 'on':''" @tap="tabs = 1">鍗曟嵁淇℃伅</view>
+        </view>
+        <!-- 瑁呯淇℃伅 -->
+        <view v-if="tabs == 0">
+            <zb-table id="list-table" :style="{height: `${listTableHeight}px`}" :columns="columns" :data="listData"
+                :show-header="true" :border="true" :row-key="row => row.index" @toggleRowSelection="handleSelect"
+                @toggleAllSelection="handleSelectAll" />
+        </view>
+        <!-- 鍗曟嵁淇℃伅 -->
+        <view v-if="tabs == 1">
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁鏃ユ湡</view>
+                    <view class="right">
+                        <uni-datetime-picker type="date" v-model="hform.HDate">
+                            <input type="text" v-model="hform.HDate" />
+                        </uni-datetime-picker>
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍒跺崟浜�</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HMaker" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁鍙�</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HBillNo" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">鍗曟嵁ID</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HInterID" />
+                    </view>
+                </view>
+            </view>
+            <view class="bill-info">
+                <view class="form-item">
+                    <view class="title">缁勭粐</view>
+                    <view class="right disabled">
+                        <input type="text" disabled :value="hform.HStockOrgName" />
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="bottom-btn" id="bottom-btn">
+            <button class="btn-a" size="mini" @tap="cmdSubmit">鎻愪氦</button>
+            <view style="flex: 1;"></view>
+            <button class="btn-d" size="mini" @tap="cmdDelete">鍒犻櫎</button>
+            <button class="btn-c" size="mini" @tap="cmdExit">閫�鍑�</button>
+        </view>
+    </view>
+</template>
+
+<script>
+    import dayjs from 'dayjs'
+    import {
+        getUserInfo
+    } from "../../utils/auth";
+    import {
+        CommonUtils
+    } from "@/utils/common.js"
+    import {
+        MpaasScan
+    } from "@/utils/mpaasScan.js"
+    export default {
+        data() {
+            return {
+                // 璁$畻鍒楄〃楂樺害
+                bottomBtnTop: 0,
+                listTableTop: 0,
+                // 鍏叡鍙橀噺 
+                HBarCodePackFocus: false,
+                HBarCodeFocus: false,
+                HBarCode_Pack: '', //绠辨潯鐮�
+                HBarCode: '', // 鍖呮潯鐮�
+                tabs: 0,
+                HBillType: '3783',
+                HBillSubType: '1', //瀛愮被鍨嬶紙1瑁呯銆�2缁勬墭锛�
+                OperationType: 1, //鎿嶄綔绫诲瀷锛�1鏂板銆�2浠庣紦瀛樺垪琛ㄤ腑杩斿洖锛�
+                HMaterNumber_Pack: "", //鎵樻潯鐮佸搴旂墿鏂欎唬鐮�
+                listOption: [],
+                listData: [],
+                columns: [
+                    {
+                        type: 'selection',
+                        fixed: true,
+                        width: 50
+                    },
+                    {
+                        name: 'index',
+                        label: '搴忓彿',
+                        width: 60
+                    },
+                    {
+                        name: '鏉$爜缂栧彿',
+                        label: '鏉$爜缂栧彿',
+                        width: 200,
+                    },
+                    {
+                        name: '鏁伴噺',
+                        label: '鏁伴噺',
+                        width: 100,
+                    },
+                    {
+                        name: '鐗╂枡浠g爜',
+                        label: '鐗╂枡浠g爜',
+                        width: 200,
+                    },
+                    {
+                        name: '鐗╂枡鍚嶇О',
+                        label: '鐗╂枡鍚嶇О',
+                        width: 200,
+                    },
+                    {
+                        name: '鏉$爜涓暟',
+                        label: '鏉$爜涓暟',
+                        width: 100,
+                    }
+                ],
+                selectedRows: [], // 瀛樺偍閫変腑鐨勬暟鎹�
+                HModName: "Sc_PackUnionBill_Packing_PDA",
+                ModRightName: "CE_PackUnionBill_Packing", //妯″潡鏉冮檺鍙傛暟
+                titleData: [], //涓嶉渶瑕佹樉绀虹殑瀛楁
+                OperationType: 1, //浠庣紦瀛樺垪琛ㄤ腑杩斿洖鏁版嵁绫诲瀷锛�1鏂板銆�2浠庣紦瀛樺垪琛ㄤ腑杩斿洖锛�
+                HBarCode_Pack_Temp: "", //浠庣紦瀛樺垪琛ㄤ腑杩斿洖绠辨潯鐮�
+
+                // 琛ㄥ崟鎻愪氦鍊�
+                hform: {
+                    HDate: dayjs(new Date()).format('YYYY-MM-DD'),
+                    HMaker: getUserInfo()['Czymc'],
+                    HBillNo: '',
+                    HInterID: '',
+                    HStockOrgName: uni.getStorageSync("Organization"),
+                    HStockOrgID: uni.getStorageSync("OrganizationID"),
+                },
+                // 鍒嗛〉妯″潡鍏冩暟鎹�
+                paginationMeta: {
+
+                }
+            }
+        },
+        methods: {
+            async HBarCodeFocusRefresh(){
+              this.HBarCode = ''
+              this.HBarCodeFocus = false
+              await this.$nextTick()
+              this.HBarCodeFocus = true
+            },
+            async HBarCodePackFocusRefresh(){
+              this.HBarCode_Pack = ''
+              this.HBarCodePackFocus = false
+              await this.$nextTick()
+              this.HBarCodePackFocus = true
+            },
+            toScanCode() {
+                MpaasScan.scanCode((scanCode) => {
+                    this.HBarCode_Pack = scanCode
+                    this.GetMeesageByBarCode_Pack(HBarCode_Pack)
+                })
+            },
+            GetMeesageByBarCode_Pack(HBarCode_Pack) {
+                // 鑾峰彇鎵樻潯鐮佸搴旂殑鏁版嵁
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/Get_PackBarCode_PackUnionBill_New_Json',
+                    data: {
+                        HInterID: this.hform.HInterID,
+                        HBillNo: this.hform.HBillNo,
+                        HBillType: this.HBillType,
+                        HBillSubType: this.HBillSubType,
+                        HBarCode_Pack: HBarCode_Pack
+                    },
+                    resFunction: (res) => {
+                        let {
+                            data,
+                            count,
+                            Message,
+                            list
+                        } = res.data
+                        if (count == 1) {
+                            CommonUtils.playSound(1)
+                            this.hform.HBillNo = data[0].HBillNo
+                            this.hform.HInterID = data[0].HInterID
+                            this.HMaterNumber_Pack = data[0].HMaterNumber
+                            this.DisBillEntryList();
+                            uni.showToast({
+                                icon: 'none',
+                                title: Message
+                            })
+                        } else {
+                            CommonUtils.playSound(1)
+                            this.HBarCodePackFocusRefresh()
+                            uni.showToast({
+                                icon: 'none',
+                                title: Message
+                            })
+                        }
+                    }
+                })
+            },
+            toScanCode2() {
+                MpaasScan.scanCode((scanCode) => {
+                    this.HBarCode = scanCode
+                    GetMeesageByBarCode(scanCode)
+                })
+            },
+            GetMeesageByBarCode(HBarCode) {
+                // 鑾峰彇鍖呮潯鐮佸搴旂殑鏁版嵁 
+                let HBarCode_Pack = this.HBarCode_Pack
+                let sOldBarCode = this.HBarCode
+                let HDeleteFlag = sOldBarCode.substring(0, 1)
+                let sBarCode = sOldBarCode.slice(1)
+                if (!HBarCode_Pack) {
+                    return uni.showToast({
+                        icon: 'none',
+                        title: '鎵樻潯鐮佷负绌猴紝璇峰厛鎵弿鎵樻潯鐮�',
+                    })
+                }
+
+                if (HDeleteFlag == '*') {
+                    if (!sBarCode) {
+                        return uni.showToast({
+                            icon: 'none',
+                            title: '璇锋壂鎻忚鍒犻櫎鐨勭鏉$爜',
+                        })
+                    } else {
+                        this.HBarCodeFocusRefresh()
+                    }
+                    CommonUtils.doRequest2({
+                        url: '/WEBSController/set_DelPackUnionBill_Temp_Pack_Json',
+                        data: {
+                            "HInterID": this.hform.HInterID,
+                            "HBarCode": sBarCode,
+                            "HBillType": this.HBillType
+                        },
+                        resFunction: (res) => {
+                            let {
+                                data,
+                                count,
+                                Message
+                            } = res.data
+                            if (count == 1) {
+                                CommonUtils.playSound(1)
+                                this.DisBillEntryList()
+                            } else {
+                                CommonUtils.playSound(0)
+                                uni.showToast({
+                                    icon: 'none',
+                                    title: Message
+                                })
+                            }
+                        }
+                    })
+                } else {
+                    let sBarCode = this.HBarCode
+                    if (!sBarCode) {
+                        return uni.showToast({
+                            icon: 'none',
+                            title: '绠辨潯鐮佷笉鑳戒负绌猴紝璇锋壂鎻忕鏉$爜',
+                        })
+                    }
+                    CommonUtils.doRequest2({
+                        url: '/WEBSController/Get_BarCode_PackUnionBill_New_Json',
+                        data: {
+                            "HInterID": this.hform.HInterID,
+                            "HBarCode": sBarCode,
+                            "HBillType": this.HBillType,
+                            "HBillNo": this.hform.HBillNo,
+                            "HBillSubType": this.HBillSubType,
+                            "HBarCode_Pack": HBarCode_Pack,
+                            "HMaterNumber_Pack": this.HMaterNumber_Pack,
+                            "HMaker": this.hform.HMaker,
+                            "HStockOrgID": this.hform.HStockOrgID
+                        },
+                        resFunction: (res) => {
+                            let {
+                                data,
+                                count,
+                                Message
+                            } = res.data
+                            if (count == 1) {
+                                CommonUtils.playSound(1)
+                                this.HBarCodeFocusRefresh()
+                                this.DisBillEntryList()
+                            } else {
+                                CommonUtils.playSound(0)
+                                this.HBarCodeFocusRefresh()
+                                uni.showToast({
+                                    icon: 'none',
+                                    title: Message
+                                })
+                            }
+                        }
+                    })
+                }
+            },
+            DisBillEntryList() {
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/GetBillEntry_Tmp_Pack_Json',
+                    data: {
+                        "HInterID": this.hform.HInterID,
+                        "HBillNo": this.hform.HBillNo,
+                        "HBillType": this.HBillType
+                    },
+                    resFunction: (res) => {
+                        let {
+                            count,
+                            data,
+                            Message
+                        } = res.data
+                        if (count == 1) {
+                            this.listData = []
+                            for (let i = 0; i < data.length; i++) {
+                                this.listData.push(Object.assign(data[i], {
+                                    index: i
+                                }))
+                            }
+                        } else {
+                            // 娌℃湁浠讳綍璁板綍瑙嗕负浠�0寮�濮嬫柊澧�
+                            this.listData = []
+                        }
+                    }
+                })
+            },
+            handleSelect(selected, array) {
+                this.selectedRows = array
+            },
+            handleSelectAll(selected, array) {
+                this.selectedRows = array
+            },
+            getMaxNo() {
+                CommonUtils.doRequest2({
+                    url: "/WEBSController/GetMaxBillNoAndID_Json",
+                    data: {
+                        "HBillType": this.HBillType
+                    },
+                    resFunction: (d) => {
+                        console.log('d: ', d);
+                        let {
+                            count,
+                            data,
+                            Message
+                        } = d.data
+                        if (count == 1) {
+                            this.hform.HInterID = data[0].HInterID;
+                            this.hform.HBillNo = data[0].HBillNo
+                        } else {
+
+                            uni.showModal({
+                                title: "娓╅Θ鎻愮ず",
+                                showCancel: false,
+                                content: Message
+
+                            })
+
+                        }
+                    }
+                })
+            },
+            submitPreCheck() {
+                if (CommonUtils.isEmpty(this.hform.HInterID)) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '鍗曟嵁鍐呯爜鑾峰彇澶辫触锛岄敊璇殑鍗曟嵁鍐呯爜锛�'
+                    })
+                    return false
+                }
+                if (CommonUtils.isEmpty(this.hform.HBillNo)) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '鍗曟嵁鍙疯幏鍙栧け璐ワ紝閿欒鐨勫崟鎹彿锛�'
+                    })
+                    return false
+                }
+                if (this.listData.length < 1) {
+                    uni.showToast({
+                        icon: 'none',
+                        title: '娌℃湁鎵爜淇℃伅锛岃鍏堟壂鎻忔潯鐮侊紝纭鏃犺鍚庡啀鎻愪氦锛�'
+                    })
+                    return false
+                }
+                return true
+            },
+            cmdDelete() {
+                console.log('this.selectedRows: ', this.selectedRows);
+                if (this.selectedRows.length != 1) {
+                    return uni.showToast({
+                        icon: 'none',
+                        title: '璇烽�夋嫨涓�琛岃褰曪紝杩涜鍒犻櫎锛�'
+                    })
+                }
+                uni.showModal({
+                    title: '鍒犻櫎纭',
+                    content: '纭瑕佸垹闄ら�変腑琛屾墍鏈夋壂鐮佽褰曪紵鍒犻櫎鍚庡皢涓嶅彲鎭㈠!',
+                    success: () => {
+                        if (confirm) {
+                            CommonUtils.doRequest2({
+                                url: '/WEBSController/set_DelPackUnionBill_Temp_Pack_Json',
+                                data: {
+                                    HInterID: this.hform.HInterID,
+                                    HBillType: this.HBillType,
+                                    HBarCode: this.selectedRows[0].HBarCode
+                                },
+                                resFunction: (res) => {
+                                    let {
+                                        data,
+                                        count,
+                                        Message
+                                    } = res.data
+                                    if (count == 1) {
+                                        CommonUtils.playSound(1)
+                                        uni.showToast({
+                                            icon: 'none',
+                                            title: Message
+                                        })
+                                        this.DisBillEntryList()
+                                    } else {
+                                        CommonUtils.playSound(0)
+                                        uni.showToast({
+                                            icon: 'none',
+                                            title: Message
+                                        })
+                                    }
+                                }
+                            })
+                        }
+                    }
+                })
+            },
+            cmdSubmit() {
+                let checkRes = this.submitPreCheck()
+                if (!checkRes) {
+                    return
+                }
+                CommonUtils.doRequest2({
+                    url: '/WEBSController/set_SavePackUnionBill_Json',
+                    data: {
+                        "HInterID": this.hform.HInterID,
+                        "HBillType": this.HBillType,
+                        "HBillNo": this.hform.HBillNo,
+                        "HBarCode_Pack": this.HBarCode_Pack,
+                        "HMaker": this.hform.HMaker,
+                        "HStockOrgID": this.hform.HStockOrgID
+                    },
+                    resFunction: (res) => {
+                        let {data, count, Message} = res.data
+                        if(count == 1){
+                            uni.showModal({
+                                title: '娓╅Θ鎻愮ず',
+                                content: Message,
+                                confirmText: "鏂板",
+                                cancelText: '鍏抽棴',
+                                success: ({confirm,cancel}) => {
+                                    if(confirm) {
+                                        uni.redirectTo({
+                                            url: "/pages/zutuosaoma/form"
+                                        })
+                                    }
+                                    
+                                    if(cancel) {
+                                        uni.navigateBack()
+                                    }
+                                }
+                            })
+                        }else {
+                            uni.showToast({
+                                icon:'none',
+                                title: Message
+                            })
+                        }
+                    }
+                })
+            },
+            cmdExit() {
+                uni.navigateBack()
+            }
+        },
+        computed: {
+            listTableHeight: {
+                get() {
+                    return this.bottomBtnTop - this.listTableTop - 10
+                }
+            }
+        },
+        async onReady() {
+            // #ifndef MP-WEIXIN
+            let query = uni.createSelectorQuery().in(this)
+            query.select("#bottom-btn")
+                .boundingClientRect((data) => {
+                    if (data) {
+                        this.bottomBtnTop = data.top
+                    } else {
+                        console.log("鏈壘鍒�#bottom-btn鑺傜偣");
+                    }
+                })
+                .exec();
+            query.select("#list-table")
+                .boundingClientRect((data) => {
+                    if (data) {
+                        this.listTableTop = data.top
+                    } else {
+                        console.log("鏈壘鍒�#list-table鑺傜偣");
+                    }
+                })
+                .exec();
+            // #endif
+        },
+        onLoad(e) {
+            this.OperationType = e.OperationType || 1
+            this.HBarCode_Pack_Temp = e.CommonUtils || ""
+
+            if (this.OperationType == 1) {
+                this.getMaxNo()
+            } else if (this.OperationType == 2) {
+
+            }
+        }
+    }
+</script>
+
+<style lang="scss">
+    input {
+        width: inherit;
+        padding: 8rpx 20rpx;
+        font-size: 30rpx;
+    }
+
+    .form {
+        display: flex;
+        flex-direction: column;
+        gap: 20rpx;
+
+        .form-base-info {
+            display: flex;
+            flex-direction: column;
+            gap: 10rpx;
+            box-sizing: border-box;
+            padding: 30rpx;
+        }
+
+        .bill-info {
+            display: flex;
+            flex-direction: column;
+            gap: 10rpx;
+            box-sizing: border-box;
+            padding: 16rpx 30rpx;
+        }
+
+        .form-item {
+            display: flex;
+            flex-direction: row;
+            gap: 10rpx;
+
+            .title {
+                width: 5rem;
+                flex-shrink: 0;
+            }
+
+            .right {
+                flex: 1;
+                border-radius: 22rpx;
+                border: 1px solid #acacac;
+            }
+
+            .disabled {
+                border: 1px solid #e4e4e4;
+                background-color: #e4e4e4;
+            }
+
+            .right-icon {
+                flex-shrink: 0;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+            }
+
+        }
+    }
+
+    .tabs {
+        width: 100%;
+        display: flex;
+        border-bottom: 1px solid #ddd;
+        margin: 20rpx 0;
+
+        view {
+            width: 25%;
+            font-size: 30rpx;
+            color: #555;
+            text-align: center;
+            padding: 16rpx 0;
+        }
+
+        .on {
+            color: #3a78ff;
+            font-weight: bold;
+            border-bottom: 3px solid #3a78ff;
+        }
+    }
+
+    .bottom-btn {
+        width: 100%;
+        box-sizing: border-box;
+        // height: 120rpx;
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        background-color: #fff;
+        box-shadow: 0 2rpx 10rpx 2rpx rgba(0, 0, 0, 0.4);
+        padding: 30rpx 40rpx 40rpx 40rpx;
+        display: flex;
+        flex-direction: row;
+        gap: 10rpx;
+
+        button {
+            border-radius: 50rpx;
+            width: 180rpx;
+            height: 66rpx;
+            line-height: 66rpx;
+            font-size: 28rpx;
+        }
+
+        .btn-a {
+            background-color: #3A78FF;
+            color: #fff;
+        }
+
+        .btn-b {
+            background-color: #41a863;
+            color: #fff;
+        }
+
+        .btn-c {
+            background-color: #acacac;
+            color: #fff;
+            // position: absolute;
+            // right: 120rpx;
+        }
+
+        .btn-d {
+            background-color: #ff8901;
+            color: #fff;
+        }
+    }
+    
+</style>
\ No newline at end of file
diff --git a/pages/zutuosaoma/table.vue b/pages/zutuosaoma/table.vue
new file mode 100644
index 0000000..f62f9e6
--- /dev/null
+++ b/pages/zutuosaoma/table.vue
@@ -0,0 +1,28 @@
+<template>
+    <view>
+        
+    </view>
+</template>
+
+<script>
+    import {
+        getUserInfo
+    } from "@/utils/auth.js";
+    import {
+        CommonUtils
+    } from "@/utils/common.js"
+    export default {
+        data() {
+            return {
+                
+            }
+        },
+        methods: {
+            
+        }
+    }
+</script>
+
+<style>
+
+</style>
diff --git a/uni_modules/zb-table/changelog.md b/uni_modules/zb-table/changelog.md
new file mode 100644
index 0000000..0194cfd
--- /dev/null
+++ b/uni_modules/zb-table/changelog.md
@@ -0,0 +1,106 @@
+## 1.2.18锛�2023-06-01锛�
+鏇存柊
+## 1.2.16锛�2023-05-10锛�
+澧炲姞鍗曞厓鏍肩偣鍑讳簨浠�
+瀹屽杽鏂囨。
+澧炲姞绀轰緥
+## 1.2.15锛�2022-08-25锛�
+浼樺寲閮ㄥ垎缁嗚妭
+## 1.2.14锛�2022-04-25锛�
+淇敼vue 3 鎶ラ敊灏忕▼搴廏enerated an empty chunk: "uni_modules/zb-table/components/zb-table/js/util"
+## 1.2.13锛�2022-04-22锛�
+澧炲姞鍥剧墖瀹藉害璁剧疆
+## 1.2.12锛�2022-04-22锛�
+淇pc绔� 婊氬姩鏉″崰浣嶉棶棰�
+## 1.2.11锛�2022-04-22锛�
+澧炲姞澶氬浘鐗囧睍绀�
+## 1.2.10锛�2022-04-19锛�
+鐗堟湰瑙e喅鍐茬獊
+## 1.2.9锛�2022-04-19锛�
+鏆傛椂鍘绘帀澶氱骇琛ㄥご...鏈夌潃鏌愪簺闂锛屾鍦ㄤ慨澶嶄腑
+## 1.1.9锛�2022-04-19锛�
+鏆傛椂鍘绘帀澶氱骇琛ㄥご...鏈夌潃鏌愪簺闂锛屾鍦ㄤ慨澶嶄腑
+## 1.1.23锛�2022-04-19锛�
+鏆傛椂鍘绘帀澶氱骇琛ㄥご锛屾湁鐫�鏌愪簺闂锛屼慨澶嶄腑銆傘�傘��
+## 1.1.22锛�2022-04-19锛�
+鏆傛椂鍘绘帀澶氱骇琛ㄥご锛屽瓨鍦ㄦ煇浜涢棶棰� 锛屾鍦ㄤ慨澶嶄腑
+## 1.1.21锛�2022-03-29锛�
+浼樺寲鏁板瓧闂
+## 1.1.20锛�2022-03-29锛�
+浼樺寲鎸夐挳锛屽彲浠ヨ嚜瀹氫箟鎸夐挳锛岃嚜瀹氫箟娣诲姞class
+## 1.1.19锛�2022-03-28锛�
+杩涜浼樺寲鍔犺浇
+## 1.1.18锛�2022-03-28锛�
+淇pc绔粴鍔ㄦ潯闂
+## 1.1.17锛�2022-03-25锛�
+淇敼 鏁版嵁鍥炴樉鐨勬椂鍊欙紝鍏ㄩ�夋娌℃湁閫変腑鏁堟灉
+## 1.1.16锛�2022-03-25锛�
+鏂板锛歵able灞炴�� cell-style 淇敼鍗曞厓鏍兼牱寮�
+## 1.1.15锛�2022-03-23锛�
+fix:鏀粯瀹濆皬绋嬪簭涓婃媺鍔犺浇e.detail 娌℃湁鍊煎鑷翠笂鎷夊姞杞藉け鏁� 锛屽凡淇
+## 1.1.14锛�2022-03-23锛�
+fix: 鏀粯瀹濆皬绋嬪簭宸﹀彸鏃犳硶婊戝姩鐨勯棶棰�
+## 1.1.13锛�2022-03-21锛�
+fix锛氳嫳鏂囧搴﹁嚜閫傚簲闂
+## 1.1.12锛�2022-03-20锛�
+淇敼鑷�傚簲瀹藉害闂
+## 1.1.11锛�2022-03-19锛�
+澧炲姞涓婃媺鍔犺浇鍔熻兘
+## 1.1.10锛�2022-03-18锛�
+淇敼鍚堣涓嶆洿鏂伴棶棰�
+## 1.1.9锛�2022-03-16锛�
+浼樺寲css 鏍峰紡
+## 1.1.8锛�2022-03-16锛�
+澧炲姞琛ㄥ熬鍚堣琛�
+## 1.1.7锛�2022-03-15锛�
+淇敼css鏍峰紡
+## 1.1.6锛�2022-03-14锛�
+杩涜浠g爜浼樺寲
+## 1.1.5锛�2022-03-12锛�
+鏇存柊涓�涓搷浣滄寜閽殑鏃跺�� 鎶ラ敊闂锛岃繘琛屼唬鐮佷紭鍖�
+## 1.1.4锛�2022-03-12锛�
+澧炲姞鍥剧墖缁熶竴楂樺害
+## 1.1.3锛�2022-03-12锛�
+澧炲姞鍥剧墖鍦板潃 锛屽苟涓斿浘鐗囨敮鎸侀瑙堝姛鑳�
+## 1.1.2锛�2022-03-11锛�
+鏂板榛樿 鏄惁閫変腑鍔熻兘锛岃繘琛屼紭鍖�
+## 1.1.1锛�2022-03-10锛�
+鏂板鍗曞嚮浜嬩欢
+## 1.1.0锛�2022-03-10锛�
+- 澧炲姞鍗曞嚮浜嬩欢
+
+## 1.1.0锛�2022-03-10锛�
+- 澧炲姞checkbox鍔熻兘 锛岃繘琛屼紭鍖�
+
+## 1.0.11锛�2022-03-09锛�
+- 淇敼灏忕▼搴忎腑鎺掑簭闂
+
+## 1.0.10锛�2022-03-09锛�
+- 鍋氫簡鍏煎鎬у鐞�
+
+## 1.0.8锛�2022-03-09锛�
+- 杩涜浼樺寲婊氬姩闃叉 澶氭璁$畻
+
+## 1.0.7锛�2022-03-09锛�
+- 淇敼涓�浜涢棶棰� 鏂板杩囨护鍣�
+
+## 1.0.6锛�2022-03-08锛�
+- 淇敼鏍峰紡 鎸夐挳鑷�傚簲瀹藉害
+
+## 1.0.5锛�2022-03-08锛�
+- 鏂板鎸夐挳 淇敼闂
+
+## 1.0.4锛�2022-03-04锛�
+- 澧炲姞绌哄崰浣嶇"--"
+
+## 1.0.3锛�2022-03-02锛�
+- 鏂板琛ㄦ牸鏂戦┈绾归厤缃�佸垪瀹介厤缃�佽〃澶存樉绀洪厤缃�
+
+## 1.0.2锛�2022-03-02锛�
+- 鏂板鎺掑簭鍔熻兘锛屼紭鍖栨牱寮�
+
+## 1.0.1锛�2022-03-01锛�
+- 鍙互浼犲叆鍔ㄦ�佹暟鎹紝鍙互瀵瑰乏杈瑰垪琛ㄨ繘琛屾槸鍚﹀浐瀹氶鍒�
+
+## 1.0.0锛�2022-03-01锛�
+- 鍒濆鍖�
\ No newline at end of file
diff --git a/uni_modules/zb-table/components/zb-table/components/table-checkbox.vue b/uni_modules/zb-table/components/zb-table/components/table-checkbox.vue
new file mode 100644
index 0000000..e1448ee
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/components/table-checkbox.vue
@@ -0,0 +1,180 @@
+<template>
+	<view class="uni-table-checkbox" @click.stop="selected">
+		<view v-if="!indeterminate" class="checkbox__inner" :class="{'is-checked':isChecked,'is-disable':isDisabled}">
+			<view class="checkbox__inner-icon"></view>
+		</view>
+		<view v-else class="checkbox__inner checkbox--indeterminate">
+			<view class="checkbox__inner-icon"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'TableCheckbox',
+		emits:['checkboxSelected'],
+		props: {
+			indeterminate: {
+				type: Boolean,
+				default: false
+			},
+			checked: {
+				type: [Boolean,String],
+				default: false
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			index: {
+				type: Number,
+				default: -1
+			},
+			cellData: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		watch:{
+			checked(newVal){
+				if(typeof this.checked === 'boolean'){
+					this.isChecked = newVal
+				}else{
+					this.isChecked = true
+				}
+			},
+			indeterminate(newVal){
+				this.isIndeterminate = newVal
+			}
+		},
+		data() {
+			return {
+				isChecked: false,
+				isDisabled: false,
+				isIndeterminate:false
+			}
+		},
+		created() {
+			if(typeof this.checked === 'boolean'){
+				this.isChecked = this.checked
+			}
+			this.isDisabled = this.disabled
+		},
+		methods: {
+			selected() {
+				if (this.isDisabled) return
+				this.isIndeterminate = false
+				this.isChecked = !this.isChecked
+        console.log('===',this.indeterminate,this.isChecked)
+				this.$emit('checkboxSelected', {
+					checked: this.isChecked,
+					data: this.cellData
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$checked-color: #007aff;
+	$border-color: #DCDFE6;
+	$disable:0.4;
+
+	.uni-table-checkbox {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		margin: 5px 0;
+		cursor: pointer;
+
+		// 澶氶�夋牱寮�
+		.checkbox__inner {
+			/* #ifndef APP-NVUE */
+			flex-shrink: 0;
+			box-sizing: border-box;
+			/* #endif */
+			position: relative;
+			width: 16px;
+			height: 16px;
+			border: 1px solid $border-color;
+			border-radius: 2px;
+			background-color: #fff;
+			z-index: 1;
+
+			.checkbox__inner-icon {
+				position: absolute;
+				/* #ifdef APP-NVUE */
+				top: 2px;
+				/* #endif */
+				/* #ifndef APP-NVUE */
+				top: 2px;
+				/* #endif */
+				left: 5px;
+				height: 7px;
+				width: 3px;
+				border: 1px solid #fff;
+				border-left: 0;
+				border-top: 0;
+				opacity: 0;
+				transform-origin: center;
+				transform: rotate(45deg);
+				box-sizing: content-box;
+			}
+
+			&.checkbox--indeterminate {
+				border-color: $checked-color;
+				background-color: $checked-color;
+
+				.checkbox__inner-icon {
+					position: absolute;
+					opacity: 1;
+					transform: rotate(0deg);
+					height: 2px;
+					top: 0;
+					bottom: 0;
+					margin: auto;
+					left: 0px;
+					right: 0px;
+					bottom: 0;
+					width: auto;
+					border: none;
+					border-radius: 2px;
+					transform: scale(0.5);
+					background-color: #fff;
+				}
+			}
+			&:hover{
+				border-color: $checked-color;
+			}
+			// 绂佺敤
+			&.is-disable {
+				/* #ifdef H5 */
+				cursor: not-allowed;
+				/* #endif */
+				background-color: #F2F6FC;
+				border-color: $border-color;
+			}
+
+			// 閫変腑
+			&.is-checked {
+				border-color: $checked-color;
+				background-color: $checked-color;
+
+				.checkbox__inner-icon {
+					opacity: 1;
+					transform: rotate(45deg);
+				}
+
+				// 閫変腑绂佺敤
+				&.is-disable {
+					opacity: $disable;
+				}
+			}
+
+		}
+	}
+</style>
diff --git a/uni_modules/zb-table/components/zb-table/components/table-h5-summary.vue b/uni_modules/zb-table/components/zb-table/components/table-h5-summary.vue
new file mode 100644
index 0000000..73734b2
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/components/table-h5-summary.vue
@@ -0,0 +1,78 @@
+<template>
+  <view class="table-h5-footer top-header-uni" :style="{paddingRight:`${scrollbarSize}px`}">
+    <scroll-view class="zb-table-headers"
+                 @scroll="handleFooterTableScrollLeft"
+                 scroll-x="true"
+                 scroll-y="false"
+                 id="tableFooterHeaders"
+                 scroll-anchoring="true"
+                 :scroll-left="headerFooterTableLeft"
+                 style="padding-bottom: 0px;
+						background: #fafafa;height: 100%">
+      <view class="zb-table-fixed" >
+        <view class="zb-table-thead" style="position: relative;" >
+          <view class="item-tr">
+            <view
+                class="item-th"
+                :style="{
+	                              width:`${item.width?item.width:'100'}px`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'100'}px`,
+															  borderRight:`${border?'1px solid #e8e8e8':''}`,
+															  borderTop:`${border?'1px solid #e8e8e8':''}`,
+															  textAlign:item.align||'left'
+														  }"
+                v-for="(item,index) in transColumns" :key="index">
+              {{ sums[index] }}
+            </view>
+          </view>
+        </view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+<script>
+import summary from '../js/summary.js'
+export default {
+  name:'table-footer',
+  mixins:[summary],
+}
+</script>
+<style lang="scss" scoped>
+.table-h5-footer {
+  background: #fafafa;
+  /*姣忎釜椤甸潰鍏叡css */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+  //绗簩绉�
+  ::-webkit-scrollbar{
+    display: none;
+  }
+  .item-tr{
+    display: flex;
+  }
+  .item-th{
+    padding-left: 8px;
+    line-height: 39px;
+    height: 40px;
+    //display: flex;
+    //align-items: center;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    width: 100px;
+    padding-right: 20px;
+    word-break: keep-all;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    overflow-wrap: break-word;
+    border-bottom: 1px solid #e8e8e8;
+  }
+
+}
+</style>
diff --git a/uni_modules/zb-table/components/zb-table/components/table-side-summary.vue b/uni_modules/zb-table/components/zb-table/components/table-side-summary.vue
new file mode 100644
index 0000000..fa27c93
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/components/table-side-summary.vue
@@ -0,0 +1,59 @@
+<template>
+  <view class="zb-table-header" style="display: flex;" >
+    <view class="item-tr" >
+      <view class='item-td'
+            :style="{
+	                       width:`${item.width?item.width:'100'}px`,
+	                       borderRight:`${border?'1px solid #e8e8e8':''}`,
+	                       textAlign:item.align||'left'
+	                      }"
+            :key="`15255966555${index}`"
+            v-for="(item,index) in fixedLeftColumns">
+        <template >
+          {{sums[index]}}
+        </template>
+      </view>
+    </view>
+  </view>
+
+</template>
+<script>
+import summary from '../js/summary.js'
+export default {
+  mixins:[summary]
+}
+</script>
+<style lang="scss" scoped>
+.zb-table-header {
+  overflow: hidden;
+  background: #fafafa;
+  .item-th{
+    padding-left: 8px;
+    line-height: 39px;
+    height: 40px;
+    //display: flex;
+    //align-items: center;
+    box-sizing: border-box;
+  }
+}
+.item-tr{
+  display: flex;
+  box-sizing: border-box;
+}
+.item-td{
+  flex-shrink: 0;
+  width: 100px;
+  padding-left: 8px;
+  height: 40px;
+  line-height: 40px;
+  padding-right: 20px;
+  box-sizing: border-box;
+  word-break: keep-all;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  overflow-wrap: break-word;
+  border-bottom: 1px solid #e8e8e8;
+  background: rgb(250, 250, 250);
+}
+</style>
diff --git a/uni_modules/zb-table/components/zb-table/components/table-summary.vue b/uni_modules/zb-table/components/zb-table/components/table-summary.vue
new file mode 100644
index 0000000..2850740
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/components/table-summary.vue
@@ -0,0 +1,77 @@
+<template>
+  <view class="zb-table-footer" style="height: 40px;">
+    <view class="zb-table-fixed" >
+      <view class="zb-table-thead" style="position: relative;" >
+        <view class="item-tr">
+          <view
+              :class="['item-th',index <fixedLeftColumns.length&&'zb-stick-side']"
+              :style="{
+	                              left:`${item.left}px`,
+	                              width:`${item.width?item.width:'100'}px`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'100'}px`,
+															   borderRight:`${border?'1px solid #e8e8e8':''}`,
+															  borderTop:`${border?'1px solid #e8e8e8':''}`,
+															   textAlign:item.align||'left'
+														  }"
+              v-for="(item,index) in transColumns" :key="index">
+            <template>
+              {{ sums[index]||item.emptyString }}
+            </template>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+  import summary from '../js/summary.js'
+  export default {
+    mixins:[summary]
+  }
+</script>
+<style lang="scss" scoped>
+  .zb-table-footer {
+    background: #fafafa;
+    width: fit-content;
+    min-width: 100%;
+    position: sticky;
+    bottom: 0;
+    z-index: 2;
+    .item-tr{
+      display: flex;
+      min-width: 100%;
+    }
+    .item-th{
+      padding-left: 8px;
+      line-height: 39px;
+      height: 40px;
+      //display: flex;
+      //align-items: center;
+      box-sizing: border-box;
+      flex-shrink: 0;
+      width: 100px;
+      padding-right: 20px;
+      word-break: keep-all;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      overflow-wrap: break-word;
+      border-bottom: 1px solid #e8e8e8;
+    }
+    .zb-table-fixed{
+      min-width: 100%;
+
+    }
+    .zb-stick-side{
+      position: sticky;
+      bottom:0 ;
+      left: 0;
+      z-index: 2;
+      //border-right: solid 1rpx #dbdbdb;
+      box-sizing: border-box;
+      background: #fafafa;
+      //box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+</style>
diff --git a/uni_modules/zb-table/components/zb-table/components/zb-load-more.vue b/uni_modules/zb-table/components/zb-table/components/zb-load-more.vue
new file mode 100644
index 0000000..5a7da41
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/components/zb-load-more.vue
@@ -0,0 +1,50 @@
+<template >
+  <view class="zb-load-more">
+    <image :src="base64Flower" style="" class="loading-custom-image"></image>
+    <text>姝e湪鍔犺浇涓�...</text>
+  </view>
+</template>
+<script>
+const base64Flower = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC';
+export default {
+  data(){
+    return{
+      base64Flower
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.zb-load-more {
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 999;
+  background: white;
+  display: flex;
+  height: 40px;
+  flex-shrink: 0;
+  align-items: center;
+  justify-content: center;
+  .loading-custom-image{
+    color: #a4a4a4;
+    margin-right: 8rpx;
+    width: 24px;
+    height: 24px;
+    /* #ifndef APP-NVUE */
+    animation: loading-circle 1s linear infinite;
+    /* #endif */
+  }
+  @keyframes loading-circle {
+    0% {
+      -webkit-transform: rotate(0deg);
+      transform: rotate(0deg);
+    }
+    100% {
+      -webkit-transform: rotate(360deg);
+      transform: rotate(360deg);
+    }
+  }
+}
+</style>
diff --git a/uni_modules/zb-table/components/zb-table/js/summary.js b/uni_modules/zb-table/components/zb-table/js/summary.js
new file mode 100644
index 0000000..fbd81f1
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/js/summary.js
@@ -0,0 +1,88 @@
+export default {
+    props:{
+        scrollbarSize:{
+            type:Number,
+            default:0
+        },
+        fixedLeftColumns:{
+            type:Array,
+            default:()=>[]
+        },
+        data:{
+            type:Array,
+            default:()=>[]
+        },
+        transColumns:{
+            type:Array,
+            default:()=>[]
+        },
+        border:{
+            type:Boolean,
+            default:false
+        },
+        showSummary:{
+            type:Boolean,
+            default:false
+        },
+        summaryMethod:{
+            type:Function
+        },
+        sumText:{
+            type:String,
+            default:'鍚堣'
+        },
+        headerFooterTableLeft:{
+            type:Number,
+            default:0
+        },
+        handleFooterTableScrollLeft:Function,
+    },
+    data(){
+        return{
+            sums:[]
+        }
+    },
+    watch:{
+        'data':{
+            deep:true,
+            immediate:true,
+            handler(newValue,oldValue){
+                let sums = [];
+                if (this.summaryMethod) {
+                    sums = this.summaryMethod({ columns: this.transColumns, data: this.data });
+                } else {
+                    this.transColumns.forEach((column, index) => {
+                        if (index === 0) {
+                            sums[index] = this.sumText;
+                            return;
+                        }
+                        const values = this.data.map(item => Number(item[column.name]));
+                        const precisions = [];
+                        let notNumber = true;
+                        values.forEach(value => {
+                            if (!isNaN(value)) {
+                                notNumber = false;
+                                let decimal = ('' + value).split('.')[1];
+                                precisions.push(decimal ? decimal.length : 0);
+                            }
+                        });
+                        const precision = Math.max.apply(null, precisions);
+                        if (!notNumber) {
+                            sums[index] = values.reduce((prev, curr) => {
+                                const value = Number(curr);
+                                if (!isNaN(value)) {
+                                    return parseFloat((prev + curr).toFixed(Math.min(precision, 20)));
+                                } else {
+                                    return prev;
+                                }
+                            }, 0);
+                        } else {
+                            sums[index] = '';
+                        }
+                    });
+                }
+                this.sums = sums
+            },
+        }
+    }
+}
diff --git a/uni_modules/zb-table/components/zb-table/js/util.js b/uni_modules/zb-table/components/zb-table/js/util.js
new file mode 100644
index 0000000..e682cb2
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/js/util.js
@@ -0,0 +1,51 @@
+/**
+ * 鑾峰彇婊氬姩鏉″搴�
+ */
+let cached = undefined;
+
+export const getScrollbarSize = fresh => {
+	// #ifdef H5
+	
+    if (fresh || cached === undefined) {
+        let inner = document.createElement("div");
+        let innerStyle = inner.style;
+
+        innerStyle.width = "100%";
+        innerStyle.height = "200px";
+
+        let outer = document.createElement("div");
+        let outerStyle = outer.style;
+
+        outerStyle.position = "absolute";
+        outerStyle.top = 0;
+        outerStyle.left = 0;
+        outerStyle.pointerEvents = "none";
+        outerStyle.width = "200px";
+        outerStyle.height = "150px";
+        outerStyle.visibility = "hidden";
+
+        outer.appendChild(inner);
+        document.body.appendChild(outer);
+
+        // 璁剧疆瀛愬厓绱犺秴鍑洪儴鍒嗛殣钘�
+        outerStyle.overflow = "hidden";
+
+        let width1 = inner.offsetWidth;
+
+        // 璁剧疆瀛愬厓绱犺秴鍑洪儴鍒嗘粴鍔�
+        outer.style.overflow = "scroll";
+
+        let width2 = inner.offsetWidth;
+
+        if (width1 === width2) {
+            width2 = outer.clientWidth;
+        }
+
+        document.body.removeChild(outer);
+
+        cached = width1 - width2;
+    }
+	//#endif
+
+    return cached;
+};
diff --git a/uni_modules/zb-table/components/zb-table/zb-table.vue b/uni_modules/zb-table/components/zb-table/zb-table.vue
new file mode 100644
index 0000000..45c41e0
--- /dev/null
+++ b/uni_modules/zb-table/components/zb-table/zb-table.vue
@@ -0,0 +1,1345 @@
+<template>
+	<!-- #ifdef H5 || APP-PLUS -->
+	<view :class="['zb-table','zb-table-fixed-header',!border&&(bodyTableLeft>50||headerTableLeft>50)&&'scroll-left-fixed']">
+	  <view class="zb-table-content" style="flex: 1">
+	    <view class="zb-table-scroll" style="height: 100%;">
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni"
+          >
+	          <scroll-view class="zb-table-headers"
+	                       @scroll="handleTableScrollLeft"
+	                       scroll-x="true"
+	                       scroll-y="false"
+	                       id="tableHeaders"
+	                       scroll-anchoring="true"
+	                       :scroll-left="headerTableLeft"
+	                       style="
+						height: 100%">
+
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      class="item-th"
+	                      :style="[{
+                                  display: `${item.hidden?'none':'block'}`,
+	                              width:`${item.width?item.width:'100'}px`,
+								  flex:index===transColumns.length-1?1:'none',
+								  minWidth:`${item.width?item.width:'100'}px`,
+								  borderRight:`${border?'1px solid #e8e8e8':''}`,
+
+								  borderTop:`${border?'1px solid #e8e8e8':''}`,
+								  textAlign:item.align||'left'
+							  },getHeaderCellStyle(item,index)]"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+                        {{ item.label }}
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+
+                    </view>
+                    <view
+                        v-if="scrollbarSize"
+                        class="item-th "
+                        :style="{
+
+                           borderTop:`${border?'1px solid #e8e8e8':''}`,
+                                padding:0,
+                                width:`${scrollbarSize}px`,
+                              }">
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	          </scroll-view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">鏆傛棤鏁版嵁~~</view>
+	      </template>
+	      <scroll-view
+            class="zb-table-body" ref="tableBody"	scroll-x="true"	scroll-y="true"	id="tableBody"
+	                   :lower-threshold="40"
+	                   :upper-threshold="10"
+                     @scrolltolower="scrolltolower"
+	                   @scrolltoupper="(e)=>debounce(scrollToLeft)(e)"
+                     @scroll="handleBodyScroll"	:scroll-left="bodyTableLeft"	:scroll-top="bodyScrollTop"
+                     :style=" `height: calc(100% - ${showSummary?80:40}px)`" >
+	          <view class="zb-table-fixed">
+	            <view class="zb-table-tbody">
+	              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                       @click.stop="rowClick(item,index)"
+	                     v-for="(item,index) in transData" :key="item.key" >
+	                <view
+	                    :style="[{
+                                    display: `${ite.hidden?'none':'block'}`,
+							        width:`${ite.width?ite.width:'100'}px`,
+										  flex:i===transColumns.length-1?1:'none',
+										  minWidth:`${ite.width?ite.width:'100'}px`,
+										  borderRight:`${border?'1px solid #e8e8e8':''}`,
+											textAlign:ite.align||'left',
+									  },cellStyle&&getCellStyle(item,ite,index,i)]"
+                      @click="cellClick(item,index,ite)"
+	                    :class="['item-td',stripe?(index % 2) != 0?'odd':'even':'']"
+	                    v-for="(ite,i) in transColumns" :key="i">
+	                  <template  v-if="ite.type==='operation'">
+	                    <view style="display: flex;align-items: center;height: 100%">
+	                      <view
+                            v-for="ren,ind in permission(item,ite.renders,index)"
+	                          :key="ind"
+	                          @click.stop="$emit(ren.func,item,index)"
+	                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'8px':'0'
+	                        }">
+                          <template v-if="ren.type==='custom'">
+                            <view :class="ren.class||''" style="cursor: pointer">
+                              {{ren.name}}
+                            </view>
+                          </template>
+                          <template v-else>
+                            <button
+                                :class="ren.class||''"
+                                :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                          </template>
+	                      </view>
+	                    </view>
+	                  </template>
+                    <template v-else-if="ite.type==='selection'">
+                      <view class="checkbox-item">
+                        <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                      </view>
+                    </template>
+                    <template v-else-if="ite.type==='index'">
+                      {{index+1}}
+                    </template>
+                  <template v-else-if="ite.type==='img'">
+                    <view class="checkbox-item">
+                      <template  v-if="item[ite.name]">
+                        <image
+                            @click.stop="previewImage(item,item[ite.name],iImage)"
+                            v-for="iImageTem,iImage in imgs(item[ite.name])"
+                            :show-menu-by-longpress="false"
+                            :key="iImage"
+                            :src="iImageTem" style="width: 40px;height:30px; " mode="aspectFit"></image>
+                      </template>
+                    <text v-else>{{ite.emptyString}}</text>
+                    </view>
+                  </template>
+	                  <template  v-else>
+<!--                      {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                      {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+	                  </template>
+	                </view>
+	              </view>
+	            </view>
+	          </view>
+	        </scroll-view>
+       <table-h5-summary
+           :scrollbarSize="scrollbarSize"
+           :data="data"
+           :handleFooterTableScrollLeft="handleFooterTableScrollLeft"
+           :headerFooterTableLeft="headerFooterTableLeft"
+           v-if="showSummary"
+           :showSummary="showSummary"
+           :transColumns="transColumns"
+           :border="border"
+           :summary-method="summaryMethod"
+           :sumText="sumText"
+           :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	    <view class="zb-table-fixed-left"
+            v-if="isFixedLeft"
+            :style=" {height:  `calc(100% - ${scrollbarSize}px)`}"
+      >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header" style="display: flex">
+	          <view class="item-tr"
+                  style=""
+                  @click.stop="rowClick(item,index)"
+                  v-for="(item,index) in fixedLeftColumns" :key="index">
+	            <view
+
+	                :style="{
+	               width:`${item.width?item.width:'100'}px`,
+	               borderRight:`${border?'1px solid #e8e8e8':''}`,
+	               borderTop:`${border?'1px solid #e8e8e8':''}`,
+                textAlign:item.align||'left'
+	            }"
+	                @click.stop="sortAction(item,index)"
+	                class="item-th"
+	            >
+                <template v-if="item.type==='selection'">
+                  <view class="checkbox-item">
+                    <tableCheckbox
+                        :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                  </view>
+                </template>
+                <template v-else>
+                  {{ item.label }}
+                  <view class="sorter-table" v-if="item.sorter">
+                    <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                    <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                  </view>
+                </template>
+              </view>
+	          </view>
+
+	        </view>
+	      </template>
+        <scroll-view
+            scroll-y="true"
+            id="leftTableFixed"
+            :upper-threshold="15"
+            @scrolltoupper="(e)=>scrollToFixedLeft(e)"
+            @scroll="leftFixedScrollAction"
+            :scroll-top="leftFiexScrollTop"
+            class="zb-table-body-inner"
+            :style=" `height: calc(100% - ${showSummary?80:40}px)`">
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view
+                  :class="['item-tr',stripe?(i % 2) != 0?'odd':'even':'',highlight&&isHighlight(ite,i)?'current-row':'']"
+                    v-for="(ite,i) in transData"
+                    @click.stop="rowClick(ite,i)"
+                    :key="ite.key"
+                    style="">
+                <view class='item-td'
+                      @click="cellClick(ite,index,item)"
+                      :style="[{
+	                       width:`${item.width?item.width:'100'}px`,
+	                       borderRight:`${border?'1px solid #e8e8e8':''}`,
+	                       textAlign:item.align||'left'
+	                      },cellStyle&&getCellStyle(ite,item,i,index)]"
+                      :key="index"
+                      v-for="(item,index) in fixedLeftColumns">
+                  <template v-if="item.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,ite)" :cellData="ite" :checked="ite.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="item.type==='index'">
+                    {{i+1}}
+                  </template>
+                  <template v-else>
+                    {{ite[item.name]||item.emptyString}}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        </scroll-view>
+        <table-side-summary
+            :scrollbarSize="scrollbarSize"
+            v-if="showSummary&&!(scrollbarSize>0)"
+            :data="data"
+            :showSummary="showSummary"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+            :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+	<!-- #ifndef H5 || APP-PLUS -->
+	<view class="zb-table-applet">
+	  <view class="zb-table-content" style="white-space: nowrap">
+      <scroll-view
+
+		<!-- #ifdef MP-ALIPAY -->
+		@scroll="scrollAlipay"
+		<!-- #endif  -->
+
+          @scrolltolower="scrolltolower"
+					<!-- #ifdef MP-ALIPAY -->
+                   style=" height: 100%;overflow-x:scroll"
+				   <!-- #endif  -->
+				   <!-- #ifndef MP-ALIPAY -->
+				   style=" height: 100%"
+				   <!-- #endif  -->
+                   scroll-y="true"
+				   scroll-x="true">
+	    <view class="zb-table-scroll" >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni" style="">
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      :class="['item-th',index <fixedLeftColumns.length&&'zb-stick-side']"
+	                      :style="{
+                                  
+	                              left:`${item.left}px`,
+	                              width:`${item.width?item.width:'100'}px`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'100'}px`,
+															   borderRight:`${border?'1px solid #e8e8e8':''}`,
+															  borderTop:`${border?'1px solid #e8e8e8':''}`,
+															   textAlign:item.align||'left'
+														  }"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+                        {{ item.label||'' }}
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">鏆傛棤鏁版嵁~~</view>
+	      </template>
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                     @click.stop="rowClick(item,index)"
+                     v-for="(item,index) in transData" :key="item.key" >
+                <view
+                    :style="[{
+                      left:`${ite.left}px`,
+                      width:`${ite.width?ite.width:'100'}px`,
+                      flex:i===transColumns.length-1?1:'none',
+                      minWidth:`${ite.width?ite.width:'100'}px`,
+                      borderRight:`${border?'1px solid #e8e8e8':''}`,
+                      textAlign:ite.align||'left',
+                    },getCellStyle(item,ite,index,i)]"
+                    @click="cellClick(item,index,ite)"
+                    :class="['item-td', i <fixedLeftColumns.length&&'zb-stick-side',stripe?(index % 2) != 0?'odd':'even':'']"
+                    v-for="(ite,i) in transColumns" :key="i">
+                  <template  v-if="ite.type==='operation'">
+                    <view style="display: flex;align-items: center;height: 100%">
+                      <view
+                          v-for="ren,ind in permission(item,ite.renders,index)"
+                          :key="ind"
+                          @click.stop="$emit(ren.func,item,index)"
+                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'8px':'0'
+	                        }">
+                        <template v-if="ren.type==='custom'">
+                          <view :class="ren.class||''" style="cursor: pointer">
+                            {{ren.name}}
+                          </view>
+                        </template>
+                        <template v-else>
+                          <button
+                              :class="ren.class||''"
+                              :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                        </template>
+                      </view>
+                    </view>
+                  </template>
+                  <template v-else-if="ite.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="ite.type==='img'">
+                    <template  v-if="item[ite.name]">
+                      <view class="checkbox-item" @click.stop>
+                        <image
+                            @click.stop="previewImage(iImageTem,item[ite.name],iImage)"
+                            v-for="iImageTem,iImage in imgs(item[ite.name])"
+                            :show-menu-by-longpress="false"
+                            :key="iImage"
+                            :src="iImageTem" style="width: 40px;height:30px; " mode="aspectFit"></image>
+                      </view>
+                    </template>
+
+                    <text v-else>{{ite.emptyString}}</text>
+                  </template>
+                  <template v-else-if="ite.type==='index'">
+                    {{index+1}}
+                  </template>
+                  <template  v-else>
+<!--                    {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                    {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        <table-summary
+            v-if="showSummary"
+            :data="data"
+            :showSummary="showSummary"
+            :fixedLeftColumns="fixedLeftColumns"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+        />
+	    </view>
+      </scroll-view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+</template>
+<script>
+import TableCheckbox from './components/table-checkbox.vue'
+import TableSummary from "./components/table-summary.vue";
+import TableSideSummary from "./components/table-side-summary.vue";
+import TableH5Summary from './components/table-h5-summary'
+import ZbLoadMore from './components/zb-load-more'
+
+// #ifdef H5
+import {getScrollbarSize} from "./js/util";
+// #endif
+
+export default {
+  components:{
+    TableCheckbox,
+    TableSummary,
+    TableSideSummary,
+    TableH5Summary,
+    ZbLoadMore
+  },
+  props:{
+    highlight:{
+      type:Boolean,
+      default:false
+    },
+    itemDate:{
+      type:Object,
+      default:()=>{}
+    },
+    columns:{
+      type:Array,
+      default:()=>[]
+    },
+    showSummary:{
+      type:Boolean,
+      default:false
+    },
+    isShowLoadMore:{
+      type:Boolean,
+      default:false
+    },
+    data:{
+      type:Array,
+      default:()=>[]
+    },
+    sumText:{
+      type:String,
+      default:'鍚堣'
+    },
+    showHeader:{
+      type:Boolean,
+      default:true
+    },
+    border:{
+      type:Boolean,
+      default:false
+    },
+    stripe:{
+      type:Boolean,
+      default:true
+    },
+    fit:{
+      type:Boolean,
+      default:false
+    },
+    rowKey:[String, Function],
+    summaryMethod:Function,
+    pullUpLoading:Function,
+    formatter:Function,
+    cellStyle:Function,
+    cellHeaderStyle:Function,
+    permissionBtn:Function,
+  },
+  computed:{
+    loadMoreHeight(){
+      return this.isLoadMore?40:0
+    },
+    fixedLeftColumns(){
+      let arr = []
+      for(let i=0;i<this.columns.length;i++){
+        let item = this.columns[i]
+        if(item.fixed){
+          arr.push(item)
+        }else {
+          break
+        }
+      }
+      return arr
+    },
+    imgs(){
+      return (item)=>{
+        return typeof item==='string'?[item]:item
+      }
+    },
+    itemfilters(){
+      return(item,ite)=>{
+        if(item[ite.name]==null){
+          return ite.emptyString
+        }
+        return item[ite.name]
+      }
+    },
+    scrollbarSize(){
+		// #ifdef H5
+      return getScrollbarSize()
+	  // #endif
+
+	  // #ifndef H5
+	  return 0
+	  // #endif
+    },
+    isFixedLeft(){
+      if(!this.columns.length){
+        return false
+      }
+      if(!this.data.length){
+        return false
+      }
+      let [firstArr] = this.columns
+      return !!firstArr.fixed;
+    },
+    transColumns(){
+      if(this.fit){
+        this.columns.forEach(column=>{
+          if(column.type==="operation"&&column.renders){
+			      let str = ''
+            column.renders.map((item)=>{
+              str+=item.name
+            })
+            column.width = this.getTextWidth(str)+column.renders.length*40
+          }else if(column.type==="img"){
+
+			   }else if(column.type==="selection"){
+			}else{
+			let arr = [this.getTextWidth(column.label)]
+            this.data.forEach(data=>{
+              let str = (data[column.name]+'')
+			  if(str==='undefined'){
+				   arr.push(30)
+			  }else{
+				   let width = this.getTextWidth(str)
+				   arr.push(width)
+			  }
+            })
+			      column.width = Math.max(...arr)+20
+          }
+        })
+      }
+      let number = 0
+      this.columns.forEach((item,index)=>{
+        if(item.type==="operation"&&item.renders&&!item.width){
+          let str = ''
+          item.renders.map((item)=>{
+            str+=item.name
+          })
+          item.width = this.getTextWidth(str)+item.renders.length*40
+        }
+        if(item.type==="img"){
+          if(!item.width){
+            let arr = []
+            let widImg = this.getTextWidth(item.label)
+            this.data.forEach(data=>{
+              if(data[item.name]){
+                let urls = typeof data[item.name]==='string'?[data[item.name]]:data[item.name]
+                arr.push(urls.length)
+              }
+              item.width = Math.max(...arr)*40+widImg
+            })
+          }
+
+        }
+        if(item.fixed){
+          if(index===0){
+            item.left = 0
+            number+=item.width
+          }else {
+            item.left = number
+            number+=item.width
+          }
+        }
+        item.emptyString = item.emptyString||'--'
+      })
+      return this.columns
+    },
+    transData(){
+      let flag = this.columns.some(item=>item.type==='selection')
+      this.data.forEach((item,index)=>{
+        if(flag){
+          if(item.checked){
+            if(!this.selectArr.length){
+              this.selectArr.push(item)
+            }
+          }
+        }
+        if(this.rowKey){
+          if(typeof this.rowKey==='function'){
+            item.key = Object.freeze(this.rowKey(item))||Date.now()
+          }else {
+            item.key = Object.freeze(item[this.rowKey])||Date.now()
+          }
+        }else {
+          item.key = index
+        }
+      })
+      if(flag){
+              if(this.data.length){
+                let le = this.data.filter(item=>item.checked).length
+                if(le){
+                  if(le===this.data.length){
+                    this.checkedAll = true
+                  }else {
+                    this.indeterminate = true
+                  }
+                }else {
+                  this.checkedAll = false
+                  this.indeterminate = false
+                  this.selectArr = []
+                }
+              }else {
+                this.checkedAll = false
+                this.indeterminate = false
+                this.selectArr = []
+              }
+            }
+      return this.data
+    },
+    isHighlight(){
+      return (item,index)=>{
+        if(this.rowKey){
+          return item.key === this.currentRow['key']
+        }else{
+          return index === this.currentRowIndex
+        }
+      }
+    },
+    getHeaderCellStyle() {
+      return (column,  columnIndex,childIndex)=>{
+        const cellStyle = this.cellHeaderStyle;
+        if(typeof cellStyle==='function'){
+          return cellStyle({ column, columnIndex})
+        }
+        return {}
+      }
+    },
+    getCellStyle() {
+     return (row, column, rowIndex, columnIndex)=>{
+       const cellStyle = this.cellStyle;
+       if(typeof cellStyle==='function'){
+         return cellStyle({row, column, rowIndex, columnIndex})
+       }
+       return {}
+     }
+    },
+  },
+  data() {
+    return {
+      button:[],
+	    alipayScrollTop:0,
+      alipayScrollOldTop:0,
+      alipayFlag:false,
+      bodyTableLeft:0,
+      headerTableLeft:0,
+      lastScrollLeft:0,
+      isLoadMore:false,
+      headerFooterTableLeft:0,
+      leftFiexScrollTop:0,
+      bodyScrollTop:0,
+      currentDriver:null,
+      currentDriver1:null,
+      bodyTime:null,
+      currentRowIndex:null,
+      currentRow: {},
+      bodyTime1:null,
+      headerTime:null,
+      debounceTime:null,
+      operation:{},
+      completedFlag:false,
+      selectArr:[],
+      indeterminate:false,
+      checkedAll:false,
+      completeLoading:false,
+      aliTime:null,
+    }
+  },
+  created(){
+  },
+  mounted(){
+
+    // setTimeout(()=>{
+    //   uni.createSelectorQuery().in(this).select(".top-header-uni").boundingClientRect( data => {
+    //     console.log('data=======',data)
+    //     //data  鍙互鎵撳嵃data杈撳嚭鐪嬭缁嗘暟鎹紝鏈夊緢澶氭暟鎹俊鎭�
+    //     var left = data.width;//琛ㄧず鍏冪礌瀹藉害
+    //   }).exec();
+    // },1000)
+  },
+  beforeDestroy(){
+      this.aliTime&&clearTimeout(this.aliTime)
+      this.debounceTime&&clearTimeout(this.debounceTime)
+      this.bodyTime1&&clearTimeout(this.bodyTime1)
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.selectArr = []
+      this.indeterminate = false
+      this.checkedAll = false
+  
+    },
+  methods: {
+	clearSelection(){
+		this.transData.forEach(item=>{
+			item.checked = false
+		})
+		this.selectArr = []
+		this.indeterminate = false
+		this.checkedAll = false
+	},
+    formatterAction(row,column,rowIndex,columnIndex){
+      if(column.formatter&&typeof this.formatter==='function'){
+        return this.formatter(row,column,rowIndex,columnIndex)
+      }
+      return (row[column.name]==null||row[column.name]==='')?column.emptyString:row[column.name]
+    },
+    permission(item,renders,index){
+      if(this.permissionBtn&&typeof this.permissionBtn==='function'){
+        return this.permissionBtn(item,renders,index)
+      }
+      return renders
+    },
+    pullUpCompleteLoading(type){
+      this.isLoadMore = false
+      if(type==='ok'){
+        this.completeLoading = true
+      }
+    },
+    scrollAlipay(e){
+
+      if(!this.alipayScrollOldTop){
+        this.alipayScrollOldTop = e.detail.scrollTop
+      }
+      this.aliTime&&clearTimeout(this.aliTime)
+      this.aliTime = setTimeout(()=>{
+
+        if(this.alipayFlag&&e.detail.scrollTop>this.alipayScrollOldTop){
+          this.pullLoad()
+        }
+        this.alipayFlag = false
+        this.alipayScrollOldTop = null
+      },500)
+    },
+    pullLoad(){
+      if(this.isShowLoadMore){
+        this.isLoadMore = true
+        this.$emit('pullUpLoading')
+        let that = this
+        this.pullUpLoading&&this.pullUpLoading.call(this.$parent.$parent, (type)=>{
+          that.isLoadMore = false
+          if(type==='ok'){
+            that.completeLoading=true
+          }
+        })
+      }
+
+    },
+    scrolltolower(e){
+      this.alipayFlag = true
+      if(e.detail.direction==='bottom'){
+        this.pullLoad()
+      }
+
+      // this.pullUpLoading.call(this.$parent)
+    },
+	  previewImage(item,url,current){
+      let urls = typeof url==='string'?[url]:url
+		  uni.previewImage({
+			  current,
+			  urls:urls
+		  })
+	  },
+    resetHighlight(){
+      this.currentRowIndex = null
+      this.currentRow = {}
+    },
+    cellClick(row,index,column){
+        this.$emit('cellClick',row,index,column)
+    },
+    rowClick(row,index){
+      if(this.highlight){
+        this.currentRowIndex = index
+        this.currentRow = row
+        this.$emit('currentChange',row,index)
+      }
+      this.$emit('rowClick',row,index)
+    },
+    checkboxSelectedAll(e){
+      this.indeterminate = false
+      if(e.checked){
+        this.selectArr = []
+        this.checkedAll = true
+        this.data.forEach(item=>{
+          // this.$set(item,'checked',true)
+          item.checked = true
+          this.selectArr.push(item)
+        })
+      }else{
+        this.checkedAll = false
+        this.data.forEach(item=>{
+          this.$set(item,'checked',false)
+        })
+        this.selectArr = []
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleAllSelection',e.checked,this.selectArr)
+    },
+    checkboxSelected(e,item){
+      // #ifdef H5 || APP-PLUS
+      this.$set(item,'checked',e.checked)
+      // #endif
+      // #ifndef H5 || APP-PLUS
+      this.data.forEach(item=>{
+        if(item.key===e.data.key){
+          item.checked = e.checked
+        }
+      })
+      // #endif
+      item.checked = e.checked
+      e.data.checked = e.checked
+      if(e.checked){
+        this.selectArr.push(e.data)
+      }else{
+        this.selectArr = this.selectArr.filter(item=>item.key!==e.data.key)
+      }
+      if(this.selectArr.length===this.transData.length){
+        this.indeterminate = false
+        this.checkedAll = true
+      }else{
+        this.indeterminate = true
+        this.checkedAll = false
+      }
+      if(!this.selectArr.length){
+        this.checkedAll = false
+        this.indeterminate = false
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleRowSelection',e.checked,this.selectArr)
+    },
+    itemFilter(item,ite){
+      if(ite.filters&&ite.name){
+        let key = item[ite.name]
+        return ite.filters[key]||''
+      }
+      return item[ite.name]||ite.emptyString
+    },
+    // 榛樿瀛椾綋涓哄井杞泤榛� Microsoft YaHei,瀛椾綋澶у皬涓� 14px
+    getTextWidth(str) {
+      if(str.length<3){
+        return 40
+      }
+      let regx = /^[0-9]+.?[0-9]*$/
+      let flexWidth = 0
+      for (const char of str) {
+        if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
+          // 濡傛灉鏄嫳鏂囧瓧绗︼紝涓哄瓧绗﹀垎閰�8涓崟浣嶅搴�
+          flexWidth += 10
+        } else if (char >= '\u4e00' && char <= '\u9fa5') {
+          // 濡傛灉鏄腑鏂囧瓧绗︼紝涓哄瓧绗﹀垎閰�15涓崟浣嶅搴�
+          flexWidth += 15
+        } else if(regx.test(char)){
+          flexWidth += 9
+        }else {
+          // 鍏朵粬绉嶇被瀛楃锛屼负瀛楃鍒嗛厤8涓崟浣嶅搴�
+          flexWidth += 7
+        }
+      }
+      return flexWidth
+    },
+    width(item){
+      return `${item.width?item.width:'100'}px`
+    },
+    showStripe(index){
+      if(this.currentDriver)return
+      if(this.stripe){
+        return (index % 2) != 0?'odd':'even'
+      }else{
+        return ''
+      }
+    },
+    //楠岃瘉瀛楃涓叉槸鍚︽槸鏁板瓧
+    checkNumber(theObj) {
+      var reg = /^[0-9]+.?[0-9]*$/;
+      if (reg.test(theObj)) {
+        return true;
+      }
+      return false;
+    },
+    isDate(data){
+      if(isNaN(data)&&!isNaN(Date.parse(data))){
+        return true
+      }
+      return false
+    },
+    sortAction(item,index){
+      if(!item.sorter){return false}
+      this.$set(item,'sorterMode',item.sorterMode==='_asc'?'_desc':'_asc')
+      if(item.sorter==='custom'){
+        this.$emit('sort-change',item,item.sorterMode.replace('_',''),index)
+      }else {
+        this.sortData(item)
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+    },
+    sortData(item){
+      let key = item.name
+
+      if(item.sorterMode==='_asc'){
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return a[key]-b[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return a1-b1
+          }
+        })
+      }else {
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return b[key]-a[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return b1-a1
+          }
+        })
+      }
+    },
+    throttle(method,delay=60){
+      let time = null
+      return (...args)=>{
+        if(!time){
+          time = setTimeout(()=>{
+            method(...args)
+            time = null;
+          },delay)
+        }
+      }
+    },
+    debounce(method,delay=1000){
+      return (...args)=>{
+        this.debounceTime&&clearTimeout(this.debounceTime)
+        this.debounceTime = setTimeout(()=>{
+          method(...args)
+        },delay)
+      }
+    },
+    handleBodyScroll(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.headerTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.leftFiexScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+
+    },
+    leftFixedScrollAction(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    scrollToLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='left'&&this.headerTableLeft<10){
+        this.headerTableLeft = 0
+      }else if(e.detail.direction==='top'&&this.leftFiexScrollTop<10){
+        this.leftFiexScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    scrollToFixedLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='top'&&this.bodyScrollTop<10){
+        this.bodyScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    handleTableScrollLeft(e,type){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    handleFooterTableScrollLeft(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    }
+  }
+}
+</script>
+<style lang="scss">
+.zb-table-fixed-left{
+  /*鍘婚櫎宸﹁竟婊氬姩鏉� */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+.zb-table-header{
+  ///*鍘婚櫎澶撮儴婊氬姩鏉� */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+
+</style>
+<style lang="scss" scoped>
+.sorter-table{
+  position: absolute;
+  right: 6px;
+  top:50%;
+  transform:translateY(-50%);
+  .sorter-table-icon{
+    width: 0;
+    height: 0;
+    color: #dcdcdc;
+    border-right: 4px solid transparent;
+    border-left: 4px solid transparent;
+  }
+  .sorter-table-icon:first-child{
+    border-bottom: 5px solid currentColor;
+  }
+  .sorter-table-icon:last-child{
+    margin-top: 1.5px;
+    border-top: 5px solid currentColor;
+  }
+  .sorting_desc{
+    color: #2979ff;
+  }
+  .sorting_asc{
+    color: #2979ff;
+  }
+}
+.checkbox-item{
+  display: flex;align-items: center;justify-content: center;width: 100%;height: 100%
+}
+.no-data{
+  width: 100%;
+  height: 80rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-bottom: 1px solid #e8e8e8;
+}
+.item-th{
+  position: relative;
+  flex-shrink: 0;
+  width: 100px;
+  overflow-wrap: break-word;
+  border-bottom: 1px solid #e8e8e8;
+  transition: background 0.3s;
+  padding-right: 20px;
+  word-break:keep-all;           /* 涓嶆崲琛� */
+  white-space:nowrap;          /* 涓嶆崲琛� */
+  overflow:hidden;               /* 鍐呭瓒呭嚭瀹藉害鏃堕殣钘忚秴鍑洪儴鍒嗙殑鍐呭 */
+  text-overflow:ellipsis;         /* 褰撳璞″唴鏂囨湰婧㈠嚭鏃舵樉绀虹渷鐣ユ爣璁�(...) 锛涢渶涓巓verflow:hidden;涓�璧蜂娇鐢ㄣ��*/
+  overflow-wrap: break-word;
+}
+.zb-table{
+  height: 100%;
+  overflow: hidden;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  font-size: 12px;
+  position: relative;
+  .zb-table-content{
+    //height: 100%;
+    //flex: 1;
+    position: relative;
+    overflow: hidden;
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+  }
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width: 100px;
+    padding-left: 8px;
+    height: 40px;
+    line-height: 40px;
+	padding-right: 20px;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 涓嶆崲琛� */
+    white-space:nowrap;          /* 涓嶆崲琛� */
+    overflow:hidden;               /* 鍐呭瓒呭嚭瀹藉害鏃堕殣钘忚秴鍑洪儴鍒嗙殑鍐呭 */
+    text-overflow:ellipsis;         /* 褰撳璞″唴鏂囨湰婧㈠嚭鏃舵樉绀虹渷鐣ユ爣璁�(...) 锛涢渶涓巓verflow:hidden;涓�璧蜂娇鐢ㄣ��*/
+    overflow-wrap: break-word;
+    border-bottom: 1px solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+
+  .zb-table-fixed-left .zb-table-header{
+    overflow-y: hidden;
+  }
+  .zb-table-header {
+    overflow: hidden;
+    background: #fafafa;
+    .item-th{
+      padding-left: 8px;
+      line-height: 39px;
+      height: 40px;
+      //display: flex;
+      //align-items: center;
+      box-sizing: border-box;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .odd{
+    background-color:rgba(249,249,249,0.6);
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+}
+.scroll-left-fixed{
+  .zb-table-fixed-left {
+    left: 0;
+    box-shadow: 6px 0 6px -4px #ccc;
+  }
+}
+.zb-table-applet{
+  height: 100%;
+  //overflow: hidden;
+  width: 100%;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  font-size: 12px;
+  .zb-table-content{
+    //height: 100%;
+    flex: 1;
+    overflow: hidden;
+    position: relative;
+
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+    width: fit-content;
+  }
+
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width: 100px;
+    padding-left: 8px;
+    height: 40px;
+    line-height: 40px;
+	padding-right:20px;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 涓嶆崲琛� */
+    white-space:nowrap;          /* 涓嶆崲琛� */
+    overflow:hidden;               /* 鍐呭瓒呭嚭瀹藉害鏃堕殣钘忚秴鍑洪儴鍒嗙殑鍐呭 */
+    text-overflow:ellipsis;         /* 褰撳璞″唴鏂囨湰婧㈠嚭鏃舵樉绀虹渷鐣ユ爣璁�(...) 锛涢渶涓巓verflow:hidden;涓�璧蜂娇鐢ㄣ��*/
+    overflow-wrap: break-word;
+    border-bottom: 1px solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+  .zb-table-header {
+    //overflow: hidden;
+    position: sticky;
+    top: 0;
+    z-index: 2;
+    //width: fit-content;
+    .item-th{
+      padding-left: 8px;
+      line-height: 39px;
+      height: 40px;
+      box-sizing: border-box;
+      background: #fafafa;
+    }
+    .zb-stick-side{
+      position: sticky;
+      top: 0;
+      left: 0;
+      z-index: 2;
+      //border-right: solid 1rpx #dbdbdb;
+      box-sizing: border-box;
+      background: #fafafa;
+      //box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-header .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .scroll-left-fixed{
+    .zb-table-fixed-left {
+      left: 0;
+      box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+  .odd{
+    background-color:rgba(249,249,249,0.6);
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+  .zb-table-tbody {
+    .zb-stick-side{
+      position: sticky;
+      left: 0;
+      z-index: 1;
+      box-sizing: border-box;
+      background:white;
+      //box-shadow: 6px 0 6px -2px #ccc;
+    }
+    .odd{
+      background:#f9f9f9;
+      //height: 100%;
+      width: 100%;
+    }
+    .even{
+      background:white ;
+      //height: 100%;
+      width: 100%;
+    }
+  }
+  .current-row{
+    .item-td{
+      background-color: #ecf5ff;
+    }
+  }
+}
+.current-row{
+  .item-td{
+    background-color: #ecf5ff;
+  }
+}
+.zb-table-header{
+  height: 40px;
+}
+.scrollPosition{
+  position: absolute;right: 0;top: 0;height: 100%;background: red;
+  z-index: 999;
+}
+</style>
diff --git a/uni_modules/zb-table/package.json b/uni_modules/zb-table/package.json
new file mode 100644
index 0000000..4bf4a39
--- /dev/null
+++ b/uni_modules/zb-table/package.json
@@ -0,0 +1,81 @@
+{
+  "id": "zb-table",
+  "displayName": "zb-table锛堝鍔熻兘琛ㄦ牸锛�",
+  "version": "1.2.18",
+  "description": "琛ㄦ牸缁勪欢 鏀寔鍥哄畾琛ㄥご鍜岄鍒椼�佷笂鎷夊姞杞芥洿澶氥�佸強鍥哄畾澶氬垪锛岃〃鏍艰嚜閫傚簲鍐呭锛屾帓搴忥紝澶氶�塩heckbox銆佸彲鐐瑰嚮鍒犻櫎锛岀紪杈戙�佸悎璁″姛鑳斤紝鍏煎澶氱",
+  "keywords": [
+    "table",
+    "琛ㄦ牸",
+    "鍥哄畾琛ㄥご銆佸浐瀹氶鍒椼�佸鍒�",
+    "涓婃媺鍔犺浇鏇村銆�",
+    "鎺掑簭銆佽嚜閫傚簲鍒楀銆佸閫塩heckbox銆佺紪杈戙�佸垹闄ゃ�佹寜閽�佸悎璁�"
+],
+  "repository": "https://github.com/zouzhibin/zb-table.git",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        },
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "y",
+          "鑱旂洘": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/zb-table/readme.md b/uni_modules/zb-table/readme.md
new file mode 100644
index 0000000..e3d402f
--- /dev/null
+++ b/uni_modules/zb-table/readme.md
@@ -0,0 +1,189 @@
+
+## 浠嬬粛
+鍩轰簬uni-app寮�鍙戠殑涓�涓櫘閫氱殑琛ㄦ牸缁勪欢锛屽姛鑳芥湁鍥哄畾棣栧垪鍜岃〃澶淬�佹帓搴忋�佹搷浣滄寜閽��
+table 琛ㄦ牸 鍥哄畾琛ㄥご銆佸浐瀹氶鍒椼�佸鍒� 涓婃媺鍔犺浇鏇村銆� 鎺掑簭銆佽嚜閫傚簲鍒楀銆佸閫塩heckbox銆佺紪杈戙�佸垹闄ゃ�佹寜閽�佸悎璁�
+宸茬敤浜庣敓浜х幆澧�
+
+寰俊=銆� 19550102670 鎷夎繘缇�
+## -- github 绗竴鏃堕棿浼氭洿鏂板埌github锛屾案杩滀繚鎸佹渶鏂帮紝鏈夊暐鎯虫硶鐨勫彲浠ユ彁PR,鍏卞悓寮�鍙� [鍦板潃](https://github.com/zouzhibin/zb-ui)
+
+## 鍙嬫儏閾炬帴
+### 鍦ㄧ嚎棰勮鐐瑰嚮 鈥斺�� [浼佷笟绾с�侀�氱敤鍨嬩腑鍚庡彴鍓嶇瑙e喅鏂规 ](https://yuanzbz.gitee.io/vue-admin-perfect/#/login?redirect=/home)
+### vue-admin-perfect 鈥斺�� [浼佷笟绾с�侀�氱敤鍨嬩腑鍚庡彴鍓嶇瑙e喅鏂规锛堝熀浜巚ue3.0+TS+Element-Plus  鏈�鏂扮増锛屽悓鏃舵敮鎸佺數鑴戯紝鎵嬫満锛屽钩鏉�)](https://github.com/zouzhibin/vue-admin-perfect)
+
+
+## table 灞炴��
+| 鍙傛暟 | 璇存槑 | 绫诲瀷 | 鍙�夊�� | 榛樿鍊� |鏄惁蹇呴』|
+| ------ | ------ | ------ | ------ | ------ |------ |
+| data | 鏄剧ず鐨勬暟鎹� | array |-- | -- |蹇呴』 |
+| column | 鏄剧ず鐨勫垪鏁版嵁 | array |-- | -- |蹇呴』 |
+| stripe | 鏄惁涓烘枒椹汗 table| boolean | - |false | 鍚� |
+| fit | 鍒楃殑瀹藉害鏄惁鑷拺寮� | boolean |true,false | false |鍚� |
+| show-header | 鏄惁鏄剧ず琛ㄥご | boolean |true,false | true |鍚� |
+| cell-style | 鍗曞厓鏍肩殑 style 鐨勫洖璋冩柟娉曪紝涔熷彲浠ヤ娇鐢ㄤ竴涓浐瀹氱殑 Object 涓烘墍鏈夊崟鍏冩牸璁剧疆涓�鏍风殑 Style銆� | Function({row, column, rowIndex, columnIndex})/Object |-- | -- |鍚� |
+| cell-header-style | 澶撮儴鍗曞厓鏍肩殑 style 鐨勫洖璋冩柟娉曪紝涔熷彲浠ヤ娇鐢ㄤ竴涓浐瀹氱殑 Object 涓烘墍鏈夊崟鍏冩牸璁剧疆涓�鏍风殑 Style銆� | Function({ column, columnIndex})/Object |-- | -- |鍚� |
+| formatter | colomn =銆媐ormatter 蹇呴』璁剧疆涓簍rue,鎵嶆湁浣滅敤锛岃繘琛屾牸寮忓寲鏁版嵁锛岃繘琛屾暟鎹殑杞崲 | Function({row, column, rowIndex, columnIndex})/Object |-- | -- |鍚� |
+| border | 鏄惁甯︽湁绾靛悜杈规 | boolean |true,false | true |鍚� |
+| highlight | 鏄惁瑕侀珮浜綋鍓嶈 | boolean |true,false | false |鍚� |
+| show-summary | 鏄惁鍦ㄨ〃灏炬樉绀哄悎璁¤ | boolean |true,false | false |鍚� |
+| sum-text | 鍚堣琛岀涓�鍒楃殑鏂囨湰 | String |- | 鍚堣 |鍚� |
+| summary-method | 鑷畾涔夌殑鍚堣璁$畻鏂规硶 | Function({ columns, data }) |- | - |鍚� |
+| permissionBtn | 鏄惁鍔ㄦ�佹帶鍒舵寜閽殑鏄剧ず闅愯棌 | Function({ row, renders,index }) |- | - |鍚� |
+| isShowLoadMore | 鏄惁寮�鍚笂鎷夊姞杞� | boolean |true,false | false |鍚� |
+| pullUpLoading | 寮�鍚笂鎷夊姞杞藉悗鐨勮繑鍥炲嚱鏁帮紝鎺ユ敹鍙傛暟done鏄嚱鏁�,done(type),type涓虹┖浠h〃杩樻湁鏁版嵁锛岀户缁紑鍚笂鎷夊姞杞斤紝type='ok',浠h〃缁撴潫涓婃媺鍔犺浇 | Function(done) |-- | -- |鍚� |
+
+```
+鍏抽棴涓婃媺鍔犺浇鐨勬柟寮�1锛歱ullUpLoading((done)=>{
+	done(type)
+})
+done 鎺ユ敹鍙傛暟涓� type 锛宼ype涓虹┖浠h〃杩樻湁鏁版嵁锛屽彲浠ョ户缁姞杞斤紝鏃犳暟鎹殑鏃跺�欎紶鍏� 'ok'浠h〃缁撴潫
+```
+
+## table 浜嬩欢
+| 鍙傛暟 | 璇存槑 | 绫诲瀷 | 鍙�夊��                      | 榛樿鍊� |鏄惁蹇呴』|
+| ------ | ------ | ------ |--------------------------| ------ |------ |
+| 浜嬩欢鍚嶈嚜瀹氫箟 | 鍙栧喅浜巘ype绫诲瀷涓簅peration鐨� renders鍙傛暟閲岄潰 func 鐨勫弬鏁板悕 | Function | (row,index)=>{}          | -- |鍚� |
+| sort-change | 鍙栧喅浜巘ype绫诲瀷涓簅peration鐨� renders鍙傛暟閲岄潰 func 鐨勫弬鏁板悕 | Function | (column,model,index)=>{} | -- |鍚� |
+| currentChange | 褰撹〃鏍肩殑褰撳墠琛屽彂鐢熷彉鍖栫殑鏃跺�欎細瑙﹀彂璇ヤ簨浠讹紝濡傛灉瑕侀珮浜綋鍓嶈锛岃鎵撳紑琛ㄦ牸鐨� highlight灞炴��,this.$refs.table.resetHighlight()娓呴櫎閫変腑 | Function | (row,index)=>{}          | -- |鍚� |
+| toggleRowSelection | 鐢ㄤ簬澶氶�夎〃鏍硷紝鍒囨崲鏌愪竴琛岀殑閫変腑鐘舵�侊紝绗竴涓弬鏁颁唬琛ㄩ�変腑鐘舵�侊紝鍙傛暟浜屼唬琛ㄩ�変腑鐨勫璞� | Function | (selected ,array)=>{}    | -- |鍚� |
+| toggleAllSelection | 鐢ㄤ簬澶氶�夎〃鏍硷紝鍒囨崲鎵�鏈夎鐨勯�変腑鐘舵�� 锛岀涓�涓弬鏁颁唬琛ㄩ�変腑鐘舵�侊紝鍙傛暟浜屼唬琛ㄩ�変腑鐨勫璞 Function | (selected ,array)=>{}    | -- |鍚� |
+| rowClick | 鍗曞嚮鏌愯 锛岀涓�涓弬鏁颁唬琛ㄩ�変腑瀵硅薄锛屽弬鏁颁簩浠h〃閫変腑鐨刬ndex| Function | (row ,index)=>{}         | -- |鍚� |
+| cellClick | 鍗曞嚮鍗曞厓鏍� 锛屽綋鏌愪釜鍗曞厓鏍艰鐐瑰嚮鏃朵細瑙﹀彂璇ヤ簨浠秥 Function | (row ,index,column)=>{}        | -- |鍚� |
+| pullUpLoading | 寮�鍚笂鎷夊姞杞藉悗鐨勮繑鍥炲嚱鏁帮紝鏃犲弬鏁皘 Function  | --                       |-- |鍚� |
+
+```
+鍏抽棴涓婃媺鍔犺浇鐨勬柟寮�2锛歵his.$refs.zbTable.pullUpCompleteLoading('ok')
+鎺ユ敹鍙傛暟涓� type 锛宼ype涓虹┖浠h〃杩樻湁鏁版嵁锛屽彲浠ョ户缁姞杞斤紝鏃犳暟鎹殑鏃跺�欎紶鍏� 'ok'浠h〃缁撴潫
+```
+
+## data 灞炴��
+| 鍙傛暟 | 璇存槑 | 绫诲瀷 | 鍙�夊�� | 榛樿鍊� |
+| ------ | ------ | ------ | ------ | ------ |
+| checked | 鏄惁琚嬀閫� | boolean |true,false | 鏃� |
+
+
+## column 灞炴��
+| 鍙傛暟 | 璇存槑 | 绫诲瀷 | 鍙�夊�� | 榛樿鍊� |
+| ------ | ------ | ------ | ------ | ------ |
+| name | 灞炴�у�� | string |-- | 鏃� |
+| label | 鏄剧ず鐨勬爣棰� | string |-- | 鏃� |
+| width | 鍒楃殑瀹藉害 | number |-- | 100 |
+| fixed | 鍒楁槸鍚﹀浐瀹氬湪宸︿晶锛宼rue 琛ㄧず鍥哄畾鍦ㄥ乏渚� | boolean |true,false | true |
+| sorter | 鎺掑簭锛屽綋璁剧疆涓篶ustom鐨勬椂鍊欎唬琛ㄨ嚜瀹氫箟鎺掑簭锛屼笉浼氬啀瑙﹀彂榛樿鎺掑簭锛屼細瑙﹀彂table浜嬩欢@sort-change,鍙互閫氳繃鎺ュ彛鏉ヨ繘琛屾帓搴� | boolean |true,false,'custom' | false |
+| emptyString | 褰撳�间负绌虹殑鏃跺�欓粯璁ゆ樉绀虹殑鍊� | string |  | -- |
+| filters | 瀵硅薄杩囨护鐨勯�夐」锛屽璞℃牸寮忥紝瀵硅薄涓殑鍏冪礌闇�瑕佹湁 key 鍜� value 灞炴�с�� | Object | {key:value} | -- |
+| align | 瀵归綈鏂瑰紡 | String | left/center/right | left |
+| type | 涓� operation 鐨勬椂鍊欎唬琛ㄤ负鎿嶄綔鎸夐挳,img鐨勬椂鍊欎唬琛ㄥ浘鐗囧湴鍧�,index浠h〃搴忓垪鍙� | string | operation,img,index | -- |
+| renders | type 涓簅peration鐨勬椂鍊� 蹇呬紶 | Array | {name:'鍚嶅瓧',func:"鐖跺厓绱犳帴鏀朵簨浠跺悕",type:"鎸夐挳鐨勭被鍨�",size:"澶у皬"} | -- |
+```
+type 涓� operation 鐨勬椂鍊欎唬琛ㄤ负鎿嶄綔鎸夐挳
+renders 浠h〃浼犲叆鐨勬寜閽�  Array  =>[
+    {
+        name:'缂栬緫',
+        class:"", // 娣诲姞class
+        type:'primary',浠h〃鎸夐挳鐨勭被鍨�  type 涓篶ustom鐨勬椂鍊欒嚜瀹氫箟鎸夐挳 鍏朵粬绫诲瀷鍙栧喅浜巙niapp buttom缁勪欢鎸夐挳
+        size:'mini',浠h〃鎸夐挳鐨勫ぇ灏�
+        func:'edit' // func 浠h〃鎿嶄綔鎸夐挳鐐瑰嚮鐨勪簨浠跺悕瀛� 鐖跺厓绱犳帴鏀剁殑浜嬩欢 鐖跺厓绱� @edit
+        渚嬪锛�// <zb-table @edit=""/> 
+        
+    }
+]
+```
+## 绀轰緥
+```
+<zb-table
+            :show-header="true"
+            :columns="column"
+            :stripe="true"
+            :fit="false"
+            show-summary
+            sum-text="鍚堣"
+            @rowClick="rowClick"
+            :summary-method="getSummaries"
+            @toggleRowSelection="toggleRowSelection"
+            @toggleAllSelection="toggleAllSelection"
+            :border="true"
+            @edit="buttonEdit"
+            @dele="dele"
+            :data="data"></zb-table>
+```
+
+## 鏁版嵁鏍煎紡
+```
+column:[
+          { type:'selection', fixed:true,width:50 },
+          { name: 'name', label: '濮撳悕',fixed:false,width:80,emptyString:'--' },
+          { name: 'age', label: '骞寸邯',sorter:false,align:'right', },
+          { name: 'sex', label: '鎬у埆',filters:{0:'鐢�',1:'濂�'}},
+		  { name: 'img', label: '鍥剧墖',type:"img" },
+          { name: 'address', label: '鍦板潃' },
+          { name: 'date', label: '鏃ユ湡',sorter:true },
+          { name: 'province', label: '鐪佷唤' },
+          { name: 'city', label: '鍩庡競' },
+          { name: 'zip', label: '閭紪' },
+          { name: 'operation', type:'operation',label: '鎿嶄綔',renders:[
+              {
+                name:'缂栬緫',
+                func:'edit' // func 浠h〃瀛愬厓绱犵偣鍑荤殑浜嬩欢 鐖跺厓绱犳帴鏀剁殑浜嬩欢 鐖跺厓绱� @edit
+              },
+              {
+                name:'鍒犻櫎',
+                type:'warn',
+                func:"dele"
+              },
+            ]},
+        ],
+ data:[
+          {
+            date: '2016-05-02',
+            name: '鐜嬪皬铏�1',
+            province: '涓婃捣',
+            sex:'鐢�',
+            age:'18',
+			img:"https://img1.baidu.com/it/u=300787145,1214060415&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500",
+            city: '鏅檧鍖�',
+            address: '涓婃捣甯傛櫘',
+            zip: 200333
+          },
+          {
+            date: '2016-05-02',
+            name: '鐜嬪皬铏�2',
+            province: '涓婃捣',
+            sex:'鐢�',
+            age:'18',
+            city: '鏅檧鍖�',
+            address: '涓婃捣甯傛櫘',
+            zip: 200333
+          },
+          {
+            date: '2016-05-02',
+            name: '鐜嬪皬铏�3',
+            province: '涓婃捣',
+            sex:'鐢�',
+            age:'18',
+            city: '鏅檧鍖�',
+            address: '涓婃捣甯傛櫘',
+            zip: 200333
+          },
+          {
+            date: '2016-05-02',
+            name: '鐜嬪皬铏�4',
+            province: '涓婃捣',
+            sex:'鐢�',
+            age:'18',
+            city: '鏅檧鍖�',
+            address: '涓婃捣甯傛櫘',
+            zip: 200333
+          },
+          {
+            date: '2016-05-02',
+            name: '鐜嬪皬铏�5',
+            province: '涓婃捣',
+            sex:'鐢�',
+            age:'18',
+            city: '鏅檧鍖�',
+            address: '涓婃捣甯傛櫘',
+            zip: 200333
+          }
+        ]       
+```
diff --git a/utils/mpaasScan.js b/utils/mpaasScan.js
index deb1ca1..752e190 100644
--- a/utils/mpaasScan.js
+++ b/utils/mpaasScan.js
@@ -1,11 +1,12 @@
+import { CommonUtils } from "./common"
 class mpaasScan {
 	mpaasScanModule
 	constructor() {
 		this.mpaasScanModule = uni.requireNativePlugin("Mpaas-Scan-Module")
 	}
 
-	scanCode(callback) {
-		mpaasScanModule.mpaasScan({
+ 	scanCode(callback) {
+		this.mpaasScanModule.mpaasScan({
 			'hideAlbum': true,
 			'timeoutInterval':'10', //瓒呮椂鏃堕棿
 			'timeoutText':'鏈瘑鍒埌浜岀淮鐮�' //瓒呮椂鎻愰啋            

--
Gitblit v1.9.1