Commit dc3c54cfde111567eb851cacdc83f9c03c74155d

Authored by 姜超
1 parent 5ef1face

feature(*): 修改上传

修改上传
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalIndicatorImportRecordVO.java
... ... @@ -10,6 +10,7 @@ import lombok.experimental.Accessors;
10 10  
11 11 import java.time.LocalDate;
12 12 import java.util.Date;
  13 +import java.util.List;
13 14  
14 15 /**
15 16 * <p>
... ... @@ -100,4 +101,15 @@ public class EvalIndicatorImportRecordVO{
100 101 * 创建时间
101 102 */
102 103 private Date createTime;
  104 +
  105 + /**
  106 + * 保存的key
  107 + */
  108 + private String key;
  109 +
  110 + /**
  111 + * 导入详情
  112 + */
  113 + private List<EvalIndicatorImportDetailVO> details;
  114 +
103 115 }
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java
... ... @@ -91,6 +91,11 @@ public class EvalRewardDistVO {
91 91 private Long groupId;
92 92  
93 93 /**
  94 + * 审批单号
  95 + */
  96 + private String approvalNo;
  97 +
  98 + /**
94 99 * 门店
95 100 */
96 101 private List<EvalShopPoolVO> shopPools;
... ...
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;
6 6 import cn.fw.common.web.auth.LoginAuthBean;
7 7 import cn.fw.common.web.auth.annotation.CurrentUser;
8 8 import cn.fw.data.base.domain.common.Message;
  9 +import cn.fw.morax.common.utils.PublicUtil;
9 10 import cn.fw.morax.domain.db.eval.EvalIndicatorImportDetail;
10 11 import cn.fw.morax.domain.dto.query.EvalIndicatorImportQueryDTO;
11 12 import cn.fw.morax.domain.vo.eval.*;
... ... @@ -115,45 +116,43 @@ public class EvalIndicatorController {
115 116 * @return
116 117 */
117 118 @IgnoreAuth
118   - @PostMapping("/staff-indicator")
  119 + @PostMapping("/analysis-staff")
119 120 @ControllerMethod("上传人员指标")
120   - public Message<Void> uploadStaffIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) {
  121 + public Message<EvalIndicatorImportRecordVO> analysisStaffExcel(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) {
121 122 if (file.isEmpty()) {
122 123 throw new BusinessException("请上传文件");
123 124 }
124   - evalIndicatorReportService.uploadStaffIndicator(file, user);
125   - return success();
  125 + return success(evalIndicatorReportService.uploadStaffIndicator(file, user));
126 126 }
127 127  
128 128 /**
129   - * 上传人员指标
  129 + * 上传门店指标
130 130 *
131 131 * @return
132 132 */
133 133 @IgnoreAuth
134   - @PostMapping("/analysis-staff-indicator")
135   - @ControllerMethod("上传人员指标")
136   - public Message<List<EvalIndicatorImportDetailVO>> analysisStaffExcel(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) {
  134 + @PostMapping("/analysis-shop")
  135 + @ControllerMethod("上传门店指标")
  136 + public Message<Void> uploadShopIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) {
137 137 if (file.isEmpty()) {
138 138 throw new BusinessException("请上传文件");
139 139 }
140   - evalIndicatorReportService.analysisStaffExcel(file, user);
  140 + evalIndicatorReportService.uploadShopIndicator(file, user);
141 141 return success();
142 142 }
143 143  
144 144 /**
145   - * 上传门店指标
  145 + * 保存上传人员数据
146 146 *
147 147 * @return
148 148 */
149   - @IgnoreAuth
150   - @PostMapping("/shop-indicator")
151   - @ControllerMethod("上传门店指标")
152   - public Message<Void> uploadShopIndicator(@RequestParam("file") MultipartFile file, @CurrentUser LoginAuthBean user) {
153   - if (file.isEmpty()) {
154   - throw new BusinessException("请上传文件");
  149 + @GetMapping("/save-import")
  150 + @ControllerMethod("保存上传人员数据")
  151 + public Message<Void> uploadStaffIndicator(String key) {
  152 + if (PublicUtil.isEmpty(key)) {
  153 + throw new BusinessException("参数错误");
155 154 }
156   - evalIndicatorReportService.uploadShopIndicator(file, user);
  155 + evalIndicatorReportService.saveImportIndicator(key);
157 156 return success();
158 157 }
159 158  
... ...
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;
18 18 import cn.fw.morax.service.data.eval.*;
19 19 import cn.hutool.poi.excel.ExcelReader;
20 20 import cn.hutool.poi.excel.ExcelUtil;
  21 +import com.alibaba.fastjson.JSON;
21 22 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
22 23 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
23 24 import com.google.common.collect.Lists;
  25 +import lombok.Getter;
24 26 import lombok.RequiredArgsConstructor;
25 27 import lombok.extern.slf4j.Slf4j;
26 28 import org.apache.commons.collections4.map.MultiKeyMap;
27 29 import org.apache.poi.ss.formula.functions.T;
  30 +import org.checkerframework.checker.units.qual.K;
  31 +import org.springframework.beans.factory.annotation.Value;
  32 +import org.springframework.data.redis.core.BoundValueOperations;
  33 +import org.springframework.data.redis.core.StringRedisTemplate;
28 34 import org.springframework.stereotype.Service;
29 35 import org.springframework.transaction.annotation.Transactional;
30 36 import org.springframework.web.multipart.MultipartFile;
... ... @@ -39,6 +45,7 @@ import java.time.LocalTime;
39 45 import java.time.YearMonth;
40 46 import java.time.format.DateTimeFormatter;
41 47 import java.util.*;
  48 +import java.util.concurrent.TimeUnit;
42 49 import java.util.function.Function;
43 50 import java.util.stream.Collectors;
44 51  
... ... @@ -57,9 +64,17 @@ public class EvalIndicatorReportService {
57 64 private final EvalIndicatorService evalIndicatorService;
58 65 private final EvalUserPoolService evalUserPoolService;
59 66 private final EvalShopPoolService evalShopPoolService;
  67 + private final StringRedisTemplate stringRedisTemplate;
60 68 private final EvalGroupService evalGroupService;
61 69 private final EvalService evalService;
62 70  
  71 + @Value("${spring.cache.custom.global-prefix}:eval-import:")
  72 + @Getter
  73 + private String evalImport;
  74 + @Value("${spring.cache.custom.global-prefix}:eval-import-detail:")
  75 + @Getter
  76 + private String evalImportDetail;
  77 +
63 78 public void staffTemplateFile(HttpServletRequest request, HttpServletResponse response) {
64 79 String fileName = "人员导入标准模板.xlsx";
65 80 String encodeFileName = CommonService.getEncodeName(request, fileName);
... ... @@ -122,11 +137,11 @@ public class EvalIndicatorReportService {
122 137 }
123 138  
124 139 @Transactional(rollbackFor = Exception.class)
125   - public void uploadStaffIndicator(MultipartFile file, LoginAuthBean user) {
  140 + public EvalIndicatorImportRecordVO uploadStaffIndicator(MultipartFile file, LoginAuthBean user) {
126 141 MultiKeyMap<String, EvalUserPool> staffPostMap = getShopUserPoolMap(user);
127 142 Map<String, EvalIndicator> evalIndicatorMap = getNameIndicatorMap();
128 143 EvalIndicatorImportRecord importRecord = createRecord(user, DimensionTypeEnum.STAFF);
129   - evalIndicatorImportRecordService.save(importRecord);
  144 +// evalIndicatorImportRecordService.save(importRecord);
130 145 List<EvalIndicatorImportDetail> details = new ArrayList<>();
131 146 List<StaffIndicatorValueVO> indicatorValues = this.analysisExcel(file, StaffIndicatorValueVO.class);
132 147 Long importRecordId = importRecord.getId();
... ... @@ -168,73 +183,70 @@ public class EvalIndicatorReportService {
168 183 importDetail.setIndicatorValue(new BigDecimal(staff.getIndicatorValue()));
169 184 importDetail.setDataType(evalIndicator.getDataType());
170 185 }
171   - Optional<EvalIndicatorImportDetail> detailOptional = details.stream().findFirst();
  186 + Optional<EvalIndicatorImportDetail> detailOptional = details.stream().filter(detail -> PublicUtil.isEmpty(detail.getErrorType())).findFirst();
172 187 importRecord.setIndicatorCode(detailOptional.map(EvalIndicatorImportDetail::getIndicatorCode).orElse(""));
173 188 importRecord.setIndicatorName(detailOptional.map(EvalIndicatorImportDetail::getIndicatorName).orElse(""));
174 189 importRecord.setErrorNum(errorNum);
175 190 importRecord.setNum(indicatorValues.size());
176 191 importRecord.setSuccessNum(indicatorValues.size() - errorNum);
177   - evalIndicatorImportRecordService.updateById(importRecord);
178   - evalIndicatorImportDetailService.saveBatch(details);
179 192  
180   - for (String indicatorCode : uploadIndicatorCodes) {
181   - ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode,
182   - importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime());
183   - EventBusUtil.asyncPost(importEvalIndicatorEvent);
184   - }
185   - }
  193 + String key = PublicUtil.getUUID() + user.getUserId();
  194 + stringRedisTemplate.opsForValue().set(getEvalImport() + key, JSON.toJSONString(importRecord), 1 , TimeUnit.DAYS);
  195 + stringRedisTemplate.opsForValue().set(getEvalImportDetail() + key, JSON.toJSONString(details), 1 , TimeUnit.DAYS);
186 196  
187   - public List<EvalIndicatorImportDetailVO> analysisStaffExcel(MultipartFile file, LoginAuthBean user) {
188   - MultiKeyMap<String, EvalUserPool> staffPostMap = getShopUserPoolMap(user);
189   - Map<String, EvalIndicator> evalIndicatorMap = getNameIndicatorMap();
190   - List<EvalIndicatorImportDetailVO> details = new ArrayList<>();
191   - List<StaffIndicatorValueVO> indicatorValues = this.analysisExcel(file, StaffIndicatorValueVO.class);
192   - Integer errorNum = 0;
193   - Set<String> uploadIndicatorCodes = new HashSet<>();
  197 + EvalIndicatorImportRecordVO recordVO = PublicUtil.copy(importRecord, EvalIndicatorImportRecordVO.class);
  198 + List<EvalIndicatorImportDetailVO> detailVos = PublicUtil.copyList(details, EvalIndicatorImportDetailVO.class);
  199 + recordVO.setDetails(detailVos);
  200 + recordVO.setKey(key);
  201 + return recordVO;
194 202  
195   - MultiKeyMap<String, String> repeatMap = new MultiKeyMap<>();
196   - for (StaffIndicatorValueVO staff : indicatorValues) {
197   - Optional<StaffIndicatorValueVO> valueOptional = Optional.ofNullable(staff);
198   - EvalIndicatorImportDetailVO importDetail = convertStaffVo(valueOptional);
199   - details.add(importDetail);
200   - if (repeatMap.containsKey(staff.getStaffName(), staff.getShopName(), staff.getIndicatorName())) {
201   - importDetail.setErrorType(ImportErrorReasonEnum.NO_MATCH_STAFF);
202   - errorNum += 1;
203   - continue;
204   - }
205   - repeatMap.put(staff.getStaffName(), staff.getShopName(), staff.getIndicatorName(), "");
  203 +// evalIndicatorImportRecordService.updateById(importRecord);
  204 +// evalIndicatorImportDetailService.saveBatch(details);
206 205  
207   - importDetail.setDataDate(transferDate(staff.getDataDate()));
208   - if (! staffPostMap.containsKey(staff.getShopName(), staff.getStaffName())) {
209   - importDetail.setErrorType(ImportErrorReasonEnum.NO_MATCH_STAFF);
210   - errorNum += 1;
211   - continue;
212   - }
213   - EvalUserPool userPool = staffPostMap.get(staff.getShopName(), staff.getStaffName());
214   - importDetail.setUserId(userPool.getUserId());
215   - importDetail.setShopId(userPool.getShopId());
  206 +// for (String indicatorCode : uploadIndicatorCodes) {
  207 +// ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode,
  208 +// importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime());
  209 +// EventBusUtil.asyncPost(importEvalIndicatorEvent);
  210 +// }
  211 + }
216 212  
217   - if (! evalIndicatorMap.containsKey(staff.getIndicatorName())) {
218   - importDetail.setErrorType(ImportErrorReasonEnum.NO_MATCH_INDICATOR);
219   - errorNum += 1;
220   - continue;
  213 + public void saveImportIndicator(String key) {
  214 + BoundValueOperations<String, String> importOperation = stringRedisTemplate.boundValueOps(getEvalImport() + key);
  215 + BoundValueOperations<String, String> importDetailOperation = stringRedisTemplate.boundValueOps(getEvalImportDetail() + key);
  216 + String json = importOperation.get();
  217 + String detailJson = importDetailOperation.get();
  218 + if (PublicUtil.isEmpty(json) || PublicUtil.isEmpty(detailJson)) {
  219 + log.error("考评指标导入,redis数据为空,key {},", getEvalImport() + key);
  220 + throw new BusinessException("请求超时,请重新上传");
  221 + }
  222 + EvalIndicatorImportRecord record = JSON.parseObject(json, EvalIndicatorImportRecord.class);
  223 + List<EvalIndicatorImportDetail> details = JSON.parseArray(detailJson, EvalIndicatorImportDetail.class);
  224 + evalIndicatorImportRecordService.save(record);
  225 + Long recordId = record.getId();
  226 + Set<String> uploadIndicatorCodes = new HashSet<>();
  227 + for (EvalIndicatorImportDetail detail : details) {
  228 + detail.setRecordId(recordId);
  229 + if (PublicUtil.isEmpty(detail.getErrorType()) && PublicUtil.isEmpty(detail.getIndicatorCode())) {
  230 + uploadIndicatorCodes.add(detail.getIndicatorCode());
221 231 }
222   - EvalIndicator evalIndicator = evalIndicatorMap.get(staff.getIndicatorName());
223   - uploadIndicatorCodes.add(evalIndicator.getCode());
224   - importDetail.setIndicatorCode(evalIndicator.getCode());
225   - importDetail.setIndicatorName(evalIndicator.getName());
226   - importDetail.setIndicatorValue(new BigDecimal(staff.getIndicatorValue()));
227   - importDetail.setDataType(evalIndicator.getDataType());
228 232 }
229   - return details;
  233 + evalIndicatorImportDetailService.saveBatch(details);
  234 + stringRedisTemplate.delete(getEvalImport() + key);
  235 + stringRedisTemplate.delete(getEvalImportDetail() + key);
  236 + //事件
  237 + for (String indicatorCode : uploadIndicatorCodes) {
  238 + ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode,
  239 + recordId, record.getGroupId(), record.getUploadTime());
  240 + EventBusUtil.asyncPost(importEvalIndicatorEvent);
  241 + }
230 242 }
231 243  
232 244 @Transactional(rollbackFor = Exception.class)
233   - public void uploadShopIndicator(MultipartFile file, LoginAuthBean user) {
  245 + public EvalIndicatorImportRecordVO uploadShopIndicator(MultipartFile file, LoginAuthBean user) {
234 246 Map<String, EvalShopPool> shopPoolMap = this.getShopPoolMap(user);
235 247 Map<String, EvalIndicator> evalIndicatorMap = getNameIndicatorMap();
236 248 EvalIndicatorImportRecord importRecord = createRecord(user, DimensionTypeEnum.SHOP);
237   - evalIndicatorImportRecordService.save(importRecord);
  249 +// evalIndicatorImportRecordService.save(importRecord);
238 250 Long importRecordId = importRecord.getId();
239 251 List<EvalIndicatorImportDetail> details = new ArrayList<>();
240 252 List<ShopIndicatorValueVO> indicatorValues = this.analysisExcel(file, ShopIndicatorValueVO.class);
... ... @@ -279,13 +291,22 @@ public class EvalIndicatorReportService {
279 291 importRecord.setErrorNum(errorNum);
280 292 importRecord.setNum(indicatorValues.size());
281 293 importRecord.setSuccessNum(indicatorValues.size() - errorNum);
282   - evalIndicatorImportRecordService.updateById(importRecord);
283   - evalIndicatorImportDetailService.saveBatch(details);
284   - for (String indicatorCode : uploadIndicatorCodes) {
285   - ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode,
286   - importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime());
287   - EventBusUtil.asyncPost(importEvalIndicatorEvent);
288   - }
  294 + String key = PublicUtil.getUUID() + user.getUserId();
  295 + stringRedisTemplate.opsForValue().set(getEvalImport() + key, JSON.toJSONString(importRecord), 1 , TimeUnit.DAYS);
  296 + stringRedisTemplate.opsForValue().set(getEvalImportDetail() + key, JSON.toJSONString(details), 1 , TimeUnit.DAYS);
  297 +
  298 + EvalIndicatorImportRecordVO recordVO = PublicUtil.copy(importRecord, EvalIndicatorImportRecordVO.class);
  299 + List<EvalIndicatorImportDetailVO> detailVos = PublicUtil.copyList(details, EvalIndicatorImportDetailVO.class);
  300 + recordVO.setDetails(detailVos);
  301 + recordVO.setKey(key);
  302 + return recordVO;
  303 +// evalIndicatorImportRecordService.updateById(importRecord);
  304 +// evalIndicatorImportDetailService.saveBatch(details);
  305 +// for (String indicatorCode : uploadIndicatorCodes) {
  306 +// ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(indicatorCode,
  307 +// importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime());
  308 +// EventBusUtil.asyncPost(importEvalIndicatorEvent);
  309 +// }
289 310 }
290 311  
291 312 public EvalIndicatorImportDetailVO convertStaffVo(Optional<StaffIndicatorValueVO> valueOptional) {
... ...
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;
26 26 import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
27 27 import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
28 28 import cn.fw.morax.service.biz.ApprovalBizService;
  29 +import cn.fw.morax.service.data.ApprovalRecordService;
29 30 import cn.fw.morax.service.data.eval.*;
30 31 import com.alibaba.fastjson.JSON;
31 32 import com.alibaba.fastjson.JSONObject;
... ... @@ -73,6 +74,7 @@ public class EvalRewardService {
73 74 private final ApprovalBizService approvalBizService;
74 75 private final StringRedisTemplate stringRedisTemplate;
75 76 private final EvalShopPoolService evalShopPoolService;
  77 + private final ApprovalRecordService approvalRecordService;
76 78 private final EvalRewardDistService evalRewardDistService;
77 79 private final EvalRewardDistDetailService evalRewardDistDetailService;
78 80  
... ... @@ -300,6 +302,14 @@ public class EvalRewardService {
300 302 );
301 303 List<EvalRewardDistDetailVO> detailVOS = PublicUtil.copyList(details, EvalRewardDistDetailVO.class);
302 304 rewardDistVO.setRewardDetails(detailVOS);
  305 +
  306 + ApprovalRecord approvalRecord = approvalRecordService.getOne(Wrappers.<ApprovalRecord>lambdaQuery()
  307 + .eq(ApprovalRecord::getDataId, id)
  308 + .eq(ApprovalRecord::getApprovalType, ApprovalTypeEnum.EVAL_REWARD_DIST)
  309 + .eq(ApprovalRecord::getYn, Boolean.TRUE)
  310 + .last("ORDER BY id DESC LIMIT 1")
  311 + );
  312 + rewardDistVO.setApprovalNo(Optional.ofNullable(approvalRecord).map(ApprovalRecord::getApprovalNo).orElse(""));
303 313 }
304 314  
305 315 return rewardDistVO;
... ...