This commit is contained in:
zhaohengkun 2024-10-14 14:50:56 +08:00
commit 0edf36a6d3
18 changed files with 548 additions and 368 deletions

View File

@ -163,3 +163,20 @@ export function getDataBoard(query) {
});
}
// 油站首页数据分析
export function getDataAnalysis(query) {
return request({
url: 'business/allOrderInfo/getDataAnalysis',
method: 'get',
params:query
});
}
// 油站首页数据展示
export function getDataShow(query) {
return request({
url: 'business/allOrderInfo/getDataShow',
method: 'get',
params:query
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

View File

@ -2,16 +2,15 @@
<div class="home-index">
<el-carousel height="230px">
<el-carousel-item v-for="(item,index) in bannerList" :key="index">
<div class="bannser">
<div class="bannser">-
<!-- <img src="../../assets/images/banner.png" alt="" >-->
<img :src="imagePath+item.productImage" alt="" >
</div>
</el-carousel-item>
</el-carousel>
<div class="b-bs">
<div class="left-box">
<div>核心数据</div>
<div class="h-tt">核心数据</div>
<div style="display: flex;justify-content: space-between">
<div class="san-box">
<div class="r-title">{{ storeTotal.allAmount || 0 }}</div>
@ -45,12 +44,22 @@
<div class="b-bs">
<div class="left-box-t">
<div class="d-s">
<div class="h-tt" >数据看板</div>
<div class="q-anniu">近一周</div>
<div class="h-tt" style="margin-right: 15px" >数据看板</div>
<el-dropdown placement="bottom-start" >
<div class="h-anniu" :class="{'q-anniu' : timeShow == false}" @click="timeShow = false ">近一周 <i class="el-icon-arrow-down el-icon--right"></i></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>今日</el-dropdown-item>
<el-dropdown-item>昨日</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
<el-dropdown-item>近一月</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<div class="h-anniu" :class="{'q-anniu' : timeShow == true}" @click="timeShow = true" > <img src="../assets/images/zdy.png" style="width: 14px; height: 14px" > 自定义</div>
<div style="margin-right: 40px">
<el-date-picker
v-model="value1"
type="datetimerange"
type="daterange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
@ -63,28 +72,28 @@
<div class="k-box">
<div class="d-s" style="font-size: 12px;color: #999999;">
<div class="sian"></div>
<div>油品销售金额/交易笔数</div>
<div style="color: #333">油品销售金额/交易笔数</div>
</div>
<div class="num-size">{{ storeAmount.oilAmount || 0 }}/{{ storeAmount.oilNum || 0 }}</div>
</div>
<div class="k-box">
<div class="d-s" style="font-size: 12px;color: #999999;">
<div class="sian"></div>
<div>会员充值金额/充值笔数</div>
<div style="color: #333">会员充值金额/充值笔数</div>
</div>
<div class="num-size">{{ storeAmount.userRechargeAmount || 0 }}/{{ storeAmount.userRechargeNum || 0 }}</div>
</div>
<div class="k-box">
<div class="d-s" style="font-size: 12px;color: #999999;">
<div class="sian"></div>
<div>便利店销售金额/交易笔数</div>
<div style="color: #333">便利店销售金额/交易笔数</div>
</div>
<div class="num-size">{{ storeAmount.minimartAmount || 0 }}/{{ storeAmount.minimartNum || 0 }}</div>
</div>
<div class="k-box">
<div class="d-s" style="font-size: 12px;color: #999999;">
<div class="sian"></div>
<div>积分商城销售金额/兑换笔数</div>
<div style="color: #333">积分商城销售金额/兑换笔数</div>
</div>
<div class="num-size">{{ storeAmount.pointMallAmount || 0 }}/{{ storeAmount.pointMallNum || 0 }}</div>
</div>
@ -106,32 +115,75 @@
</div>
</div>
<div class="right-box-t" >
<div class="h-tt" >硬件设备</div>
<div class="h-tt" >
<div>硬件设备</div>
<el-popover
placement="top-start"
title="联系人:某某某"
width="200"
trigger="hover"
content="联系电话1352415811">
<img slot="reference" style="width: 28px; height: 28px " src="../assets/images/telindex.png">
</el-popover>
</div>
<div style="height: 90%;overflow: auto;scrollbar-width: none;">
<div class="d-s" style="margin: 30px 0px" v-for="(item,index) in hardwareList" :key="index" >
<!-- <div class="r-img">-->
<!-- <img src="../../assets/images/pcin.png" style="width: 84px;height: 70px">-->
<!-- </div>-->
<!-- <div>容大(RT RONGTA)RP76II针式76mm小票打印机加油站二三联票据 RP76II/USB口</div>-->
<div class="r-img">
<img :src="imagePath + item.image" style="width: 84px;height: 70px">
</div>
<div>{{ item.name }}</div>
<div style="font-size: 14px">{{ item.name }}</div>
</div>
</div>
</div>
</div>
<div class="b-bs">
<div class="left-box-t">
<div>数据展示</div>
<div class="d-s">
<div class="h-tt" style="margin-right: 15px" >油品交易分析</div>
<el-dropdown placement="bottom-start" >
<div class="h-anniu" :class="{'q-anniu' : timeShow == false}" @click="timeShow = false ">近一周 <i class="el-icon-arrow-down el-icon--right"></i></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>今日</el-dropdown-item>
<el-dropdown-item>昨日</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
<el-dropdown-item>近一月</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<div class="h-anniu" :class="{'q-anniu' : timeShow == true}" @click="timeShow = true" > <img src="../assets/images/zdy.png" style="width: 14px; height: 14px" > 自定义</div>
<div style="margin-right: 40px">
<el-date-picker
v-model="value1"
type="daterange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@blur="getStoreAmount">
</el-date-picker>
</div>
</div>
</div>
<div class="right-box-t">
<div style="font-size: 16px;font-weight: bold">员工排行</div>
<div style="font-size: 16px;font-weight: bold"><span style="margin-right: 15px">员工排行</span> <el-dropdown placement="bottom-start" >
<div class="h-anniu" :class="{'q-anniu' : timeShow == false}" @click="timeShow = false ">近一周 <i class="el-icon-arrow-down el-icon--right"></i></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>今日</el-dropdown-item>
<el-dropdown-item>昨日</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
<el-dropdown-item>近一月</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown></div>
<div class="hui-box">
<div style="width: 10%">排名</div>
<div>员工姓名</div>
<div style="width: 25%">会员充值金额)</div>
<div style="width: 25%">油品销售金额)</div>
<div>总销售额</div>
<div style="width: 25%">会员充值金额</div>
<div style="width: 25%">油品销售金额</div>
<div>总销售额</div>
</div>
<div style="overflow: auto; scrollbar-width: none; height: 74% ">
<div class="hang-box" v-for="(item,index) in employeList" :key="index">
<div style="width: 10%">{{index +1}}</div>
<div>{{ item.realName }}</div>
@ -140,22 +192,36 @@
<div>{{item.totalSum}}</div>
</div>
</div>
</div>
</div>
<div class="bottom_">
<div class="h-tt" style="margin-bottom: 15px" >数据统计</div>
<div class="d-s">
<div class="anniu-h" :class="{ 'anniu-act': index == 0 }" v-for="(item,index) in timeList" :key="index">
{{item}}
</div>
<div class="h-tt" style="margin-right: 15px" >数据统计</div>
<el-dropdown placement="bottom-start" >
<div class="h-anniu" :class="{'q-anniu' : timeShow == false}" @click="timeShow = false ">近一周 <i class="el-icon-arrow-down el-icon--right"></i></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>今日</el-dropdown-item>
<el-dropdown-item>昨日</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
<el-dropdown-item>近一月</el-dropdown-item>
<el-dropdown-item>近一周</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<div class="h-anniu" :class="{'q-anniu' : timeShow == true}" @click="timeShow = true" > <img src="../assets/images/zdy.png" style="width: 14px; height: 14px" > 自定义</div>
<div style="margin-right: 40px">
<el-date-picker
v-model="value2"
type="datetimerange"
range-separator="至"
v-model="value1"
type="daterange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
@blur="getStoreAmount">
</el-date-picker>
</div>
</div>
<div id="ctct" style="width: 100%; height: 315px;background: linear-gradient( 360deg, #F8F0E7 0%, #FFFFFF 100%); "></div>
</div>
@ -178,6 +244,8 @@ export default {
props:["accountId"],
data(){
return{
xShow:false,
timeShow:false,
form: {},
timeList:[
"今日",
@ -417,8 +485,14 @@ export default {
data: [
// { value: 28, name: '28%' },
// { value: 72, name: '72%' },
{ value: this.countPercentage(Number(this.storeAmount.oilNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.noOilNum)), name: "油品交易占比" },
{ value: this.countPercentage(Number(this.storeAmount.noOilNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.noOilNum)), name: "非油品交易占比" },
{
value: this.countPercentage(Number(this.storeAmount.oilNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.noOilNum)),
name: "油品交易占比"
},
{
value: this.countPercentage(Number(this.storeAmount.noOilNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.noOilNum)),
name: "非油品交易占比"
},
],
emphasis: {
@ -452,10 +526,22 @@ export default {
// { value: 72, name: '' },
// { value: 28, name: '' },
// { value: 72, name: '便' },
{ value: this.countPercentage(Number(this.storeAmount.userNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.userNum)+Number(this.storeAmount.integralNum)+Number(this.storeAmount.goodNum)), name: '会员充值占比' },
{ value: this.countPercentage(Number(this.storeAmount.integralNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.userNum)+Number(this.storeAmount.integralNum)+Number(this.storeAmount.goodNum)), name: '积分商城交易占比' },
{ value: this.countPercentage(Number(this.storeAmount.oilNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.userNum)+Number(this.storeAmount.integralNum)+Number(this.storeAmount.goodNum)), name: '油品交易占比' },
{ value: this.countPercentage(Number(this.storeAmount.goodNum),Number(this.storeAmount.oilNum)+Number(this.storeAmount.userNum)+Number(this.storeAmount.integralNum)+Number(this.storeAmount.goodNum)), name: '便利店交易占比' },
{
value: this.countPercentage(Number(this.storeAmount.userNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.userNum) + Number(this.storeAmount.integralNum) + Number(this.storeAmount.goodNum)),
name: '会员充值占比'
},
{
value: this.countPercentage(Number(this.storeAmount.integralNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.userNum) + Number(this.storeAmount.integralNum) + Number(this.storeAmount.goodNum)),
name: '积分商城交易占比'
},
{
value: this.countPercentage(Number(this.storeAmount.oilNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.userNum) + Number(this.storeAmount.integralNum) + Number(this.storeAmount.goodNum)),
name: '油品交易占比'
},
{
value: this.countPercentage(Number(this.storeAmount.goodNum), Number(this.storeAmount.oilNum) + Number(this.storeAmount.userNum) + Number(this.storeAmount.integralNum) + Number(this.storeAmount.goodNum)),
name: '便利店交易占比'
},
],
emphasis: {
@ -799,21 +885,25 @@ export default {
height: 100%;
background: #f4f5f9;
}
.d-s {
display: flex;
align-items: center;
}
.bannser {
width: 100%;
height: 230px;
border-radius: 8px;
overflow: hidden;
img {
width: 100%;
height: 100%;
}
}
.b-bs {
width: 100%;
display: flex;
@ -821,6 +911,7 @@ export default {
justify-content: space-between;
margin-top: 15px;
}
.left-box {
width: 74%;
background: #FFFFFF;
@ -833,6 +924,7 @@ export default {
box-sizing: border-box;
padding: 15px;
}
.left-box-t {
width: 74%;
box-sizing: border-box;
@ -843,6 +935,7 @@ export default {
height: 380px;
}
.right-box {
width: 25%;
border-radius: 8px;
@ -852,6 +945,7 @@ export default {
box-sizing: border-box;
padding: 15px;
}
.right-box-t {
width: 25%;
border-radius: 8px;
@ -860,31 +954,35 @@ export default {
height: 380px;
box-sizing: border-box;
padding: 15px;
overflow: auto;
scrollbar-width: none;
}
.san-box {
width: 24%;
height: 120px;
height: 100px;
box-sizing: border-box;
border-radius: 8px;
background: #fe8c4a;
margin: 15px 0px;
margin-right: 15px;
margin: 15px auto;
box-sizing: border-box;
padding: 20px 40px;
}
.r-title {
font-weight: bold;
font-size: 42px;
color: #FFFFFF;
text-align: center;
}
.r-size {
font-size: 14px;
color: #FFFFFF;
text-align: center;
}
.title_ {
font-size: 16px;
color: #333333;
@ -894,49 +992,71 @@ export default {
justify-content: space-between;
width: 100%;
}
.hang_ {
width: 100%;
white-space: nowrap; //
overflow: hidden; //
text-overflow: ellipsis; //
font-size: 14px;
color: #777777;
color: #333;
margin: 14px auto;
}
.h-tt {
font-size: 16px;
color: #333333;
font-weight: bold;
margin-right: 40px;
display: flex;
justify-content: space-between;
}
.q-anniu {
width: 80px;
height: 26px;
background: #FF9655;
background: #FF9655 !important;
border-radius: 4px 4px 4px 4px;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
color: #fff !important;
font-size: 12px;
cursor: pointer;
margin-right: 20px;
}
.h-anniu {
width: 80px;
height: 26px;
background: #fafafa;
border-radius: 4px 4px 4px 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin-right: 20px;
font-weight: 400;
font-size: 12px;
color: #555555;
}
.k-box {
width: 220px;
width: 24%;
height: 68px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #e1e0e0;
box-sizing: border-box;
margin: 0 auto;
padding: 10px;
margin-right: 10px;
}
.num-size {
font-weight: bold;
font-size: 24px;
color: #555555;
}
.sian {
width: 6px;
height: 6px;
@ -944,23 +1064,27 @@ export default {
border-radius: 50%;
margin-right: 5px;
}
.hui-hang {
width: 100%;
height: 5px;
background: #F4F5F9;
margin: 15px auto;
}
.h-r-ba {
height: 170px;
margin: 0px 50px;
width: 5px;
background: #f4f5f9;
}
.r-img {
width: 84px;
height: 70px;
margin-right: 20px;
}
.bottom_ {
width: 100%;
border-radius: 10px;
@ -969,6 +1093,7 @@ export default {
padding: 20px;
margin-top: 20px;
}
.anniu-h {
width: 80px;
height: 26px;
@ -981,21 +1106,25 @@ export default {
color: #777777;
margin-right: 20px;
}
.anniu-act {
background: #FF9655 !important;
border: 1px solid #FF9655 !important;
color: #fff;
}
.la-left {
width: 73%;
background: #fff;
border-radius: 10px;
}
.la-right {
height: 25%;
background: #fff;
border-radius: 10px;
}
.hui-box {
background: #F4F5F9;
border-radius: 8px;
@ -1003,26 +1132,32 @@ export default {
box-sizing: border-box;
padding: 10px;
display: flex;
font-size: 14px;
justify-content: space-between;
margin: 10px auto;
div {
width: 20%;
text-align: center;
}
}
.hang-box {
border-radius: 8px;
font-size: 14px;
width: 100%;
box-sizing: border-box;
padding: 10px;
padding: 5px;
display: flex;
justify-content: space-between;
margin: 10px auto;
margin: 0px auto;
div {
width: 20%;
text-align: center;
}
}
.home-index {
}

View File

@ -138,6 +138,7 @@
</el-popover>
</div>
</div>
<div style="height: 90%;overflow:auto;">
<div class="d-s" style="margin: 30px 0px" v-for="(item,index) in hardwareList" :key="index" >
<!-- <div class="r-img">-->
<!-- <img src="../../assets/images/pcin.png" style="width: 84px;height: 70px">-->
@ -149,6 +150,8 @@
<div>{{ item.name }}</div>
</div>
</div>
</div>
</div>
<div class="bottom_">
<div class="h-tt" style="margin-bottom: 15px" >数据统计</div>

View File

@ -148,6 +148,7 @@
</el-popover>
</div>
</div>
<div style="height: 90%;overflow:auto;">
<div class="d-s" style="margin: 30px 0px" v-for="(item,index) in hardwareList" :key="index" >
<!-- <div class="r-img">-->
<!-- <img src="../../assets/images/pcin.png" style="width: 84px;height: 70px">-->
@ -159,6 +160,8 @@
<div>{{ item.name }}</div>
</div>
</div>
</div>
</div>
<div class="bottom_">
<div class="h-tt" style="margin-bottom: 15px" >数据统计</div>

View File

@ -131,6 +131,7 @@
</div>
<div class="right-box-t">
<div class="h-tt" >硬件设备</div>
<div style="height: 90%;overflow: auto">
<div class="d-s" style="margin: 30px 0px" v-for="(item,index) in hardwareList" :key="index" >
<!-- <div class="r-img">-->
<!-- <img src="../../assets/images/pcin.png" style="width: 84px;height: 70px">-->
@ -142,6 +143,8 @@
<div>{{ item.name }}</div>
</div>
</div>
</div>
</div>
<div class="bottom_">
<div class="h-tt" style="margin-bottom: 15px" >数据统计</div>

View File

@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -309,6 +310,29 @@ public class AllOrderInfoController extends BaseController {
return getSuccessResult(allOrderInfoService.getDataBoard(map));
}
/**
* 油站首页数据分析
* @param map
* @return
*/
@GetMapping("getDataAnalysis")
public ResponseObject getDataAnalysis(Map<String, String> map){
return getSuccessResult(allOrderInfoService.getDataAnalysis(map));
}
/**
* 油站首页数据展示
* @param map
* @return
*/
@GetMapping("getDataShow")
public ResponseObject getDataShow(String startTime, String endTime) {
Map<String, String> map = new HashMap<>();
map.put("startTime", startTime);
map.put("endTime", endTime);
return getSuccessResult(allOrderInfoService.getDataShow(map));
}
/**
* 消费记录小程序
* @param pageNo

View File

@ -140,4 +140,6 @@ public interface OilOrderMapper extends BaseMapper<OilOrder> {
OilOrderVo getInfoByOrderNo(String orderNo);
Double selectSumMoeny(@Param("orderNos") List<String> orderNos);
double selectSumMoneyByDayAndOilNumber(@Param("oilName") String oilName, @Param("day") String day, @Param("storeId") Integer storeId);
}

View File

@ -804,4 +804,8 @@
#{item}
</foreach>
</select>
<select id="selectSumMoneyByDayAndOilNumber" resultType="java.lang.Double">
select IFNULL(SUM(pay_amount), 0) from oil_order
where DATE(pay_time) = #{day} and oils = #{oilName} and store_id = #{storeId}
</select>
</mapper>

View File

@ -157,6 +157,13 @@ public interface AllOrderInfoService {
*/
List<HomeDataAnalysisVo> getDataAnalysis(Map<String, String> map);
/**
* 油站首页数据展示
* @param map
* @return
*/
HomeDataShowVo getDataShow(Map<String, String> map);
/**
* 消费记录
* @param page

View File

@ -1737,14 +1737,15 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
//查询所有油品
List<OilNumber> oilNumbers = oilNumberMapper.selectList(new LambdaQueryWrapper<OilNumber>()
.eq(OilNumber::getStoreId, nowAccountInfo.getStoreId())
.eq(OilNumber::getState, "1")
.eq(OilNumber::getIfDelete, "0"));
// List<OilNumber> oilNumbers = oilNumberMapper.selectList(new LambdaQueryWrapper<OilNumber>()
// .eq(OilNumber::getStoreId, nowAccountInfo.getStoreId())
// .eq(OilNumber::getState, "启用")
// .ne(OilNumber::getIfDelete, "1"));
List<OilNumber> oilNumbers = oilNumberMapper.selectAllOil(nowAccountInfo.getStoreId());
LambdaQueryWrapper<OilOrder> oilOrderQuery = new LambdaQueryWrapper<OilOrder>();
oilOrderQuery.eq(OilOrder::getStoreId, nowAccountInfo.getStoreId())
.eq(OilOrder::getUserId, nowAccountInfo.getId())
.eq(OilOrder::getStoreId, nowAccountInfo.getStoreId())
.eq(OilOrder::getOrderStatus, "paid");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
oilOrderQuery.between(OilOrder::getCreateTime, startTime, endTime);
@ -1754,7 +1755,7 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
//油号之间占比
for (OilNumber oilNumber : oilNumbers) {
HomeDataAnalysisVo homeDataAnalysisVo = new HomeDataAnalysisVo();
homeDataAnalysisVo.setName(oilNumber.getOilName());
homeDataAnalysisVo.setName(oilNumber.getOilNames() + oilNumber.getOilType() + "占比");
homeDataAnalysisVo.setType(1);
List<OilOrder> oilList = new ArrayList<>();
for (OilOrder oilOrder : oilOrders) {
@ -1762,9 +1763,9 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
oilList.add(oilOrder);
}
}
DecimalFormat df = new DecimalFormat("#.00");
String formattedResult = df.format(oilList.size());
homeDataAnalysisVo.setValue(Double.parseDouble(formattedResult) / oilNumbers.size());
double averageValue = (Double.parseDouble(String.valueOf(oilList.size())) / oilOrders.size()) * 100;
String formattedResult = getFormattedResult(averageValue);
homeDataAnalysisVo.setValue(Double.parseDouble(formattedResult));
list.add(homeDataAnalysisVo);
}
@ -1780,10 +1781,10 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
Integer oilAllOrderInfos = 0;
Integer productionAllOrderInfos = 0;
//油品交易占比
Double shareOfOilTransactions = 0.0;
//非油品交易占比
Double shareOfNonOilTransactions = 0.0;
// //油品交易占比
// shareOfOilTransactions = 0.0;
// //非油品交易占比
// shareOfNonOilTransactions = 0.0;
for (AllOrderInfo allOrderInfo : allOrderInfos) {
if ("1".equals(allOrderInfo.getType())) {
oilAllOrderInfos += 1;
@ -1791,8 +1792,9 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
productionAllOrderInfos += 1;
}
}
shareOfOilTransactions = Double.parseDouble(String.valueOf(oilAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)));
shareOfNonOilTransactions = Double.parseDouble(String.valueOf(productionAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)));
Double i = ((double)oilAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)) * 100;
Double shareOfOilTransactions = Double.valueOf((getFormattedResult(i)));
Double shareOfNonOilTransactions = Double.valueOf(getFormattedResult(((double)productionAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)) * 100));
HomeDataAnalysisVo oilhomeDataAnalysisVo = new HomeDataAnalysisVo();
oilhomeDataAnalysisVo.setName("油品交易占比");
@ -1825,33 +1827,97 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
oilRecharge += 1;
}
}
Integer sum = mtUser + product + oilRecharge + pointMall;
HomeDataAnalysisVo mtUserVo = new HomeDataAnalysisVo();
mtUserVo.setName("会员充值占比");
mtUserVo.setType(3);
mtUserVo.setValue(Double.parseDouble(String.valueOf(mtUser / allOrderInfos.size())));
mtUserVo.setValue(Double.parseDouble(getFormattedResult(((double)mtUser / sum) * 100)));
list.add(mtUserVo);
HomeDataAnalysisVo productVo = new HomeDataAnalysisVo();
productVo.setName("商品交易占比");
productVo.setType(3);
productVo.setValue(Double.parseDouble(String.valueOf(product / allOrderInfos.size())));
productVo.setValue(Double.parseDouble(getFormattedResult(((double)product / sum) * 100)));
list.add(productVo);
HomeDataAnalysisVo oilRechargeVo = new HomeDataAnalysisVo();
oilRechargeVo.setName("油品充值占比");
oilRechargeVo.setName("油品交易占比");
oilRechargeVo.setType(3);
oilRechargeVo.setValue(Double.parseDouble(String.valueOf(oilRecharge / allOrderInfos.size())));
oilRechargeVo.setValue(Double.parseDouble(getFormattedResult(((double)oilRecharge / sum) * 100)));
list.add(oilRechargeVo);
HomeDataAnalysisVo pointMallVo = new HomeDataAnalysisVo();
pointMallVo.setName("积分商城交易占比");
pointMallVo.setType(3);
pointMallVo.setValue(Double.parseDouble(String.valueOf(pointMall / allOrderInfos.size())));
pointMallVo.setValue(Double.parseDouble(getFormattedResult((double)pointMall / sum * 100)));
list.add(pointMallVo);
return list;
}
/**
* 油站首页数据展示
*
* @param map
* @return
*/
@Override
public HomeDataShowVo getDataShow(Map<String, String> map) {
HomeDataShowVo homeDataShowVo = new HomeDataShowVo();
String startTime = map.get("startTime");
String endTime = map.get("endTime");
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
//查询出所有油号
List<OilNumber> oilNumbers = oilNumberMapper.selectAllOil(nowAccountInfo.getStoreId());
List<String> oilNames = oilNumbers.stream().map(oil -> oil.getOilNames() + oil.getOilType()).collect(Collectors.toList());
homeDataShowVo.setOilNames(oilNames);
//根据开始时间与结束时间获取所有天数
List<String> days = getAllDatesBetween(startTime, endTime);
List<Map<String, Object>> oilData = new ArrayList<>();
for (String day : days) {
Map<String, Object> mapData = new HashMap<>();
mapData.put("day", day);
List<Double> oilPrices = new ArrayList<>();
for (OilNumber oilNumber : oilNumbers) {
//查询油品交易总金额
double price = oilOrderMapper.selectSumMoneyByDayAndOilNumber(oilNumber.getOilName(), day, nowAccountInfo.getStoreId());
oilPrices.add(price);
}
mapData.put("oilPrices", oilPrices);
oilData.add(mapData);
}
homeDataShowVo.setOilData(oilData);
}
return homeDataShowVo;
}
/**
* 获取时间段内的所有日期
* @param startTime
* @return
*/
public List<String> getAllDatesBetween(String startTime, String endTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(startTime, formatter);
LocalDate endDate = LocalDate.parse(endTime, formatter);
List<String> dateList = new ArrayList<>();
while (!startDate.isAfter(endDate)) {
dateList.add(startDate.format(formatter));
startDate = startDate.plusDays(1);
}
return dateList;
}
private static String getFormattedResult(double averageValue) {
DecimalFormat df = new DecimalFormat("#.00");
String formattedResult = df.format(averageValue);
return formattedResult;
}
/**
* 消费记录
*

View File

@ -752,7 +752,6 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
map.put("orderId", orderId.toString());
payCenterService.cashRegisterSpendWisely(map);
}
}
@Override
@ -763,10 +762,10 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
// 油品订单金额
Double oilAmount = Double.valueOf(map.get("oilAmount"));
// 将油品订单信息的json数据转换为数组
List<JSONObject> oilOrders = null;
JSONObject oilOrders = null;
if (!map.get("oilOrder").equals("[]")) {
oilOrders = JSONArray.parseArray(map.get("oilOrder"), JSONObject.class);
if (ObjectUtil.isNotEmpty(map.get("oilOrder"))) {
oilOrders = JSONObject.parseObject(map.get("oilOrder"));
// 二维码支付
if (authCode.contains("9E")) {
String[] split = authCode.split("9E");
@ -1134,7 +1133,7 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
* @param oilOrders 油品订单
* @return 是否成功
*/
private Map<String, String> updateUserBalanceAndInsetOrder1(int userId, Map<String, String> map, Double oilAmount, List<JSONObject> oilOrders, Integer storeId) {
private Map<String, String> updateUserBalanceAndInsetOrder1(int userId, Map<String, String> map, Double oilAmount, JSONObject oilOrders, Integer storeId) {
Map<String, String> res = new HashMap<>();
LJStore store = storeService.selectStoreByStoreId(storeId);
// 根据userId查询用户储值卡信息
@ -1149,157 +1148,56 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
String orderNo = "2345" + timestamp + randomString;
AccountInfo accountInfo = TokenUtil.getNowAccountInfo();
// 油品实付金额
Double oilActualPay = Double.valueOf(map.get("oilActualPay"));
// 储值卡消费金额 没有默认传0
Double balanceAmount = Double.valueOf(ObjectUtil.isNotEmpty(map.get("balanceAmount")) ? map.get("balanceAmount") : "0");
// 囤油卡消费升数 没有默认传0
Double oilCardAmount = Double.valueOf(ObjectUtil.isNotEmpty(map.get("oilCardAmount")) ? map.get("oilCardAmount") : "0");
// 储值卡余额
Double cardBalance = balance.getCardBalance();
CardFuelRecord cardFuelRecord = new CardFuelRecord();
cardFuelRecord.setMtUserId(userId);
List<CardFuelRecord> recordByUserId = cardFuelRecordService.getRecordByUserId(cardFuelRecord);
// 判断油品消费升数是否可使用
Double fuelAmount = userFuelService.selectByUserIdAndOilId(userId, Integer.valueOf(oilOrders.get("oils").toString()), storeId);
// 锁价后应付金额
Double lockupAmount = 0.0;
for (CardFuelRecord fuelRecord : recordByUserId) {
for (int i = 0; i < oilOrders.size(); i++) {
if (fuelRecord.getOilName().equals(oilOrders.get(i).get("oilName"))) {
lockupAmount += fuelRecord.getLockupPrice() * Double.valueOf(oilOrders.get(i).get("liters").toString());
}
}
if (fuelAmount < oilCardAmount && cardBalance < oilActualPay) {
res.put("error", "余额不足,请分开支付");
return res;
}
String status = "unpaid";
if (lockupAmount > 0.0) {
OilOrder order = new OilOrder();
OilOrder oilOrder = null;
// 添加收银台订单信息
// 添加收银台/油品订单信息
CashierOrder cashierOrder = new CashierOrder();
boolean flag = false;
if (cardBalance >= lockupAmount) {
flag = true;
status = "paid";
} else {
flag = false;
status = "payFail";
}
Double oilLiters = 0.0;
for (int i = 0; i < oilOrders.size(); i++) {
Double amount = Double.valueOf(oilOrders.get(i).get("amount").toString());
Double oilPrice = Double.valueOf(oilOrders.get(i).get("oilPrice").toString());
Double amount = oilAmount;
Double oilPrice = Double.valueOf(oilOrders.get("oilPrice").toString());
Double oilNum = amount / oilPrice;
oilLiters += oilNum;
if (i == 0) {
order.setOrderType("主订单");
order.setOrderAmount(amount);
order.setPayAmount(amount);
order.setPayAmount(oilActualPay);
order.setOrderNo(orderNo);
} else {
order.setOrderType("子订单");
order.setOrderAmount(amount);
order.setPayAmount(0.0);
order.setOrderNo(orderNo + "1");
}
order.setStoreId(accountInfo.getStoreId());
order.setUserId(userId);
order.setCommissionAmount(Double.valueOf(map.get("commissionAmount")));
if (ObjectUtil.isNotEmpty(map.get("staffId")))
order.setStaffId(Integer.valueOf(map.get("staffId")));
order.setStaffId(accountInfo.getStaffId());
order.setTerminal(map.get("terminal"));
order.setOils((String) oilOrders.get(i).get("oilName"));
order.setOilGunNum(oilOrders.get(i).get("gunName").toString());
order.setOilNum(oilNum);
order.setPayUser(userVo1.getMobile());
order.setPayType(map.get("payType"));
order.setInvoicing("未开票");
order.setOrderStatus(status);
if (flag) order.setPayTime(new Date());
this.addOilTrack(oilOrders.get(i), accountInfo.getStoreId());
if (ObjectUtil.isNotEmpty(this.selectOilOrderByOrderNo(orderNo))) {
baseMapper.updateById(order);
} else {
baseMapper.insert(order);
}
oilOrder = this.selectOilOrderByOrderNo(orderNo);
this.updateGrowthValue1(oilAmount, 0.0, userId, Integer.valueOf(oilOrder.getOils()), 0.0, storeId, orderNo);
}
if (flag) {
if (ObjectUtil.isNotEmpty(map.get("staffId")))
cashierOrder.setStaffId(Integer.valueOf(map.get("staffId")));
cashierOrder.setStoreId(accountInfo.getStoreId());
cashierOrder.setPayUser(userVo1.getMobile());
cashierOrder.setAmount(oilAmount);
cashierOrder.setOilPayAmount(oilAmount);
cashierOrder.setPayAmount(oilAmount);
cashierOrder.setStatus(status);
cashierOrder.setPayTime(new Date());
cashierOrder.setOrderNo(orderNo);
cashierOrder.setOilOrderAmount(oilAmount);
cashierOrder.setTerminal(map.get("terminal"));
cashierOrder.setOilOrderId(oilOrder.getId());
cashierOrder.setSeekZero(0.0);
cashierOrder.setPayType(map.get("payType"));
cashierOrderService.insertCashierOrder(cashierOrder);
this.insertAllOrderInfo(orderNo, storeId, oilAmount, oilAmount, 0.0, map.get("payType"), userId, "PC", "1", status);
if (ObjectUtil.isNotEmpty(map.get("staffId")))
staffCommissionService.countStaffCommission(Integer.valueOf(map.get("staffId")), storeId, oilAmount, oilAmount, "1", orderNo);
res.put("success", "success");
} else {
res.put("error", "储值卡余额不足!");
}
} else {
if (cardBalance >= oilAmount) {
// 添加油品订单信息
OilOrder order = new OilOrder();
Double oilLiters = 0.0;
for (int i = 0; i < oilOrders.size(); i++) {
Double amount = Double.valueOf(oilOrders.get(i).get("amount").toString());
Double oilPrice = Double.valueOf(oilOrders.get(i).get("oilPrice").toString());
Double oilNum = amount / oilPrice;
oilLiters += oilNum;
if (i == 0) {
order.setOrderType("主订单");
order.setOrderAmount(amount);
order.setPayAmount(amount);
order.setOrderNo(orderNo);
} else {
order.setOrderType("子订单");
order.setOrderAmount(amount);
order.setPayAmount(0.0);
order.setOrderNo(orderNo + "1");
}
order.setStoreId(accountInfo.getStoreId());
order.setUserId(userId);
order.setCommissionAmount(Double.valueOf(map.get("commissionAmount")));
if (ObjectUtil.isNotEmpty(map.get("staffId")))
order.setStaffId(Integer.valueOf(map.get("staffId")));
order.setTerminal(map.get("terminal"));
order.setOils((String) oilOrders.get(i).get("oilName"));
order.setOilGunNum(oilOrders.get(i).get("gunName").toString());
order.setOils(oilOrders.get("oils").toString());
order.setOilGunNum(oilOrders.get("oilGunNum").toString());
order.setOilNum(oilNum);
order.setPayUser(userVo1.getMobile());
order.setPayType(map.get("payType"));
order.setInvoicing("未开票");
order.setOrderStatus("paid");
order.setPayTime(new Date());
this.addOilTrack(oilOrders.get(i), accountInfo.getStoreId());
this.addOilTracks(order, accountInfo.getStoreId());
if (ObjectUtil.isNotEmpty(this.selectOilOrderByOrderNo(orderNo))) {
baseMapper.updateById(order);
} else {
baseMapper.insert(order);
}
}
OilOrder oilOrder = this.selectOilOrderByOrderNo(orderNo);
// 添加收银台订单信息
CashierOrder cashierOrder = new CashierOrder();
if (ObjectUtil.isNotEmpty(map.get("staffId")))
cashierOrder.setStaffId(Integer.valueOf(map.get("staffId")));
this.updateGrowthValue1(oilAmount, 0.0, userId, Integer.valueOf(order.getOils()), 0.0, storeId, orderNo);
cashierOrder.setStaffId(order.getStaffId());
cashierOrder.setStoreId(accountInfo.getStoreId());
cashierOrder.setPayUser(userVo1.getMobile());
cashierOrder.setAmount(oilAmount);
@ -1310,19 +1208,14 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
cashierOrder.setOrderNo(orderNo);
cashierOrder.setOilOrderAmount(oilAmount);
cashierOrder.setTerminal(map.get("terminal"));
cashierOrder.setOilOrderId(oilOrder.getId());
cashierOrder.setOilOrderId(order.getId());
cashierOrder.setSeekZero(0.0);
cashierOrder.setPayType(map.get("payType"));
cashierOrderService.insertCashierOrder(cashierOrder);
this.updateGrowthValue1(oilAmount, oilAmount, userId, Integer.valueOf(oilOrder.getOils()), 0.0, storeId, orderNo);
this.insertAllOrderInfo(orderNo, accountInfo.getStoreId(), oilAmount, oilAmount, 0.0, map.get("payType"), userId, "PC", "1", "paid");
if (ObjectUtil.isNotEmpty(map.get("staffId")))
staffCommissionService.countStaffCommission(Integer.valueOf(map.get("staffId")), storeId, oilAmount, oilAmount, "1", orderNo);
this.insertAllOrderInfo(orderNo, storeId, oilAmount, oilAmount, 0.0, map.get("payType"), userId, "PC", "1", "paid");
staffCommissionService.countStaffCommission(accountInfo.getStaffId(), storeId, oilAmount, oilAmount, "1", orderNo);
res.put("success", "success");
} else {
res.put("error", "储值卡余额不足!");
}
}
return res;
}

View File

@ -0,0 +1,12 @@
package com.fuint.business.order.vo;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class HomeDataShowVo {
private List<String> oilNames;
private List<Map<String, Object>> oilData;
}

View File

@ -41,6 +41,8 @@ public class OilNumber extends BaseEntity {
public Integer id; //id主键)
public Integer upOrDown;//油价涨幅 1- 2-
public String amplitudeOfChange; //涨幅
@TableField(exist = false)
public String oilNames;

View File

@ -63,5 +63,7 @@ public interface OilNumberMapper extends BaseMapper<OilNumber> {
List<OilNumberNameVo> selectOilNumberNameByStoreId(@Param("storeId") Integer storeId);
double getOilPriceById(@Param("oilId") Integer oilId,@Param("storeId") Integer storeId);
List<OilNumber> selectAllOil(Integer storeId);
}

View File

@ -155,4 +155,11 @@
<select id="getOilPriceById" resultType="double">
select oil_price from oil_number where oil_name = #{oilId} and store_id = #{storeId}
</select>
<select id="selectAllOil" resultType="com.fuint.business.petrolStationManagement.entity.OilNumber"
parameterType="java.lang.Integer">
select oin.*, ona.oil_name oilNames
from oil_number oin
left join oil_name ona on oin.oil_name = ona.id
where oin.store_id = #{storeId}
</select>
</mapper>

View File

@ -109,7 +109,7 @@
deduction: [{
key: "oilStorageCard",
value: "优先使用囤油卡付款",
desc: "若囤油卡升数不足进行支付,则会与储值卡组合付款"
desc: "若囤油卡升数不足时,则无法使用囤油卡支付"
},
{
key: "balance",