This commit is contained in:
zt
2025-01-02 09:28:49 +08:00
parent 5e247cb63a
commit 6e9c0c21bc
39 changed files with 510 additions and 92 deletions

View File

@ -53,4 +53,5 @@ public class BusinessPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
private Long carteenId;
}

View File

@ -16,4 +16,5 @@ public class RechargeVO {
private Long groupId;
private BigDecimal money;
private Long carteenId;
private Boolean group;
}

View File

@ -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;
}

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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));
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
//更新缓存

View File

@ -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;
}
}

View File

@ -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());
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -265,4 +265,5 @@ public interface MemberUserService {
List<MemberUserDO> getListByMobile(String mobiles);
void jsonCreate(String filePath,Long storeId);
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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 !=''">

View File

@ -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>