diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java index 9d11c6883..6180a4163 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java @@ -168,4 +168,12 @@ public class CoolDateUtils { 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(); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PreFryRecordsDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PreFryRecordsDAO.java index 21ef9179a..fbb3120cf 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/PreFryRecordsDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/PreFryRecordsDAO.java @@ -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.PreFryRecordQueryDTO; 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.mapper.PreFryRecordsMapper; import org.apache.commons.collections4.CollectionUtils; @@ -11,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -51,6 +53,13 @@ public class PreFryRecordsDAO { return preFryRecordsMapper.selectByPrimaryKey(id); } + public List queryByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return new ArrayList<>(); + } + return preFryRecordsMapper.selectByIds(ids); + } + public int batchUpdateStageByIds( List ids, Integer currentStage){ @@ -81,7 +90,12 @@ public class PreFryRecordsDAO { return preFryRecordsMapper.selectByQueryDTO(dto); } - + public void batchUpdateViolation(List violationList) { + if (CollectionUtils.isEmpty(violationList)){ + return; + } + preFryRecordsMapper.batchUpdateViolation(violationList); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PreFryRecordsMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PreFryRecordsMapper.java index 7c94ec693..0904a7623 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PreFryRecordsMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/PreFryRecordsMapper.java @@ -3,6 +3,7 @@ package com.cool.store.mapper; import com.cool.store.dto.pre.fry.DailyFryCountDTO; import com.cool.store.dto.pre.fry.PreFryRecordQueryDTO; import com.cool.store.dto.pre.fry.PreFryRecordsDTO; +import com.cool.store.dto.pre.fry.ViolationDTO; import com.cool.store.entity.PreFryRecordsDO; import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.common.Mapper; @@ -17,6 +18,8 @@ public interface PreFryRecordsMapper extends Mapper { int batchUpdateStageByIds(@Param("ids") List ids, @Param("currentStage") Integer currentStage); + List selectByIds(@Param("ids") List ids); + List selectByStoreAndDateStage( @Param("storeCode") String storeCode, @Param("yesterdayStageList") List yesterdayStageList, @@ -29,6 +32,6 @@ public interface PreFryRecordsMapper extends Mapper { List selectByQueryDTO(@Param("query") PreFryRecordQueryDTO dto); - + void batchUpdateViolation(@Param("list") List violationList); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/PreFryRecordsMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/PreFryRecordsMapper.xml index 92b83a47d..39bbbed1d 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/PreFryRecordsMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/PreFryRecordsMapper.xml @@ -15,7 +15,7 @@ - + @@ -43,6 +43,16 @@ + + + + + UPDATE xfsg_pre_fry_records + SET + violation_flag = CASE id + + WHEN #{item.id} THEN #{item.violationFlag} + + ELSE violation_flag + END, + violation_reason = CASE id + + WHEN #{item.id} THEN #{item.violationReason} + + ELSE violation_reason + END, + updated_time = NOW() + WHERE id IN + + #{item.id} + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDTO.java index 14e70899b..91be9a759 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDTO.java @@ -32,6 +32,6 @@ public class PreFryRecordsDTO { @ApiModelProperty("是否违规") private Integer violationFlag; @ApiModelProperty("违规原因") - private Integer violationReason; + private String violationReason; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDetailDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDetailDTO.java index 725aff1bc..3d49477ea 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDetailDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/pre/fry/PreFryRecordsDetailDTO.java @@ -19,6 +19,8 @@ public class PreFryRecordsDetailDTO { @ApiModelProperty( "门店编码") private String storeCode; + @ApiModelProperty( "门店名称") + private String storeName; @ApiModelProperty( "预炸产品编码") private Long productId; @@ -43,6 +45,12 @@ public class PreFryRecordsDetailDTO { @ApiModelProperty( "申请类型") private Integer currentApplyType; + @ApiModelProperty("是否违规") + private Integer violationFlag; + + @ApiModelProperty("违规原因") + private String violationReason; + @ApiModelProperty( "状态记录") private List stageHistory; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/PreFryRecordsDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/PreFryRecordsDO.java index dff1bf28b..32b10c1c2 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/PreFryRecordsDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/PreFryRecordsDO.java @@ -73,7 +73,7 @@ public class PreFryRecordsDO { @Column(name = "updated_flag") private Integer violationFlag; @Column(name = "violation_reason") - private Integer violationReason; + private String violationReason; public Integer getViolationFlag() { @@ -84,11 +84,11 @@ public class PreFryRecordsDO { this.violationFlag = violationFlag; } - public Integer getViolationReason() { + public String getViolationReason() { return violationReason; } - public void setViolationReason(Integer violationReason) { + public void setViolationReason(String violationReason) { this.violationReason = violationReason; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreFryRecordsServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreFryRecordsServiceImpl.java index fb3907bf3..668c70162 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreFryRecordsServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreFryRecordsServiceImpl.java @@ -1,17 +1,12 @@ package com.cool.store.service.impl; -import com.cool.store.dao.PreFriedProductsDAO; -import com.cool.store.dao.PreFryQualificationApplyDAO; -import com.cool.store.dao.PreFryRecordsDAO; -import com.cool.store.dao.PreFryStageChangesDAO; +import com.cool.store.dao.*; import com.cool.store.dto.pre.fry.*; -import com.cool.store.entity.PreFriedProductsDO; -import com.cool.store.entity.PreFryQualificationApplyDO; -import com.cool.store.entity.PreFryRecordsDO; -import com.cool.store.entity.PreFryStageChangesDO; +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; @@ -97,15 +92,72 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService { 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 recordList ,Integer applyType,Integer currentStage,List list) { + //如果最高级优先级是冷藏展示柜 计算是否违规 冷却时间小于15分钟或者大于25分钟 违规 冰箱取出时间距离预炸完成时间超过24小时 + if (PreFryApplyTypeEnum.HAS_REFRIGERATED_DISPLAY.getCode()==applyType&& + (STORED_IN_DISPLAY_CABINET.getCode()==currentStage||STORED_IN_FRIDGE.getCode()==currentStage)){ + List records = preFryRecordsDAO.queryByIds(recordList); + Map recordMap = records.stream().collect(Collectors.toMap(PreFryRecordsDO::getId, data->data)); + //list 转为 map 记录id与创建时间 + Map listMap = list.stream().collect(Collectors.toMap(PreFryStageChangesDO::getRecordId, PreFryStageChangesDO::getCreatedTime)); + List 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 ListByStoreCodeAndDate(FryRecordsQueryDTO dto) { PageHelper.startPage(dto.getPageNum(),dto.getPageSize()); @@ -146,6 +198,9 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService { return result; } + @Resource + StoreDao storeDao; + @Override public PreFryRecordsDetailDTO getById(Long id) { PreFryRecordsDO preFryRecordsDO = preFryRecordsDAO.queryById(id); @@ -154,21 +209,30 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService { } List 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()); - preFryRecordsDetailDTO.setProductName(preFriedProductsDO.getProductName()); - preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDO.getProductImage()); + if (preFriedProductsDO!=null){ + preFryRecordsDetailDTO.setProductName(preFriedProductsDO.getProductName()); + preFryRecordsDetailDTO.setProductImageUrl(preFriedProductsDO.getProductImage()); + } 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 queryByStoreCode(String storeCode,Long time) { return preFryRecordsDAO.selectDailyFryCountInCurrentMonth(storeCode, time); @@ -178,6 +242,9 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService { public PageInfo queryByQueryDTO(PreFryRecordQueryDTO dto) { PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); List preFryRecordQueryDTOS = preFryRecordsDAO.selectByQueryDTO(dto); + preFryRecordQueryDTOS.forEach(x->{ + x.setViolationReason(getViolationReasonChinese(x.getViolationReason())); + }); PageInfo preFryRecordQueryDTOPageInfo = new PageInfo<>(preFryRecordQueryDTOS); return preFryRecordQueryDTOPageInfo; } @@ -213,5 +280,30 @@ public class PreFryRecordsServiceImpl implements PreFryRecordsService { 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 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(",")); + } + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCPreFryRecordsController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCPreFryRecordsController.java index 2aad24c0f..9506a574b 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCPreFryRecordsController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCPreFryRecordsController.java @@ -37,5 +37,12 @@ public class PCPreFryRecordsController { return ResponseResult.success(preFryRecordsService.queryByQueryDTO(dto)); } + @ApiOperation("预炸记录详情列表") + @GetMapping("/queryById") + public ResponseResult queryById(@RequestParam(required = true, value = "id") Long id) { + log.info("预炸记录详情:{}", JSONObject.toJSONString(id)); + return ResponseResult.success(preFryRecordsService.getById(id)); + } + }