增量抽取泛微和建云的开票申请定时任务(要求记录翻译不成功的字段)
OAKpsqPlugin.java
package nc.bs.backgroundtasks;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Logger;
import nc.bs.pub.pa.PreAlertObject;
import nc.bs.pub.taskcenter.BgWorkingContext;
import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
import nc.itf.jygyl.IKpsqMaintain;
import nc.itf.uap.pf.IplatFormEntry;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.jdbc.framework.processor.MapProcessor;
import nc.vo.jych.kpsq.AggKpsqVO;
import nc.vo.jych.kpsq.KpsqBVO;
import nc.vo.jych.kpsq.KpsqVO;
import nc.vo.jych.kpsq.log.KpsqDataLogVO;
import nc.vo.jych.utils.SqlTool;
import nc.vo.jygyl.tool.ConnectionManager;
import nc.vo.jygyl.tool.NullValueUtils;
import nc.vo.jygyl.utils.SqlBuilder;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVO;
import nc.vo.pub.SuperVOUtil;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
import nc.vo.pubapp.AppContext;
public class OAKpsqPlugin implements IBackgroundWorkPlugin{
@Override
public PreAlertObject executeTask(BgWorkingContext arg0)
throws BusinessException {
//获取当前时间作为将要给数据库中间表更新的时间
String timeNow = new UFDateTime().toString();
//获取数据库中上次同步的时间作为接口查询开始时间
String latestTime = getLatestTime();
//如果数据库中没有时间就赋值一个比较早的时间做全量数据查询
if(latestTime == null || "".equals(latestTime)) {
latestTime = "2000-01-01 00:00:00";
}
//默认财务组织
Map<String, String> selOrg = selOrg("001");
//抽取泛微的开票申请
generateFwKpsq(selOrg,latestTime);
//抽取建云的开票申请
generateJyKpsq(selOrg,latestTime);
//更新当前同步的时间
updateTime(timeNow);
return null;
}
//抽取泛微的开票申请
private void generateFwKpsq(Map<String, String> selOrg,
String latestTime) throws BusinessException {
String sqlinfo = null; //将sql语句记录到日志表
StringBuffer errinfo=new StringBuffer(); //将没翻译出来的字段记录到日志表
String resultinfo = "执行成功"; //是否执行成功
try {
//封装statement对象
Connection conn;
Statement st;
String url = ConnectionManager.getInstances().getEnvInfo("fwoaurl");
String user = ConnectionManager.getInstances().getEnvInfo("fwoauser");
String password = ConnectionManager.getInstances().getEnvInfo("fwoapassword");
conn = ConnectionManager.getConnection(url, user,password);
st = conn.createStatement();
//通过statement对象执行抽取泛微开票申请的sql语句
String sqlname = SqlTool.kpsqHead(latestTime);
ResultSet rs = st.executeQuery(sqlname);
//将sql语句查出的数据封装成vo放到volist中
List<KpsqVO> volist = new ArrayList<KpsqVO>(); //表头vo
sqlinfo = sqlname;
Logger.error("sql-zhangjk" + sqlname);
while(rs.next()){
KpsqVO kpsqvo = new KpsqVO();
//单据类型
kpsqvo.setPk_billtype("KPSQ");
//交易类型编号
kpsqvo.setTranstypecode("KPSQ");
//标识符
kpsqvo.setDef1(rs.getString(1));
//单据日期
kpsqvo.setDbilldate(new UFDate());
kpsqvo.setSqdate(getUFDate(rs.getString(2)));
kpsqvo.setSsjg(NullValueUtils.getNullStringValue(rs.getString(3)));
kpsqvo.setSqr(NullValueUtils.getNullStringValue(rs.getString(4)));
kpsqvo.setSqdept(NullValueUtils.getNullStringValue(rs.getString(5)));
kpsqvo.setKjstatus(NullValueUtils.getNullStringValue(rs.getString(6)));
kpsqvo.setLcvbillno(NullValueUtils.getNullStringValue(rs.getString(7)));
kpsqvo.setDjckp(NullValueUtils.getIntegerNullValue(rs.getString(8)));
kpsqvo.setHtcode(NullValueUtils.getNullStringValue(rs.getString(9)));
kpsqvo.setPk_marketpro(NullValueUtils.getNullStringValue(rs.getString(10)));
kpsqvo.setPhone(NullValueUtils.getNullStringValue(rs.getString(11)));
kpsqvo.setAdress(NullValueUtils.getNullStringValue(rs.getString(12)));
kpsqvo.setKhyh(NullValueUtils.getNullStringValue(rs.getString(13)));
kpsqvo.setYhzh(NullValueUtils.getNullStringValue(rs.getString(14)));
kpsqvo.setLjykfp(NullValueUtils.getNullStringValue(rs.getString(15)));
kpsqvo.setSqtype(NullValueUtils.getNullStringValue(rs.getString(16)));
kpsqvo.setSktype(NullValueUtils.getNullStringValue(rs.getString(17)));
kpsqvo.setBckphshjxx(NullValueUtils.getNullUFdoubleValue(rs.getString(18)));
kpsqvo.setBckphshjdx(NullValueUtils.getNullStringValue(rs.getString(19)));
kpsqvo.setBckpbhs(NullValueUtils.getNullUFdoubleValue(rs.getString(20)));
kpsqvo.setPaid(NullValueUtils.getNullUFdoubleValue(rs.getString(21)));
//数据来源
kpsqvo.setSjly("泛微");
//制单人
kpsqvo.setCreator(AppContext.getInstance().getPkUser());
//创建时间
kpsqvo.setCreationtime(new UFDateTime());
//集团
kpsqvo.setPk_group(selOrg.get("pk_group"));
//组织
kpsqvo.setPk_org(selOrg.get("pk_org"));
kpsqvo.setPk_org_v(selOrg.get("pk_vid"));
kpsqvo.setStatus(VOStatus.NEW);
kpsqvo.setVbillstatus(-1);
volist.add(kpsqvo);
}
//exeheadmap用来记录表头有值待翻译的字段 eg:{5:[sqr,sqdept], 6:[htcode,pk_marketpro]}}
Map<String, List<String>> exeheadmap = new HashMap<>();
//封装exeheadmap
for(KpsqVO hvo : volist){
List<String> exeheadlist = new ArrayList<String>(); //记录表头需要翻译且有值的字段编码
for(int i=0;i<yfyzdbm.length;i++){
if(!NullValueUtils.getNullStringValue(hvo.getAttributeValue(yfyzdbm[i])).equals("")){
exeheadlist.add(yfyzdbm[i]);
}
}
if(exeheadlist.size() > 0){
exeheadmap.put(hvo.getDef1(), exeheadlist);
}
}
//翻译 volist
List<KpsqVO> trahvolist = translateHeadVO(volist);
//存储未翻译的错误信息
StringBuffer errors=new StringBuffer();
//需要翻译的表头字段 eg:{sqr:申请人, sqdept:申请部门}
Map<String, String> exeFieldsmap = getExeFieldsCode();
//封装errors
for(KpsqVO hvo : trahvolist){
//判断有值字段是否翻译成功
if(exeheadmap.containsKey(hvo.getDef1())){
List<String> list = exeheadmap.get(hvo.getDef1()); //有值的字段list
for (int j = 0; j < list.size(); j++) {
String string = list.get(j);
Object value = hvo.getAttributeValue(string); //判断有值的字段,翻译后时候还有值
if(value == null || value.equals("")){
errors.append("id:" + hvo.getDef1() + "的 " + exeFieldsmap.get(string) + "字段在系统中翻译不出来!");
}
}
}
}
if(errors.length()>0){
errinfo.append(errors+" ");
Logger.error("泛微开票申请同步:"+errors);
}
if(trahvolist != null && trahvolist.size() > 0){
List<AggKpsqVO> agglist = new ArrayList<AggKpsqVO>();
for (KpsqVO kpsqVO : trahvolist) {
AggKpsqVO aggvo = new AggKpsqVO();
String def1 = kpsqVO.getDef1();
aggvo.setParentVO(kpsqVO);
List<KpsqBVO> bvolist = new ArrayList<KpsqBVO>();
String sqlString = SqlTool.kpsqBody(latestTime, def1);
ResultSet bv = st.executeQuery(sqlString);
int i = 1;
while(bv.next()){
KpsqBVO bvo = new KpsqBVO();
bvo.setRowno(i+"0");
i++;
bvo.setSsflcode(NullValueUtils.getNullStringValue(bv.getString(3)));
bvo.setHwhyslwfwmc(NullValueUtils.getNullStringValue(bv.getString(4)));
bvo.setSqtype(NullValueUtils.getNullStringValue(bv.getString(5)));
bvo.setFpdm(NullValueUtils.getNullStringValue(bv.getString(6)));
bvo.setFphm(NullValueUtils.getNullStringValue(bv.getString(7)));
bvo.setGgxh(NullValueUtils.getNullStringValue(bv.getString(8)));
bvo.setDw(NullValueUtils.getNullStringValue(bv.getString(9)));
bvo.setMnu(NullValueUtils.getNullUFdoubleValue(bv.getString(10)));
bvo.setPrice(NullValueUtils.getNullUFdoubleValue(bv.getString(11)));
bvo.setFpmnyhs(NullValueUtils.getNullUFdoubleValue(bv.getString(12)));
bvo.setSl(NullValueUtils.getNullStringValue(bv.getString(13)));
bvo.setPaid(NullValueUtils.getNullUFdoubleValue(bv.getString(14)));
bvo.setIsrz(NullValueUtils.getNullStringValue(bv.getString(15)));
bvo.setBhsmny(NullValueUtils.getNullUFdoubleValue(bv.getString(16)));
bvo.setStatus(VOStatus.NEW);
bvolist.add(bvo);
}
if(bvolist != null && bvolist.size() > 0){
aggvo.setChildrenVO(bvolist.toArray(new KpsqBVO[bvolist.size()]));
}
agglist.add(aggvo);
}
for (AggKpsqVO aggvo : agglist) {
saveAggKpsqVO(aggvo);
}
}
} catch (Exception e) {
resultinfo = "执行失败:"+ e.getMessage() +"";
throw new BusinessException("执行失败:"+ e.getMessage());
}finally{
KpsqDataLogVO vo = new KpsqDataLogVO();
vo.setDatatype("泛微开票申请");
vo.setBilldate(new UFDate());
vo.setSqlinfo(sqlinfo);
vo.setErrinfo(errinfo.toString());
vo.setResultinfo(resultinfo);
NCLocator.getInstance().lookup(IKpsqMaintain.class).insert_RequiresNew(vo);
ConnectionManager.closeConnection();
}
}
//抽取建云的开票申请
private void generateJyKpsq(Map<String, String> selOrg,
String latestTime) throws BusinessException {
String sqlinfo = null;
StringBuffer errinfo=new StringBuffer();
String resultinfo = "执行成功";
try {
//封装statement对象
Connection conn;
Statement st;
String url = ConnectionManager.getInstances().getEnvInfo("jyoaurl");
String user = ConnectionManager.getInstances().getEnvInfo("jyoauser");
String password = ConnectionManager.getInstances().getEnvInfo("jyoapassword");
conn = ConnectionManager.getConnection(url, user,password);
st = conn.createStatement();
//通过statement对象执行抽取建云开票申请的sql语句
String sqlname = SqlTool.kpsq(latestTime);
ResultSet rs = st.executeQuery(sqlname);
List<KpsqVO> volist = new ArrayList<KpsqVO>(); //表头vo
sqlinfo = sqlname;
while(rs.next()){
KpsqVO kpsqvo = new KpsqVO();
//单据类型
kpsqvo.setPk_billtype("KPSQ");
//交易类型编号
kpsqvo.setTranstypecode("KPSQ");
//标识符
kpsqvo.setDef1(rs.getString(1));
//单据日期
kpsqvo.setDbilldate(new UFDate());
kpsqvo.setSqdate(getUFDate(rs.getString(2)));
kpsqvo.setSsjg(NullValueUtils.getNullStringValue(rs.getString(3)));
kpsqvo.setSqr(NullValueUtils.getNullStringValue(rs.getString(4)));
kpsqvo.setSqdept(NullValueUtils.getNullStringValue(rs.getString(5)));
kpsqvo.setKjstatus(NullValueUtils.getNullStringValue(rs.getString(6)));
kpsqvo.setLcvbillno(NullValueUtils.getNullStringValue(rs.getString(7)));
kpsqvo.setDjckp(NullValueUtils.getIntegerNullValue(rs.getString(8)));
kpsqvo.setHtcode(NullValueUtils.getNullStringValue(rs.getString(9)));
kpsqvo.setPk_marketpro(NullValueUtils.getNullStringValue(rs.getString(10)));
kpsqvo.setPhone(NullValueUtils.getNullStringValue(rs.getString(11)));
kpsqvo.setAdress(NullValueUtils.getNullStringValue(rs.getString(12)));
kpsqvo.setKhyh(NullValueUtils.getNullStringValue(rs.getString(13)));
kpsqvo.setYhzh(NullValueUtils.getNullStringValue(rs.getString(14)));
kpsqvo.setLjykfp(NullValueUtils.getNullStringValue(rs.getString(15)));
kpsqvo.setSqtype(NullValueUtils.getNullStringValue(rs.getString(16)));
kpsqvo.setSktype(NullValueUtils.getNullStringValue(rs.getString(17)));
kpsqvo.setBckphshjxx(NullValueUtils.getNullUFdoubleValue(rs.getString(18)));
kpsqvo.setBckphshjdx(NullValueUtils.getNullStringValue(rs.getString(19)));
kpsqvo.setBckpbhs(NullValueUtils.getNullUFdoubleValue(rs.getString(20)));
kpsqvo.setPaid(NullValueUtils.getNullUFdoubleValue(rs.getString(21)));
//数据来源
kpsqvo.setSjly("建云");
//制单人
kpsqvo.setCreator(AppContext.getInstance().getPkUser());
//创建时间
kpsqvo.setCreationtime(new UFDateTime());
//集团
kpsqvo.setPk_group(selOrg.get("pk_group"));
//组织
kpsqvo.setPk_org(selOrg.get("pk_org"));
kpsqvo.setPk_org_v(selOrg.get("pk_vid"));
kpsqvo.setStatus(VOStatus.NEW);
kpsqvo.setVbillstatus(-1);
volist.add(kpsqvo);
}
//exeheadmap用来记录表头有值待翻译的字段 eg:{5:[sqr,sqdept], 6:[htcode,pk_marketpro]}}
Map<String, List<String>> exeheadmap = new HashMap<>();
//封装exeheadmap
for(KpsqVO hvo : volist){
List<String> exeheadlist = new ArrayList<String>(); //记录表头需要翻译且有值的字段编码
for(int i=0;i<yfyzdbm.length;i++){
if(!NullValueUtils.getNullStringValue(hvo.getAttributeValue(yfyzdbm[i])).equals("")){
exeheadlist.add(yfyzdbm[i]);
}
}
if(exeheadlist.size() > 0){
exeheadmap.put(hvo.getDef1(), exeheadlist);
}
}
//翻译 volist
List<KpsqVO> trahvolist = translateHeadVO(volist);
//存储未翻译的错误信息
StringBuffer errors=new StringBuffer();
//需要翻译的表头字段 eg:{sqr:申请人, sqdept:申请部门}
Map<String, String> exeFieldsmap = getExeFieldsCode();
//封装errors
for(KpsqVO hvo : trahvolist){
//判断有值字段是否翻译成功
if(exeheadmap.containsKey(hvo.getDef1())){
List<String> list = exeheadmap.get(hvo.getDef1()); //有值的字段list
for (int j = 0; j < list.size(); j++) {
String string = list.get(j);
Object value = hvo.getAttributeValue(string); //判断有值的字段,翻译后时候还有值
if(value == null || value.equals("")){
errors.append("autoid:" + hvo.getDef1() + "的 " + exeFieldsmap.get(string) + "字段在系统中翻译不出来!");
}
}
}
}
if(errors.length()>0){
errinfo.append(errors+" ");
Logger.error("建云开票申请同步:"+errors);
}
if(trahvolist != null && trahvolist.size() > 0){
List<AggKpsqVO> agglist = new ArrayList<AggKpsqVO>();
for (KpsqVO kpsqVO : trahvolist) {
AggKpsqVO aggvo = new AggKpsqVO();
aggvo.setParentVO(kpsqVO);
agglist.add(aggvo);
}
for (AggKpsqVO aggvo : agglist) {
saveAggKpsqVO(aggvo);
}
}
} catch (Exception e) {
resultinfo = "执行失败:"+ e.getMessage() +"";
throw new BusinessException("执行失败:"+ e.getMessage());
} finally {
KpsqDataLogVO vo = new KpsqDataLogVO();
vo.setDatatype("建云开票申请");
vo.setBilldate(new UFDate());
vo.setSqlinfo(sqlinfo);
vo.setErrinfo(errinfo.toString());
vo.setResultinfo(resultinfo);
NCLocator.getInstance().lookup(IKpsqMaintain.class).insert_RequiresNew(vo);
ConnectionManager.closeConnection();
}
}
/**
* 执行动作脚本
* @param vo
* @param actionCode
* @param billtype
* @throws BusinessException
*/
protected void doAction(AggregatedValueObject aggvo,String actionCode,String billtype) throws BusinessException{
IplatFormEntry platform = NCLocator.getInstance().lookup(IplatFormEntry.class);
platform.processAction(actionCode,billtype, null, aggvo, null, null);
}
/**
* 执行动作脚本
* @param vo
* @param actionCode
* @param billtype
* @throws BusinessException
*/
protected AggregatedValueObject doActionResult(AggregatedValueObject aggvo,String actionCode,String billtype) throws BusinessException{
IplatFormEntry platform = NCLocator.getInstance().lookup(IplatFormEntry.class);
AggregatedValueObject[] resultvos = (AggregatedValueObject[]) platform.processAction(actionCode,billtype, null, aggvo, null, null);
return resultvos[0];
}
private void saveAggKpsqVO(AggKpsqVO aggvo) throws BusinessException {
//执行保存
AggKpsqVO aftersaveaggvo = (AggKpsqVO) doActionResult(aggvo, "SAVEBASE", "KPSQ");
//执行提交
AggKpsqVO aftercommitaggvo = (AggKpsqVO) doActionResult(aftersaveaggvo, "SAVE", "KPSQ");
//执行审批
doAction(aftercommitaggvo, "APPROVE", "KPSQ");
}
//默认财务组织
@SuppressWarnings("unchecked")
public Map<String, String> selOrg(String value) throws BusinessException{
String sql = "select pk_org,pk_vid,pk_group from org_orgs where dr=0 and code='"+value+"' and isnull(dr,0) = 0";
Map<String, String> orgmap = (Map<String, String>) getDao().executeQuery(sql, new MapProcessor());
if(orgmap == null || orgmap.size() < 1){
new BusinessException("组织不存在!");
}
return orgmap;
}
//UFDate类型处理
public UFDate getUFDate(Object obj){
if(obj == null || "".equals(obj.toString())){
return null;
}else{
if(obj.toString().length() == 10){
return new UFDate(obj.toString());
}else{
return new UFDate(obj.toString().substring(0, 19));
}
}
}
//泛微表头翻译
private List<KpsqVO> translateHeadVO(List<KpsqVO> volist) {
SuperVOUtil.execFormulaWithVOs((SuperVO[]) volist.toArray(new KpsqVO[0]),new String[] {
// 申请人
"sqr->getColValue2(bd_psndoc,pk_psndoc,name,sqr,dr,0)",
// 项目申报部门
"sqdept->getColValue2(org_dept,pk_dept,name,sqdept,dr,0)",
// 合同编号
"htcode->getColValue2(jych_xshtdj,pk_xshtdj,htcode,htcode,dr,0)",
// 项目编码
"pk_marketpro->getColValue2(bd_project,pk_project,project_code,pk_marketpro,dr,0)",
// 甲方
"parta->getcolvalue2(bd_customer,pk_customer,name,parta,dr,0)",
// 本次开票含税合计(大写)
"bckphshjdx->getchinesecurrency(bckphshjxx)"
});
return volist;
}
//要翻译的字段编码
String[] yfyzdbm = {"sqr","sqdept","htcode","pk_marketpro","parta"};
//需要记录的表头字段
public Map<String, String> getExeFieldsCode() {
Map<String, String> exehead = new HashMap<>();
exehead.put("sqr", "申请人");
exehead.put("sqdept", "申请部门");
exehead.put("htcode", "合同编码");
exehead.put("pk_marketpro", "项目编码");
exehead.put("parta", "甲方");
return exehead;
}
//将中间表的最新同步时间更新为当前时间
private void updateTime(String timeNow) throws BusinessException {
SqlBuilder sql = new SqlBuilder();
sql.append("update tb_latesttime set latest_time = '"+timeNow+"' ");
sql.append(" where type = 'KPSQ' and isnull(dr,0) = 0");
getDao().executeUpdate(sql.toString());
}
//从中间表获取最新的同步时间
private String getLatestTime() throws BusinessException {
SqlBuilder sql = new SqlBuilder();
sql.append("select latest_time from tb_latesttime where type = 'KPSQ' ");
sql.append(" and isnull(dr,0) = 0 ");
String latestTime = (String)getDao().executeQuery(sql.toString(), new ColumnProcessor());
return latestTime;
}
private BaseDAO dao;
private BaseDAO getDao(){
if(dao == null){
dao = new BaseDAO();
}
return dao;
}
}
KpsqDataLogVO.java
package nc.vo.jych.kpsq.log;
import nc.vo.pub.SuperVO;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
public class KpsqDataLogVO extends SuperVO {
private static final long serialVersionUID = 1L;
public String pk_kpsqdatalog;
public UFDate billdate;
public String datatype;
public String sqlinfo;
public String errinfo;
public String resultinfo;
public UFDateTime ts;
public String getPk_kpsqdatalog() {
return pk_kpsqdatalog;
}
public void setPk_kpsqdatalog(String pk_kpsqdatalog) {
this.pk_kpsqdatalog = pk_kpsqdatalog;
}
public UFDate getBilldate() {
return billdate;
}
public void setBilldate(UFDate billdate) {
this.billdate = billdate;
}
public String getDatatype() {
return datatype;
}
public void setDatatype(String datatype) {
this.datatype = datatype;
}
public String getSqlinfo() {
return sqlinfo;
}
public void setSqlinfo(String sqlinfo) {
this.sqlinfo = sqlinfo;
}
public String getErrinfo() {
return errinfo;
}
public void setErrinfo(String errinfo) {
this.errinfo = errinfo;
}
public String getResultinfo() {
return resultinfo;
}
public void setResultinfo(String resultinfo) {
this.resultinfo = resultinfo;
}
public UFDateTime getTs() {
return ts;
}
public void setTs(UFDateTime ts) {
this.ts = ts;
}
@Override
public String getTableName() {
// TODO Auto-generated method stub
return "zk_kpsqdatalog";
}
@Override
public String getPKFieldName() {
// TODO Auto-generated method stub
return "pk_kpsqdatalog";
}
/**
* 建表语句
* @author zjk
create table zk_kpsqdatalog
(
pk_kpsqdatalog varchar(50) primary key,
billdate CHAR(19) NOT NULL,
datatype varchar(300) default '~',
sqlinfo varchar(max) null,
errinfo varchar(max) null,
resultinfo varchar(2000) null,
ts CHAR(19) default GETDATE(),
dr smallint default 0
);
*/
}