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 cc0227f1..2fdc1e50 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 @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.system.api.dish.DishesApi; import cn.iocoder.yudao.module.system.api.dish.dto.DishExcelDto; import com.alibaba.excel.EasyExcel; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; @@ -28,7 +29,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; @Tag(name = "管理后台 - 表格导入") @@ -106,6 +106,7 @@ public class ExcelImportController { return notExist; } + @Operation(summary = "菜品导入") @PostMapping("/dishImport") public void importExcelDish(MultipartFile file,Long storeId) { if (!file.isEmpty()) { @@ -145,6 +146,7 @@ public class ExcelImportController { } + @Operation(summary = "商品导入") @PostMapping("/GoodsImport") public void importExcelGoods(MultipartFile file,Long storeId) { if (!file.isEmpty()) { 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 e55e5f77..eee2578f 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 @@ -214,6 +214,14 @@ public class MemberUserController { return success(true); } + @PutMapping("/imgCreate") + @Operation(summary = "图片数据创建会员") + public CommonResult imgCreate(String filePath,Long storeId){ + memberUserService.imgCreate(filePath,storeId); + return success(true); + } + + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java index e4f577fa..cdef2cd2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java @@ -1,13 +1,15 @@ package cn.iocoder.yudao.module.member.dal.mysql.storebusiness; -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.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.StoreBusinessPageReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.time.LocalDateTime; /** * 超市营业统计 Mapper @@ -38,4 +40,9 @@ public interface StoreBusinessMapper extends BaseMapperX { .orderByDesc(StoreBusinessDO::getId)); } + + @Select("select * from member_store_business where carteen_id = #{carteenId} and create_time between #{startOfDay} and #{endOfDay} limit 1 for update") + StoreBusinessDO getTodayBusiness(@Param("carteenId") Long carteenId, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); + + } \ 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 24257d70..a610f118 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 @@ -11,7 +11,6 @@ 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; @@ -37,7 +36,6 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_BUSINESS_NOT_EXISTS; -import static cn.iocoder.yudao.module.member.service.amount.LockManager.getSupermarketLock; /** * 超市营业统计 Service 实现类 @@ -96,7 +94,6 @@ public class StoreBusinessServiceImpl implements StoreBusinessService { @Override public void updateStatistics(StatisticsVo vo) { - synchronized(getSupermarketLock(vo.getCarteenId())){ LocalDate now = LocalDate.now(); if(vo.getTime()!=null){ now = vo.getTime().toLocalDate(); @@ -106,20 +103,9 @@ public class StoreBusinessServiceImpl implements StoreBusinessService { // 获取今天的结束时间 (23:59:59.999) LocalDateTime endOfDay = LocalDateTime.of(now, LocalTime.MAX); - List storeBusinessDOS = storeBusinessMapper.selectList(Wrappers.lambdaQuery() - .between(StoreBusinessDO::getCreateTime, startOfDay, endOfDay) - .eq(StoreBusinessDO::getCarteenId, vo.getCarteenId())); - if (CollectionUtil.isNotEmpty(storeBusinessDOS)) { - StoreBusinessDO storeBusinessDO = storeBusinessDOS.get(0); + StoreBusinessDO storeBusinessDO = storeBusinessMapper.getTodayBusiness(vo.getCarteenId(), startOfDay, endOfDay); + if (storeBusinessDO!=null) { - //重量 -// if(ObjectUtil.isNotEmpty(vo.getOrderId())){ -// List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().eq(OrderDetailDO::getOrderId, vo.getOrderId())); -// if (CollectionUtil.isNotEmpty(orderDetailDOS)) { -// BigDecimal reduce = orderDetailDOS.stream().map(OrderDetailDO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); -// businessDO.setWeigh(businessDO.getWeigh().add(reduce)); -// } -// } //订单数 storeBusinessDO.setOrderSum(storeBusinessDO.getOrderSum() + vo.getOrderSum()); @@ -158,7 +144,7 @@ public class StoreBusinessServiceImpl implements StoreBusinessService { storeBusinessMapper.updateById(storeBusinessDO); } - } + } 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 44a98b3a..405e6113 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 @@ -266,4 +266,6 @@ public interface MemberUserService { List getListByMobile(String mobiles); void jsonCreate(String filePath,Long storeId); + + void imgCreate(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 a5965e45..f3e5a16d 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 @@ -4,31 +4,19 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; 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.*; -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; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppNutritionDayVo; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppNutritionWeekVO; -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppWeekVO; +import cn.iocoder.yudao.module.member.controller.app.user.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.dal.dataobject.diningplates.DiningPlatesDO; @@ -65,25 +53,18 @@ 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 com.sun.org.apache.bcel.internal.generic.NEW; 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.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.HttpURLConnection; @@ -94,14 +75,10 @@ import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.WeekFields; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -1088,4 +1065,154 @@ public class MemberUserServiceImpl implements MemberUserService { return null; } + @Override + public void imgCreate(String filePath, Long storeId) { + String sourceFolderPath = filePath; + String targetFolderPath = "facedata/"; + ArrayList updateList = new ArrayList<>(); + List imageFiles = getImagesInFolder(sourceFolderPath); + for (File imageFile : imageFiles) { + String[] nameAndPhone = extractNameAndPhone(imageFile.getName()); + String name = nameAndPhone[0].replaceAll(" ", "").replaceAll("_", ""); + String phoneNumber = nameAndPhone[1]; + String path=null; + if (shouldUpload(phoneNumber)) { + try { + path=uploadImage(imageFile, targetFolderPath); + System.out.println("成功上传图片: " + imageFile.getName() + ",姓名: " + name + ",电话: " + phoneNumber); + } catch (IOException e) { + System.err.println("上传图片 " + imageFile.getName() + " 时出错: " + e.getMessage()); + } + // 用户已经存在 + MemberUserDO userSelect = memberUserMapper.selectByMobile(phoneNumber); + if (userSelect != null) { + continue; + } + // 用户不存在,则进行创建 + // 生成密码 + String password = IdUtil.fastSimpleUUID(); + // 插入用户 + MemberUserDO user = new MemberUserDO(); + user.setMobile(phoneNumber); + user.setLimitAmount(new BigDecimal("30")); + user.setNickname(name); + user.setName(name); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(password)); // 加密密码 + user.setRegisterIp("null"); + memberUserMapper.insert(user); + + Long id = user.getId(); + + if (StringUtils.isNotBlank(path)) { + UserJsonDto userJsonDto = new UserJsonDto(); + userJsonDto.setUserNickname(name); + userJsonDto.setUserId(id); + userJsonDto.setUrl(path); + userJsonDto.setPhoneNumber(phoneNumber); + userJsonDto.setCarteenId(storeId); + Long faceId = faceApi.addFace(userJsonDto); + user.setFaceId(faceId); + updateList.add(user); + } + } else { + System.out.println("跳过图片: " + imageFile.getName() + ",姓名: " + name + ",电话: " + phoneNumber); + } + } + + if (CollectionUtil.isNotEmpty(updateList)) { + memberUserMapper.updateBatch(updateList); + } + } + + // 支持的图片文件扩展名 + private static final String[] IMAGE_EXTENSIONS = {".jpg", ".jpeg", ".png"}; + // 电话号码正则表达式,这里简单假设为 11 位数字 + private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("\\d{11}"); + + /** + * 获取指定文件夹下的所有图片文件 + * @param folderPath 文件夹的相对路径 + * @return 图片文件列表 + */ + public static List getImagesInFolder(String folderPath) { + List imageFiles = new ArrayList<>(); + File folder = new File(folderPath); + if (folder.exists() && folder.isDirectory()) { + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (isImageFile(file)) { + imageFiles.add(file); + } + } + } + } + return imageFiles; + } + + /** + * 判断文件是否为图片文件 + * @param file 文件对象 + * @return 如果是图片文件返回 true,否则返回 false + */ + private static boolean isImageFile(File file) { + String fileName = file.getName().toLowerCase(); + for (String extension : IMAGE_EXTENSIONS) { + if (fileName.endsWith(extension)) { + return true; + } + } + return false; + } + + /** + * 从图片文件名中提取名字和电话号码 + * @param fileName 图片文件名 + * @return 包含名字和电话号码的数组,索引 0 为名字,索引 1 为电话号码 + */ + public static String[] extractNameAndPhone(String fileName) { + String[] result = new String[2]; + int index = fileName.lastIndexOf("_"); + if (index != -1) { + result[0] = fileName.substring(0, index); + String phonePart = fileName.substring(index + 1, fileName.lastIndexOf(".")); + Matcher matcher = PHONE_NUMBER_PATTERN.matcher(phonePart); + if (matcher.matches()) { + result[1] = phonePart; + } + } + return result; + } + + /** + * 判断是否上传图片 + * @param phoneNumber 电话号码 + * @return 如果需要上传返回 true,否则返回 false + */ + public static boolean shouldUpload(String phoneNumber) { + // 这里可以根据具体需求实现判断逻辑,例如判断电话号码是否以某个数字开头等 + return phoneNumber != null; + } + + /** + * 上传图片到指定路径 + * @param sourceFile 源图片文件 + * @param targetPath 目标路径 + * @throws IOException 当文件操作出现异常时抛出 + */ + public static String uploadImage(File sourceFile, String targetPath) throws IOException { + + String path = targetPath+IdUtil.getSnowflakeNextIdStr()+"."+ FileUtil.getSuffix(sourceFile); + File targetFile = new File(path); + try (InputStream in = new FileInputStream(sourceFile); + OutputStream out = new FileOutputStream(targetFile)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = in.read(buffer)) > 0) { + out.write(buffer, 0, length); + } + } + return path; + } }