172 lines
5.5 KiB
Java
172 lines
5.5 KiB
Java
package com.yem.tws.chart;
|
||
|
||
import com.yem.tws.common1.StringUtils;
|
||
import kd.bos.context.RequestContext;
|
||
import kd.bos.entity.datamodel.IDataModel;
|
||
import kd.bos.form.control.Label;
|
||
import kd.bos.form.control.ProgressBar;
|
||
import kd.bos.form.control.events.ProgressEvent;
|
||
import kd.bos.form.control.events.ProgresssListener;
|
||
import kd.bos.form.plugin.AbstractFormPlugin;
|
||
import kd.bos.mvc.cache.PageCache;
|
||
import kd.bos.threads.ThreadPool;
|
||
import kd.bos.threads.ThreadPools;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.util.EventObject;
|
||
|
||
/**
|
||
* @author zhouc
|
||
* @date 2023/9/9 15:48
|
||
* @className AvailabilityEdit
|
||
* @description 授信可用率图表插件
|
||
*/
|
||
public class AvailabilityEdit extends AbstractFormPlugin implements ProgresssListener {
|
||
|
||
private final static String KEY_PROGRESSBAR = "yem_progressbarap";
|
||
|
||
public final static String CACHEKEY_PROGRESS = "progress";
|
||
public final static String CACHEKEY_STARTPROPGRESS = "startprogress";
|
||
private static ThreadPool threadPool = ThreadPools.newFixedThreadPool("AvailabilityEdit", 1);
|
||
|
||
@Override
|
||
public void afterCreateNewData(EventObject e) {
|
||
super.afterCreateNewData(e);
|
||
IDataModel model = this.getModel();
|
||
String yem_sumamoun = (String) model.getValue("yem_sumamoun");
|
||
String yem_occupyamt = (String) model.getValue("yem_occupyamt");
|
||
String yem_colour = (String) model.getValue("yem_colour");
|
||
|
||
Label yem_labelap2 = this.getControl("yem_labelap2");
|
||
yem_labelap2.setText(yem_sumamoun.toString());
|
||
Label yem_labelap3 = this.getControl("yem_labelap3");
|
||
yem_labelap3.setText(yem_occupyamt.toString());
|
||
start();
|
||
}
|
||
|
||
@Override
|
||
public void registerListener(EventObject e) {
|
||
super.registerListener(e);
|
||
ProgressBar progressBar = this.getView().getControl(KEY_PROGRESSBAR);
|
||
progressBar.addProgressListener(this);
|
||
// this.addClickListeners(KEY_BTNSTART, KEY_BTNSTOP);
|
||
}
|
||
|
||
/**
|
||
* 开始进度
|
||
*/
|
||
private void start() {
|
||
// 设置当前进度
|
||
ProgressBar progressBar = this.getView().getControl(KEY_PROGRESSBAR);
|
||
progressBar.start();
|
||
// 标记任务已经开始
|
||
this.getPageCache().put(CACHEKEY_STARTPROPGRESS, "true");
|
||
this.getPageCache().put(CACHEKEY_PROGRESS, "0");
|
||
|
||
// 启动异步进程,执行任务,在任务中随时更新进度
|
||
Task myTask = new Task(RequestContext.get(), this.getView().getPageId());
|
||
threadPool.execute(myTask);
|
||
}
|
||
|
||
/**
|
||
* 停止进度
|
||
*/
|
||
private void stop() {
|
||
// 更新缓存中的任务启动标志 = false:异步任务进程会定时读取这个标志,停止任务
|
||
this.getPageCache().put(CACHEKEY_STARTPROPGRESS, "false");
|
||
}
|
||
|
||
@Override
|
||
public void onProgress(ProgressEvent arg0) {
|
||
IDataModel model = this.getModel();
|
||
String yem_sumamoun = (String) model.getValue("yem_sumamoun");
|
||
String yem_occupyamt = (String) model.getValue("yem_occupyamt");
|
||
String startProgress = this.getPageCache().get(CACHEKEY_STARTPROPGRESS);
|
||
if (StringUtils.isBlank(startProgress)) {
|
||
// 未开始:设置进度为0
|
||
arg0.setProgress(0);
|
||
return;
|
||
}
|
||
int progress = 0;
|
||
// 取缓存的进度:由后台任务更新
|
||
String cacheProgress = this.getPageCache().get(CACHEKEY_PROGRESS);
|
||
if (StringUtils.isNotEmpty(cacheProgress)) {
|
||
progress = getProgress(yem_sumamoun,yem_occupyamt);
|
||
}
|
||
if (progress >= 100) {
|
||
progress = 99;
|
||
stop();
|
||
}
|
||
if (startProgress.equals("false")) {
|
||
}
|
||
arg0.setProgress(progress);
|
||
}
|
||
|
||
public int getProgress(String yem_sumamoun, String yem_occupyamt) {
|
||
//获取当前登录组织
|
||
int progress = 0;
|
||
BigDecimal maerialRat = new BigDecimal(yem_occupyamt).divide(new BigDecimal(yem_sumamoun)).multiply(new BigDecimal(100));
|
||
String bd1 = maerialRat.setScale(0, BigDecimal.ROUND_HALF_UP).toString();
|
||
progress = Integer.valueOf(bd1).intValue();
|
||
return progress;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 异步任务
|
||
*
|
||
* @author rd_JohnnyDing
|
||
*/
|
||
class Task implements Runnable {
|
||
|
||
private RequestContext rc;
|
||
String pageId;
|
||
|
||
public Task(RequestContext rc, String pageId) {
|
||
this.rc = rc;
|
||
this.pageId = pageId;
|
||
}
|
||
|
||
@Override
|
||
public void run() {
|
||
|
||
// 设置登录上下文,否则无法访问数据库
|
||
RequestContext.set(rc);
|
||
|
||
this.doTask();
|
||
}
|
||
|
||
private void doTask() {
|
||
|
||
int progress = 0;
|
||
|
||
while (progress < 100) {
|
||
// 暂停100ms
|
||
try {
|
||
Thread.sleep(100);
|
||
} catch (InterruptedException e) {
|
||
e.printStackTrace();
|
||
}
|
||
|
||
// 刷新进度,写入缓存中:其他进程会从缓存中定时(1s)读取进度
|
||
progress++;
|
||
|
||
// 把最新的进度推送到页面缓存中
|
||
PageCache pageCache = new PageCache(this.pageId);
|
||
pageCache.put(CustomsErrorRate.CACHEKEY_PROGRESS, String.valueOf(progress));
|
||
|
||
// 如果主线程,要求停止任务,则主动终止循环
|
||
if (isStop(pageCache)) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
private boolean isStop(PageCache pageCache) {
|
||
String startProgress = pageCache.get(CustomsErrorRate.CACHEKEY_STARTPROPGRESS);
|
||
return (StringUtils.isNotEmpty(startProgress)
|
||
&& startProgress.equals("false"));
|
||
}
|
||
|
||
}
|