zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java | ●●●●● patch | view | raw | blame | history | |
zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java | ●●●●● patch | view | raw | blame | history | |
zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java | ●●●●● patch | view | raw | blame | history | |
zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml | ●●●●● patch | view | raw | blame | history | |
zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html | ●●●●● patch | view | raw | blame | history |
zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java
@@ -4,6 +4,7 @@ import com.matrix.system.app.vo.BusinessesDataShowVo; import com.matrix.system.hive.bean.SysBusinessData; import com.matrix.system.hive.statistics.BusinessDataShowVo; import com.matrix.system.hive.statistics.DailySaleVo; import com.matrix.system.hiveErp.analysUtil.StatisticsTimeDaoParam; import org.apache.ibatis.annotations.Param; @@ -52,4 +53,6 @@ int selectApiBusinessDataTotal(@Param("record") SysBusinessData data); List<BusinessesDataShowVo> selectApiBusinessData(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId); List<DailySaleVo> selectDailySaleData(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId); } zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java
New file @@ -0,0 +1,402 @@ package com.matrix.system.hive.statistics; import com.matrix.core.anotations.Extend; import com.matrix.core.tools.DateUtil; import io.swagger.annotations.ApiModelProperty; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.util.Date; /** * @author wzy * @date 2021-01-15 **/ public class DailySaleVo { private String dataTime; private String shopName; private BigDecimal totalPay; private BigDecimal cashPay; private BigDecimal cardPay; private BigDecimal arrearsPay; private BigDecimal refundCashPay; private BigDecimal refundCardPay; private BigDecimal productAchieve; private BigDecimal cardAchieve; private BigDecimal refund; private BigDecimal perCustomCnt; private BigDecimal customGoodsCnt; private BigDecimal perCustomPrice; private BigDecimal cost; private BigDecimal grossProfit; private BigDecimal grossProfitRate; private BigDecimal consumePay; private BigDecimal freeConsumePay; private BigDecimal peopleCnt; private BigDecimal projConsumeCnt; private BigDecimal timeLength; /** * 当天销售总数量 */ private Integer totalSaleCnt; /** * 家居产品成本 */ private BigDecimal goodsCost; /** * 除家具产品以外成本 */ private BigDecimal otherCost; private BigDecimal wechat; private BigDecimal alipay; private BigDecimal cash; private BigDecimal bankCard; private BigDecimal tuan; private BigDecimal cardBj; private BigDecimal cardFree; private BigDecimal arrears; @Extend @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD) private Date beginTime; @Extend @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD) private Date endTime; private Long shopId; public BigDecimal getWechat() { return wechat; } public void setWechat(BigDecimal wechat) { this.wechat = wechat; } public BigDecimal getAlipay() { return alipay; } public void setAlipay(BigDecimal alipay) { this.alipay = alipay; } public BigDecimal getCash() { return cash; } public void setCash(BigDecimal cash) { this.cash = cash; } public BigDecimal getBankCard() { return bankCard; } public void setBankCard(BigDecimal bankCard) { this.bankCard = bankCard; } public BigDecimal getTuan() { return tuan; } public void setTuan(BigDecimal tuan) { this.tuan = tuan; } public BigDecimal getCardBj() { return cardBj; } public void setCardBj(BigDecimal cardBj) { this.cardBj = cardBj; } public BigDecimal getCardFree() { return cardFree; } public void setCardFree(BigDecimal cardFree) { this.cardFree = cardFree; } public BigDecimal getArrears() { return arrears; } public void setArrears(BigDecimal arrears) { this.arrears = arrears; } public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } public Date getBeginTime() { return beginTime; } public void setBeginTime(Date beginTime) { this.beginTime = beginTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public Long getShopId() { return shopId; } public void setShopId(Long shopId) { this.shopId = shopId; } public Integer getTotalSaleCnt() { return totalSaleCnt; } public void setTotalSaleCnt(Integer totalSaleCnt) { this.totalSaleCnt = totalSaleCnt; } public BigDecimal getGoodsCost() { return goodsCost; } public void setGoodsCost(BigDecimal goodsCost) { this.goodsCost = goodsCost; } public BigDecimal getOtherCost() { return otherCost; } public void setOtherCost(BigDecimal otherCost) { this.otherCost = otherCost; } public String getDataTime() { return DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.DATE_FORMAT_DD),DateUtil.DATE_FORMAT_DD); } public void setDataTime(String dataTime) { this.dataTime = dataTime; } public BigDecimal getTotalPay() { return totalPay; } public void setTotalPay(BigDecimal totalPay) { this.totalPay = totalPay; } public BigDecimal getCashPay() { return cashPay; } public void setCashPay(BigDecimal cashPay) { this.cashPay = cashPay; } public BigDecimal getCardPay() { return cardPay; } public void setCardPay(BigDecimal cardPay) { this.cardPay = cardPay; } public BigDecimal getArrearsPay() { return arrearsPay; } public void setArrearsPay(BigDecimal arrearsPay) { this.arrearsPay = arrearsPay; } public BigDecimal getFreeConsumePay() { return freeConsumePay; } public void setFreeConsumePay(BigDecimal freeConsumePay) { this.freeConsumePay = freeConsumePay; } public BigDecimal getConsumePay() { return consumePay; } public void setConsumePay(BigDecimal consumePay) { this.consumePay = consumePay; } public BigDecimal getRefundCashPay() { return refundCashPay; } public void setRefundCashPay(BigDecimal refundCashPay) { this.refundCashPay = refundCashPay; } public BigDecimal getRefundCardPay() { return refundCardPay; } public void setRefundCardPay(BigDecimal refundCardPay) { this.refundCardPay = refundCardPay; } public BigDecimal getProductAchieve() { return productAchieve; } public void setProductAchieve(BigDecimal productAchieve) { this.productAchieve = productAchieve; } public BigDecimal getCardAchieve() { return cardAchieve; } public void setCardAchieve(BigDecimal cardAchieve) { this.cardAchieve = cardAchieve; } public BigDecimal getRefund() { return refund; } public void setRefund(BigDecimal refund) { this.refund = refund; } public BigDecimal getPerCustomCnt() { return perCustomCnt; } public void setPerCustomCnt(BigDecimal perCustomCnt) { this.perCustomCnt = perCustomCnt; } public BigDecimal getCustomGoodsCnt() { if (BigDecimal.ZERO.compareTo(perCustomCnt) != 0) { return new BigDecimal(totalSaleCnt).divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN); } else { return BigDecimal.ZERO; } } public void setCustomGoodsCnt(BigDecimal customGoodsCnt) { this.customGoodsCnt = customGoodsCnt; } public BigDecimal getPerCustomPrice() { if (perCustomCnt.compareTo(BigDecimal.ZERO) != 0) { return totalPay.divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN); } else { return BigDecimal.ZERO; } } public void setPerCustomPrice(BigDecimal perCustomPrice) { this.perCustomPrice = perCustomPrice; } public BigDecimal getCost() { return goodsCost.add(otherCost); } public void setCost(BigDecimal cost) { this.cost = cost; } public BigDecimal getGrossProfit() { return totalPay.subtract(getCost()); } public void setGrossProfit(BigDecimal grossProfit) { this.grossProfit = grossProfit; } public BigDecimal getGrossProfitRate() { if (totalPay.compareTo(BigDecimal.ZERO) != 0) { return getGrossProfit().divide(totalPay, 2, BigDecimal.ROUND_DOWN); } else { return BigDecimal.ZERO; } } public void setGrossProfitRate(BigDecimal grossProfitRate) { this.grossProfitRate = grossProfitRate; } public BigDecimal getPeopleCnt() { return peopleCnt; } public void setPeopleCnt(BigDecimal peopleCnt) { this.peopleCnt = peopleCnt; } public BigDecimal getProjConsumeCnt() { return projConsumeCnt; } public void setProjConsumeCnt(BigDecimal projConsumeCnt) { this.projConsumeCnt = projConsumeCnt; } public BigDecimal getTimeLength() { return timeLength; } public void setTimeLength(BigDecimal timeLength) { this.timeLength = timeLength; } } zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java
@@ -3,15 +3,21 @@ import com.matrix.core.constance.MatrixConstance; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.DateUtil; import com.matrix.core.tools.WebUtil; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.constance.AppConstance; import com.matrix.system.hive.dao.SysBusinessDataDao; import com.matrix.system.hiveErp.analysUtil.StatisticsTimeDaoParam; import com.matrix.system.hiveErp.analysUtil.StatisticsTimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** @@ -44,5 +50,32 @@ return result; } /** * 日销售汇总 * * @param dailySaleVo * @param pageVo * @return */ @RequestMapping(value = "/findDailySaleData") @ResponseBody public AjaxResult findDailySaleData(DailySaleVo dailySaleVo, PaginationVO pageVo) { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, -pageVo.getOffset()); String endTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD); calendar.add(Calendar.DATE, -pageVo.getLimit()); String startTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD); List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(startTime, endTime, "日"); List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis); List<StatisticsTimeDaoParam> statisticsTimeDaoParams = timeSpaceParam.subList(0, timeSpaceParam.size() - 2); List<DailySaleVo> dailySaleVos = sysBusinessDataDao.selectDailySaleData(statisticsTimeDaoParams, dailySaleVo.getShopId()); List<DailySaleVo> result = new ArrayList<>(); for (int i = dailySaleVos.size() - 1; i >= 0; i--) { result.add(dailySaleVos.get(i)); } return AjaxResult.buildSuccessInstance(result); } } zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml
@@ -623,6 +623,7 @@ <foreach collection="list" index="index" item="item" separator="union all" > select #{item.beginTime} dataTime, (select shop_short_name from sys_shop_info where id=#{shopId}) shopName, (select IFNULL(sum(amount),0) from sys_order_flow where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> @@ -799,4 +800,140 @@ </foreach> </select> <select id="selectDailySaleData" resultType="com.matrix.system.hive.statistics.DailySaleVo"> <foreach collection="list" index="index" item="item" separator="union all" > select #{item.beginTime} dataTime, (select IFNULL(sum(amount),0) from sys_order_flow where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> )totalPay, (select IFNULL(sum(amount),0) from sys_order_flow where pay_method not in ('储值卡', '欠款') and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) cashPay, (select IFNULL(sum(amount),0) from sys_order_flow where pay_method = '储值卡' and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) cardPay, (select IFNULL(sum(amount),0) from sys_order_flow where pay_method = '欠款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) arrearsPay, (select IFNULL(sum(amount),0) from sys_order_flow where pay_method not in ('储值卡', '欠款') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) refundCashPay, (select IFNULL(sum(amount),0) from sys_order_flow where pay_method in ('储值卡') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) refundCardPay, (select IFNULL(sum(amount),0) from sys_order_flow a inner join sys_order_item b on a.order_id=b.ORDER_ID inner join shopping_goods c on b.goods_id=c.id where c.good_type='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]> <if test="shopId != null"> and a.shop_id=#{shopId} </if> ) productAchieve, (select IFNULL(sum(amount),0) from sys_order_flow a inner join sys_order_item b on a.order_id=b.ORDER_ID inner join shopping_goods c on b.goods_id=c.id where c.good_type!='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]> <if test="shopId != null"> and a.shop_id=#{shopId} </if> ) cardAchieve, (select IFNULL(sum(amount),0) from sys_order_flow where flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) refund, (select IFNULL(count(1),0) from sys_order where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) perCustomCnt, (select IFNULL(sum(b.COUNT),0) from sys_order a inner join sys_order_item b on a.ID=b.ORDER_ID where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]> <if test="shopId != null"> and shop_id=#{shopId} </if> ) totalSaleCnt, (select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a inner join sys_out_store b on a.id=b.ORDER_ID inner join sys_out_store_item c on b.id=c.OUT_STORE_ID inner join sys_store_info d on c.store_id = d.ID inner join sys_order_item e on a.ID=e.ORDER_ID inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品' where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]> <if test="shopId != null"> and a.shop_id=#{shopId} </if> ) goodsCost, (select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a inner join sys_order_item b on a.ID=b.ORDER_ID inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]> <if test="shopId != null"> and a.shop_id=#{shopId} </if> ) otherCost, (select sum(case a.paymethod when '微信' then amount else 0 end) wechat from (<include refid="dailySaleFlow"></include>) a ) wechat, (select sum(case a.paymethod when '支付宝' then amount else 0 end) alipay from (<include refid="dailySaleFlow"></include>) a ) alipay, (select sum(case a.paymethod when '现金支付' then amount else 0 end) cash from (<include refid="dailySaleFlow"></include>) a ) cash, (select sum(case a.paymethod when '银行卡' then amount else 0 end) bankCard from (<include refid="dailySaleFlow"></include>) a ) bankCard, (select sum(case a.paymethod when '团购' then amount else 0 end) tuan from (<include refid="dailySaleFlow"></include>) a ) tuan, (select sum(case a.paymethod when '本金收款' then amount else 0 end) cardBj from (<include refid="dailySaleFlow"></include>) a ) cardBj, (select sum(case a.paymethod when '赠金收款' then amount else 0 end) cardFree from (<include refid="dailySaleFlow"></include>) a ) cardFree, (select sum(case a.paymethod when '欠款' then amount else 0 end) arrears from (<include refid="dailySaleFlow"></include>) a ) arrears from dual </foreach> </select> <sql id="dailySaleFlow"> select sum(amount) amount, case when is_gift = 'Y' then '赠金收款' when is_gift='N' then '本金收款' else pay_method end paymethod from sys_order_flow where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime} ]]> <if test="shopId != null"> and a.shop_id=#{shopId} </if> group by paymethod </sql> </mapper> zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html
New file @@ -0,0 +1,149 @@ <!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="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 class="form-control autoFull" data-filed="shopName" name="shopId" id="shopId" th:data-url="@{/admin/shopInfo/findAllWithPermi}"> <option value=''>--请选择部所属门店--</option> </select> </div> <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 type="reset" class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button> <!-- <button matrix:btn="ygyjbb-exportExcel" onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button>--> </div> </div> </form> <table id="mgrid"> <thead> <tr> <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th> <th data-field="dataTime">日期</th> <th data-field="shopName">门店名称</th> <th data-field="totalPay">应收金额</th> <th data-field="totalPay">实收金额</th> <th data-field="hisConsume">折扣金额</th> <th data-field="perCustomCnt">客单数</th> <th data-field="customGoodsCnt">客品数</th> <th data-field="cost">成本</th> <th data-field="grossProfit">毛利</th> <th data-field="grossProfitRate">毛利率</th> <th data-field="wechat">微信</th> <th data-field="alipay">支付宝</th> <th data-field="cash">现金</th> <th data-field="bankCard">银行卡</th> <th data-field="tuan">团购</th> <th data-field="cardBj">本金收款</th> <th data-field="cardFree">赠金收款</th> <th data-field="arrears">欠款</th> </tr> </thead> </table> </div> <script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script> <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({}); $(function() { MTools.autoFullSelect(); $(".select2").select2(); myGrid = MGrid.initGrid({ url : basePath+"/admin/sysBusinessData/findDailySaleData", showExport : true, showFooter : false, 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' ], } }); $('[data-toggle="tooltip"]').tooltip() }); function footCountTitle(data) { return "<b>合计</b>"; }; function countColumn(data) { if (data) { var resultsumQuantity = parseFloat(data).toFixed(2);//保留有效数字 return resultsumQuantity; } else { return "-"; } }; function buildVipNameJump(value, row, index) { return '<a onClick="vipDetail(\'' + row.t9 +'\')" class="text-primary " >'+value+'</a>'; } function vipDetail(value) { layer.full(layer.open({ type : 2, title : "订单详情", maxmin : true, area : MUI.SIZE_M, content : [basePath+'/admin/redirect/hive/beautySalon/vip?vipPhone=' + value ] })); } function exportExcel(){ var param=MForm.toUrlParam("#serchform"); window.location.href=basePath+"/admin/achieve/exportDailyInfoNew?"+param; } </script> </body> </html>