完善首页数据

This commit is contained in:
liuyingfang 2024-03-15 13:47:01 +08:00
parent 268d211f5b
commit f783116bc8
10 changed files with 270 additions and 49 deletions

View File

@ -10,7 +10,7 @@ import lombok.Getter;
@AllArgsConstructor
public enum PayTypeEnum {
CASH("cash","现金"),BANK("bank","银行卡"),SCANCODE("scanCode","扫码支付"),
DEPOSIT("deposit","储值"),ARREARS("arrears","挂单");
DEPOSIT("deposit","储值"),ARREARS("arrears","挂单"),WXLIST("wx_lite","微信小程序支付");
private String type;

View File

@ -0,0 +1,60 @@
package cn.ysk.cashier.pojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* 访问量相关
* @author 12847
*/
@Entity
@Data
@Table(name = "tb_token")
public class TbToken implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "`id`")
@ApiModelProperty(value = "id")
private Integer id;
/**
* shopId
*/
@Column(name = "account_id")
private Integer accountId;
/**
* 成员Id
*/
@Column(name = "staff_id")
private Integer staffId;
/**
* 渠道
*/
@Column(name = "client_type")
private String clientType;
/**
* token
*/
@Column(name = "token")
private String token;
/**
* ip
*/
@Column(name = "ip")
private String ip;
/**
* 状态 1 登录 2 结束运营 3 关班
*/
@Column(name = "status")
private Integer status;
@Column(name = "create_time")
private Date createTime;
@Column(name = "update_time")
private Date updateTime;
}

View File

@ -28,15 +28,42 @@ public interface ShopUserDutyDetailRepository extends JpaRepository<TbShopUserDu
,@Param("currentPage") Integer currentPage);
@Query(value = "SELECT" +
" SUM(product.num),SUM(user.amount)" +
" FROM" +
" tb_shop_user_duty_detail AS product" +
" LEFT JOIN tb_shop_user_duty AS user ON product.duty_id = USER.id " +
"WHERE user.shop_id = :shopId" +
" AND user.login_time BETWEEN :startTime AND :endTime", nativeQuery = true)
@Query(value = "SELECT\n" +
"\tcount( 0 ) \n" +
"FROM\n" +
"\t(\n" +
"\tSELECT\n" +
"\t\tproduct.product_name \n" +
"\tFROM\n" +
"\t\ttb_shop_user_duty_detail AS product\n" +
"\t\tLEFT JOIN tb_shop_user_duty AS USER ON product.duty_id = USER.id \n" +
"\tWHERE\n" +
"\t\tUSER.shop_id = :shopId \n" +
"\t\tAND USER.login_time BETWEEN :startTime \n" +
"\t\tAND :endTime \n" +
"\tGROUP BY\n" +
"\tproduct.product_id \n" +
"\t) AS total", nativeQuery = true)
Tuple searchCount(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
@Query(value = "SELECT\n" +
"\tsum( sudd.num ),\n" +
"\tb.amount \n" +
"FROM\n" +
"\ttb_shop_user_duty_detail sudd\n" +
"\tINNER JOIN tb_shop_user_duty sud ON sudd.duty_id = sud.id\n" +
"\tLEFT JOIN ( SELECT shop_id, sum( amount ) AS amount FROM tb_shop_user_duty WHERE shop_id = :shopId AND login_time BETWEEN :startTime AND :endTime ) b ON sud.shop_id = b.shop_id \n" +
"WHERE\n" +
"\tsud.shop_id = :shopId \n" +
"\tAND sud.login_time BETWEEN :startTime \n" +
"\tAND :endTime \n" +
"GROUP BY\n" +
"\tb.shop_id", nativeQuery = true)
Tuple searchByDutyIdSum(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
@Query(value = "SELECT" +
" SUM(product.num),SUM(product.amount)" +
" FROM" +
@ -46,4 +73,24 @@ public interface ShopUserDutyDetailRepository extends JpaRepository<TbShopUserDu
" AND user.login_time BETWEEN :startTime AND :endTime" +
" group by user.trade_day", nativeQuery = true)
List<Object[]> searchByDayToAmount(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
@Query(value = "SELECT" +
" SUM(product.num),user.trade_day" +
" FROM" +
" tb_shop_user_duty_detail AS product" +
" LEFT JOIN tb_shop_user_duty AS user ON product.duty_id = USER.id " +
"WHERE user.shop_id = :shopId" +
" AND user.login_time BETWEEN :startTime AND :endTime" +
" group by user.trade_day", nativeQuery = true)
List<Object[]> searchByDutyGroup(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
@Query(value = "SELECT" +
" SUM(user.amount),user.trade_day" +
" FROM" +
" tb_shop_user_duty AS user " +
" WHERE user.shop_id = :shopId" +
" AND user.login_time BETWEEN :startTime AND :endTime" +
" group by user.trade_day", nativeQuery = true)
List<Object[]> searchByGroup(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
}

View File

@ -27,7 +27,6 @@ public interface ShopUserDutyRepository extends JpaRepository<TbShopUserDuty, In
"\t`tb_shop_user_duty` \n" +
"WHERE\n" +
"\tshop_id = :shopId \n" +
"\tAND return_amount < 0 \n" +
"\tAND login_time BETWEEN :startTime AND :endTime \n" +
"GROUP BY\n" +
"\tshop_id,\n" +

View File

@ -0,0 +1,29 @@
package cn.ysk.cashier.repository;
import javax.persistence.Tuple;
import cn.ysk.cashier.pojo.TbShopPayType;
import cn.ysk.cashier.pojo.TbToken;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.Date;
import java.util.List;
/**
* @author lyf
*/
public interface TbTokenRepository extends JpaRepository<TbToken, Integer>, JpaSpecificationExecutor<TbToken> {
@Query("select count(0) from TbToken token where token.accountId=:shopId")
Tuple countByAccountId(@Param("shopId") Integer shopId);
@Query("select count(0) from TbToken token where token.accountId=:shopId " +
"and token.createTime BETWEEN :startTime and :endTime")
Tuple countByAccountId(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
@Query(value = "select count(0),DATE_FORMAT(create_time,'%Y-%m-%d')from tb_token where account_id=:shopId " +
"and create_time BETWEEN :startTime and :endTime group by DATE_FORMAT( create_time, '%Y-%m-%d') ",nativeQuery = true)
List<Object[]> countByMonth(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
}

View File

@ -23,6 +23,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
@ -43,10 +44,17 @@ public interface TbProductSkuRepository extends JpaRepository<TbProductSku, Inte
@Query("DELETE FROM TbProductSku sku WHERE sku.productId = :productId")
Integer deleteByProductId(@Param("productId") String productId);
// @Insert("INSERT INTO TbProductSku sku(sku.shopId,sku.barCode,sku.productId,sku.originPrice,sku.costPrice,sku.memberPrice,sku.salePrice,sku.stockNumber,sku.firstShared) " +
// "VALUES (#{item.shopId},#{item.barCode},#{item.productId},#{item.originPrice},#{item.costPrice},#{item.memberPrice},#{item.salePrice},#{item.stockNumber},#{sku.firstShared}) ")
// void findById(@Param("item") List<TbProductSku> skuList);
@Query("SELECT sku FROM TbProductSku sku WHERE sku.barCode = :barCode")
TbProductSku searchBarCode(@Param("barCode")String barCode);
@Transactional
@Modifying
@Query("update FROM TbProductSku sku set sku.costPrice=:costPrice,sku.coverImg =:coverImg, " +
"sku.firstShared=:firstShared,sku.memberPrice = :memberPrice,sku.originPrice = :originPrice, " +
"sku.salePrice=:salePrice,sku.specSnap =:specSnap,sku.stockNumber = :stockNumber " +
"WHERE sku.barCode = :barCode and sku.id =:id")
Integer updateByBarCode(@Param("barCode") String barCode, @Param("costPrice")BigDecimal costPrice, @Param("coverImg")String coverImg,
@Param("firstShared")BigDecimal firstShared,@Param("memberPrice")BigDecimal memberPrice,@Param("originPrice") BigDecimal originPrice,
@Param("salePrice")BigDecimal salePrice,@Param("specSnap") String specSnap,@Param("stockNumber") Double stockNumber,@Param("id") Integer id);
}

View File

@ -4,6 +4,7 @@ import cn.ysk.cashier.enums.PayTypeEnum;
import cn.ysk.cashier.exception.BadRequestException;
import cn.ysk.cashier.repository.ShopUserDutyDetailRepository;
import cn.ysk.cashier.repository.ShopUserDutyRepository;
import cn.ysk.cashier.repository.TbTokenRepository;
import cn.ysk.cashier.repository.mapping.CountPayTypeMapping;
import cn.ysk.cashier.repository.mapping.SumDateMapping;
import cn.ysk.cashier.repository.order.TbOrderInfoRepository;
@ -36,6 +37,8 @@ public class SummaryServiceImpl implements SummaryService {
private TbShopUserRepository tbShopUserRepository;
@Resource
private TbOrderInfoRepository tbOrderInfoRepository;
@Resource
private TbTokenRepository tbTokenRepository;
@Override
public SummaryVO selectSummary(Integer shopId) {
SummaryVO summaryVO = new SummaryVO();
@ -88,53 +91,81 @@ public class SummaryServiceImpl implements SummaryService {
countDateLists.add(countDateVO);
}
summaryVO.setCountDateList(countDateLists);
//用户数折线图
//访问量
Tuple tuple = tbTokenRepository.countByAccountId(shopId);
summaryVO.setTotalVisits(tuple.get(0, Long.class));
//访问量柱状图
List<Object[]> objectsVisits = tbTokenRepository.countByMonth(shopId, DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd());
List<CountVisitsVO> visitsList = new ArrayList<>();
for (Object[] o :objectsVisits){
CountVisitsVO countDateVO = new CountVisitsVO();
countDateVO.setCount((BigInteger) o[0]);
countDateVO.setTradeDay((String) o[1]);
visitsList.add(countDateVO);
}
//填充日期
Map<String, CountVisitsVO> dataVisitsMap = new HashMap<>();
for (CountVisitsVO entry : visitsList) {
String tradeDay = entry.getTradeDay();
BigInteger countOrder = entry.getCount();
dataVisitsMap.put(tradeDay, new CountVisitsVO(tradeDay, countOrder));
}
// 转换为字符串
List<CountVisitsVO> countVisitsLists = new ArrayList<>();
for (int i = 0; i < 30; i++) {
LocalDate tradeDayLocalDate = today.minusDays(i);
String tradeDayString = tradeDayLocalDate.format(formatter);
CountVisitsVO countDateVO;
// 检查数据Map中是否存在该日期的数据
if (dataVisitsMap.containsKey(tradeDayString)) {
countDateVO = dataVisitsMap.get(tradeDayString);
} else {
// 如果不存在则创建新的SumDateVO对象amount设为0
countDateVO = new CountVisitsVO(tradeDayString, BigInteger.ZERO);
}
// 将SumDateVO对象添加到列表中
countVisitsLists.add(countDateVO);
}
summaryVO.setVisitsCountList(countVisitsLists);
return summaryVO;
}
@Override
public Map<String,Object> selectSummaryDate(Integer shopId, Integer day) {
Date startTime = new Date();
Date endTime = new Date();
List<Object[]> sumDateMappings = new ArrayList<>();
if (day == 7){
startTime = DateUtil.getDate7DaysAgo();
endTime = DateUtil.getDayEnd();
sumDateMappings=shopUserDutyRepository.sumByDate(shopId,startTime,endTime);
}else if (day == 30){
startTime = DateUtil.getDate30DaysAgo();
endTime = DateUtil.getDayEnd();
sumDateMappings=shopUserDutyRepository.sumByDate(shopId,startTime,endTime);
}else if (day == 360){
startTime = DateUtil.getBeginDayOfYear();
endTime = DateUtil.getDateOneYearAgo();
sumDateMappings=shopUserDutyRepository.sumByDate(shopId,DateUtil.getDate30DaysAgo(),DateUtil.getDayEnd());
}
HashMap<String, Object> map = new HashMap<>();
// //根据时间商品排行
// List<Object[]> objects = shopUserDutyDetailRepository.searchByDutyId(shopId,startTime,endTime);
Tuple tuple = shopUserDutyDetailRepository.searchByDutyIdSum(shopId, startTime, endTime);
List<Object[]> objects = shopUserDutyDetailRepository.searchByDutyGroup(shopId, DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd());
List<CountDateVO> numList = new ArrayList<>();
for (Object[] o :objects) {
CountDateVO countDateVO = new CountDateVO();
countDateVO.setCount((BigDecimal) o[0]);
countDateVO.setTradeDay((String) o[1]);
numList.add(countDateVO);
}
List<Object[]> objects1 = shopUserDutyDetailRepository.searchByGroup(shopId, DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd());
List<CountDateVO> amountList = new ArrayList<>();
for (Object[] o :objects1) {
CountDateVO countDateVO = new CountDateVO();
countDateVO.setCount((BigDecimal) o[0]);
countDateVO.setTradeDay((String) o[1]);
amountList.add(countDateVO);
}
map.put("productCount",tuple.get(0, BigDecimal.class));
map.put("productSum",tuple.get(1, BigDecimal.class));
//商品销量排行前五
List<ProductVO> list = new ArrayList<>();
// for (Object[] o :objects) {
// ProductVO productVO = new ProductVO();
// productVO.setProductId((Integer) o[0]);
// productVO.setProductName((String) o[1]);
// productVO.setProductNum((BigDecimal)o[2]);
// list.add(productVO);
// }
// list = list.stream()
// .sorted(Comparator.comparing(ProductVO::getProductNum).reversed()) // 降序排序
// .collect(Collectors.toList());
//
// map.put("totalProduct",list);
//支付类型占比
// List<CountPayTypeMapping> countPayTypeMappings = tbOrderInfoRepository.countByShopId(shopId.toString());
// map.put("countPayType",countPayTypeMappings);
map.put("numList",numList);
map.put("amountList",amountList);
return map;
}
@ -169,10 +200,12 @@ public class SummaryServiceImpl implements SummaryService {
}
//汇总数据
Tuple tuple = shopUserDutyDetailRepository.searchByDutyIdSum(shopId, startTime, endTime);
//分页数据
Tuple tuple1 = shopUserDutyDetailRepository.searchCount(shopId, startTime, endTime);
map.put("productCount",tuple.get(0, BigDecimal.class));
map.put("productSum",tuple.get(1, BigDecimal.class));
// List<Object[]> objects1 = shopUserDutyDetailRepository.searchByDayToAmount(shopId, startTime, endTime);
map.put("totalProduct",list);
map.put("total",tuple1.get(0, BigInteger.class));
return map;
}
@Override
@ -226,6 +259,9 @@ public class SummaryServiceImpl implements SummaryService {
// 将SumDateVO对象添加到列表中
sumDateList.add(sumDateVO);
}
sumDateList.sort((a,b)->a.getTradeDay().compareTo(b.getTradeDay()));
map.put("total",sumDateList);
return map;
}
@ -238,6 +274,8 @@ public class SummaryServiceImpl implements SummaryService {
map.put("totalSalesToday", tuple.get(1, BigDecimal.class) == null? new BigDecimal("0") : tuple.get(1, BigDecimal.class));
Tuple tuple1 = tbShopUserRepository.searchByCountToday(shopId.toString(), DateUtil.getTodayStartTimestamp(), DateUtil.getTodayEndTimestamp());
map.put("userToday", tuple1.get(0, Long.class));
Tuple tupleToday = tbTokenRepository.countByAccountId(shopId, DateUtil.getDayBegin(), DateUtil.getDayEnd());
map.put("totalVisitsToday",tupleToday);
return map;
}
@Override

View File

@ -319,16 +319,22 @@ public class TbProductServiceImpl implements TbProductService {
//sku
if (resources.getSkuList() != null) {
if ("sku".equals(save.getTypeEnum())) {
tbProductSkuRepository.deleteByProductId(String.valueOf(save.getId()));
}
List<TbProductSku> skuList = new ArrayList<>();
for (TbProductSku sku : resources.getSkuList()) {
sku.setProductId(String.valueOf(save.getId()));
sku.setShopId(save.getShopId());
sku.setCreatedAt(Instant.now().toEpochMilli());
sku.setUpdatedAt(Instant.now().toEpochMilli());
skuList.add(sku);
TbProductSku tbProductSku = tbProductSkuRepository.searchBarCode(sku.getBarCode());
if (tbProductSku != null){
tbProductSkuRepository.updateByBarCode(sku.getBarCode(),sku.getCostPrice(),sku.getCoverImg(),sku.getFirstShared(),sku.getMemberPrice(),
sku.getOriginPrice(),sku.getSalePrice(),sku.getSpecSnap(),sku.getStockNumber(),tbProductSku.getId());
}else {
if ("sku".equals(save.getTypeEnum())) {
tbProductSkuRepository.deleteByProductId(String.valueOf(save.getId()));
}
sku.setProductId(String.valueOf(save.getId()));
sku.setShopId(save.getShopId());
sku.setCreatedAt(Instant.now().toEpochMilli());
sku.setUpdatedAt(Instant.now().toEpochMilli());
skuList.add(sku);
}
}
tbProductSkuRepository.saveAll(skuList);
}

View File

@ -0,0 +1,24 @@
package cn.ysk.cashier.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @author 访问量vo
*/
@Data
public class CountVisitsVO {
private String tradeDay;
private BigInteger count;
public CountVisitsVO(String tradeDay, BigInteger count) {
this.tradeDay = tradeDay;
this.count = count;
}
public CountVisitsVO() {
}
}

View File

@ -31,7 +31,17 @@ public class SummaryVO {
*/
private Long totalUser =0L;
/**
* 支付笔数柱形图
* 销售额柱形图
*/
private List<CountDateVO> countDateList;
/**
* 访问量
*/
private Long totalVisits;
/**
* 访问量柱状图
*/
public List<CountVisitsVO> visitsCountList;
}