大屏
This commit is contained in:
BIN
facedata/117.jpg
BIN
facedata/117.jpg
Binary file not shown.
Before Width: | Height: | Size: 109 KiB |
BIN
facedata/118.jpg
BIN
facedata/118.jpg
Binary file not shown.
Before Width: | Height: | Size: 163 KiB |
@ -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>
|
@ -0,0 +1,9 @@
|
||||
package cn.iocoder.yudao.module.system.api.face;
|
||||
|
||||
import cn.iocoder.yudao.module.system.api.face.dto.UserJsonDto;
|
||||
|
||||
public interface FaceApi {
|
||||
|
||||
Long addFace(UserJsonDto userJson);
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package cn.iocoder.yudao.module.system.api.face.dto;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
@Data
|
||||
@ToString
|
||||
public class UserJsonDto {
|
||||
|
||||
private String userNickname;
|
||||
private String phoneNumber;
|
||||
private String url;
|
||||
private Long userId;
|
||||
private Long carteenId;
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package cn.iocoder.yudao.module.system.api.face;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.system.api.face.dto.UserJsonDto;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.face.UserFace;
|
||||
import cn.iocoder.yudao.module.system.service.face.FaceService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class FaceApiImpl implements FaceApi {
|
||||
|
||||
@Autowired
|
||||
private FaceService faceService;
|
||||
|
||||
|
||||
@Override
|
||||
public Long addFace(UserJsonDto userJson) {
|
||||
// 生成雪花id
|
||||
long nextId = IdUtil.getSnowflake().nextId();
|
||||
CommonResult<Map<String,String>> httpResult = new CommonResult<>();
|
||||
|
||||
|
||||
// 随机生成一个字符串作为用户ID(测试、实际中禁用)
|
||||
UserFace userById = faceService.getUserById(userJson.getUserId());
|
||||
if (ObjectUtils.isEmpty(userById)) {
|
||||
UserFace user = new UserFace(nextId, userJson.getUserId(), userJson.getPhoneNumber(), userJson.getUserNickname(), userJson.getUrl());
|
||||
user.setCarteenId(userJson.getCarteenId());
|
||||
faceService.getBaseMapper().insert(user);
|
||||
} else {
|
||||
nextId = userById.getUserId();
|
||||
userById.setUrl(userJson.getUrl());
|
||||
faceService.getBaseMapper().updateById(userById);
|
||||
}
|
||||
return nextId;
|
||||
}
|
||||
}
|
@ -130,6 +130,14 @@ public class AppDevuceController {
|
||||
public CommonResult<Long> getCarteenId() {
|
||||
return success(devuceService.getCarteenIdByIp());
|
||||
}
|
||||
|
||||
@GetMapping("/carteenNew")
|
||||
@Operation(summary = "根据ip获取门店id")
|
||||
public CommonResult<Map<String,Object>> getCarteenIdNew() {
|
||||
return success(devuceService.getCarteenIdByIpNew());
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/nutrition")
|
||||
@Operation(summary = "获取菜品营养成分")
|
||||
public CommonResult<List<Map>> getDishesNutrition(@RequestParam("dishesId") Long dishesId,@RequestParam(value = "cId",required = false) String cId) {
|
||||
@ -150,7 +158,6 @@ public class AppDevuceController {
|
||||
return success(true);
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/alive")
|
||||
@Operation(summary = "在线检测")
|
||||
public void alive() {
|
||||
|
@ -77,6 +77,7 @@ public class FaceController {
|
||||
|
||||
@GetMapping("/getAll")
|
||||
public CommonResult<Page<UserFace>> getAll(QueryDto dto) {
|
||||
|
||||
return CommonResult.success(faceService.getList(dto));
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@ public class UserFace {
|
||||
private String name;
|
||||
private String phone;
|
||||
private LocalDateTime createTime;
|
||||
private Long carteenId;
|
||||
|
||||
public UserFace(Long userId, Long sysUserId, String phone, String name, String url) {
|
||||
this.phone = phone;
|
||||
|
@ -8,13 +8,16 @@ import cn.iocoder.yudao.module.system.controller.admin.deviceinfo.vo.DeviceInfoP
|
||||
import cn.iocoder.yudao.module.system.controller.admin.deviceinfo.vo.DeviceInfoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.cashregisterinfo.CashRegisterInfoDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.deviceInfo.DeviceInfoDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.devuce.DevuceDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.cashregisterinfo.CashRegisterInfoMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.deviceInfo.DeviceInfoMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.devuce.DevuceMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.facedeviceinfo.FaceDeviceInfoMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -52,6 +55,9 @@ public class DeviceInfoServiceImpl implements DeviceInfoService {
|
||||
@Resource
|
||||
private CashRegisterInfoMapper cashRegisterInfoMapper;
|
||||
|
||||
@Resource
|
||||
private DevuceMapper devuceMapper;
|
||||
|
||||
@Override
|
||||
public Long createDeviceInfo(DeviceInfoSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
@ -78,6 +84,9 @@ public class DeviceInfoServiceImpl implements DeviceInfoService {
|
||||
// 更新
|
||||
DeviceInfoDO updateObj = BeanUtils.toBean(updateReqVO, DeviceInfoDO.class);
|
||||
deviceInfoMapper.updateById(updateObj);
|
||||
//清空设备绑定菜品
|
||||
devuceMapper.update(Wrappers.<DevuceDO>lambdaUpdate().eq(DevuceDO::getDeviceSn,updateObj.getDeviceIp())
|
||||
.eq(DevuceDO::getBind,true).set(DevuceDO::getDishesId,null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -58,39 +58,50 @@ public interface DevuceService {
|
||||
* @return 设备分页
|
||||
*/
|
||||
PageResult<DevuceDO> getDevucePage(DevucePageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @Description: 设备绑定菜品,或计算菜品重量与剩余重量
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/10 下午1:40
|
||||
* @return
|
||||
* @Date: 2024/4/10 下午1:40
|
||||
*/
|
||||
DishesDO getDevuceList();
|
||||
|
||||
List<DishesDO> getDishesList(Long carteenId,Long dishecType,String dishesName);
|
||||
List<DishesDO> getDishesList(Long carteenId, Long dishecType, String dishesName);
|
||||
|
||||
PageResult<DishesDO> getDishesPage(Long carteenId, Long dishecType, String dishesName, Integer pageNo, Integer pageSize);
|
||||
|
||||
PageResult<DishesDO> getDishesPage(Long carteenId, Long dishecType, String dishesName,Integer pageNo,Integer pageSize);
|
||||
/**
|
||||
* @return
|
||||
* @Description: 获取菜品分类
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/9 上午10:33
|
||||
* @return
|
||||
*/
|
||||
List<DishesTypeDO> getDishesTypeList(Long carteenId);
|
||||
|
||||
/**
|
||||
* @Description: 根据ip获取门店id
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/10 下午4:28
|
||||
* @return
|
||||
*/
|
||||
Long getCarteenIdByIp();
|
||||
/**
|
||||
* @return
|
||||
* @Description: 根据ip获取门店id
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/10 下午4:28
|
||||
*/
|
||||
Long getCarteenIdByIp();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @Description: 根据ip获取门店id
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/10 下午4:28
|
||||
*/
|
||||
Map<String, Object> getCarteenIdByIpNew();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @Description: 获取菜品营养与菜品名称
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/19 下午2:44
|
||||
* @return
|
||||
*/
|
||||
List<Map> getDishesNutrition(Long dishesId,String cId);
|
||||
List<Map> getDishesNutrition(Long dishesId, String cId);
|
||||
|
||||
void updateWeight(DevuceReqVO updateReqVO);
|
||||
|
||||
|
@ -23,6 +23,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.dishes.DishesMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.dishesnutrition.DishesNutritionMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.dishestype.DishesTypeMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
|
||||
import cn.iocoder.yudao.module.system.service.carteen.CarteenService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
@ -63,6 +64,8 @@ public class DevuceServiceImpl implements DevuceService {
|
||||
private DeviceInfoMapper deviceInfoMapper;
|
||||
@Resource
|
||||
private DishesNutritionMapper dishesNutritionMapper;
|
||||
@Resource
|
||||
private CarteenService carteenService;
|
||||
|
||||
|
||||
@Override
|
||||
@ -275,9 +278,6 @@ public class DevuceServiceImpl implements DevuceService {
|
||||
return maps;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @Description: 根据ip获取门店id
|
||||
@ -297,6 +297,29 @@ public class DevuceServiceImpl implements DevuceService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @Description: 根据ip获取门店id
|
||||
* @Author: qjq
|
||||
* @Date: 2024/4/10 下午4:28
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> getCarteenIdByIpNew() {
|
||||
String hearder = this.getHearder();
|
||||
List<DeviceInfoDO> deviceInfoDOS = deviceInfoMapper.selectList(new LambdaQueryWrapperX<DeviceInfoDO>()
|
||||
.eq(DeviceInfoDO::getDeviceIp, hearder)
|
||||
);
|
||||
if(ObjUtil.isNotEmpty(deviceInfoDOS)){
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
Long carteenId = deviceInfoDOS.get(0).getCarteenId();
|
||||
map.put("carteenId",carteenId);
|
||||
map.put("carteenName",carteenService.getCarteen(carteenId).getStoresName());
|
||||
return map;
|
||||
}else{
|
||||
throw exception(2000_10_002,"无法通IP获取门店");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateWeight(DevuceReqVO updateReqVO) {
|
||||
String hearder = this.getHearder();
|
||||
|
@ -4,6 +4,8 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.module.system.controller.app.face.dto.QueryDto;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.face.UserFace;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.face.FaceMapper;
|
||||
import cn.iocoder.yudao.module.system.service.deviceinfo.DeviceInfoService;
|
||||
import cn.iocoder.yudao.module.system.service.facedeviceinfo.FaceDeviceInfoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
@ -12,6 +14,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -20,7 +24,10 @@ public class FaceService extends ServiceImpl<FaceMapper, UserFace> implements IS
|
||||
|
||||
@Autowired
|
||||
private FaceMapper mapper;
|
||||
|
||||
@Resource
|
||||
private HttpServletRequest httpServletRequest;
|
||||
@Resource
|
||||
private FaceDeviceInfoService faceDeviceInfoService;
|
||||
//注册人脸
|
||||
public void faceAdd(UserFace user) {
|
||||
mapper.add(user);
|
||||
@ -35,9 +42,14 @@ public class FaceService extends ServiceImpl<FaceMapper, UserFace> implements IS
|
||||
}
|
||||
|
||||
public Page<UserFace> getList(QueryDto dto) {
|
||||
|
||||
String authorization = httpServletRequest.getHeader("Authorization");
|
||||
Long carteenId = faceDeviceInfoService.getInfo(authorization).getCarteenId();
|
||||
Page<UserFace> page = new Page<>(dto.getPageNum(), dto.getPageSize());
|
||||
LambdaQueryWrapper<UserFace> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.like(StrUtil.isNotBlank(dto.getPhone()), UserFace::getPhone, dto.getPhone());
|
||||
wrapper.and(w -> w.eq(UserFace::getCarteenId,carteenId)
|
||||
.or().isNull(UserFace::getCarteenId));
|
||||
wrapper.orderByDesc(UserFace::getCreateTime);
|
||||
return mapper.selectPage(page, wrapper);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ spring:
|
||||
autoconfigure:
|
||||
exclude:
|
||||
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
|
||||
# - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
||||
- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
|
||||
- de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
|
||||
- de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
|
||||
- de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
|
||||
|
Reference in New Issue
Block a user