diff --git a/facedata/117.jpg b/facedata/117.jpg deleted file mode 100644 index 1c6d404a..00000000 Binary files a/facedata/117.jpg and /dev/null differ diff --git a/facedata/118.jpg b/facedata/118.jpg deleted file mode 100644 index f4f53186..00000000 Binary files a/facedata/118.jpg and /dev/null differ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessPageReqVO.java index 71afcfa9..25ecd8b9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessPageReqVO.java @@ -53,4 +53,5 @@ public class BusinessPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + private Long carteenId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/card/vo/RechargeVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/card/vo/RechargeVO.java index 4a4548cc..952d7a5c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/card/vo/RechargeVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/card/vo/RechargeVO.java @@ -16,4 +16,5 @@ public class RechargeVO { private Long groupId; private BigDecimal money; private Long carteenId; + private Boolean group; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/excelImport/ExcelImportController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/excelImport/ExcelImportController.java index cc6512b4..4d1868e0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/excelImport/ExcelImportController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/excelImport/ExcelImportController.java @@ -89,7 +89,7 @@ public class ExcelImportController { } List ids = new ArrayList<>(); ids.add(userByMobile.getId()); - cashRechargeService.rechargeByAdmin(ids,null,excel.getMoney(),storeId); + cashRechargeService.rechargeByAdmin(ids,null,excel.getMoney(),storeId,null); } return notExist; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/ScreenController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/ScreenController.java index 886e2eb2..6e0ebb4f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/ScreenController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/ScreenController.java @@ -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> 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> selectDishSale(Long storeId,String startTime,String endTime) { + return success(orderDetailService.selectDishSale(storeId,startTime,endTime)); + } + @GetMapping("/storeTurnover") + @Operation(summary = "获取超市营业额") + @PermitAll + public CommonResult getStoreTurnover(TurnoverVO turnoverVO) { + return success(storeBusinessService.getTurnover(turnoverVO)); + } + + @GetMapping("/storeTurnoverHistogram") + @Operation(summary = "获取超市营业额柱状图") + @PermitAll + public CommonResult> getStoreTurnoverHistogram(TurnoverVO turnoverVO) { + return success(storeBusinessService.getTurnoverList(turnoverVO)); + } + + + @GetMapping("/selectGoodsSale") + @Operation(summary = "商品销量") + @PermitAll + public CommonResult> selectGoodsSale(Long storeId,String startTime,String endTime) { + return success(storeOrderDetailService.selectGoodsSale(storeId,startTime,endTime)); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/GoodsVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/GoodsVO.java new file mode 100644 index 00000000..bfa3e527 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/GoodsVO.java @@ -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; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/TurnoverVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/TurnoverVO.java index 0c68abac..3748662f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/TurnoverVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/screen/vo/TurnoverVO.java @@ -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; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java index 64484d45..e55e5f77 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java @@ -207,5 +207,13 @@ public class MemberUserController { } + @PutMapping("/jsonCreate") + @Operation(summary = "json数据创建会员") + public CommonResult jsonCreate(String filePath,Long storeId){ + memberUserService.jsonCreate(filePath,storeId); + return success(true); + } + + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/UserJson.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/UserJson.java new file mode 100644 index 00000000..a8246590 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/UserJson.java @@ -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; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/business/BusinessMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/business/BusinessMapper.java index 61b04029..0d2afe49 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/business/BusinessMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/business/BusinessMapper.java @@ -31,6 +31,7 @@ public interface BusinessMapper extends BaseMapperX { .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)); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderdetail/OrderDetailMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderdetail/OrderDetailMapper.java index 82b71de8..9d966a1f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderdetail/OrderDetailMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderdetail/OrderDetailMapper.java @@ -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 { .orderByDesc(OrderDetailDO::getId)); } - List selectDishSale(@Param("time") String time, @Param("storeId") Long storeId); + List selectDishSale(@Param("storeId") Long storeId, @Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java index aa20f1f2..f13d2bbb 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorderdetail/StoreOrderDetailMapper.java @@ -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 @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 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 selectGoodsSale(@Param("storeId") Long storeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeService.java index 908c082b..0ec6725d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeService.java @@ -8,5 +8,5 @@ import java.util.List; public interface CashRechargeService { - void rechargeByAdmin(List userIds, Long groupId, BigDecimal money,Long storeId); + void rechargeByAdmin(List userIds, Long groupId, BigDecimal money,Long storeId,Boolean group); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java index a092c755..5da9d835 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java @@ -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 userIds, Long groupId, BigDecimal money, Long storeId) { + public void rechargeByAdmin(List userIds, Long groupId, BigDecimal money, Long storeId,Boolean group) { List 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); //更新缓存 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java index 7d413740..bc0f901a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java @@ -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 businessDOS = businessMapper.selectList(Wrappers.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 businessDOS = businessMapper.selectList(Wrappers.lambdaQuery() .between(BusinessDO::getCreateTime,startTime, endTime) - .eq(BusinessDO::getCarteenId, turnoverVO.getCarteenId())); + .eq(BusinessDO::getCarteenId, turnoverVO.getStoreId())); - Map map = businessDOS.stream() + Map 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 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 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 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; } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java index 1f2e66d9..4dd4e655 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java @@ -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()); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailService.java index 4ba02f83..0ce34efc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailService.java @@ -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 selectListByOrderIds(List orderIds); - List selectDishSale(Long storeId); + List selectDishSale(Long storeId, String startTime, String endTime); void insertOne(OrderDetailDO orderDetailDO); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailServiceImpl.java index 945e1168..0681a2b8 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderdetail/OrderDetailServiceImpl.java @@ -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 selectDishSale(Long storeId) { - LocalDate today = LocalDate.now(); - String time = today.format(DateTimeFormatter.ofPattern(MemberConstants.DATE_FORMAT)); - return orderDetailMapper.selectDishSale(time, storeId); + public List 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); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java index 1376ee8c..834eb4bc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java @@ -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 getTurnoverList(TurnoverVO turnoverVO); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java index 6857ff24..24257d70 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java @@ -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 businessDOS = storeBusinessMapper.selectList(Wrappers.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 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 businessDOS = storeBusinessMapper.selectList(Wrappers.lambdaQuery() + .between(StoreBusinessDO::getCreateTime,startTime, endTime) + .eq(StoreBusinessDO::getCarteenId, turnoverVO.getStoreId())); + + Map map = businessDOS.stream() + .filter(Objects::nonNull) // 过滤掉null值 + .collect(Collectors.toMap( + vo -> vo.getCreateTime().toLocalDate().atStartOfDay(), + vo -> vo, + (existing, replacement) -> existing + )); + + // 生成从 startDate 到 endDate 的完整日期列表 + List completeDates = new ArrayList<>(); + for (LocalDateTime date = startTime.toLocalDate().atStartOfDay(); !date.isAfter(endTime.toLocalDate().atStartOfDay()); date = date.plus(1, ChronoUnit.DAYS)) { + completeDates.add(date); + } + // 遍历完整日期列表,补齐缺失的数据 + List 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; + } + + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailService.java index 68e5a1e7..dd0e2efc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailService.java @@ -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 getListByOrderId(Integer orderId); + + List selectGoodsSale(Long storeId, String startTime, String endTime); + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailServiceImpl.java index 7d6b826c..cc42e44a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorderdetail/StoreOrderDetailServiceImpl.java @@ -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 getListByOrderId(Integer orderId) { return storeOrderDetailMapper.selectList(Wrappers.lambdaQuery().eq(StoreOrderDetailDO::getOrderId,orderId)); } + + @Override + public List selectGoodsSale(Long storeId, String startTime, String endTime) { + LocalDateTime start = MemberTimeUtils.string2Time(startTime); + LocalDateTime end = MemberTimeUtils.string2Time(endTime); + return storeOrderDetailMapper.selectGoodsSale(storeId, start, end); + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 79237e00..44a98b3a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -265,4 +265,5 @@ public interface MemberUserService { List getListByMobile(String mobiles); + void jsonCreate(String filePath,Long storeId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 17849f37..780784cd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -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() .likeIfPresent(MemberUserDO::getMobile, mobiles)); } + + @Override + public void jsonCreate(String filePath,Long storeId) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + // 读取 JSON 文件并转换为 List + List people = objectMapper.readValue(new File(filePath), new TypeReference>() {}); + + ArrayList 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; + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java index 9c63cd99..94f3242c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java @@ -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); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml index c0947ae6..8ed774cd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml @@ -19,7 +19,7 @@ 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 @@ -51,7 +51,7 @@ - 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} - - and order_id in - (select id from member_dish_order - where store_id = #{storeId} - and date_format(create_time,'%Y-%m-%d') = #{time}) - - 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 \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApi.java new file mode 100644 index 00000000..9e4bfb6a --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApi.java @@ -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); + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/dto/UserJsonDto.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/dto/UserJsonDto.java new file mode 100644 index 00000000..c3e84be9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/face/dto/UserJsonDto.java @@ -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; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApiImpl.java new file mode 100644 index 00000000..faa4a728 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/face/FaceApiImpl.java @@ -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> 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; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/devuce/AppDevuceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/devuce/AppDevuceController.java index 92634487..311c001b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/devuce/AppDevuceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/devuce/AppDevuceController.java @@ -130,6 +130,14 @@ public class AppDevuceController { public CommonResult getCarteenId() { return success(devuceService.getCarteenIdByIp()); } + + @GetMapping("/carteenNew") + @Operation(summary = "根据ip获取门店id") + public CommonResult> getCarteenIdNew() { + return success(devuceService.getCarteenIdByIpNew()); + } + + @GetMapping("/nutrition") @Operation(summary = "获取菜品营养成分") public CommonResult> 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() { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java index e77b6595..74fdcabd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java @@ -77,6 +77,7 @@ public class FaceController { @GetMapping("/getAll") public CommonResult> getAll(QueryDto dto) { + return CommonResult.success(faceService.getList(dto)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java index 85026c63..f853b80b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java @@ -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; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deviceinfo/DeviceInfoServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deviceinfo/DeviceInfoServiceImpl.java index 72b9ba37..151b48ae 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deviceinfo/DeviceInfoServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deviceinfo/DeviceInfoServiceImpl.java @@ -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.lambdaUpdate().eq(DevuceDO::getDeviceSn,updateObj.getDeviceIp()) + .eq(DevuceDO::getBind,true).set(DevuceDO::getDishesId,null)); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceService.java index 8fe77461..e54679d4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceService.java @@ -58,39 +58,50 @@ public interface DevuceService { * @return 设备分页 */ PageResult getDevucePage(DevucePageReqVO pageReqVO); + /** + * @return * @Description: 设备绑定菜品,或计算菜品重量与剩余重量 * @Author: qjq - * @Date: 2024/4/10 下午1:40 - * @return + * @Date: 2024/4/10 下午1:40 */ DishesDO getDevuceList(); - List getDishesList(Long carteenId,Long dishecType,String dishesName); + List getDishesList(Long carteenId, Long dishecType, String dishesName); + + PageResult getDishesPage(Long carteenId, Long dishecType, String dishesName, Integer pageNo, Integer pageSize); - PageResult getDishesPage(Long carteenId, Long dishecType, String dishesName,Integer pageNo,Integer pageSize); /** + * @return * @Description: 获取菜品分类 * @Author: qjq * @Date: 2024/4/9 上午10:33 - * @return */ List 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 getCarteenIdByIpNew(); + + /** + * @return * @Description: 获取菜品营养与菜品名称 * @Author: qjq * @Date: 2024/4/19 下午2:44 - * @return */ - List getDishesNutrition(Long dishesId,String cId); + List getDishesNutrition(Long dishesId, String cId); void updateWeight(DevuceReqVO updateReqVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceServiceImpl.java index 6e3684f0..59c76ba4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/devuce/DevuceServiceImpl.java @@ -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 getCarteenIdByIpNew() { + String hearder = this.getHearder(); + List deviceInfoDOS = deviceInfoMapper.selectList(new LambdaQueryWrapperX() + .eq(DeviceInfoDO::getDeviceIp, hearder) + ); + if(ObjUtil.isNotEmpty(deviceInfoDOS)){ + HashMap 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(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java index c346350a..701a7e86 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java @@ -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 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 implements IS } public Page getList(QueryDto dto) { + + String authorization = httpServletRequest.getHeader("Authorization"); + Long carteenId = faceDeviceInfoService.getInfo(authorization).getCarteenId(); Page page = new Page<>(dto.getPageNum(), dto.getPageSize()); LambdaQueryWrapper 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); } diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index e46dddcb..86867069 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -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 的自动配置