From c6419745a77a0681e22565dc8a33488d949de000 Mon Sep 17 00:00:00 2001 From: seesaw Date: Wed, 25 Sep 2024 16:02:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppDiningPlatesController.java | 36 ++++-- .../vo/AppOrderDetailSaveReqVO.java | 3 + .../member/job/BalanceDeductionJob.java | 7 +- .../diningplates/DiningPlatesService.java | 14 ++- .../diningplates/DiningPlatesServiceImpl.java | 60 +++++++--- .../orderdetail/OrderDetailServiceImpl.java | 43 +++---- .../service/user/MemberUserServiceImpl.java | 6 +- .../module/system/api/carteen/CarteenApi.java | 2 +- .../system/enums/ErrorCodeConstants.java | 2 + .../FaceDeviceInfoController.java | 98 ++++++++++++++++ .../vo/FaceDeviceInfoPageReqVO.java | 40 +++++++ .../vo/FaceDeviceInfoRespVO.java | 48 ++++++++ .../vo/FaceDeviceInfoSaveReqVO.java | 33 ++++++ .../controller/app/face/FaceController.java | 106 ++++++++++++++++++ .../controller/app/face/dto/QueryDto.java | 10 ++ .../controller/app/face/dto/SaveDto.java | 12 ++ .../AppFaceDeviceInfoController.java | 52 +++++++++ .../system/dal/dataobject/face/UserFace.java | 32 ++++++ .../facedeviceinfo/FaceDeviceInfoDO.java | 55 +++++++++ .../system/dal/mysql/face/FaceMapper.java | 30 +++++ .../facedeviceinfo/FaceDeviceInfoMapper.java | 34 ++++++ .../deviceinfo/DeviceInfoServiceImpl.java | 32 +++++- .../system/service/face/FaceService.java | 49 ++++++++ .../facedeviceinfo/FaceDeviceInfoService.java | 58 ++++++++++ .../FaceDeviceInfoServiceImpl.java | 100 +++++++++++++++++ 25 files changed, 902 insertions(+), 60 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/FaceDeviceInfoController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/QueryDto.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/SaveDto.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/facedeviceinfo/AppFaceDeviceInfoController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/facedeviceinfo/FaceDeviceInfoDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/face/FaceMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/facedeviceinfo/FaceDeviceInfoMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoServiceImpl.java diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/diningplates/AppDiningPlatesController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/diningplates/AppDiningPlatesController.java index 31f101ab..c62e2bdf 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/diningplates/AppDiningPlatesController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/diningplates/AppDiningPlatesController.java @@ -38,40 +38,54 @@ public class AppDiningPlatesController { @GetMapping("/bindByCard") @Operation(summary = "打卡绑定餐盘") - public CommonResult bindByCard(String diningPlatesNum,String cardId) { - return success(diningPlatesService.bind(diningPlatesNum,cardId)); + public CommonResult bindByCard(String diningPlatesNum,String cardId,Long storeId) { + return success(diningPlatesService.bind(diningPlatesNum,cardId,storeId)); } @GetMapping("/bindByFace") @Operation(summary = "人脸绑定餐盘") - public CommonResult bindByFace(String diningPlatesNum, Long faceId) { - return success(diningPlatesService.bindByFace(diningPlatesNum,faceId)); + public CommonResult bindByFace(String diningPlatesNum, Long faceId,Long storeId) { + return success(diningPlatesService.bindByFace(diningPlatesNum,faceId,storeId)); } @GetMapping("/checkBind") @Operation(summary = "验证餐盘绑定") - public CommonResult checkBind(String diningPlatesNum) { - return success(diningPlatesService.appCheckBind(diningPlatesNum)); + public CommonResult checkBind(String diningPlatesNum,Long storeId) { + return success(diningPlatesService.appCheckBind(diningPlatesNum,storeId)); } @GetMapping("/unbind") @Operation(summary = "餐盘解绑") - public CommonResult unbind(String diningPlatesNum) { - diningPlatesService.unbind(diningPlatesNum); + public CommonResult unbind(String diningPlatesNum,Long storeId) { + diningPlatesService.unbind(diningPlatesNum,storeId); return success(diningPlatesNum); } @GetMapping("/getUserAndDish") @Operation(summary = "根据餐盘号获取当前余额") - public CommonResult getMoney(String cId, Long dishesId) { - return success(diningPlatesService.getMoney(cId,dishesId)); + public CommonResult getMoney(String cId, Long dishesId,Long storeId) { + return success(diningPlatesService.getMoney(cId,dishesId,storeId)); } @GetMapping("/getBind") - @Operation(summary = "获取绑定餐盘") + @Operation(summary = "获取绑定餐盘验证") public CommonResult> getBind() { return success(diningPlatesService.getBindDiningPlatesList()); } + @GetMapping("/checkBindAndUnBind") + @Operation(summary = "餐盘解绑") + public CommonResult checkBindAndUnBind(String diningPlatesNum,Long storeId) { + Boolean b = diningPlatesService.checkBindAndUnBind(diningPlatesNum, storeId); + CommonResult result = new CommonResult<>(); + result.setCode(200); + if (b) { + result.setMsg("餐盘已解绑"); + result.setData("bind"); + }else { + result.setData("unbind"); + } + return result; + } } \ 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/app/orderdetail/vo/AppOrderDetailSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderdetail/vo/AppOrderDetailSaveReqVO.java index 8bebb104..e11c4321 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderdetail/vo/AppOrderDetailSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderdetail/vo/AppOrderDetailSaveReqVO.java @@ -32,5 +32,8 @@ public class AppOrderDetailSaveReqVO { @Schema(description = "餐盘编号") private String diningPlatesNum; + @Schema(description = "门店Id") + private Long storeId; + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java index 4c508ebc..cdda97f2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.job; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; @@ -12,6 +13,7 @@ import cn.iocoder.yudao.module.member.service.diningplates.DiningPlatesService; import cn.iocoder.yudao.module.member.service.order.OrderService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -68,7 +70,8 @@ public class BalanceDeductionJob implements JobHandler { List list = new ArrayList<>(); toPay.forEach(dishOrderDO -> { //新的总价 - BigDecimal total = new BigDecimal(stringRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum())); + String s = stringRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); + BigDecimal total = new BigDecimal(StrUtil.isBlank(s)?"0":s); //BigDecimal total = new BigDecimal(0.01); Long userId = dishOrderDO.getUserId(); CardDO cardDO = new CardDO(); @@ -146,7 +149,7 @@ public class BalanceDeductionJob implements JobHandler { dishOrderDO.setTotalMoney(total); dishOrderDO.setUpdateTime(LocalDateTime.now()); - stringRedisTemplate.delete(dishOrderDO.getDiningPlatesNum()); + stringRedisTemplate.delete(dishOrderDO.getDiningPlatesNum()+ "-" + dishOrderDO.getStoreId()); }); //取消批量,防止同一人订餐少扣款 //cardService.insertBatch(list); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesService.java index aa63c132..5d460df4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesService.java @@ -84,23 +84,25 @@ public interface DiningPlatesService { * 绑定 * @return */ - AppUserInfoCardVO bind(String diningPlatesNum,String cardId); + AppUserInfoCardVO bind(String diningPlatesNum,String cardId,Long storeId); - AppUserInfoCardVO bindByFace(String diningPlatesNum, Long faceId); + AppUserInfoCardVO bindByFace(String diningPlatesNum, Long faceId,Long storeId); - Boolean checkBind(String diningPlatesNum); + Boolean checkBind(String diningPlatesNum,Long storeId); - AppUserInfoCardVO appCheckBind(String diningPlatesNum); + AppUserInfoCardVO appCheckBind(String diningPlatesNum,Long storeId); List getDiningPlatesNum(LocalDateTime localDateTime, Integer time); - void unbind(String diningPlatesNum); + void unbind(String diningPlatesNum,Long storeId); - AppUserInfo getMoney(String diningPlatesNum, Long dishId); + AppUserInfo getMoney(String diningPlatesNum, Long dishId,Long storeId); /** * 获取绑定餐盘列表 * @return */ List getBindDiningPlatesList(); + + Boolean checkBindAndUnBind(String diningPlatesNum,Long storeId); } \ 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/diningplates/DiningPlatesServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java index b014f574..9662f345 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java @@ -75,7 +75,8 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { // 插入 DiningPlatesDO diningPlates = BeanUtils.toBean(createReqVO, DiningPlatesDO.class); List diningPlatesDOS = diningPlatesMapper.selectList(Wrappers.lambdaQuery() - .eq(DiningPlatesDO::getDiningPlatesNum, diningPlates.getDiningPlatesNum())); + .eq(DiningPlatesDO::getDiningPlatesNum, diningPlates.getDiningPlatesNum()) + .eq(DiningPlatesDO::getStoreId, diningPlates.getStoreId())); if(CollectionUtil.isNotEmpty(diningPlatesDOS)){ throw exception(DINING_PLATES_ALREADY); } @@ -114,7 +115,14 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Override public PageResult getDiningPlatesPage(DiningPlatesPageReqVO pageReqVO) { - return diningPlatesMapper.selectPage(pageReqVO); + PageResult diningPlatesDOPageResult = diningPlatesMapper.selectPage(pageReqVO); + List list = diningPlatesDOPageResult.getList(); + if(CollectionUtil.isNotEmpty(list)){ + list.forEach(diningPlatesDO -> { + diningPlatesDO.setStoreName(carteenApi.getCarteenById(diningPlatesDO.getStoreId()).getStoresName()); + }); + } + return diningPlatesDOPageResult; } @Override @@ -159,9 +167,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Override @Transactional(rollbackFor = Exception.class) - public AppUserInfoCardVO bind(String diningPlatesNum, String cardId) { + public AppUserInfoCardVO bind(String diningPlatesNum, String cardId,Long storeId) { DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last(MemberConstants.LIMIT_ONE)); checkDiningPlates(diningPlatesDO); MemberUserDO memberUserDO = memberUserMapper.selectOne(Wrappers.lambdaQuery() @@ -185,14 +194,14 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { dishOrderDO.setDiningPlatesNum(diningPlatesNum) .setOrderStatus(DishOrderDO.INCOMPLETE) .setUserId(memberUserDO.getId()) - .setStoreId(diningPlatesDO.getStoreId()) - .setStoreName(diningPlatesDO.getStoreName()); + .setStoreId(storeId) + .setStoreName(carteenApi.getCarteenById(storeId).getStoresName()); dishOrderMapper.insert(dishOrderDO); diningPlatesDO.setOrderId(dishOrderDO.getId()); diningPlatesMapper.updateById(diningPlatesDO); //设置总价 - stringRedisTemplate.opsForValue().set(diningPlatesNum, "0"); + stringRedisTemplate.opsForValue().set(diningPlatesNum+"-"+storeId, "0"); AppUserInfoCardVO data = new AppUserInfoCardVO(); data.setName(memberUserDO.getNickname()); data.setMoney(money); @@ -203,9 +212,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Override @Transactional(rollbackFor = Exception.class) - public AppUserInfoCardVO bindByFace(String diningPlatesNum, Long faceId) { + public AppUserInfoCardVO bindByFace(String diningPlatesNum, Long faceId,Long storeId) { DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last(MemberConstants.LIMIT_ONE)); checkDiningPlates(diningPlatesDO); MemberUserDO memberUserDO = memberUserMapper.selectOne(Wrappers.lambdaQuery() @@ -227,14 +237,14 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { dishOrderDO.setDiningPlatesNum(diningPlatesNum) .setOrderStatus(DishOrderDO.INCOMPLETE) .setUserId(memberUserDO.getId()) - .setStoreId(diningPlatesDO.getStoreId()) - .setStoreName(diningPlatesDO.getStoreName()); + .setStoreId(storeId) + .setStoreName(carteenApi.getCarteenById(storeId).getStoresName()); dishOrderMapper.insert(dishOrderDO); diningPlatesDO.setOrderId(dishOrderDO.getId()); diningPlatesMapper.updateById(diningPlatesDO); //设置总价 - stringRedisTemplate.opsForValue().set(diningPlatesNum, "0"); + stringRedisTemplate.opsForValue().set(diningPlatesNum+"-"+storeId, "0"); AppUserInfoCardVO data = new AppUserInfoCardVO(); data.setName(memberUserDO.getNickname()); data.setMoney(money); @@ -244,9 +254,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { } @Override - public Boolean checkBind(String diningPlatesNum) { + public Boolean checkBind(String diningPlatesNum, Long storeId) { DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last(MemberConstants.LIMIT_ONE)); if (diningPlatesDO == null || diningPlatesDO.getUserId() == null) { return false; @@ -258,9 +269,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { } @Override - public AppUserInfoCardVO appCheckBind(String diningPlatesNum) { + public AppUserInfoCardVO appCheckBind(String diningPlatesNum, Long storeId) { DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last(MemberConstants.LIMIT_ONE)); if (diningPlatesDO == null || diningPlatesDO.getUserId() == null) { throw exception(DINING_PLATES_NOT_BIND); @@ -374,9 +386,9 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Override @Transactional(rollbackFor = Exception.class) - public void unbind(String diningPlatesNum) { + public void unbind(String diningPlatesNum,Long storeId) { - String money = stringRedisTemplate.opsForValue().get(diningPlatesNum); + String money = stringRedisTemplate.opsForValue().get(diningPlatesNum+"-"+storeId); if(StringUtils.isBlank(money)){ throw exception(DINING_PLATES_NOT_BIND); } @@ -386,6 +398,7 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { } DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last("limit 1")); dishOrderMapper.update(Wrappers.lambdaUpdate() @@ -403,9 +416,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { } @Override - public AppUserInfo getMoney(String diningPlatesNum,Long dishId) { + public AppUserInfo getMoney(String diningPlatesNum,Long dishId,Long storeId) { DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId,storeId) .last("limit 1")); BigDecimal moneyByUserId = cardService.getMoneyByUserId(diningPlatesDO.getUserId()); MemberUserDO memberUserDO = memberUserMapper.selectById(diningPlatesDO.getUserId()); @@ -416,7 +430,7 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { appUserInfo.setNickname(memberUserDO.getNickname()) .setDishesName(dish.getDishesName()) .setDishesBasePrice(dish.getDishesBasePrice()).setDishesSumPrice(dish.getDishesSumPrice()) - .setMoney(moneyByUserId).setOrderMoney(new BigDecimal(stringRedisTemplate.opsForValue().get(diningPlatesNum))); + .setMoney(moneyByUserId).setOrderMoney(new BigDecimal(stringRedisTemplate.opsForValue().get(diningPlatesNum+"-"+storeId))); return appUserInfo; } @@ -427,4 +441,18 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { List list = diningPlatesDOS.stream().map(DiningPlatesDO::getDiningPlatesNum).collect(Collectors.toList()); return list; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean checkBindAndUnBind(String diningPlatesNum,Long storeId) { + DiningPlatesDO diningPlatesDO = diningPlatesMapper.selectOne(Wrappers.lambdaQuery() + .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) + .eq(DiningPlatesDO::getStoreId, storeId)); + if(diningPlatesDO == null || diningPlatesDO.getUserId() == null){ + return false; + }else { + unbind(diningPlatesNum,storeId); + return true; + } + } } \ 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 8aa06d30..ae9fe9df 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 @@ -72,22 +72,24 @@ public class OrderDetailServiceImpl implements OrderDetailService { @Override @Transactional(rollbackFor = Exception.class) public Long createOrderDetail(AppOrderDetailSaveReqVO createReqVO) { - //判定餐盘是否绑定并刷新绑定时间 - Boolean b = diningPlatesService.checkBind(createReqVO.getDiningPlatesNum()); - if(!b){ - throw exception(DINING_PLATES_NOT_BIND); - } - //餐盘号去获取订单 - DishOrderDO dishOrderDO = dishOrderMapper.selectOne(Wrappers.lambdaQuery().eq(DishOrderDO::getDiningPlatesNum, createReqVO.getDiningPlatesNum()) + DishOrderDO dishOrderDO = dishOrderMapper.selectOne(Wrappers.lambdaQuery() + .eq(DishOrderDO::getDiningPlatesNum, createReqVO.getDiningPlatesNum()) + .eq(DishOrderDO::getStoreId, createReqVO.getStoreId()) .eq(DishOrderDO::getOrderStatus, DishOrderDO.INCOMPLETE) .orderByDesc(DishOrderDO::getCreateTime) .last(MemberConstants.LIMIT_ONE)); - if(dishOrderDO==null){ + if (dishOrderDO == null) { throw exception(ORDER_ALREADY_COMPLETE); } + //判定餐盘是否绑定并刷新绑定时间 + Boolean b = diningPlatesService.checkBind(createReqVO.getDiningPlatesNum(), createReqVO.getStoreId()); + if (!b) { + throw exception(DINING_PLATES_NOT_BIND); + } + DishesRespDto dish = dishesApi.getDish(createReqVO.getDishesId()); DishesNutritionRespDTO dishEnergy = dishesNutritionApi.getDishEnergy(createReqVO.getDishesId()); @@ -101,20 +103,20 @@ public class OrderDetailServiceImpl implements OrderDetailService { // dishOrderMapper.updateById(dishOrderDO); //} //计算新总价 - String old = stringRedisTemplate.opsForValue().get(createReqVO.getDiningPlatesNum()); - BigDecimal oldBigDecimal = new BigDecimal(old); + String old = stringRedisTemplate.opsForValue().get(createReqVO.getDiningPlatesNum()+"-" +createReqVO.getStoreId()); + BigDecimal oldBigDecimal = new BigDecimal(StrUtil.isBlank(old)?"0":old); //计算每个菜品的价格 - BigDecimal bigDecimal1 = dish.getDishesSumPrice().multiply(createReqVO.getWeight()).divide(dish.getDishesNumber(),2, RoundingMode.HALF_UP); + BigDecimal bigDecimal1 = dish.getDishesSumPrice().multiply(createReqVO.getWeight()).divide(dish.getDishesNumber(), 2, RoundingMode.HALF_UP); // - BigDecimal newPrice =bigDecimal1.add(oldBigDecimal).setScale(2, RoundingMode.HALF_UP); - stringRedisTemplate.opsForValue().set(createReqVO.getDiningPlatesNum(),newPrice.toString()); + BigDecimal newPrice = bigDecimal1.add(oldBigDecimal).setScale(2, RoundingMode.HALF_UP); + stringRedisTemplate.opsForValue().set(createReqVO.getDiningPlatesNum() + "-" +createReqVO.getStoreId(), newPrice.toString()); //计算热量 - if( dishEnergy !=null && StrUtil.isNotEmpty(dishEnergy.getDishesNumber())){ + if (dishEnergy != null && StrUtil.isNotEmpty(dishEnergy.getDishesNumber())) { BigDecimal dishesNumber = new BigDecimal(dishEnergy.getDishesNumber()); BigDecimal nutritionNumber = new BigDecimal(dishEnergy.getNutritionNumber()); - if(BigDecimal.ZERO.compareTo(dishesNumber)!=0){ - BigDecimal bigDecimal = createReqVO.getWeight().multiply(nutritionNumber).divide(dishesNumber.multiply(new BigDecimal("4.184")),2,RoundingMode.HALF_UP); + if (BigDecimal.ZERO.compareTo(dishesNumber) != 0) { + BigDecimal bigDecimal = createReqVO.getWeight().multiply(nutritionNumber).divide(dishesNumber.multiply(new BigDecimal("4.184")), 2, RoundingMode.HALF_UP); orderDetail.setHeat(bigDecimal.doubleValue()); } } @@ -165,7 +167,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { Long storeId = dishOrderMapper.selectById(orderId).getStoreId(); List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().eq(OrderDetailDO::getOrderId, orderId)); List bean = BeanUtils.toBean(orderDetailDOS, AppOrderDetailRespVO.class); - bean.forEach(f->f.setStoreId(storeId)); + bean.forEach(f -> f.setStoreId(storeId)); return bean; } @@ -174,11 +176,12 @@ public class OrderDetailServiceImpl implements OrderDetailService { List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().in(OrderDetailDO::getOrderId, orderIds)); return orderDetailDOS; } - public String getHearder(){ + + public String getHearder() { try { return httpServletRequest.getHeader("Authorization"); } catch (Exception e) { - throw exception(2000_10_001,"无法获取设备编码"); + throw exception(2000_10_001, "无法获取设备编码"); } } @@ -186,7 +189,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { public List selectDishSale(Long storeId) { LocalDate today = LocalDate.now(); String time = today.format(DateTimeFormatter.ofPattern(MemberConstants.DATE_FORMAT)); - return orderDetailMapper.selectDishSale(time,storeId); + return orderDetailMapper.selectDishSale(time, 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 4fc3f373..b9c2d45c 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 @@ -681,9 +681,9 @@ public class MemberUserServiceImpl implements MemberUserService { if(memberUserDO == null){ throw exception(USER_NOT_EXISTS); } - if(memberUserDO.getFaceId()!=null){ - memberUserMapper.deleteFace(memberUserDO.getFaceId()); - } +// if(memberUserDO.getFaceId()!=null){ +// memberUserMapper.deleteFace(memberUserDO.getFaceId()); +// } memberUserDO.setFaceId(faceId); return memberUserMapper.updateById(memberUserDO)>0; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/carteen/CarteenApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/carteen/CarteenApi.java index febd12e9..cb422c71 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/carteen/CarteenApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/carteen/CarteenApi.java @@ -13,7 +13,7 @@ import java.util.List; public interface CarteenApi { /** - * 获得门店信息 + * 根据菜品Id获取门店信息 */ public CarteenRespDto getCarteen(Long id); /** diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 78567273..28b06fbc 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -190,4 +190,6 @@ public interface ErrorCodeConstants { ErrorCode DEVICE_MONEY_NOT_EXISTS = new ErrorCode(1_002_038_002, "门店设备流水不存在"); // ========== 门店 设备日流水 1_002_039_002 ========== ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(1_002_039_002, "门店材料库存不存在"); + + ErrorCode FACE_DEVICE_INFO_NOT_EXISTS = new ErrorCode(1_002_040_002, "人脸设备信息关联门店不存在"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/FaceDeviceInfoController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/FaceDeviceInfoController.java new file mode 100644 index 00000000..3eaa55f9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/FaceDeviceInfoController.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo; + +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoRespVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; +import cn.iocoder.yudao.module.system.service.facedeviceinfo.FaceDeviceInfoService; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + + + +@Tag(name = "管理后台 - 人脸设备信息关联门店") +@RestController +@RequestMapping("/t/face-device-info") +@Validated +public class FaceDeviceInfoController { + + @Resource + private FaceDeviceInfoService faceDeviceInfoService; + + @PostMapping("/create") + @Operation(summary = "创建人脸设备信息关联门店") + @PreAuthorize("@ss.hasPermission('t:face-device-info:create')") + public CommonResult createFaceDeviceInfo(@Valid @RequestBody FaceDeviceInfoSaveReqVO createReqVO) { + return success(faceDeviceInfoService.createFaceDeviceInfo(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新人脸设备信息关联门店") + @PreAuthorize("@ss.hasPermission('t:face-device-info:update')") + public CommonResult updateFaceDeviceInfo(@Valid @RequestBody FaceDeviceInfoSaveReqVO updateReqVO) { + faceDeviceInfoService.updateFaceDeviceInfo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除人脸设备信息关联门店") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('t:face-device-info:delete')") + public CommonResult deleteFaceDeviceInfo(@RequestParam("id") Long id) { + faceDeviceInfoService.deleteFaceDeviceInfo(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得人脸设备信息关联门店") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('t:face-device-info:query')") + public CommonResult getFaceDeviceInfo(@RequestParam("id") Long id) { + FaceDeviceInfoDO faceDeviceInfo = faceDeviceInfoService.getFaceDeviceInfo(id); + return success(BeanUtils.toBean(faceDeviceInfo, FaceDeviceInfoRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得人脸设备信息关联门店分页") + @PreAuthorize("@ss.hasPermission('t:face-device-info:query')") + public CommonResult> getFaceDeviceInfoPage(@Valid FaceDeviceInfoPageReqVO pageReqVO) { + PageResult pageResult = faceDeviceInfoService.getFaceDeviceInfoPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, FaceDeviceInfoRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出人脸设备信息关联门店 Excel") + @PreAuthorize("@ss.hasPermission('t:face-device-info:export')") + @OperateLog(type = EXPORT) + public void exportFaceDeviceInfoExcel(@Valid FaceDeviceInfoPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = faceDeviceInfoService.getFaceDeviceInfoPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "人脸设备信息关联门店.xls", "数据", FaceDeviceInfoRespVO.class, + BeanUtils.toBean(list, FaceDeviceInfoRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoPageReqVO.java new file mode 100644 index 00000000..090c5813 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoPageReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 人脸设备信息关联门店分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FaceDeviceInfoPageReqVO extends PageParam { + + @Schema(description = "设备mac码") + private String mac; + + @Schema(description = "门店编号", example = "29678") + private Long carteenId; + + @Schema(description = "设备名称", example = "芋艿") + private String deviceName; + + @Schema(description = "门店名称", example = "芋艿") + private String carteenName; + + @Schema(description = "激活码") + private String activationCode; + + @Schema(description = "设备在线") + private String alive; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoRespVO.java new file mode 100644 index 00000000..5645e818 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoRespVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 人脸设备信息关联门店 Response VO") +@Data +@ExcelIgnoreUnannotated +public class FaceDeviceInfoRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30094") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "设备mac码") + @ExcelProperty("设备mac码") + private String mac; + + @Schema(description = "门店编号", example = "29678") + @ExcelProperty("门店编号") + private Long carteenId; + + @Schema(description = "设备名称", example = "芋艿") + @ExcelProperty("设备名称") + private String deviceName; + + @Schema(description = "门店名称", example = "芋艿") + @ExcelProperty("门店名称") + private String carteenName; + + @Schema(description = "激活码") + @ExcelProperty("激活码") + private String activationCode; + + @Schema(description = "设备在线") + @ExcelProperty("设备在线") + private String alive; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoSaveReqVO.java new file mode 100644 index 00000000..c90d0ad9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/facedeviceinfo/vo/FaceDeviceInfoSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 人脸设备信息关联门店新增/修改 Request VO") +@Data +public class FaceDeviceInfoSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30094") + private Long id; + + @Schema(description = "设备mac码") + private String mac; + + @Schema(description = "门店编号", example = "29678") + private Long carteenId; + + @Schema(description = "设备名称", example = "芋艿") + private String deviceName; + + @Schema(description = "门店名称", example = "芋艿") + private String carteenName; + + @Schema(description = "激活码") + private String activationCode; + + @Schema(description = "设备在线") + private String alive; + +} \ No newline at end of file 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 new file mode 100644 index 00000000..7c7e9ef0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/FaceController.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.system.controller.app.face; + +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.IdUtil; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.controller.app.face.dto.QueryDto; +import cn.iocoder.yudao.module.system.controller.app.face.dto.SaveDto; +import cn.iocoder.yudao.module.system.dal.dataobject.face.UserFace; +import cn.iocoder.yudao.module.system.service.face.FaceService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.PostConstruct; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + + +@RestController +@RequestMapping("/app/face") +@CrossOrigin +@Slf4j +public class FaceController { + + + @Autowired + private FaceService faceService; + + + + @PostMapping("/register") + public CommonResult faceAdd(SaveDto saveDto) { + log.info("添加人脸特征值到数据库"); +// 生成雪花id + long nextId = IdUtil.getSnowflake().nextId(); + CommonResult httpResult = CommonResult.success("成功"); + MultipartFile file = saveDto.getFile(); + if (file.isEmpty()) { + httpResult.setMsg("文件为空"); + return httpResult; + } + //获取用户信息 + Map memberUserById = faceService.getMemberUserById(saveDto.getUserId()); + saveDto.setName(memberUserById.get("nickname")); + saveDto.setPhone(memberUserById.get("mobile")); + String imagePath = saveFile(file, saveDto.getUserId()); + // 随机生成一个字符串作为用户ID(测试、实际中禁用) + UserFace userById = faceService.getUserById(saveDto.getUserId()); + if (ObjectUtils.isEmpty(userById)) { + UserFace user = new UserFace(nextId, saveDto.getUserId(), saveDto.getPhone(), saveDto.getName(), imagePath); + faceService.getBaseMapper().insert(user); +// WebServerEndpoint.sendMessage(JSONUtil.toJsonStr(user)); + } else { + nextId = userById.getUserId(); + userById.setUrl(imagePath); + faceService.getBaseMapper().updateById(userById); + } + + httpResult.setData(String.valueOf(nextId)); + return httpResult; + } + + + @GetMapping("/getAll") + public CommonResult> getAll(QueryDto dto) { + return CommonResult.success(faceService.getList(dto)); + } + + + public String saveFile(MultipartFile file, Long userId) { + try { + String uploadDirPath = "facedata/"; + + // 创建上传文件目录 + File uploadDir = new File(uploadDirPath); + if (!uploadDir.exists()) { + uploadDir.mkdir(); + } + String suffix = FileNameUtil.getSuffix(file.getOriginalFilename()); + String imagePath = uploadDirPath + userId + "." + suffix; + // 获取文件字节并保存到指定路径 + byte[] bytes = file.getBytes(); + Path path = Paths.get(imagePath); + Files.write(path, bytes); + return imagePath; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/QueryDto.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/QueryDto.java new file mode 100644 index 00000000..4840110e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/QueryDto.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.system.controller.app.face.dto; + +import lombok.Data; + +@Data +public class QueryDto { + private Integer pageNum; + private Integer pageSize; + private String phone; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/SaveDto.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/SaveDto.java new file mode 100644 index 00000000..d1523ec2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/face/dto/SaveDto.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.system.controller.app.face.dto; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +@Data +public class SaveDto { + private String name; + private MultipartFile file; + private Long userId; + private String phone; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/facedeviceinfo/AppFaceDeviceInfoController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/facedeviceinfo/AppFaceDeviceInfoController.java new file mode 100644 index 00000000..b946e38b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/facedeviceinfo/AppFaceDeviceInfoController.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.system.controller.app.facedeviceinfo; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoRespVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; +import cn.iocoder.yudao.module.system.service.facedeviceinfo.FaceDeviceInfoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + + + +@Tag(name = "管理后台 - 人脸设备信息关联门店") +@RestController +@RequestMapping("/t/face-device-info") +@Validated +public class AppFaceDeviceInfoController { + + @Resource + private FaceDeviceInfoService faceDeviceInfoService; + + + @GetMapping("/get") + @Operation(summary = "获得人脸设备信息关联门店") + @Parameter(name = "mac", description = "设备mac码", required = true, example = "1024") + public CommonResult getFaceDeviceInfo(@RequestParam("mac") String mac) { + FaceDeviceInfoDO faceDeviceInfo = faceDeviceInfoService.getInfo(mac); + return success(BeanUtils.toBean(faceDeviceInfo, FaceDeviceInfoRespVO.class)); + } + + + +} \ No newline at end of file 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 new file mode 100644 index 00000000..85026c63 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/face/UserFace.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.face; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("user_face") +public class UserFace { + @TableId + private Long userId; + private byte[] featureValue; + private String url; + private Long sysUserId; + private String name; + private String phone; + private LocalDateTime createTime; + + public UserFace(Long userId, Long sysUserId, String phone, String name, String url) { + this.phone = phone; + this.name = name; + this.sysUserId = sysUserId; + this.userId = userId; + this.url = url; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/facedeviceinfo/FaceDeviceInfoDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/facedeviceinfo/FaceDeviceInfoDO.java new file mode 100644 index 00000000..1e259efd --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/facedeviceinfo/FaceDeviceInfoDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 人脸设备信息关联门店 DO + * + * @author 管理员 + */ +@TableName("t_face_device_info") +@KeySequence("t_face_device_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FaceDeviceInfoDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 设备mac码 + */ + private String mac; + /** + * 门店编号 + */ + private Long carteenId; + /** + * 设备名称 + */ + private String deviceName; + /** + * 门店名称 + */ + private String carteenName; + /** + * 激活码 + */ + private String activationCode; + /** + * 设备在线 + */ + private String alive; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/face/FaceMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/face/FaceMapper.java new file mode 100644 index 00000000..c06d21ca --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/face/FaceMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.dal.mysql.face; + +import cn.iocoder.yudao.module.system.dal.dataobject.face.UserFace; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface FaceMapper extends BaseMapper{ + + @Insert("insert into user_face (user_id,feature_value,url,sys_user_id) values (#{userId},#{featureValue},#{url},#{sysUserId})") + Boolean add(UserFace user); + + @Select("select * from user_face") + List getAllUser(); + + + //根据id查询用户 + @Select("select * from user_face where sys_user_id = #{userId}") + UserFace getUserById(Long userId); + + + @Select("select nickname,mobile from member_user where id = #{userId}") + Map getMemberUserById(Long userId); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/facedeviceinfo/FaceDeviceInfoMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/facedeviceinfo/FaceDeviceInfoMapper.java new file mode 100644 index 00000000..1e7dc664 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/facedeviceinfo/FaceDeviceInfoMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.dal.mysql.facedeviceinfo; + +import java.util.*; + + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + * 人脸设备信息关联门店 Mapper + * + * @author 管理员 + */ +@Mapper +public interface FaceDeviceInfoMapper extends BaseMapperX { + + default PageResult selectPage(FaceDeviceInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(FaceDeviceInfoDO::getMac, reqVO.getMac()) + .eqIfPresent(FaceDeviceInfoDO::getCarteenId, reqVO.getCarteenId()) + .likeIfPresent(FaceDeviceInfoDO::getDeviceName, reqVO.getDeviceName()) + .likeIfPresent(FaceDeviceInfoDO::getCarteenName, reqVO.getCarteenName()) + .eqIfPresent(FaceDeviceInfoDO::getActivationCode, reqVO.getActivationCode()) + .eqIfPresent(FaceDeviceInfoDO::getAlive, reqVO.getAlive()) + .betweenIfPresent(FaceDeviceInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FaceDeviceInfoDO::getId)); + } + +} \ No newline at end of file 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 649f48f9..25033d12 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 @@ -6,8 +6,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.controller.admin.deviceinfo.vo.DeviceInfoPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.deviceinfo.vo.DeviceInfoSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.deviceInfo.DeviceInfoDO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; import cn.iocoder.yudao.module.system.dal.mysql.deviceInfo.DeviceInfoMapper; +import cn.iocoder.yudao.module.system.dal.mysql.facedeviceinfo.FaceDeviceInfoMapper; import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants; +import cn.iocoder.yudao.module.system.service.facedeviceinfo.FaceDeviceInfoService; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; @@ -40,6 +43,9 @@ public class DeviceInfoServiceImpl implements DeviceInfoService { @Resource private HttpServletRequest httpServletRequest; + @Resource + private FaceDeviceInfoMapper faceDeviceInfoMapper; + @Override public Long createDeviceInfo(DeviceInfoSaveReqVO createReqVO) { // 插入 @@ -89,6 +95,9 @@ public class DeviceInfoServiceImpl implements DeviceInfoService { deviceInfoMapper.update(new DeviceInfoDO(),new LambdaUpdateWrapper() .eq(DeviceInfoDO::getDeviceIp,deviceSn) .set(DeviceInfoDO::getAlive,"1")); + faceDeviceInfoMapper.update(new FaceDeviceInfoDO(),new LambdaUpdateWrapper() + .eq(FaceDeviceInfoDO::getMac,deviceSn) + .set(FaceDeviceInfoDO::getAlive,"1")); } @Override @@ -112,7 +121,28 @@ public class DeviceInfoServiceImpl implements DeviceInfoService { .set(DeviceInfoDO::getAlive,"0") .in(DeviceInfoDO::getDeviceIp,updateList)); } - return updateList.size(); + + List upList = new ArrayList<>(); + List faceDeviceInfoDOS = faceDeviceInfoMapper.selectList(); + List macList = faceDeviceInfoDOS.stream().map(FaceDeviceInfoDO::getMac).collect(Collectors.toList()); + for (String deviceSn : macList){ + String time = RedisTemplate.opsForValue().get(deviceSn); + if(StringUtils.isBlank(time)){ + upList.add(deviceSn); + continue; + } + if(System.currentTimeMillis()-Long.valueOf(time)>120000){ + upList.add(deviceSn); + } + } + + if(CollectionUtil.isNotEmpty(upList)){ + faceDeviceInfoMapper.update(new FaceDeviceInfoDO(),new LambdaUpdateWrapper() + .set(FaceDeviceInfoDO::getAlive,"0") + .in(FaceDeviceInfoDO::getMac,upList)); + } + + return updateList.size()+upList.size(); } public String 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 new file mode 100644 index 00000000..c346350a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/face/FaceService.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.service.face; + +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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class FaceService extends ServiceImpl implements IService { + + @Autowired + private FaceMapper mapper; + + //注册人脸 + public void faceAdd(UserFace user) { + mapper.add(user); + } + //查找人脸 + public List getAllUserFace() { + return mapper.getAllUser(); + } + + public UserFace getUserById(Long userId) { + return mapper.getUserById(userId); + } + + public Page getList(QueryDto dto) { + Page page = new Page<>(dto.getPageNum(), dto.getPageSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(dto.getPhone()), UserFace::getPhone, dto.getPhone()); + wrapper.orderByDesc(UserFace::getCreateTime); + return mapper.selectPage(page, wrapper); + } + + public Map getMemberUserById(Long id) { + return mapper.getMemberUserById(id); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoService.java new file mode 100644 index 00000000..9c7bc34e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoService.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.system.service.facedeviceinfo; + +import java.util.*; +import javax.validation.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; + +/** + * 人脸设备信息关联门店 Service 接口 + * + * @author 管理员 + */ +public interface FaceDeviceInfoService { + + /** + * 创建人脸设备信息关联门店 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFaceDeviceInfo(@Valid FaceDeviceInfoSaveReqVO createReqVO); + + /** + * 更新人脸设备信息关联门店 + * + * @param updateReqVO 更新信息 + */ + void updateFaceDeviceInfo(@Valid FaceDeviceInfoSaveReqVO updateReqVO); + + /** + * 删除人脸设备信息关联门店 + * + * @param id 编号 + */ + void deleteFaceDeviceInfo(Long id); + + /** + * 获得人脸设备信息关联门店 + * + * @param id 编号 + * @return 人脸设备信息关联门店 + */ + FaceDeviceInfoDO getFaceDeviceInfo(Long id); + + /** + * 获得人脸设备信息关联门店分页 + * + * @param pageReqVO 分页查询 + * @return 人脸设备信息关联门店分页 + */ + PageResult getFaceDeviceInfoPage(FaceDeviceInfoPageReqVO pageReqVO); + + FaceDeviceInfoDO getInfo(String mac); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoServiceImpl.java new file mode 100644 index 00000000..ac3a3431 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/facedeviceinfo/FaceDeviceInfoServiceImpl.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.system.service.facedeviceinfo; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.facedeviceinfo.vo.FaceDeviceInfoSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.facedeviceinfo.FaceDeviceInfoDO; +import cn.iocoder.yudao.module.system.dal.mysql.carteen.CarteenMapper; +import cn.iocoder.yudao.module.system.dal.mysql.facedeviceinfo.FaceDeviceInfoMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + + + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.FACE_DEVICE_INFO_NOT_EXISTS; + + +/** + * 人脸设备信息关联门店 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class FaceDeviceInfoServiceImpl implements FaceDeviceInfoService { + + @Resource + private FaceDeviceInfoMapper faceDeviceInfoMapper; + + @Resource + private CarteenMapper carteenMapper; + + @Override + public Long createFaceDeviceInfo(FaceDeviceInfoSaveReqVO createReqVO) { + // 插入 + FaceDeviceInfoDO faceDeviceInfo = BeanUtils.toBean(createReqVO, FaceDeviceInfoDO.class); + faceDeviceInfoMapper.insert(faceDeviceInfo); + // 返回 + return faceDeviceInfo.getId(); + } + + @Override + public void updateFaceDeviceInfo(FaceDeviceInfoSaveReqVO updateReqVO) { + // 校验存在 + validateFaceDeviceInfoExists(updateReqVO.getId()); + // 更新 + FaceDeviceInfoDO updateObj = BeanUtils.toBean(updateReqVO, FaceDeviceInfoDO.class); + faceDeviceInfoMapper.updateById(updateObj); + } + + @Override + public void deleteFaceDeviceInfo(Long id) { + // 校验存在 + validateFaceDeviceInfoExists(id); + // 删除 + faceDeviceInfoMapper.deleteById(id); + } + + private void validateFaceDeviceInfoExists(Long id) { + if (faceDeviceInfoMapper.selectById(id) == null) { + throw exception(FACE_DEVICE_INFO_NOT_EXISTS); + } + } + + @Override + public FaceDeviceInfoDO getFaceDeviceInfo(Long id) { + return faceDeviceInfoMapper.selectById(id); + } + + @Override + public PageResult getFaceDeviceInfoPage(FaceDeviceInfoPageReqVO pageReqVO) { + PageResult faceDeviceInfoDOPageResult = faceDeviceInfoMapper.selectPage(pageReqVO); + List list = faceDeviceInfoDOPageResult.getList(); + if (CollectionUtil.isNotEmpty(list)){ + list.forEach(vo ->{ + vo.setCarteenName(carteenMapper.selectById(vo.getCarteenId()).getStoresName()); + }); + } + return faceDeviceInfoDOPageResult; + } + + @Override + public FaceDeviceInfoDO getInfo(String mac) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(FaceDeviceInfoDO::getMac, mac); + FaceDeviceInfoDO faceDeviceInfoDO = faceDeviceInfoMapper.selectOne(wrapper); + faceDeviceInfoDO.setCarteenName(carteenMapper.selectById(faceDeviceInfoDO.getCarteenId()).getStoresName()); + return faceDeviceInfoDO; + } +} \ No newline at end of file