diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/EvalIndicatorDTO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/EvalIndicatorDTO.java index 227ce5a..aac8ed6 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/EvalIndicatorDTO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/EvalIndicatorDTO.java @@ -27,17 +27,17 @@ public class EvalIndicatorDTO { @Length(max = 255, message = "指标名称超出最大长度限制") private String name; - /** - * 归属系统id - */ - @NotNull(message = "归属系统不能为空") - private Long sysId; - - /** - * 归属系统名称 - */ - @NotNull(message = "归属系统名称不能为空") - private String sysName; +// /** +// * 归属系统id +// */ +// @NotNull(message = "归属系统不能为空") +// private Long sysId; +// +// /** +// * 归属系统名称 +// */ +// @NotNull(message = "归属系统名称不能为空") +// private String sysName; /** * 数据类型;1:数量 2:百分比 3:金额 diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalIndicatorImportRecordVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalIndicatorImportRecordVO.java index de3f6a3..554961c 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalIndicatorImportRecordVO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalIndicatorImportRecordVO.java @@ -10,6 +10,7 @@ import lombok.experimental.Accessors; import java.time.LocalDate; import java.util.Date; +import java.util.List; /** *

@@ -100,4 +101,15 @@ public class EvalIndicatorImportRecordVO{ * 创建时间 */ private Date createTime; + + /** + * 保存的key + */ + private String key; + + /** + * 导入详情 + */ + private List details; + } diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java index 6095cc5..2f4a02d 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java @@ -91,6 +91,11 @@ public class EvalRewardDistVO { private Long groupId; /** + * 审批单号 + */ + private String approvalNo; + + /** * 门店 */ private List shopPools; diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java index 4c13f9e..882a05f 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java @@ -6,6 +6,7 @@ import cn.fw.common.web.annotation.ControllerMethod; import cn.fw.common.web.auth.LoginAuthBean; import cn.fw.common.web.auth.annotation.CurrentUser; import cn.fw.data.base.domain.common.Message; +import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.db.eval.EvalIndicatorImportDetail; import cn.fw.morax.domain.dto.query.EvalIndicatorImportQueryDTO; import cn.fw.morax.domain.vo.eval.*; @@ -115,14 +116,13 @@ public class EvalIndicatorController { * @return */ @IgnoreAuth - @PostMapping("/staff-indicator") + @PostMapping("/analysis-staff") @ControllerMethod("上传人员指标") - public Message uploadStaffIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) { + public Message analysisStaffExcel(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) { if (file.isEmpty()) { throw new BusinessException("请上传文件"); } - evalIndicatorReportService.uploadStaffIndicator(file, user); - return success(); + return success(evalIndicatorReportService.uploadStaffIndicator(file, user)); } /** @@ -131,13 +131,27 @@ public class EvalIndicatorController { * @return */ @IgnoreAuth - @PostMapping("/shop-indicator") + @PostMapping("/analysis-shop") @ControllerMethod("上传门店指标") - public Message uploadShopIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) { + public Message uploadShopIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) { if (file.isEmpty()) { throw new BusinessException("请上传文件"); } - evalIndicatorReportService.uploadShopIndicator(file, user); + return success(evalIndicatorReportService.uploadShopIndicator(file, user)); + } + + /** + * 保存上传人员数据 + * + * @return + */ + @GetMapping("/save-import") + @ControllerMethod("保存上传人员数据") + public Message uploadStaffIndicator(String key) { + if (PublicUtil.isEmpty(key)) { + throw new BusinessException("参数错误"); + } + evalIndicatorReportService.saveImportIndicator(key); return success(); } diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorBizService.java index d822542..bd40e55 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorBizService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorBizService.java @@ -246,12 +246,12 @@ public class EvalIndicatorBizService { public EvalIndicator convertToDB(EvalIndicatorDTO dto){ EvalIndicator indicators = EvalIndicator.builder() .name(dto.getName()) - .enable(Boolean.FALSE) + .enable(Boolean.TRUE) .ruleType(dto.getRuleType()) .dataType(dto.getDataType()) .targetType(dto.getTargetType()) - .sysId(dto.getSysId()) - .sysName(dto.getSysName()) +// .sysId(dto.getSysId()) +// .sysName(dto.getSysName()) .roleCode(dto.getRoleCode()) .roleName(dto.getRoleName()) .build(); @@ -359,9 +359,11 @@ public class EvalIndicatorBizService { compositeIndicator.setCodeType(IndicatorCodeTypeEnum.EVAL_INDICATOR); compositeIndicator.setCode(evalIndicator.getCode()); compositeIndicator.setName(evalIndicator.getName()); - compositeIndicator.setSysId(evalIndicator.getSysId()); - compositeIndicator.setSysPrefix(evalIndicator.getSysPrefix()); - compositeIndicator.setSysName(evalIndicator.getSysName()); + if (PublicUtil.isNotEmpty(evalIndicator.getSysId())) { + compositeIndicator.setSysId(evalIndicator.getSysId()); + compositeIndicator.setSysPrefix(evalIndicator.getSysPrefix()); + compositeIndicator.setSysName(evalIndicator.getSysName()); + } compositeIndicator.setRoleCode(evalIndicator.getRoleCode()); compositeIndicator.setRoleName(evalIndicator.getRoleName()); compositeIndicator.setDataType(evalIndicator.getDataType()); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorReportService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorReportService.java index 1775dfb..7750538 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorReportService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorReportService.java @@ -18,13 +18,19 @@ import cn.fw.morax.service.biz.CommonService; import cn.fw.morax.service.data.eval.*; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.map.MultiKeyMap; import org.apache.poi.ss.formula.functions.T; +import org.checkerframework.checker.units.qual.K; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.BoundValueOperations; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -39,6 +45,7 @@ import java.time.LocalTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -57,9 +64,17 @@ public class EvalIndicatorReportService { private final EvalIndicatorService evalIndicatorService; private final EvalUserPoolService evalUserPoolService; private final EvalShopPoolService evalShopPoolService; + private final StringRedisTemplate stringRedisTemplate; private final EvalGroupService evalGroupService; private final EvalService evalService; + @Value("${spring.cache.custom.global-prefix}:eval-import:") + @Getter + private String evalImport; + @Value("${spring.cache.custom.global-prefix}:eval-import-detail:") + @Getter + private String evalImportDetail; + public void staffTemplateFile(HttpServletRequest request, HttpServletResponse response) { String fileName = "人员导入标准模板.xlsx"; String encodeFileName = CommonService.getEncodeName(request, fileName); @@ -122,11 +137,11 @@ public class EvalIndicatorReportService { } @Transactional(rollbackFor = Exception.class) - public void uploadStaffIndicator(MultipartFile file, LoginAuthBean user) { + public EvalIndicatorImportRecordVO uploadStaffIndicator(MultipartFile file, LoginAuthBean user) { MultiKeyMap staffPostMap = getShopUserPoolMap(user); Map evalIndicatorMap = getNameIndicatorMap(); EvalIndicatorImportRecord importRecord = createRecord(user, DimensionTypeEnum.STAFF); - evalIndicatorImportRecordService.save(importRecord); +// evalIndicatorImportRecordService.save(importRecord); List details = new ArrayList<>(); List indicatorValues = this.analysisExcel(file, StaffIndicatorValueVO.class); Long importRecordId = importRecord.getId(); @@ -168,28 +183,70 @@ public class EvalIndicatorReportService { importDetail.setIndicatorValue(new BigDecimal(staff.getIndicatorValue())); importDetail.setDataType(evalIndicator.getDataType()); } - Optional detailOptional = details.stream().findFirst(); + Optional detailOptional = details.stream().filter(detail -> PublicUtil.isEmpty(detail.getErrorType())).findFirst(); importRecord.setIndicatorCode(detailOptional.map(EvalIndicatorImportDetail::getIndicatorCode).orElse("")); importRecord.setIndicatorName(detailOptional.map(EvalIndicatorImportDetail::getIndicatorName).orElse("")); importRecord.setErrorNum(errorNum); importRecord.setNum(indicatorValues.size()); importRecord.setSuccessNum(indicatorValues.size() - errorNum); - evalIndicatorImportRecordService.updateById(importRecord); - evalIndicatorImportDetailService.saveBatch(details); + String key = PublicUtil.getUUID() + user.getUserId(); + stringRedisTemplate.opsForValue().set(getEvalImport() + key, JSON.toJSONString(importRecord), 1 , TimeUnit.DAYS); + stringRedisTemplate.opsForValue().set(getEvalImportDetail() + key, JSON.toJSONString(details), 1 , TimeUnit.DAYS); + + EvalIndicatorImportRecordVO recordVO = PublicUtil.copy(importRecord, EvalIndicatorImportRecordVO.class); + List detailVos = PublicUtil.copyList(details, EvalIndicatorImportDetailVO.class); + recordVO.setDetails(detailVos); + recordVO.setKey(key); + return recordVO; + +// evalIndicatorImportRecordService.updateById(importRecord); +// evalIndicatorImportDetailService.saveBatch(details); + +// for (String indicatorCode : uploadIndicatorCodes) { +// ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode, +// importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); +// EventBusUtil.asyncPost(importEvalIndicatorEvent); +// } + } + + public void saveImportIndicator(String key) { + BoundValueOperations importOperation = stringRedisTemplate.boundValueOps(getEvalImport() + key); + BoundValueOperations importDetailOperation = stringRedisTemplate.boundValueOps(getEvalImportDetail() + key); + String json = importOperation.get(); + String detailJson = importDetailOperation.get(); + if (PublicUtil.isEmpty(json) || PublicUtil.isEmpty(detailJson)) { + log.error("考评指标导入,redis数据为空,key {},", getEvalImport() + key); + throw new BusinessException("请求超时,请重新上传"); + } + EvalIndicatorImportRecord record = JSON.parseObject(json, EvalIndicatorImportRecord.class); + List details = JSON.parseArray(detailJson, EvalIndicatorImportDetail.class); + evalIndicatorImportRecordService.save(record); + Long recordId = record.getId(); + Set uploadIndicatorCodes = new HashSet<>(); + for (EvalIndicatorImportDetail detail : details) { + detail.setRecordId(recordId); + if (PublicUtil.isEmpty(detail.getErrorType()) && PublicUtil.isEmpty(detail.getIndicatorCode())) { + uploadIndicatorCodes.add(detail.getIndicatorCode()); + } + } + evalIndicatorImportDetailService.saveBatch(details); + stringRedisTemplate.delete(getEvalImport() + key); + stringRedisTemplate.delete(getEvalImportDetail() + key); + //事件 for (String indicatorCode : uploadIndicatorCodes) { ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode, - importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); + recordId, record.getGroupId(), record.getUploadTime()); EventBusUtil.asyncPost(importEvalIndicatorEvent); } } @Transactional(rollbackFor = Exception.class) - public void uploadShopIndicator(MultipartFile file, LoginAuthBean user) { + public EvalIndicatorImportRecordVO uploadShopIndicator(MultipartFile file, LoginAuthBean user) { Map shopPoolMap = this.getShopPoolMap(user); Map evalIndicatorMap = getNameIndicatorMap(); EvalIndicatorImportRecord importRecord = createRecord(user, DimensionTypeEnum.SHOP); - evalIndicatorImportRecordService.save(importRecord); +// evalIndicatorImportRecordService.save(importRecord); Long importRecordId = importRecord.getId(); List details = new ArrayList<>(); List indicatorValues = this.analysisExcel(file, ShopIndicatorValueVO.class); @@ -234,15 +291,31 @@ public class EvalIndicatorReportService { importRecord.setErrorNum(errorNum); importRecord.setNum(indicatorValues.size()); importRecord.setSuccessNum(indicatorValues.size() - errorNum); - evalIndicatorImportRecordService.updateById(importRecord); - evalIndicatorImportDetailService.saveBatch(details); - for (String indicatorCode : uploadIndicatorCodes) { - ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode, - importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); - EventBusUtil.asyncPost(importEvalIndicatorEvent); - } + String key = PublicUtil.getUUID() + user.getUserId(); + stringRedisTemplate.opsForValue().set(getEvalImport() + key, JSON.toJSONString(importRecord), 1 , TimeUnit.DAYS); + stringRedisTemplate.opsForValue().set(getEvalImportDetail() + key, JSON.toJSONString(details), 1 , TimeUnit.DAYS); + + EvalIndicatorImportRecordVO recordVO = PublicUtil.copy(importRecord, EvalIndicatorImportRecordVO.class); + List detailVos = PublicUtil.copyList(details, EvalIndicatorImportDetailVO.class); + recordVO.setDetails(detailVos); + recordVO.setKey(key); + return recordVO; +// evalIndicatorImportRecordService.updateById(importRecord); +// evalIndicatorImportDetailService.saveBatch(details); +// for (String indicatorCode : uploadIndicatorCodes) { +// ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode, +// importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); +// EventBusUtil.asyncPost(importEvalIndicatorEvent); +// } } + public EvalIndicatorImportDetailVO convertStaffVo(Optional valueOptional) { + EvalIndicatorImportDetailVO detail = new EvalIndicatorImportDetailVO(); + detail.setIndicatorName(valueOptional.map(StaffIndicatorValueVO::getIndicatorName).orElse("")); + detail.setUserName(valueOptional.map(StaffIndicatorValueVO::getStaffName).orElse("")); + detail.setShopName(valueOptional.map(StaffIndicatorValueVO::getShopName).orElse("")); + return detail; + } public EvalIndicatorImportDetail convertStaffPo(Optional valueOptional) { EvalIndicatorImportDetail detail = new EvalIndicatorImportDetail(); detail.setIndicatorName(valueOptional.map(StaffIndicatorValueVO::getIndicatorName).orElse("")); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java index 6ad0858..b0ce014 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java @@ -26,6 +26,7 @@ import cn.fw.morax.rpc.erp.ErpRpcService; import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO; import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO; import cn.fw.morax.service.biz.ApprovalBizService; +import cn.fw.morax.service.data.ApprovalRecordService; import cn.fw.morax.service.data.eval.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -73,6 +74,7 @@ public class EvalRewardService { private final ApprovalBizService approvalBizService; private final StringRedisTemplate stringRedisTemplate; private final EvalShopPoolService evalShopPoolService; + private final ApprovalRecordService approvalRecordService; private final EvalRewardDistService evalRewardDistService; private final EvalRewardDistDetailService evalRewardDistDetailService; @@ -300,6 +302,14 @@ public class EvalRewardService { ); List detailVOS = PublicUtil.copyList(details, EvalRewardDistDetailVO.class); rewardDistVO.setRewardDetails(detailVOS); + + ApprovalRecord approvalRecord = approvalRecordService.getOne(Wrappers.lambdaQuery() + .eq(ApprovalRecord::getDataId, id) + .eq(ApprovalRecord::getApprovalType, ApprovalTypeEnum.EVAL_REWARD_DIST) + .eq(ApprovalRecord::getYn, Boolean.TRUE) + .last("ORDER BY id DESC LIMIT 1") + ); + rewardDistVO.setApprovalNo(Optional.ofNullable(approvalRecord).map(ApprovalRecord::getApprovalNo).orElse("")); } return rewardDistVO;