feat:预炸

This commit is contained in:
苏竹红
2025-06-24 11:34:43 +08:00
parent 1dab792aad
commit 7eb5bf8059
9 changed files with 181 additions and 18 deletions

View File

@@ -168,4 +168,12 @@ public class CoolDateUtils {
return lastMonthSameDay.format(getDateFormatter(DATE_FORMAT_DAY)); return lastMonthSameDay.format(getDateFormatter(DATE_FORMAT_DAY));
} }
public static long getMinutesBetween(Date startDate, Date endDate) {
Instant start = startDate.toInstant();
Instant end = endDate.toInstant();
Duration duration = Duration.between(start, end);
return duration.toMinutes();
}
} }

View File

@@ -4,6 +4,7 @@ import com.cool.store.constants.CommonConstants;
import com.cool.store.dto.pre.fry.DailyFryCountDTO; import com.cool.store.dto.pre.fry.DailyFryCountDTO;
import com.cool.store.dto.pre.fry.PreFryRecordQueryDTO; import com.cool.store.dto.pre.fry.PreFryRecordQueryDTO;
import com.cool.store.dto.pre.fry.PreFryRecordsDTO; import com.cool.store.dto.pre.fry.PreFryRecordsDTO;
import com.cool.store.dto.pre.fry.ViolationDTO;
import com.cool.store.entity.PreFryRecordsDO; import com.cool.store.entity.PreFryRecordsDO;
import com.cool.store.mapper.PreFryRecordsMapper; import com.cool.store.mapper.PreFryRecordsMapper;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@@ -11,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -51,6 +53,13 @@ public class PreFryRecordsDAO {
return preFryRecordsMapper.selectByPrimaryKey(id); return preFryRecordsMapper.selectByPrimaryKey(id);
} }
public List<PreFryRecordsDO> queryByIds(List<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return new ArrayList<>();
}
return preFryRecordsMapper.selectByIds(ids);
}
public int batchUpdateStageByIds( List<Long> ids, public int batchUpdateStageByIds( List<Long> ids,
Integer currentStage){ Integer currentStage){
@@ -81,7 +90,12 @@ public class PreFryRecordsDAO {
return preFryRecordsMapper.selectByQueryDTO(dto); return preFryRecordsMapper.selectByQueryDTO(dto);
} }
public void batchUpdateViolation(List<ViolationDTO> violationList) {
if (CollectionUtils.isEmpty(violationList)){
return;
}
preFryRecordsMapper.batchUpdateViolation(violationList);
}
} }

View File

@@ -3,6 +3,7 @@ package com.cool.store.mapper;
import com.cool.store.dto.pre.fry.DailyFryCountDTO; import com.cool.store.dto.pre.fry.DailyFryCountDTO;
import com.cool.store.dto.pre.fry.PreFryRecordQueryDTO; import com.cool.store.dto.pre.fry.PreFryRecordQueryDTO;
import com.cool.store.dto.pre.fry.PreFryRecordsDTO; import com.cool.store.dto.pre.fry.PreFryRecordsDTO;
import com.cool.store.dto.pre.fry.ViolationDTO;
import com.cool.store.entity.PreFryRecordsDO; import com.cool.store.entity.PreFryRecordsDO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.Mapper;
@@ -17,6 +18,8 @@ public interface PreFryRecordsMapper extends Mapper<PreFryRecordsDO> {
int batchUpdateStageByIds(@Param("ids") List<Long> ids, int batchUpdateStageByIds(@Param("ids") List<Long> ids,
@Param("currentStage") Integer currentStage); @Param("currentStage") Integer currentStage);
List<PreFryRecordsDO> selectByIds(@Param("ids") List<Long> ids);
List<PreFryRecordsDO> selectByStoreAndDateStage( List<PreFryRecordsDO> selectByStoreAndDateStage(
@Param("storeCode") String storeCode, @Param("storeCode") String storeCode,
@Param("yesterdayStageList") List<Integer> yesterdayStageList, @Param("yesterdayStageList") List<Integer> yesterdayStageList,
@@ -29,6 +32,6 @@ public interface PreFryRecordsMapper extends Mapper<PreFryRecordsDO> {
List<PreFryRecordsDTO> selectByQueryDTO(@Param("query") PreFryRecordQueryDTO dto); List<PreFryRecordsDTO> selectByQueryDTO(@Param("query") PreFryRecordQueryDTO dto);
void batchUpdateViolation(@Param("list") List<ViolationDTO> violationList);
} }

View File

@@ -15,7 +15,7 @@
<result column="current_stage" jdbcType="TINYINT" property="currentStage" /> <result column="current_stage" jdbcType="TINYINT" property="currentStage" />
<result column="current_apply_type" jdbcType="TINYINT" property="currentApplyType" /> <result column="current_apply_type" jdbcType="TINYINT" property="currentApplyType" />
<result column="violation_flag" jdbcType="TINYINT" property="violationFlag" /> <result column="violation_flag" jdbcType="TINYINT" property="violationFlag" />
<result column="violation_reason" jdbcType="TINYINT" property="violationReason" /> <result column="violation_reason" jdbcType="VARCHAR" property="violationReason" />
<result column="created_time" jdbcType="TIMESTAMP" property="createdTime" /> <result column="created_time" jdbcType="TIMESTAMP" property="createdTime" />
<result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" /> <result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" />
</resultMap> </resultMap>
@@ -43,6 +43,16 @@
</foreach> </foreach>
</update> </update>
<select id="selectByIds" resultMap="BaseResultMap">
SELECT * FROM xfsg_pre_fry_records
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
ORDER BY created_time DESC
</select>
<select id="selectByStoreAndDateStage" resultMap="BaseResultMap"> <select id="selectByStoreAndDateStage" resultMap="BaseResultMap">
SELECT * FROM xfsg_pre_fry_records SELECT * FROM xfsg_pre_fry_records
WHERE store_code = #{storeCode} WHERE store_code = #{storeCode}
@@ -110,12 +120,33 @@
AND a.violation_flag = #{query.violationFlag} AND a.violation_flag = #{query.violationFlag}
</if> </if>
<if test="query.violationReason != null"> <if test="query.violationReason != null">
AND a.violation_reason = #{query.violationReason} AND a.violation_reason LIKE CONCAT('%', #{query.violationReason}, '%')
</if> </if>
</where> </where>
ORDER BY a.fry_date DESC ORDER BY a.fry_date DESC
</select> </select>
<update id="batchUpdateViolation">
UPDATE xfsg_pre_fry_records
SET
violation_flag = CASE id
<foreach collection="list" item="item">
WHEN #{item.id} THEN #{item.violationFlag}
</foreach>
ELSE violation_flag
END,
violation_reason = CASE id
<foreach collection="list" item="item">
WHEN #{item.id} THEN #{item.violationReason}
</foreach>
ELSE violation_reason
END,
updated_time = NOW()
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
</mapper> </mapper>

View File

@@ -32,6 +32,6 @@ public class PreFryRecordsDTO {
@ApiModelProperty("是否违规") @ApiModelProperty("是否违规")
private Integer violationFlag; private Integer violationFlag;
@ApiModelProperty("违规原因") @ApiModelProperty("违规原因")
private Integer violationReason; private String violationReason;
} }

View File

@@ -19,6 +19,8 @@ public class PreFryRecordsDetailDTO {
@ApiModelProperty( "门店编码") @ApiModelProperty( "门店编码")
private String storeCode; private String storeCode;
@ApiModelProperty( "门店名称")
private String storeName;
@ApiModelProperty( "预炸产品编码") @ApiModelProperty( "预炸产品编码")
private Long productId; private Long productId;
@@ -43,6 +45,12 @@ public class PreFryRecordsDetailDTO {
@ApiModelProperty( "申请类型") @ApiModelProperty( "申请类型")
private Integer currentApplyType; private Integer currentApplyType;
@ApiModelProperty("是否违规")
private Integer violationFlag;
@ApiModelProperty("违规原因")
private String violationReason;
@ApiModelProperty( "状态记录") @ApiModelProperty( "状态记录")
private List<PreFryStageImagesDTO> stageHistory; private List<PreFryStageImagesDTO> stageHistory;

View File

@@ -73,7 +73,7 @@ public class PreFryRecordsDO {
@Column(name = "updated_flag") @Column(name = "updated_flag")
private Integer violationFlag; private Integer violationFlag;
@Column(name = "violation_reason") @Column(name = "violation_reason")
private Integer violationReason; private String violationReason;
public Integer getViolationFlag() { public Integer getViolationFlag() {
@@ -84,11 +84,11 @@ public class PreFryRecordsDO {
this.violationFlag = violationFlag; this.violationFlag = violationFlag;
} }
public Integer getViolationReason() { public String getViolationReason() {
return violationReason; return violationReason;
} }
public void setViolationReason(Integer violationReason) { public void setViolationReason(String violationReason) {
this.violationReason = violationReason; this.violationReason = violationReason;
} }

View File

@@ -1,17 +1,12 @@
package com.cool.store.service.impl; package com.cool.store.service.impl;
import com.cool.store.dao.PreFriedProductsDAO; import com.cool.store.dao.*;
import com.cool.store.dao.PreFryQualificationApplyDAO;
import com.cool.store.dao.PreFryRecordsDAO;
import com.cool.store.dao.PreFryStageChangesDAO;
import com.cool.store.dto.pre.fry.*; import com.cool.store.dto.pre.fry.*;
import com.cool.store.entity.PreFriedProductsDO; import com.cool.store.entity.*;
import com.cool.store.entity.PreFryQualificationApplyDO;
import com.cool.store.entity.PreFryRecordsDO;
import com.cool.store.entity.PreFryStageChangesDO;
import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.PreFryApplyTypeEnum; import com.cool.store.enums.PreFryApplyTypeEnum;
import com.cool.store.enums.PreFryStageEnum; import com.cool.store.enums.PreFryStageEnum;
import com.cool.store.enums.ViolationEnum;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.service.PreFryRecordsService; import com.cool.store.service.PreFryRecordsService;
import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.CoolDateUtils;
@@ -97,15 +92,72 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService {
preFryStageChangesDO.setImage1(x.getImage1()); preFryStageChangesDO.setImage1(x.getImage1());
preFryStageChangesDO.setImage2(x.getImage2()); preFryStageChangesDO.setImage2(x.getImage2());
preFryStageChangesDO.setOperatorName(user.getUsername()); preFryStageChangesDO.setOperatorName(user.getUsername());
preFryStageChangesDO.setCreatedTime(new Date());
recordList.add(x.getRecordId()); recordList.add(x.getRecordId());
list.add(preFryStageChangesDO); list.add(preFryStageChangesDO);
}); });
preFryRecordsDAO.batchUpdateStageByIds(recordList,addPreFryRecordsDTO.getCurrentStage()); preFryRecordsDAO.batchUpdateStageByIds(recordList,addPreFryRecordsDTO.getCurrentStage());
handleViolationFlag(recordList,addPreFryRecordsDTO.getApplyType(),addPreFryRecordsDTO.getCurrentStage(),list);
} }
preFryStageChangesDAO.batchInsert(list); preFryStageChangesDAO.batchInsert(list);
return Boolean.TRUE; 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 @Override
public PageInfo<PreFryRecordsDetailDTO> ListByStoreCodeAndDate(FryRecordsQueryDTO dto) { public PageInfo<PreFryRecordsDetailDTO> ListByStoreCodeAndDate(FryRecordsQueryDTO dto) {
PageHelper.startPage(dto.getPageNum(),dto.getPageSize()); PageHelper.startPage(dto.getPageNum(),dto.getPageSize());
@@ -146,6 +198,9 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService {
return result; return result;
} }
@Resource
StoreDao storeDao;
@Override @Override
public PreFryRecordsDetailDTO getById(Long id) { public PreFryRecordsDetailDTO getById(Long id) {
PreFryRecordsDO preFryRecordsDO = preFryRecordsDAO.queryById(id); PreFryRecordsDO preFryRecordsDO = preFryRecordsDAO.queryById(id);
@@ -154,21 +209,30 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService {
} }
List<PreFryStageImagesDTO> preFryStageImagesDTOS = preFryStageChangesDAO.selectByRecordId(id); List<PreFryStageImagesDTO> preFryStageImagesDTOS = preFryStageChangesDAO.selectByRecordId(id);
PreFriedProductsDO preFriedProductsDO = preFriedProductsDAO.queryById(preFryRecordsDO.getProductId()); PreFriedProductsDO preFriedProductsDO = preFriedProductsDAO.queryById(preFryRecordsDO.getProductId());
StoreDO store = storeDao.getByStoreNum(preFryRecordsDO.getStoreCode());
PreFryRecordsDetailDTO preFryRecordsDetailDTO = new PreFryRecordsDetailDTO(); PreFryRecordsDetailDTO preFryRecordsDetailDTO = new PreFryRecordsDetailDTO();
if (store != null) {
preFryRecordsDetailDTO.setStoreName(store.getStoreName());
}
preFryRecordsDetailDTO.setId(preFryRecordsDO.getId()); preFryRecordsDetailDTO.setId(preFryRecordsDO.getId());
preFryRecordsDetailDTO.setStoreCode(preFryRecordsDO.getStoreCode()); preFryRecordsDetailDTO.setStoreCode(preFryRecordsDO.getStoreCode());
preFryRecordsDetailDTO.setProductId(preFryRecordsDO.getProductId()); preFryRecordsDetailDTO.setProductId(preFryRecordsDO.getProductId());
preFryRecordsDetailDTO.setRecordCode(preFryRecordsDO.getRecordCode()); preFryRecordsDetailDTO.setRecordCode(preFryRecordsDO.getRecordCode());
preFryRecordsDetailDTO.setProductName(preFriedProductsDO.getProductName()); if (preFriedProductsDO!=null){
preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDO.getProductImage()); preFryRecordsDetailDTO.setProductName(preFriedProductsDO.getProductName());
preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDO.getProductImage());
}
preFryRecordsDetailDTO.setFryCompleteTime(preFryRecordsDO.getFryCompleteTime()); preFryRecordsDetailDTO.setFryCompleteTime(preFryRecordsDO.getFryCompleteTime());
preFryRecordsDetailDTO.setLatestSaleTime(preFryRecordsDO.getLatestSaleTime()); preFryRecordsDetailDTO.setLatestSaleTime(preFryRecordsDO.getLatestSaleTime());
preFryRecordsDetailDTO.setCurrentStage(preFryRecordsDO.getCurrentStage()); preFryRecordsDetailDTO.setCurrentStage(preFryRecordsDO.getCurrentStage());
preFryRecordsDetailDTO.setCurrentApplyType(preFryRecordsDO.getCurrentApplyType()); preFryRecordsDetailDTO.setCurrentApplyType(preFryRecordsDO.getCurrentApplyType());
preFryRecordsDetailDTO.setViolationFlag(preFryRecordsDO.getViolationFlag());
preFryRecordsDetailDTO.setViolationReason(getViolationReasonChinese(preFryRecordsDO.getViolationReason()));
preFryRecordsDetailDTO.setStageHistory(preFryStageImagesDTOS); preFryRecordsDetailDTO.setStageHistory(preFryStageImagesDTOS);
return preFryRecordsDetailDTO; return preFryRecordsDetailDTO;
} }
@Override @Override
public List<DailyFryCountDTO> queryByStoreCode(String storeCode,Long time) { public List<DailyFryCountDTO> queryByStoreCode(String storeCode,Long time) {
return preFryRecordsDAO.selectDailyFryCountInCurrentMonth(storeCode, time); return preFryRecordsDAO.selectDailyFryCountInCurrentMonth(storeCode, time);
@@ -178,6 +242,9 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService {
public PageInfo<PreFryRecordsDTO> queryByQueryDTO(PreFryRecordQueryDTO dto) { public PageInfo<PreFryRecordsDTO> queryByQueryDTO(PreFryRecordQueryDTO dto) {
PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
List<PreFryRecordsDTO> preFryRecordQueryDTOS = preFryRecordsDAO.selectByQueryDTO(dto); List<PreFryRecordsDTO> preFryRecordQueryDTOS = preFryRecordsDAO.selectByQueryDTO(dto);
preFryRecordQueryDTOS.forEach(x->{
x.setViolationReason(getViolationReasonChinese(x.getViolationReason()));
});
PageInfo<PreFryRecordsDTO> preFryRecordQueryDTOPageInfo = new PageInfo<>(preFryRecordQueryDTOS); PageInfo<PreFryRecordsDTO> preFryRecordQueryDTOPageInfo = new PageInfo<>(preFryRecordQueryDTOS);
return preFryRecordQueryDTOPageInfo; return preFryRecordQueryDTOPageInfo;
} }
@@ -213,5 +280,30 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService {
return "14" + today + String.format("%04d", ThreadLocalRandom.current().nextInt(100000)); 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

@@ -37,5 +37,12 @@ public class PCPreFryRecordsController {
return ResponseResult.success(preFryRecordsService.queryByQueryDTO(dto)); return ResponseResult.success(preFryRecordsService.queryByQueryDTO(dto));
} }
@ApiOperation("预炸记录详情列表")
@GetMapping("/queryById")
public ResponseResult<PreFryRecordsDetailDTO> queryById(@RequestParam(required = true, value = "id") Long id) {
log.info("预炸记录详情:{}", JSONObject.toJSONString(id));
return ResponseResult.success(preFryRecordsService.getById(id));
}
} }