Merge branch 'cc_20250620_pre_fly' into 'master'

Cc 20250620 pre fly

See merge request hangzhou/java/custom_zxjp!118
This commit is contained in:
苏竹红
2025-06-25 13:10:46 +00:00
65 changed files with 4321 additions and 8 deletions

View File

@@ -0,0 +1,67 @@
package com.cool.store.service;
import com.cool.store.dto.pre.fry.PreFriedProductsBatchDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsDetailDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsQueryDTO;
import com.cool.store.entity.PreFriedProductsDO;
import com.github.pagehelper.PageInfo;
/**
* @Author suzhuhong
* @Date 2025/6/20 19:47
* @Version 1.0
*/
public interface PreFriedProductsService {
/**
* 新增产品
* @param dto 产品信息
* @return 产品ID
*/
Long createProduct(PreFriedProductsDTO dto, String userId);
/**
* 修改产品
* @param dto
* @param userId
* @return
*/
Long updateProduct(PreFriedProductsDTO dto, String userId);
/**
* 批量删除(逻辑删除)
* @param batchDTO 包含ID列表和操作人
* @return 成功数量
*/
int batchDelete(PreFriedProductsBatchDTO batchDTO, String userId);
/**
* 批量上下架
* @param batchDTO 包含ID列表、目标状态和操作人
* @return 成功数量
*/
int batchUpdateStatus(PreFriedProductsBatchDTO batchDTO, String userId);
/**
* 条件查询产品列表
* @param queryDTO 查询条件
* @return 产品列表
*/
PageInfo<PreFriedProductsDetailDTO> queryProducts(PreFriedProductsQueryDTO queryDTO);
/**
* 根据ID查询详情
* @param id
* @return
*/
PreFriedProductsDetailDTO queryById(Long id);
}

View File

@@ -0,0 +1,89 @@
package com.cool.store.service;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dto.pre.fry.*;
import com.cool.store.entity.PreFryQualificationApplyDO;
import com.cool.store.userholder.CurrentUser;
import com.cool.store.vo.PartnerUserInfoVO;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* @Author suzhuhong
* @Date 2025/6/21 14:49
* @Version 1.0
*/
public interface PreFryQualificationApplyService {
/**
* 提交预炸资质申请
* @param request
* @param user
* @return
*/
Long submitApply(ApplyDTO request, PartnerUserInfoVO user);
/**
* 重新提交预炸资质申请
* @param request
* @param user
* @return
*/
Long reSubmitApply(ApplyDTO request, PartnerUserInfoVO user);
/**
* 根据门店编码和申请类型查询
* @param storeCode
* @param applyType
* @return
*/
ApplyDTO getByStoreCodeAndApplyType(String storeCode, Integer applyType);
/**
* 根据申请记录id查询审批记录
* @param recordId
* @return
*/
List<ApprovalRecordDTO> getApprovalRecordById(Long recordId);
/**
* 管理页面列表
* @param query
* @return
*/
PageInfo<ApplyManagementDTO> queryApplyManagementList(ApplyManagementQueryDTO query);
/**
* 获取申请详情
* @param id
* @return
*/
ApplyDetailDTO getApplyDetail(Long id);
/**
* audit
* @param applyAuditDTO
* @param currentUser
* @return
*/
Boolean audit(ApplyAuditDTO applyAuditDTO, LoginUserInfo currentUser);
/**
* 获取门店申请最小的applyType
* @param storeCode
* @return
*/
Integer getMinApplyType(String storeCode);
/**
* 根据门店查询当前申请类型状态
* @param storeCode
* @return
*/
List<PreFryQualificationApplyDTO> getListByStoreCode(String storeCode);
}

View File

@@ -0,0 +1,35 @@
package com.cool.store.service;
import com.cool.store.dto.pre.fry.*;
import com.cool.store.vo.PartnerUserInfoVO;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* @Author suzhuhong
* @Date 2025/6/23 14:39
* @Version 1.0
*/
public interface PreFryRecordsService {
/**
* 批量插入
* @param addPreFryRecordsDTO
* @return
*/
Boolean batchInsert(AddPreFryRecordsDTO addPreFryRecordsDTO, PartnerUserInfoVO user);
PageInfo<PreFryRecordsDetailDTO> ListByStoreCodeAndDate(FryRecordsQueryDTO dto);
PreFryRecordsDetailDTO getById(Long id);
List<DailyFryCountDTO> queryByStoreCode(String storeCode, Long time);
PageInfo<PreFryRecordsDTO> queryByQueryDTO(PreFryRecordQueryDTO dto);
}

View File

@@ -0,0 +1,141 @@
package com.cool.store.service.impl;
import com.cool.store.dao.PreFriedProductsDAO;
import com.cool.store.dto.pre.fry.PreFriedProductsBatchDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsDetailDTO;
import com.cool.store.dto.pre.fry.PreFriedProductsQueryDTO;
import com.cool.store.entity.PreFriedProductsDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.PreFriedProductsMapper;
import com.cool.store.service.PreFriedProductsService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author suzhuhong
* @Date 2025/6/20 19:47
* @Version 1.0
*/
@Service
public class PreFriedProductsServiceImpl implements PreFriedProductsService {
@Resource
private PreFriedProductsDAO preFriedProductsDAO;
@Override
public Long createProduct(PreFriedProductsDTO dto, String userId) {
if (dto==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
PreFriedProductsDO preFriedProductsDO = preFriedProductsDAO.queryByProductCode(dto.getProductCode());
if (preFriedProductsDO!=null){
throw new ServiceException(ErrorCodeEnum.PRODUCTS_CODE_EXIST);
}
PreFriedProductsDO product = convertToDO(dto);
product.setCreatedTime(new Date());
product.setCreatedUserId(userId);
preFriedProductsDAO.createProduct(product);
return product.getId();
}
@Override
public Long updateProduct(PreFriedProductsDTO dto, String userId) {
if (dto==null||dto.getId() == null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
PreFriedProductsDO preFriedProductsDO = preFriedProductsDAO.queryByProductCode(dto.getProductCode());
if (preFriedProductsDO!=null && !preFriedProductsDO.getId().equals(dto.getId())){
throw new ServiceException(ErrorCodeEnum.PRODUCTS_CODE_EXIST);
}
PreFriedProductsDO product = convertToDO(dto);
product.setUpdatedTime(new Date());
product.setUpdatedUserId(userId);
preFriedProductsDAO.updateProduct( product);
return product.getId();
}
@Override
public int batchDelete(PreFriedProductsBatchDTO batchDTO, String userId) {
validateBatchOperation(batchDTO);
return preFriedProductsDAO.batchDeleteProducts(batchDTO.getIds(), userId);
}
@Override
public int batchUpdateStatus(PreFriedProductsBatchDTO batchDTO, String userId) {
validateBatchOperation(batchDTO);
if (batchDTO.getStatus() == null || (batchDTO.getStatus() != 0 && batchDTO.getStatus() != 1)) {
throw new IllegalArgumentException("状态值必须为0或1");
}
return preFriedProductsDAO.batchUpdateProductStatus(
batchDTO.getIds(),
batchDTO.getStatus(),
userId
);
}
@Override
public PageInfo<PreFriedProductsDetailDTO> queryProducts(PreFriedProductsQueryDTO queryDTO) {
PageHelper.startPage(queryDTO.getPageNum(),queryDTO.getPageSize());
List<PreFriedProductsDO> dos = preFriedProductsDAO.selectByCondition(
queryDTO.getProductCode(),
queryDTO.getProductName(),
queryDTO.getStatus()
);
PageInfo preFriedProductsDOPageInfo = new PageInfo<>(dos);
List<PreFriedProductsDetailDTO> preFriedProductsDTOS = convertToDTOs(dos);
preFriedProductsDOPageInfo.setList(preFriedProductsDTOS);
return preFriedProductsDOPageInfo;
}
@Override
public PreFriedProductsDetailDTO queryById(Long id) {
//查询详情
PreFriedProductsDO product = preFriedProductsDAO.queryById(id);
if (product == null){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_PRODUCT_NOT_EXIST);
}
return convertToDTO(product);
}
/**
* 转换方法
* @param dto
* @return
*/
private PreFriedProductsDO convertToDO(PreFriedProductsDTO dto) {
PreFriedProductsDO product = new PreFriedProductsDO();
BeanUtils.copyProperties(dto, product);
return product;
}
private List<PreFriedProductsDetailDTO> convertToDTOs(List<PreFriedProductsDO> dos) {
return dos.stream().map(this::convertToDTO).collect(Collectors.toList());
}
private PreFriedProductsDetailDTO convertToDTO(PreFriedProductsDO product) {
if (product != null) {
PreFriedProductsDetailDTO dto = new PreFriedProductsDetailDTO();
BeanUtils.copyProperties(product, dto);
return dto;
} else {
return null;
}
}
private void validateBatchOperation(PreFriedProductsBatchDTO batchDTO) {
if (batchDTO.getIds() == null || batchDTO.getIds().isEmpty()) {
throw new IllegalArgumentException("ID列表不能为空");
}
}
}

View File

@@ -0,0 +1,221 @@
package com.cool.store.service.impl;
import com.cool.store.constants.CommonConstants;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.PreFryApprovalRecordsDAO;
import com.cool.store.dao.PreFryQualificationApplyDAO;
import com.cool.store.dto.pre.fry.*;
import com.cool.store.entity.PreFryApprovalRecordsDO;
import com.cool.store.entity.PreFryQualificationApplyDO;
import com.cool.store.enums.AuditOperationTypeEnum;
import com.cool.store.enums.AuditStatusEnum;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.service.PreFryQualificationApplyService;
import com.cool.store.userholder.CurrentUser;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.vo.PartnerUserInfoVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
/**
* @Author suzhuhong
* @Date 2025/6/21 14:49
* @Version 1.0
*/
@Service
public class PreFryQualificationApplyServiceImpl implements PreFryQualificationApplyService {
@Resource
private PreFryQualificationApplyDAO preFryQualificationApplyDAO;
@Resource
private PreFryApprovalRecordsDAO preFryApprovalRecordsDAO;
@Override
public Long submitApply(ApplyDTO request, PartnerUserInfoVO user) {
// 1. 参数校验
validateRequest(request);
// 2. 检查是否已有同类型申请
PreFryQualificationApplyDO preFryQualificationApplyDO = preFryQualificationApplyDAO.selectByStoreCodeAndType(request.getStoreCode(), request.getApplyType());
if(preFryQualificationApplyDO!=null){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_RECORD_EXIST);
}
// 3. 创建申请记录
PreFryQualificationApplyDO apply = createApplyRecord(request,user);
// 4. 创建审批操作记录
createApprovalRecord(apply.getId(), AuditOperationTypeEnum.APPLY.getCode(),1, user.getUsername(),"");
return apply.getId();
}
@Override
public Long reSubmitApply(ApplyDTO request, PartnerUserInfoVO user) {
// 1. 参数校验
validateRequest(request);
// 2. 检查是否已有同类型申请
PreFryQualificationApplyDO preFryQualificationApplyDO = preFryQualificationApplyDAO.selectByStoreCodeAndType(request.getStoreCode(), request.getApplyType());
if(preFryQualificationApplyDO!=null&& !preFryQualificationApplyDO.getId().equals(request.getId())){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_RECORD_EXIST);
}
// 3. 创建申请记录
PreFryQualificationApplyDO old = preFryQualificationApplyDAO.queryById(request.getId());
old.setApplyType(request.getApplyType());
old.setColdStorageBoxPhoto(request.getColdStorageBoxPhoto());
old.setProtectiveCoverPhoto(request.getProtectiveCoverPhoto());
old.setRefrigeratorPlatePhoto(request.getRefrigeratorPlatePhoto());
old.setRefrigeratorPhoto(request.getRefrigeratorPhoto());
old.setAuditStatus(AuditStatusEnum.TODO.getCode());
old.setUpdatedTime(new Date());
preFryQualificationApplyDAO.updateForce(old);
// 4. 创建审批操作记录
createApprovalRecord(old.getId(), AuditOperationTypeEnum.APPLY.getCode(),1, user.getUsername(),"");
return old.getId();
}
@Override
public ApplyDTO getByStoreCodeAndApplyType(String storeCode, Integer applyType) {
if (applyType == null|| StringUtils.isEmpty(storeCode)){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
PreFryQualificationApplyDO preFryQualificationApplyDO = preFryQualificationApplyDAO.selectByStoreCodeAndType(storeCode, applyType);
if (preFryQualificationApplyDO != null) {
ApplyDTO applyDTO = new ApplyDTO();
BeanUtils.copyProperties(preFryQualificationApplyDO, applyDTO);
return applyDTO;
}
return null;
}
@Override
public List<ApprovalRecordDTO> getApprovalRecordById(Long recordId) {
if (recordId == null) {
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
List<PreFryApprovalRecordsDO> records = preFryApprovalRecordsDAO.getRecordsByApplyId(recordId);
List<ApprovalRecordDTO> result = new ArrayList<>();
if (records != null){
records.forEach(record -> {
ApprovalRecordDTO recordDTO = new ApprovalRecordDTO();
BeanUtils.copyProperties(record, recordDTO);
result.add(recordDTO);
});
}
return result;
}
@Override
public PageInfo<ApplyManagementDTO> queryApplyManagementList(ApplyManagementQueryDTO query) {
PageHelper.startPage(query.getPageNum(), query.getPageSize());
List<ApplyManagementDTO> applyManagementDTOS = preFryQualificationApplyDAO.selectApplyManagementList(query);
return new PageInfo<>(applyManagementDTOS);
}
@Override
public ApplyDetailDTO getApplyDetail(Long id) {
ApplyDetailDTO applyDetail = preFryQualificationApplyDAO.getApplyDetail(id);
if (applyDetail==null){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_APPLY_NOT_EXIST);
}
return applyDetail;
}
@Override
public Boolean audit(ApplyAuditDTO applyAuditDTO, LoginUserInfo currentUser) {
PreFryQualificationApplyDO preFryQualificationApplyDO = preFryQualificationApplyDAO.queryById(applyAuditDTO.getId());
if (preFryQualificationApplyDO==null){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_APPLY_NOT_EXIST);
}
preFryQualificationApplyDO.setAuditStatus(applyAuditDTO.getAuditStatus());
preFryQualificationApplyDAO.updateForce(preFryQualificationApplyDO);
createApprovalRecord(applyAuditDTO.getId(), 2,applyAuditDTO.getAuditStatus(),currentUser.getName(),applyAuditDTO.getAuditRemark());
return Boolean.TRUE;
}
@Override
public Integer getMinApplyType(String storeCode) {
PreFryQualificationApplyDO minApplyTypeByStoreCode = preFryQualificationApplyDAO.getMinApplyTypeByStoreCode(storeCode);
if (minApplyTypeByStoreCode == null){
return -1;
}
return minApplyTypeByStoreCode.getApplyType();
}
@Override
public List<PreFryQualificationApplyDTO> getListByStoreCode(String storeCode) {
if (StringUtils.isBlank(storeCode)) {
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
List<PreFryQualificationApplyDO> preFryQualificationApplyDOS = preFryQualificationApplyDAO.listByStoreCode(storeCode);
List<PreFryQualificationApplyDTO> preFryQualificationApplyDTOS = new ArrayList<>();
preFryQualificationApplyDOS.forEach(x->{
PreFryQualificationApplyDTO preFryQualificationApplyDTO = new PreFryQualificationApplyDTO();
preFryQualificationApplyDTO.setId(x.getId());
preFryQualificationApplyDTO.setApplyType(x.getApplyType());
preFryQualificationApplyDTO.setAuditStatus(x.getAuditStatus());
preFryQualificationApplyDTO.setStoreCode(x.getStoreCode());
preFryQualificationApplyDTOS.add(preFryQualificationApplyDTO);
});
return preFryQualificationApplyDTOS;
}
private void validateRequest(ApplyDTO request) {
if (request == null || StringUtils.isBlank(request.getStoreCode())
|| request.getApplyType() == null) {
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
}
private PreFryQualificationApplyDO createApplyRecord(ApplyDTO request,PartnerUserInfoVO user) {
PreFryQualificationApplyDO apply = new PreFryQualificationApplyDO();
BeanUtils.copyProperties(request, apply);
apply.setAuditStatus(AuditStatusEnum.TODO.getCode());
apply.setCreatedTime(new Date());
apply.setCreatedUserId(user.getPartnerId());
apply.setApplyCode(getPreFlyQualificationApplyCode());
preFryQualificationApplyDAO.createQualificationApply(apply);
return apply;
}
private void createApprovalRecord(Long applyId, Integer recordType,Integer operationStatus,String userName,String remark) {
PreFryApprovalRecordsDO record = new PreFryApprovalRecordsDO();
record.setApplyId(applyId);
record.setRecordType(recordType);
record.setOperationStatus(operationStatus);
record.setOperatorName(userName);
record.setRemark(remark);
record.setCreatedTime(new Date());
preFryApprovalRecordsDAO.createApprovalRecord(record);
}
public String getPreFlyQualificationApplyCode() {
//当前日期
String today = CoolDateUtils.getToday();
return "13" + today + String.format("%04d", ThreadLocalRandom.current().nextInt(100000));
}
}

View File

@@ -0,0 +1,325 @@
package com.cool.store.service.impl;
import com.cool.store.dao.*;
import com.cool.store.dto.pre.fry.*;
import com.cool.store.entity.*;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.PreFryApplyTypeEnum;
import com.cool.store.enums.PreFryStageEnum;
import com.cool.store.enums.ViolationEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.service.PreFryRecordsService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.poi.DateUtils;
import com.cool.store.vo.PartnerUserInfoVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import static com.cool.store.enums.PreFryStageEnum.*;
/**
* @Author suzhuhong
* @Date 2025/6/23 14:39
* @Version 1.0
*/
@Service
public class PreFryRecordsServiceImpl implements PreFryRecordsService {
@Resource
PreFryRecordsDAO preFryRecordsDAO;
@Resource
PreFryStageChangesDAO preFryStageChangesDAO;
@Resource
PreFryQualificationApplyDAO preFryQualificationApplyDAO;
@Resource
PreFriedProductsDAO preFriedProductsDAO;
@Override
public Boolean batchInsert(AddPreFryRecordsDTO addPreFryRecordsDTO, PartnerUserInfoVO user) {
if (CollectionUtils.isEmpty(addPreFryRecordsDTO.getRecords())|| CollectionUtils.isEmpty(addPreFryRecordsDTO.getRecords())){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
//查询门店当前最高优先级申请类型
PreFryQualificationApplyDO minApplyTypeByStoreCode = preFryQualificationApplyDAO.getMinApplyTypeByStoreCode(addPreFryRecordsDTO.getStoreCode());
if (minApplyTypeByStoreCode==null){
throw new ServiceException(ErrorCodeEnum.PRE_FRY_APPLY_NOT_EXIST);
}
if (addPreFryRecordsDTO!=null&&CollectionUtils.isNotEmpty(addPreFryRecordsDTO.getRecords())){
List<Long> productList = addPreFryRecordsDTO.getRecords().stream().map(AddPreFryRecordsDetailDTO::getProductId).collect(Collectors.toList());
List<PreFriedProductsDO> preFriedProductsDOS = preFriedProductsDAO.selectByProductIds(productList);
//校验是否包含下架的产品 recordId是空的时候是新增 是有新增的时候限制
if (preFriedProductsDOS.stream().anyMatch(e->e.getStatus()==0)&&addPreFryRecordsDTO.getRecords().get(0).getRecordId()==null){
throw new ServiceException(ErrorCodeEnum.PRODUCTS_STATUS);
}
}
//如果出现优先级升高的情况 优先级低的只有报废可选择 1的优先级最高 3最低
if (minApplyTypeByStoreCode.getApplyType()<addPreFryRecordsDTO.getApplyType()
&&addPreFryRecordsDTO.getCurrentStage()!= DISCARDED.getCode()){
//当前有更优选择,请确认
throw new ServiceException(ErrorCodeEnum.CURRENT_STAGE_NOT_OPERATION);
}
//只有当最高类型是1/3且是预炸完成 或者 2 且放入展示柜 新增一条预炸记录 其他情况只新增阶段记录表
List<PreFryStageChangesDO> list = new ArrayList<>();
if (addPreFryRecordsFlag(minApplyTypeByStoreCode.getApplyType(), addPreFryRecordsDTO.getCurrentStage())){
addPreFryRecordsDTO.getRecords().forEach(x->{
if (x.getProductId()==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
PreFryRecordsDO preFryRecordsDO = new PreFryRecordsDO();
preFryRecordsDO.setStoreCode(addPreFryRecordsDTO.getStoreCode());
preFryRecordsDO.setProductId(x.getProductId());
preFryRecordsDO.setFryDate(new Date());
preFryRecordsDO.setRecordCode(getRecordCode());
preFryRecordsDO.setFryCompleteTime(new Date());
preFryRecordsDO.setLatestSaleTime(getLatestSaleTime(minApplyTypeByStoreCode.getApplyType()));
preFryRecordsDO.setCurrentStage(addPreFryRecordsDTO.getCurrentStage());
preFryRecordsDO.setCurrentApplyType(minApplyTypeByStoreCode.getApplyType());
preFryRecordsDAO.insert(preFryRecordsDO);
PreFryStageChangesDO preFryStageChangesDO = new PreFryStageChangesDO();
preFryStageChangesDO.setStage(preFryRecordsDO.getCurrentStage());
preFryStageChangesDO.setRecordId(preFryRecordsDO.getId());
preFryStageChangesDO.setImage1(x.getImage1());
preFryStageChangesDO.setImage2(x.getImage2());
preFryStageChangesDO.setOperatorName(user.getUsername());
list.add(preFryStageChangesDO);
});
}else {
List<Long> recordList= new ArrayList<>();
addPreFryRecordsDTO.getRecords().forEach(x->{
if (x.getRecordId()==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
PreFryStageChangesDO preFryStageChangesDO = new PreFryStageChangesDO();
preFryStageChangesDO.setStage(addPreFryRecordsDTO.getCurrentStage());
preFryStageChangesDO.setRecordId(x.getRecordId());
preFryStageChangesDO.setImage1(x.getImage1());
preFryStageChangesDO.setImage2(x.getImage2());
preFryStageChangesDO.setOperatorName(user.getUsername());
preFryStageChangesDO.setCreatedTime(new Date());
recordList.add(x.getRecordId());
list.add(preFryStageChangesDO);
});
preFryRecordsDAO.batchUpdateStageByIds(recordList,addPreFryRecordsDTO.getCurrentStage());
handleViolationFlag(recordList,addPreFryRecordsDTO.getApplyType(),addPreFryRecordsDTO.getCurrentStage(),list);
}
preFryStageChangesDAO.batchInsert(list);
return Boolean.TRUE;
}
private void handleViolationFlag(List<Long> recordList ,Integer applyType,Integer currentStage,List<PreFryStageChangesDO> list) {
//如果最高级优先级是冷藏展示柜 计算是否违规 冷却时间小于15分钟或者大于25分钟 违规 冰箱取出时间距离预炸完成时间超过24小时
if (PreFryApplyTypeEnum.HAS_REFRIGERATED_DISPLAY.getCode()==applyType&&
(STORED_IN_DISPLAY_CABINET.getCode()==currentStage||STORED_IN_FRIDGE.getCode()==currentStage)){
List<PreFryRecordsDO> records = preFryRecordsDAO.queryByIds(recordList);
Map<Long,PreFryRecordsDO> recordMap = records.stream().collect(Collectors.toMap(PreFryRecordsDO::getId, data->data));
//list 转为 map 记录id与创建时间
Map<Long,Date> listMap = list.stream().collect(Collectors.toMap(PreFryStageChangesDO::getRecordId, PreFryStageChangesDO::getCreatedTime));
List<ViolationDTO> violationList = new ArrayList<>();
if (STORED_IN_DISPLAY_CABINET.getCode()==currentStage){
recordList.forEach(x->{
PreFryRecordsDO preFryRecordsDO = recordMap.get(x);
Long time = getTime(preFryRecordsDO.getFryCompleteTime(), listMap.get(x));
if (time!=null&&(time<15||time>25)){
ViolationDTO violationDTO = new ViolationDTO();
violationDTO.setId(x);
violationDTO.setViolationFlag(ViolationEnum.COOLING_TIME_EXCEEDED.getCode());
violationDTO.setViolationReason(String.format(",%d,", ViolationEnum.COOLING_TIME_EXCEEDED.getCode()));
violationList.add(violationDTO);
}
});
}else if (STORED_IN_FRIDGE.getCode()==currentStage){
recordList.forEach(x->{
PreFryRecordsDO preFryRecordsDO = recordMap.get(x);
Long time = getTime(preFryRecordsDO.getFryCompleteTime(), listMap.get(x));
if (time!=null&&time>24*60){
ViolationDTO violationDTO = new ViolationDTO();
violationDTO.setId(x);
violationDTO.setViolationFlag(ViolationEnum.STORAGE_TIME_EXCEEDED.getCode());
if (StringUtils.isEmpty(preFryRecordsDO.getViolationReason())){
violationDTO.setViolationReason(String.format(",%d,", ViolationEnum.STORAGE_TIME_EXCEEDED.getCode()));
}else {
violationDTO.setViolationReason(preFryRecordsDO.getViolationReason()+String.format("%d,", ViolationEnum.STORAGE_TIME_EXCEEDED.getCode()));
}
violationList.add(violationDTO);
}
});
}
if (!violationList.isEmpty()) {
preFryRecordsDAO.batchUpdateViolation(violationList);
}
}
}
private Long getTime(Date startTime,Date endTime){
if (startTime==null||endTime==null){
return null;
}
return CoolDateUtils.getMinutesBetween(startTime,endTime);
}
@Override
public PageInfo<PreFryRecordsDetailDTO> ListByStoreCodeAndDate(FryRecordsQueryDTO dto) {
PageHelper.startPage(dto.getPageNum(),dto.getPageSize());
if (dto.getCurrentDate()==null|| StringUtils.isBlank(dto.getStoreCode())){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
List<PreFryRecordsDO> preFryRecordsDOS = preFryRecordsDAO.selectByStoreAndDateStage(dto.getStoreCode(),dto.getApplyType(), DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,dto.getCurrentDate()));
PageInfo result = new PageInfo<>(preFryRecordsDOS);
if (CollectionUtils.isEmpty(preFryRecordsDOS)){
return result;
}
List<Long> recordIdList = preFryRecordsDOS.stream().map(PreFryRecordsDO::getId).collect(Collectors.toList());
List<PreFryStageImagesDTO> stageImagesDTOS = preFryStageChangesDAO.selectByRecordIdList(recordIdList);
List<Long> productIdList = preFryRecordsDOS.stream().map(PreFryRecordsDO::getProductId).collect(Collectors.toList());
List<PreFriedProductsDO> preFriedProductsDOS = preFriedProductsDAO.selectByProductIds(productIdList);
Map<Long, PreFriedProductsDO> preFriedProductsDOSMap = preFriedProductsDOS.stream().collect(Collectors.toMap(PreFriedProductsDO::getId, x -> x));
//将数据根据recordId分组 并根据id排序
Map<Long, List<PreFryStageImagesDTO>> stageImagesDTOMap =
stageImagesDTOS.stream().collect(Collectors.groupingBy(PreFryStageImagesDTO::getRecordId));
List<PreFryRecordsDetailDTO> list = new ArrayList<>();
preFryRecordsDOS.forEach(x->{
PreFryRecordsDetailDTO preFryRecordsDetailDTO = new PreFryRecordsDetailDTO();
preFryRecordsDetailDTO.setId(x.getId());
preFryRecordsDetailDTO.setStoreCode(x.getStoreCode());
preFryRecordsDetailDTO.setProductId(x.getProductId());
preFryRecordsDetailDTO.setProductCode(preFriedProductsDOSMap.getOrDefault(x.getProductId(),new PreFriedProductsDO()).getProductCode());
preFryRecordsDetailDTO.setProductName(preFriedProductsDOSMap.getOrDefault(x.getProductId(),new PreFriedProductsDO()).getProductName());
preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDOSMap.getOrDefault(x.getProductId(),new PreFriedProductsDO()).getProductImage());
preFryRecordsDetailDTO.setFryCompleteTime(x.getFryCompleteTime());
preFryRecordsDetailDTO.setLatestSaleTime(x.getLatestSaleTime());
preFryRecordsDetailDTO.setCurrentStage(x.getCurrentStage());
preFryRecordsDetailDTO.setCurrentApplyType(x.getCurrentApplyType());
preFryRecordsDetailDTO.setStageHistory(stageImagesDTOMap.getOrDefault(x.getId(),new ArrayList<>()));
list.add(preFryRecordsDetailDTO);
});
result.setList( list);
return result;
}
@Resource
StoreDao storeDao;
@Override
public PreFryRecordsDetailDTO getById(Long id) {
PreFryRecordsDO preFryRecordsDO = preFryRecordsDAO.queryById(id);
if (preFryRecordsDO == null) {
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
List<PreFryStageImagesDTO> preFryStageImagesDTOS = preFryStageChangesDAO.selectByRecordId(id);
PreFriedProductsDO preFriedProductsDO = preFriedProductsDAO.queryById(preFryRecordsDO.getProductId());
StoreDO store = storeDao.getByStoreNum(preFryRecordsDO.getStoreCode());
PreFryRecordsDetailDTO preFryRecordsDetailDTO = new PreFryRecordsDetailDTO();
if (store != null) {
preFryRecordsDetailDTO.setStoreName(store.getStoreName());
}
preFryRecordsDetailDTO.setId(preFryRecordsDO.getId());
preFryRecordsDetailDTO.setStoreCode(preFryRecordsDO.getStoreCode());
preFryRecordsDetailDTO.setProductId(preFryRecordsDO.getProductId());
preFryRecordsDetailDTO.setRecordCode(preFryRecordsDO.getRecordCode());
if (preFriedProductsDO!=null){
preFryRecordsDetailDTO.setProductName(preFriedProductsDO.getProductName());
preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDO.getProductImage());
preFryRecordsDetailDTO.setProductCode(preFriedProductsDO.getProductCode());
}
preFryRecordsDetailDTO.setFryCompleteTime(preFryRecordsDO.getFryCompleteTime());
preFryRecordsDetailDTO.setLatestSaleTime(preFryRecordsDO.getLatestSaleTime());
preFryRecordsDetailDTO.setCurrentStage(preFryRecordsDO.getCurrentStage());
preFryRecordsDetailDTO.setCurrentApplyType(preFryRecordsDO.getCurrentApplyType());
preFryRecordsDetailDTO.setViolationFlag(preFryRecordsDO.getViolationFlag());
preFryRecordsDetailDTO.setViolationReason(getViolationReasonChinese(preFryRecordsDO.getViolationReason()));
preFryRecordsDetailDTO.setStageHistory(preFryStageImagesDTOS);
return preFryRecordsDetailDTO;
}
@Override
public List<DailyFryCountDTO> queryByStoreCode(String storeCode,Long time) {
return preFryRecordsDAO.selectDailyFryCountInCurrentMonth(storeCode, time);
}
@Override
public PageInfo<PreFryRecordsDTO> queryByQueryDTO(PreFryRecordQueryDTO dto) {
PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
List<PreFryRecordsDTO> preFryRecordQueryDTOS = preFryRecordsDAO.selectByQueryDTO(dto);
preFryRecordQueryDTOS.forEach(x->{
x.setViolationReason(getViolationReasonChinese(x.getViolationReason()));
});
PageInfo<PreFryRecordsDTO> preFryRecordQueryDTOPageInfo = new PageInfo<>(preFryRecordQueryDTOS);
return preFryRecordQueryDTOPageInfo;
}
private Boolean addPreFryRecordsFlag(Integer applyType,Integer stage){
if (applyType== PreFryApplyTypeEnum.HAS_REFRIGERATED_DISPLAY.getCode() && stage== PRE_FRY_COMPLETED.getCode()){
return Boolean.TRUE;
}else if (applyType == PreFryApplyTypeEnum.NO_DISPLAY.getCode() && stage== PRE_FRY_COMPLETED.getCode()){
return Boolean.TRUE;
}
if (applyType==PreFryApplyTypeEnum.HAS_NORMAL_DISPLAY.getCode() && stage== STORED_IN_DISPLAY_CABINET.getCode()){
return Boolean.TRUE;
}
return Boolean.FALSE;
}
private Date getLatestSaleTime(Integer applyType) {
Calendar calendar = Calendar.getInstance();
if (applyType == PreFryApplyTypeEnum.HAS_REFRIGERATED_DISPLAY.getCode()) {
// 冷藏展示柜加24小时
calendar.add(Calendar.HOUR_OF_DAY, 24);
} else {
// 常温展示柜或无展示柜加4小时
calendar.add(Calendar.HOUR_OF_DAY, 4);
}
return calendar.getTime();
}
public String getRecordCode() {
//当前日期
String today = CoolDateUtils.getToday();
return "14" + today + String.format("%04d", ThreadLocalRandom.current().nextInt(100000));
}
/**
* 根据违规原因字符串获取中文描述
* @param violationReason 违规原因字符串,格式如 ",1,2,"、",1," 或 ",2,"
* @return 格式化后的中文违规原因,如 "冷却时间超标,存储时间超标"
*/
public String getViolationReasonChinese(String violationReason) {
if (StringUtils.isBlank(violationReason)) {
return "";
}
// 分割字符串并过滤有效数字
List<Integer> reasonCodes = Arrays.stream(violationReason.split(","))
.filter(StringUtils::isNotBlank)
.map(String::trim)
.map(Integer::valueOf)
.collect(Collectors.toList());
// 转换为中文描述
return reasonCodes.stream()
.map(code -> ViolationEnum.getByCode(code))
.filter(Objects::nonNull)
.map(ViolationEnum::getDescription)
.collect(Collectors.joining(""));
}
}

View File

@@ -203,9 +203,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
* @param millis 毫秒数
* @return 时间
*/
public static String getDateByMillis(long millis) {
public static String getDateByMillis(long millis,String format) {
//12小时制
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Date date = new Date();
date.setTime(millis);
return simpleDateFormat.format(date);