1、后台任务类型注册
位置:动态建模平台->开发配置->后台任务类型注册。
说明:配置定时任务对应后台代码类,模块及说明等。
业务插件类:客开类,需实现IBackgroundWorkPlugin接口
代码示例:
package nc.bs.gl.pushbt;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.naming.NamingException;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.NCLocator;
import nc.bs.gl.voucher.DetailDMO;
import nc.bs.glcom.query.VoucherQueryBO;
import nc.bs.pub.SystemException;
import nc.bs.pub.pa.PreAlertObject;
import nc.bs.pub.taskcenter.BgWorkingContext;
import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
import nc.bs.trade.business.HYPubBO;
import nc.jdbc.framework.processor.ResultSetProcessor;
import nc.vo.bd.accassitem.AccAssItemVO;
import nc.vo.bd.bankaccount.BankAccSubVO;
import nc.vo.gl.aggvoucher.FreeValueVO;
import nc.vo.gl.pubvoucher.DetailVO;
import nc.vo.gl.pubvoucher.VoucherVO;
import nc.vo.pub.BusinessException;
import nc.ws.intf.BTLogVO;
import nc.ws.intf.HttpClient;
import org.apache.commons.lang.StringUtils;
import uap.iweb.log.Logger;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* 日记账定时任务
*
* @author Xbx
*/
@SuppressWarnings({ "restriction", "rawtypes", "unused", "unchecked" })
public class PushGLInfo implements IBackgroundWorkPlugin {
public static HYPubBO hyPubBO;
@Override
public PreAlertObject executeTask(BgWorkingContext bgwc)
throws BusinessException {
// TODO Auto-generated method stub
// 获取接口地址
String url = getUrl();
if (url != null) {
try {
// 查询分录VO数组
DetailVO[] vos = getDetailSql();
if (vos.length > 0) {
// 获取封装接口数据
String send_data = getItfData(vos);
// 调用拜特资金系统接口
String back = pushBTData(url, send_data);
Logger.error("发送拜特数据:"+send_data);// 发送拜特数据
Logger.error("拜特返回数据:"+back);// 拜特返回数据
// 保存日志
String savelog = SaveBTLog(vos[0].getPk_org(),
vos[0].getPk_group(),back);
if (StringUtils.isNotEmpty(savelog)) {
bgwc.setLogStr("保存日志报错:" + savelog);
}
// 处理返回数据
String err = handleResult(back);
if (StringUtils.isNotEmpty(err)) {
bgwc.setLogStr(err);
}
}
} catch (BusinessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
bgwc.setLogStr(e1.getMessage());
} catch (SystemException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
bgwc.setLogStr(e1.getMessage());
} catch (NamingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
bgwc.setLogStr(e1.getMessage());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
bgwc.setLogStr(e1.getMessage());
}
}
return null;
}
// 处理返回数据
private String handleResult(String back) {
// TODO Auto-generated method stub
String errmsg = null;
if (isJSONArray(back)) {
JSONArray res = JSONArray.parseArray(back);
for (int i = 0; i < res.size(); i++) {
JSONObject obj = JSONArray.parseObject(res.get(i).toString()); // 将JSONArray数组转成JSONObject对象
String sql = "";
String pk_detail = obj.getString("id");// 凭证分录主键
String status = obj.getString("status");// 接收状态
// 0:接受成功;2:接受失败
String message = obj.getString("message");// 接受失败原因
if (StringUtils.isNotEmpty(status)
&& StringUtils.equals(status, "2")) {
sql = "update gl_detail set free1 = 'Y' "
+ "where pk_detail = '" + pk_detail
+ "' and nvl(dr,0) = 0 ";
} else if (StringUtils.isNotEmpty(status)) {
sql = "update gl_detail set free1 = 'N', free2 = '"
+ message + "' " + "where pk_detail = '"
+ pk_detail + "' and nvl(dr,0) = 0 ";
}
if (StringUtils.isNotEmpty(sql)) {
try {
new BaseDAO().executeUpdate(sql);
} catch (BusinessException e) {
// TODO: handle exception
errmsg = ("更新凭证分录[" + sql + "]出错:" + e.getMessage());
}
}
}
}
return errmsg;
}
// 调用拜特资金系统接口
private String pushBTData(String url, String send_data) {
// TODO Auto-generated method stub
Map<String, String> heads = new HashMap<String, String>();
String back = HttpClient.httpPostRaw(url, send_data, heads, "utf-8");
return back;
}
// 封装接口数据
private String getItfData(DetailVO[] vos) throws BusinessException {
// TODO Auto-generated method stub
JSONArray fileArr = new JSONArray();// 拼装后数据
for (DetailVO detail : vos) {
VoucherVO[] hvos = new VoucherQueryBO()
.queryByPks(new String[] { detail.getPk_voucher() });
if (hvos != null && hvos.length > 0) {
VoucherVO hvo = hvos[0];// 凭证主表
JSONObject filejson = new JSONObject();
filejson.put("ID", detail.getPrimaryKey());// 主键--凭证分录主键
filejson.put("VOUCHER_NO", hvo.getAttributeValue("num"));// 凭证号
filejson.put("CUR", "RMB");// 币种
filejson.put("TALLY_DATE", hvo.getPrepareddate().toStdString());// 记账日期--制单日期
// 获取银行账户
String bankaccount = getBank(detail);
filejson.put("COMP_ACC", bankaccount);// 银行账号
filejson.put("DEBIT_MONEY", detail.getLocaldebitamount()
.toString());// 借方发生额
filejson.put("CREDIT_MONEY", detail.getLocalcreditamount()
.toString());// 贷方发生额
if (detail.getLocalcreditamount().toDouble() < 0
|| detail.getLocaldebitamount().toDouble() < 0) {
// 如果贷方发生额 > O
filejson.put("REDBLUE_SIGN", "H");// 贷方发生额
} else {
filejson.put("REDBLUE_SIGN", "S");// 贷方发生额
}
filejson.put("SUMMARY_CONTENT", detail.getExplanation());// 摘要
filejson.put("fromSys", "NC");// 来源系统
fileArr.add(filejson);
} else {
throw new BusinessException("根据[" + detail.getPk_voucher()
+ "]获取凭证失败!");
}
}
return fileArr.toString();
}
// 获取银行账户
private String getBank(DetailVO detail) throws BusinessException {
// TODO Auto-generated method stub
String bankaccount = null;
// 获取辅助核算
FreeValueVO[] hsvos = (FreeValueVO[]) getHyPubBO().queryByCondition(
FreeValueVO.class, "nvl(dr,0) = 0 and freevalueid = '"+detail.getAssid()+"'");
if(hsvos == null || hsvos.length <= 0){
throw new BusinessException("根据["+detail.getAssid()+"]查询辅助核算异常!");
}
FreeValueVO hsvo = hsvos[0];
// 会计辅助核算项目VO
AccAssItemVO[] hsxmvo = (AccAssItemVO[]) getHyPubBO().queryByCondition(
AccAssItemVO.class, "nvl(dr,0) = 0 and name = '银行账户'");
String pk_accassitem = hsxmvo.length > 0 ? hsxmvo[0].getPrimaryKey()
: null;
if (StringUtils.isNotEmpty(pk_accassitem)) {
String pk_bankaccsub = null;
if (StringUtils.isNotEmpty(hsvo.getTypevalue1())
&& hsvo.getTypevalue1().indexOf(pk_accassitem) != -1) {
pk_bankaccsub = hsvo.getTypevalue1().substring(
hsvo.getTypevalue1().length() - 20,
hsvo.getTypevalue1().length());
}else if (StringUtils.isNotEmpty(hsvo.getTypevalue2())
&& hsvo.getTypevalue2().indexOf(pk_accassitem) != -1) {
pk_bankaccsub = hsvo.getTypevalue2().substring(
hsvo.getTypevalue2().length() - 20,
hsvo.getTypevalue2().length());
}
if(StringUtils.isNotEmpty(pk_bankaccsub)){
BankAccSubVO yhvo = (BankAccSubVO) getHyPubBO().queryByPrimaryKey(BankAccSubVO.class, pk_bankaccsub);
bankaccount = yhvo.getAccnum();// 账号
}else{
throw new BusinessException("获取银行账户失败!");
}
} else {
throw new BusinessException("获取会计辅助核算项目失败!");
}
return bankaccount;
}
// 拼装查询分录SQL
private DetailVO[] getDetailSql() throws SystemException, NamingException,
Exception {
// TODO Auto-generated method stub
StringBuffer mxsql = new StringBuffer();
mxsql.append("select pk_detail from gl_detail where ");
mxsql.append("nvl(dr,0) = 0 and pk_accasoa in ");
mxsql.append("(select distinct a.pk_accasoa from bd_account t, bd_accasoa a where t.pk_account = a.pk_account "
+ "and a.pk_accchart in ( '1001B11000000000CM4V' ) and t.code like '1002%') ");
mxsql.append(" and (free1 <> 'Y' or free1 is null)");
mxsql.append(" and pk_voucher in (select pk_voucher from gl_voucher where voucherkind<>2 and voucherkind<>255 and dr=0 )");
String[] pk_details = (String[]) new BaseDAO().executeQuery(
mxsql.toString(), new ResultSetProcessor() {
private static final long serialVersionUID = 1L;
public Object handleResultSet(ResultSet rs)
throws SQLException {
List<String> pklist = new LinkedList();
String pk = null;
while (rs.next()) {
pk = rs.getString("pk_detail");
pklist.add(pk);
}
return pklist.toArray(new String[0]);
}
});
DetailVO[] vos = new DetailDMO().findByPrimaryKeyArray(pk_details);
return vos;
}
// 保存日志
private String SaveBTLog(String pk_org, String pk_group,String rdtdata) throws BusinessException {
// TODO Auto-generated method stub
String mes = null;// 保存VO成功标识
BTLogVO vo = new BTLogVO();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
vo.setCreationtime(df.format(new Date()));// 创建时间
vo.setTransi_type("推送日记账");// 使用transi_type标记是交易结果接口
vo.setRtn_data(rdtdata);// 拜特返回数据
vo.setPk_org(pk_org);// 所属组织
vo.setPk_group(pk_group);// 所属集团
vo.setDr(0);
try {
getHyPubBO().insert(vo);
} catch (BusinessException e) {
// TODO: handle exception
return e.getMessage();
}
return mes;
}
// 获取日记账接口地址,通过自定义档案维护-集团,编码BTURL下的RJZURL行
private String getUrl() throws BusinessException {
String url = (String) getHyPubBO().findColValue("bd_defdoc", "name",
"nvl(dr,0) = 0 and code = 'RJZURL'");
return url;
}
// 判断是否JSONArray格式
private static boolean isJSONArray(String json) {
if (!("{}".equals(json) || (json.length() > 2 && json.charAt(0) == '{' && json
.charAt(json.length() - 1) == '}'))) {
try {
JSONArray jsonArray = JSONArray.parseArray(json);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
public static HYPubBO getHyPubBO() {
if (null == hyPubBO) {
hyPubBO = new HYPubBO();
}
return hyPubBO;
}
}
2、后台任务部署
位置:动态建模平台->客户化配置->后台任务不是。
说明:管理后台任务类型注册,配置相关参数及定时任务配置。
3、定时任务日志查看
位置:动态建模平台->系统管理->后台任务日志。
说明:所有定时任务任务可在此处查询,说明列为报错信息。