[Projet] S'il est exporté conformément à l'ordre financier

besoin

1. Exportation d'ordre financier nouvellement ajoutée - la méthode de mise en œuvre des tâches chronométrées maintenant, seuls le rôle financier et le rôle d'administrateur système peuvent voir ce bouton d'exportation et exporter, il n'y a pas de fonction d'exportation de filtre 2. Demander la déduplication - pour empêcher les utilisateurs d'actualiser
et lancer des demandes d'exportation, Seule la dernière demande d'exportation initiée par l'utilisateur dans les 10 minutes est exportée. Si un utilisateur lance trois demandes d'exportation consécutives dans les 10 minutes, seule la troisième demande d'exportation de l'utilisateur sera exportée.

accomplir

extrémité arrière

OrderInfoController

	private final FeignSysUserService feignSysUserService;
	private final UserFinancialExportTaskMapper userFinancialExportTaskMapper;
   /**
     * @Description: 请求导出财务订单记录列表
     */
	@ApiOperation(value = "请求导出财务订单记录列表")
	@SysLog("请求导出财务订单记录列表")
	@PostMapping("/financialExport")
	public void financialExport() throws Exception {
    
    
		BaseUser user = SecurityUtils.getUser();
		if (ObjectUtil.isNull(user)) {
    
    
			throw new CheckedException("auto datascope, set up security details true");
		}
		R r = feignSysUserService.getUser(user.getId(),user.getType(),SecurityConstants.FROM_IN);
		if (!r.isOk()) {
    
    
			log.warn("全部订单下载通知的获取管理员信息远程服务查询失败!");
			throw new RuntimeException(r.getMsg());
		}
		//把object转换成json字符串
		String json = JSON.toJSONString(r.getData());
		//把json字符串转换成UserInfo对象
		UserVO userInfo = JSON.parseObject(json, UserVO.class);
		if (Objects.isNull(userInfo)) {
    
    
			log.warn("全部订单下载通知管理员信息不存在");
		}
		List<SysRole> sysRoleList=  userInfo.getRoleList();
		String roleCode = sysRoleList.get(0).getRoleCode();

        if ((!CommonConstants.ROLE_CODE_FC.equals(roleCode))&&(!CommonConstants.USER_TYPE_S.equals(userInfo.getTenantId()))) {
    
    
			log.error("当前用户不是财务人员或者系统管理员,无法导出{}财务订单记录列表",roleCode);
			throw new RuntimeException("当前用户不是财务人员或者系统管理员,无法导出财务订单记录列表");
		}
		UserFinancialExportTask userFinancialExportTask = new UserFinancialExportTask();
		userFinancialExportTask.setId(userInfo.getId());
		userFinancialExportTask.setUsername(userInfo.getUsername());
		userFinancialExportTask.setNickName(userInfo.getNickName());
		userFinancialExportTask.setCreateTime(new Date());
		userFinancialExportTask.setEmail(userInfo.getEmail());
		userFinancialExportTask.setRoleCode(roleCode);
		userFinancialExportTask.setStatus(OrderInfoEnum.STATUS_TASK_0.getValue());
		userFinancialExportTask.setTenantId(userInfo.getTenantId());
		userFinancialExportTaskMapper.insert(userFinancialExportTask);
	}

UserFinancialOrderExportTask

/**
 * @Description: 商城财务订单导出任务
 */
@Slf4j
@Component("financialOrderInfoExportTask")
@AllArgsConstructor
public class UserFinancialOrderExportTask {
    
    

	private final CosConfigProperties cosConfigProperties;

	private final MailConfigProperties mailConfigProperties;


	private final UserFinancialExportTaskService userFinancialExportTaskService;

	private final OrderInfoExportFinanceService orderInfoExportFinanceService;

	/**
	 * @Description: 商城财务订单导出任务
	 */
	@XxlJob("financialOrderInfoExportJobHandler")
	public ReturnT<String> financialOrderInfoExportJob(String s) throws Exception {
    
    
		//查询出所有的需要导出的任务
		QueryWrapper<UserFinancialExportTask> wapper = new QueryWrapper<UserFinancialExportTask>();
		List<UserFinancialExportTask> taskList = userFinancialExportTaskService.list(wapper.eq("status", OrderInfoEnum.STATUS_TASK_0.getValue()).orderByDesc("create_time"));
		//去重
		List<UserFinancialExportTask> arraysList = taskList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
				-> new TreeSet<>(Comparator.comparing(UserFinancialExportTask :: getId))), ArrayList::new));

		//如果有重复的任务,则将重复的任务状态改为已完成
		List<UserFinancialExportTask> duplicatedList = new ArrayList<>(taskList);
		duplicatedList.removeAll(arraysList);
		if(duplicatedList.size()>0){
    
    
			log.info("有重复的任务,重复的任务数量为:{}",duplicatedList.size());
			for (UserFinancialExportTask task : duplicatedList) {
    
    
				LambdaUpdateWrapper<UserFinancialExportTask> updateWrapper = new UpdateWrapper<UserFinancialExportTask>().lambda();
				updateWrapper.eq(UserFinancialExportTask::getCreateTime, task.getCreateTime());
				updateWrapper.set(UserFinancialExportTask::getStatus, OrderInfoEnum.STATUS_TASK_1.getValue());
				userFinancialExportTaskService.update(updateWrapper);
			}
		}
        //如果有任务,则执行
		if (arraysList.size() > 0) {
    
    
			for (UserFinancialExportTask exportTask1 : arraysList) {
    
    
				exportTask1.setStatus(OrderInfoEnum.STATUS_TASK_00.getValue());
				long diffInMilliSec = System.currentTimeMillis() - exportTask1.getCreateTime().getTime();
				long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(diffInMilliSec);
				//如果时间在10分钟以内,则执行
				if (diffInMinutes <= 10) {
    
    
					log.debug("orderInfoExportJob start...");
					List<OrderInfoExportFinance> list = orderInfoExportFinanceService.getList(new OrderInfoExportFinance());
					//讲数据写入到excel,并上传到cos上,生成地址
					String responseURL = excelLink(list);
					if (StringUtils.isEmpty(responseURL)) {
    
    
						exportTask1.setStatus(OrderInfoEnum.STATUS_TASK_11.getValue());
						throw new CheckedException("将数据写入到excel,并上传到cos上,生成地址失败");
					}
					//异步邮件通知用户去下载
					notifyUser(responseURL, exportTask1.getEmail(), exportTask1.getUsername());
					exportTask1.setStatus(OrderInfoEnum.STATUS_TASK_1.getValue());
					log.info("financialOrderInfoExportJob end...");
				} else {
    
    
					exportTask1.setStatus(OrderInfoEnum.STATUS_TASK_11.getValue());
				}
				LambdaUpdateWrapper<UserFinancialExportTask> updateWrapper = new UpdateWrapper<UserFinancialExportTask>().lambda();
				updateWrapper.eq(UserFinancialExportTask::getCreateTime, exportTask1.getCreateTime());
				updateWrapper.set(UserFinancialExportTask::getStatus, exportTask1.getStatus());
				userFinancialExportTaskService.update(updateWrapper);
			}
		}
		return SUCCESS;
	}

	/**
	 * @Description: 将数据写入到excel, 并上传到cos上, 生成地址
	 */
	private String excelLink(List<OrderInfoExportFinance> list) throws Exception {
    
    
		String sheetName = "订单记录列表";
		FileItem fileItem;
		List<OrderInfoExportFinance> exportCsList = BeanUtil.copyToList(list, OrderInfoExportFinance.class, null);
		ExcelUtil<OrderInfoExportFinance> util = new ExcelUtil<>(OrderInfoExportFinance.class);
		util.exportExcelNew(exportCsList, sheetName);
		fileItem = util.exportExcelNew(exportCsList, sheetName);

		//存入cos,生成链接地址,并设置2小时后失效
		return uploadFile(fileItem, sheetName);
	}

	/**
	 * @Description: 上传文件到cos, 并设置2小时后失效
	 */
	private String uploadFile(FileItem fileItem, String dir) throws Exception {
    
    
		MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
		File file = FileUtils.multipartFileToFile(multipartFile);
		SysConfigStorage sysConfigStorage = initSysConfigStorage();
		StorageConfig storageConfig = new StorageConfig();
		storageConfig.setAccessKeyId(sysConfigStorage.getAccessKeyId());
		storageConfig.setAccessKeySecret(sysConfigStorage.getAccessKeySecret());
		storageConfig.setEndpoint(sysConfigStorage.getEndpoint());
		storageConfig.setBucket(sysConfigStorage.getBucket());
		QcloudCosUtils qcloudCosUtils = new QcloudCosUtils(storageConfig);
		return qcloudCosUtils.uploadFileWithDeleteTime(file, dir);
	}

	/**
	 * @Description: 获取默认配置
	 */
	public SysConfigStorage initSysConfigStorage() {
    
    
		SysConfigStorage sysConfigStorage = new SysConfigStorage();
		sysConfigStorage.setStorageType(SysConfigStorage.StorageTypeEnum.QCLOUDCOS.getType());
		sysConfigStorage.setAccessKeyId(cosConfigProperties.getSecretId());
		sysConfigStorage.setAccessKeySecret(cosConfigProperties.getSecretKey());
		sysConfigStorage.setEndpoint(cosConfigProperties.getRegion());
		sysConfigStorage.setBucket(cosConfigProperties.getBucket());
		return sysConfigStorage;
	}


	/**
	 * @Description: 下载通知
	 */
	public void notifyUser(String responseURL, String email, String realName) {
    
    
		DesvMailUtil mailUtil = new DesvMailUtil(mailConfigProperties.getUsername(), mailConfigProperties.getPassword(), mailConfigProperties.getDomain(), mailConfigProperties.getUri());
		HashMap<String, Object> params = new HashMap<String, Object>();
		String today = DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN);
		params.put("to", email);
		params.put("username", "【】");
		params.put("title", "财务订单导出结果通知");
		String msgBody =
				"<p style=\"text-align:left;\">\r\n" +
						"	<br />\r\n" +
						"</p>\r\n" +
						"<p style=\"text-align:left;\">\r\n" +
						"	<span style=\"color:#333333;font-size:14px;\">To  {}:</span> \r\n" +
						"</p>\r\n" +
						"<p style=\"text-align:left;\">\r\n" +
						"	<span style=\"color:#333333;font-size:14px;\">全部订单导出地址为:{},请于两小时内下载。</span> \r\n" +
						"</p>\r\n" +
						"<p style=\"text-align:left;\">\r\n" +
						"	<span style=\"color:#333333;font-size:14px;\"> 两小时后链接将会失效哦,如失效,请再次发起导出需求。</span>\r\n" +
						"</p>\r\n" +
						"<p style=\"text-align:left;\">\r\n" +
						"	<span style=\"color:#333333;font-size:14px;\">{} </span> \r\n" +
						"<br />";
		msgBody = StrUtil.format(msgBody, realName, responseURL, today);
		params.put("item", msgBody);

		try {
    
    
			mailUtil.sendEmail(params);
		} catch (Exception e) {
    
    
			log.error("notifyUser error:{}", e.getMessage());
		}
		log.info("notifyUser {} sucesss", realName);

	}

}

l'extrémité avant

     /** 财政导出按钮操作 */
    handleFCExport() {
    
    
      this.$confirm(
        "请确认您“个人信息”里的邮箱"+ this.email+"为您正在使用的邮箱,如果是,请点击导出订单",
        "提示",
        {
    
    
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
    
    
          this.$message({
    
    
            type: "success",
            message:
              "收到,导出下载地址会在15分钟内通过邮件发送给您,请耐心等候。",
          });
          this.isFCDisabled = true; // 禁用按钮
          toFCExport();
          setTimeout(function () {
    
    
            this.isFCDisabled = false; // 启用按钮
          }, 600000); // 10分钟后执行
        })
        .catch(() => {
    
    
          this.$message({
    
    
            type: "info",
            message: "已取消",
          });
        });
    }
          this.$store.dispatch("GetUserInfo").then(res => {
    
    
              this.roles=res.roles[0];
              this.tenantId=res.sysUser.tenantId;
              this.email=res.sysUser.email;
          });

おすすめ

転載: blog.csdn.net/someday____/article/details/130524416