背景
公司设备一直处理无保养任务计划状态,经常到用时发现设备是坏的或者有异常而无法使用,为了解决此问题,就搭建了这一简单应用来解决设备保养任务计划管理。
基本功能如下:
1、建立设备保养任务清单,一台设备有多项保养项目,每项保养项目都有对应的保养人,保养时间。
2、设备保养项目时间快到期时自动生成设备保养流程到对应的保养人执行保养,保养完成后回写保养完成时间和下次需要保养的时间,从而保养循环。
涉及OA模块
1、表单建模
2、计划任务
3、流程
主要实现功能说明
1、建模主要是建立设备保养任务清单,界面如下:
实现一台设备一个保养任务表单。
注意点: 明细中需单独增加一个设备编号及隐藏标识字段 分别用于流程回写数据及判断是否执行了计划任务用。
2、搭建流程并用流程转数据功能实现下次保养间时和最近保养时间等信息的回写,流程界面如下:
说明: 流程可根据实际需求搭建,只要涉及保养任务相关的字段有,且后续做为回写就可以了,在流程明细中也隐藏了一个流程编号的字段,目的是为了流程转数据时可以匹配使用。
在表单上面选择设备编号时,明细表中隐藏的设备编号会自动同步。
使用了流程中的公式功能。
流程归档回写到设备任务清单中的配置如下:
1、根据保养效果条件生成回写。
2、操作类型只做更新,不做新增,所以更新条件为 设备编号一致。
3、明细表中的回写,条件关联明细中的设备编号和保养项目ID,这里标识也要回写,但前面都没有赋值,所以是回写空值(主要功能是计划任务执行后标识设为1说明已经执行过计划任务,不用再执行计划任务了,但保养结束后,要把标识改为空,后续可再执行计划任务)。
4、计划任务的编写
主要是重写计划任务方法,每天执行一次,判断有没有到期的保养项目,如果有就生成流程,上面的参数说明 BeforeDays 用于到期前多少天生成流程,ErpDataSource 这个主要是我们的设备信息来源于ERP,所以设置一个数据源,供代码中查询设备信息用。
实现代码如下:
import weaver.conn.RecordSet;
import weaver.conn.RecordSetDataSource;
import weaver.conn.RecordSetTrans;
import weaver.general.BaseBean;
import weaver.interfaces.schedule.BaseCronJob;
import weaver.soa.workflow.request.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class CJSBBYRWToWorkflowJob extends BaseCronJob {
private String BeforeDays;
public String getBeforeDays() { return BeforeDays; }
public void setBeforeDays(String BeforeDays) { this.BeforeDays = BeforeDays; }
private String ErpDataSource;
public String getErpDataSource() { return ErpDataSource; }
public void setErpDataSource(String ErpDataSource) { this.ErpDataSource = ErpDataSource; }
@Override
public void execute() {
Map<String, String> result = new HashMap<String, String>();
try {
int workflowid = 127; //制造-设备保养单流程的id
//------请在下面编写业务逻辑代码------
//获取人员名称
RecordSet rs = new RecordSet();
//获取需要创建几条流程的数量,根据人员区分
rs.execute("select distinct sbbh,byr,dbo.GetUserName(byr)as lastname,departmentid,xcbyrq from uf_sbbyrw_dt1 B left join HrmResource A on B.byr=A.id where xcbyrq<=GETDATE()+"+BeforeDays+" and (bs is null or bs='')");
while (rs.next()) {
Map<String, String> mainMap = new HashMap<String, String>();
List<Map<String, String>> detailMapsList = new ArrayList<Map<String, String>>();
//取主表数据
//02.根据数据组合为创建流程需要的结构
String creater = rs.getString("byr");
Date date=new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String sqrq = ft.format(date); //申请日期
String sbbh = rs.getString("sbbh");
String byr = rs.getString("byr");
String sqbm = rs.getString("departmentid");
String title = "制造-设备保养单"+"-"+rs.getString("lastname")+"-"+sqrq+"-"+sbbh;
RecordSetDataSource rs1=new RecordSetDataSource(ErpDataSource);
rs1.execute("select MJ005,MJ006,MJ029 FROM EQTMJ WHERE MJ002='" + sbbh +"'" );
if(rs1.next()) { //判断表单头内容存在
String sbmc = rs1.getString("MJ006");
String sbxh = rs1.getString("MJ005");
String sydd = rs1.getString("MJ029");
//02.根据数据组合为创建流程需要的结构
mainMap.put("sqr", byr); //申请人
mainMap.put("sqrq", sqrq);//申请日期
mainMap.put("sqbm", sqbm);//申请部门
mainMap.put("sbbh", sbbh);//设备编号
mainMap.put("sbmc", sbmc);//设备名称
mainMap.put("sbxh", sbxh);//设备型号
// mainMap.put("bz", "");//备注
mainMap.put("sydd", sydd);//使用地点
// mainMap.put("byxg", "");//保养效果
RecordSet rs2 = new RecordSet(); //获取明细内容
rs2.execute("select id,byxm,byyqsm,xcbyrq from uf_sbbyrw_dt1 where sbbh='"+sbbh+"' and byr='"+byr+"' and xcbyrq<=GETDATE()+"+BeforeDays+" and (bs is null or bs='')");
while (rs2.next()) {
Map<String, String> detailMap = new HashMap<String, String>(); //必须用些方法创建新的,不能直接在后面用 detailMap.clear();
String byxm = rs2.getString("id");
String byyqsm = rs2.getString("byyqsm");
String jhbyrq =rs2.getString("xcbyrq");
detailMap.put("byxm",byxm);//保养项目ID
detailMap.put("byyqsm",byyqsm);//保养要求说明
detailMap.put("jhbyrq",jhbyrq);//计划保养日期
detailMap.put("sbbh",sbbh);//设备编号
// detailMap.put("byjg","");//保养结果
detailMap.put("byblxgscs","");//保养不合格时措施
detailMap.put("wcbyrq","");//完成保养日期
// detailMap.put("sfjswc","");//是否及时完成
detailMap.put("xcbyrq","");//下次保养日期
detailMap.put("byjgsm","");//保养结果说明
// detailMap.put("byxg","");//保养效果
detailMap.put("bs",""); //标识,判断
detailMapsList.add(detailMap); //加入LIST
}
//03.根据明细循环创建流程。
RequestInfo workflowrequestInfo = WorkFlowUtil.getRequestInfo(Integer.toString(workflowid),creater, title, mainMap, detailMapsList);
RequestService requestService = new RequestService();
String requestId = requestService.createRequest(workflowrequestInfo);
(new BaseBean()).writeLog(" 创建设备保养流程的结果:" + requestId);
if (requestId.indexOf("-")>=0) {
(new BaseBean()).writeLog("异常:调用接口失败,无法创建流程");
}else{
RecordSetTrans rst = new RecordSetTrans();
rst.setAutoCommit(false);
try {
rst.executeUpdate("update uf_sbbyrw_dt1 set bs='1' where sbbh='"+sbbh+"' and byr='"+byr+"' and xcbyrq<=GETDATE()+"+BeforeDays+" and (bs is null or bs='')");//创建流程后的保养项目标识设为1
//手动提交事务
rst.commit();
} catch (Exception e) {
//执行失败,回滚数据
rst.rollback();
e.printStackTrace();
}
}
mainMap.clear();
detailMapsList.clear();
}
}
} catch (Exception e) {
(new BaseBean()).writeLog("异常:调用接口失败,无法创建流程");
}
}
}
备注: 代码中涉及到一个流程数据格式化工具WorkFlowUtil,参考以下文章《泛微启动流程JAVA代码》
版权声明:本文为CSDN博主「梦在溪田」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/flying86/article/details/119887985
整体就这样,有问题请留言。