大屏
This commit is contained in:
@ -53,4 +53,5 @@ public class BusinessPageReqVO extends PageParam {
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
private Long carteenId;
|
||||
}
|
@ -16,4 +16,5 @@ public class RechargeVO {
|
||||
private Long groupId;
|
||||
private BigDecimal money;
|
||||
private Long carteenId;
|
||||
private Boolean group;
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ public class ExcelImportController {
|
||||
}
|
||||
List<Long> ids = new ArrayList<>();
|
||||
ids.add(userByMobile.getId());
|
||||
cashRechargeService.rechargeByAdmin(ids,null,excel.getMoney(),storeId);
|
||||
cashRechargeService.rechargeByAdmin(ids,null,excel.getMoney(),storeId,null);
|
||||
}
|
||||
return notExist;
|
||||
}
|
||||
|
@ -17,7 +17,9 @@ import cn.iocoder.yudao.module.member.service.customertraffic.CustomerTrafficSer
|
||||
import cn.iocoder.yudao.module.member.service.devicewarn.DeviceWarnService;
|
||||
import cn.iocoder.yudao.module.member.service.order.OrderService;
|
||||
import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService;
|
||||
import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService;
|
||||
import cn.iocoder.yudao.module.member.service.storeevaluate.StoreEvaluateService;
|
||||
import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService;
|
||||
import cn.iocoder.yudao.module.member.service.userpreference.UserPreferenceService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@ -60,6 +62,10 @@ public class ScreenController {
|
||||
private UserPreferenceService preferenceService;
|
||||
@Resource
|
||||
private BusinessService businessService;
|
||||
@Resource
|
||||
private StoreBusinessService storeBusinessService;
|
||||
@Resource
|
||||
private StoreOrderDetailService storeOrderDetailService;
|
||||
|
||||
@GetMapping("/getEvaluate")
|
||||
@Operation(summary = "获得店铺评价,1-好评,2-差评")
|
||||
@ -101,13 +107,6 @@ public class ScreenController {
|
||||
return success(orderService.selectUser(storeId,time));
|
||||
}
|
||||
|
||||
@GetMapping("/selectDishSale")
|
||||
@Operation(summary = "菜品今日销售")
|
||||
@PermitAll
|
||||
public CommonResult<List<DishVO>> selectDishSale(Long storeId) {
|
||||
return success(orderDetailService.selectDishSale(storeId));
|
||||
}
|
||||
|
||||
@GetMapping("/addWarn")
|
||||
@Operation(summary = "添加设备报警次数")
|
||||
@PermitAll
|
||||
@ -201,5 +200,32 @@ public class ScreenController {
|
||||
return success(businessService.getTurnoverList(turnoverVO));
|
||||
}
|
||||
|
||||
@GetMapping("/selectDishSale")
|
||||
@Operation(summary = "菜品销量")
|
||||
@PermitAll
|
||||
public CommonResult<List<DishVO>> selectDishSale(Long storeId,String startTime,String endTime) {
|
||||
return success(orderDetailService.selectDishSale(storeId,startTime,endTime));
|
||||
}
|
||||
|
||||
@GetMapping("/storeTurnover")
|
||||
@Operation(summary = "获取超市营业额")
|
||||
@PermitAll
|
||||
public CommonResult<BusinessRespVO> getStoreTurnover(TurnoverVO turnoverVO) {
|
||||
return success(storeBusinessService.getTurnover(turnoverVO));
|
||||
}
|
||||
|
||||
@GetMapping("/storeTurnoverHistogram")
|
||||
@Operation(summary = "获取超市营业额柱状图")
|
||||
@PermitAll
|
||||
public CommonResult<List<BusinessRespVO>> getStoreTurnoverHistogram(TurnoverVO turnoverVO) {
|
||||
return success(storeBusinessService.getTurnoverList(turnoverVO));
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/selectGoodsSale")
|
||||
@Operation(summary = "商品销量")
|
||||
@PermitAll
|
||||
public CommonResult<List<GoodsVO>> selectGoodsSale(Long storeId,String startTime,String endTime) {
|
||||
return success(storeOrderDetailService.selectGoodsSale(storeId,startTime,endTime));
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,17 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.screen.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class GoodsVO {
|
||||
|
||||
private String goodsName;
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private Double customPrice;
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
private Integer number;
|
||||
}
|
@ -1,14 +1,8 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.screen.vo;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.sun.xml.internal.ws.developer.Serialization;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class TurnoverVO {
|
||||
@ -20,5 +14,5 @@ public class TurnoverVO {
|
||||
private String endTime;
|
||||
|
||||
@Schema(description = "门店")
|
||||
private Long carteenId;
|
||||
private Long storeId;
|
||||
}
|
||||
|
@ -207,5 +207,13 @@ public class MemberUserController {
|
||||
}
|
||||
|
||||
|
||||
@PutMapping("/jsonCreate")
|
||||
@Operation(summary = "json数据创建会员")
|
||||
public CommonResult<Boolean> jsonCreate(String filePath,Long storeId){
|
||||
memberUserService.jsonCreate(filePath,storeId);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.user.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@ToString
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class UserJson {
|
||||
|
||||
private String user_nickname;
|
||||
private String phone_number;
|
||||
private String origin_data_url;
|
||||
}
|
@ -31,6 +31,7 @@ public interface BusinessMapper extends BaseMapperX<BusinessDO> {
|
||||
.eqIfPresent(BusinessDO::getLunch, reqVO.getLunch())
|
||||
.eqIfPresent(BusinessDO::getDinner, reqVO.getDinner())
|
||||
.eqIfPresent(BusinessDO::getWeigh, reqVO.getWeigh())
|
||||
.eqIfPresent(BusinessDO::getCarteenId, reqVO.getCarteenId())
|
||||
.betweenIfPresent(BusinessDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(BusinessDO::getId));
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -30,6 +31,6 @@ public interface OrderDetailMapper extends BaseMapperX<OrderDetailDO> {
|
||||
.orderByDesc(OrderDetailDO::getId));
|
||||
}
|
||||
|
||||
List<DishVO> selectDishSale(@Param("time") String time, @Param("storeId") Long storeId);
|
||||
List<DishVO> selectDishSale(@Param("storeId") Long storeId, @Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);
|
||||
|
||||
}
|
@ -1,14 +1,17 @@
|
||||
package cn.iocoder.yudao.module.member.dal.mysql.storeorderdetail;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.GoodsVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderDetailVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorderdetail.vo.*;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
/**
|
||||
@ -33,4 +36,9 @@ public interface StoreOrderDetailMapper extends BaseMapperX<StoreOrderDetailDO>
|
||||
@Select("select od.custom_price,od.number,od.weight,od.goods_name,sg.img from member_store_order_detail od left join member_store_goods sg on od.goods_id = sg.goods_id where od.order_id = #{orderId}")
|
||||
List<AppStoreOrderDetailVo> selectByOrderId(Integer orderId);
|
||||
|
||||
@Select("select od.goods_name,sum(od.number) as `number`,sum(od.number*od.custom_price) as price from member_store_order_detail od\n" +
|
||||
" left join member_store_order so on od.order_id = so.order_id\n" +
|
||||
" where so.carteen_id = #{storeId} and od.create_time BETWEEN #{startTime} AND #{endTime}\n" +
|
||||
" group by od.goods_name")
|
||||
List<GoodsVO> selectGoodsSale(@Param("storeId") Long storeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
|
||||
}
|
@ -8,5 +8,5 @@ import java.util.List;
|
||||
public interface CashRechargeService {
|
||||
|
||||
|
||||
void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money,Long storeId);
|
||||
void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money,Long storeId,Boolean group);
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserInfoCardVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.money.MoneyDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.refund.RefundDO;
|
||||
@ -59,9 +60,10 @@ public class CashRechargeServiceImpl implements CashRechargeService {
|
||||
|
||||
|
||||
@Override
|
||||
public void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money, Long storeId) {
|
||||
public void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money, Long storeId,Boolean group) {
|
||||
List<Long> memberList = new ArrayList<>();
|
||||
if (groupId != null) {
|
||||
MemberGroupDO memberGroupDO = memberGroupMapper.selectById(groupId);
|
||||
if (group) {
|
||||
memberList.addAll(memberGroupMapper.getMemberList(groupId));
|
||||
} else {
|
||||
memberList.addAll(userIds);
|
||||
@ -113,6 +115,8 @@ public class CashRechargeServiceImpl implements CashRechargeService {
|
||||
add.setWxAmount(wxNewMoney);
|
||||
add.setGiftAmount(giftNewMoney);
|
||||
add.setCarteenId(storeId);
|
||||
add.setGroupId(groupId);
|
||||
add.setGroupName(ObjectUtil.isNotEmpty(memberGroupDO)?memberGroupDO.getName():null);
|
||||
addList.add(add);
|
||||
|
||||
//更新缓存
|
||||
|
@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessSaveReqVO;
|
||||
@ -38,6 +39,7 @@ import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.YearMonth;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.time.temporal.WeekFields;
|
||||
import java.util.*;
|
||||
@ -406,7 +408,7 @@ public class BusinessServiceImpl implements BusinessService {
|
||||
|
||||
List<BusinessDO> businessDOS = businessMapper.selectList(Wrappers.<BusinessDO>lambdaQuery()
|
||||
.between(BusinessDO::getCreateTime,MemberTimeUtils.string2Time(turnoverVO.getStartTime()), MemberTimeUtils.string2Time(turnoverVO.getEndTime()))
|
||||
.eq(BusinessDO::getCarteenId, turnoverVO.getCarteenId()));
|
||||
.eq(BusinessDO::getCarteenId, turnoverVO.getStoreId()));
|
||||
BusinessRespVO businessDO = getInitBusinessRespVO();
|
||||
if(CollectionUtil.isNotEmpty(businessDOS)){
|
||||
businessDO.setTurnover(businessDOS.stream().map(BusinessDO::getTurnover).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
@ -441,34 +443,32 @@ public class BusinessServiceImpl implements BusinessService {
|
||||
}
|
||||
List<BusinessDO> businessDOS = businessMapper.selectList(Wrappers.<BusinessDO>lambdaQuery()
|
||||
.between(BusinessDO::getCreateTime,startTime, endTime)
|
||||
.eq(BusinessDO::getCarteenId, turnoverVO.getCarteenId()));
|
||||
.eq(BusinessDO::getCarteenId, turnoverVO.getStoreId()));
|
||||
|
||||
Map<Integer, BusinessDO> map = businessDOS.stream()
|
||||
Map<LocalDateTime, BusinessDO> map = businessDOS.stream()
|
||||
.filter(Objects::nonNull) // 过滤掉null值
|
||||
.collect(Collectors.toMap(
|
||||
vo -> vo.getCreateTime().toLocalDate().getDayOfMonth(),
|
||||
vo->vo.getCreateTime().toLocalDate().atStartOfDay(),
|
||||
vo -> vo,
|
||||
(existing, replacement) -> existing
|
||||
));
|
||||
// 创建一个Map来存储每天的数据
|
||||
Map<Integer, BusinessRespVO> monthData = new LinkedHashMap<>();
|
||||
|
||||
int start = startDate.getDayOfMonth();
|
||||
|
||||
int end = endDate.getDayOfMonth();
|
||||
|
||||
for (int day = start; day <= end; day++) {
|
||||
new BusinessRespVO();
|
||||
BusinessRespVO bean;
|
||||
if(map.get(day) == null){
|
||||
bean = getInitBusinessRespVO().setTime(String.valueOf(day));
|
||||
}else {
|
||||
bean = BeanUtils.toBean(map.get(day), BusinessRespVO.class);
|
||||
bean.setTime(String.valueOf(day));
|
||||
}
|
||||
monthData.put(day,bean);
|
||||
|
||||
// 生成从 startDate 到 endDate 的完整日期列表
|
||||
List<LocalDateTime> completeDates = new ArrayList<>();
|
||||
for (LocalDateTime date = startTime.toLocalDate().atStartOfDay(); !date.isAfter(endTime.toLocalDate().atStartOfDay()); date = date.plus(1, ChronoUnit.DAYS)) {
|
||||
completeDates.add(date);
|
||||
}
|
||||
return new ArrayList<>(monthData.values());
|
||||
// 遍历完整日期列表,补齐缺失的数据
|
||||
List<BusinessRespVO> completeRecords = new ArrayList<>();
|
||||
for (LocalDateTime date : completeDates) {
|
||||
BusinessRespVO bean;
|
||||
if(map.get(date) == null){
|
||||
bean = getInitBusinessRespVO().setTime(MemberTimeUtils.Time2String(date));
|
||||
}else {
|
||||
bean = BeanUtils.toBean(map.get(date), BusinessRespVO.class);
|
||||
bean.setTime(MemberTimeUtils.Time2String(date));
|
||||
}
|
||||
completeRecords.add(bean);
|
||||
}
|
||||
return completeRecords;
|
||||
}
|
||||
}
|
@ -192,7 +192,7 @@ public class CardServiceImpl implements CardService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void rechargeByAdmin(RechargeVO vo) {
|
||||
cashRechargeService.rechargeByAdmin(vo.getUserIds(),vo.getGroupId(),vo.getMoney(),vo.getCarteenId());
|
||||
cashRechargeService.rechargeByAdmin(vo.getUserIds(),vo.getGroupId(),vo.getMoney(),vo.getCarteenId(),vo.getGroup());
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 订单明细 Service 接口
|
||||
@ -59,7 +60,7 @@ public interface OrderDetailService {
|
||||
|
||||
List<OrderDetailDO> selectListByOrderIds(List<Long> orderIds);
|
||||
|
||||
List<DishVO> selectDishSale(Long storeId);
|
||||
List<DishVO> selectDishSale(Long storeId, String startTime, String endTime);
|
||||
|
||||
void insertOne(OrderDetailDO orderDetailDO);
|
||||
}
|
@ -15,9 +15,11 @@ import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
|
||||
import cn.iocoder.yudao.module.member.service.async.MemberAsyncService;
|
||||
import cn.iocoder.yudao.module.member.service.diningplates.DiningPlatesService;
|
||||
import cn.iocoder.yudao.module.member.util.MemberConstants;
|
||||
import cn.iocoder.yudao.module.member.util.MemberTimeUtils;
|
||||
import cn.iocoder.yudao.module.system.api.dish.DishesApi;
|
||||
import cn.iocoder.yudao.module.system.api.dish.dto.DishesRespDto;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -28,8 +30,11 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.ORDER_ALREADY_COMPLETE;
|
||||
@ -154,13 +159,12 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DishVO> selectDishSale(Long storeId) {
|
||||
LocalDate today = LocalDate.now();
|
||||
String time = today.format(DateTimeFormatter.ofPattern(MemberConstants.DATE_FORMAT));
|
||||
return orderDetailMapper.selectDishSale(time, storeId);
|
||||
public List<DishVO> selectDishSale(Long storeId, String startTime, String endTime) {
|
||||
LocalDateTime start = MemberTimeUtils.string2Time(startTime);
|
||||
LocalDateTime end = MemberTimeUtils.string2Time(endTime);
|
||||
return orderDetailMapper.selectDishSale(storeId, start, end);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void insertOne(OrderDetailDO orderDetailDO) {
|
||||
orderDetailMapper.insert(orderDetailDO);
|
||||
|
@ -1,13 +1,16 @@
|
||||
package cn.iocoder.yudao.module.member.service.storebusiness;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.TurnoverVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.StoreBusinessPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.StoreBusinessSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.business.vo.BusinessDataVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 超市营业统计 Service 接口
|
||||
@ -63,6 +66,7 @@ public interface StoreBusinessService {
|
||||
BusinessDataVO getMonth(String time,Long carteenId);
|
||||
|
||||
|
||||
BusinessRespVO getTurnover(TurnoverVO turnoverVO);
|
||||
|
||||
|
||||
List<BusinessRespVO> getTurnoverList(TurnoverVO turnoverVO);
|
||||
}
|
@ -7,9 +7,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.TurnoverVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.StoreBusinessPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.StoreBusinessSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.business.vo.BusinessDataVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.storebusiness.StoreBusinessMapper;
|
||||
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
|
||||
@ -28,11 +30,9 @@ import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.YearMonth;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
@ -335,4 +335,78 @@ public class StoreBusinessServiceImpl implements StoreBusinessService {
|
||||
.setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO).setPriceAvg(BigDecimal.ZERO);
|
||||
return previousVO;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public BusinessRespVO getTurnover(TurnoverVO turnoverVO) {
|
||||
|
||||
List<StoreBusinessDO> businessDOS = storeBusinessMapper.selectList(Wrappers.<StoreBusinessDO>lambdaQuery()
|
||||
.between(StoreBusinessDO::getCreateTime,MemberTimeUtils.string2Time(turnoverVO.getStartTime()), MemberTimeUtils.string2Time(turnoverVO.getEndTime()))
|
||||
.eq(StoreBusinessDO::getCarteenId, turnoverVO.getStoreId()));
|
||||
BusinessRespVO businessDO = getInitBusinessRespVO();
|
||||
if(CollectionUtil.isNotEmpty(businessDOS)){
|
||||
businessDO.setTurnover(businessDOS.stream().map(StoreBusinessDO::getTurnover).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
businessDO.setOrderSum(businessDOS.stream().map(StoreBusinessDO::getOrderSum).reduce(0, Integer::sum));
|
||||
businessDO.setCustomerSum(businessDOS.stream().map(StoreBusinessDO::getCustomerSum).reduce(0, Integer::sum));
|
||||
businessDO.setPriceAvg(businessDOS.stream().map(StoreBusinessDO::getPriceAvg).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
businessDO.setBreakfast(businessDOS.stream().map(StoreBusinessDO::getBreakfast).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
businessDO.setLunch(businessDOS.stream().map(StoreBusinessDO::getLunch).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
businessDO.setDinner(businessDOS.stream().map(StoreBusinessDO::getDinner).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
businessDO.setBreakfastNum(businessDOS.stream().map(StoreBusinessDO::getBreakfastNum).reduce(0, Integer::sum));
|
||||
businessDO.setLunchNum(businessDOS.stream().map(StoreBusinessDO::getLunchNum).reduce(0, Integer::sum));
|
||||
businessDO.setDinnerNum(businessDOS.stream().map(StoreBusinessDO::getDinnerNum).reduce(0, Integer::sum));
|
||||
}
|
||||
return businessDO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BusinessRespVO> getTurnoverList(TurnoverVO turnoverVO) {
|
||||
LocalDateTime startTime = MemberTimeUtils.string2Time(turnoverVO.getStartTime());
|
||||
LocalDateTime endTime = MemberTimeUtils.string2Time(turnoverVO.getEndTime());
|
||||
|
||||
LocalDate startDate = startTime.toLocalDate();
|
||||
LocalDate endDate = endTime.toLocalDate();
|
||||
if(startDate.equals(endDate)){
|
||||
// 获取本月开始时间:本月的第一天00:00:00
|
||||
startDate= startTime.with(TemporalAdjusters.firstDayOfMonth()).toLocalDate();
|
||||
startTime = startDate.atStartOfDay();
|
||||
|
||||
// 获取本月结束时间:本月的最后一天23:59:59.999999999
|
||||
endDate = endTime.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate();
|
||||
endTime = endDate.atTime(LocalTime.MAX);
|
||||
}
|
||||
List<StoreBusinessDO> businessDOS = storeBusinessMapper.selectList(Wrappers.<StoreBusinessDO>lambdaQuery()
|
||||
.between(StoreBusinessDO::getCreateTime,startTime, endTime)
|
||||
.eq(StoreBusinessDO::getCarteenId, turnoverVO.getStoreId()));
|
||||
|
||||
Map<LocalDateTime, StoreBusinessDO> map = businessDOS.stream()
|
||||
.filter(Objects::nonNull) // 过滤掉null值
|
||||
.collect(Collectors.toMap(
|
||||
vo -> vo.getCreateTime().toLocalDate().atStartOfDay(),
|
||||
vo -> vo,
|
||||
(existing, replacement) -> existing
|
||||
));
|
||||
|
||||
// 生成从 startDate 到 endDate 的完整日期列表
|
||||
List<LocalDateTime> completeDates = new ArrayList<>();
|
||||
for (LocalDateTime date = startTime.toLocalDate().atStartOfDay(); !date.isAfter(endTime.toLocalDate().atStartOfDay()); date = date.plus(1, ChronoUnit.DAYS)) {
|
||||
completeDates.add(date);
|
||||
}
|
||||
// 遍历完整日期列表,补齐缺失的数据
|
||||
List<BusinessRespVO> completeRecords = new ArrayList<>();
|
||||
for (LocalDateTime date : completeDates) {
|
||||
BusinessRespVO bean;
|
||||
if(map.get(date) == null){
|
||||
bean = getInitBusinessRespVO().setTime(MemberTimeUtils.Time2String(date));
|
||||
}else {
|
||||
bean = BeanUtils.toBean(map.get(date), BusinessRespVO.class);
|
||||
bean.setTime(MemberTimeUtils.Time2String(date));
|
||||
}
|
||||
completeRecords.add(bean);
|
||||
}
|
||||
|
||||
return completeRecords;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
package cn.iocoder.yudao.module.member.service.storeorderdetail;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.DishVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.GoodsVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorderdetail.vo.StoreOrderDetailPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorderdetail.vo.StoreOrderDetailSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderDetailVo;
|
||||
@ -61,4 +63,7 @@ public interface StoreOrderDetailService {
|
||||
void deleteByOrderNo(Integer orderId);
|
||||
|
||||
List<StoreOrderDetailDO> getListByOrderId(Integer orderId);
|
||||
|
||||
List<GoodsVO> selectGoodsSale(Long storeId, String startTime, String endTime);
|
||||
|
||||
}
|
@ -2,16 +2,20 @@ package cn.iocoder.yudao.module.member.service.storeorderdetail;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.DishVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.GoodsVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorderdetail.vo.StoreOrderDetailPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorderdetail.vo.StoreOrderDetailSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderDetailVo;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.storeorderdetail.StoreOrderDetailMapper;
|
||||
import cn.iocoder.yudao.module.member.util.MemberTimeUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@ -91,4 +95,11 @@ public class StoreOrderDetailServiceImpl implements StoreOrderDetailService {
|
||||
public List<StoreOrderDetailDO> getListByOrderId(Integer orderId) {
|
||||
return storeOrderDetailMapper.selectList(Wrappers.<StoreOrderDetailDO>lambdaQuery().eq(StoreOrderDetailDO::getOrderId,orderId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GoodsVO> selectGoodsSale(Long storeId, String startTime, String endTime) {
|
||||
LocalDateTime start = MemberTimeUtils.string2Time(startTime);
|
||||
LocalDateTime end = MemberTimeUtils.string2Time(endTime);
|
||||
return storeOrderDetailMapper.selectGoodsSale(storeId, start, end);
|
||||
}
|
||||
}
|
@ -265,4 +265,5 @@ public interface MemberUserService {
|
||||
|
||||
List<MemberUserDO> getListByMobile(String mobiles);
|
||||
|
||||
void jsonCreate(String filePath,Long storeId);
|
||||
}
|
||||
|
@ -15,14 +15,12 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.digest.DigestUtil;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserAddVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserListVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.user.vo.*;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileByWeixinReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
|
||||
@ -55,6 +53,8 @@ import cn.iocoder.yudao.module.member.util.MemberConstants;
|
||||
import cn.iocoder.yudao.module.member.util.QRCodeWithJWTUtil;
|
||||
import cn.iocoder.yudao.module.system.api.dishesnutrition.DishesNutritionApi;
|
||||
import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.face.FaceApi;
|
||||
import cn.iocoder.yudao.module.system.api.face.dto.UserJsonDto;
|
||||
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||
import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
|
||||
@ -62,20 +62,34 @@ import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoResp
|
||||
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.support.TransactionSynchronization;
|
||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.WeekFields;
|
||||
@ -147,6 +161,8 @@ public class MemberUserServiceImpl implements MemberUserService {
|
||||
@Resource
|
||||
private StringRedisTemplate memberUserRedisTemplate;
|
||||
|
||||
@Resource
|
||||
private FaceApi faceApi;
|
||||
|
||||
@Override
|
||||
public MemberUserDO getUserByMobile(String mobile) {
|
||||
@ -937,4 +953,97 @@ public class MemberUserServiceImpl implements MemberUserService {
|
||||
return memberUserMapper.selectList(new LambdaQueryWrapperX<MemberUserDO>()
|
||||
.likeIfPresent(MemberUserDO::getMobile, mobiles));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void jsonCreate(String filePath,Long storeId) {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
try {
|
||||
// 读取 JSON 文件并转换为 List<Person>
|
||||
List<UserJson> people = objectMapper.readValue(new File(filePath), new TypeReference<List<UserJson>>() {});
|
||||
|
||||
ArrayList<MemberUserDO> updateList = new ArrayList<>();
|
||||
for(UserJson userJson : people) {
|
||||
|
||||
// 用户已经存在
|
||||
MemberUserDO userSelect = memberUserMapper.selectByMobile(userJson.getPhone_number());
|
||||
if (userSelect != null) {
|
||||
continue;
|
||||
}
|
||||
// 用户不存在,则进行创建
|
||||
// 生成密码
|
||||
String password = IdUtil.fastSimpleUUID();
|
||||
// 插入用户
|
||||
MemberUserDO user = new MemberUserDO();
|
||||
user.setMobile(userJson.getPhone_number());
|
||||
user.setLimitAmount(new BigDecimal("30"));
|
||||
user.setNickname(userJson.getUser_nickname());
|
||||
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
|
||||
user.setPassword(encodePassword(password)); // 加密密码
|
||||
user.setRegisterIp("null");
|
||||
memberUserMapper.insert(user);
|
||||
|
||||
Long id = user.getId();
|
||||
|
||||
if(StringUtils.isNotBlank(userJson.getOrigin_data_url())){
|
||||
String s = downloadImage(userJson);
|
||||
UserJsonDto userJsonDto = new UserJsonDto();
|
||||
userJsonDto.setUserNickname(userJson.getUser_nickname());
|
||||
userJsonDto.setUserId(id);
|
||||
userJsonDto.setUrl(s);
|
||||
userJsonDto.setPhoneNumber(userJson.getPhone_number());
|
||||
userJsonDto.setCarteenId(storeId);
|
||||
Long faceId = faceApi.addFace(userJsonDto);
|
||||
user.setFaceId(faceId);
|
||||
updateList.add(user);
|
||||
}
|
||||
}
|
||||
if(CollectionUtil.isNotEmpty(updateList)){
|
||||
memberUserMapper.updateBatch(updateList);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public String downloadImage(UserJson userJson) {
|
||||
String saveDir = "facedata/";
|
||||
try {
|
||||
// 创建 URL 对象
|
||||
URL url = new URL(userJson.getOrigin_data_url());
|
||||
|
||||
// 获取文件名(从 URL 提取)
|
||||
String fileName = Paths.get(url.getPath()).getFileName().toString();
|
||||
|
||||
// 创建保存路径
|
||||
Path savePath = Paths.get(saveDir, fileName);
|
||||
Files.createDirectories(savePath.getParent());
|
||||
|
||||
// 打开连接并获取输入流
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
|
||||
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
|
||||
System.out.println("Failed to download image. Response code: " + connection.getResponseCode());
|
||||
return null;
|
||||
}
|
||||
|
||||
try (
|
||||
InputStream inputStream = connection.getInputStream();
|
||||
OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(savePath))
|
||||
) {
|
||||
// 使用缓冲区手动复制流
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
System.out.println("Image saved to: " + savePath.toAbsolutePath());
|
||||
return savePath.toString().replace("\\", "/");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -107,4 +107,12 @@ public class MemberTimeUtils {
|
||||
return LocalDateTime.parse(time, formatter);
|
||||
}
|
||||
|
||||
public static String Time2String(LocalDateTime time) {
|
||||
// 定义日期字符串格式
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// 将字符串解析为LocalDate对象
|
||||
return time.format(formatter);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,7 @@
|
||||
<select id="getMemberByGroupId" resultType="cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO">
|
||||
select mu.*
|
||||
from member_group_member mgm
|
||||
left join yudao.member_user mu on mgm.member_id = mu.id
|
||||
left join member_user mu on mgm.member_id = mu.id
|
||||
where mgm.group_id = #{groupId}
|
||||
and mu.status = 0
|
||||
<if test="nickname != null and nickname !=''">
|
||||
@ -35,7 +35,7 @@
|
||||
<select id="getByGroupId" resultType="cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO">
|
||||
select mu.*
|
||||
from member_group_member mgm
|
||||
left join yudao.member_user mu on mgm.member_id = mu.id
|
||||
left join member_user mu on mgm.member_id = mu.id
|
||||
where mgm.group_id = #{groupId}
|
||||
and mu.status = 0
|
||||
</select>
|
||||
@ -51,7 +51,7 @@
|
||||
<select id="memberCount" resultType="Long">
|
||||
select count(*)
|
||||
from member_group_member mgm
|
||||
left join yudao.member_user mu on mgm.member_id = mu.id
|
||||
left join member_user mu on mgm.member_id = mu.id
|
||||
where mgm.group_id = #{groupId}
|
||||
and mu.status = 0
|
||||
<if test="nickname != null and nickname !=''">
|
||||
|
@ -9,16 +9,10 @@
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
<select id="selectDishSale" resultType="cn.iocoder.yudao.module.member.controller.admin.screen.vo.DishVO">
|
||||
select dishes_name, sum(a.weight) as weight , sum(a.price) as price
|
||||
from member_order_detail a
|
||||
where date_format(a.create_time,'%Y-%m-%d') = #{time}
|
||||
<if test="storeId != null">
|
||||
and order_id in
|
||||
(select id from member_dish_order
|
||||
where store_id = #{storeId}
|
||||
and date_format(create_time,'%Y-%m-%d') = #{time})
|
||||
</if>
|
||||
group by a.dishes_id,a.dishes_name
|
||||
select od.dishes_name,sum(od.weight) as weight,sum(od.price) as price from member_order_detail od
|
||||
left join member_dish_order mo on od.order_id = mo.id
|
||||
where store_id = #{storeId} and od.create_time between #{startTime} and #{endTime}
|
||||
group by dishes_name
|
||||
</select>
|
||||
|
||||
</mapper>
|
Reference in New Issue
Block a user