skyouc
1 天以前 9dc1df97b7cc9422d18a58d04523f7f1bc1e3c36
no message
5个文件已添加
3个文件已修改
1657 ■■■■■ 已修改文件
pages/pakin/EmptyPakin.vue 551 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-data-select/changelog.md 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue 837 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-data-select/package.json 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-data-select/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-load-more/changelog.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uni_modules/uni-load-more/package.json 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/pakin/EmptyPakin.vue
New file
@@ -0,0 +1,551 @@
<template>
    <view>
        <view class="code">
            <view class="item">
                <view class="code-decs">托盘码:</view>
                <input type="text" placeholder=" 扫码 / 输入" v-model="barcode" :focus="barcodeFocus"
                    @input="barcodeInput()">
            </view>
        </view>
        <view class="mat-list-title">
            商品列表
        </view>
        <scroll-view>
            <view class="list" v-for="(item,i) in dataList" :key="i">
                <view class="list-left">
                    <view class="list-left-item">
                        <view class="desc">No:</view>
                        <view class="left-item">{{i + 1}}</view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">订单号:</view>
                        <view class="left-item">
                            <uni-tag :text="item.orderNo" type="primary"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">格层编码:</view>
                        <view class="left-item">
                            <uni-tag :text="item.boxType1" type="primary"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">BS Code:</view>
                        <view class="left-item">
                            <uni-tag :text="item.threeCode" type="primary"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">料号:</view>
                        <view class="left-item">
                            <uni-tag :text="item.matnr" type="primary"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">品名:</view>
                        <view class="left-item">{{item.maktx}}</view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">供应商:</view>
                        <view class="left-item">
                            <uni-tag :text="item.suppCode" type="warning"></uni-tag>
                        </view>
                    </view>
                    <view class="list-left-item">
                        <view class="desc">数量:</view>
                        <view class="left-item">{{item.anfme}}</view>
                    </view>
                </view>
                <view class="list-right">
                    <uni-icons type="compose" color="#9add8b" size="24" @click="revise(item,i)"></uni-icons>
                    <uni-icons type="trash" color="#f58a8a" size="24" @click="remove(item,i,'warn')"></uni-icons>
                </view>
            </view>
        </scroll-view>
        <!-- 底部操作按钮 -->
        <view class="buttom">
            <button size="mini" @click="reset('warn')">重置</button>
            <button size="mini" type="primary" @click="combConfirm('warn')">组托</button>
        </view>
        <!-- 弹窗 -->
        <!-- 修改数量 -->
        <view>
            <uni-popup ref="revise" type="dialog">
                <view class="popup">
                    <!-- 标题 -->
                    <view class="title">修改</view>
                    <view class="popup-item">
                        <view class="popup-item-left">料号:</view>
                        <view class="popup-item-right">
                            <input type="text" v-model="matnr" disabled="true"
                                style="background-color: #f7f7f7;padding: 0;color: #d5d5d5;">
                        </view>
                    </view>
                    <view class="popup-item">
                        <view class="popup-item-left">供应商:</view>
                        <view class="popup-item-right">
                            <input type="text" v-model="suppCode" disabled="true"
                                style="background-color: #f7f7f7;padding: 0;color: #d5d5d5;">
                        </view>
                    </view>
                    <view class="popup-item">
                        <view class="popup-item-left">格层编码:</view>
                        <view class="popup-item-right">
                            <input type="text" v-model="tempBoxType"
                                style="background-color: #f7f7f7;padding: 0;color: #d5d5d5;">
                        </view>
                    </view>
                    <view class="popup-item">
                        <view class="popup-item-left">数量:</view>
                        <view class="popup-item-right" style="border: none;justify-content: center;">
                            <uni-number-box :value="count" :step='1' :max="9999999" color="#747474"
                                @change="changeValue" />
                        </view>
                    </view>
                    <view class="btn">
                        <view class="btn-left" @click="reviseClose">取消</view>
                        <view class="btn-right" @click="reviseConfirm()">修改</view>
                    </view>
                </view>
            </uni-popup>
        </view>
        <!-- 移除确认 -->
        <view>
            <!-- 提示窗示例 -->
            <uni-popup ref="alertDialog" type="dialog">
                <uni-popup-dialog :type="msgType" confirmText="移除" :title="title" :content="content"
                    @confirm="removeConfirm()" @close="removeClose"></uni-popup-dialog>
            </uni-popup>
        </view>
        <view>
            <!-- 提示信息弹窗 -->
            <uni-popup ref="message" type="message">
                <uni-popup-message :type="msgType1" :message="messageText" :duration="2000"></uni-popup-message>
            </uni-popup>
        </view>
        <!-- 确认组托 -->
        <view>
            <uni-popup ref="combConfirm" type="dialog">
                <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                    @confirm="comb" @close="combClose"></uni-popup-dialog>
            </uni-popup>
        </view>
        <!-- 确认重置 -->
        <view>
            <uni-popup ref="resetConfirm" type="dialog">
                <uni-popup-dialog :type="msgType" cancelText="取消" confirmText="确认" :title="title" :content="content"
                    @confirm="resetConfirm" @close="resetClose"></uni-popup-dialog>
            </uni-popup>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                baseUrl: '',
                token: '',
                barcode: '',
                orderNo: null,
                dataList: [],
                count: 0,
                threeCode: '',
                rowNum: '',
                matnr: '',
                suppCode: '',
                boxType1: '',
                weight: '',
                msgType1: 'success',
                msgType: 'success',
                messageText: '',
                title: '',
                content: '',
                tempBoxType: '',
                boxType1Focus: true,
                barcodeFocus: false,
                matFocus: false,
                orderNoFocus: false,
                matData: '',
                removeNum: 0,
            }
        },
        onLoad() {
        },
        onShow() {
            this.baseUrl = uni.getStorageSync('baseUrl');
            this.token = uni.getStorageSync('token');
        },
        methods: {
            messageToggle(type) {
                this.msgType1 = type
                this.$refs.message.open()
            },
            // barcode input 事件
            orderNoInput() {
                // 不设置定时器 会出现扫入的字符串不全
                setTimeout(() => {
                    var len = this.orderNo.length
                    // this.barcodeFocuss()
                }, 200)
            },
            barcodeInput() {
                // 不设置定时器 会出现扫入的字符串不全
                // setTimeout(() => {
                //     var len = this.barcode.length
                //     if (len != 8) {
                //         uni.showToast({
                //             title: '托盘码有误请重试',
                //             icon: "none",
                //             position: 'top'
                //         });
                //         this.barcodeFocuss()
                //         return;
                //     }
                //     this.focuss()
                // }, 200)
            },
            boxType1Input() {
                let bcode = this.boxType1.split("-")[0];
                if (this.barcode != null && this.barcode != undefined && this.barcode != '') {
                    if (this.barcode != bcode && this.dataList.length > 0) {
                        this.messageText = "多次组托台车不一致,请检查后再操作!!"
                        this.messageToggle('error')
                        return;
                    }
                }
                this.barcode = bcode;
            },
            // 托盘码有误重置
            barcodeFocuss() {
                let that = this;
                that.barcodeFocus = false;
                setTimeout(() => {
                    that.barcode = '';
                    that.barcodeFocus = true;
                }, 100);
            },
            // 商品光标清空重置
            focuss() {
                this.focus = false;
                setTimeout(() => {
                    this.matnr = '';
                    this.matFocus = true;
                }, 100);
            },
            // 搜索物料
            findMat() {
                if (this.boxType1 == null || this.boxType1 == '') {
                    this.messageText = "格层编码不能为空!!"
                    this.messageToggle('error')
                    return
                }
                let that = this
                uni.request({
                    url: that.baseUrl + '/mobile/scan/order/mats',
                    method: 'POST',
                    data: {
                        orderNo: that.orderNo,
                        threeCode: that.matnr
                        // matnr: that.matnr
                    },
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        result = result.data
                        if (result.code === 200 && result.data) {
                            that.matData = result.data
                            that.matnr = ''
                            that.matData['suppCode'] = ''
                            uni.navigateTo({
                                url: "../mat/matSelected",
                                // 通过eventChannel向被打开页面传送数据
                                success: function(res) {
                                    res.eventChannel.emit('mat', {
                                        data: result.data
                                    })
                                },
                                // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
                                events: {
                                    matList: function(data) {
                                        that.checkMat(data.data)
                                        that.focuss()
                                    },
                                },
                            });
                        } else if (result.code == 403) {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            uni.showToast({
                                title: result.msg,
                                icon: "none",
                                position: 'top'
                            })
                        }
                    }
                });
            },
            selectMat() {
                let that = this
                if (that.orderNo == null || that.orderNo == undefined) {
                    that.messageText = '请填写订单编号!!'
                    that.messageToggle('error')
                    return;
                }
                uni.navigateTo({
                    url: "../mat/matQuery",
                    success: function(res) {
                        // 通过eventChannel向被打开页面传送数据   向另外一个页面传递值的
                        res.eventChannel.emit('orderNo', {
                            orderNo: that.orderNo
                        })
                    },
                    events: {
                        // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据  另外一个页面传过来的
                        acceptDataFromOpenedPage: function(data) {
                            that.matnr = data.data
                            that.findMat(that.matnr)
                        },
                    },
                });
                that.matnr = ''
            },
            checkMat(mat) {
                var len = this.dataList.length
                var add = true,
                    sameItem = false
                for (var i = 0; i < len; i++) {
                    if (mat.matnr == this.dataList[i].matnr) {
                        for (var j = 0; j < len; j++) {
                            if (mat.suppCode == this.dataList[j].suppCode && mat.orderNo == this.dataList[j].orderNo && this.boxType1 == this.dataList[j].boxType1) {
                                sameItem = true
                            }
                        }
                        // 相同物料 不同批号  新加列表
                        if (mat.suppCode != this.dataList[i].suppCode || mat.orderNo != this.dataList[i].orderNo || this.boxType1 != this.dataList[i].boxType1) {
                            this.$forceUpdate() // 强制刷新
                            if (sameItem) {
                                add = false
                            } else {
                                add = true
                            }
                        } else {
                            // 相同物料相同批号 数量累加
                            this.dataList[i].anfme += mat.anfme
                            this.$forceUpdate() // 强制刷新
                            add = false
                        }
                    }
                    if (this.dataList[i].boxType1 != null &&  this.dataList[i].boxType1 == "1") {
                        this.dataList[i].boxType1 = this.boxType1;
                    }
                }
                if (add) {
                    mat.boxType1 = this.boxType1;
                    this.dataList.unshift(mat)
                }
                this.tempBoxType = this.boxType1;
                this.boxType1 = null;
            },
            // 修改批号
            revise(item, i) {
                this.matnr = this.dataList[i].matnr
                this.count = this.dataList[i].anfme
                this.suppCode = this.dataList[i].suppCode
                this.weight = this.dataList[i].weight
                this.rowNum = i
                this.eject()
            },
            eject(type) {
                this.type = type
                this.$refs.revise.open(type)
            },
            // 列表移除按钮
            remove(item, i, type) {
                this.removeNum = i
                this.msgType = type
                this.title = '警告'
                this.content = '是否移除当前商品!'
                this.$refs.alertDialog.open(i)
            },
            // 确认移除
            removeConfirm() {
                this.messageText = "移除成功"
                this.messageToggle('success')
                this.dataList.splice(this.removeNum, 1)
            },
            // 取消移除
            removeClose() {
                this.$refs.alertDialog.close()
            },
            reviseConfirm() {
                this.dataList[this.rowNum].anfme = this.count
                this.dataList[this.rowNum].suppCode = this.suppCode
                this.dataList[this.rowNum].weight = this.weight
                this.dataList[this.rowNum].boxType1 = this.tempBoxType
                this.matnr = ''
                this.messageText = "修改成功"
                this.messageToggle('success')
                this.$refs.revise.close()
            },
            reviseClose() {
                this.$refs.revise.close()
            },
            changeValue(value) {
                this.count = value
            },
            combConfirm(type) {
                this.msgType = type
                this.title = '警告'
                this.content = '是否现在组托!'
                this.$refs.combConfirm.open()
            },
            combClose() {
                this.$refs.combConfirm.close()
            },
            comb() {
                uni.vibrateShort();
                let that = this;
                if (that.barcode === '') {
                    this.messageText = "请扫描托盘条码"
                    this.messageToggle('error')
                    return;
                }
                uni.request({
                    url: that.baseUrl + '/mobile/comb/auth',
                    data: JSON.stringify({
                        barcode: that.barcode,
                        pakinType: '3'
                    }),
                    method: 'POST',
                    header: {
                        'token': uni.getStorageSync('token')
                    },
                    success(result) {
                        var res = result.data
                        if (res.code === 200) {
                            that.resst();
                            that.messageText = "组托成功"
                            that.messageToggle('success')
                            const innerAudioContext = uni.createInnerAudioContext();
                            innerAudioContext.src = '/static/music/pakinOk.mp3';
                            innerAudioContext.play()
                        } else if (res.code == 403) {
                            that.messageText = res.msg
                            that.messageToggle('error')
                            setTimeout(() => {
                                uni.reLaunch({
                                    url: '../login/login'
                                });
                            }, 1000);
                        } else {
                            that.messageText = res.msg
                            that.messageToggle('error')
                        }
                    }
                });
            },
            reset(type) {
                this.msgType = type
                this.title = '警告'
                this.content = '是否重置!'
                this.$refs.resetConfirm.open()
            },
            // 确认重置
            resetConfirm() {
                this.dataList = []
                this.barcode = ''
                this.messageText = "重置完成"
                this.messageToggle('success')
            },
            // 取消重置
            resetClose() {
            },
            // 清空
            resst() {
                this.dataList = []
                this.barcode = ''
                this.barcodeFocuss()
            },
        }
    }
</script>
<style>
    @import url('../../static/css/wms.css/wms.css');
    .list:first-child {
        margin-top: 460rpx;
    }
    .code {
        width: 100%;
        position: fixed;
        min-height: 200rpx;
        background-color: #FFF;
        z-index: 10;
    }
    .item {
        display: flex;
        align-items: center;
        height: 100rpx;
        margin-left: 20rpx;
        border-bottom: 1px solid #DCDFE6;
    }
    .item input {
        height: 50rpx;
        line-height: 50rpx;
        /* font-family: PingFang SC; uniapp 默认字体不居中 */
        font-size: 36upx;
        font-family: PingFang SC;
        width: 55vw;
    }
    .code-decs {
        width: 20vw;
        font-size: 18px;
        color: #303133;
    }
    .item-right {
        margin-left: auto;
        margin-right: 20rpx;
    }
    .mat-list-title {
        height: 80rpx;
        line-height: 80rpx;
        width: 100%;
        background-color: white;
        position: fixed;
        margin-top: 210rpx;
        z-index: 9;
        /* border-top: 1px solid #DCDFE6; */
        text-align: center;
        box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.5);
    }
</style>
uni_modules/uni-data-select/changelog.md
New file
@@ -0,0 +1,51 @@
## 1.1.0(2025-08-19)
- 新增 插槽 selected empty option
- 新增 mutiple 属性,支持多选功能
- 新增 wrap 属性,支持选中的文字超过一行显示
- 新增 align 属性,支持修改选中的文字显示的位置
- 新增 hideRight 属性,支持隐藏右侧所有按钮
- 新增 mode 属性,支持修改边框样式
- 新增 事件 open close clear
## 1.0.10(2025-04-14)
- 修复 清除按钮不展示问题
## 1.0.9(2025-03-26)
- 优化 默认背景为白色与整体组件保持风格统一
## 1.0.8(2024-03-28)
- 修复 在vue2下:style动态绑定导致编译失败的bug
## 1.0.7(2024-01-20)
- 修复 长文本回显超过容器的bug,超过容器部分显示省略号
## 1.0.6(2023-04-12)
- 修复 微信小程序点击时会改变背景颜色的 bug
## 1.0.5(2023-02-03)
- 修复 禁用时会显示清空按钮
## 1.0.4(2023-02-02)
- 优化 查询条件短期内多次变更只查询最后一次变更后的结果
- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue
## 1.0.3(2023-01-16)
- 修复 不关联服务空间报错的问题
## 1.0.2(2023-01-14)
- 新增  属性 `format` 可用于格式化显示选项内容
## 1.0.1(2022-12-06)
- 修复  当where变化时,数据不会自动更新的问题
## 0.1.9(2022-09-05)
- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
## 0.1.8(2022-08-29)
- 修复 点击的位置不准确
## 0.1.7(2022-08-12)
- 新增 支持 disabled 属性
## 0.1.6(2022-07-06)
- 修复 pc端宽度异常的bug
## 0.1.5
- 修复 pc端宽度异常的bug
## 0.1.4(2022-07-05)
- 优化 显示样式
## 0.1.3(2022-06-02)
- 修复 localdata 赋值不生效的 bug
- 新增 支持  uni.scss 修改颜色
- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用)
## 0.1.2(2022-05-08)
- 修复 当 value 为 0 时选择不生效的 bug
## 0.1.1(2022-05-07)
- 新增 记住上次的选项(仅 collection 存在时有效)
## 0.1.0(2022-04-22)
- 初始化
uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
New file
@@ -0,0 +1,837 @@
<template>
    <view class="uni-stat__select">
        <span v-if="label" class="uni-label-text hide-on-phone">{{label + ':'}}</span>
        <view class="uni-stat-box" :class="{'uni-stat__actived': current}">
            <view class="uni-select" :class="{'uni-select--disabled':disabled, 'uni-select--wrap': shouldWrap , 'border-default': mode == 'default','border-bottom': mode == 'underline'}">
                <view class="uni-select__input-box" @click="toggleSelector" :class="{'uni-select__input-box--wrap': shouldWrap}">
          <view v-if="slotSelected" class="slot-content padding-top-bottom" :class="{'uni-select__input-text--wrap': shouldWrap}">
            <slot name="selected" :selectedItems="getSelectedItems()"></slot>
          </view>
          <template v-else>
            <view v-if="textShow" class="uni-select__input-text" :class="{'uni-select__input-text--wrap': shouldWrap}">
              <view class="padding-top-bottom" :class="'align-'+align">{{textShow}}</view>
            </view>
            <view v-else class="uni-select__input-text uni-select__input-placeholder" :class="'align-'+align">{{typePlaceholder}}</view>
          </template>
                    <view key="clear-button" v-if="!hideRight && shouldShowClear && clear && !disabled" @click.stop="clearVal">
                        <uni-icons type="clear" color="#c0c4cc" size="24" />
                    </view>
                    <view key="arrow-button" v-else-if="!hideRight">
                        <uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
                    </view>
                </view>
                <view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
                    <view class="uni-select__selector" :style="getOffsetByPlacement" v-if="showSelector">
                        <view :class="placement=='bottom'?'uni-popper__arrow_bottom':'uni-popper__arrow_top'"></view>
                        <scroll-view scroll-y="true" class="uni-select__selector-scroll">
                            <template v-if="slotEmpty && mixinDatacomResData.length === 0">
                                <view class="uni-select__selector-empty">
                                    <slot name="empty" :empty="emptyTips"></slot>
                                </view>
                            </template>
                            <template v-else>
                                <view v-if="mixinDatacomResData.length === 0" class="uni-select__selector-empty">
                                    <text>{{emptyTips}}</text>
                                </view>
                            </template>
                            <template v-if="slotOption">
                                <view v-for="(itemData,index) in mixinDatacomResData" :key="index" @click="change(itemData)">
                                    <slot name="option" :item="itemData" :itemSelected="multiple? getCurrentValues().includes(itemData.value):getCurrentValues() == itemData.value"></slot>
                                </view>
                            </template>
                            <template v-else>
                                <view v-if="!multiple && mixinDatacomResData.length > 0" class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index"
                                    @click="change(item)">
                                    <text :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
                                </view>
                                <view v-if="multiple && mixinDatacomResData.length > 0" >
                                    <checkbox-group @change="checkBoxChange">
                                        <label class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index" >
                                            <checkbox :value="index+''" :checked="getCurrentValues().includes(item.value)" :disabled="item.disable"></checkbox>
                                            <view :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</view>
                                        </label>
                                    </checkbox-group>
                                </view>
                            </template>
                        </scroll-view>
                    </view>
            </view>
        </view>
    </view>
</template>
<script>
    /**
     * DataChecklist 数据选择器
     * @description 通过数据渲染的下拉框组件
     * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
     * @property {String|Array} value 默认值,多选时为数组
     * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
     * @property {Boolean} clear 是否可以清空已选项
     * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
     * @property {String} label 左侧标题
     * @property {String} placeholder 输入框的提示文字
     * @property {Boolean} disabled 是否禁用
     * @property {Boolean} multiple 是否多选模式
     * @property {Boolean} wrap 是否允许选中文本换行显示
     * @property {String} placement 弹出位置
     *     @value top           顶部弹出
     *     @value bottom        底部弹出(default)
     * @property {String} align 选择文字的位置
     *  @value left 显示左侧
     *  @value center 显示中间
     *  @value right 显示 右侧
     * @property {Boolean} hideRight 是否隐藏右侧按钮
     * @property {String} mode 边框样式
     *  @value default 四周边框
     *  @value underline 下边框
     *  @value none 无边框
     * @event {Function} change  选中发生变化触发
     * @event {Function} open  选择框开启时触发
     * @event {Function} close  选择框关闭时触发
     * @event {Function} clear  点击清除按钮之后触发
     */
    export default {
        name: "uni-data-select",
        mixins: [uniCloud.mixinDatacom || {}],
        emits: [
            'open',
            'close',
            'update:modelValue',
            'input',
            'clear',
            'change'
        ],
        model: {
            prop: 'modelValue',
            event: 'update:modelValue'
        },
        options: {
            // #ifdef MP-TOUTIAO
            virtualHost: false,
            // #endif
            // #ifndef MP-TOUTIAO
            virtualHost: true
            // #endif
        },
        props: {
            localdata: {
                type: Array,
                default () {
                    return []
                }
            },
            value: {
                type: [String, Number, Array],
                default: ''
            },
            modelValue: {
                type: [String, Number, Array],
                default: ''
            },
            label: {
                type: String,
                default: ''
            },
            placeholder: {
                type: String,
                default: '请选择'
            },
            emptyTips: {
                type: String,
                default: '无选项'
            },
            clear: {
                type: Boolean,
                default: true
            },
            defItem: {
                type: Number,
                default: 0
            },
            disabled: {
                type: Boolean,
                default: false
            },
            // 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
            format: {
                type: String,
                default: ''
            },
            placement: {
                type: String,
                default: 'bottom'
            },
      multiple: {
                type: Boolean,
                default: false
            },
            wrap: {
                type: Boolean,
                default: false
            },
            align:{
                type: String,
                default: "left"
            },
            hideRight: {
                type: Boolean,
                default: false
            },
      mode:{
        type: String,
        default: 'default'
      }
        },
        data() {
            return {
                showSelector: false,
                current: '',
                mixinDatacomResData: [],
                apps: [],
                channels: [],
                cacheKey: "uni-data-select-lastSelectedValue",
            };
        },
        created() {
            this.debounceGet = this.debounce(() => {
                this.query();
            }, 300);
            if (this.collection && !this.localdata.length) {
                this.debounceGet();
            }
        },
        computed: {
            typePlaceholder() {
                const text = {
                    'opendb-stat-app-versions': '版本',
                    'opendb-app-channels': '渠道',
                    'opendb-app-list': '应用'
                }
                const common = this.placeholder
                const placeholder = text[this.collection]
                return placeholder ?
                    common + placeholder :
                    common
            },
            valueCom() {
        if (this.value === '') return this.modelValue
                if (this.modelValue === '') return this.value
                return this.value
            },
            textShow() {
                // 长文本显示
                if (this.multiple) {
                    const currentValues = this.getCurrentValues();
                    if (Array.isArray(currentValues) && currentValues.length > 0) {
                        const selectedItems = this.mixinDatacomResData.filter(item => currentValues.includes(item.value));
                        return selectedItems.map(item => this.formatItemName(item)).join(', ');
                    } else {
                        return ''; // 空数组时返回空字符串,显示占位符
                    }
                } else {
                    return this.current;
                }
            },
            shouldShowClear() {
                if (this.multiple) {
                    const currentValues = this.getCurrentValues();
                    return Array.isArray(currentValues) && currentValues.length > 0;
                } else {
                    return !!this.current;
                }
            },
            shouldWrap() {
                // 只有在多选模式、开启换行、且有内容时才应用换行样式
                return this.multiple && this.wrap && !!this.textShow;
            },
            getOffsetByPlacement() {
                switch (this.placement) {
                    case 'top':
                        return "bottom:calc(100% + 12px);";
                    case 'bottom':
                        return "top:calc(100% + 12px);";
                }
            },
      slotSelected(){
        // #ifdef VUE2
        return this.$scopedSlots ? this.$scopedSlots.selected : false
        // #endif
        // #ifdef VUE3
        return this.$slots ? this.$slots.selected : false
        // #endif
      },
      slotEmpty(){
        // #ifdef VUE2
        return this.$scopedSlots ? this.$scopedSlots.empty : false
        // #endif
        // #ifdef VUE3
        return this.$slots ? this.$slots.empty : false
        // #endif
      },
            slotOption(){
                // #ifdef VUE2
                return this.$scopedSlots ? this.$scopedSlots.option : false
                // #endif
                // #ifdef VUE3
                return this.$slots ? this.$slots.option : false
                // #endif
            }
        },
        watch: {
            showSelector:{
                handler(val,old){
                    val ? this.$emit('open') : this.$emit('close')
                }
            },
            localdata: {
                immediate: true,
                handler(val, old) {
                    if (Array.isArray(val) && old !== val) {
                        this.mixinDatacomResData = val
                    }
                }
            },
            valueCom(val, old) {
                this.initDefVal()
            },
            mixinDatacomResData: {
                immediate: true,
                handler(val) {
                    if (val.length) {
                        this.initDefVal()
                    }
                }
            },
        },
        methods: {
            getSelectedItems() {
                const currentValues = this.getCurrentValues();
                let _minxData = this.mixinDatacomResData
                // #ifdef MP-WEIXIN || MP-TOUTIAO
                _minxData = JSON.parse(JSON.stringify(this.mixinDatacomResData))
                // #endif
                if (this.multiple) {
                    return _minxData.filter(item => currentValues.includes(item.value)) || [];
                } else {
                    return _minxData.filter(item => item.value === currentValues) || [];
                }
            },
            debounce(fn, time = 100) {
                let timer = null
                return function(...args) {
                    if (timer) clearTimeout(timer)
                    timer = setTimeout(() => {
                        fn.apply(this, args)
                    }, time)
                }
            },
            // 检查项目是否已选中
            isSelected(item) {
                if (this.multiple) {
                    const currentValues = this.getCurrentValues();
                    return Array.isArray(currentValues) && currentValues.includes(item.value);
                } else {
                    return this.getCurrentValues() === item.value;
                }
            },
            // 获取当前选中的值
            getCurrentValues() {
                if (this.multiple) {
                    return Array.isArray(this.valueCom) ? this.valueCom : (this.valueCom ? [this.valueCom] : []);
                } else {
                    return this.valueCom;
                }
            },
            // 执行数据库查询
            query() {
                this.mixinDatacomEasyGet();
            },
            // 监听查询条件变更事件
            onMixinDatacomPropsChange() {
                if (this.collection) {
                    this.debounceGet();
                }
            },
            initDefVal() {
                let defValue = this.multiple ? [] : ''
                if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
                    defValue = this.valueCom
                } else {
                    let strogeValue
                    if (this.collection) {
                        strogeValue = this.getCache()
                    }
                    if (strogeValue || strogeValue === 0) {
                        defValue = strogeValue
                    } else {
                        let defItem = this.multiple ? [] : ''
                        if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
                            defItem = this.multiple ? [this.mixinDatacomResData[this.defItem - 1].value] : this.mixinDatacomResData[this.defItem - 1].value
                        }
                        defValue = defItem
                    }
                    if (defValue || defValue === 0 || (this.multiple && Array.isArray(defValue) && defValue.length > 0)) {
                        this.emit(defValue)
                    }
                }
                if (this.multiple) {
                    const selectedValues = Array.isArray(defValue) ? defValue : (defValue ? [defValue] : []);
                    const selectedItems = this.mixinDatacomResData.filter(item => selectedValues.includes(item.value));
                    this.current = selectedItems.map(item => this.formatItemName(item));
                } else {
                    const def = this.mixinDatacomResData.find(item => item.value === defValue)
                    this.current = def ? this.formatItemName(def) : ''
                }
            },
            /**
             * @param {[String, Number, Array]} value
             * 判断用户给的 value 是否同时为禁用状态
             */
            isDisabled(value) {
                if (Array.isArray(value)) {
                    // 对于数组,如果任意一个值被禁用,则认为整体被禁用
                    return value.some(val => {
                        return this.mixinDatacomResData.some(item => item.value === val && item.disable);
                    });
                } else {
                    let isDisabled = false;
                    this.mixinDatacomResData.forEach(item => {
                        if (item.value === value) {
                            isDisabled = item.disable
                        }
                    })
                    return isDisabled;
                }
            },
            clearVal() {
                const emptyValue = this.multiple ? [] : '';
                this.emit(emptyValue)
                this.current = this.multiple ? [] : ''
                if (this.collection) {
                    this.removeCache()
                }
                this.$emit('clear')
            },
            checkBoxChange(res){
                let range = res.detail.value
                let currentValues = range && range.length > 0? range.map((item)=>{
                    const index = parseInt(item, 10);
                    if (isNaN(index)) {
                        console.error(`无效索引: ${item}`);
                    }
                    if (index < 0 || index >= this.mixinDatacomResData.length) {
                        console.error(`索引越界: ${index}`);
                    }
                    return this.mixinDatacomResData[index].value;
                }) : []
                const selectedItems = this.mixinDatacomResData.filter(dataItem => currentValues.includes(dataItem.value));
                this.current = selectedItems.map(dataItem => this.formatItemName(dataItem));
                this.emit(currentValues);
            },
            change(item) {
                if (!item.disable) {
                    if (this.multiple) {
                        // 多选模式
                        let currentValues = this.getCurrentValues();
                        if (!Array.isArray(currentValues)) {
                            currentValues = currentValues ? [currentValues] : [];
                        }
                        const itemValue = item.value;
                        const index = currentValues.indexOf(itemValue);
                        if (index > -1) {
                            currentValues.splice(index, 1);
                        } else {
                            currentValues.push(itemValue);
                        }
                        const selectedItems = this.mixinDatacomResData.filter(dataItem => currentValues.includes(dataItem.value));
                        this.current = selectedItems.map(dataItem => this.formatItemName(dataItem));
                        this.emit(currentValues);
                    } else {
                        // 单选模式
                        this.showSelector = false
                        this.current = this.formatItemName(item)
                        this.emit(item.value)
                    }
                }
            },
            emit(val) {
                this.$emit('input', val)
                this.$emit('update:modelValue', val)
                this.$emit('change', val)
                if (this.collection) {
                    this.setCache(val);
                }
            },
            toggleSelector() {
                if (this.disabled) {
                    return
                }
                this.showSelector = !this.showSelector
            },
            formatItemName(item) {
                let {
                    text,
                    value,
                    channel_code
                } = item
                channel_code = channel_code ? `(${channel_code})` : ''
                if (this.format) {
                    // 格式化输出
                    let str = "";
                    str = this.format;
                    for (let key in item) {
                        str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
                    }
                    return str;
                } else {
                    return this.collection.indexOf('app-list') > 0 ?
                        `${text}(${value})` :
                        (
                            text ?
                            text :
                            `未命名${channel_code}`
                        )
                }
            },
            // 获取当前加载的数据
            getLoadData() {
                return this.mixinDatacomResData;
            },
            // 获取当前缓存key
            getCurrentCacheKey() {
                return this.collection;
            },
            // 获取缓存
            getCache(name = this.getCurrentCacheKey()) {
                let cacheData = uni.getStorageSync(this.cacheKey) || {};
                return cacheData[name];
            },
            // 设置缓存
            setCache(value, name = this.getCurrentCacheKey()) {
                let cacheData = uni.getStorageSync(this.cacheKey) || {};
                cacheData[name] = value;
                uni.setStorageSync(this.cacheKey, cacheData);
            },
            // 删除缓存
            removeCache(name = this.getCurrentCacheKey()) {
                let cacheData = uni.getStorageSync(this.cacheKey) || {};
                delete cacheData[name];
                uni.setStorageSync(this.cacheKey, cacheData);
            },
        }
    }
</script>
<style lang="scss">
    $uni-base-color: #6a6a6a !default;
    $uni-main-color: #333 !default;
    $uni-secondary-color: #909399 !default;
    $uni-border-3: #e5e5e5;
  $uni-primary: #2979ff !default;
    $uni-success: #4cd964 !default;
    $uni-warning: #f0ad4e !default;
    $uni-error: #dd524d !default;
    $uni-info: #909399 !default;
    /* #ifndef APP-NVUE */
    @media screen and (max-width: 500px) {
        .hide-on-phone {
            display: none;
        }
    }
    /* #endif */
    .uni-stat__select {
        display: flex;
        align-items: center;
        // padding: 15px;
        /* #ifdef H5 */
        cursor: pointer;
        /* #endif */
        width: 100%;
        flex: 1;
        box-sizing: border-box;
    }
    .uni-stat-box {
        background-color: #fff;
        width: 100%;
        flex: 1;
    }
    .uni-stat__actived {
        width: 100%;
        flex: 1;
        // outline: 1px solid #2979ff;
    }
    .uni-label-text {
        font-size: 14px;
        font-weight: bold;
        color: $uni-base-color;
        margin: auto 0;
        margin-right: 5px;
    }
  .border-bottom {
    border-bottom: solid 1px $uni-border-3;
  }
  .border-default {
    border: 1px solid $uni-border-3;
  }
    .uni-select {
        font-size: 14px;
        box-sizing: border-box;
        border-radius: 4px;
        padding: 0 5px;
        padding-left: 10px;
        position: relative;
        /* #ifndef APP-NVUE */
        display: flex;
        user-select: none;
        /* #endif */
        flex-direction: row;
        align-items: center;
        width: 100%;
        flex: 1;
        min-height: 35px;
        &--disabled {
            background-color: #f5f7fa;
            cursor: not-allowed;
        }
        &--wrap {
            height: auto;
            min-height: 35px;
            // align-items: flex-start;
        }
    }
    .uni-select__label {
        font-size: 16px;
        // line-height: 22px;
        height: 35px;
        padding-right: 10px;
        color: $uni-secondary-color;
    }
    .uni-select__input-box {
        // height: 35px;
        width: 0px;
        position: relative;
        /* #ifndef APP-NVUE */
        display: flex;
        /* #endif */
        flex: 1;
        flex-direction: row;
        align-items: center;
        &--wrap {
            .uni-select__input-text {
                margin-right: 8px;
            }
        }
    .padding-top-bottom {
      padding-top: 5px;
      padding-bottom: 5px;
    }
    .slot-content {
      width: 100%;
      display: flex;
      flex-direction: row;
            flex-wrap: wrap;
    }
    }
    .uni-select__input {
        flex: 1;
        font-size: 14px;
        height: 22px;
        line-height: 22px;
    }
    .uni-select__input-plac {
        font-size: 14px;
        color: $uni-secondary-color;
    }
    .uni-select__selector {
        /* #ifndef APP-NVUE */
        box-sizing: border-box;
        /* #endif */
        position: absolute;
        left: 0;
        width: 100%;
        background-color: #FFFFFF;
        border: 1px solid #EBEEF5;
        border-radius: 6px;
        box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
        z-index: 3;
        padding: 4px 0;
    }
    .uni-select__selector-scroll {
        /* #ifndef APP-NVUE */
        max-height: 200px;
        box-sizing: border-box;
        /* #endif */
    }
    /* #ifdef H5 */
    @media (min-width: 768px) {
        .uni-select__selector-scroll {
            max-height: 600px;
        }
    }
    /* #endif */
    .uni-select__selector-empty,
    .uni-select__selector-item {
        /* #ifndef APP-NVUE */
        display: flex;
        cursor: pointer;
        /* #endif */
        flex-direction: row;
        align-items: center;
        line-height: 35px;
        font-size: 14px;
        /* border-bottom: solid 1px $uni-border-3; */
        padding: 0px 10px;
    }
    .uni-select__selector-item-check {
        margin-left: auto;
    }
    .uni-select__selector-empty:last-child,
    .uni-select__selector-item:last-child {
        /* #ifndef APP-NVUE */
        border-bottom: none;
        /* #endif */
    }
    .uni-select__selector__disabled {
        opacity: 0.4;
        cursor: default;
    }
    /* picker 弹出层通用的指示小三角 */
    .uni-popper__arrow_bottom,
    .uni-popper__arrow_bottom::after,
    .uni-popper__arrow_top,
    .uni-popper__arrow_top::after {
        position: absolute;
        display: block;
        width: 0;
        height: 0;
        border-color: transparent;
        border-style: solid;
        border-width: 6px;
    }
    .uni-popper__arrow_bottom {
        filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
        top: -6px;
        left: 10%;
        margin-right: 3px;
        border-top-width: 0;
        border-bottom-color: #EBEEF5;
    }
    .uni-popper__arrow_bottom::after {
        content: " ";
        top: 1px;
        margin-left: -6px;
        border-top-width: 0;
        border-bottom-color: #fff;
    }
    .uni-popper__arrow_top {
        filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
        bottom: -6px;
        left: 10%;
        margin-right: 3px;
        border-bottom-width: 0;
        border-top-color: #EBEEF5;
    }
    .uni-popper__arrow_top::after {
        content: " ";
        bottom: 1px;
        margin-left: -6px;
        border-bottom-width: 0;
        border-top-color: #fff;
    }
    .uni-select__input-text {
        // width: 280px;
        width: 100%;
        color: $uni-main-color;
        white-space: nowrap;
        text-overflow: ellipsis;
        -o-text-overflow: ellipsis;
        overflow: hidden;
        &--wrap {
            white-space: normal;
            text-overflow: initial;
            -o-text-overflow: initial;
            overflow: visible;
            word-wrap: break-word;
            word-break: break-all;
            // line-height: 1.5;
        }
    }
    .uni-select__input-placeholder {
        color: $uni-base-color;
        font-size: 12px;
    margin: 1px 0;
    }
    .uni-select--mask {
        position: fixed;
        top: 0;
        bottom: 0;
        right: 0;
        left: 0;
        z-index: 2;
    }
  .align-left {
    text-align: left;
  }
  .align-center {
    text-align: center;
  }
  .align-right {
    text-align: right;
  }
</style>
uni_modules/uni-data-select/package.json
New file
@@ -0,0 +1,106 @@
{
  "id": "uni-data-select",
  "displayName": "uni-data-select 下拉框选择器",
  "version": "1.1.0",
  "description": "通过数据驱动的下拉框选择器",
  "keywords": [
    "uni-ui",
    "select",
    "uni-data-select",
    "下拉框",
    "下拉选"
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": "^3.1.1",
    "uni-app": "^4.45",
    "uni-app-x": ""
  },
  "directories": {
    "example": "../../temps/example_temps"
  },
  "dcloudext": {
    "sale": {
      "regular": {
        "price": "0.00"
      },
      "sourcecode": {
        "price": "0.00"
      }
    },
    "contact": {
      "qq": ""
    },
    "declaration": {
      "ads": "无",
      "data": "无",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
    "type": "component-vue",
    "darkmode": "x",
    "i18n": "x",
    "widescreen": "x"
  },
  "uni_modules": {
    "dependencies": [
      "uni-load-more"
    ],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "√",
        "aliyun": "√",
        "alipay": "√"
      },
      "client": {
        "uni-app": {
          "vue": {
            "vue2": "√",
            "vue3": "√"
          },
          "web": {
            "safari": "√",
            "chrome": "√"
          },
          "app": {
            "vue": "√",
            "nvue": "-",
            "android": "√",
            "ios": "√",
            "harmony": "√"
          },
          "mp": {
            "weixin": "√",
            "alipay": "√",
            "toutiao": "√",
            "baidu": "-",
            "kuaishou": "-",
            "jd": "-",
            "harmony": "-",
            "qq": "-",
            "lark": "-"
          },
          "quickapp": {
            "huawei": "-",
            "union": "-"
          }
        },
        "uni-app-x": {
          "web": {
            "safari": "-",
            "chrome": "-"
          },
          "app": {
            "android": "-",
            "ios": "-",
            "harmony": "-"
          },
          "mp": {
            "weixin": "-"
          }
        }
      }
    }
  }
}
uni_modules/uni-data-select/readme.md
New file
@@ -0,0 +1,8 @@
## DataSelect 下拉框选择器
> **组件名:uni-data-select**
> 代码块: `uDataSelect`
当选项过多时,使用下拉菜单展示并选择内容
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
uni_modules/uni-load-more/changelog.md
@@ -1,3 +1,7 @@
## 1.3.7(2025-08-20)
- 修复 微信小程序css警告问题
## 1.3.6(2024-10-15)
- 修复 微信小程序中的getSystemInfo警告
## 1.3.3(2022-01-20)
- 新增 showText属性 ,是否显示文本
## 1.3.2(2022-01-19)
uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
@@ -26,7 +26,7 @@
        <!-- #ifndef APP-NVUE -->
        <view v-else-if="!webviewHide && status === 'loading' && showIcon"
            :style="{width:iconSize+'px',height:iconSize+'px'}" class="uni-load-more__img uni-load-more__img--ios-H5">
            <image :src="imgBase64" mode="widthFix"></image>
            <image class="image" :src="imgBase64" mode="widthFix"></image>
        </view>
        <!-- #endif -->
        <text v-if="showText" class="uni-load-more__text"
@@ -37,7 +37,12 @@
<script>
    let platform
    setTimeout(() => {
        // #ifdef MP-WEIXIN
        platform = uni.getDeviceInfo().platform
        // #endif
        // #ifndef MP-WEIXIN
        platform = uni.getSystemInfoSync().platform
        // #endif
    }, 16)
    import {
@@ -205,7 +210,7 @@
        animation: loading-ios-H5 1s 0s step-end infinite;
    }
    .uni-load-more__img--ios-H5 image {
    .uni-load-more__img--ios-H5 .image {
        position: absolute;
        width: 100%;
        height: 100%;
uni_modules/uni-load-more/package.json
@@ -1,7 +1,7 @@
{
  "id": "uni-load-more",
  "displayName": "uni-load-more 加载更多",
  "version": "1.3.3",
  "version": "1.3.7",
  "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。",
  "keywords": [
    "uni-ui",
@@ -11,16 +11,14 @@
],
  "repository": "https://github.com/dcloudio/uni-ui",
  "engines": {
    "HBuilderX": ""
    "HBuilderX": "",
    "uni-app": "^4.07",
    "uni-app-x": ""
  },
  "directories": {
    "example": "../../temps/example_temps"
  },
  "dcloudext": {
    "category": [
      "前端组件",
      "通用组件"
    ],
    "sale": {
      "regular": {
        "price": "0.00"
@@ -37,48 +35,69 @@
      "data": "无",
      "permissions": "无"
    },
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
    "type": "component-vue",
    "darkmode": "x",
    "i18n": "x",
    "widescreen": "x"
  },
  "uni_modules": {
    "dependencies": ["uni-scss"],
    "dependencies": [
      "uni-scss"
    ],
    "encrypt": [],
    "platforms": {
      "cloud": {
        "tcb": "y",
        "aliyun": "y"
        "tcb": "x",
        "aliyun": "x",
        "alipay": "x"
      },
      "client": {
        "App": {
          "app-vue": "y",
          "app-nvue": "y"
        "uni-app": {
          "vue": {
            "vue2": "√",
            "vue3": "√"
        },
        "H5-mobile": {
          "Safari": "y",
          "Android Browser": "y",
          "微信浏览器(Android)": "y",
          "QQ浏览器(Android)": "y"
          "web": {
            "safari": "√",
            "chrome": "√"
        },
        "H5-pc": {
          "Chrome": "y",
          "IE": "y",
          "Edge": "y",
          "Firefox": "y",
          "Safari": "y"
          "app": {
            "vue": "√",
            "nvue": "-",
            "android": "√",
            "ios": "√",
            "harmony": "√"
        },
        "小程序": {
          "微信": "y",
          "阿里": "y",
          "百度": "y",
          "字节跳动": "y",
          "QQ": "y"
          "mp": {
            "weixin": "√",
            "alipay": "√",
            "toutiao": "√",
            "baidu": "√",
            "kuaishou": "-",
            "jd": "-",
            "harmony": "-",
            "qq": "√",
            "lark": "-"
        },
        "快应用": {
          "华为": "u",
          "联盟": "u"
          "quickapp": {
            "huawei": "√",
            "union": "√"
          }
        },
        "Vue": {
            "vue2": "y",
            "vue3": "y"
        "uni-app-x": {
          "web": {
            "safari": "-",
            "chrome": "-"
          },
          "app": {
            "android": "-",
            "ios": "-",
            "harmony": "-"
          },
          "mp": {
            "weixin": "-"
          }
        }
      }
    }