| | |
| | | <!DOCTYPE HTML> |
| | | <html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml"> |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> |
| | | <meta name="renderer" content="webkit|ie-comp|ie-stand"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | | <meta name="viewport" |
| | | content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> |
| | | <meta http-equiv="Cache-Control" content="no-siteapp" /> |
| | | <LINK rel="Bookmark" href="../images/favicon.ico"> |
| | | <!-- 本框架基本脚本和样式 --> |
| | | <script type="text/javascript" |
| | | th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script> |
| | | <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script> |
| | | |
| | | </head> |
| | | <body class="gray-bg"> |
| | | |
| | | |
| | | <div class="ibox-content"> |
| | | <!-- 搜索框部分start --> |
| | | <form class="form-inline" id="serchform"> |
| | | <div class="row mb-10"> |
| | | <div class="col-sm-8"> |
| | | <button onclick="myGrid.serchData()" type="button" class="btn btn-info btn-sm"><i class="fa fa-search" ></i> 搜索</button> |
| | | <button onclick="myGrid.resetForm()" type="button" class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button> |
| | | <button matrix:btn="ygyjbbZb-exportExcel" onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button> |
| | | </div> |
| | | </div> |
| | | <div class="form-group mr-20"> |
| | | <label >选择年月</label> <select |
| | | class="form-control" name="year" id="select_year"> |
| | | <option value="">年份</option> |
| | | <option value="2010">2010</option> |
| | | <option value="2011">2011</option> |
| | | <option value="2012">2012</option> |
| | | <option value="2013">2013</option> |
| | | <option value="2014">2014</option> |
| | | <option value="2015">2015</option> |
| | | <option value="2016">2016</option> |
| | | <option value="2017">2017</option> |
| | | <option value="2018">2018</option> |
| | | <option value="2019">2019</option> |
| | | <option value="2020">2020</option> |
| | | <option value="2021">2021</option> |
| | | </select> <select class="form-control" name="month" id="select_month"> |
| | | <option value="01">1</option> |
| | | <option value="02">2</option> |
| | | <option value="03">3</option> |
| | | <option value="04">4</option> |
| | | <option value="05">5</option> |
| | | <option value="06">6</option> |
| | | <option value="07">7</option> |
| | | <option value="08">8</option> |
| | | <option value="09">9</option> |
| | | <option value="10">10</option> |
| | | <option value="11">11</option> |
| | | <option value="12">12</option> |
| | | </select> |
| | | <select class="form-control" name="day" id="select_day"> |
| | | <option value="">日</option> |
| | | <th:block th:each="i:${#numbers.sequence(1, 31)}" > |
| | | <option th:value="${i }" th:text="${i }"></option> |
| | | </th:block> |
| | | </select> |
| | | </div> |
| | | <div class="form-group mr-20"> |
| | | <label>日期范围</label> |
| | | <input name="beginTime" type="text" class="form-control datetimepicker" id="beginTime">- |
| | | <input name="endTime" type="text" class="form-control datetimepicker" id="endTime"> |
| | | </div> |
| | | <div class="form-group mr-20"> |
| | | <label >所属门店</label> <select id="select_id" |
| | | class="form-control autoFull" |
| | | th:data-url="@{/admin/shopInfo/findShops}" data-value="id" |
| | | data-filed="shopName" data-def="${obj.shopId}" name="shopId"> |
| | | <option value="">--请选择所属门店--</option> |
| | | </select> |
| | | </div> |
| | | </form> |
| | | |
| | | |
| | | <table id="mgrid"> |
| | | <thead> |
| | | <tr> |
| | | <th data-formatter="MGrid.indexfn" data-align="center" |
| | | data-width="30px" data-footer-formatter="footCountTitle">序号</th> |
| | | <th data-field="datatime" >时间</th> |
| | | <th data-field="orderType">订单类型</th> |
| | | <th data-field="orderNo" data-formatter="buildOpenDetail" >订单编号</th> |
| | | <th data-field="levelName">会员级别</th> |
| | | <th data-field="vipName">姓名</th> |
| | | <th data-field="proName">项目名称</th> |
| | | <th data-field="zkTotal" data-footer-formatter="countColumn">总现金业绩 |
| | | <i data-toggle="tooltip" data-placement="top" title="总现金业绩=售卡+项目+产品" class="fa fa-question-circle"></i> |
| | | </th> |
| | | |
| | | <th data-field="cardCash" data-footer-formatter="countColumn" >售卡业绩 |
| | | <i data-toggle="tooltip" data-placement="top" title="售卡业绩:现金购买充值卡,套餐,充值的收款金额" class="fa fa-question-circle"></i> |
| | | </th> |
| | | |
| | | <th data-field="projCash" data-footer-formatter="countColumn">项目业绩 |
| | | <i data-toggle="tooltip" data-placement="top" title="项目业绩:现金购买单个项目的业绩" class="fa fa-question-circle"></i> |
| | | </th> |
| | | |
| | | <th data-field="goodsCash" data-footer-formatter="countColumn">产品业绩 |
| | | <i data-toggle="tooltip" data-placement="top" title="产品业绩:现金购买产品的业绩" class="fa fa-question-circle"></i> |
| | | </th> |
| | | |
| | | <th data-field="consume" data-footer-formatter="countColumn">余额划扣业绩 |
| | | <i data-toggle="tooltip" data-placement="top" title="余额划扣业绩:从客户的充值卡余额中划扣消费的金额" class="fa fa-question-circle"></i> |
| | | </th> |
| | | |
| | | <th data-field="hisConsume" data-footer-formatter="countColumn">本金消耗 |
| | | <i data-toggle="tooltip" data-placement="top" title="消耗金额:客户做服务时划扣的本金" class="fa fa-question-circle"></i> |
| | | </th> |
| | | <th data-field="freeConsume" data-footer-formatter="countColumn">赠送消耗 |
| | | <i data-toggle="tooltip" data-placement="top" title="赠送消耗:客户做服务时划扣的赠送金额" class="fa fa-question-circle"></i> |
| | | </th> |
| | | <th data-field="projPercentage" data-footer-formatter="countColumn">服务提成 |
| | | <i data-toggle="tooltip" data-placement="top" title="服务提成:为美疗师手动设置的项目服务提成" class="fa fa-question-circle"></i> |
| | | </th> |
| | | <th data-field="guwen">顾问</th> |
| | | <th data-field="meiliao">美疗师</th> |
| | | <th data-field="numberOfPeople" data-footer-formatter="countColumn">人头</th> |
| | | <th data-field="projNum" data-footer-formatter="countColumn">项目个数</th> |
| | | <th data-field="projTime" data-footer-formatter="countColumn">项目时间</th> |
| | | <th data-field="shopName">门店</th> |
| | | |
| | | </tr> |
| | | </thead> |
| | | </table> |
| | | </div> |
| | | |
| | | <script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script> |
| | | <meta charset="utf-8"> |
| | | <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> |
| | | <meta name="renderer" content="webkit|ie-comp|ie-stand"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | | <meta name="viewport" |
| | | content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> |
| | | <meta http-equiv="Cache-Control" content="no-siteapp" /> |
| | | <LINK rel="Bookmark" href="../images/favicon.ico"> |
| | | <!-- 本框架基本脚本和样式 --> |
| | | <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script> |
| | | <script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script> |
| | | <script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script> |
| | | <script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script> |
| | | <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}"> |
| | | <link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/> |
| | | <script type="text/javascript" th:src="@{/js/function/public.js}"></script> |
| | | <script type="text/javascript"> |
| | | var myGrid; |
| | | var initParam = { |
| | | format : "yyyy-mm-dd hh:ii", //默认显示年与日,如果想显示十分秒:"yyyy-mm-dd hh:ii:ss" |
| | | minView: "hour", //"month",只显示年月日的选择,不会再跳转去选择时分秒;如果想要选择时分秒的:"hour" |
| | | } |
| | | MTools.ininDatetimepicker(initParam); |
| | | //限制结束时间不小于开始时间 |
| | | MTools.limitStartEndTime({}); |
| | | |
| | | var date = new Date(); |
| | | var year = date.getFullYear(); |
| | | var month = date.getMonth() + 1; |
| | | var year_options = ""; |
| | | for (var i = 9; i > 0; i--) { |
| | | year_options += "<option value='" + (year - i) + "'>" + (year - i) |
| | | + "</option>"; |
| | | } |
| | | year_options += "<option value='"+year+"' selected='selected'>" + year |
| | | + "</option>"; |
| | | $("#select_year").html(year_options); |
| | | $("#select_month").find("option").each(function(row) { |
| | | var option_month = $(this).val(); |
| | | if (month == option_month) { |
| | | $(this).attr("selected", true); |
| | | } |
| | | }); |
| | | </head> |
| | | <style> |
| | | .table-style { |
| | | margin: 20px 0; |
| | | padding: 20px 10px; |
| | | border: 1px solid #DCDFE6; |
| | | background-color: white; |
| | | } |
| | | .search-form { |
| | | background-color: white; |
| | | padding-top: 10px; |
| | | padding-left: 20px; |
| | | padding-bottom: 10px; |
| | | } |
| | | </style> |
| | | <body> |
| | | <div id="app" style=""> |
| | | <el-row class="search-form"> |
| | | <el-form ref="form" :model="form" inline> |
| | | <el-form-item label="选择年月"> |
| | | <el-select v-model="form.year" style="width:120px;" placeholder="请选择年份"> |
| | | <el-option v-for="item in years" |
| | | :key="item" |
| | | :label="item" |
| | | :value="item"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-select v-model="form.month" style="width:120px;" placeholder="请选择月份"> |
| | | <el-option v-for="item in months" |
| | | :key="item" |
| | | :label="item" |
| | | :value="item"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-select v-model="form.day" style="width:120px;" placeholder="请选择日"> |
| | | <el-option v-for="item in days" |
| | | :key="item" |
| | | :label="item" |
| | | :value="item"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="日期范围"> |
| | | <el-date-picker v-model="form.timeRange" |
| | | type="datetimerange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="业绩规则" prop="achieveRuleId"> |
| | | <el-select v-model="form.achieveRuleId" filterable placeholder="请选择业绩规则"> |
| | | <el-option |
| | | v-for="item in achieveRulsList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="会员"> |
| | | <el-input v-model="form.vipQueryKey"></el-input> |
| | | </el-form-item> |
| | | |
| | | $(function() { |
| | | MTools.autoFullSelect(); |
| | | myGrid = MGrid.initGrid({ |
| | | url : basePath+"/admin/achieve/findDailyInfoNew", |
| | | showExport : true, |
| | | showFooter : true, |
| | | height:'auto', |
| | | width:'auto', |
| | | exportDataType : "basic", //basic', 'all', 'selected'. |
| | | exportTypes : [ 'excel', 'xlsx' ], //导出类型 |
| | | exportOptions : { |
| | | ignoreColumn : [ 0 ], |
| | | fileName : "每日单据统计" + MTools.getTime(), //文件名称设置 |
| | | worksheetName : 'Sheet1', //表格工作区名称 |
| | | tableName : '每日单据统计', |
| | | excelstyles : [ 'background-color', 'color', 'font-size', |
| | | 'font-weight' ], |
| | | <el-form-item label="业绩归属人"> |
| | | <el-select v-model="form.beaultId" placeholder="请选择"> |
| | | <el-option v-for="item in achieveUsers" |
| | | :key="item.suId" |
| | | :label="item.suName" |
| | | :value="item.suId"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="门店"> |
| | | <el-select v-model="form.shopId" placeholder="请选择所属门店"> |
| | | <el-option v-for="item in shopList" |
| | | :key="item.id" |
| | | :label="item.shopName" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-button type="primary" @click="search" >搜索</el-button> |
| | | <el-button @click="resetForm('form')">重置</el-button> |
| | | <el-button type="warning" @click="exportExcel">导出</el-button> |
| | | </el-form> |
| | | |
| | | </el-row> |
| | | <el-row class="table-style"> |
| | | <el-table :data="tableData" style="width: 100%"> |
| | | <el-table-column type="index" width="30"></el-table-column> |
| | | <el-table-column prop="datatime" width="150" label="时间"></el-table-column> |
| | | <el-table-column prop="orderNo" width="180" label="订单编号"> |
| | | <template slot-scope="scope"> |
| | | <el-link @click="jumpOrder(scope.row.orderType, scope.row.orderNo)" type="primary">{{scope.row.orderNo}}</el-link> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="orderType" label="订单类型"></el-table-column> |
| | | <el-table-column prop="vipName" label="会员姓名"></el-table-column> |
| | | <el-table-column prop="proName" label="产品" width="200"></el-table-column> |
| | | <el-table-column prop="achieveRuleName" label="业绩规则" width="200"></el-table-column> |
| | | <el-table-column prop="cateName" label="产品分类"></el-table-column> |
| | | <el-table-column prop="zkTotal" label="订单金额"></el-table-column> |
| | | <el-table-column prop="goodsCash" label="现金"></el-table-column> |
| | | <el-table-column prop="cardCash" label="划扣"></el-table-column> |
| | | <!-- <el-table-column prop="goodsCash" label="订单业绩"></el-table-column>--> |
| | | <el-table-column prop="meiliao" label="员工"></el-table-column> |
| | | <el-table-column v-for="(item, index) in customColumns" width="120" :key="index" :label="item.value"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="item.value == scope.row.achieveType">{{scope.row.goodsCash}}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="hisConsume" label="本金消耗"></el-table-column> |
| | | <el-table-column prop="freeConsume" label="赠送消耗"></el-table-column> |
| | | <el-table-column prop="projPercentage" label="服务提成"></el-table-column> |
| | | <el-table-column prop="numberOfPeople" label="人头"></el-table-column> |
| | | <el-table-column prop="projNum" label="项目个数"></el-table-column> |
| | | <el-table-column prop="projTime" label="服务时间"></el-table-column> |
| | | <el-table-column prop="guwen" label="操作人"></el-table-column> |
| | | <el-table-column prop="shopName" label="门店"></el-table-column> |
| | | </el-table> |
| | | <el-row style="margin-top: 10px;"> |
| | | <el-pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | :current-page="page.currentPage" |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | :page-size="page.size" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="page.total"> |
| | | </el-pagination> |
| | | </el-row> |
| | | </el-row> |
| | | </div> |
| | | <script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script> |
| | | <script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script> |
| | | <script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script> |
| | | <script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script> |
| | | <script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script> |
| | | <script type="text/javascript" th:inline="javascript"> |
| | | var vue = new Vue({ |
| | | el : "#app", |
| | | data : { |
| | | tableData : [], |
| | | customColumns : [], |
| | | achieveRulsList : [], |
| | | shopList : [], |
| | | achieveUsers : [], |
| | | years : [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021,2022], |
| | | months : ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"], |
| | | days : [], |
| | | form : { |
| | | year : '', |
| | | month : '', |
| | | day : '', |
| | | timeRange : '', |
| | | vipQueryKey : '', |
| | | beaultId : '', |
| | | achieveRuleId : '', |
| | | shopId : '' |
| | | }, |
| | | page : { |
| | | currentPage : 1, |
| | | size : 10, |
| | | total : 0 |
| | | } |
| | | }, |
| | | created : function() { |
| | | this.initDays(); |
| | | this.queryCustomColumns(); |
| | | this.queryShops(); |
| | | this.queryAchieveUsers(); |
| | | this.getAchieveRule(); |
| | | }, |
| | | methods : { |
| | | queryTableData () { |
| | | |
| | | let _this = this; |
| | | let form = _this.form; |
| | | let page = _this.page; |
| | | let params = {}; |
| | | params.year=form.year; |
| | | params.achieveRuleId=form.achieveRuleId; |
| | | params.month=form.month; |
| | | params.year=form.year; |
| | | params.day=form.day; |
| | | params.vipQueryKey=form.vipQueryKey; |
| | | params.beaultId=form.beaultId; |
| | | params.shopId=form.shopId; |
| | | params.limit = page.size; |
| | | params.offset = (page.currentPage - 1) * page.size; |
| | | |
| | | if (form.timeRange) { |
| | | params.beginTime = form.timeRange?moment(form.timeRange[0]).format("YYYY-MM-DD HH:mm"):''; |
| | | params.endTime = form.timeRange?moment(form.timeRange[1]).format("YYYY-MM-DD HH:mm"):''; |
| | | } |
| | | }); |
| | | |
| | | $('[data-toggle="tooltip"]').tooltip() |
| | | |
| | | }); |
| | | |
| | | |
| | | function footCountTitle(data) { |
| | | return "<b>合计</b>"; |
| | | }; |
| | | function countColumn(data) { |
| | | console.log(data) |
| | | field = this.field; |
| | | var resultsumQuantity = parseFloat((data.reduce(function(sum, row) { |
| | | console.log(sum,row[field]); |
| | | return sum + (+row[field]); |
| | | }, 0)).toFixed(2));//保留有效数字 |
| | | return "<b>"+resultsumQuantity+"</b>"; |
| | | }; |
| | | |
| | | |
| | | function exportExcel(){ |
| | | var param=MForm.toUrlParam("#serchform"); |
| | | |
| | | window.location.href=basePath+"/admin/achieve/exportDailyInfoNew?"+param; |
| | | } |
| | | |
| | | function buildOpenDetail(value, row, index){ |
| | | var html = []; |
| | | if(row.orderType=='服务单'){ |
| | | html[0] = '<a onClick="fnPublci.showServiceOrder(1 , \'' + value +'\')" class="text-primary " >'+value+'</a>' |
| | | }else{ |
| | | html[0] = '<a onClick="fnPublci.showOrder(1 , \'' + value +'\')" class="text-primary " >'+value+'</a>' |
| | | AjaxProxy.requst({ |
| | | app: _this, |
| | | data: params, |
| | | url: basePath + "/admin/achieve/findDailyInfoNew", |
| | | callback: function (loj) { |
| | | _this.tableData = loj.rows; |
| | | _this.page.total = loj.total; |
| | | } |
| | | }); |
| | | }, |
| | | queryCustomColumns() { |
| | | let _this = this; |
| | | AjaxProxy.requst({ |
| | | app: _this, |
| | | url: basePath + '/admin/customerDictionary/getListByParentCode/YJLX', |
| | | callback: function (data) { |
| | | _this.customColumns = data.rows; |
| | | _this.queryTableData(); |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 获取规则 |
| | | */ |
| | | getAchieveRule(){ |
| | | let _this = this; |
| | | AjaxProxy.requst({ |
| | | app: _this, |
| | | data: {pageNum:1,pageSize:1000}, |
| | | url: basePath + "/admin/achieveRule/selectList", |
| | | callback: function (data) { |
| | | _this.achieveRulsList=data.rows; |
| | | } |
| | | }); |
| | | }, |
| | | queryShops() { |
| | | let _this = this; |
| | | AjaxProxy.requst({ |
| | | app: _this, |
| | | url: basePath + '/admin/shopInfo/findAllWithPermi', |
| | | callback: function (data) { |
| | | _this.shopList = data.rows; |
| | | } |
| | | }); |
| | | }, |
| | | queryAchieveUsers() { |
| | | let _this = this; |
| | | AjaxProxy.requst({ |
| | | app: _this, |
| | | url: basePath + '/admin/getShopStaffByRoleName?roleName=美疗师', |
| | | callback: function (data) { |
| | | _this.achieveUsers = data.rows; |
| | | } |
| | | }); |
| | | }, |
| | | resetForm(formName) { |
| | | // this.$refs[formName].resetFields(); |
| | | this.form = { |
| | | timeRange : '', |
| | | vipQueryKey : '', |
| | | beaultId : '', |
| | | shopId : '' |
| | | } |
| | | }, |
| | | search() { |
| | | this.queryTableData(); |
| | | }, |
| | | handleSizeChange(val) { |
| | | this.page.size = val; |
| | | this.queryTableData(); |
| | | }, |
| | | handleCurrentChange(val) { |
| | | this.page.currentPage = val; |
| | | this.queryTableData(); |
| | | }, |
| | | initDays() { |
| | | let _this = this; |
| | | for (var i = 1; i <= 31 ; i++) { |
| | | _this.days.push(i); |
| | | } |
| | | }, |
| | | getRequestParam() { |
| | | var form = this.form; |
| | | var params = form; |
| | | if (form.timeRange) { |
| | | params.beginTime = form.timeRange?moment(form.timeRange[0]).format("YYYY-MM-DD HH:mm"):''; |
| | | params.endTime = form.timeRange?moment(form.timeRange[1]).format("YYYY-MM-DD HH:mm"):''; |
| | | } |
| | | return params; |
| | | }, |
| | | exportExcel() { |
| | | window.location.href=basePath+"/admin/achieve/exportDailyInfoNew?"+MTools.jsonToUrlParam(this.getRequestParam()); |
| | | }, |
| | | jumpOrder(type, value) { |
| | | if(type=='服务单') { |
| | | fnPublci.showServiceOrder(1, value); |
| | | } else { |
| | | fnPublci.showOrder(1, value); |
| | | } |
| | | } |
| | | |
| | | return html.join(""); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | </script> |
| | | }); |
| | | </script> |
| | | </body> |
| | | </html> |