This commit is contained in:
zhaohengkun 2024-10-12 18:11:56 +08:00
commit 872cfdc423
24 changed files with 639 additions and 144 deletions

View File

@ -92,6 +92,7 @@ export const constantRoutes = [
name: 'resourceOilstore',
meta: { title: '系统首页1', icon: 'dashboard', affix: true }
},
// {
// path: 'resource_oilstore',
// component: () => import('@/views/index'),

View File

@ -465,27 +465,27 @@
</div>
</div>
</el-form-item>
<el-form-item label="适用商品" prop="productLimit">
<div class="d-s" style="cursor: pointer">
<div class="d-s" @click="ruleForm.productLimit = 1">
<img src="../../../assets/images/wx.png" v-if="ruleForm.productLimit != 1" style="width: 20px;height: 20px;">
<img src="../../../assets/images/xz.png" v-if="ruleForm.productLimit == 1" style="width: 20px;height: 20px;">
<div>不限</div>
</div>
<div class="d-s" @click="ruleForm.productLimit = 2">
<img src="../../../assets/images/wx.png" v-if="ruleForm.productLimit != 2" style="width: 20px;height: 20px;">
<img src="../../../assets/images/xz.png" v-if="ruleForm.productLimit == 2" style="width: 20px;height: 20px;">
<div>自定义</div>
<el-select v-if="ruleForm.productLimit == 2" v-model="ruleForm.productIds" placeholder="请选择商品名称(可多选)" style="margin-left: 10px">
<el-option
v-for="item in goodsList"
:key="item.id+''"
:label="item.name"
:value="item.id+''"></el-option>
</el-select>
</div>
</div>
</el-form-item>
<!-- <el-form-item label="适用商品" prop="productLimit">-->
<!-- <div class="d-s" style="cursor: pointer">-->
<!-- <div class="d-s" @click="ruleForm.productLimit = 1">-->
<!-- <img src="../../../assets/images/wx.png" v-if="ruleForm.productLimit != 1" style="width: 20px;height: 20px;">-->
<!-- <img src="../../../assets/images/xz.png" v-if="ruleForm.productLimit == 1" style="width: 20px;height: 20px;">-->
<!-- <div>不限</div>-->
<!-- </div>-->
<!-- <div class="d-s" @click="ruleForm.productLimit = 2">-->
<!-- <img src="../../../assets/images/wx.png" v-if="ruleForm.productLimit != 2" style="width: 20px;height: 20px;">-->
<!-- <img src="../../../assets/images/xz.png" v-if="ruleForm.productLimit == 2" style="width: 20px;height: 20px;">-->
<!-- <div>自定义</div>-->
<!-- <el-select v-if="ruleForm.productLimit == 2" v-model="ruleForm.productIds" placeholder="请选择商品名称(可多选)" style="margin-left: 10px">-->
<!-- <el-option-->
<!-- v-for="item in goodsList"-->
<!-- :key="item.id+''"-->
<!-- :label="item.name"-->
<!-- :value="item.id+''"></el-option>-->
<!-- </el-select>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-form-item>-->
<el-form-item>

View File

@ -88,7 +88,7 @@ export default {
<style scoped lang="scss">
.app-container{
height: 100%;
}
.banner-box{
width: 100%;

View File

@ -0,0 +1,135 @@
<template>
<div>
<div class="top-box">
<span style="cursor: pointer" @click="goback()">当前位置首页--通知公告</span>
</div>
<div class="hui_box">
<div class="top_new">
<el-form :model="queryParams" ref="queryForm" size="small" style="width: 100%" :inline="true" >
<el-form-item label="" prop="payUser">
<el-input
v-model="queryParams.payUser"
placeholder="请输入通知内容的关键词"
clearable
/>
</el-form-item>
<el-form-item label="" prop="payUser">
<el-input
v-model="queryParams.payUser"
placeholder="请选择通知类型"
clearable
/>
</el-form-item>
<el-form-item >
</el-form-item>
</el-form>
<div style="height: 32px;width: 20%;display: flex;justify-content: flex-end">
<el-button type="primary" icon="el-icon-search" @click="">查询</el-button>
<el-button icon="el-icon-refresh" @click="">重置</el-button>
</div>
</div>
<div class="table-box">
<el-table
:data="list"
border
style="width: 100%">
<el-table-column type="index" width="50" align="center" label="序号"/>
<el-table-column label="通知类型" align="center" prop="orderNo" width="220"/>
<el-table-column label="通知内容" align="center" prop="terminal"/>
<el-table-column label="创建人" align="center" prop="terminal"/>
<el-table-column label="创建时间" align="center" prop="terminal"/>
<el-table-column label="发送时间" align="center" prop="terminal"/>
</el-table>
<div class="pagination-box">
<el-pagination
background
layout="prev, pager, next"
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@current-change="getList">
</el-pagination>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "order_Goods",
data() {
return {
List:[],
beginTime:'',
endTime:'',
queryParams: {
page: 1,
pageSize: 10,
},
total:0
}
},
methods:{
getList(){
},
goback(){
this.$router.go(-1)
}
}
}
</script>
<style scoped lang="scss">
.top_new{
display: flex;
justify-content: space-between;
background: #fff;
width: 100%;
border-radius: 8px;
box-sizing: border-box;
height: 64px;
margin-bottom: 5px;
box-sizing: border-box;
padding: 15px;
border-radius: 8px;
}
.table-box {
width: 100%;
height: 66vh;
overflow: auto;
background: #FFF;
box-sizing: border-box;
padding: 15px;
border-radius: 8px;
min-height: 78vh;
}
.hui_box{
box-sizing: border-box;
padding: 15px;
background: #f6f8f9;
}
.top-box{
width: 100%;
background: #fff;
box-sizing: border-box;
padding: 10px;
display: flex;
align-items: center;
font-weight: 400;
font-size: 12px;
color: #666666;
padding-left: 25px;
}
</style>

View File

@ -138,7 +138,7 @@
size="mini"
type="text"
@click="returnRecord(scope.row.id)"
>归还详情</el-button>
>170px</el-button>
</template>
</el-table-column>
</el-table>

View File

@ -1,5 +1,5 @@
<template>
<div class="app-container">
<div class="home-index">
<el-carousel height="230px">
<el-carousel-item v-for="(item,index) in bannerList" :key="index">
<div class="bannser">
@ -35,7 +35,7 @@
<div class="right-box">
<div class="title_">
<div>通知中心</div>
<div style="font-size: 12px;color: #BBBBBB;display: flex;align-items: center">更多 <i class="el-icon-arrow-right"></i> </div>
<div style="font-size: 12px;color: #BBBBBB;cursor: pointer; display: flex;align-items: center" @click="goList()" >更多 <i class="el-icon-arrow-right"></i> </div>
</div>
<!-- <div class="hang_" v-for="(item,index) in 4" :key="index" >到期提醒百业兴智慧油站系统将于2024年07月10日到期...</div>-->
<div class="hang_" v-for="(item,index) in noticeList" :key="index" >{{ item.notificationType }}{{ item.templateContent }}</div>
@ -55,19 +55,9 @@
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="getStoreAmount">
@blur="getStoreAmount">
</el-date-picker>
</div>
<!-- <div style="margin-right: 40px">-->
<!-- <el-select v-model="value" clearable placeholder="请选择" @change="chooseDept()">-->
<!-- <el-option-->
<!-- v-for="item in options"-->
<!-- :key="item.deptId"-->
<!-- :label="item.deptName"-->
<!-- :value="item.deptId">-->
<!-- </el-option>-->
<!-- </el-select>-->
<!-- </div>-->
</div>
<div class="d-s" style="margin-top: 15px">
<div class="k-box">
@ -75,34 +65,34 @@
<div class="sian"></div>
<div>油品销售金额/交易笔数</div>
</div>
<div class="num-size">{{ storeAmount.storeTotal || 0 }}/{{ storeAmount.refundTotal || 0 }}</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>
<div class="num-size">{{ storeAmount.tradeAmount || 0 }}/{{ storeAmount.tradeTotal || 0 }}</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>
<div class="num-size">{{ storeAmount.refundAmount || 0 }}/{{ storeAmount.refundTotal || 0 }}</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>
<div class="num-size">{{ storeAmount.averagePrice || 0 }}/{{ storeAmount.refundTotal || 0 }}</div>
<div class="num-size">{{ storeAmount.pointMallAmount || 0 }}/{{ storeAmount.pointMallNum || 0 }}</div>
</div>
</div>
<div class="hui-hang"></div>
<div class="d-s" >
<div>
<div class="h-tt" >活跃油站</div>
<div class="h-tt" >数据分析</div>
<div id="ccc" style="width: 300px;height: 200px; "></div>
</div>
<div class="h-r-ba"></div>
@ -252,6 +242,9 @@ export default {
// this.initChart()
},
methods:{
goList(){
this.$router.push('/notificationList/index')
},
//
getEmployeList() {
this.employeLoading = true
@ -804,7 +797,6 @@ export default {
.app-container{
width: 100%;
height: 100%;
/* height: 100vh; */
background: #f4f5f9;
}
.d-s{
@ -827,10 +819,10 @@ export default {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20px;
margin-top: 15px;
}
.left-box{
width: 73%;
width: 74%;
background: #FFFFFF;
border-radius: 10px 10px 10px 10px;
border: 1px solid #FFFFFF;
@ -842,7 +834,7 @@ export default {
padding: 15px;
}
.left-box-t{
width: 73%;
width: 74%;
box-sizing: border-box;
padding: 15px;
border-radius: 8px;
@ -869,6 +861,7 @@ export default {
box-sizing: border-box;
padding: 15px;
overflow: auto;
scrollbar-width: none;
}
.san-box{
width: 24%;
@ -880,9 +873,6 @@ export default {
margin-right: 15px;
box-sizing: border-box;
padding: 20px 40px;
//display: flex;
//align-items: center;
//justify-content: space-between;
}
.r-title{
font-weight: bold;
@ -1032,5 +1022,8 @@ export default {
width: 20%;
text-align: center;
}
}
.home-index{
}
</style>

View File

@ -3,6 +3,8 @@ package com.fuint.business.marketingActivity.cardValueRule.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuint.business.marketingActivity.cardValueRule.entity.CardValueRule;
import java.util.List;
/**
* 储值卡规则(CardValueRule)表服务接口
*
@ -10,6 +12,11 @@ import com.fuint.business.marketingActivity.cardValueRule.entity.CardValueRule;
* @since 2024-09-08 18:19:04
*/
public interface CardValueRuleService extends IService<CardValueRule> {
/**
* 根据店铺id查询储值卡规则的油品id列表
* @param storeId
* @return
*/
List<String> getOilIds(Integer storeId);
}

View File

@ -1,11 +1,19 @@
package com.fuint.business.marketingActivity.cardValueRule.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fuint.business.marketingActivity.cardValueRule.mapper.CardValueRuleMapper;
import com.fuint.business.marketingActivity.cardValueRule.entity.CardValueRule;
import com.fuint.business.marketingActivity.cardValueRule.service.CardValueRuleService;
import com.fuint.common.util.TokenUtil;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 储值卡规则(CardValueRule)表服务实现类
*
@ -15,5 +23,17 @@ import org.springframework.stereotype.Service;
@Service("cardValueRuleService")
public class CardValueRuleServiceImpl extends ServiceImpl<CardValueRuleMapper, CardValueRule> implements CardValueRuleService {
@Override
public List<String> getOilIds(Integer storeId) {
List<String> list = new ArrayList<String>();
LambdaQueryWrapper<CardValueRule> queryWrapper =new LambdaQueryWrapper<CardValueRule>();
queryWrapper.eq(CardValueRule::getStoreId, TokenUtil.getNowAccountInfo().getStoreId())
.eq(CardValueRule::getType,"0").last("limit 1");
CardValueRule one = baseMapper.selectOne(queryWrapper);
if (ObjectUtil.isNotEmpty(one) && ObjectUtil.isNotEmpty(one.getOilNumber())){
list = Arrays.asList(one.getOilNumber().split(","));
}
return list;
}
}

View File

@ -319,12 +319,22 @@ public class AllOrderInfoController extends BaseController {
@GetMapping("queryByPageUni")
public ResponseObject queryByPageUni(@RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
@Param("integralDetail") AllOrderInfo allOrderInfo) {
@Param("integralDetail") AllOrderInfoUniVo allOrderInfo) {
Page page = new Page(pageNo, pageSize);
IPage<AllOrderInfoUniVo> iPageList = this.allOrderInfoService.queryByPageUni(page, allOrderInfo);
return getSuccessResult(iPageList);
}
/**
* 获取消费金额(小程序)
* @param storeId
* @return
*/
@GetMapping("getConsumptionMoney")
public ResponseObject getConsumptionMoney(AllOrderInfoUniVo allOrderInfo){
return getSuccessResult(allOrderInfoService.getConsumptionMoney(allOrderInfo));
}
/**
* 根据订单号查询小程序
*

View File

@ -102,5 +102,5 @@ public interface AllOrderInfoMapper extends BaseMapper<AllOrderInfo> {
// IPage<CardValueOrdersVo> getBlanceANdOrder(Page page, @Param("order") CardValueOrdersDTO allOrderInfo);
IPage<AllOrderInfoUniVo> queryAllByLimit(Page page, @Param("allOrderInfo") AllOrderInfo allOrderInfo);
IPage<AllOrderInfoUniVo> queryAllByLimit(Page page, @Param("allOrderInfo") AllOrderInfoUniVo allOrderInfo);
}

View File

@ -138,4 +138,6 @@ public interface OilOrderMapper extends BaseMapper<OilOrder> {
List<OilOrderVo> selectOilsCount(@Param("oilOrderVo") OilOrderVo oilOrderVo,@Param("storeIds") List<Integer> storeIds);
OilOrderVo getInfoByOrderNo(String orderNo);
Double selectSumMoeny(@Param("orderNos") List<String> orderNos);
}

View File

@ -784,20 +784,36 @@
when type = 6 then '收银台订单'
when type = 7 then '挂账订单'
when type = 8 then 'pos'
else '未知' end as type_name
else '未知' end as typeName,
case when pay_type = 'ALIPAY' then '支付宝'
when pay_type = 'WECHAT' then '微信'
when pay_type = 'UNIONPAY' then '银联二维码'
when pay_type = 'CASH' then '现金'
when pay_type = 'APPLET_CODE' then '小程序码'
when pay_type = 'card_value' then '储值卡'
when pay_type = 'fule_card' then '囤油卡'
when pay_type = 'car_card_value' then '车队卡'
when pay_type = 'car_fule_card' then '车队囤油卡'
when pay_type = 'after_pay' then '挂账'
else '未知' end as payType
from all_order_info a
join mt_store m
on a.store_id = m.id
<where>
a.status = "paid"
<if test="allOrderInfo.storeId != null">
a.store_id = #{allOrderInfo.storeId}
and a.store_id = #{allOrderInfo.storeId}
</if>
<if test="allOrderInfo.userId != null">
and a.user_id = #{allOrderInfo.userId}
</if>
<if test="allOrderInfo.status != null">
and a.status = #{allOrderInfo.status}
<if test="allOrderInfo.startTime != null">
and a.pay_time between #{allOrderInfo.startTime} and #{allOrderInfo.endTime}
</if>
<if test="allOrderInfo.content != null and allOrderInfo.content != ''">
and a.content like concat('%',#{allOrderInfo.content},'%')
</if>
</where>
</select>
<select id="getOneByOrderId" resultType="com.fuint.business.order.vo.AllOrderActivityVo">

View File

@ -797,4 +797,11 @@
</where>
limit 1
</select>
<select id="selectSumMoeny" resultType="java.lang.Double">
select sum(pay_amount) from oil_order
where order_no in
<foreach collection="orderNos" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
</mapper>

View File

@ -7,10 +7,7 @@ import com.fuint.business.order.dto.AllOrderInfoDto;
import com.fuint.business.order.entity.AllOrderInfo;
import com.fuint.business.order.entity.CashierOrder;
import com.fuint.business.order.entity.HandoverRecord;
import com.fuint.business.order.vo.AllOrderActivityVo;
import com.fuint.business.order.vo.AllOrderInfoUniVo;
import com.fuint.business.order.vo.AllOrderInfoVo;
import com.fuint.business.order.vo.CardBalanceChangeVo;
import com.fuint.business.order.vo.*;
import com.fuint.framework.exception.BusinessCheckException;
import com.fuint.system.dept.vo.SysDeptVo;
import org.springframework.transaction.annotation.Transactional;
@ -153,13 +150,27 @@ public interface AllOrderInfoService {
*/
Map<String ,Object> getDataBoard(Map<String,String> map);
/**
* 油站首页数据分析
* @param map
* @return
*/
List<HomeDataAnalysisVo> getDataAnalysis(Map<String, String> map);
/**
* 消费记录
* @param page
* @param allOrderInfo
* @return
*/
IPage<AllOrderInfoUniVo> queryByPageUni(Page page, AllOrderInfo allOrderInfo);
IPage<AllOrderInfoUniVo> queryByPageUni(Page page, AllOrderInfoUniVo allOrderInfo);
/**
* 获取消费金额小程序
* @param storeId
* @return
*/
Double getConsumptionMoney(AllOrderInfoUniVo allOrderInfo);
// 根据订单id 查询订单 并且有且只有一个关联油品订单
AllOrderActivityVo getOneByOrderId(Integer orderId);

View File

@ -1,6 +1,7 @@
package com.fuint.business.order.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
@ -31,7 +32,9 @@ import com.fuint.business.order.vo.*;
import com.fuint.business.order.vo.Excel.*;
import com.fuint.business.petrolStationManagement.entity.OilGun;
import com.fuint.business.petrolStationManagement.entity.OilName;
import com.fuint.business.petrolStationManagement.entity.OilNumber;
import com.fuint.business.petrolStationManagement.entity.OilTracking;
import com.fuint.business.petrolStationManagement.mapper.OilNumberMapper;
import com.fuint.business.petrolStationManagement.service.OilGunService;
import com.fuint.business.petrolStationManagement.service.OilNameService;
import com.fuint.business.petrolStationManagement.service.OilTankService;
@ -86,6 +89,8 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
@Resource
AllOrderInfoMapper allOrderInfoMapper;
@Autowired
OilNumberMapper oilNumberMapper;
@Override
@ -150,6 +155,7 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
row = baseMapper.insert(allOrderInfo);
return row;
}
// 支付通道分析 下面列表数据
public IPage<AllOrderInfoVo> getFenxiByDaili(Page page, AllOrderInfo allOrderInfo) {
if (ObjectUtil.isEmpty(allOrderInfo.getDeptId())) {
@ -213,6 +219,7 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
return fenxiByDailiTypeBydata;
}
// 支付通道分析 上面 统计数据
@Override
public Map<String, Object> getFenxiByDailiBydata(AllOrderInfo allOrderInfo) {
@ -1616,6 +1623,8 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
@Override
public Map<String, Object> getDataBoard(Map<String, String> map) {
map.put("startTime", map.get("params[beginTime]"));
map.put("endTime", map.get("params[endTime]"));
Map<String, Object> map1 = new HashMap<>();
// 油品销售金额
Double oilAmount = 0.0;
@ -1642,6 +1651,65 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
oilAmount = Double.valueOf(sumAndNum.get("payMoney").toString());
oilNum = Integer.valueOf(sumAndNum.get("allNum").toString());
String startTime = map.get("startTime");
String endTime = map.get("endTime");
LambdaQueryWrapper<AllOrderInfo> queryWrapper = new LambdaQueryWrapper<AllOrderInfo>()
.eq(AllOrderInfo::getStatus, "paid")
.eq(AllOrderInfo::getStoreId, TokenUtil.getNowAccountInfo().getStoreId())
.like(AllOrderInfo::getContent, "充值");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
queryWrapper.between(AllOrderInfo::getCreateTime, startTime, endTime);
}
//查询会员充值信息
List<AllOrderInfo> allOrderInfos = baseMapper.selectList(queryWrapper);
//会员充值笔数
userRechargeNum = allOrderInfos.size();
//会员充值金额
userRechargeAmount = allOrderInfos.stream().mapToDouble(AllOrderInfo::getPayMoney).sum();
LambdaQueryWrapper<AllOrderInfo> proQueryWrapper = new LambdaQueryWrapper<AllOrderInfo>()
.eq(AllOrderInfo::getStatus, "paid")
.eq(AllOrderInfo::getStoreId, TokenUtil.getNowAccountInfo().getStoreId())
.in(AllOrderInfo::getType, "2", "6");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
proQueryWrapper.between(AllOrderInfo::getCreateTime, startTime, endTime);
}
//查询便利店信息
allOrderInfos = baseMapper.selectList(proQueryWrapper);
//便利店笔数
minimartNum = allOrderInfos.size();
List<String> orderNos = allOrderInfos.stream()
.filter(order -> "6".equals(order.getType()))
.map(AllOrderInfo::getOrderNo).collect(Collectors.toList());
//总金额
minimartAmount = allOrderInfos.stream().mapToDouble(AllOrderInfo::getPayMoney).sum();
if (CollectionUtil.isNotEmpty(orderNos)) {
//根据订单号集合查询油品总金额
Double oilMoney = oilOrderMapper.selectSumMoeny(orderNos);
//便利店金额
minimartAmount = minimartAmount - oilMoney;
DecimalFormat df = new DecimalFormat("#.00");
String formattedResult = df.format(minimartAmount);
minimartAmount = Double.parseDouble(formattedResult);
}
LambdaQueryWrapper<AllOrderInfo> pointQueryWrapper = new LambdaQueryWrapper<AllOrderInfo>()
.eq(AllOrderInfo::getStatus, "paid")
.eq(AllOrderInfo::getStoreId, TokenUtil.getNowAccountInfo().getStoreId())
.eq(AllOrderInfo::getType, "4");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
pointQueryWrapper.between(AllOrderInfo::getCreateTime, startTime, endTime);
}
//查询积分商城信息
allOrderInfos = baseMapper.selectList(pointQueryWrapper);
pointMallNum = allOrderInfos.size();
pointMallAmount = allOrderInfos.stream().mapToDouble(order -> order.getPayMoney() == null ? 0 : order.getPayMoney()).sum();
map1.put("oilAmount", oilAmount);
map1.put("oilNum", oilNum);
map1.put("userRechargeAmount", userRechargeAmount);
@ -1654,6 +1722,136 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
return map1;
}
/**
* 油站首页数据分析
*
* @param map
* @return
*/
@Override
public List<HomeDataAnalysisVo> getDataAnalysis(Map<String, String> map) {
List<HomeDataAnalysisVo> list = new ArrayList<>();
String startTime = map.get("startTime");
String endTime = map.get("endTime");
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
//查询所有油品
List<OilNumber> oilNumbers = oilNumberMapper.selectList(new LambdaQueryWrapper<OilNumber>()
.eq(OilNumber::getStoreId, nowAccountInfo.getStoreId())
.eq(OilNumber::getState, "1")
.eq(OilNumber::getIfDelete, "0"));
LambdaQueryWrapper<OilOrder> oilOrderQuery = new LambdaQueryWrapper<OilOrder>();
oilOrderQuery.eq(OilOrder::getStoreId, nowAccountInfo.getStoreId())
.eq(OilOrder::getUserId, nowAccountInfo.getId())
.eq(OilOrder::getOrderStatus, "paid");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
oilOrderQuery.between(OilOrder::getCreateTime, startTime, endTime);
}
List<OilOrder> oilOrders = oilOrderMapper.selectList(oilOrderQuery);
//油号之间占比
for (OilNumber oilNumber : oilNumbers) {
HomeDataAnalysisVo homeDataAnalysisVo = new HomeDataAnalysisVo();
homeDataAnalysisVo.setName(oilNumber.getOilName());
homeDataAnalysisVo.setType(1);
List<OilOrder> oilList = new ArrayList<>();
for (OilOrder oilOrder : oilOrders) {
if (oilNumber.getOilName().equals(oilOrder.getOils())) {
oilList.add(oilOrder);
}
}
DecimalFormat df = new DecimalFormat("#.00");
String formattedResult = df.format(oilList.size());
homeDataAnalysisVo.setValue(Double.parseDouble(formattedResult) / oilNumbers.size());
list.add(homeDataAnalysisVo);
}
//查询订单表
LambdaQueryWrapper<AllOrderInfo> allOrderInfoLambdaQueryWrapper = new LambdaQueryWrapper<AllOrderInfo>();
allOrderInfoLambdaQueryWrapper.eq(AllOrderInfo::getStoreId, nowAccountInfo.getStoreId())
.eq(AllOrderInfo::getStoreId, nowAccountInfo.getStoreId())
.eq(AllOrderInfo::getStatus, "paid");
if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
allOrderInfoLambdaQueryWrapper.between(AllOrderInfo::getCreateTime, startTime, endTime);
}
List<AllOrderInfo> allOrderInfos = baseMapper.selectList(allOrderInfoLambdaQueryWrapper);
Integer oilAllOrderInfos = 0;
Integer productionAllOrderInfos = 0;
//油品交易占比
Double shareOfOilTransactions = 0.0;
//非油品交易占比
Double shareOfNonOilTransactions = 0.0;
for (AllOrderInfo allOrderInfo : allOrderInfos) {
if ("1".equals(allOrderInfo.getType())) {
oilAllOrderInfos += 1;
} else if ("2".equals(allOrderInfo.getType()) || "3".equals(allOrderInfo.getType()) || "4".equals(allOrderInfo.getType()) || "5".equals(allOrderInfo.getType())) {
productionAllOrderInfos += 1;
}
}
shareOfOilTransactions = Double.parseDouble(String.valueOf(oilAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)));
shareOfNonOilTransactions = Double.parseDouble(String.valueOf(productionAllOrderInfos / (oilAllOrderInfos + productionAllOrderInfos)));
HomeDataAnalysisVo oilhomeDataAnalysisVo = new HomeDataAnalysisVo();
oilhomeDataAnalysisVo.setName("油品交易占比");
oilhomeDataAnalysisVo.setType(2);
oilhomeDataAnalysisVo.setValue(shareOfOilTransactions);
list.add(oilhomeDataAnalysisVo);
HomeDataAnalysisVo noOilhomeDataAnalysisVo = new HomeDataAnalysisVo();
noOilhomeDataAnalysisVo.setName("非油品交易占比");
noOilhomeDataAnalysisVo.setType(2);
noOilhomeDataAnalysisVo.setValue(shareOfNonOilTransactions);
list.add(noOilhomeDataAnalysisVo);
//会员充值占比 便利店交易占比 油品交易占比 积分商城交易占比
Integer mtUser = 0;
Integer product = 0;
Integer oilRecharge = 0;
Integer pointMall = 0;
for (AllOrderInfo allOrderInfo : allOrderInfos) {
if ("3".equals(allOrderInfo.getType()) || "5".equals(allOrderInfo.getType())) {
mtUser += 1;
} else if ("2".equals(allOrderInfo.getType())) {
product += 1;
} else if ("1".equals(allOrderInfo.getType())) {
oilRecharge += 1;
} else if ("4".equals(allOrderInfo.getType())) {
pointMall += 1;
} else if ("6".equals(allOrderInfo.getType())) {
product += 1;
oilRecharge += 1;
}
}
HomeDataAnalysisVo mtUserVo = new HomeDataAnalysisVo();
mtUserVo.setName("会员充值占比");
mtUserVo.setType(3);
mtUserVo.setValue(Double.parseDouble(String.valueOf(mtUser / allOrderInfos.size())));
list.add(mtUserVo);
HomeDataAnalysisVo productVo = new HomeDataAnalysisVo();
productVo.setName("商品交易占比");
productVo.setType(3);
productVo.setValue(Double.parseDouble(String.valueOf(product / allOrderInfos.size())));
list.add(productVo);
HomeDataAnalysisVo oilRechargeVo = new HomeDataAnalysisVo();
oilRechargeVo.setName("油品充值占比");
oilRechargeVo.setType(3);
oilRechargeVo.setValue(Double.parseDouble(String.valueOf(oilRecharge / allOrderInfos.size())));
list.add(oilRechargeVo);
HomeDataAnalysisVo pointMallVo = new HomeDataAnalysisVo();
pointMallVo.setName("积分商城交易占比");
pointMallVo.setType(3);
pointMallVo.setValue(Double.parseDouble(String.valueOf(pointMall / allOrderInfos.size())));
list.add(pointMallVo);
return list;
}
/**
* 消费记录
*
@ -1662,13 +1860,50 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
* @return
*/
@Override
public IPage<AllOrderInfoUniVo> queryByPageUni(Page page, AllOrderInfo allOrderInfo) {
public IPage<AllOrderInfoUniVo> queryByPageUni(Page page, AllOrderInfoUniVo allOrderInfo) {
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
allOrderInfo.setUserId(nowAccountInfo.getId());
allOrderInfo.setStatus("paid");
if (ObjectUtil.isNotEmpty(allOrderInfo.getStartTime())) {
DateTime parse = DateUtil.parse(allOrderInfo.getStartTime(), "yyyy-MM");
allOrderInfo.setStartTime(DateUtil.beginOfMonth(parse).toString());
allOrderInfo.setEndTime(DateUtil.endOfMonth(parse).toString());
}
// allOrderInfo.setStatus("paid");
return this.allOrderInfoMapper.queryAllByLimit(page, allOrderInfo);
}
/**
* 获取消费金额小程序
*
* @param
* @return
*/
@Override
public Double getConsumptionMoney(AllOrderInfoUniVo allOrderInfo) {
Integer id = TokenUtil.getNowAccountInfo().getId();
LambdaQueryWrapper<AllOrderInfo> allOrderInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
allOrderInfoLambdaQueryWrapper.eq(AllOrderInfo::getStoreId, allOrderInfo.getStoreId())
.eq(AllOrderInfo::getStatus, "paid")
.eq(AllOrderInfo::getUserId, id);
if (ObjectUtil.isNotEmpty(allOrderInfo.getStartTime())) {
DateTime parse = DateUtil.parse(allOrderInfo.getStartTime(), "yyyy-MM");
allOrderInfo.setStartTime(DateUtil.beginOfMonth(parse).toString());
allOrderInfo.setEndTime(DateUtil.endOfMonth(parse).toString());
allOrderInfoLambdaQueryWrapper.between(AllOrderInfo::getPayTime, allOrderInfo.getStartTime(), allOrderInfo.getEndTime());
}
if (ObjectUtil.isNotEmpty(allOrderInfo.getContent())) {
allOrderInfoLambdaQueryWrapper.like(AllOrderInfo::getContent, allOrderInfo.getContent());
}
List<AllOrderInfo> paid = baseMapper.selectList(allOrderInfoLambdaQueryWrapper);
//计算实付金额
double sum = paid.stream()
.filter(order -> !Optional.ofNullable(order.getContent()).orElse("").contains("充值"))
.mapToDouble(order -> order.getPayMoney() != null ? order.getPayMoney() : 0.0)
.sum();
return sum;
}
@Override
public AllOrderActivityVo getOneByOrderId(Integer orderId) {
AllOrderActivityVo allOrderInfoVo = allOrderInfoMapper.getOneByOrderId(orderId);
@ -1737,6 +1972,7 @@ public class AllOrderInfoServiceImpl extends ServiceImpl<AllOrderInfoMapper, All
/**
* 将支付金额转换为万圆
*
* @param payMoney
*/
public Double convertPayMoneyToWanYuan(Double payMoney) {

View File

@ -41,6 +41,7 @@ import com.fuint.business.marketingActivity.cardValue.entity.CardValueRecord;
import com.fuint.business.marketingActivity.cardValue.mapper.CardValueRecordMapper;
import com.fuint.business.marketingActivity.cardValueChildrens.entity.CardValudChildrens;
import com.fuint.business.marketingActivity.cardValueChildrens.service.CardValudChildrensService;
import com.fuint.business.marketingActivity.cardValueRule.service.CardValueRuleService;
import com.fuint.business.marketingActivity.favorableRecords.entity.FavorableRecords;
import com.fuint.business.marketingActivity.favorableRecords.service.FavorableRecordsService;
import com.fuint.business.member.mapper.LJStaffMapper;
@ -71,10 +72,7 @@ import com.fuint.business.userManager.entity.ChainStoreConfig;
import com.fuint.business.userManager.entity.LJUser;
import com.fuint.business.userManager.entity.LJUserGrade;
import com.fuint.business.userManager.entity.UserBalance;
import com.fuint.business.userManager.service.ChainStoreConfigService;
import com.fuint.business.userManager.service.LJUserGradeService;
import com.fuint.business.userManager.service.LJUserService;
import com.fuint.business.userManager.service.UserBalanceService;
import com.fuint.business.userManager.service.*;
import com.fuint.business.userManager.vo.LJUserVo;
import com.fuint.common.dto.AccountInfo;
import com.fuint.common.util.StringUtils;
@ -196,6 +194,10 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
@Autowired
@Lazy
private PayCenterService payCenterService;
@Autowired
private IMtUserFuelService userFuelService;
@Autowired
private CardValueRuleService cardValueRuleService;
@Override
public IPage<OilOrder> selectOilOrderList(Page page, OilOrder order) {
@ -490,6 +492,43 @@ public class OilOrderServiceImpl extends ServiceImpl<OilOrderMapper, OilOrder> i
return orders;
}
// 查看会员储值卡余额是否足够付款
if (payType.equals("card_value")){
if (ObjectUtil.isEmpty(userId)){
orders.put("error", "请先选择会员信息");
return orders;
}
UserBalance userBalance = userBalanceService.selectUserBalance(userId, nowAccountInfo.getChainStoreId());
if (userBalance.getCardBalance()<oilActualPay){
orders.put("error", "余额不足,请分开支付");
return orders;
}
List<String> oilIds = cardValueRuleService.getOilIds(storeId);
boolean flag = false;
for (String oilId : oilIds) {
if (oilId.equals(JSONObject.parseObject(oilOrder).get("oils").toString())){
flag = true;
}
}
if (!flag) {
orders.put("error", "此油品不支持储值卡支付");
return orders;
}
}
// 查看会员囤油卡余额是否足够付款
if (payType.equals("fule_card")){
if (ObjectUtil.isEmpty(userId)){
orders.put("error", "请先选择会员信息");
return orders;
}
Double fuelAmount = userFuelService.selectByUserIdAndOilId(userId, Integer.valueOf(JSONObject.parseObject(oilOrder).get("oils").toString()), storeId);
if (fuelAmount<oilActualPay){
orders.put("error", "余额不足,请分开支付");
return orders;
}
}
// 添加商品订单信息
if (!goodsOrder.equals("[]")) {
LJOrder ljOrder = new LJOrder();

View File

@ -8,4 +8,6 @@ import weixin.popular.bean.pay.OrderInfo;
public class AllOrderInfoUniVo extends AllOrderInfo {
private String typeName;
private String storeName;
private String startTime;
private String endTime;
}

View File

@ -0,0 +1,10 @@
package com.fuint.business.order.vo;
import lombok.Data;
@Data
public class HomeDataAnalysisVo {
private String name;
private Double value;
private Integer type;
}

View File

@ -12,5 +12,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @since 2024-09-24
*/
public interface IMtUserFuelService extends IService<MtUserFuel> {
/**
* 根据用户id和油号id查询油量信息
* @param userId
* @param oilId
* @return
*/
Double selectByUserIdAndOilId(Integer userId, Integer oilId, Integer storeId);
}

View File

@ -1,5 +1,7 @@
package com.fuint.business.userManager.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fuint.business.userManager.entity.MtUserFuel;
import com.fuint.business.userManager.mapper.MtUserFuelMapper;
import com.fuint.business.userManager.service.IMtUserFuelService;
@ -17,4 +19,15 @@ import org.springframework.stereotype.Service;
@Service
public class MtUserFuelServiceImpl extends ServiceImpl<MtUserFuelMapper, MtUserFuel> implements IMtUserFuelService {
@Override
public Double selectByUserIdAndOilId(Integer userId, Integer oilId, Integer storeId) {
Double fuelAmount = 0.0;;
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("mt_user_id", userId);
queryWrapper.eq("oil_name", oilId);
queryWrapper.eq("store_id", storeId);
MtUserFuel mtUserFuel = baseMapper.selectOne(queryWrapper);
if (ObjectUtil.isNotEmpty(mtUserFuel) && ObjectUtil.isNotEmpty(mtUserFuel.getFuelAmount())) fuelAmount = mtUserFuel.getFuelAmount();
return fuelAmount;
}
}

View File

@ -4,8 +4,8 @@ env.profile=dev
#env.properties.path=D:/workspaces/oil-stations/fuintBackend/configure/
#env.properties.path=F:/work/oilSystem/fuintBackend/configure/
#env.properties.path=D:/oil/new-oil/oilSystem/fuintBackend/configure/
#env.properties.path=D:/code/bulidmap/oil-station/fuintBackend/configure
env.properties.path=D:/Code/yuzhan/oil-station/fuintBackend/configure
env.properties.path=D:/code/bulidmap/oil-station/fuintBackend/configure
#env.properties.path=D:/Code/yuzhan/oil-station/fuintBackend/configure
#env.properties.path=/www/wwwroot/shenlanshuke/oilAdmin/
# \u6570\u636E\u5E93\u914D\u7F6E
@ -18,7 +18,6 @@ spring.task.scheduling.pool.size=5
logging.level.com.fuint=info
multipart.max-file-size=20mb
multipart.max-request-size=20mb
# \u6700\u5927\u4E0A\u4F20\u6587\u4EF6
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

View File

@ -230,7 +230,7 @@
<div slot="header" class="clearfix">
<div style="position: relative;">
<div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
<h2>单据号{{record.orderNo}}</h2>
<h2>单据号123{{record.orderNo}}</h2>
</div>
</div>
<br>

View File

@ -167,36 +167,27 @@
size="55%"
:before-close="handleClose">
<div style="display: grid; place-items: center;">
<el-card style="background-color: #f5f5f5;width: 90%">
<div slot="header" class="clearfix">
<div style="position: relative;">
<div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
<h2>单据号{{record.orderNo}}</h2>
</div>
<div class="top_pop">
<div class="wrap_box">
<div class="three_box">
<div class="or_num">订单号{{record.orderNo}}</div>
<div class="or_num">联系电话{{record.contactMobile}}</div>
</div>
<br>
<div style="display: flex; justify-content: space-between;">
<span>操作员工</span>
<span>{{ record.realName }}</span>
<div class="three_box">
<div class="or_num">挂账单位{{record.unitName}}</div>
<div class="or_num">操作人{{ record.realName }}</div>
</div>
<div class="three_box">
<div class="or_num">挂账人{{record.personCredit}}</div>
<div class="or_num">操作账号xxxx-xx-xx xx:x</div>
</div>
</div>
<div >
<div style="display: flex; justify-content: space-between;">
<span>挂账单位</span>
<span>{{record.unitName}}</span>
</div>
<div style="display: flex; justify-content: space-between;margin: 10px 0">
<span>挂账人</span>
<span>{{record.personCredit}}</span>
</div>
<div style="display: flex; justify-content: space-between;">
<span>联系电话</span>
<span>{{record.contactMobile}}</span>
</div>
</div>
</el-card>
<el-card style="margin-top: 15px;width: 90%">
</div>
<div style="margin-top: 15px;width: 96%">
<el-table ref="tables"
border
v-loading="loading"
:data="returnRecordList">
<el-table-column label="单据号" align="center" prop="orderNo" width="200"></el-table-column>
@ -240,7 +231,7 @@
</div>
</el-card>
</div>
</div>
</el-drawer>
</div>
@ -577,4 +568,18 @@ import {exportExcelCashierApi, exportExcelHangBillApi} from "@/api/order/exportE
padding: 15px;
height: 85vh;
}
.top_pop{
width: 96%;
}
.wrap_box{
display: flex;
flex-wrap: wrap;
}
.three_box{
width: 33%;
}
.or_num{
font-size: 14px;
margin-bottom: 15px;
}
</style>

View File

@ -3,8 +3,11 @@
<view class="Candywrapper">
<view class="card_box">
<view style="margin: 13px 0px;">当前积分</view>
<view class="r-num">{{ cardBalance.points || 0 }}</view>
<view >消费金额</view>
<view class="r-num">{{ cardBalance || 0 }}</view>
<view style="margin-top: 10rpx;">
<view>消费次数: {{ total || 0 }}</view>
</view>
</view>
<view class="tab-bs">
<view class="w_box" @click="show1 = true">类型筛选
@ -21,14 +24,13 @@
</view>
<view style="width: 85%;">
<view class="right-box">
<view class="l-text">{{ item.changeReason }}</view>
<view class="r-text" v-if="item.changeType==1">{{ item.pointsChange }}</view>
<view class="r-text" v-else-if="item.changeType==0">-{{ item.pointsChange }}</view>
<view class="r-text" v-else>0</view>
<view class="l-text">{{ item.typeName }}</view>
<view class="r-text" v-if="item.content && item.content.includes('充值')">{{ item.payMoney }}</view>
<view class="r-text" v-else>-{{ item.payMoney }}</view>
</view>
<view class="right-box">
<view class="">会员积分</view>
<view class="">余额{{ item.currentPoints || 0 }}</view>
<view class="">{{ item.payType }}</view>
<!-- <view class="">余额{{ item.currentPoints || 0 }}</view>-->
</view>
<view class="right-box">
<view class="">{{ item.storeName }}</view>
@ -98,7 +100,7 @@ export default {
pageNo: 1,
pageSize: 10
},
cardBalance: {},
cardBalance: 0,
show: false,
show1: false,
value1: Number(new Date()),
@ -107,45 +109,20 @@ export default {
label: '全部类型',
value: null
}, {
label: '消费有礼',
value: ''
label: '油品',
value: '订单'
}, {
label: '充值有礼',
value: ''
label: '会员充值',
value: '充值'
}, {
label: '积分兑换',
value: ''
}, {
label: '开卡有礼',
value: ''
}, {
label: '邀请有礼',
value: ''
}, {
label: '生日有礼',
value: ''
}, {
label: '推荐会员充值有礼',
value: ''
},
{
label: '推荐会员推荐有礼',
value: ''
}, {
label: '每日签到',
value: ''
}, {
label: '大转盘抽奖',
value: ''
}, {
label: '九宫格抽奖',
value: ''
}
]
value: '积分'
}]
],
queryParams: {
pageNo: 1,
pageSize: 30,
content: "",
type: "",
storeId: uni.getStorageSync("storeId"),
changeReason: "",
@ -183,10 +160,11 @@ export default {
methods: {
//
getUserBalance() {
console.log('this.queryParams:', this.queryParams.storeId)
request({
url: '/business/userManager/user/getUserBalanceApplet',
url: 'business/allOrderInfo/getConsumptionMoney',
method: 'get',
params: this.query
params: this.queryParams
}).then(res => {
if (res.code == 200) {
this.cardBalance = res.data
@ -194,8 +172,9 @@ export default {
})
},
getList() {
console.log('this.queryParams:', this.queryParams)
request({
url: '/business/integral/integralDetail/queryByPageUni',
url: '/business/allOrderInfo/queryByPageUni',
method: 'get',
params: this.queryParams
}).then(res => {
@ -208,11 +187,13 @@ export default {
confirm(e) {
this.queryParams.pageNo = 1
if (e.value[0] == '全部类型') {
this.queryParams.type = null
this.queryParams.content = null
} else {
this.queryParams.type = e.value[0].type
this.queryParams.content = e.value[0].value
}
console.log('this.queryParams:', this.queryParams.content)
this.getList()
this.getUserBalance()
this.show1 = false
},
cancel() {
@ -230,7 +211,9 @@ export default {
confirm1(e) {
this.queryParams.startTime = this.timestampToString(e.value)
this.queryParams.pageNo = 1
console.log('this.queryParams:', this.queryParams)
this.getList()
this.getUserBalance()
this.show = false
},
cancel1() {