780 lines
30 KiB
Java
780 lines
30 KiB
Java
package com.tenwa.leasing.serviceImpl.voucher;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.util.ArrayList;
|
||
import java.util.HashMap;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
import jbo.app.CUSTOMER_INFO;
|
||
import jbo.app.VOUCHERASSSTACTS_INFO;
|
||
import jbo.app.VOUCHERASS_STACTS_CONFIG;
|
||
import jbo.app.VOUCHER_CONNECTION;
|
||
import jbo.app.VOUCHER_V8;
|
||
import jbo.com.tenwa.app.entity.ownInfo.OWN_ACCOUNT;
|
||
import jbo.com.tenwa.app.entity.ownInfo.OWN_INFO;
|
||
import jbo.com.tenwa.entity.contract.CONTRACT_INFO;
|
||
import jbo.com.tenwa.entity.contract.CONTRACT_SIGNATORY;
|
||
import jbo.com.tenwa.entity.contract.CONTRACT_SUPPLIER_INFO;
|
||
import jbo.com.tenwa.entity.project.PROJ_INFO;
|
||
import jbo.sys.ORG_INFO;
|
||
import jbo.sys.USER_INFO;
|
||
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
|
||
import com.amarsoft.app.als.sys.tools.JBOHelper;
|
||
import com.amarsoft.are.ARE;
|
||
import com.amarsoft.are.jbo.BizObject;
|
||
import com.amarsoft.are.jbo.BizObjectManager;
|
||
import com.amarsoft.are.jbo.JBOFactory;
|
||
import com.amarsoft.are.jbo.JBOTransaction;
|
||
import com.amarsoft.are.log.Log;
|
||
import com.amarsoft.dict.als.manage.NameManager;
|
||
import com.tenwa.flow.util.DataOperatorUtil;
|
||
import com.tenwa.leasing.service.voucher.IntereasVoucherheadService;
|
||
import com.tenwa.leasing.service.voucher.VoucherToV8Service;
|
||
import com.tenwa.reckon.util.DateUtils;
|
||
import com.tenwa.reckon.util.MoneyUtils;
|
||
import com.tenwa.reckon.util.NumberUtils;
|
||
import com.tenwa.reckon.util.Tools;
|
||
|
||
/**
|
||
*
|
||
* <p>。</p>
|
||
* <p>2014-3-20</p>
|
||
* @author sea
|
||
* @version 4.5
|
||
*/
|
||
public class VoucherToV8Impl implements VoucherToV8Service {
|
||
|
||
/**
|
||
* log4j日志
|
||
*/
|
||
//private static final Logger log = LoggerFactory.getLogger(VoucherToV8Impl.class);
|
||
|
||
/**
|
||
* ARE日志
|
||
*/
|
||
private static Log log=ARE.getLog();
|
||
|
||
|
||
/**
|
||
* 注入凭证头服务接口
|
||
*/
|
||
private IntereasVoucherheadService intereasVoucherheadService=new IntereasVoucherheadServiceImpl();
|
||
/**
|
||
* 网银凭证情况下的使用的条件参考变量
|
||
*/
|
||
private static final String moduleName_value = "网银导入";
|
||
|
||
/**
|
||
* 欧力士特殊生成凭证模块
|
||
* 因根据合同号都会把凭证归属在合同对应所属公司下,这样不满足欧力士现业务需求
|
||
*/
|
||
private static final String SPECIAL_MODULENAME = "代收深圳款";
|
||
|
||
/**
|
||
* FIXME SEA 代收租金 判断与网银规则一致,科目主表加废弃字段,字表也加废弃字段,下方随之加对应的判断
|
||
* <p>V8凭证数据入库。</p>
|
||
* @author sea
|
||
* @param headMap
|
||
* headMap参数集合传入的数据目前存在:
|
||
* 参数1:合同号/contract_id (合同表UUID,用于取凭证所属,合同信息等数据)
|
||
* 参数2:业务模块/modleName (例如:已开票增值税发票回导流程/网银核销流程/租金实收流程...等等)
|
||
* Map<String,String> map1 = new HashMap<String, String>();
|
||
* map1.put("contract_id", "合同号");
|
||
* map1.put("moduleName", "业务模块");
|
||
* map1.put("accNumber", "本方银行账号编码");//网银凭证产生情况下,该字段必填 ,同时请务必把前一个参数‘moduleName’置为‘网银导入’。
|
||
* map1.put("oldContractid", "老合同转新合同情况下老合同号");
|
||
* @param vouchersMap
|
||
* 参数二集合传入的数据是一个list集合,里面是一个个的map集合,一个map封装一个凭证分录
|
||
* 参数1:摘要/F5
|
||
* 参数2:科目序号/F6 VOUCHERASS_STACTS_CONFIG表的ID
|
||
* 参数3:借方金额/F7 原币金额 贷方金额为0
|
||
* 参数4:贷方金额 /F8 原币金额 借方金额为0
|
||
* 参数5:业务日期(到账日期)/F15 网银到账日期 TODO 在CreateVoucherServiceImpl增加业务日期,在实际投放增加供应商编码
|
||
* 参数6:供应商编码/F19 供应商编码
|
||
* 参数7:会计记账日期/F1 (产生凭证的地方存在会计日期则必须传入该日期,不存在可不传)。
|
||
* (会计记账日期传入为空清下:取值通过函数getAccountDay传入F15业务日期获取,已提供公用查询接口getBookDate)
|
||
* List<Map<String,String>> list = new ArrayList<Map<String,String>>();
|
||
* Map<String,String> map2 = new HashMap<String, String>();
|
||
* map2.put("F5", "摘要");
|
||
* map2.put("F6", "科目序号");
|
||
* map2.put("F7", "借方金额");
|
||
* map2.put("F8", "贷方金额");
|
||
* map2.put("F15", "到账日期");
|
||
* map2.put("F19", "供应商编码");
|
||
* map2.put("F1", "会计记账日期");
|
||
* list.add(map2);
|
||
* @param user 参数三 当前用户登录信息
|
||
* @return
|
||
* @throws Exception
|
||
* @throws Exception
|
||
* @throws Exception
|
||
* @throws DataAccessException
|
||
*/
|
||
public String saveV8Message(Map<String,String> headMap,List<Map<String,String>> list,BizObject user,JBOTransaction tx) throws Exception{
|
||
//财务要求统一为用户:林萌叶
|
||
user = JBOHelper.querySingle(USER_INFO.CLASS_NAME, "select * from O where o.userid=:userid", "80002U00000013");
|
||
String v8Str = "";
|
||
try {
|
||
String message = "";
|
||
//当前登录人对象获取
|
||
String creator = user.getAttribute("userid").toString();//制单人,当前登录人对象
|
||
String status = "已完整";//凭证状态
|
||
String eas_flag = "0";//导入财务系统状态 默认0
|
||
String moduleName = headMap.get("moduleName") ;
|
||
String contract_id = headMap.get("contract_id");
|
||
String collectInfo = headMap.get("collectInfo");
|
||
String incomeType = headMap.get("incomeType");
|
||
String voucherType = headMap.get("voucherType");
|
||
String loan_contract_id = headMap.get("loan_contract_id");
|
||
String bill_id = headMap.get("bill_id");
|
||
String accured_month = headMap.get("accured_month");
|
||
String cont_id = null;//合同编号(==contract_info表中的contract_id而不是id)
|
||
String proj_id = null;//合同中的项目id
|
||
//String cont_num = null;//业务合同编号
|
||
//String proj_name = null;//项目名称
|
||
//网银导入、代收租金 的凭证不需要合同号
|
||
if(!moduleName_value.equals(moduleName) && !SPECIAL_MODULENAME.equals(moduleName) && Tools.isNullOrEmpty(contract_id)&&!"costSharing".equals(voucherType)){
|
||
log.error("合同号为空,无法构建对应的凭证信息!");
|
||
return null;
|
||
}
|
||
|
||
String accNumber = headMap.get("accNumber");//网银编号
|
||
if( (moduleName_value.equals(moduleName) || SPECIAL_MODULENAME.equals(moduleName) ) && Tools.isNullOrEmpty(accNumber)){
|
||
log.error("本方银行账号为空,无法构建对应的凭证信息!");
|
||
return null;
|
||
}
|
||
//所属公司,目前项目只有一个
|
||
|
||
|
||
|
||
Map<String,String> condtion=new HashMap<String, String>();
|
||
condtion.put("contract_id", contract_id);
|
||
BizObject sign=null;
|
||
if(!"costSharing".equals(voucherType)){
|
||
sign = DataOperatorUtil.getSingleJBO(CONTRACT_SIGNATORY.CLASS_NAME, condtion, tx);
|
||
}else if("costSharing".equals(voucherType)){
|
||
condtion.clear();
|
||
condtion.put("contract_id", list.get(0).get("contract_id"));
|
||
sign = DataOperatorUtil.getSingleJBO(CONTRACT_SIGNATORY.CLASS_NAME, condtion, tx);
|
||
}
|
||
condtion.clear();
|
||
if(sign==null){
|
||
condtion.put("OWN_NAME", "横琴金投国际融资租赁有限公司");
|
||
}else{
|
||
condtion.put("OWN_NAME", sign.getAttribute("lessor").toString());
|
||
}
|
||
BizObject own =DataOperatorUtil.getSingleJBO(OWN_INFO.CLASS_NAME, condtion, tx);
|
||
BizObject projDept = null;
|
||
BizObject contractInfo = null;//合同基本信息表
|
||
BizObject oldcontractinfo = null;//老合同转新合同时,老合同对应信息
|
||
|
||
if(!Tools.isNullOrEmpty(headMap.get("oldContractid"))){
|
||
condtion.clear();
|
||
condtion.put("id", headMap.get("oldContractid"));
|
||
oldcontractinfo =DataOperatorUtil.getSingleJBO(CONTRACT_INFO.CLASS_NAME, condtion, tx);
|
||
}
|
||
|
||
//网银、代收租金情况下不存在合同相关信息
|
||
if(!moduleName_value.equals(moduleName) && !SPECIAL_MODULENAME.equals(moduleName)){
|
||
if(!"costSharing".equals(voucherType)){
|
||
|
||
condtion.clear();
|
||
condtion.put("id", contract_id);
|
||
contractInfo =DataOperatorUtil.getSingleJBO(CONTRACT_INFO.CLASS_NAME, condtion, tx);
|
||
cont_id = contractInfo.getAttribute("contract_id").getString();
|
||
proj_id = contractInfo.getAttribute("proj_id").toString();
|
||
if(Tools.isNullOrEmpty(contractInfo.getAttribute("id"))){
|
||
message = message + "合同信息为空!";
|
||
status = "未完整";//凭证状态
|
||
}
|
||
//项目出单部门
|
||
|
||
condtion.clear();
|
||
condtion.put("orgid", contractInfo.getAttribute("proj_dept").toString());
|
||
projDept =DataOperatorUtil.getSingleJBO(ORG_INFO.CLASS_NAME, condtion, tx) ;
|
||
//合同其他信息表 包含签约信息
|
||
//ContractOtherInfo contractOtherInfo = contractInfo.getContractOtherInfo();
|
||
//字段三四 凭证所属公司编码及其名称
|
||
// dict = contractOtherInfo.getContractBelong();
|
||
// if(dict == null && ( !moduleName_value.equals(moduleName) || !SPECIAL_MODULENAME.equals(moduleName) ) ){
|
||
// message = message + "所属公司编码为空!";
|
||
// status = "未完整";//凭证状态
|
||
// }
|
||
//一个合同对应多个租赁物件信息
|
||
//Set<ContractEquip> contractEquips = contractInfo.getContractEquips();
|
||
//合同对应客户信息
|
||
//CustInfo custInfo = contractInfo.getCustId();
|
||
}
|
||
}else{
|
||
//根据网银编号去查询(OWN_ACCOUNT)归属ACCOWNER及科目序号accSubject
|
||
condtion.clear();
|
||
condtion.put("accNumber", accNumber);
|
||
BizObject ownAccount =DataOperatorUtil.getSingleJBO(OWN_ACCOUNT.CLASS_NAME, condtion, tx) ;
|
||
//构建网银本方账号对应的归属的数据字典对象
|
||
//dict = ownAccount.getAccowner();
|
||
}
|
||
|
||
String F2 = "记";
|
||
//获取凭证号
|
||
String F3 = intereasVoucherheadService.getVoucherNumber(tx);
|
||
|
||
//成本均摊-利息,手续费,均摊比例
|
||
String F26 = null;
|
||
String F27 = null;
|
||
String F28 = null;
|
||
//成本均摊-借款合同号,借款借据号,计提月份
|
||
String F29 = null;
|
||
String F30 = null;
|
||
String F31 = null;
|
||
//F4 附单据数为空
|
||
List<BizObject> v8Vouchers = new ArrayList<BizObject>();
|
||
Double f7 = 0.00;//借方金额 原币金额 贷就为0
|
||
//Double f8 = 0.00;//贷方金额 原币金额 借就为0
|
||
Integer entryDC = 0;//1 借方-1 贷方
|
||
//
|
||
BigDecimal F7Count = BigDecimal.ZERO;//借方金额总计
|
||
BigDecimal F8Count = BigDecimal.ZERO;//贷方金额总计
|
||
|
||
Boolean is_CashInBank = false;//凭证分录是否含有银行存款科目,有就要带出现金流量,
|
||
Boolean is_CashFlow = false;//是否含现金流量
|
||
//循环是否含银行存款科目
|
||
for (int i = 0; i < list.size(); i++) {
|
||
if("cash_in_bank".equals(list.get(i).get("F6"))){
|
||
is_CashInBank = true;
|
||
}
|
||
}
|
||
|
||
BizObjectManager bm=JBOFactory.getFactory().getManager(VOUCHER_V8.CLASS_NAME);
|
||
for (int i = 0; i < list.size(); i++) {
|
||
//成本均摊
|
||
if("costSharing".equals(voucherType)){
|
||
contract_id = list.get(i).get("contract_id");
|
||
F26 = list.get(i).get("F26");
|
||
F27 = list.get(i).get("F27");
|
||
F28 = list.get(i).get("F28");
|
||
F29 = loan_contract_id;//借款合同号
|
||
F30 = bill_id;//借款借据号
|
||
F31 = accured_month;//计提月份
|
||
condtion.clear();
|
||
condtion.put("id", contract_id);
|
||
contractInfo =DataOperatorUtil.getSingleJBO(CONTRACT_INFO.CLASS_NAME, condtion, tx);
|
||
cont_id = contractInfo.getAttribute("contract_id").getString();
|
||
proj_id = contractInfo.getAttribute("proj_id").toString();
|
||
if(Tools.isNullOrEmpty(contractInfo.getAttribute("id"))){
|
||
message = message + "合同信息为空!";
|
||
status = "未完整";//凭证状态
|
||
}
|
||
//项目出单部门
|
||
condtion.clear();
|
||
condtion.put("orgid", contractInfo.getAttribute("proj_dept").toString());
|
||
projDept =DataOperatorUtil.getSingleJBO(ORG_INFO.CLASS_NAME, condtion, tx) ;
|
||
}
|
||
|
||
|
||
|
||
Map<String,String> map2 = list.get(i);
|
||
//会计记账日期
|
||
//String F1 = Tools.getDBDateStr( map2.get("F1") ); //2014-11-28: Tools.getDBDateStr("2014-9-19")返回""。因为函数内调用date.substring(0, 10)时抛出下标越界异常
|
||
String F1 = DateUtils.date2Str(map2.get("F1"));
|
||
|
||
//摘要
|
||
String F5 = map2.get("F5") ;
|
||
//科目编号
|
||
String F6 = Tools.getStr( map2.get("F6") );//这时取出的是科目序号
|
||
if(Tools.isNullOrEmpty(F6)){
|
||
message = message + "科目序号为空!";
|
||
status = "未完整";//凭证状态
|
||
}
|
||
BizObject config = this.seachConfig(F6,tx);
|
||
if(Tools.isNullOrEmpty(config.getAttribute("id"))){
|
||
message = message + "科目相关信息获取失败!";
|
||
status = "未完整";//凭证状态
|
||
}
|
||
F6 = config.getAttribute("SUBJECTS_CODE").toString();//科目编号
|
||
|
||
|
||
BigDecimal F7 =new BigDecimal(MoneyUtils.getZeroStr( map2.get("F7")));//借方金额/F7 原币金额 贷方金额为0
|
||
F7Count = F7Count.add(F7);
|
||
BigDecimal F8 =new BigDecimal(MoneyUtils.getZeroStr( map2.get("F8") ));//贷方金额/F8 原币金额 借方金额为0
|
||
F8Count = F8Count.add(F8);
|
||
|
||
f7 = NumberUtils.parseDouble( MoneyUtils.getZeroStr( String.valueOf( F7 ) ) );//借方金额
|
||
//f8 = NumberUtils.parseDouble( MoneyUtils.getZeroStr( String.valueOf( F8 ) ) );//贷方金额
|
||
//如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
|
||
if(NumberUtils.compareTo(f7, 0.00) != 0){//借方金额 不等于0.00 该条分录是 借
|
||
entryDC = 1;//1 借方 -1 贷方
|
||
}else{//贷
|
||
entryDC = -1;//1 借方 -1 贷方
|
||
}
|
||
|
||
String F54 = null;//现金流量项目
|
||
String F55 = null;//现金流量借方金额
|
||
String F56 = null;//现金流量贷方金额
|
||
String subjects_name = null;//科目配置名称
|
||
subjects_name = config.getAttribute("subjects_name").toString();
|
||
if(!"银行存款".equals(subjects_name)){
|
||
|
||
if(is_CashInBank){
|
||
//收手续费,租金,残值--01
|
||
if(("收款".equals(moduleName)&&"手续费".equals(collectInfo))||
|
||
("租金回笼".equals(moduleName)&&"租金".equals(incomeType))){
|
||
F54 = "01";
|
||
is_CashFlow = true;
|
||
}
|
||
//收保证金、罚息--03
|
||
if(("收款".equals(moduleName)&&"保证金".equals(collectInfo))||
|
||
("租金回笼".equals(moduleName)&&"罚息".equals(incomeType))){
|
||
F54 = "03";
|
||
is_CashFlow = true;
|
||
}
|
||
//收租赁设备款--04
|
||
if("实际投放".equals(moduleName)){
|
||
F54 = "04";
|
||
is_CashFlow = true;
|
||
}
|
||
|
||
if(is_CashFlow){
|
||
if(entryDC==1){
|
||
F55 = F7.toString();
|
||
F56 = "0.00";
|
||
}
|
||
if(entryDC==-1){
|
||
F56 = F8.toString();
|
||
F55 = "0.00";
|
||
}
|
||
}
|
||
}
|
||
}
|
||
is_CashFlow = false;
|
||
|
||
|
||
Integer F9 = 0;
|
||
String F10 = "0";
|
||
//F11 为空
|
||
String F12 = user.getAttribute("username").toString();//制单人
|
||
//F13 F14 2个 为空 F15为业务日期;
|
||
String F15 = map2.get("F15");//F1;
|
||
if(F15==null || "".equals(F15))F15 = F1;//业务日期等于空,则取会计处理日
|
||
//会计期间-年 以下2个变量都是
|
||
String periodYear = "";
|
||
String F51 = "";
|
||
//会计期间-月
|
||
String F52 = "";
|
||
|
||
//自定义会计记账日为空前提下
|
||
/**
|
||
* 2014-09-10 会计处理日原则变更处理如下
|
||
* 前端传入的会计处理日为空,则根据业务日期及关帐日函数去处理
|
||
* 前端传入的会计处理日不为空,则根据会计处理日及关帐日函数取处理
|
||
*/
|
||
if(Tools.isNullOrEmpty(F1)){
|
||
//根据业务操作日期查询会计记账日
|
||
F1 = intereasVoucherheadService.getBookDate(F15,tx);
|
||
}else{
|
||
F1 = intereasVoucherheadService.getBookDate(F1,tx);
|
||
}
|
||
|
||
if(Tools.isNullOrEmpty(F1)){
|
||
log.error("财务记账日期获取失败!");
|
||
message = message + "财务记账日期获取失败!";
|
||
status = "未完整";//凭证状态
|
||
}else{
|
||
periodYear = F1.substring(0,4);//会计期间-年
|
||
F51 = F1.substring(0,4);//会计期间-年
|
||
F52 = F1.substring(5,7);//会计期间-月
|
||
}
|
||
|
||
//按部门辅助核算时带入部门编码,根据科目去科目子表查询是否存在部门类型的辅助核算,存在数据则去取合同的部门编号
|
||
String F16 = null;
|
||
String F63 = null;
|
||
//按供应商辅助核算时带入供应商名称 与上方一致
|
||
String F19 = null;
|
||
String F66 = null;
|
||
//F22-项目id F23-合同id F24-承租人id F25-供应商id
|
||
String F22 = null;
|
||
String F23 = null;//保存合同id
|
||
String F24 = null;
|
||
String F25 = null;
|
||
//按项目辅助核算
|
||
String F21 = null;//项目编码
|
||
String F67 = null;//项目名称
|
||
//按客户辅助核算
|
||
String F18 = null;//F18客户编码
|
||
String F65 = null;//F65客户名称
|
||
//项目大类编码
|
||
String F68 = null;
|
||
|
||
String configid = config.getAttribute("id").toString();//科目主配置表的主键
|
||
log.info("configid:"+configid);
|
||
|
||
//获取配置子表的完整信息,主要是统计该科目存在多少个辅助核算信息
|
||
Map<String,String> propertiesMap = new HashMap<String, String>();
|
||
propertiesMap.put("CONFIG_ID", configid);
|
||
propertiesMap.put("status","0");//0是有效; 1为作废
|
||
//根据具体的字段条件查询一个entity,条件使用map封装
|
||
List<BizObject> voucherConnection_l=DataOperatorUtil.getSetJBO(VOUCHER_CONNECTION.CLASS_NAME, propertiesMap, tx);
|
||
|
||
//F17个人编码 空 F18在下方赋值
|
||
|
||
/**
|
||
* 网银导入及代收租金情况下无辅助核算信息产生
|
||
* U8凭证中辅助核算配置生成规则伪码说明(具体实现见OCC工程VoucherToV8Impl.java中代码实现及数据库中对应表数据):
|
||
* 配置1:请在科目主配置表(VOUCHERASS_STACTS_CONFIG)根据具体的科目编码配置科目名称,科目所属公司,科目序号等信息。
|
||
* 相同科目录属不同公司或不同科目录属同一公司或不同科目录属不同公司如下配置:
|
||
* 例如:相同科目录属不同公司 相同科目不同公司科目序号必须一致
|
||
* 科目序号:109、科目名称:应收租赁款 、科目编码:16102、所属公司:欧力士上海公司
|
||
* 科目序号:109、科目名称:应收租赁款 、科目编码:16102、所属公司:欧力士深圳分公司
|
||
* 例如:不同科目录属同一公司
|
||
* 科目序号:112(不允许重复)、科目名称:预收账款、科目编码:20606、所属公司:欧力士上海公司
|
||
* 科目序号:113(不允许重复)、科目名称:银行存款、科目编码:102****、所属公司:欧力士上海公司
|
||
* 例如:不同科目录属不同公司
|
||
* 科目序号:114(不允许重复)、科目名称:银行存款、科目编码:119、所属公司:欧力士上海公司
|
||
* 科目序号:115(不允许重复)、科目名称:其他应付款-期末退还保证金、科目编码:21801、所属公司:欧力士深圳公司
|
||
* 配置2:一行科目信息在主配置表配置完成后,需在科目子配置表(VOUCHER_CONNECTION)配置对应的科目辅助核算信息。
|
||
* 辅助核算项目前存在8项,分别如下(辅助核算表:VOUCHERASSSTACTS_INFO,该表数据不允许随意删除及修改,只可增加):
|
||
* 辅助核算唯一字符串标示符 唯一数字标示符 辅助核算中文名称 是否已启用
|
||
* voucherassstacts_info_id_1 01 现:客户;原:客户 已使用
|
||
* voucherassstacts_info_id_2 02 现:供应商;原:经销商 已使用
|
||
* voucherassstacts_info_id_3 03 现:合同; 原:银行账户 未使用
|
||
* voucherassstacts_info_id_4 04 现:项目; 原:合同 已使用
|
||
* voucherassstacts_info_id_5 05 现:无;原:部门 已使用
|
||
* voucherassstacts_info_id_6 06 现:无;原:供应商 已使用
|
||
* voucherassstacts_info_id_7 07 现:无;原:金融机构 未使用
|
||
* voucherassstacts_info_id_8 08 现:无;原:项目 已使用
|
||
* ....其它数据增加请在此处加上对应注释,方便开发人员的开发和维护
|
||
* 科目子配置表需主配置表增加一条科目信息后增加对应的子配置信息(辅助核算信息),例如:
|
||
* 主表存在上海公司科目为16102的一条科目信息,该科目存在项目辅助核算,则字表具体格式如下:
|
||
* 科目16102对应主表中的UUID,辅助核算表为项目的唯一字符串标示符‘voucherassstacts_info_id_8’
|
||
*
|
||
* 查询规则:
|
||
* 1.前台传入科目序号,根据需要查询该序号对应科目主表的信息
|
||
* 2.根据主表中UUID去子表查询所有属于该科目的辅助核算信息,遍历辅助核算信息,产生具体的辅助核算项
|
||
* 注意事项:
|
||
* /欧力士项目中存在:部门、供应商、合同、项目、客户五种核算项,
|
||
* 其中‘合同、项目、客户’这三种核算在科目配置中配置的是对应的辅助核算类型,
|
||
* 但是他们辅助核算的内容目前都为‘合同号’/
|
||
* 横琴金投项目存在:客户,供应商,项目,合同
|
||
*/
|
||
if(!moduleName_value.equals(moduleName) && !SPECIAL_MODULENAME.equals(moduleName) && voucherConnection_l.size() > 0){//网银情况下不存在辅助核算项
|
||
for (int j = 0; j < voucherConnection_l.size(); j++) {
|
||
BizObject voucherConnection = voucherConnection_l.get(j);
|
||
//辅助账类型编号
|
||
propertiesMap.clear();
|
||
propertiesMap.put("id", voucherConnection.getAttribute("ASSTACTTYPE").toString());
|
||
BizObject obj = DataOperatorUtil.getSingleJBO(VOUCHERASSSTACTS_INFO.CLASS_NAME, propertiesMap, tx);
|
||
String voucherassStactsInfoId = Tools.getStr( obj.getAttribute("id").toString() );//辅助账类型表主键
|
||
/**
|
||
*辅助核算1:按部门核算
|
||
*规则:根据科目信息去科目子表查询是否存在部门类型的辅助核算,存在数据则去取合同的部门编号
|
||
*F16部门编码 按部门辅助核算时带入部门编码
|
||
*F63部门名称 按部门辅助核算时带入部门名称
|
||
*/
|
||
if("voucherassstacts_info_id_5".equals(voucherassStactsInfoId)){
|
||
if(projDept == null){
|
||
log.error("部门为空,辅助核算项无法产生!");
|
||
message = message + "部门辅助核算项无法产生!";
|
||
status = "未完整";//凭证状态
|
||
}else{
|
||
F16 = projDept.getAttribute("ORGID").toString();
|
||
F63 = F16;
|
||
}
|
||
}
|
||
|
||
/**
|
||
*辅助核算2:按供应商核算 TODO
|
||
* --目前只有一条按供应商核算的,应付账款-account_payables ,在实际投放中生成,所以这里的供应商信息取实际投放中的支付对象
|
||
*规则:根据科目信息去科目子表查询是否存在供应商类型的辅助核算,存在数据则根据供应商编码去取供应商相关信息
|
||
*F19 供应商编码
|
||
*F66供应商简称
|
||
*
|
||
*/
|
||
if("voucherassstacts_info_id_2".equals(voucherassStactsInfoId)){
|
||
String f19 = map2.get("F19");
|
||
F25 = proj_id;//业务系统项目id-
|
||
//BizObject bosup = JBOHelper.querySingle(CUSTOMER_INFO.CLASS_NAME, "select o.customername,o.voucher_code from o where o.customerid=:sup_id", f19);
|
||
BizObject boProj = JBOHelper.querySingle(PROJ_INFO.CLASS_NAME,"select supp_voucher_code from o where o.id=:proj_id",proj_id);
|
||
if(boProj!=null){
|
||
F19 = boProj.getAttribute("supp_voucher_code").toString();
|
||
//F66 = boProj.getAttribute("customername").toString();
|
||
}
|
||
|
||
/*if(F19 == null || F19 == ""){
|
||
log.error("供应商为空,辅助核算项无法产生!");
|
||
message = message + "供应商辅助核算项无法产生!";
|
||
status = "未完整";
|
||
}*/
|
||
}
|
||
|
||
/**
|
||
*辅助核算3:按合同核算
|
||
*规则:根据科目信息去科目子表查询是否存在合同类型的辅助核算,存在数据则根据供应商编码去取合同相关信息
|
||
*自定义项1 按合同辅助核算 自定项1 辅助核算为合同时才插入合同号
|
||
*自由项1 按合同辅助核算 自由项1 辅助核算为合同时才插入合同号
|
||
*/
|
||
/* if("voucherassstacts_info_id_3".equals(voucherassStactsInfoId)){
|
||
//F22自定义项1
|
||
if("起租流程-旧案件转新案件".equals(moduleName) && i == 1){
|
||
F22 = oldcontractinfo.getAttribute("id").toString();
|
||
} else {
|
||
F22 = contractInfo.getAttribute("id").toString();
|
||
}
|
||
F24 = F22;
|
||
if(null == contractInfo || null == F24){
|
||
log.error("合同信息为空,辅助核算项无法产生!");
|
||
message = message + "合同辅助核算项无法产生!";
|
||
status = "未完整";
|
||
}
|
||
}*/
|
||
|
||
/**
|
||
*辅助核算4:按项目核算
|
||
*规则:根据科目信息去科目子表查询是否存在项目的辅助核算,取合同信息中的凭证编码,若无,取合同编号id
|
||
* 辅助账为项目:项目大类编码为01
|
||
*F21项目编码 按项目辅助核算
|
||
*F67项目名称 按项目辅助核算带项目名称
|
||
*/
|
||
if("voucherassstacts_info_id_4".equals(voucherassStactsInfoId)){
|
||
F68 = "01";//大类编码
|
||
//F21项目编码
|
||
if("起租流程-旧案件转新案件".equals(moduleName) && i == 1){//分录2
|
||
F21 = oldcontractinfo.getAttribute("id").toString();
|
||
} else {
|
||
//F21 = contractInfo.getAttribute("id").toString();
|
||
F22 = proj_id;//业务系统项目id
|
||
BizObject boProj = JBOHelper.querySingle(PROJ_INFO.CLASS_NAME,"select project_name,voucher_code from o where o.id=:proj_id",proj_id);
|
||
if(boProj!=null){
|
||
F21 = boProj.getAttribute("voucher_code").toString();
|
||
F67 = boProj.getAttribute("project_name").toString();
|
||
}
|
||
|
||
}
|
||
if(F21 == null){
|
||
F21 = "";
|
||
//log.error("合同信息为空,项目辅助核算项无法产生!");
|
||
//message = message + "项目辅助核算项无法产生!";
|
||
//status = "未完整";
|
||
}
|
||
}
|
||
|
||
/**
|
||
*辅助核算5:按客户核算
|
||
* 同一客户根据项目不同有不同编码,故客户编码存在proj_info表中cust_voucher_code
|
||
* 如果不存在客户编码,即取客户对应项目的id
|
||
*规则:根据科目信息去科目子表查询是否存在客户的辅助核算
|
||
*F18客户编码
|
||
*F65客户名称
|
||
*/
|
||
if("voucherassstacts_info_id_1".equals(voucherassStactsInfoId)){
|
||
//F18客户编码
|
||
//String cust_id = null;//客户编号
|
||
if("起租流程-旧案件转新案件".equals(moduleName) && i == 1){//分录2
|
||
F18 = oldcontractinfo.getAttribute("id").toString();
|
||
} else {
|
||
//cust_id = contractInfo.getAttribute("cust_id").toString();
|
||
F24 = proj_id;//业务系统项目id
|
||
BizObject boProj = JBOHelper.querySingle(PROJ_INFO.CLASS_NAME,"SELECT getcustomername(o.cust_id)AS v.cust_name,cust_voucher_code FROM o where o.id=:proj_id",proj_id);
|
||
//BizObject boCust = JBOHelper.querySingle(CUSTOMER_INFO.CLASS_NAME, "select customername,voucher_code from o where o.customerid=:cust_id", cust_id);
|
||
if(boProj!=null){
|
||
F18 = boProj.getAttribute("cust_voucher_code").toString();
|
||
F65 = boProj.getAttribute("cust_name").toString();
|
||
}
|
||
}
|
||
if(F18 == null){
|
||
F18="";
|
||
//log.error("合同信息为空,项目辅助核算项无法产生!");
|
||
//message = message + "项目辅助核算项无法产生!";
|
||
//status = "未完整";
|
||
}
|
||
}
|
||
//其它辅助核算信息生成判断..........
|
||
//...........do something
|
||
}
|
||
}
|
||
|
||
//F20业务员 空
|
||
//F21项目编码 上方赋值
|
||
//F22自定义项1 在上方赋值
|
||
//F33 F34 F35业务类型-F38 都为空
|
||
F23 = contractInfo.getAttribute("id").toString();//合同主键id
|
||
String F39 = "0";
|
||
String F40 = "0";
|
||
String F41 = "0";
|
||
String F42 = "0";
|
||
String F43 = "0";
|
||
//F44 为空
|
||
String F45 = "0";
|
||
String F46 = "0";
|
||
String F47 = "0";
|
||
String F48 = "0";
|
||
//暂时定为帐套
|
||
String F49 = own.getAttribute("id").toString();
|
||
String F50 = own.getAttribute("id").toString();
|
||
|
||
String F53 = "1";
|
||
//F54F55F56三个为空
|
||
String F57 = "0";
|
||
//F58 为空
|
||
String F59 = String.valueOf( i+1 );
|
||
// F60-业务合同编号 F61-项目名称
|
||
String F60 = null;
|
||
String F61 = null;
|
||
F60 = contractInfo.getAttribute("contract_number").toString();
|
||
F61 = contractInfo.getAttribute("project_name").toString();
|
||
//String subjectsName = config.getSubjectsName();//科目名称
|
||
String F62 = config.getAttribute("id").toString();
|
||
//F63在上方赋值
|
||
//F64 为空
|
||
//F65在上方赋值
|
||
//F66 F67在上方赋值
|
||
if(F67==null||"null".equals(F67))F67 = contractInfo.getAttribute("project_name").toString();
|
||
//String F68 = "00";//大类编码 暂定
|
||
if(F68==null)F68 = "";
|
||
String F69 = "组别";//大类名称
|
||
|
||
//F70 对方科目,多个以“,”隔开 借就全取贷方的所有,贷就取所有借的 表中暂时存入空
|
||
//F71-F90为空
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@华丽的分割线@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//构建待持久化的V8凭证完整对象信息,一行分录是一个对象
|
||
|
||
BizObject v8Obj = bm.newObject();
|
||
|
||
v8Obj.setAttributeValue("evidence_message", "凭证输出");
|
||
v8Obj.setAttributeValue("evidence_type", "U800");
|
||
v8Obj.setAttributeValue("dept_id", projDept.getAttribute("orgid"));
|
||
v8Obj.setAttributeValue("dept_name", projDept.getAttribute("ORGNAME"));
|
||
v8Obj.setAttributeValue("periodyear",periodYear);
|
||
|
||
v8Obj.setAttributeValue("F1",F1);
|
||
v8Obj.setAttributeValue("F2",F2);
|
||
v8Obj.setAttributeValue("F3",F3);
|
||
v8Obj.setAttributeValue("F5",F5);
|
||
v8Obj.setAttributeValue("F6",config.getAttribute("id"));
|
||
v8Obj.setAttributeValue("F7",F7);
|
||
v8Obj.setAttributeValue("F8",F8);
|
||
v8Obj.setAttributeValue("F9",F9);
|
||
v8Obj.setAttributeValue("F10",F10);
|
||
v8Obj.setAttributeValue("F12",F12);
|
||
v8Obj.setAttributeValue("F15",F15);
|
||
v8Obj.setAttributeValue("F16",F16);
|
||
v8Obj.setAttributeValue("F18",F18);
|
||
v8Obj.setAttributeValue("F19",F19);
|
||
|
||
v8Obj.setAttributeValue("F21",F21);
|
||
v8Obj.setAttributeValue("F22",F22);
|
||
v8Obj.setAttributeValue("F23",F23);
|
||
v8Obj.setAttributeValue("F24",F24);
|
||
v8Obj.setAttributeValue("F25",F25);
|
||
v8Obj.setAttributeValue("F26",F26);
|
||
v8Obj.setAttributeValue("F27",F27);
|
||
v8Obj.setAttributeValue("F28",F28);
|
||
v8Obj.setAttributeValue("F29",F29);
|
||
v8Obj.setAttributeValue("F30",F30);
|
||
v8Obj.setAttributeValue("F31",F31);
|
||
|
||
v8Obj.setAttributeValue("F39",F39);
|
||
v8Obj.setAttributeValue("F40",F40);
|
||
v8Obj.setAttributeValue("F41",F41);
|
||
|
||
v8Obj.setAttributeValue("F42",F42);
|
||
v8Obj.setAttributeValue("F43",F43);
|
||
v8Obj.setAttributeValue("F45",F45);
|
||
v8Obj.setAttributeValue("F46",F46);
|
||
v8Obj.setAttributeValue("F47",F47);
|
||
v8Obj.setAttributeValue("F48",F48);
|
||
|
||
|
||
v8Obj.setAttributeValue("F49",F49);
|
||
v8Obj.setAttributeValue("F50",F50);
|
||
v8Obj.setAttributeValue("F51",F51);
|
||
v8Obj.setAttributeValue("F52",F52);
|
||
v8Obj.setAttributeValue("F53",F53);
|
||
v8Obj.setAttributeValue("F54",F54);
|
||
v8Obj.setAttributeValue("F55",F55);
|
||
v8Obj.setAttributeValue("F56",F56);
|
||
v8Obj.setAttributeValue("F57",F57);
|
||
v8Obj.setAttributeValue("F59",F59);
|
||
v8Obj.setAttributeValue("F60",F60);
|
||
v8Obj.setAttributeValue("F61",F61);
|
||
v8Obj.setAttributeValue("F62",F62);
|
||
v8Obj.setAttributeValue("F63",F63);
|
||
|
||
v8Obj.setAttributeValue("F65",F65);
|
||
v8Obj.setAttributeValue("F66",F66);
|
||
v8Obj.setAttributeValue("F67",F67);
|
||
|
||
v8Obj.setAttributeValue("F68",F68);
|
||
v8Obj.setAttributeValue("F69",F69);
|
||
|
||
|
||
v8Obj.setAttributeValue("inputuserid",user.getAttribute("userid"));
|
||
v8Obj.setAttributeValue("status",status);
|
||
v8Obj.setAttributeValue("v8_flag",eas_flag);//导入财务系统状态 默认0
|
||
|
||
v8Obj.setAttributeValue("module_name",moduleName);
|
||
v8Obj.setAttributeValue("generate_date",DateUtils.getSystemDate(3));
|
||
v8Obj.setAttributeValue("entrydc",entryDC);
|
||
|
||
v8Vouchers.add(v8Obj);
|
||
//this.getString(v8Obj);
|
||
}
|
||
log.info("凭证分录数量:"+v8Vouchers.size());
|
||
//批量持久化操作
|
||
//FIXME:sea 这里存在2种凭证产生方式,应该取效率最快的为准
|
||
if( F7Count != BigDecimal.ZERO && F8Count != BigDecimal.ZERO ){//凭证借贷双方各自总价值大于0才可以产生凭证
|
||
//实体方式保存凭证
|
||
for(BizObject bo:v8Vouchers)
|
||
{
|
||
bm.saveObject(bo);
|
||
}
|
||
}
|
||
//批量JDBC方式产生凭证
|
||
//this.saveVouchersToPLJDBC(v8Vouchers);
|
||
|
||
} catch (Exception e) {
|
||
//徐云龙及吕永辉两位强烈建议这里把整个一起做try catch处理,后人如果改这里千万不要骂原作者,因为之前的异常处理方式是通过方法把异常抛到上层方法中的
|
||
e.printStackTrace();
|
||
throw new Exception("凭证生成出错!");
|
||
}
|
||
return v8Str;
|
||
}
|
||
|
||
/**
|
||
* <p>根据项科目序号和合同/网银所属取出对应的科目对象。</p>
|
||
* @author sea
|
||
* @param subjectsNum 科目序号
|
||
* @param dict 合同所属or网银所属
|
||
* @return
|
||
* @throws Exception
|
||
*/
|
||
private BizObject seachConfig(String subjectsNum,JBOTransaction tx) throws Exception{
|
||
BizObject config = null;
|
||
Map<String,String> map = new HashMap<String, String>();
|
||
log.info("根据科目序号及凭证的公司所属查询科目ENTITY:");
|
||
log.info("subjectsNum:"+subjectsNum);
|
||
//log.info("SUBJECTS_OWNER:"+dict.getId());
|
||
map.put("SUBJECTS_ID", subjectsNum);//科目编码ID(用于多分公司同一科目不同科目编码)
|
||
//新项目不分合同所属
|
||
//map.put("subjectsOwner", dict);//所属区域(科目对应的所属区域,存入的是数据字典的UUID)
|
||
map.put("status","0");//科目状态为有效 , 0是有效; 1为作废
|
||
//根据具体的字段条件查询一个entity,条件使用map封装
|
||
config = DataOperatorUtil.getSingleJBO(VOUCHERASS_STACTS_CONFIG.CLASS_NAME, map, tx);
|
||
|
||
return config;
|
||
}
|
||
} |