This commit is contained in:
zt
2025-03-01 14:04:59 +08:00
parent 2fc4303db9
commit 0c673a46a7
6 changed files with 184 additions and 52 deletions

View File

@ -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()) {

View File

@ -214,6 +214,14 @@ public class MemberUserController {
return success(true);
}
@PutMapping("/imgCreate")
@Operation(summary = "图片数据创建会员")
public CommonResult<Boolean> imgCreate(String filePath,Long storeId){
memberUserService.imgCreate(filePath,storeId);
return success(true);
}
}

View File

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

View File

@ -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<StoreBusinessDO> storeBusinessDOS = storeBusinessMapper.selectList(Wrappers.<StoreBusinessDO>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<OrderDetailDO> orderDetailDOS = orderDetailMapper.selectList(Wrappers.<OrderDetailDO>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);
}
}
}

View File

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

View File

@ -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<MemberUserDO> updateList = new ArrayList<>();
List<File> 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<File> getImagesInFolder(String folderPath) {
List<File> 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;
}
}