| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607 | <!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="Cache-Control" content="no-cache,no-store,no-siteapp,must-revalidate">    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="expires" content="0">    <meta name="author" content="">    <meta name="description" content=""/>    <meta name="keywords" content="扫码支付,线上投币,运营数据,物联网"/>    <meta name="format-detection" content="telephone=no,email=no">    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">    <title>设备功能配置</title>    <link rel="stylesheet" href="https://cdn.washpayer.com/components/lib/mui.min.css">    <link rel="stylesheet" href="../components/custom/css/common.css">    <link rel="stylesheet" href="./css/xyf.common.min.css">    <link rel="stylesheet" href="https://cdn.washpayer.com/components/lib/mui.picker.min.css"/>    <style>        .container {            background: #f3f3f3;            touch-action: pan-y;        }    </style></head><body><div id="container" class="container">    <div v-cloak>        <ul class="mui-table-view">            <li class="mui-table-view-cell">                <a href="javascript:void(0);">                    <p><i class="c-primary iconfont"                          :class="devType"></i>{{ info.devData.type }} {{ info.devData.groupNumber }}</p>                    <p class="mui-ellipsis">{{ info.devData.groupName }}</p></a></li>        </ul>    </div>    <div v-cloak>        <h5 class="mui-content-padded">服务费模式配置</h5>        <div class="mui-input-group ">            <div class="mui-input-row mui-input-row-50-50">                <label>电价</label>                <div class="mui-numbox-container padding-r-40">                    <div class="mui-numbox" data-numbox-step='0.1' data-numbox-min='0' data-numbox-max='999'>                        <button class="mui-btn mui-numbox-btn-minus" type="button"                                :disabled="!billAsService.elecCharge">                            -                        </button>                        <input class="mui-numbox-input save-data" step="0.01" type="number"                               v-model.number.lazy="billAsService.elecCharge">                        <button class="mui-btn mui-numbox-btn-plus" type="button">+                        </button>                    </div>                </div>                <span class="mini-unit">元/度</span>            </div>            <div class="mui-input-row mui-input-row-50-50">                <label>服务费</label>                <div class="mui-numbox-container padding-r-40">                    <div class="mui-numbox" data-numbox-step='0.1' data-numbox-min='0' data-numbox-max='999'>                        <button class="mui-btn mui-numbox-btn-minus" type="button"                                :disabled="!billAsService.serviceCharge">                            -                        </button>                        <input class="mui-numbox-input save-data" step="0.01" type="number"                               v-model.number.lazy="billAsService.serviceCharge">                        <button class="mui-btn mui-numbox-btn-plus" type="button">+                        </button>                    </div>                </div>                <span class="mini-unit">元/度</span>            </div>        </div>    </div>    <div v-cloak>        <h5 class="mui-content-padded">套餐配置</h5>        <form class=" discount-set custom-top">            <div class="package-component">                <!--两种设备类型 不显示此控件-->                <div class="mui-table-view">                    <div class="mui-table-view-cell">                        <label class="tips-event">显示支付 <i class="tips"                                                          title="如果关闭,用户套餐界面则不显示套餐的价格">i</i></label>                        <div class="switch switch-mini "                             :class="{active:info.displaySwitchs.displayPriceSwitch}"                             @click="tapSwitch('displayPriceSwitch')">                            <div class="switch-handle"></div>                        </div>                    </div>                    <div class="mui-table-view-cell">                        <label class="tips-event">显示“用户获得”的{{ info.unit }} <i class="tips"                                                                              title="如果关闭,用户套餐界面则不显示“用户获得”和单位">i</i></label>                        <div class="switch switch-mini " :class="{active:info.displaySwitchs.displayTimeSwitch}"                             @click="tapSwitch('displayTimeSwitch')">                            <div class="switch-handle"></div>                        </div>                    </div>                </div>                <div class="package-list mui-input-group margin-t-10">                    <div class="mui-table-view-cell" v-for="(obj,index) in info.packages">                        <div class="p-title-row">                            <div class="p-title">                                <span>{{ obj.name }} </span>                                <span class="mark online"                                      :class="{'offline': !info.displaySwitchs.displayPriceSwitch}">{{ obj.price }}元</span>                                <span class="mark mark-blue"                                      :class="{'offline': !info.displaySwitchs.displayTimeSwitch}">{{ obj.time + obj.unit }} </span>                            </div>                            <div class="switch switch-mini" :class="{active:obj.switch}"                                 @click="tapSubSwitch($event,obj)">                                <div class="switch-handle"></div>                            </div>                        </div>                        <div class="font-b-14-6 margin-t-5">套餐说明:<span                                class="font-b-14-8">{{ obj.description }}</span></div>                        <div class="font-b-14 margin-t-5"                             :class="obj.switch? 'c-green':'c-lgreen'">{{ obj.switch ? '套餐已启用' : '套餐未启用' }}                            <div class="mui-pull-right btn-group" permission="manage-show">                                <em @tap="sortUp(obj,index)" class=""><i                                        class="iconfont icon-triangle-up c-green"></i></em>                                <em @tap="sortDown(obj,index)" class=""><i                                        class="iconfont icon-triangle-up rotateX c-green"></i></em>                                <em @tap="editPackageRule(obj,index)" class=""><i                                        class="iconfont icon-edit c-primary"></i></em>                                <em @tap="deletePackageRule(obj,index)"><i                                        class="iconfont icon-delete c-red"></i></em>                            </div>                        </div>                    </div>                    <div class="mui-table-view-cell" permission="manage-show"                         @click="addPackageRule()"><span><i                            class="iconfont icon-add c-success font-18"></i>添加</span>                    </div>                </div>                <div class="edit-back edit-bottom " :class="{ hidden: !info.dialogOpen }">                    <div class="edit-content">                        <div class="edit-box">                            <div class="mui-input-row">                                <label>名称</label>                                <div class="mui-pull-right edit-row">                                    <input type="text" maxlength="20" v-model="info.dialogData.name"                                           @input="changeName()">                                </div>                            </div>                            <div class="line-t  padding-b-10"></div>                            <div>                                <div class="mui-input-row ">                                    <label>支付</label>                                    <div class="mui-pull-right edit-row">                                        <input type="number" maxlength="5" v-model.number="info.dialogData.price"                                               disabled                                        />                                        <span class="font-b-6">元</span>                                    </div>                                </div>                                <div class="line-t  padding-b-10"></div>                            </div>                            <div>                                <div class="mui-input-row">                                    <label class="tips-event">用户获得 </label>                                    <div class="mui-pull-right edit-row">                                        <input type="number" maxlength="5" v-model.number="info.dialogData.time"                                               :keyup="_updatePrice(info.dialogData)">                                        <span v-cloak v-text="info.dialogData.unit"></span>                                    </div>                                </div>                                <div class="line-t padding-b-10"></div>                                <div class="mui-input-row padding-t-b-10">                                    <label>图片</label>                                    <div class="mui-pull-right ">                                        <div class="mui-col-sm-4 mui-col-xs-4"                                             v-for="(obj,index) in info.dialogData.imgList">                                            <div class="upload-pic">                                                <i class="delpic" @click="deleteImg(index)">x</i>                                                <img class="" :src="obj">                                            </div>                                        </div>                                        <div class="mui-col-sm-4 mui-col-xs-4"                                             v-show="info.dialogData.imgList&&info.dialogData.imgList.length<1">                                            <div class="upload-pic padding-5">                                                <i class="iconfont icon-add-more"></i>                                                <input id="addImg" type="file" draggable="false" accept="image/*">                                            </div>                                        </div>                                    </div>                                </div>                                <div class="reg-des">                                    <label>描述</label>                                    <textarea maxlength="120" rows="3" placeholder=""                                              v-model="info.dialogData.description"></textarea>                                </div>                            </div>                            <div class="mui-popup-buttons ">                                <span class="mui-popup-button" @click="closeRulePanel()">取消</span>                                <span class="mui-popup-button mui-popup-button-bold"                                      @click="savePackageRuleForUnitMod()">确认</span>                            </div>                        </div>                    </div>                </div>            </div>        </form>    </div>    <div v-cloak class="custom-btn-area " permission="manage-show">        <a href="javascript:void(0);" class="custom-btn custom-btn-primary" @click="save()">保存</a>    </div></div><script src="../components/lib/vue.min.js"></script><script src="https://cdn.washpayer.com/components/lib/jquery.min.js"></script><script src="../components/custom/js/common.js"></script><script src="https://cdn.washpayer.com/components/lib/mui.min.js"></script><script src="../components/lib/mui.numberbox.js"></script><script src="../components/lib/image-compressor.min.js"></script><script src="./js/xyf.common.js"></script><script src="./js/device-param.js"></script><script>    var logicalCode = getQueryString("logicalCode");    var app = new Vue({        el: '#container',        data: {            isReady: false,            billAsService: {                elecCharge: 0,                serviceCharge: 0,            },            info: {                displaySwitchs: {                    "displayCoinsSwitch": false,                    "displayPriceSwitch": true,                    "displayTimeSwitch": true,                    "setBasePriceAble": false,                    "setPulseAble": false                },                unit: '度',                devData: {},                packages: [],                dialogIndex: 0,                dialogOpen: false,                dialogData: {                    // 默认为开启                    switch: true,                    unit: '度'                },            },            imgCompressLoadFlag: false        },        computed: {            devType() {                return getDevIconName(this.info.devData.type)            },            billAsServiceFee() {                return parseFloat(this.billAsService.elecCharge) + parseFloat(this.billAsService.serviceCharge)            },        },        filters: {},        methods: {            _updatePrice(item, event) {                item.price = (this.billAsServiceFee * parseFloat(item.time)).toFixed(2)                item.coins = (this.billAsServiceFee * parseFloat(item.time)).toFixed(2)            },            initData: function () {                var url = "/dealer/device/serviceFee/get";                var data = {"logicalCode": logicalCode};                var that = this                sendRequest(url, "GET", data, function (res) {                    if (res.result == 1) {                        var payload = res.payload                        // 头部填写                        that.info.devData = payload.devData;                        // 服务费部分填写                        that.billAsService = payload.billAsService                        // 套餐部分                        that.info.packages.push(...payload.ruleList);                        // 显示部分先不初始化                        that.info.displaySwitchs.displayPriceSwitch = payload.displaySwitchs.displayPriceSwitch || true;                        that.info.displaySwitchs.displayTimeSwitch = payload.displaySwitchs.displayTimeSwitch || true;                    } else {                        mui.toast(res.description);                    }                })            },            sortUp(obj, index) {                if (index > 0) {                    this.info.packages.splice(index - 1, 0, obj)                    this.info.packages.splice(index + 1, 1)                }            },            sortDown(obj, index) {                if (index < this.info.packages.length - 1) {                    this.info.packages.splice(index + 2, 0, obj);                    this.info.packages.splice(index, 1);                }            },            tapSwitch: function (target) {                this.info.displaySwitchs[target] = !this.info.displaySwitchs[target];            },            tapSubSwitch: function ($evt, obj) {                $evt.stopPropagation()                obj.switch = !obj.switch            },            changeName: function () {                var devData = this.info.devData;            },            initPackages: function () {                //初始化先适配数据,主要是为了适配单位、还有默认开关                this.adapterPackagesData(option);            },            //是否需要图片            getImgFeatures: function () {                return true;//暂定 所有的类型都需要图片            },            addPackageRule: function () {                this.imgCompressLoad();                this.info.dialogIndex = this.info.packages.length;                this.info.dialogOpen = true;                $("body").addClass("over-hide");//避免滚动穿透,直接禁止body滚动                if (this.packageMod === 'step') {                    this.info.dialogData = {                        price: "",                        maxHour: ""                    };                } else if (this.packageMod === 'unit_price') {                    this.info.dialogData = {                        switch: true,                        name: "",                        imgList: [],                        unit: this.unit_price.unit,                        time: '',                    };                } else {                    this.info.dialogData = {                        switch: true,                        name: "",                        imgList: [],                        unit: this.info.unit,                        time: '',                    };                }            },            editPackageRule: function (obj, index) {                this.info.dialogIndex = index;                this.info.dialogOpen = true;                this.imgCompressLoad();                this.info.dialogData = $.extend(true, {                    switch: true,                    name: "",                    imgList: [],                    unit: this.info.unit,                    time: 0,                }, obj);                $("body").addClass("over-hide");//避免滚动穿透,直接禁止body滚动            },            deletePackageRule: function (obj, index) {                var that = this;                var tnArray = ['取消', '确认'];                mui.confirm('确定要删除该套餐?', '温馨提示', tnArray, function (e) {                    if (e.index == 0) {                    } else {                        //点击确认业务                        that.info.packages.splice(index, 1);                    }                });            },            closeRulePanel: function () {                this.info.dialogOpen = false;                $("body").removeClass("over-hide");//恢复body滚动            },            savePackageRuleForUnitMod: function () {                var dialogData = this.info.dialogData;                dialogData.coins = dialogData.price                if (!this.checkName()) {                    return;                }                if (!isMoney(dialogData.price)) {                    mui.toast("支付价格填写不正确");                    return;                }                if (!isMoney(dialogData.coins)) {                    mui.toast("投币填写不正确");                    return;                }                let list = this.info.packages                let index = this.info.dialogIndex                let newRow = $.extend(true, {}, this.info.dialogData);                list.splice(index, 1, newRow)                this.info.dialogOpen = false;                $("body").removeClass("over-hide");//恢复body滚动            },            checkName() {                var dialogData = this.info.dialogData;                // var devData = this.info.devData;                if (!dialogData.name) {                    mui.toast("名称不能为空");                    return false;                }                for (let index in this.info.packages) {                    let item = this.info.packages[index];                    let otherName = item.name;                    //和其他套餐匹配,如果名称有重复不能保存                    if (index != this.info.dialogIndex && otherName === dialogData.name) {                        mui.toast("套餐名称不能重复");                        return false;                    }                }                return true            },            changeCoins() {                let dialogData = this.info.dialogData;                if (this.packageMod === 'unit_price') {                    let value1 = this.unit_price.value                    if (dialogData) {                        dialogData.time = parseFloat((value1 * dialogData.coins).toFixed(2))                        dialogData.unit = this.unit_price.unit // 单位也刷新下,因为原套餐可能是错误的                    }                }            },            imgCompressLoad: function () {                var that = this;                if (this.imgCompressLoadFlag) {                    return;                }                this.imgCompressLoadFlag = true;                // 检测图片特性                if (!this.getImgFeatures()) {                    return;                }                if (window.ImageCompressor) {                    const imageCompressor = new ImageCompressor();                    var imgUpload = $("#addImg");                    imgUpload.change(function (evt) {                        var file = imgUpload[0].files[0];                        if (file) {                            imageCompressor.compress(file, {                                quality: .7,                                // 套餐图片不会太大                                maxWidth: 1080,                                maxHeight: 1080,                                success: function (result) {                                    var formData = new FormData();                                    formData.append('file', result, result.name);                                    var url = '/common/upload?type=packageImg';                                    myAjax({                                        url: url,                                        type: 'POST',                                        data: formData,                                        processData: false,                                        contentType: false,                                        beforeSend: function () {                                            showLoading('上传中...');                                        },                                        success: function (res) {                                            if (res.result == 1) {                                                var url = res.para;                                                that.info.dialogData.imgList.push(url);                                            } else {                                                mui.toast(res.description);                                            }                                        },                                        complete: function (res) {                                            hideLoading();                                            //重置文件路径,避免选中重复不触发onchange                                            var imgUpload = $("#addImg");                                            imgUpload[0].value = "";                                        }                                    });                                }                            })                        }                    });                } else {                    //图片插件未加载完成提示                    mui.toast("图片上传工具未加载,刷新页面重试...");                }            },            deleteImg: function (index) {                var dialogData = this.info.dialogData;                dialogData.imgList.splice(index, 1);                //重置文件路径,避免选中重复文件不生效                var imgUpload = $("#addImg");                imgUpload[0].value = "";            },            save() {                var url = "/dealer/device/serviceFee/set";                var data = {                    "billAsService": this.billAsService,                    "logicalCode": logicalCode,                    "packages": this.info.packages,                    "displaySwitchs": this.info.displaySwitchs,                };                sendRequest(url, "POST", data, function (res) {                    if (res.result == 1) {                        mui.toast('保存成功');                    } else {                        mui.alert(res.description, '温馨提示', '我知道了');                    }                }, "json");            }        },        watch: {            billAsService: {                handler: function (val, oldVal) {                    var that = this                    if (this.isReady === false) {                        this.isReady = true                        return                    } else {                        for (var index in this.info.packages) {                            this._updatePrice(this.info.packages[index])                        }                    }                }                ,                deep: true            },        },        mounted() {            this.initData();        },    });</script></body></html>
 |