Merge remote-tracking branch 'origin/main'

This commit is contained in:
lihao 2025-07-01 09:00:31 +08:00
commit 691bbb8815
51 changed files with 6844 additions and 2149 deletions

File diff suppressed because one or more lines are too long

0
erm/src/public/.gitkeep Normal file
View File

View File

@ -65,7 +65,7 @@ public class DzButton implements ICommonAction {
// 获取当前年份
String sql = "select fbm.gatherdate,bank1.pk_bankdoc as fkyh,bank2.pk_bankdoc as skyh,fbm.acceptorbank,fbm.hidereceivebankacc ,holdunit,org.name as orgname , reg.name as pjname,xxb_bon.bdcode,btype.pk_balatype,reg.code,xxe.exsystemcode,\n" +
"xxb_bon.exsysval\n" +
",invoiceunit,fbmbilltype,fbm.fbmbillno,fbm.pk_register, paybankacc as bankaccount,fbm.payunit,cust.name as bankname,fbm.billmaker,fbm.creator,fbm.note,fbm.money,cust.custsupprop ,cust.custsuptype,fbm.pk_banktype ,fbm.pk_org ,fbm.pk_org_v,fbm.hidereceiveunit, fbm.hidepayunit,fbm.hidepaybankacc ,fbm.hidepaybank ,fbm.paybankacc ,fbm.paybank ,fbm.receiveunit,fbm.receivebankacc ,fbm.receivebank ,hidereceivebank, bankdoc.pk_bankaccbas ,fbm.pk_group \n" +
",invoiceunit,fbmbilltype,fbm.fbmbillno,fbm.pk_register, paybankacc as bankaccount,fbm.payunit,cust.name as bankname,fbm.billmaker,fbm.creator,fbm.note,fbm.money,cust.custsupprop ,cust.custsuptype,fbm.pk_banktype ,fbm.pk_org ,fbm.pk_org_v,fbm.hidereceiveunit, fbm.hidepayunit,fbm.hidepaybankacc ,fbm.hidepaybank ,fbm.paybankacc ,fbm.paybank ,fbm.receiveunit,fbm.receivebankacc ,fbm.receivebank ,hidereceivebank, bankdoc.pk_bankaccbas ,fbm.pk_group,fbm.billrange \n" +
"from fbm_register fbm \n" +
"left join bd_cust_supplier cust on fbm.hidepayunit=cust.pk_cust_sup \n" +
"left join bd_bankaccbas bankdoc on fbm.receivebankacc = bankdoc.code\n" +
@ -227,10 +227,16 @@ public class DzButton implements ICommonAction {
int randomNumber = random.nextInt(10000); // 生成0到9999之间的随机数
String vBillNo = "36S" + String.format("%d%04d", timestamp, randomNumber);
String note_no = (String) row.get("fbmbillno");
//对账标识码
String bankrelated_code = "";//sunfj2 流水对账标识码 = 票据号+子票区间
if(row.get("billrange")!=null && !"".equals(String.valueOf(row.get("billrange")))) {
bankrelated_code= (String)row.get("fbmbillno")+(String)row.get("billrange");
}
// String sqlp="insert into cmp_informer(bankaccount,bankname,billmaker,consignagreement,creationtime,creator,direction,domain,doperatedate,doperatetime,dr,family,generateflag,infodate,infodatetime,memo,modifiedtime,modifier,moneyy,oppbankaccount,oppinout,oppunitname,oppunittype,pk_acc_sub,pk_balatype,pk_bank,pk_bankacc,pk_bankaccer,pk_banktype,pk_billtypecode,pk_billtypeid,pk_claimer,pk_currtype,pk_fundtype,pk_group,pk_informer,pk_org,pk_org_v,pk_src,pk_vouch,recpay_fundorg,recpay_fundplansubj,recpay_inneracc,recpay_org,recpay_orgplansubj,release_org,styleflag,subfamily,syscode,ts,vbillno) values('"+num+"','济南热电有限公司','1001A110000000003Q0I','~','"+dam+"','1001A110000000003Q0I','"+pr+"','~','"+transactionDate+"','"+dam+"','0','~','hasnogenerate','"+transactionDate+"','"+timesub+"','"+zhaiYao+"','"+dam+"','1001A110000000003Q0I',"+money+",'"+oppositeAccountNumber+"','"+opp+"','"+oppositeUserName+"','"+opptype+"','"+select[2]+"','~','"+select[0]+"','"+select[1]+"','~','"+select3[0]+"','36S3','1001Z61000000001SOPF','~','1002Z0100000000001K1','~','0001N2100000000002ZE','"+vId+"','0001N710000000001FWC','0001N710000000001FWB','1001A110000000007IWJ','~','~','~','~','~','~','~','A','~','sysnet','"+dam+"','"+fId2+"')"
// 形成sql
String sqlp = "insert into cmp_informer(bankaccount,bankname,billmaker,consignagreement,creationtime,creator,direction,domain,doperatedate,doperatetime,dr,family,generateflag,infodate,infodatetime,memo,modifiedtime,modifier,moneyy,oppbankaccount,oppinout,oppunitname,oppunittype,pk_acc_sub,pk_balatype,pk_bank,pk_bankacc,pk_bankaccer,pk_banktype,pk_billtypecode,pk_billtypeid,pk_claimer,pk_currtype,pk_fundtype,pk_group,pk_informer,pk_org,pk_org_v,pk_src,pk_vouch,recpay_fundorg,recpay_fundplansubj,recpay_inneracc,recpay_org,recpay_orgplansubj,release_org,styleflag,subfamily,syscode,ts,vbillno,note_no,pk_oppunit,pk_oppbank,pk_oppacc) values('"
+ bankAccount + "','" + bankName + "','" + billMaker + "','" + consignAgreement + "','" + formatteddatatime + "','" + creator + "','" + direction + "','" + domain + "','" + doOperateDate + "','" + sj + "','" + dr + "','" + family + "','" + generateFlag + "','" + infoDate + "','" + infoDateTime + "','" + memo + "','" + modifiedTime + "','" + modifier + "','" + money + "','" + oppBankAccount + "','" + oppInOut + "','" + oppUnitName + "','" + oppUnitType + "','" + pkAccSub + "','" + pk_balatype + "','" + pkBank + "','" + pkBankAcc + "','" + pkBankAccer + "','" + pkBankType + "','" + pkBillTypeCode + "','" + pkBillTypeId + "','" + pkClaimer + "','" + pkCurrType + "','" + pkFundType + "','" + pkGroup + "','" + pkInformer + "','" + pkOrg + "','" + pkOrgV + "','" + pkSrc + "','" + pkVouch + "','" + recPayFundOrg + "','" + recPayFundPlansubj + "','" + recPayInnerAcc + "','" + recPayOrg + "','" + recPayOrgPlansubj + "','" + releaseOrg + "','" + styleFlag + "','" + subFamily + "','" + sysCode + "','" + ts + "','" + vBillNo + "','" + note_no + "','" + pk_oppunit + "','" + pk_oppbank + "','" + pk_oppacc + "')";
String sqlp = "insert into cmp_informer(bankaccount,bankname,billmaker,consignagreement,creationtime,creator,direction,domain,doperatedate,doperatetime,dr,family,generateflag,infodate,infodatetime,memo,modifiedtime,modifier,moneyy,oppbankaccount,oppinout,oppunitname,oppunittype,pk_acc_sub,pk_balatype,pk_bank,pk_bankacc,pk_bankaccer,pk_banktype,pk_billtypecode,pk_billtypeid,pk_claimer,pk_currtype,pk_fundtype,pk_group,pk_informer,pk_org,pk_org_v,pk_src,pk_vouch,recpay_fundorg,recpay_fundplansubj,recpay_inneracc,recpay_org,recpay_orgplansubj,release_org,styleflag,subfamily,syscode,ts,vbillno,note_no,pk_oppunit,pk_oppbank,pk_oppacc,bankrelated_code) values('"
+ bankAccount + "','" + bankName + "','" + billMaker + "','" + consignAgreement + "','" + formatteddatatime + "','" + creator + "','" + direction + "','" + domain + "','" + doOperateDate + "','" + sj + "','" + dr + "','" + family + "','" + generateFlag + "','" + infoDate + "','" + infoDateTime + "','" + memo + "','" + modifiedTime + "','" + modifier + "','" + money + "','" + oppBankAccount + "','" + oppInOut + "','" + oppUnitName + "','" + oppUnitType + "','" + pkAccSub + "','" + pk_balatype + "','" + pkBank + "','" + pkBankAcc + "','" + pkBankAccer + "','" + pkBankType + "','" + pkBillTypeCode + "','" + pkBillTypeId + "','" + pkClaimer + "','" + pkCurrType + "','" + pkFundType + "','" + pkGroup + "','" + pkInformer + "','" + pkOrg + "','" + pkOrgV + "','" + pkSrc + "','" + pkVouch + "','" + recPayFundOrg + "','" + recPayFundPlansubj + "','" + recPayInnerAcc + "','" + recPayOrg + "','" + recPayOrgPlansubj + "','" + releaseOrg + "','" + styleFlag + "','" + subFamily + "','" + sysCode + "','" + ts + "','" + vBillNo + "','" + note_no + "','" + pk_oppunit + "','" + pk_oppbank + "','" + pk_oppacc + "','" + bankrelated_code + "')";
sqlStr.add(sqlp);
}
int succState = executeUpdate(sqlStr);

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,13 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nccloud.impl.fbm.gather.excel;
import java.util.Collection;
import java.util.HashMap;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.sec.esapi.NCESAPI;
import nc.itf.bd.bankdoc.IBankdocQueryService;
import nc.itf.bd.pub.IBDMetaDataIDConst;
import nc.md.persist.framework.IMDPersistenceQueryService;
import nc.pubitf.bd.accessor.GeneralAccessorFactory;
import nc.pubitf.bd.accessor.IGeneralAccessor;
@ -21,11 +18,12 @@ import nc.vo.bd.bankaccount.BankAccbasVO;
import nc.vo.bd.bankdoc.BankdocVO;
import nc.vo.bd.cust.CustSupplierVersionVO;
import nc.vo.fbm.pub.action.ActionVO;
import nc.vo.fbm.pub.constant.ActionConstant;
import nc.vo.fbm.pub.constant.RegisterStatusConstant;
import nc.vo.fbm.pub.util.FbmCommonTools;
import nc.vo.fbm.pub.util.FbmPublicUtil;
import nc.vo.fbm.register.AggRegisterVO;
import nc.vo.fbm.register.RegisterVO;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.lang.UFBoolean;
@ -40,270 +38,354 @@ import nc.vo.uap.pf.PFBatchExceptionInfo;
import nc.vo.uap.pf.PfProcessBatchRetObject;
import nccloud.bs.excel.IXChangeContext;
import nccloud.bs.excel.plugin.AbstractImportProceeWithContext;
import nccloud.itf.fbm.gather.GatherConstant;
import nccloud.pubitf.riart.pflow.CloudPFlowContext;
import nccloud.pubitf.riart.pflow.ICloudScriptPFlowService;
/**
* 收票登记 导入
*
* @author zhangjp6 2019年5月21日
*
*/
public class GatherExcelImport4NCCImpl extends AbstractImportProceeWithContext {
public GatherExcelImport4NCCImpl() {
}
@Override
protected void processBillWithContext(Object vo, IXChangeContext changcontext) throws BusinessException {
CircularlyAccessibleValueObject regvo = ((HYBillVO) vo).getParentVO();
AggRegisterVO aggvo = new AggRegisterVO();
aggvo.setParentVO(regvo);
this.check(aggvo);
Object[] results = this.doSave(aggvo);
Object[] var6 = results;
int var7 = results.length;
for (int var8 = 0; var8 < var7; ++var8) {
Object obj = var6[var8];
if (obj instanceof PfProcessBatchRetObject batchObj) {
// 保存前处理
check(aggvo);
// 执行保存逻辑
Object[] results = doSave(aggvo);
for (Object obj : results) {
if (obj instanceof PfProcessBatchRetObject) {
PfProcessBatchRetObject batchObj = (PfProcessBatchRetObject) obj;
PFBatchExceptionInfo exceptionInfo = batchObj.getExceptionInfo();
throw new BusinessException(exceptionInfo.getErrorMessage());
}
}
}
/**
* 调用动作脚本 执行保存
*
* @param aggVO
* @return
* @throws BusinessException
*/
private Object[] doSave(AggRegisterVO aggVO) throws BusinessException {
this.doBeforeSave(aggVO);
doBeforeSave(aggVO);
CloudPFlowContext context = new CloudPFlowContext();
context.setActionName("SAVEBASE");
context.setBillType("36H1");
context.setActionName(ActionConstant.SAVEBASE);
context.setBillType(GatherConstant.BILL_TYPE);
context.setBillVos(new AggRegisterVO[] { aggVO });
Object[] objects = ((ICloudScriptPFlowService) NCLocator.getInstance().lookup(ICloudScriptPFlowService.class))
.exeScriptPFlow(context);
Object[] objects = NCLocator.getInstance().lookup(ICloudScriptPFlowService.class).exeScriptPFlow(context);
return objects;
}
/**
* 保存前事件
*
* @param aggvo
* @throws BusinessException
*/
private void doBeforeSave(AggRegisterVO aggvo) throws BusinessException {
RegisterVO pvo = aggvo.getparentVO();
UFDateTime businessTime = new UFDateTime(InvocationInfoProxy.getInstance().getBizDateTime());
// 集团
pvo.setPk_group(InvocationInfoProxy.getInstance().getGroupId());
// 制单人
pvo.setBillmaker(InvocationInfoProxy.getInstance().getUserId());
// 创建日期
pvo.setCreationtime(businessTime);
// 制单日期
pvo.setDoperatedate(new UFDate(InvocationInfoProxy.getInstance().getBizDateTime()));
// 创建时间
pvo.setCreationtime(businessTime);
// 创建人
pvo.setCreator(InvocationInfoProxy.getInstance().getUserId());
pvo.setPk_billtypecode("36H1");
// 单据类型
pvo.setPk_billtypecode(GatherConstant.BILL_TYPE);
// 来源类型= 收票录入
pvo.setGathertype("input");
// 期初
UFBoolean initflag = pvo.getInitflag();
if (StringUtil.isNull(initflag)) {
pvo.setInitflag(UFBoolean.FALSE);
}
// 已收付票标识
pvo.setSfflag(UFBoolean.FALSE);
pvo.setRegisterstatus("on_gather");
// 票据状态 = 在收票
pvo.setRegisterstatus(RegisterStatusConstant.ON_GATHER);
// 单据状态 = 自由
pvo.setVbillstatus(-1);
// NCC-172798 默认赋值为N否则会为null
pvo.setRelatedrecbill(UFBoolean.FALSE);
// 废票字段设置默认值N否则导入的数据页签查询会有问题
UFBoolean disableflag = pvo.getDisableflag();
if (disableflag == null || !disableflag.booleanValue()) {
if (disableflag != null && disableflag.booleanValue()) {
// 说明前台传的废票字段有值是废票
} else {
pvo.setDisableflag(UFBoolean.FALSE);
}
pvo.setBookflag(UFBoolean.FALSE);
pvo.setPlanflag(UFBoolean.FALSE);
String pk_org = pvo.getPk_org();
if (StringUtil.isNotNull(pvo.getReceiveaccount())) {
BankAccbasVO accbasVO = this.getBankAccbasVOByReceiveaccount(pvo);
String var10002;
if (accbasVO.getEnablestate() != 2) {
var10002 = pvo.getFbmbillno();
throw new BusinessException(
var10002 + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0078"));
//电票签约账户不是空设置签约账号开户行和银行类别
if(StringUtil.isNotNull(pvo.getReceiveaccount())) {
BankAccbasVO accbasVO = getBankAccbasVOByReceiveaccount(pvo);
if(accbasVO.getEnablestate() != 2) {
throw new BusinessException(pvo.getFbmbillno() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0078")/* @res ":电票签约账号未启用!" */);
}
//zhangxinah 去掉银行账户是否电票签约账户的校验
// if (!accbasVO.getIsenableelecbill().booleanValue()) {
// var10002 = pvo.getFbmbillno();
// throw new BusinessException(
// var10002 + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0079"));
//zhangxinah 去掉银行账户是否电票签约账户的校验
// if (accbasVO.getIsenableelecbill() == null || !accbasVO.getIsenableelecbill().booleanValue()) {
// throw new BusinessException(pvo.getFbmbillno() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
// .getStrByID("3618ncc_0", "03618ncc-0079")/* @res ":电票签约账号电票不可用!" */);
// }
BankdocVO bankdoc = this.getBanktypeByReceiveaccount(pvo.getReceiveaccount());
BankdocVO bankdoc = getBanktypeByReceiveaccount(pvo.getReceiveaccount());
pvo.setPk_banktype(bankdoc.getPk_banktype());
pvo.setReceiveaccountname(bankdoc.getName());
}
IGeneralAccessor bankdocAccessor = GeneralAccessorFactory.getAccessor("bf5aeed4-6b35-4a2e-b750-b9aabce59e21");
BankaccSubGeneralAccessor bankaccsubAccessor = (BankaccSubGeneralAccessor) (new BankaccSubAccessorFactory())
.getAccessor("9e10ef4a-0be9-482b-880f-871e5b0504b7");
IGeneralAccessor assLineNumAccessor = GeneralAccessorFactory
.getAccessor("7b6c7dc0-db78-4bef-9cca-f5af4008f893");
TMCustSupUtil.setCustSupPk(aggvo, "paybillunit_v", "paybillunit", "hidepaybillunit");
CustSupplierVersionVO custSupVO;
IGeneralAccessor bankdocAccessor = GeneralAccessorFactory.getAccessor(IBDMetaDataIDConst.BANKDOC);
BankaccSubGeneralAccessor bankaccsubAccessor = (BankaccSubGeneralAccessor) new BankaccSubAccessorFactory()
.getAccessor(IBDMetaDataIDConst.CUSTBANKACCSUB);
IGeneralAccessor assLineNumAccessor = GeneralAccessorFactory.getAccessor(IBDMetaDataIDConst.ASSLINENUM);
// 付票单位 vid会自动导入需要根据vid查oid和文本赋值
TMCustSupUtil.setCustSupPk(aggvo, RegisterVO.PAYBILLUNIT_V, RegisterVO.PAYBILLUNIT, RegisterVO.HIDEPAYBILLUNIT);
// 出票人 根据出票人文本和收票日期赋值vid和oid
if (StringUtil.isNotNull(pvo.getPayunit())) {
custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getPayunit(), pvo.getGatherdate());
if (custSupVO != null) {
CustSupplierVersionVO custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getPayunit(), pvo.getGatherdate());
if(custSupVO!=null) {
pvo.setHidepayunit(custSupVO.getPk_cust_sup());
pvo.setHidepayunit_v(custSupVO.getPk_cust_sup_v());
}
}
// 收款人 根据收款人文本和收票日期赋值vid和oid
if (StringUtil.isNotNull(pvo.getReceiveunit())) {
custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getReceiveunit(), pvo.getGatherdate());
if (custSupVO != null) {
CustSupplierVersionVO custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getReceiveunit(), pvo.getGatherdate());
if(custSupVO!=null) {
pvo.setHidereceiveunit(custSupVO.getPk_cust_sup());
pvo.setHidereceiveunit_v(custSupVO.getPk_cust_sup_v());
}
}
// 收款人账户
if (StringUtil.isNotNull(pvo.getReceivebankacc())) {
IBDData cussup = bankaccsubAccessor.getDocByAccnum(pvo.getReceivebankacc(), pvo.getPk_curr());
if (cussup != null) {
pvo.setHidereceivebankacc(cussup.getPk());
}
}
// 收款人银行
if (StringUtil.isNotNull(pvo.getReceivebank())) {
IBDData cussup = bankdocAccessor.getDocByNameWithMainLang(pk_org, pvo.getReceivebank());
if (cussup != null) {
pvo.setHidereceivebank(cussup.getPk());
}
}
boolean busType = FbmPublicUtil.isBusType(pvo.getFbmbilltype());
IBDData cussup = null;
// 承兑人 1银承银行档案 银行参照signagrbank2商承客商档案客商参照pk_signagrbank3文本acceptorname
if (busType) {
if (StringUtil.isNotNull(pvo.getAcceptorname())) {
custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getAcceptorname(),
pvo.getGatherdate());
if (custSupVO != null) {
CustSupplierVersionVO custSupVO = TMCustSupUtil.getCustSupplierVersionVOByNameAndDate(pvo.getAcceptorname(), pvo.getGatherdate());
if(custSupVO!=null) {
pvo.setPk_signagrbank(custSupVO.getPk_cust_sup());
pvo.setPk_signagrbank_v(custSupVO.getPk_cust_sup_v());
}
}
} else if (StringUtil.isNotNull(pvo.getAcceptorname())) {
cussup = bankdocAccessor.getDocByNameWithMainLang(pk_org, pvo.getAcceptorname());
if (cussup != null) {
pvo.setSignagrbank(cussup.getPk());
} else {
// 承兑人账户是否同行 银承勾选
if (StringUtil.isNotNull(pvo.getAcceptorname())) {
IBDData cussup = bankdocAccessor.getDocByNameWithMainLang(pk_org, pvo.getAcceptorname());
if (cussup != null) {
pvo.setSignagrbank(cussup.getPk());
}
}
}
// 承兑人开户行号: 手输+参照 人行联行信息 人行联行信息acceptorbankaccount文本signagrbanknum
if (StringUtil.isNotNull(pvo.getSignagrbanknum())) {
cussup = assLineNumAccessor.getDocByCode(pk_org, pvo.getSignagrbanknum());
IBDData cussup = assLineNumAccessor.getDocByCode(pk_org, pvo.getSignagrbanknum());
if (cussup != null) {
pvo.setAcceptorbankaccount(cussup.getPk());
}
}
// 承兑人开户行名: 手输+参照 银行档案 银行档案acceptorbank文本signagrbankname
if (StringUtil.isNotNull(pvo.getSignagrbankname())) {
cussup = bankdocAccessor.getDocByNameWithMainLang(pk_org, pvo.getSignagrbankname());
IBDData cussup = bankdocAccessor.getDocByNameWithMainLang(pk_org, pvo.getSignagrbankname());
if (cussup != null) {
pvo.setAcceptorbank(cussup.getPk());
}
}
//能否分包流转
UFBoolean subcontractCirculation = pvo.getSubcontractcirculation();
boolean ifBelongNewbillSys = FbmCommonTools.ifBelongNewBillSystem(pvo.getFbmbillno());
if (ifBelongNewbillSys && subcontractCirculation != null && subcontractCirculation.booleanValue()) {
String var10001 = pvo.getBillrangestart();
pvo.setBillrange(var10001 + "-" + pvo.getBillrangeend());
} else if (ifBelongNewbillSys) {
if (!"0".equals(pvo.getBillrangestart()) || !"0".equals(pvo.getBillrangeend())) {
pvo.setBillrange(pvo.getBillrangestart() + "-" + pvo.getBillrangeend());
} else if(ifBelongNewbillSys){
if(!"0".equals(pvo.getBillrangestart()) || !"0".equals(pvo.getBillrangeend())) {
throw new BusinessException("票据[" + pvo.getFbmbillno() + "]为新一代票且不可分包流转子票区间开始和结束应为0");
}
pvo.setBillrange(String.valueOf("0"));
} else {
pvo.setBillrange((String) null);
pvo.setBillrange(null);
}
// 设置票据所属系统
pvo.setBillsystype(FbmCommonTools.getBillSysTypeByFbmBillNo(pvo.getFbmbillno()));
//如果可用金额为空则将可用金额默认设置为票据金额
UFDouble availablemoney = pvo.getAvailablemoney();
if (availablemoney == null) {
if(availablemoney == null) {
pvo.setAvailablemoney(pvo.getMoney());
}
HashMap<String, String> voFieldsMap = new HashMap();
voFieldsMap.put("groupField", "pk_group");
voFieldsMap.put("orgField", "pk_org");
voFieldsMap.put("currField", "pk_curr");
voFieldsMap.put("rateField", "olcrate");
voFieldsMap.put("custsupField", "paybillunit");
voFieldsMap.put("dateField", "gatherdate");
HashMap<String, String> voFieldsMap = new HashMap<String, String>();
voFieldsMap.put(FbmPublicUtil.GROUP_FIELD, RegisterVO.PK_GROUP);
voFieldsMap.put(FbmPublicUtil.ORG_FIELD, RegisterVO.PK_ORG);
voFieldsMap.put(FbmPublicUtil.CURR_FIELD, RegisterVO.PK_CURR);
voFieldsMap.put(FbmPublicUtil.RATE_FIELD, RegisterVO.OLCRATE);
voFieldsMap.put(FbmPublicUtil.CUST_SUP_FIELD, RegisterVO.PAYBILLUNIT);
voFieldsMap.put(FbmPublicUtil.DATE_FIELD, RegisterVO.GATHERDATE);
FbmPublicUtil.setOlcRate4Import(aggvo, voFieldsMap);
voFieldsMap.put("rateField", "glcrate");
voFieldsMap.put(FbmPublicUtil.RATE_FIELD, RegisterVO.GLCRATE);
FbmPublicUtil.setGlcRate4Import(aggvo, voFieldsMap);
voFieldsMap.put("rateField", "gllcrate");
voFieldsMap.put(FbmPublicUtil.RATE_FIELD, RegisterVO.GLLCRATE);
FbmPublicUtil.setGllcRate4Import(aggvo, voFieldsMap);
// 重算
GatherReCaculateMnyUtil.recaculate(false, new AggRegisterVO[] { aggvo });
ExcelImportUtil.validateOlcratetype(pvo.getOlcratetype(), pvo.getOlcratecategory());
// 单据导入时校验汇率类型不能为期间平均计算汇率
ExcelImportUtil.validateOlcratetype(pvo.getOlcratetype(),pvo.getOlcratecategory());
}
/**
* 保存前校验
*
* @param aggVO
* @throws BusinessException
*/
private void check(AggRegisterVO aggvo) throws BusinessException {
RegisterVO registerVO = aggvo.getparentVO();
String fbmbillno = registerVO.getFbmbillno();
UFBoolean cyberbankflag = registerVO.getCyberbankflag();
// 票据池网银校验
UFBoolean cyberbankflag = registerVO.getCyberbankflag();// 票据池网银
if (cyberbankflag != null && !cyberbankflag.booleanValue()) {
String pk_bankdoc = registerVO.getPk_bankdoc();
if (!StringUtil.isNull(pk_bankdoc)) {
throw new BusinessException(
fbmbillno + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0042"));
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0042")/* @res ":未勾选票据池网银,登记银行必须为空!" */);
}
}
// 收票日期和出票日期校验
UFDate gatherdate = registerVO.getGatherdate();
UFDate invoicedate = registerVO.getInvoicedate();
if (gatherdate != null && invoicedate != null
&& gatherdate.toStdString().compareTo(invoicedate.toStdString()) < 0) {
throw new BusinessException(
fbmbillno + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0043"));
} else {
UFDouble money = registerVO.getMoney();
if (money != null && money.doubleValue() < 0.0) {
throw new BusinessException(
fbmbillno + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0080"));
} else {
UFDate enddate = registerVO.getEnddate();
if (enddate != null && invoicedate != null
&& enddate.toStdString().compareTo(invoicedate.toStdString()) < 0) {
throw new BusinessException(
fbmbillno + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0046"));
} else {
String fbmbilltype = registerVO.getFbmbilltype();
String receiveaccount = registerVO.getReceiveaccount();
boolean isEbill = FbmCommonTools.isEBill(fbmbilltype);
if (isEbill) {
if (StringUtil.isNull(receiveaccount)) {
throw new BusinessException(fbmbillno
+ NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0051"));
}
} else {
UFBoolean onlinebankflag = registerVO.getOnlinebankflag();
if (onlinebankflag != null && onlinebankflag.booleanValue()) {
throw new BusinessException(fbmbillno
+ NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0072"));
}
}
FbmCommonTools.validBillRange(registerVO, isEbill);
FbmCommonTools.billNoValication(fbmbillno);
this.checkIsReturnedBill(registerVO);
}
if (gatherdate != null && invoicedate != null) {
if (gatherdate.toStdString().compareTo(invoicedate.toStdString()) < 0) {
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0043")/* @res ":收票日期必须大于等于出票日期!" */);
}
}
//校验金额
UFDouble money = registerVO.getMoney();
if(money!=null&&money.doubleValue()<0) {
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0080")/* @res ":票据金额必须大于零!" */);
}
// 到期日期和出票日期校验
UFDate enddate = registerVO.getEnddate();
if (enddate != null && invoicedate != null) {
if (enddate.toStdString().compareTo(invoicedate.toStdString()) < 0) {
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0046")/* @res ":到期日期应大于出票日期!" */);
}
}
// 收款和付款单位不能相同
// String payunit = registerVO.getHidepayunit();
// String receiveunit = registerVO.getHidereceiveunit();
// if (!StringUtil.isNull(payunit) && !StringUtil.isNull(receiveunit)
// && payunit.equals(receiveunit)) {
// throw new BusinessException(fbmbillno+nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0","03618ncc-0044")/*@res ":票据基本信息的收款单位和付款单位不能相同!"*/);
// }
// 如果是电票的话 电票签约账号必须有值
String fbmbilltype = registerVO.getFbmbilltype();
String receiveaccount = registerVO.getReceiveaccount();
// 判断是否为电票
boolean isEbill = FbmCommonTools.isEBill(fbmbilltype);
// 票据号码长度校验
// FbmCommonTools.checkFbmbillnoByIsEbill(fbmbillno, isEbill);
if (isEbill) {
/*if (StringUtil.isNull(receiveaccount)) {
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0051")*//* @res ":票据类型为电票,电票签约账号不能为空!" *//*);
}*/
} else {
// 非电票网银不可勾选如果导入的时候网银勾选了弹出提示
UFBoolean onlinebankflag = registerVO.getOnlinebankflag();
if (onlinebankflag != null && onlinebankflag.booleanValue()) {
throw new BusinessException(fbmbillno + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0072")/* @res ":非电票不允许勾选网银,请确认数据!" */);
}
}
if (StringUtil.isNotNull(registerVO.getBillrangestart()) && StringUtil.isNotNull(registerVO.getBillrangeend())) {
// 子票区间取消了长度校验自动补齐
registerVO.setBillrangestart(FbmCommonTools.autoFillRange(registerVO.getBillrangestart()));
registerVO.setBillrangeend(FbmCommonTools.autoFillRange(registerVO.getBillrangeend()));
}
//校验子票区间信息
FbmCommonTools.validBillRange(registerVO, isEbill);
//检查票号
FbmCommonTools.billNoValication(fbmbillno);
// 校验是否是回头票
checkIsReturnedBill(registerVO);
}
/**
*
* 校验票据是否为回头票 场景一对方开票背书给企业
* 根据财务组织票据号码已收票字段在票据综合台账节点查询该组织是否已经存在相同号码且已收票为的票如果存在回头票字段自动标识为Y
* 场景二企业开出的票据经过流转后又回到企业
* 根据财务组织票据号码票据状态在票据综合台账节点查询该组织是否已经存在相同号码且票据状态为已付票的票如果存在回头票字段自动标识为Y
*
* @param registerVO 参数
* @throws BusinessException
*
*/
private void checkIsReturnedBill(RegisterVO registerVO) throws BusinessException {
StringBuffer whereSql = new StringBuffer();
whereSql.append(" pk_org = '").append(registerVO.getPk_org()).append("' ");
whereSql.append(" and fbmbillno = '").append(registerVO.getFbmbillno()).append("' ");
if (StringUtil.isNull(registerVO.getBillrangestart())) {
if(StringUtil.isNull(registerVO.getBillrangestart())) {
whereSql.append(" and isnull(billrangestart, '0') = '0' ");
} else {
}else {
whereSql.append(" and billrangestart <= '").append(registerVO.getBillrangestart()).append("' ");
}
if (StringUtil.isNull(registerVO.getBillrangeend())) {
if(StringUtil.isNull(registerVO.getBillrangeend())) {
whereSql.append(" and isnull(billrangeend, '0') = '0' ");
} else {
}else {
whereSql.append(" and billrangeend >= '").append(registerVO.getBillrangeend()).append("' ");
}
whereSql.append(" and ( endstatus = 'register' or endstatus = 'has_paybill' ) ");
Collection<ActionVO> actionVOs = ((IMDPersistenceQueryService) NCLocator.getInstance()
.lookup(IMDPersistenceQueryService.class))
@SuppressWarnings("unchecked")
Collection<ActionVO> actionVOs = NCLocator.getInstance().lookup(IMDPersistenceQueryService.class)
.queryBillOfVOByCond(ActionVO.class, whereSql.toString(), false);
boolean returnedBill = false;
if (null != actionVOs && actionVOs.size() > 0) {
@ -311,34 +393,43 @@ public class GatherExcelImport4NCCImpl extends AbstractImportProceeWithContext {
}
registerVO.setReturnedbill(UFBoolean.valueOf(returnedBill));
}
/**
* 根据电票签约账号查询客商银行账户信息
*/
private BankAccbasVO getBankAccbasVOByReceiveaccount(RegisterVO pvo) throws BusinessException {
StringBuffer whereSql = new StringBuffer();
whereSql.append(" pk_bankaccbas = (select pk_bankaccbas from bd_bankaccsub where pk_bankaccsub = '");
whereSql.append(NCESAPI.sqlEncode(pvo.getReceiveaccount()));
whereSql.append("' ) ");
IMDPersistenceQueryService service = (IMDPersistenceQueryService) NCLocator.getInstance()
.lookup(IMDPersistenceQueryService.class);
Collection<BankAccbasVO> accbasVOs = service.queryBillOfVOByCond(BankAccbasVO.class, whereSql.toString(),
false);
if (accbasVOs != null && accbasVOs.size() > 0
&& ((BankAccbasVO[]) accbasVOs.toArray(new BankAccbasVO[0]))[0] != null) {
return ((BankAccbasVO[]) accbasVOs.toArray(new BankAccbasVO[0]))[0];
IMDPersistenceQueryService service = NCLocator.getInstance().lookup(IMDPersistenceQueryService.class);
@SuppressWarnings("unchecked")
Collection<BankAccbasVO> accbasVOs = service.queryBillOfVOByCond(BankAccbasVO.class, whereSql.toString(), false);
if (accbasVOs != null && accbasVOs.size() > 0 && accbasVOs.toArray(new BankAccbasVO[0])[0] != null) {
return accbasVOs.toArray(new BankAccbasVO[0])[0];
} else {
String var10002 = pvo.getFbmbillno();
throw new BusinessException(
var10002 + NCLangRes4VoTransl.getNCLangRes().getStrByID("3618ncc_0", "03618ncc-0077"));
throw new BusinessException(pvo.getFbmbillno() + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
.getStrByID("3618ncc_0", "03618ncc-0077")/* @res "查询电票签约账号对应账户信息异常!" */);
}
}
/**
* 根据电票签约账号查询银行类别
*/
private BankdocVO getBanktypeByReceiveaccount(String receiveaccount) throws BusinessException {
StringBuffer whereSql = new StringBuffer();
whereSql.append(" pk_bankdoc = (select pk_bankdoc from bd_bankaccbas where pk_bankaccbas = ");
whereSql.append("(select pk_bankaccbas from bd_bankaccsub where pk_bankaccsub = '");
whereSql.append(NCESAPI.sqlEncode(receiveaccount));
whereSql.append("') ) ");
BankdocVO[] bankdocVO = ((IBankdocQueryService) NCLocator.getInstance().lookup(IBankdocQueryService.class))
// 调银行档案接口根据收票账号(子户)查询对应的开户银行VO
BankdocVO[] bankdocVO = NCLocator.getInstance().lookup(IBankdocQueryService.class)
.queryBankdocVOsByCon(whereSql.toString());
return bankdocVO != null && bankdocVO.length != 0 ? bankdocVO[0] : null;
if (bankdocVO != null && bankdocVO.length != 0) {
return bankdocVO[0];
}
return null;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,839 @@
package nc.bs.gl.glvoucher.processor.fip;
import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.gl.dao.GLBaseDAO;
import nc.bs.gl.voucher.service.TempTableUtils;
import nc.gl.utils.GLNumUtils;
import nc.impl.gl.pub.TempTableCreater;
import nc.itf.gl.pub.ICashFlowCase;
import nc.jdbc.framework.processor.BeanListProcessor;
import nc.vo.fi.pub.SqlUtils;
import nc.vo.fip.external.FipBillSumRSVO;
import nc.vo.fip.service.FipRelationInfoVO;
import nc.vo.fipub.freevalue.GlAssVO;
import nc.vo.fipub.freevalue.Module;
import nc.vo.fipub.utils.StrTools;
import nc.vo.gateway60.itfs.AssByPkThreadCache;
import nc.vo.gl.cashflowcase.CashflowcaseVO;
import nc.vo.gl.glvoucher.AggNVoucherVO;
import nc.vo.gl.glvoucher.NDetailVO;
import nc.vo.gl.glvoucher.NVoucherVO;
import nc.vo.glcom.ass.AssVO;
import nc.vo.glcom.constant.GLVoucherKindConst;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.pub.MapList;
import nc.vo.voucher.fip.SchemeConst;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class NVoucherSumInDBProcessor extends NVoucherSumProcessor {
public NVoucherSumInDBProcessor(String pk_sumrule) {
super(pk_sumrule);
}
private Map<String, NVoucherVO> mergedHead = new HashMap<>();
private MapList<String, NDetailVO> detailContainer = new MapList<>();
private MapList<String, String> groupedRelationIdMap = new MapList<>();
private MapList<String, FipRelationInfoVO> groupedRelationVOMap = new MapList<>();
private Map<String, AssVO[]> assVOMap = new HashMap<>();
private String groupTempTableName;
@Override
public List<FipBillSumRSVO> processSumData(List<FipBillSumRSVO> sumRSVOs) throws BusinessException {
fillGroupedRelationMap(sumRSVOs);
createGroupTempTable();
prepareGroupTempTableData();
generateMergedHead();
loadSchemeInfo();
sumDetail();
List<AggNVoucherVO> aggVouchers = constructVouchers();
List<FipBillSumRSVO> results = new ArrayList<>();
for(AggNVoucherVO aggVoucher : aggVouchers) {
NVoucherSupply4FipProcessor supplyProcessor = new NVoucherSupply4FipProcessor(aggVoucher);
supplyProcessor.process();
FipBillSumRSVO sumRSVO = new FipBillSumRSVO();
sumRSVO.setBillVO(aggVoucher);
NVoucherVO voucher = aggVoucher.getParentVO();
String groupId = (String)voucher.getAttributeValue("groupid");
sumRSVO.setRelationvos(groupedRelationVOMap.get(groupId).toArray(new FipRelationInfoVO[0]));
sumRSVO.setMessageinfo(generateMsgInfo(aggVoucher));
results.add(sumRSVO);
}
return results;
}
private void fillGroupedRelationMap(Collection<FipBillSumRSVO> sumRsVOs) {
int groupIndex = 0; //分组号
for(FipBillSumRSVO sumRSVO : sumRsVOs) {
FipRelationInfoVO[] relationInfos = sumRSVO.getRelationvos();
if(relationInfos == null || relationInfos.length == 0) {
continue;
}
String groupNO = generateGroupNO(++groupIndex);
for(FipRelationInfoVO relationInfo : relationInfos) {
groupedRelationIdMap.put(groupNO, relationInfo.getRelationID());
groupedRelationVOMap.put(groupNO, relationInfo);
}
}
}
private String generateGroupNO(int groupIndex) {
int maxLength = 8;
String groupNO = StrTools.supplementStr(groupIndex, maxLength, '0', true);
return groupNO;
}
private void createGroupTempTable() throws BusinessException {
String[] columns = new String[]{"pk_voucher", "pk_detail", "groupid"};
int[] coltype = new int[] {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR};
try {
groupTempTableName = TempTableCreater.createTempTable("tmp_gl_fipsum", columns, coltype);
} catch (SQLException e) {
throw new BusinessException(e);
}
}
/**
* 准备分组临时表数据
* @throws BusinessException
*/
private void prepareGroupTempTableData() throws BusinessException {
String[] columns = new String[] {"pk_voucher", "groupid"};
List<Object[]> datas = new ArrayList<>();
for(String groupId : groupedRelationIdMap.keySet()) {
List<String> pk_vouchers = groupedRelationIdMap.get(groupId);
for(String pk_voucher : pk_vouchers) {
Object[] data = new Object[] {pk_voucher, groupId};
datas.add(data);
}
}
new GLBaseDAO().excuteInsertBatch(groupTempTableName, columns, datas);
}
/**
* 生成主表合并后数据
* @throws BusinessException
*/
private void generateMergedHead() throws BusinessException {
String sql = generateMergeHeadSql();
List<NVoucherVO> vouchers = new GLBaseDAO().excuteQuery(sql, NVoucherVO.class);
if(vouchers==null || vouchers.size()==0) {
throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0",
"0glnvoucher-0114")/* "查询不到临时凭证,可能是冻结状态" */);
}
//针对合并凭证需要用的制单人转换模板制单人设置公式其余单据不设置用min取设置公式的制单人 sunfj
if(StrTools.isEmptyStr((vouchers.get(0)).getPk_prepared())) {
String sql2 = sql.replace("max(pk_prepared) as pk_prepared","min(pk_prepared) as pk_prepared " );
List<NVoucherVO> vouchers2 = new GLBaseDAO().excuteQuery(sql2, NVoucherVO.class);
if(vouchers2 != null && !vouchers2.isEmpty()) {
vouchers = vouchers2;
}
}
for(NVoucherVO voucher : vouchers) {
//补充制单人
if(StrTools.isEmptyStr(voucher.getPk_prepared())) {
voucher.setPk_prepared(InvocationInfoProxy.getInstance().getUserId());
}
if(voucher.getVoucherkind() == null) {
voucher.setVoucherkind(GLVoucherKindConst.NORMAL);
}
if(voucher.getPk_exratetype2() == null) {
// RateTypeVO rateTypeVO = new RateTypeThreadCache().getRateTypeByPk_Accountingbook(voucher.getPk_accountingbook());
// String pk_exratetype2 = RateUtil.getInstance(voucher.getPk_accountingbook()).getDefaultPk_exratetype();//TODO 添加缓存缓存
// voucher.setPk_exratetype2(rateTypeVO.getPk_ratetype());
}
//FIXME 重置adjustperiod测试提问题前台生成列表页面 期间都是空的受不了了
if(voucher.getAdjustperiod() == null && voucher.getPeriod()!=null) {
voucher.setAdjustperiod(voucher.getPeriod());
}
String groupid = (String)voucher.getAttributeValue("groupid");
if(mergedHead.get(groupid) != null) {
throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0","0glnvoucher-0014")/*@res "数据中因为有些字段不同,有不能合并成一张凭证的情况,请检查下面的字段是否相同:集团,组织,财务核算账簿,凭证类别,交易类型,自定义项。"*/);
}
mergedHead.put(groupid, voucher);
}
combinSystem();
}
private void loadSchemeInfo() throws BusinessException {
NVoucherVO voucher = mergedHead.values().toArray(new NVoucherVO[0])[0];
String pk_accountingbook = voucher.getPk_accountingbook();
String versionDate = voucher.getPrepareddate().toStdString();
loadSchemeInfo(pk_accountingbook, versionDate);
}
private void sumDetail() throws BusinessException {
String[] sumSqls = getSumSql();
String[] normalSqls = getNormalSql();
String[] sumConditions = getSumConditions();
String unSumCondition = getUnSumCondition();
if(sumConditions != null && sumConditions.length > 0) {
for(String sumCondition : sumConditions) {
String sql = sumSqls[0] + sumSqls[1] + sumSqls[2] + sumCondition + sumSqls[3] + sumSqls[4];
MapList<String, NDetailVO> results = queryDetailsBySql(sql);
//cat 现金流量
catCashFlowCaseForSum(results, sumSqls[3].substring(6), sumSqls[1], sumCondition);
mixDetail(detailContainer, results);
}
}
if(isCombinSameAccount()) {
if(unSumCondition != null && unSumCondition.length() > 0) {
String sql = normalSqls[0] + normalSqls[1] + normalSqls[2] + unSumCondition + normalSqls[3] + normalSqls[4];
MapList<String, NDetailVO> results = queryDetailsBySql(sql);
//cat 现金流量
catCashFlowCase(results);
mixDetail(detailContainer, results);
}
}else {
String sql = normalSqls[0] + normalSqls[1] + normalSqls[2] + unSumCondition + normalSqls[3] + normalSqls[4];
MapList<String, NDetailVO> results = queryDetailsBySql(sql);
//cat 现金流量
catCashFlowCase(results);
mixDetail(detailContainer, results);
}
}
/**
* 构造凭证
* modify 2022-02-23 没有分录返回主表信息
* @return
* @throws BusinessException
*/
private List<AggNVoucherVO> constructVouchers() throws BusinessException{
List<AggNVoucherVO> results= new ArrayList<>();
//加载辅助核算信息
loadAssInfo();
//TODO 加载科目信息
String[] groupIds = groupedRelationIdMap.keySet().toArray(new String[0]);
Arrays.sort(groupIds);//分组id排序
for(String groupid : groupIds) {
NVoucherVO voucher = mergedHead.get(groupid);
List<NDetailVO> details = detailContainer.get(groupid);
if(details == null) {
details = new ArrayList<>();
}
//补充ASSVO
for(NDetailVO detail : details) {
if(StrTools.isEmptyStr(detail.getAssid())) {
continue;
}
if(detail.getAssvos() == null) {
AssVO[] assVOs = assVOMap.get(detail.getAssid());
detail.setAssvos(assVOs);
}
}
AggNVoucherVO aggVoucher = combinAggVoucher(voucher, details);
results.add(aggVoucher);
}
return results;
}
/**
* 生成合并表头的sql
* TODO 交易类型
* @return
*/
private String generateMergeHeadSql() {
StringBuilder sql = new StringBuilder();
sql.append("select b.groupid as groupid,pk_group, pk_org,pk_accountingbook,pk_vouchertype, pk_tradetype, 'C0' as pk_billtype, ")
.append("max(year) as year, max(period) as period, 0 as no, max(prepareddate) as prepareddate, null as pk_system,")
.append(" null as tallydate, sum(attachment) as attachment, max(pk_prepared) as pk_prepared, null as checker, null as casher, ")
.append(" null as manager, min(signflag) as signflag, min(modifyflag) as modifyflag, 'N' as discardflag, max(addclass) as addclass,")
.append(" max(deleteclass) as deleteclass, min(DETAILMODFLAG) as detailModflag, ")
.append(" null as pk_billtype, ");
for(int i = 1; i<= 30; i++) {
sql.append(" vdef").append(i).append(",");
}
sql.append(" null as pk_voucher, max(pk_exratetype2) as pk_exratetype2 ");
sql.append("from gl_rtvoucher a inner join ").append(groupTempTableName).append(" b on a.pk_voucher = b.pk_voucher ");
sql.append("group by groupid,pk_group,pk_org,pk_accountingbook,pk_vouchertype,pk_tradetype,");
for(int i = 1; i<= 30; i++) {
sql.append(" vdef").append(i).append(",");
}
sql.deleteCharAt(sql.length() - 1);
return sql.toString();
}
/**
* 合并制单系统
* @throws DAOException
*/
private void combinSystem() throws DAOException {
Map<String, String> combinSystemMap = queryCombinSystem();
for(String groupid : mergedHead.keySet()) {
NVoucherVO voucher = mergedHead.get(groupid);
voucher.setPk_system(combinSystemMap.get(groupid));
}
}
/**
* 查询制单系统
* @return
* @throws DAOException
*/
private Map<String, String> queryCombinSystem() throws DAOException{
String sql = "select distinct groupid,pk_system from gl_rtvoucher a inner join "
+ groupTempTableName + " b on a.pk_voucher = b.pk_voucher where isnull(groupid, '~') <> '~'";
List<Map<String, Object>> groupSystemList = new GLBaseDAO().excuteQuery(sql);
MapList<String, String> groupedSystem = new MapList<>();
for(Map<String, Object> groupSystem : groupSystemList) {
String pk_system = (String)groupSystem.get("pk_system");
if(pk_system != null) {
groupedSystem.put((String)groupSystem.get("groupid"), pk_system.trim());
}
}
Map<String, String> result = new HashMap<>();
for(String groupid : groupedSystem.keySet()) {
List<String> systems = groupedSystem.get(groupid);
if(systems != null && systems.size() > 0) {
//去重
Set<String> systemSet = new LinkedHashSet<String>();
systemSet.addAll(systems);
result.put(groupid, StrTools.join(systemSet.iterator(), ","));
}
}
return result;
}
/**
* 0 select
* 1 from
* 2 where
* 3 group
* 4 order
* @return
*/
private String[] getSumSql() {
String[] results = new String[5];
results[0] = generateSumSelectSql();
results[1] = " from gl_rtdetail a inner join " + groupTempTableName + " b on a.pk_voucher = b.pk_voucher ";
results[2] = " where a.dr = 0 ";
results[3] = generateSumGroupSql();
results[4] = " order by groupid ";
if(isCombinExplan()) {
results[0] = results[0].replaceFirst("a.explanation", "max(a.explanation)");
results[3] = results[3].replaceFirst(",a.explanation,", ",");
}
if(isCombinPrice()) {
results[0] = results[0].replaceFirst("a.price", "sum(a.price)");
results[3] = results[3].replaceFirst(", a.price,", ",");
}
if(isCombinExrateInfo()) {
results[0] = results[0].replaceFirst("a." + NDetailVO.PK_EXRATETYPE2, "max(a." + NDetailVO.PK_EXRATETYPE2 + ")");
results[0] = results[0].replaceFirst("a." + NDetailVO.EXRATEDATE2, "max(a." + NDetailVO.EXRATEDATE2 + ")");
results[3] = results[3].replaceFirst(", " + NDetailVO.PK_EXRATETYPE2 + ",", ",");
results[3] = results[3].replaceFirst(", " + NDetailVO.EXRATEDATE2 + ",", ",");
}
return results;
}
/**
* 0 select
* 1 from
* 2 where
* 3 group
* 4 order
* @return
*/
private String[] getNormalSql() {
String[] results = new String[5];
results[0] = generateNormalSelectSql();
results[1] = " from gl_rtdetail a inner join " + groupTempTableName + " b on a.pk_voucher = b.pk_voucher ";
results[2] = " where a.dr = 0 ";
results[3] = "";
results[4] = " order by groupid ";
return results;
}
private List<String[]> generateDetailFields() {
/**
* 第一个字段 a
* 第二个字段
* "null" => null as a
* null => a as a
* min => min(a) as a
* max => max(a) as a
* sum => sum(a) as a
*/
List<String[]> fields = new ArrayList<>();
fields.add(new String[] {NDetailVO.PK_DETAIL, "min"});
fields.add(new String[] {NDetailVO.NOV, "null"});
fields.add(new String[] {NDetailVO.OPPOSITESUBJ, "null"});
fields.add(new String[] {NDetailVO.BANKACCOUNT, null});
fields.add(new String[] {NDetailVO.PK_VOUCHER, "null"});
fields.add(new String[] {NDetailVO.PK_ORG, "min"});
fields.add(new String[] {NDetailVO.MODIFYFLAG, "min"});
fields.add(new String[] {NDetailVO.RECIEPTCLASS, "min"});
fields.add(new String[] {NDetailVO.DEBITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.DEBITQUANTITY, "sum"});
fields.add(new String[] {NDetailVO.LOCALDEBITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.GROUPDEBITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.GLOBALDEBITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.CREDITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.CREDITQUANTITY, "sum"});
fields.add(new String[] {NDetailVO.LOCALCREDITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.GROUPCREDITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.GLOBALCREDITAMOUNT, "sum"});
fields.add(new String[] {NDetailVO.PK_ACCOUNTINGBOOK, null});
fields.add(new String[] {NDetailVO.PK_UNIT, null});
fields.add(new String[] {NDetailVO.PK_UNIT_V, null});
fields.add(new String[] {NDetailVO.PK_VOUCHERTYPEV, null});
fields.add(new String[] {NDetailVO.YEARV, null});
fields.add(new String[] {NDetailVO.PERIODV, null});
fields.add(new String[] {NDetailVO.EXPLANATION, null});
fields.add(new String[] {NDetailVO.PK_ACCASOA, null});
fields.add(new String[] {NDetailVO.ASSID, null});
fields.add(new String[] {NDetailVO.PK_CURRTYPE, null});
fields.add(new String[] {NDetailVO.PRICE, null});
fields.add(new String[] {NDetailVO.EXCRATE2, null});
fields.add(new String[] {NDetailVO.EXCRATE3, null});
fields.add(new String[] {NDetailVO.EXCRATE4, null});
fields.add(new String[] {NDetailVO.CHECKSTYLE, null});
fields.add(new String[] {NDetailVO.CHECKNO, null});
fields.add(new String[] {NDetailVO.CHECKDATE, null});
fields.add(new String[] {NDetailVO.BILLTYPE, null});
fields.add(new String[] {NDetailVO.BUSIRECONNO, null});
fields.add(new String[] {NDetailVO.NETBANKFLAG, null});
fields.add(new String[] {NDetailVO.VERIFYDATE, null});
fields.add(new String[] {NDetailVO.VERIFYNO, null});
fields.add(new String[] {NDetailVO.PK_LIABILITYCENTER, null});
fields.add(new String[] {NDetailVO.PK_LIABILITYCENTER_V, null});
fields.add(new String[] {NDetailVO.PK_EXRATETYPE2, null});
fields.add(new String[] {NDetailVO.EXRATEDATE2, null});
fields.add(new String[] {NDetailVO.DUEDATE, null});
fields.add(new String[] {NDetailVO.ORDERSTR, "max"});
for(int i = 1; i <= 80 ;i ++) {
fields.add(new String[] {"vbdef" + i, null});
}
return fields;
}
private String generateSumColumnStr(String tableAlias, String[] field) {
StringBuilder columnStr = new StringBuilder(" ");
String fieldName = field[0];
String oper = field[1];
if(oper == null) {
columnStr.append(tableAlias).append(".").append(fieldName);
}else if(oper.equals("null")) {
columnStr.append("null");
}else if(oper.equals("sum")) {
columnStr.append("sum(").append(tableAlias).append(".").append(fieldName).append(")");
}else if(oper.equals("min")) {
columnStr.append("min(").append(tableAlias).append(".").append(fieldName).append(")");
}else if(oper.equals("max")){
columnStr.append("max(").append(tableAlias).append(".").append(fieldName).append(")");
}
columnStr.append(" as ").append(fieldName);
return columnStr.toString();
}
private String generateSumSelectSql() {
StringBuilder selectSql = new StringBuilder("select ");
List<String[]> fields = generateDetailFields();
for(String[] field : fields) {
selectSql.append(generateSumColumnStr("a", field));
selectSql.append(", ");
}
selectSql.append("b.groupid as groupid ");
return selectSql.toString();
}
private String generateSumGroupSql() {
StringBuilder groupSql = new StringBuilder();
groupSql.append(" group by b.groupid,a.pk_accountingbook,a.pk_unit,a.pk_unit_v,pk_vouchertypev,yearv,periodv,a.explanation,");
groupSql.append(" a.pk_accasoa, assid, pk_currtype, a.price, excrate2, excrate3,excrate4,bankaccount,checkstyle, checkno,");
groupSql.append(" checkdate, billtype, innerbusno, innerbusdate, busireconno,netbankflag, verifydate, verifyno, ");
groupSql.append(" pk_liabilitycenter, pk_liabilitycenter_v, duedate, ");
for(int i = 1; i <= 80; i++) {
groupSql.append("vbdef").append(i).append(",");
}
groupSql.append(" pk_exratetype2, exratedate2 ");
return groupSql.toString();
}
private String generateNormalSelectSql() {
StringBuilder selectSql = new StringBuilder();
selectSql.append("select ");
List<String[]> fields = generateDetailFields();
for(String[] field : fields) {
selectSql.append(" a.").append(field[0]).append(" as ").append(field[0]);
selectSql.append(", ");
}
selectSql.append(" b.groupid as groupid ");
return selectSql.toString();
}
/**
* 构造需要合并的查询条件
* @return
* @throws BusinessException
*/
private String[] getSumConditions() throws BusinessException {
List<String> conditions = new ArrayList<>();
boolean isCombinAccount = isCombinSameAccount();
StringBuilder condition = new StringBuilder();
if(isCombinAccount) {//合并科目排除例外科目
//科目条件
if(getExAccountPks() != null && getExAccountPks().length > 0) {
String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE);
String notInAccountSql = inAccountSql.replaceFirst("in", "not in");
condition.append(" and ").append(notInAccountSql);
}
}else {//不合并科目则只合并例外科目
if(getExAccountPks() == null || getExAccountPks().length == 0) {
return null;
}else {
String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE);
condition.append(" and ").append(inAccountSql);
}
}
//借贷条件
if(SchemeConst.COMBINTYPE_D.equals(getCominType())){
condition.append(" and ").append("(debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) ");
conditions.add(condition.toString());
}else if(SchemeConst.COMBINTYPE_C.equals(getCominType())) {
condition.append(" and ").append("(creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) ");
conditions.add(condition.toString());
}else {
if(isCombinDiffDirection()) {
conditions.add(condition.toString());
}else {
//借方条件
String conditionDebit = condition.toString() + " and (debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) ";
conditions.add(conditionDebit);
//贷方条件
String conditionCredit = condition.toString() + " and (creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) ";
conditions.add(conditionCredit);
}
}
return conditions.toArray(new String[0]);
}
/**
* 构造不需要合并的查询条件
* @return null 说明 不合并科目且没有例外科目全部采用不合并逻辑处理
* @throws BusinessException
*/
private String getUnSumCondition() throws BusinessException {
StringBuilder condition = new StringBuilder();
if(isCombinSameAccount()) {
if(getExAccountPks() != null && getExAccountPks().length > 0) {
String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE);
condition.append(inAccountSql);
}
}else {
if(getExAccountPks() != null && getExAccountPks().length > 0) {
String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE);
String notInAccountSql = inAccountSql.replaceFirst("in", "not in");
condition.append(notInAccountSql);
}else {
return "";
}
}
if(SchemeConst.COMBINTYPE_D.equals(getCominType())) {
if(condition.length() > 0){
condition.append(" or ");
}
condition.append("(creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) ");
}else if(SchemeConst.COMBINTYPE_C.equals(getCominType())) {
if(condition.length() > 0){
condition.append(" or ");
}
condition.append(" (debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) ");
}
if(condition.length() > 0) {
condition.insert(0, " and (");
condition.append(") ");
}
return condition.toString();
}
private MapList<String, NDetailVO> queryDetailsBySql(String sql) throws DAOException{
MapList<String, NDetailVO> results = new MapList<>();
@SuppressWarnings("unchecked")
List<NDetailVO> details = (List<NDetailVO>)new BaseDAO().executeQuery(sql, new BeanListProcessor(NDetailVO.class));
if(details != null && details.size() > 0) {
for(NDetailVO detail : details) {
results.put((String)detail.getAttributeValue("groupid"), detail);
}
}
return results;
}
private void mixDetail(MapList<String, NDetailVO> container, MapList<String, NDetailVO> queryResults) {
if(queryResults != null) {
for(String key : queryResults.keySet()) {
container.putAll(key, queryResults.get(key));
}
}
}
private boolean isAllZero(NDetailVO detail) {
return GLNumUtils.allZero(
detail.getCreditquantity(), detail.getDebitquantity(),
detail.getCreditamount(), detail.getDebitamount(),
detail.getLocalcreditamount(), detail.getLocaldebitamount(),
detail.getGroupcreditamount(), detail.getGroupdebitamount(),
detail.getGlobalcreditamount(), detail.getGlobaldebitamount()
);
}
/**
* 参数顺序决定优先级
*
* result > 0
* result < 0
* result == 0
* @return
*/
private int detailDirection(UFDouble... amounts) {
for(UFDouble amount : amounts) {
if(amount.compareTo(UFDouble.ZERO_DBL) != 0) {
return amount.compareTo(UFDouble.ZERO_DBL);
}
}
return 0;
}
private int detailDirection(NDetailVO detail) {
UFDouble amount = GLNumUtils.sub(detail.getDebitamount(), detail.getCreditamount());
UFDouble quantity = GLNumUtils.sub(detail.getDebitquantity(), detail.getCreditquantity());
UFDouble localAmount = GLNumUtils.sub(detail.getLocaldebitamount(), detail.getLocalcreditamount());
UFDouble groupAmount = GLNumUtils.sub(detail.getGroupdebitamount(), detail.getGroupcreditamount());
UFDouble globalAmount = GLNumUtils.sub(detail.getGlobaldebitamount(), detail.getGlobalcreditamount());
return detailDirection(localAmount, groupAmount, globalAmount, amount, quantity);
}
private void clearAmount(NDetailVO detail, boolean isDebit) {
if(isDebit) {
detail.setDebitquantity(UFDouble.ZERO_DBL);
detail.setDebitamount(UFDouble.ZERO_DBL);
detail.setLocaldebitamount(UFDouble.ZERO_DBL);
detail.setGroupdebitamount(UFDouble.ZERO_DBL);
detail.setGlobaldebitamount(UFDouble.ZERO_DBL);
}else {
detail.setCreditquantity(UFDouble.ZERO_DBL);
detail.setCreditamount(UFDouble.ZERO_DBL);
detail.setLocalcreditamount(UFDouble.ZERO_DBL);
detail.setGroupcreditamount(UFDouble.ZERO_DBL);
detail.setGlobalcreditamount(UFDouble.ZERO_DBL);
}
}
private void loadAssInfo() throws BusinessException {
Set<String> assidSet = new HashSet<>();
for(String groupid : detailContainer.keySet()) {
List<NDetailVO> details = detailContainer.get(groupid);
if(details == null || details.size() == 0) {
continue;
}
for(NDetailVO detail : details) {
if(detail == null) {
continue;
}
if(!StrTools.isEmptyStr(detail.getAssid())) {
assidSet.add(detail.getAssid());
}
}
}
if(assidSet.size() == 0) {
return;
}
// IFreevaluePub freevalue = (IFreevaluePub) NCLocator.getInstance().lookup(IFreevaluePub.class.getName());
// GlAssVO[] glAssVOs = freevalue.queryAllByIDs(assidSet.toArray(new String[0]),null,Module.GL);
GlAssVO[] glAssVOs = AssByPkThreadCache.getInstance().getAssVO(assidSet.toArray(new String[0]), Module.GL);
if(glAssVOs != null && glAssVOs.length>0) {
for(int i=0;i<glAssVOs.length;i++) {
String assID = glAssVOs[i].getAssID();
assVOMap.put(assID, glAssVOs[i].getAssVos());
}
}
}
private void catCashFlowCaseForSum(MapList<String, NDetailVO> details, String groupByStr, String fromStr, String sumSqlWherePart) throws BusinessException {
if(details == null || details.size() == 0) {
return;
}
String querysql = "select a.pk_detail,min(a.pk_detail) over(partition " + groupByStr + ") as groupid " + fromStr + "" + (sumSqlWherePart == null ? "" : sumSqlWherePart);
String tablename = "T_DETAILGROUP";
String pkfield = "pk_detail";
String groupfield = "groupid";
try {
tablename = TempTableUtils.createTempTable(tablename, " " + pkfield + " varchar(40), " + groupfield + " varchar(40) ", null);
} catch (SQLException e) {
throw new BusinessException(e);
}
String insertsql = "insert into " + tablename + " (" + pkfield + "," + groupfield + ") (" + querysql + ")";
new GLBaseDAO().excuteUpdate(insertsql);
// 获得现金流量信息
String[] tableinfo = new String[] {
tablename, pkfield, groupfield
};
ICashFlowCase cashflowproxy = (ICashFlowCase) NCLocator.getInstance().lookup(ICashFlowCase.class.getName());
CashflowcaseVO[] cashvo = cashflowproxy.querySumCashflow4Fip(tableinfo);
if(cashvo == null || cashvo.length == 0) {
return;
}
//补充币种信息
MapList<String, CashflowcaseVO> cashflowCaseMapList = new MapList<>();
for (CashflowcaseVO cashflowcaseVO : cashvo) {
cashflowCaseMapList.put(cashflowcaseVO.getPk_detail(), cashflowcaseVO);
}
ArrayList<String> extGroup = new ArrayList<String>();// 需要展开不汇总的分组这是由于该组分录合计为0可是又有现金流量造成的
for(String groupId : details.keySet()) {
List<NDetailVO> detailList = details.get(groupId);
List<NDetailVO> newDetails = new ArrayList<>();
for(NDetailVO detail : detailList) {
List<CashflowcaseVO> cashflowList = cashflowCaseMapList.get(detail.getPk_detail());
if(cashflowList == null || cashflowList.isEmpty()) {
continue;
}
cashFlowCaseFillCurrtype(cashflowList, detail.getPk_currtype());
if(isAllZero(detail)) {
extGroup.add(detail.getPk_detail());
}else {
// 金额的校验有现金流量的分录不允许出现借贷合计为0的情况因为借贷合计为0的分录可能被删除会缺失部分现金流量数据
if(detailDirection(detail) == 0) {
NDetailVO newDetail = (NDetailVO) detail.clone();
clearAmount(detail, false);
clearAmount(newDetail, true);
newDetails.add(newDetail);
}
detail.setCashflow(cashflowList.toArray(new CashflowcaseVO[0]));
}
cashflowCaseMapList.remove(detail.getPk_detail());
}
}
if (cashflowCaseMapList.size() > 0) {
throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0","0glnvoucher-0015")/*@res "补现金流量出错,分录和现金流量表的分组不一致造成部分现金流量没有归属。"*//*-=notranslate=-*/);
}
//FIXME 原有逻辑在这里将合并后借贷为0现金流量不为0的分录补充了回来但是后续并没有使用这里先不补充
}
private void catCashFlowCase(MapList<String, NDetailVO> details) throws BusinessException {
if(details == null || details.size() == 0) {
return;
}
List<String> pk_details = new ArrayList<>();
Map<String, String> detailCurrTypeMap = new HashMap<>();
for(String groupid : details.keySet()) {
for(NDetailVO detail : details.get(groupid)) {
pk_details.add(detail.getPk_detail());
detailCurrTypeMap.put(detail.getPk_detail(), detail.getPk_currtype());
}
}
ICashFlowCase cashflowproxy = (ICashFlowCase) NCLocator.getInstance().lookup(ICashFlowCase.class.getName());
CashflowcaseVO[] cashflowcasevos = cashflowproxy.queryByPKRtDetails(pk_details.toArray(new String[0]));
if(cashflowcasevos == null || cashflowcasevos.length == 0) {
return;
}
// 如果不是总帐凭证那么这个接口读出来的CashflowcaseVO里有可能没有币种信息需要补上
for(CashflowcaseVO caseVO : cashflowcasevos) {
if(caseVO != null && StrTools.isEmptyStr(caseVO.getM_pk_currtype())) {
caseVO.setM_pk_currtype(detailCurrTypeMap.get(caseVO.getPk_detail()));
}
}
MapList<String, CashflowcaseVO> caseMapList = new MapList<>();
for(CashflowcaseVO caseVO : cashflowcasevos) {
caseMapList.put(caseVO.getPk_detail(), caseVO);
}
for(String groupid : details.keySet()) {
for(NDetailVO detail : details.get(groupid)) {
List<CashflowcaseVO> caseVOs = caseMapList.get(detail.getPk_detail());
if(caseVOs == null || caseVOs.isEmpty()) {
continue;
}
detail.setCashflow(caseVOs.toArray(new CashflowcaseVO[0]));
}
}
}
private void cashFlowCaseFillCurrtype(List<CashflowcaseVO> cashflowCases, String defaultCurrtype) {
for(CashflowcaseVO caseVO : cashflowCases) {
if(caseVO != null && StrTools.isEmptyStr(caseVO.getM_pk_currtype())) {
caseVO.setM_pk_currtype(defaultCurrtype);
}
}
}
}

View File

@ -141,12 +141,12 @@
<implementation>nccloud.api.impl.ic.atp.ATPQueryIpml</implementation>
</component>
<!--官棍속묏 흙욋데-->
<!--官棍속묏흙욋데-->
<component priority="0" singleton="true" remote="true" tx="CMT" supportAlias="true">
<interface>nccloud.api.ic.m47.IAPISubcontInMaintain</interface>
<implementation>nccloud.api.impl.ic.m47.APISubcontInMaintainImpl</implementation>
</component>
<!--官棍속묏 흙욋데-->
<!--官棍속묏흙욋데-->
</public>
</module>

View File

@ -0,0 +1,84 @@
package nccloud.web.ic.outbound.materialout.action;
import nc.itf.scmpub.reference.uap.bd.currency.CurrencyInfo;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.scmpub.res.billtype.ICBillType;
import nc.vo.scmpub.util.BillBodySortUtils;
import nccloud.commons.lang.StringUtils;
import nccloud.dto.ic.pub.entity.BillVOWithExtendInfo;
import nccloud.framework.core.json.IJson;
import nccloud.framework.service.ServiceLocator;
import nccloud.framework.web.action.itf.ICommonAction;
import nccloud.framework.web.container.IRequest;
import nccloud.framework.web.json.JsonFactory;
import nccloud.framework.web.ui.model.row.Cell;
import nccloud.framework.web.ui.pattern.billcard.BillCard;
import nccloud.pubitf.ic.pub.service.IICBillVOQueryService;
import nccloud.web.ic.pub.precision.ICBaseBillcardPrecisionHandler;
import nccloud.web.ic.pub.utils.DealDisplayIsNullUtil;
import nccloud.web.ic.ui.pattern.billcard.ICBillCardOperator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Classname QueryMaterialOutCardInfoAction
* @Description TODO
* @Version 1.0.0
* @Date 2025/6/25 16:48
* @Created by ame
*/
public class QueryMaterialOutCardInfoAction implements ICommonAction {
@Override
public Object doAction(IRequest request) {
String read = request.read();
IJson json = JsonFactory.create();
Map<String,Object> info = json.fromJson(read, Map.class);
List<String> pks = (List<String>) info.get("pks");
String pageid = (String) info.get("pageid");
String pagecodechi = (String) info.get("pagecodechi");
Map<String,Object> retmap = new HashMap();
BillVOWithExtendInfo[] billVOWithExtendInfos = ((IICBillVOQueryService) ServiceLocator.find(IICBillVOQueryService.class)).queryBillDev(ICBillType.MaterialOut, pks.toArray(new String[0]));
if(billVOWithExtendInfos!=null && billVOWithExtendInfos.length>0){
List<BillCard> billCardList=new ArrayList<>();
for(BillVOWithExtendInfo extendInfo : billVOWithExtendInfos){
BillBodySortUtils.sort(new ICBillVO[]{extendInfo.getBillvo()});
BillCard retcard = this.afterProcess(pagecodechi, pageid, extendInfo.getBillvo());
billCardList.add(retcard);
// retmap.put("isLocationManaged", extendInfo.isLocationManaged());
// retmap.put("materialSerialMap", extendInfo.getMaterialSerialMap());
// retmap.put("materialSnunitMap", extendInfo.getMaterialSnunitMap());
}
retmap.put("billcard", billCardList);
return retmap;
}else{
throw new RuntimeException(NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", "04008027-0180"));
}
}
public BillCard afterProcess(String pagecodechi, String pageid, ICBillVO vo) {
ICBillCardOperator operator = new ICBillCardOperator((String)null, pageid, pagecodechi);
BillCard retcard = operator.toCard(vo);
String ccurrencyid = (String)vo.getBody(0).getAttributeValue("ccurrencyid");
if (!StringUtils.isEmpty(ccurrencyid)) {
String name = CurrencyInfo.getName(ccurrencyid);
retcard.getBody().getModel().getListRows().forEach((row) -> {
Cell cell = new Cell();
cell.setValue(ccurrencyid);
cell.setDisplay(name);
row.addCell("ccurrencyid", cell);
});
}
ICBaseBillcardPrecisionHandler handler = this.getPrecisionHandler(retcard);
handler.process();
DealDisplayIsNullUtil.dealBillCardDisPlayIsNull(new String[]{"ccorrespondcode", "vexigencycode"}, retcard);
return retcard;
}
protected ICBaseBillcardPrecisionHandler getPrecisionHandler(BillCard card) {
return new ICBaseBillcardPrecisionHandler(card);
}
}

View File

@ -0,0 +1,65 @@
package nccloud.web.ic.pub.action;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.pubapp.res.NCModule;
import nccloud.base.reflect.NCClass;
import nccloud.dto.ic.pub.entity.GeneralSumPrintInfo;
import nccloud.framework.core.json.IJson;
import nccloud.framework.web.container.SessionContext;
import nccloud.framework.web.json.JsonFactory;
import nccloud.framework.web.processor.template.BillCardConvertProcessor;
import nccloud.framework.web.ui.pattern.billcard.BillCard;
import nccloud.pubitf.platform.print.IPrintInfo;
import nccloud.pubitf.uap.print.vo.ExtendsBatchPrintVO;
import nccloud.uap.print.action.AbstractNoPreviewPrintAction;
/**
* @description 出入库汇总打印
* @author zhegnxinm
* @date 2018-12-16 上午10:48:39
* @version ncc1.0
*/
public class GeneralSumPrintAction extends AbstractNoPreviewPrintAction {
@Override
public IPrintInfo convertPrintInfo(ExtendsBatchPrintVO info) {
IJson json = JsonFactory.create();
GeneralSumPrintInfo newinfo = json.fromJson(info.getUserjson(), GeneralSumPrintInfo.class);
newinfo.setFilename((info.getFilename() == null) ? "download-"
+ String.valueOf(System.currentTimeMillis()) : info
.getFilename());
String appcode = info.getAppcode();
String billcardStr = newinfo.getBillcard();
//注释此代码如需放开请修改前端"./src/ic/ic/components/sumPrintModal/index.js"里扩展的列表汇总billcard传值
// BillCard billcard = json.fromJson(billcardStr,BillCard.class);
if (appcode == null) {
appcode = SessionContext.getInstance().getAppcode();
}
// BillCardConvertProcessor processor = new BillCardConvertProcessor();
// ICBillVO bill = processor.fromBillCard(billcard);
newinfo.setAppcode(appcode);
newinfo.setIds(info.getOids());
newinfo.setNodeKey(info.getNodekey());
NCClass printServiceClazz = new NCClass();
printServiceClazz.setModule(getPrintServiceModule());
printServiceClazz.setName(getPrintServiceName());
newinfo.setPrintServiceClazz(printServiceClazz);
newinfo.setPrintTemplateID(info.getPrintTemplateID());
// newinfo.setData(new Object[] { bill });
newinfo.setRealData("true");
newinfo.setTotalPage(info.getTotalPage());
return newinfo;
}
@Override
public String getPrintServiceModule() {
return NCModule.IC.getName();
}
@Override
public String getPrintServiceName() {
return "nccloud.pubimpl.ic.inbound.generalin.operator.GeneralSumPrintOperator";
}
}

View File

@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<actions>
<action>
<name>ic.materialout.query</name>
<label>材料出库查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutQueryAction</clazz>
</action>
<action>
<name>ic.materialout.queryPage</name>
<label>材料出库分页信息查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutPageQueryAction</clazz>
</action>
<action>
<name>ic.materialout.maintain</name>
<label>材料出库删除</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutMaintainAction</clazz>
<btncode>Delete,UnSign,Sign</btncode>
</action>
<action>
<name>ic.materialout.save</name>
<label>材料出库单保存</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutSaveAction</clazz>
<btncode>Save</btncode>
</action>
<action>
<name>ic.materialout.canbecopy</name>
<label>材料出库单查询是否可以复制</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutBeforeCopyAction</clazz>
</action>
<action>
<name>ic.materialout.copy</name>
<label>材料出库单复制</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutCopyAction</clazz>
<btncode>Copy</btncode>
</action>
<action>
<name>ic.materialout.importSrcBillSN</name>
<label>材料出库单导入来源单据序列号</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutImportSrcSNAction</clazz>
<btncode>ImportSrcBillSN</btncode>
</action>
<action>
<name>ic.materialout.cardquery</name>
<label>材料出库卡片态查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutQueryCardAction</clazz>
</action>
<action>
<name>ic.materialout.query422x</name>
<label>材料出库拉单查询物资需求申请单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.Query422xFor4DAction</clazz>
</action>
<action>
<name>ic.materialout.query4B36</name>
<label>材料出库拉单查询维修工单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.Query4B36For4DAction</clazz>
</action>
<action>
<name>ic.materialout.query4455</name>
<label>材料出库拉单查询出库申请单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.Query4455For4DAction</clazz>
</action>
<action>
<name>ic.materialout.queryall</name>
<label>材料出库拉单查询所有</label>
<clazz>nccloud.web.ic.outbound.materialout.action.QueryAllFor4DAction</clazz>
</action>
<action>
<name>ic.materialout.transfervo</name>
<label>材料出库转单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.TransToMaterialOutAction</clazz>
</action>
<action>
<name>ic.materialout.pickauto</name>
<label>材料出库自动拣货</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutPickAutoAction</clazz>
<btncode>PickAuto</btncode>
</action>
<action>
<name>ic.materialout.print</name>
<label>材料出库打印</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutPrintAction</clazz>
<btncode>Print,output,Print_list</btncode>
</action>
<action>
<name>ic.materialout.printloc</name>
<label>材料出库打印货位</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutPrintLocAction</clazz>
<btncode>PrintLoc</btncode>
</action>
<action>
<name>ic.materialout.combine</name>
<label>材料出库合并显示</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutCombineAction</clazz>
<btncode>CombinePrint</btncode>
</action>
<action>
<name>ic.materialout.checkprem</name>
<label>材料出库修改、打印校验权限</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutDataPermissionAction</clazz>
<btncode>Edit,Print</btncode>
</action>
<action>
<name>ic.materialout.headAfterEdit</name>
<label>材料出库表头区域改变事件</label>
<clazz>nccloud.web.ic.outbound.materialout.events.MaterialOutHeadAfterEventAction</clazz>
</action>
<action>
<name>ic.materialout.bodyAfterEdit</name>
<label>材料出库表体区域改变事件</label>
<clazz>nccloud.web.ic.outbound.materialout.events.MaterialOutBodyAfterEditAction</clazz>
</action>
<action>
<name>ic.materialout.locationquery</name>
<label>材料出库单货位序列号查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutLocationQueryAction</clazz>
</action>
<action>
<name>ic.materialout.queryMMbill</name>
<label>材料出库单货位序列号查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.QueryMMbillAction</clazz>
</action>
<action>
<name>ic.materialout.generateCard</name>
<label>材料出库单生成设备卡片(取消生成)</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutGenerateEquipCardAction</clazz>
<btncode>Generate4A00,Cancel4A00</btncode>
</action>
<action>
<name>ic.materialout.frominvcount</name>
<label>盘点跳转材料出-转数据</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutFromInvcountAdjustAction</clazz>
</action>
<action>
<name>ic.materialout.frompurchasein</name>
<label>采购入库跳转材料出-转数据</label>
<clazz>nccloud.web.ic.outbound.materialout.action.PurchaseIn2MaterialOutAction</clazz>
</action>
<action>
<name>ic.materialout.dealratio</name>
<label>材料出库单-配比出库处理数据(弹框内)</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutDealRatioDataAction</clazz>
</action>
<action>
<name>ic.materialout.delRowCheck</name>
<label>材料出库卡片删行校验</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutDelRowCheckAction</clazz>
</action>
<action>
<name>ic.generalout.query4A</name>
<label>参照入库单生单查询</label>
<clazz>nccloud.web.ic.outbound.materialout.action.Query4A60for4DAction</clazz>
</action>
<action>
<name>ic.materialout.generatehj</name>
<label>材料出库卡片生成转固单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutFixedAssetAction</clazz>
</action>
<action>
<name>ic.materialout.delMaterialOutAssetbill</name>
<label>材料出库卡片取消生成转固单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.MaterialOutDelFixedAssetAction</clazz>
</action>
<action>
<name>ic.materialout.onhandOut</name>
<label>存量出库生成材料出库单</label>
<clazz>nccloud.web.ic.outbound.materialout.action.OnhandToMaterialOutAction</clazz>
</action>
<action>
<name>ic.materialout.queryCardByPKs</name>
<label>根据主键查询卡片信息</label>
<clazz>nccloud.web.ic.outbound.materialout.action.QueryMaterialOutCardInfoAction</clazz>
</action>
</actions>

View File

@ -0,0 +1,46 @@
<authorizes>
<authorize>
<appcode>400801214,400802200</appcode>
<actions>
<action>ic.materialout.query</action>
<action>ic.materialout.queryPage</action>
<action>ic.saleout.queryAddBtn</action>
<action>ic.materialout.maintain</action>
<action>ic.materialout.save</action>
<action>ic.materialout.canbecopy</action>
<action>ic.materialout.copy</action>
<action>ic.materialout.importSrcBillSN</action>
<action>ic.materialout.cardquery</action>
<action>ic.materialout.query422x</action>
<action>ic.materialout.query4455</action>
<action>ic.materialout.query4B36</action>
<action>ic.materialout.queryall</action>
<action>ic.generalout.queryin</action>
<action>ic.materialout.transfervo</action>
<action>ic.materialout.pickauto</action>
<action>ic.materialout.print</action>
<action>ic.materialout.printloc</action>
<action>ic.materialout.combine</action>
<action>ic.materialout.checkprem</action>
<action>ic.materialout.headAfterEdit</action>
<action>ic.materialout.bodyAfterEdit</action>
<action>ic.materialout.locationquery</action>
<action>ic.materialout.queryMMbill</action>
<action>ic.materialout.generateCard</action>
<action>ic.materialout.frominvcount</action>
<action>ic.materialout.frompurchasein</action>
<action>ic.materialout.dealratio</action>
<action>ic.materialout.delRowCheck</action>
<action>ic.materialout.generatehj</action>
<action>ic.materialout.delMaterialOutAssetbill</action>
<action>ic.materialout.onhandOut</action>
<action>ic.materialout.queryCardByPKs</action>
</actions>
</authorize>
<authorize>
<appcode>400802000,400802004,400800808,400800816</appcode>
<actions>
<action>ic.materialout.queryMMbill</action>
</actions>
</authorize>
</authorizes>

View File

@ -95,7 +95,7 @@ public class InsertBP implements IInsertBP<SaleOutVO>,
// 2020年3月2日 新增保存移动业务消息
processor.addAfterRule(new MobAfterSaveMessageRule());
//2025年5月27日 新增保存推送锐制
//2025年5月27日新增保存推送锐制
processor.addAfterFinalRule(new AfterSigningSynchronizeRuleRZ());
}

View File

@ -50,10 +50,10 @@ public class SignBP implements ISignBP<SaleOutVO>, ISignRuleProvider<SaleOutVO>
processor.addAfterRule(new ArsubToVoucherRule());
processor.addAfterRule(new SaleOutProceedsRuleCG());
processor.addAfterRule(new MobAfterSignMessageRule());
// 销售出库 多一个步骤 先提交销售交货单 与同步销售出库单的orderNo一致
processor.addAfterRule(new SalesDeliveryOrderRuleMES());
// 销售出库 多一个步骤先提交销售交货单 与同步销售出库单的orderNo一致
// processor.addAfterRule(new SalesDeliveryOrderRuleMES());
// 销售出库 签字后 同步到MES金思维系统
processor.addAfterRule(new AfterSigningSynchronizeRuleMES());
// processor.addAfterRule(new AfterSigningSynchronizeRuleMES());
// 盘点审批后传MES
}

View File

@ -32,7 +32,7 @@ import java.util.List;
* @Description TODO
* @Version 1.0.0
* @Date 2025/5/16 9:01
* @Created by ame
* @Created by sdlizheng
*/
public class AfterSigningSynchronizeRuleRZ implements IRule<SaleOutVO> {
private static Log log = Log.getInstance("rzmomlog");

View File

@ -35,7 +35,7 @@ public class APISubcontInMaintainImpl implements IAPISubcontInMaintain {
checker.check(vos);
// 2编码翻译成pk
aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList);
// キュメ<EFBFBD><EFBFBD>
// 3翻译货位
ICAPILocationVOUtils.translate(vos);
new SubcontInSaveFillValue().setDefaultValue(vos);

View File

@ -25,10 +25,7 @@ public class CheckSubcontInSaveValidator extends VONullValidate {
public String[] getHeadNotNullFields() {
// TODO Auto-generated method stub
//组织仓库出入库类型编码
String[] headnames =
{
ICPubMetaNameConst.PK_ORG, ICPubMetaNameConst.CWAREHOUSEID, ICPubMetaNameConst.VTRANTYPECODE
};
String[] headnames ={ICPubMetaNameConst.PK_ORG, ICPubMetaNameConst.CWAREHOUSEID, ICPubMetaNameConst.VTRANTYPECODE};
return headnames;
}

View File

@ -19,7 +19,7 @@ import nccloud.api.impl.ic.m47.rule.Choose47DefaultFillRule;
* @Description TODO
* @Version 1.0.0
* @Date 2025/5/15 10:10
* @Created by ame
* @Created by sdlizheng
*/
public class SubcontInSaveFillValue {
public void setDefaultValue(SubcontInVO[] vos) {
@ -61,7 +61,7 @@ public class SubcontInSaveFillValue {
// 数量金额汇率税率处理
rule = new ICBodyNshouldassistnumCal<SubcontInVO>();
processer.addFillvalueRule(rule);
//执行
processer.fillvalue(vos);
}

View File

@ -25,9 +25,9 @@ public class Choose47DefaultFillRule<E extends SubcontInVO> extends ICRule<E> {
@Override
public void process(E[] vos) {
for (E billvo : vos) {
// <EFBFBD>מ³ה<EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD>µ
//<EFBFBD>מ³ה<EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD>µ
setDefultInfo(billvo);
// <EFBFBD>ט<EFBFBD><EFBFBD>²<EFBFBD><EFBFBD>ס<EFBFBD>י<EFBFBD>¯,±<EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD>ט<EFBFBD><EFBFBD>²<EFBFBD><EFBFBD>ס<EFBFBD>י<EFBFBD>¯,±<EFBFBD><EFBFBD><EFBFBD>
setFanaceorgValue(billvo);
}
}

View File

@ -63,7 +63,7 @@ public class APISaleOutMaintainImpl implements IAPISaleOutMaintain {
aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList);
// ·­Òë»õλ
ICAPILocationVOUtils.translate(vos);
// 其他数据填充
//其他数据填充
new SaleOutSaveFillValue().setDefaultValue(vos);
return (SaleOutVO[]) PfServiceScmUtil.processBatch("WRITE", "4C", vos, null,

View File

@ -79,7 +79,7 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{
new MaterialOutSaveFillValue().setDefaultValue(vos);
IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class);
//设置每行行号
// 设置每行行号
setMaterialOutRowNum(vos);
return materialOut.insertBills(vos);
}

View File

@ -78,7 +78,7 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery {
}
}
//±<EFBFBD><EFBFBD>ה<EFBFBD>מ<EFBFBD>£<EFBFBD>י
// ±<EFBFBD><EFBFBD>ה<EFBFBD>מ<EFBFBD>£<EFBFBD>י
private void requiredFieldCheck(String[] requiredField, Map<String, Object> paramMap) {
for (String field : requiredField) {
Object keyValue = paramMap.get(field);

View File

@ -0,0 +1,369 @@
package nccloud.pubimpl.ic.inbound.generalin.operator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.data.bill.BillQuery;
import nc.ui.pub.print.IDataSource;
import nc.ui.pub.print.IMetaDataDataSource;
import nc.vo.ic.general.define.ICBillBodyVO;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ic.general.define.MetaNameConst;
import nc.vo.ic.m45.entity.PurchaseInVO;
import nc.vo.ic.m4d.entity.MaterialOutVO;
import nc.vo.ic.pub.define.ICPubMetaNameConst;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.SuperVO;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pub.lang.UFTime;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
import nc.vo.pubapp.pattern.model.entity.view.AbstractDataView;
import nc.vo.pubapp.scale.BillVOScaleProcessor;
import nc.vo.pubapp.scale.TotalValueVOScaleProcessor;
import nc.vo.pubapp.util.DefaultVOMerger;
import nc.vo.scmpub.res.billtype.ICBillType;
import nc.vo.scmpub.util.BillBodySortUtils;
import nc.vo.scmpub.util.ValueCheckUtil;
import nccloud.dto.ic.pub.entity.GeneralSumPrintInfo;
import nccloud.framework.core.json.IJson;
import nccloud.framework.web.json.JsonFactory;
import nccloud.pubitf.ic.pub.service.IICBillVOQueryService;
import nccloud.pubitf.platform.print.AbstractPrintService;
import nccloud.pubitf.platform.print.IPrintInfo;
import nccloud.pubitf.scmpub.pub.print.BaseMetaPrintTimesService;
import nccloud.pubitf.scmpub.pub.print.CombinePrintInfo;
import nccloud.pubitf.scmpub.pub.print.BaseMetaPrintTimesService.MetaDataSource;
import nccloud.pubitf.uap.print.vo.NoPreviewPrintInfo;
import nccloud.pubimpl.ic.inbound.purchasein.operator.PurchaseInVOPrecisionHandler;
import nccloud.pubimpl.ic.outbound.materialout.operator.MaterialOutVOPrecisionHandler;
import nccloud.pubimpl.ic.outbound.saleout.operator.SaleOutVOPrecisionHandler;
import nccloud.pubimpl.ic.pub.print.ICBasePrintVOPrecisionHandler;
/**
* @author zhegnxinm
* @version ncc1.0
* @description 出入库汇总打印
* @date 2018-12-16 上午10:48:39
*/
public class GeneralSumPrintOperator extends BaseMetaPrintTimesService {
@Override
public IDataSource[] getDataSources(IPrintInfo info) {
GeneralSumPrintInfo printInfo = (GeneralSumPrintInfo) info;
// 获取数据
Object[] datas = this.getDatas(printInfo.getIds());
if (ValueCheckUtil.isNullORZeroLength(datas)) {
return null;
}
// 获取分组数据
List<Boolean> alGroupBy = printInfo.getAlGroupBy();
// 得到分组字段
ICBillVO cvo = (ICBillVO) datas[0];
String[] Fields = getGroupFields();
String[] saGroupField = getSelGroupFields(alGroupBy, Fields);
saGroupField = processSaGroupField(saGroupField);
DefaultVOMerger dvomerger = new DefaultVOMerger();
dvomerger.setGroupingAttr(saGroupField);
// 得到Summing字段
String[] saSummingField = null;
if (cvo.getHead().getBillType().getCode().equals(ICBillType.MaterialOut.getCode())) {
saSummingField = getSummingField((Boolean) alGroupBy.get(2));
} else {
saSummingField = getSummingField((Boolean) alGroupBy.get(2), printInfo.getInOutType());
}
dvomerger.setSummingAttr(saSummingField);
//2025年6月27日11点22分 --扩展材料出库列表添加汇总合并
if (cvo.getHead().getBillType().getCode().equals(ICBillType.MaterialOut.getCode())) {
this.dealSumInfoDev(dvomerger, datas);
} else {
// 对表体分组
try {
ICBillBodyVO[] itemvosnew = (ICBillBodyVO[]) dvomerger.mergeByGroup(cvo
.getBodys());
reSetPrice(itemvosnew, cvo.getHead().getBillType().getCode());
cvo.setChildrenVO(itemvosnew);
} catch (BusinessException e) {
ExceptionUtils.wrappException(e);
}
//精度处理
this.processData(cvo);
}
//是否敏感时区
boolean isSensitive = InvocationInfoProxy.getInstance().getSensitiveTimeZone();
if (isSensitive) {
datas = this.processTimeZone(datas);
}
// 组装数据源
IDataSource[] ds = this.getDataSource(datas);
return ds;
}
private void dealSumInfoDev(DefaultVOMerger dvomerger, Object[] datas) {
// 对表体分组
try {
for (Object data : datas) {
ICBillVO cvo = (ICBillVO) data;
ICBillBodyVO[] itemvosnew = (ICBillBodyVO[]) dvomerger.mergeByGroup(cvo
.getBodys());
reSetPrice(itemvosnew, cvo.getHead().getBillType().getCode());
cvo.setChildrenVO(itemvosnew);
//精度处理
this.processData(cvo);
}
} catch (BusinessException e) {
ExceptionUtils.wrappException(e);
}
}
@Override
public Object[] getDatas(String[] ids) {
BillQuery<PurchaseInVO> query45 = new BillQuery<PurchaseInVO>(PurchaseInVO.class);
PurchaseInVO[] vos = query45.query(ids);
if (vos.length != 0) {
BillBodySortUtils.sort(vos);
String pk_group = InvocationInfoProxy.getInstance().getGroupId();
BillVOScaleProcessor scale = new BillVOScaleProcessor(pk_group, vos);
TotalValueVOScaleProcessor totalScale = new TotalValueVOScaleProcessor(vos);
PurchaseInVOPrecisionHandler handler = new PurchaseInVOPrecisionHandler(vos);
handler.processVos(scale, totalScale);
return vos;
} else {
BillQuery<MaterialOutVO> query4D = new BillQuery<MaterialOutVO>(MaterialOutVO.class);
MaterialOutVO[] mvos = query4D.query(ids);
BillBodySortUtils.sort(mvos);
String pk_group = InvocationInfoProxy.getInstance().getGroupId();
BillVOScaleProcessor scale = new BillVOScaleProcessor(pk_group, mvos);
TotalValueVOScaleProcessor totalScale = new TotalValueVOScaleProcessor(mvos);
PurchaseInVOPrecisionHandler handler = new PurchaseInVOPrecisionHandler(mvos);
handler.processVos(scale, totalScale);
return mvos;
}
}
/**
* 获取分组字段 方法功能描述
* <p>
* <b>参数说明</b>
*
* @return <p>
* @author zhangsui
* @time 2011-7-19 上午08:37:31
* @since 6.0
*/
protected String[] getGroupFields() {
return new String[]{ICPubMetaNameConst.CMATERIALVID,
ICPubMetaNameConst.VBATCHCODE, ICPubMetaNameConst.CASTUNITID,
"vfree0", ICPubMetaNameConst.CLOCATIONID,
ICPubMetaNameConst.CVENDORID};
}
/**
* 通过选择框最终确定的分组字段 方法功能描述
* <p>
* <b>参数说明</b>
*
* @param alGroupBy
* @param Fields
* @return <p>
* @author zhangsui
* @time 2011-7-19 上午08:41:30
* @since 6.0
*/
@SuppressWarnings("unchecked")
protected String[] getSelGroupFields(List alGroupBy, String[] Fields) {
ArrayList alChooseGroup = new ArrayList();
for (int i = 0; i < alGroupBy.size() - 1; i++) {
if (((Boolean) alGroupBy.get(i)).booleanValue()) {
alChooseGroup.add(Fields[i]);
}
}
String[] saGroupField = null;
if (alChooseGroup.size() > 0) {
saGroupField = new String[alChooseGroup.size()];
alChooseGroup.toArray(saGroupField);
}
return saGroupField;
}
/**
* 对分组字段做特殊处理 方法功能描述
* <p>
* <b>参数说明</b>
*
* @param saGroupField
* @return <p>
* @author zhangsui
* @time 2011-7-19 下午03:13:03
* @since 6.0
*/
protected String[] processSaGroupField(String[] saGroupField) {
List<String> fields = Arrays.asList(saGroupField);
List<String> newfields = new ArrayList<String>();
if (fields.contains("vfree0")) {
for (int i = 0; i < saGroupField.length; i++) {
if (!"vfree0".equals(saGroupField[i])) {
newfields.add(saGroupField[i]);
}
}
for (int i = 1; i < 11; i++) {
newfields.add("vfree" + i);
}
return newfields.toArray(new String[0]);
}
return saGroupField;
}
/**
* 获取汇总字段 方法功能描述
* <p>
* <b>参数说明</b>
* 材料出库调用
*
* @param isselected
* @return <p>
* @author zhangsui
* @time 2011-7-19 上午08:35:12
* @since 6.0
*/
protected String[] getSummingField(Boolean isselected) {
String[] saSummingField = null;
if ((isselected).booleanValue() == true) {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, ICPubMetaNameConst.NASSISTNUM,
ICPubMetaNameConst.NSHOULDASSISTNUM, MetaNameConst.NCOSTMNY};
} else {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, MetaNameConst.NCOSTMNY};
}
return saSummingField;
}
/**
* 获取汇总字段 方法功能描述采购入库调用
* <p>
* <b>参数说明</b>
*
* @param isselected
* @return <p>
* @author zhangsui
* @time 2011-7-19 上午08:35:12
* @since 6.0
*/
protected String[] getSummingField(Boolean isselected, String type) {
String[] saSummingField = null;
if ("in".equals(type)) {
if ((isselected).booleanValue() == true) {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, ICPubMetaNameConst.NASSISTNUM,
ICPubMetaNameConst.NSHOULDASSISTNUM,
MetaNameConst.NMNY,
/**
* 杭州锦江集团有限公司:采购入库汇总打印时部分字段没汇总
*/
MetaNameConst.NORIGMNY, MetaNameConst.NCALCOSTMNY,
MetaNameConst.NTAXMNY, MetaNameConst.NORIGTAXMNY};
} else {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, MetaNameConst.NMNY};
}
} else if ("out".equals(type)) {
if ((isselected).booleanValue() == true) {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, ICPubMetaNameConst.NASSISTNUM,
ICPubMetaNameConst.NSHOULDASSISTNUM, MetaNameConst.NMNY};
} else {
saSummingField = new String[]{ICPubMetaNameConst.NSHOULDNUM,
ICPubMetaNameConst.NNUM, MetaNameConst.NMNY
/*
* 返回打印模板中可合并计算的字段
* 现客户合并计算norigtaxmny(原币价税合计)的和需要添加该字段的返回
*/
, MetaNameConst.NORIGMNY, MetaNameConst.NTAXMNY,
MetaNameConst.NORIGTAXMNY};
}
}
return saSummingField;
}
private void processData(ICBillVO cvo) {
ICBillVO[] vos = new ICBillVO[]{cvo};
//精度处理
String pk_group = InvocationInfoProxy.getInstance().getGroupId();
BillVOScaleProcessor scale = new BillVOScaleProcessor(pk_group, vos);
TotalValueVOScaleProcessor totalScale = new TotalValueVOScaleProcessor(vos);
ICBasePrintVOPrecisionHandler handler = null;
if (vos[0].getHead().getBillType().getCode().equals(ICBillType.SaleOut.getCode())) {//销售出库
ICBillVO[] aggvos = NCLocator.getInstance().lookup(IICBillVOQueryService.class).query(
ICBillType.SaleOut, new String[]{vos[0].getHead().getCgeneralhid()});
if (aggvos == null || aggvos.length == 0) {
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", "04008027-0180")/*@res "当前数据已被删除,请到列表页面刷新!"*/);
}
handler = new SaleOutVOPrecisionHandler(vos);
handler.processVos(scale, totalScale);
} else if (vos[0].getHead().getBillType().getCode().equals(ICBillType.MaterialOut.getCode())) {//材料出库
ICBillVO[] aggvos = NCLocator.getInstance().lookup(IICBillVOQueryService.class).query(
ICBillType.MaterialOut, new String[]{vos[0].getHead().getCgeneralhid()});
if (aggvos == null || aggvos.length == 0) {
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", "04008027-0180")/*@res "当前数据已被删除,请到列表页面刷新!"*/);
}
handler = new MaterialOutVOPrecisionHandler(vos);
handler.processVos(scale, totalScale);
} else {//采购入库
ICBillVO[] aggvos = NCLocator.getInstance().lookup(IICBillVOQueryService.class).query(
ICBillType.PurchaseIn, new String[]{vos[0].getHead().getCgeneralhid()});
if (aggvos == null || aggvos.length == 0) {
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0", "04008027-0180")/*@res "当前数据已被删除,请到列表页面刷新!"*/);
}
handler = new PurchaseInVOPrecisionHandler(vos);
handler.processVos(scale, totalScale);
}
}
/**
* 汇总以后重置价格 方法功能描述
* <p>
* <b>参数说明</b>
*
* @param itemvosnew <p>
* @author zhangsui
* @time 2011-7-19 上午08:35:43
* @since 6.0
*/
protected void reSetPrice(ICBillBodyVO[] itemvosnew, String type) {
if (itemvosnew != null) {
UFDouble udNum = null;
UFDouble udMny = null;
for (int k = 0; k < itemvosnew.length; k++) {
udNum = itemvosnew[k].getNnum();
udMny = (UFDouble) itemvosnew[k]
.getAttributeValue(MetaNameConst.NMNY);
if (type.equals(ICBillType.MaterialOut.getCode())) {
udMny = (UFDouble) itemvosnew[k]
.getAttributeValue(MetaNameConst.NCOSTMNY);
} else {
udMny = (UFDouble) itemvosnew[k]
.getAttributeValue(MetaNameConst.NMNY);
}
if (udNum != null && udMny != null) {
itemvosnew[k].setAttributeValue(MetaNameConst.NPRICE,
(udMny.div(udNum)));
}
}
}
}
}

View File

@ -0,0 +1,196 @@
package nccloud.pubimpl.ic.pub.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import nc.bs.framework.common.NCLocator;
import nc.bs.ic.pub.util.ICBillVOQuery;
import nc.impl.pubapp.pattern.data.vo.VOQuery;
import nc.pubitf.uapbd.CurrencyRateUtilHelper;
import nc.vo.ic.general.define.ICBillBodyVO;
import nc.vo.ic.general.define.ICBillFlag;
import nc.vo.ic.general.define.ICBillHeadVO;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ic.general.define.MetaNameConst;
import nc.vo.ic.general.util.ICLocationUtil;
import nc.vo.ic.m45.entity.PurchaseInVO;
import nc.vo.ic.org.OrgInfoQuery;
import nc.vo.ic.transtype.TransTypeExtendVO;
import nc.vo.pub.ISuperVO;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.scmpub.res.billtype.ICBillType;
import nc.vo.scmpub.util.BillBodySortUtils;
import nc.vo.ic.m45.utils.BillQuery;
import nccloud.dto.ic.pub.entity.BillVOWithExtendInfo;
import nccloud.dto.ic.pub.entity.ICBillstatusForWeb;
import nccloud.pubimpl.ic.pub.utils.ICBillExtendInfoHelper;
import nccloud.pubitf.ic.pub.service.IICBillVOQueryService;
/**
* 库存单据查询实现类
*
* @author hujieh
*
*/
public class ICBillVOQueryServiceImpl implements IICBillVOQueryService {
@Override
public ICBillVO[] query(ICBillType billtype, String[] hids) {
ICBillVO[] vos = new ICBillVOQuery(billtype).query(hids);
if(billtype.equals(ICBillType.PurchaseIn)){
try {
vos = new BillQuery<PurchaseInVO>(PurchaseInVO.class).queryGrandsons((PurchaseInVO[]) vos);
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
return vos;
}
@SuppressWarnings("unchecked")
@Override
public ICBillHeadVO[] query(Class<?> T, String[] hids) {
return (ICBillHeadVO[]) new VOQuery(T).query(hids);
}
@Override
public BillVOWithExtendInfo queryBillExtByVO(ICBillVO vo) {
BillVOWithExtendInfo info = new ICBillExtendInfoHelper()
.getExtendInfoByBillVO(vo);
return info;
}
@Override
public BillVOWithExtendInfo queryBillExt(ICBillType billtype, String hid) {
ICBillVO[] vos = new ICBillVOQuery(billtype).query(new String[] { hid });
if(billtype.equals(ICBillType.PurchaseIn)){
try {
vos = new BillQuery<PurchaseInVO>(PurchaseInVO.class).queryGrandsons((PurchaseInVO[]) vos);
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
if (billtype.equals(ICBillType.LocAdjust)) {
vos = ICLocationUtil.loadLocationVOsFilterNeg(vos);
} else {
vos = ICLocationUtil.loadLocationVOs(vos);
}
if (vos != null && vos.length == 1) {
BillBodySortUtils.sort(vos);
// 本位币
String cfinanceoid = new OrgInfoQuery().getFinanceOrgIDByCalBodyID(vos[0].getHead().getPk_org());
String ccurrencyid = CurrencyRateUtilHelper.getInstance().getLocalCurrtypeByOrgID(cfinanceoid);
Arrays.asList(vos[0].getBodys()).stream().forEach(body -> {body.setAttributeValue(MetaNameConst.CCURRENCYID, ccurrencyid);});
BillVOWithExtendInfo info = new ICBillExtendInfoHelper()
.getExtendInfoByBillVO(vos[0]);
return info;
}
return null;
}
@Override
public BillVOWithExtendInfo[] queryBillDev(ICBillType billtype, String[] hids) {
ICBillVO[] vos = new ICBillVOQuery(billtype).query(hids);
if(billtype.equals(ICBillType.PurchaseIn)){
try {
vos = new BillQuery<PurchaseInVO>(PurchaseInVO.class).queryGrandsons((PurchaseInVO[]) vos);
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
if (billtype.equals(ICBillType.LocAdjust)) {
vos = ICLocationUtil.loadLocationVOsFilterNeg(vos);
} else {
vos = ICLocationUtil.loadLocationVOs(vos);
}
List<BillVOWithExtendInfo> resultList=new ArrayList<>();
if (vos != null && vos.length >0) {
BillBodySortUtils.sort(vos);
for(ICBillVO vo:vos){
// 本位币
String cfinanceoid = new OrgInfoQuery().getFinanceOrgIDByCalBodyID(vo.getHead().getPk_org());
String ccurrencyid = CurrencyRateUtilHelper.getInstance().getLocalCurrtypeByOrgID(cfinanceoid);
Arrays.asList(vo.getBodys()).stream().forEach(body -> {body.setAttributeValue(MetaNameConst.CCURRENCYID, ccurrencyid);});
BillVOWithExtendInfo info = new ICBillExtendInfoHelper()
.getExtendInfoByBillVO(vo);
resultList.add(info);
}
}
return resultList.toArray(new BillVOWithExtendInfo[resultList.size()]);
}
@Override
public TransTypeExtendVO qryTransTypeExtendVOByPK(String pk) {
TransTypeExtendVO[] retvo = (TransTypeExtendVO[]) new VOQuery(
TransTypeExtendVO.class).queryWithWhereKeyWord(
" where CTRANTYPEID= '" + pk + "'", "");
return retvo[0];
}
@Override
public ICBillHeadVO[] queryHeadWithInfo(ICBillType billtype,
ISuperVO[] headvos) {
ICBillVO[] billvos = queryBillByHead(billtype, headvos);
if (billvos == null || billvos.length == 0) {
return null;
}
return filterHeadVO(billvos);
}
private ICBillHeadVO[] filterHeadVO(ICBillVO[] billvos) {
List<ICBillHeadVO> headvos = new ArrayList<ICBillHeadVO>();
for (ICBillVO billvo : billvos) {
ICBillHeadVO head = billvo.getHead();
// 处理中和待签字的单据都是自由态
if (head.getFbillflag() == ICBillFlag.getFreeFlag()) {
boolean isProcessing = false;
ICBillBodyVO[] bodys = billvo.getBodys();
// 存在一行表体没有实收或实发的单据认为是处理中
// 数量为0认为是有数量
for (ICBillBodyVO body : bodys) {
if (null == body.getNnum()) {
isProcessing = true;
break;
}
}
// 不是处理中的单据认为是待签字
if (!isProcessing) {
head.setAttributeValue(ICBillstatusForWeb.ICBILLSTATUS,
ICBillstatusForWeb.TOSIGN);
} else {
head.setAttributeValue(ICBillstatusForWeb.ICBILLSTATUS,
ICBillstatusForWeb.TOPROCESS);
}
} else {
head.setAttributeValue(ICBillstatusForWeb.ICBILLSTATUS,
ICBillstatusForWeb.SIGNED);
}
headvos.add(head);
}
return headvos.toArray(new ICBillHeadVO[0]);
}
private ICBillVO[] queryBillByHead(ICBillType billtype, ISuperVO[] headvos) {
Set<String> ids = new HashSet<String>();
for (ISuperVO headvo : headvos) {
ids.add((String) headvo
.getAttributeValue(MetaNameConst.CGENERALHID));
}
ICBillVO[] billvos = NCLocator.getInstance()
.lookup(IICBillVOQueryService.class)
.query(billtype, ids.toArray(new String[0]));
return billvos;
}
// @Override
// public TransTypeExtendVO qryTransTypeExtendVOByPK(String pk) {
// TransTypeExtendVO[] retvo = (TransTypeExtendVO[]) new VOQuery(
// TransTypeExtendVO.class).queryWithWhereKeyWord(" where pk_group ="
// + "'" + InvocationInfoProxy.getInstance().getGroupId() + "'"
// + " and transtypecode = " + "'" + pk + "'", null);
// return retvo[0];
// }
}

View File

@ -0,0 +1,429 @@
package nc.vo.ic.m4n.entity.deal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.bs.ic.general.util.RuleUtils;
import nc.bs.ic.pub.env.ICBSContext;
import nc.vo.bd.material.stock.MaterialStockVO;
import nc.vo.ic.invadjust.lang.InvAdjustRes;
import nc.vo.ic.m4n.entity.TransformBodyVO;
import nc.vo.ic.m4n.entity.TransformRowFlag;
import nc.vo.ic.m4n.entity.TransformVO;
import nc.vo.ic.pub.define.ICPubMetaNameConst;
import nc.vo.ic.pub.util.CollectionUtils;
import nc.vo.ic.pub.util.StringUtil;
import nc.vo.ic.pub.util.VOEntityUtil;
import nc.vo.ic.special.check.SpecialBillEntityCheck;
import nc.vo.pub.BusinessException;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFBoolean;
/**
* <p>
* <b>本类主要完成以下功能</b> 形态转换数据校验 1.行类型校验 2.转换前后的物料维度校验 3.必输项及数量主数量非空校验 限BS端调用
*
* <ul>
* <li>
* </ul>
* <p>
* <p>
*
* @version 6.0
* @since 6.0
* @author chennn
* @time 2010-5-31 下午04:35:35
*/
public class TransformVOChecker {
public void checkNullItem(TransformVO bill) throws BusinessException {
new SpecialBillEntityCheck().checkNullItem(bill);
List<String> errVendorRows = new ArrayList<String>();// 供应商
List<String> errProductRows = new ArrayList<String>();// 生产厂商
List<String> errProjectRows = new ArrayList<String>();// 项目
List<String> errCffileidRows = new ArrayList<String>();// 特征码
List<String> errStateRows = new ArrayList<String>();
List<String> errNumRows = new ArrayList<String>();// 数量和主数量
List<String> errCasscustRows = new ArrayList<String>();
ICBSContext context = new ICBSContext();
for (TransformBodyVO body : bill.getBodys()) {
// 过滤已经删除或者没有修改的表体行
if (body.getStatus() == VOStatus.DELETED || body.getStatus() == VOStatus.UNCHANGED) {
continue;
}
String cmaterialvid = body.getCmaterialvid();
if (!StringUtil.isSEmptyOrNull(cmaterialvid) && (body.getNnum() == null || body.getNassistnum() == null)) {
errNumRows.add(body.getCrowno());
}
if (this.isVendorChosen(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCvendorid())) {
errVendorRows.add(body.getCrowno());
}
// 泰开项目客开
// 项目字段根据库存信息页签-可用量按辅助属性检查是否勾选进行判断
String pk_org = bill.getHead().getPk_org();
Boolean needCheckProd = checkProdect(cmaterialvid, pk_org);
if (needCheckProd&&this.isProductorChosen(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCproductorid())) {
errProductRows.add(body.getCrowno());
}
// 项目字段根据库存信息页签-可用量按辅助属性检查是否勾选进行判断
Boolean needCheckProject = checkProject(cmaterialvid, pk_org);
if (needCheckProject&&this.isProjectChosen(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCprojectid())) {
errProjectRows.add(body.getCrowno());
}
if (this.isInvStateManage(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCstateid())) {
errStateRows.add(body.getCrowno());
}
if (this.isCasscustChosen(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCasscustid())) {
errCasscustRows.add(body.getCrowno());
}
if (this.isCffileidChosen(cmaterialvid, context) && StringUtil.isSEmptyOrNull(body.getCffileid())) {
errCffileidRows.add(body.getCrowno());
}
}
RuleUtils util = new RuleUtils();
util.showErrByRows(errVendorRows, InvAdjustRes.getVendorNullErr());
util.showErrByRows(errProductRows, InvAdjustRes.getProductorNullErr());
util.showErrByRows(errProjectRows, InvAdjustRes.getProjectNullErr());
util.showErrByRows(errStateRows, InvAdjustRes.getStateNullErr());
util.showErrByRows(errNumRows, InvAdjustRes.getNumNullErr());
util.showErrByRows(errCasscustRows, InvAdjustRes.getCasscustNullErr());
util.showErrByRows(errCffileidRows, InvAdjustRes.getCffileidNullErr());
}
/**
* 根据物料查询物料库存信息页签-可用量按辅助属性检查是否勾选进行判断
*
* @param cmaterialvid
* @param pk_org
* @return
*/
private Boolean checkProject(String cmaterialvid, String pk_org) {
String whereSql = " pk_material='" + cmaterialvid + "' and pk_org='" + pk_org + "' and nvl(dr,0)=0 ";
List<MaterialStockVO> list = null;
try {
list = (List<MaterialStockVO>) new BaseDAO().retrieveByClause(MaterialStockVO.class, whereSql);
} catch (DAOException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
return list.get(0).getFixasst2()==null?false:list.get(0).getFixasst2().booleanValue();
}
return true;
}
/**
* 根据物料查询物料库存信息页签-可用量按辅助属性检查是否勾选进行判断
*
* @param cmaterialvid
* @param pk_org
* @return
*/
private Boolean checkProdect(String cmaterialvid, String pk_org) {
String whereSql = " pk_material='" + cmaterialvid + "' and pk_org='" + pk_org + "' and nvl(dr,0)=0 ";
List<MaterialStockVO> list = null;
try {
list = (List<MaterialStockVO>) new BaseDAO().retrieveByClause(MaterialStockVO.class, whereSql);
} catch (DAOException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
return list.get(0).getFixasst4() == null ? false : list.get(0).getFixasst4().booleanValue();
}
return true;
}
public List<Integer> checkRowType(TransformVO bill) throws BusinessException {
TransformBodyVO[] bodyvos = bill.getBodys();
int bodyLength = bodyvos.length;
if (bodyLength <= 0) {
return null;
}
if (bodyLength < 2) {
throw new BusinessException(InvAdjustRes.getRowLengErr());
}
List<Integer> beforeIndex = new ArrayList<Integer>();
for (int i = 0; i < bodyLength; i++) {
if (null == bodyvos[i].getFbillrowflag()) {
throw new BusinessException(InvAdjustRes.getRowTypeNullErr());
}
if (bodyvos[i].getFbillrowflag().equals(TransformRowFlag.BEFORECONVERT.value())
&& VOStatus.DELETED != bodyvos[i].getStatus()) {
beforeIndex.add(i);
}
}
if (!bodyvos[0].getFbillrowflag().equals(TransformRowFlag.BEFORECONVERT.value())
|| !bodyvos[bodyLength - 1].getFbillrowflag().equals(TransformRowFlag.AFTERCONVERT.value())) {
throw new BusinessException(InvAdjustRes.getFirstAndLastRowTypeErr());
}
if (beforeIndex.size() > bodyLength / 2) {
throw new BusinessException(InvAdjustRes.getTransformRowTypeErr());
}
for (int i = 0, j = i + 1; j < beforeIndex.size(); i++, j++) {
int currentindex = beforeIndex.get(i);
int nextindex = beforeIndex.get(j);
if (nextindex == currentindex + 1) {
throw new BusinessException(InvAdjustRes.getTransformRowTypeErr());
}
}
return beforeIndex;
}
private List<TransformBodyVO> getBodysButDelete(TransformBodyVO[] bodyVOs) {
List<TransformBodyVO> aftertempRows = new ArrayList<TransformBodyVO>();
for (TransformBodyVO bodyVO : bodyVOs) {
if (VOStatus.DELETED == bodyVO.getStatus()) {
continue;
}
aftertempRows.add(bodyVO);
}
return aftertempRows;
}
/**
* 方法功能描述
* <p>
* 检查转换前后的行内容是否存在转换前行等于转换后的行 <b>参数说明</b>
*
* @param bill
* @throws BusinessException
* <p>
* @since 6.0
* @author chennn
* @time 2010-6-1 下午03:06:04
*/
public void checkTranformItem(TransformVO bill, List<Integer> beforeIndex) throws BusinessException {
TransformBodyVO[] bodyVOs = bill.getBodys();
Map<TransformBodyVO, List<String>> errInfo = new HashMap<TransformBodyVO, List<String>>();
List<TransformBodyVO> aftertempRows = this.getBodysButDelete(bodyVOs);
if (beforeIndex.size() == 1) {
TransformBodyVO beforeRow = bodyVOs[beforeIndex.get(0)];
List<TransformBodyVO> afterRows = aftertempRows.subList(1, aftertempRows.size());
List<String> errRows = this.isBeforeSameWithAfter(beforeRow, afterRows);
if (errRows.size() > 0) {
errInfo.put(beforeRow, errRows);
this.showItemSameErr(errInfo);
}
} else {
List<TransformBodyVO> errBeforeRow = new ArrayList<TransformBodyVO>();
for (int i = 0, j = i + 1; j < beforeIndex.size(); i++, j++) {
int currentIndex = beforeIndex.get(i);
int nextIndex = beforeIndex.get(j);
TransformBodyVO beforeRow = bodyVOs[currentIndex];
List<TransformBodyVO> afterRows = new ArrayList<TransformBodyVO>();
for (int k = currentIndex + 1; k < nextIndex; k++) {
// 过滤已删除表体行
if (VOStatus.DELETED == bodyVOs[k].getStatus()) {
continue;
}
afterRows.add(bodyVOs[k]);
}
List<String> errAfters = this.isBeforeSameWithAfter(beforeRow, afterRows);
if (errAfters.size() > 0) {
errBeforeRow.add(beforeRow);
errInfo.put(beforeRow, errAfters);
}
}
int lastBeforeIndex = beforeIndex.get(beforeIndex.size() - 1);
TransformBodyVO beforeRow = bodyVOs[lastBeforeIndex];
// List<TransformBodyVO> afterBodyRows = aftertempRows.subList(
// lastBeforeIndex + 1, aftertempRows.size());
// begin --调整最后一次校验表体行取值方式 lihui13 20180915
List<TransformBodyVO> afterBodyRows = new ArrayList<TransformBodyVO>();
int k = lastBeforeIndex + 1;
while (k != bodyVOs.length) {
if (k > bodyVOs.length) {
break;
}
if (VOStatus.DELETED == bodyVOs[k].getStatus()) {
k++;
continue;
}
afterBodyRows.add(bodyVOs[k]);
k++;
}
// end
List<String> errAfters = this.isBeforeSameWithAfter(beforeRow, afterBodyRows);
if (errAfters.size() > 0) {
errBeforeRow.add(beforeRow);
errInfo.put(beforeRow, errAfters);
}
this.showItemSameErr(errInfo);
}
}
private String[] getKeys(TransformBodyVO beforeRow, String[] initFields) {
List<String> keys = new ArrayList<String>();
CollectionUtils.addArrayToList(keys, initFields);
if (keys.contains(TransformBodyVO.VFREE_PREFIX)) {
for (int i = 1; i <= TransformBodyVO.VREE_NUM; i++) {
String vfree_i = TransformBodyVO.VFREE_PREFIX + i;
keys.add(vfree_i);
}
}
String cmaterialvid = beforeRow.getCmaterialvid();
ICBSContext context = new ICBSContext();
if (this.isVendorChosen(cmaterialvid, context)) {
keys.add(TransformBodyVO.CVENDORID);
}
if (this.isProductorChosen(cmaterialvid, context)) {
keys.add(TransformBodyVO.CPRODUCTORID);
}
if (this.isProjectChosen(cmaterialvid, context)) {
keys.add(TransformBodyVO.CPROJECTID);
}
if (this.isInvStateManage(cmaterialvid, context)) {
keys.add(TransformBodyVO.CSTATEID);
}
if (this.isCffileidChosen(cmaterialvid, context)) {
keys.add(ICPubMetaNameConst.CFFILEID);
}
return keys.toArray(new String[keys.size()]);
}
private List<String> isBeforeSameWithAfter(TransformBodyVO beforeRow, List<TransformBodyVO> afterRows) {
String[] fields = new String[] { TransformBodyVO.CMATERIALVID, TransformBodyVO.CASTUNITID,
TransformBodyVO.VBATCHCODE, TransformBodyVO.VFREE_PREFIX, TransformBodyVO.CASSCUSTID };
String[] keys = this.getKeys(beforeRow, fields);
Object[] values = VOEntityUtil.getVOValues(beforeRow, keys);
String key = StringUtil.mergeString(values, null, null);
List<String> errRows = new ArrayList<String>();
for (TransformBodyVO vo : afterRows) {
Object[] afterValues = VOEntityUtil.getVOValues(vo, keys);
String afterKey = StringUtil.mergeString(afterValues, null, null);
if (StringUtil.isStringEqual(key, afterKey)) {
errRows.add(vo.getCrowno());
}
}
return errRows;
}
/**
* 方法功能描述
* <p>
* 物料是否库存状态管理 <b>参数说明</b>
*
* @param cmaterialvid
* @return
* <p>
* @since 6.0
* @author chennn
* @time 2010-6-1 下午04:21:39
*/
private boolean isInvStateManage(String cmaterialvid, ICBSContext context) {
UFBoolean fix1 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix1();
return fix1 == null ? false : fix1.booleanValue();
}
/**
* 方法功能描述
* <p>
* 物料是否勾选项目辅助属性 <b>参数说明</b>
*
* @param cmaterialvid
* @return
* <p>
* @since 6.0
* @author chennn
* @time 2010-6-1 下午02:24:29
*/
private boolean isProjectChosen(String cmaterialvid, ICBSContext context) {
UFBoolean fix2 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix2();
return fix2 == null ? false : fix2.booleanValue();
}
/**
* 方法功能描述
* <p>
* 物料是否勾选特征码辅助属性 <b>参数说明</b>
*
* @param cmaterialvid
* @return
* <p>
* @since 6.36
* @author xuxq3
* @time 2015-04-06
*/
private boolean isCffileidChosen(String cmaterialvid, ICBSContext context) {
UFBoolean fix100 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix100();
return fix100 == null ? false : fix100.booleanValue();
}
/**
* 是否勾选客户辅助属性
*
* @param cmaterialvid
* @param context
* @return
*/
private boolean isCasscustChosen(String cmaterialvid, ICBSContext context) {
UFBoolean fix5 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix5();
return fix5 == null ? false : fix5.booleanValue();
}
/**
* 方法功能描述
* <p>
* 物料是否勾选供应商辅助属性 <b>参数说明</b>
*
* @param cmaterialvid
* @return
* <p>
* @since 6.0
* @author chennn
* @time 2010-6-1 上午10:46:09
*/
private boolean isVendorChosen(String cmaterialvid, ICBSContext context) {
UFBoolean fix3 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix3();
return fix3 == null ? false : fix3.booleanValue();
}
/**
* 方法功能描述
* <p>
* 物料是否勾选生产厂商辅助属性 <b>参数说明</b>
*
* @param cmaterialvid
* @return
* <p>
* @since 6.0
* @author chennn
* @time 2010-6-1 下午02:24:11
*/
private boolean isProductorChosen(String cmaterialvid, ICBSContext context) {
UFBoolean fix4 = context.getInvInfo().getInvBasVO(cmaterialvid).getFix4();
return fix4 == null ? false : fix4.booleanValue();
}
private void showItemSameErr(Map<TransformBodyVO, List<String>> errInfo) throws BusinessException {
if (errInfo.size() <= 0) {
return;
}
StringBuilder errMsg = new StringBuilder();
errMsg.append(InvAdjustRes.getBeforeSameAfterErr()).append("\n");
for (Map.Entry<TransformBodyVO, List<String>> err : errInfo.entrySet()) {
String beforeRowNo = err.getKey().getCrowno();
errMsg.append(InvAdjustRes.getBeforeRow() + beforeRowNo).append(" ");
for (String afterRow : err.getValue()) {
errMsg.append(InvAdjustRes.getAfterRow()).append(afterRow).append(",");
}
}
throw new BusinessException(errMsg.toString());
}
}

View File

@ -14,5 +14,11 @@ import java.util.Map;
*/
public interface IAPISubcontInMaintain {
/**
*
* @param subcontInVOList
* @return
* @throws Exception
*/
SubcontInVO[] save(List<Map<String, Object>> subcontInVOList) throws Exception;
}

View File

@ -74,7 +74,7 @@ public interface IAPISaleOutMaintain {
public SaleOutVO[] saveRefSaleOrder(List<Map<String, Object>> paramMapList)
throws BusinessException;
/**
* 根据发货单生成销售出库单
* 根据发货单生成销售出库单
* @param vos
* @return
* @throws BusinessException

View File

@ -16,7 +16,23 @@ import nc.vo.pub.BusinessException;
*/
public interface IAPIOnhandQuery {
/**
* 根据维度查询现存量信息
* 此方法接收一个参数映射用于指定查询条件如仓库物料等
*
* @param paramMap 参数映射包含查询条件
* @return OnhandVO[] 查询到的现存量信息数组
* @throws BusinessException 当查询操作失败时抛出的业务异常
*/
OnhandVO[] queryOnhandVOByDims(Map<String, Object> paramMap) throws BusinessException;
OnhandVO[] queryOnhandVOByDims(List<Map<String, Object>> paramMap)throws Exception;
/**
* 根据多个维度查询现存量信息
* 此方法接收一个参数映射列表每个映射包含一组查询条件用于批量查询
*
* @param paramMap 参数映射列表每个映射包含一组查询条件
* @return OnhandVO[] 查询到的现存量信息数组
* @throws Exception 当查询操作失败时抛出的异常
*/
OnhandVO[] queryOnhandVOByDims(List<Map<String, Object>> paramMap) throws Exception;
}

View File

@ -0,0 +1,63 @@
package nccloud.dto.ic.pub.entity;
import java.util.List;
import nccloud.pubitf.platform.print.vo.PrintInfo;
import nccloud.pubitf.uap.print.vo.NoPreviewPrintInfo;
/**
* @description 出入库汇总打印信息
* @author zhegnxinm
* @date 2018-12-16 上午10:48:39
* @version ncc1.0
*/
public class GeneralSumPrintInfo extends NoPreviewPrintInfo{
//打印数据
private Object[] data;
//前段传过来的数据
private String billcard;
//汇总类型
private List<Boolean> alGroupBy ;
//出入库类型
private String inOutType;
public String getInOutType() {
return inOutType;
}
public void setInOutType(String inOutType) {
this.inOutType = inOutType;
}
public List<Boolean> getAlGroupBy() {
return alGroupBy;
}
public void setAlGroupBy(List<Boolean> alGroupBy) {
this.alGroupBy = alGroupBy;
}
public Object[] getSelect() {
return select;
}
public void setSelect(Object[] select) {
this.select = select;
}
private Object[] select;
public String getBillcard() {
return billcard;
}
public void setBillcard(String billcard) {
this.billcard = billcard;
}
public Object[] getData() {
return data;
}
public void setData(Object[] data) {
this.data = data;
}
}

View File

@ -2,13 +2,10 @@ package nccloud.openapi.ic.m47;
import nc.bs.framework.common.NCLocator;
import nc.vo.ic.m47.entity.SubcontInVO;
import nc.vo.scmpub.res.billtype.ICBillType;
import nc.ws.opm.pub.utils.result.APIErrCodeEnum;
import nccloud.api.ic.m47.IAPISubcontInMaintain;
import nccloud.api.rest.utils.ResultMessageUtil;
import nccloud.openapi.ic.util.ICAPILocationVOUtils;
import nccloud.openapi.scmpub.pub.NCCPubRestResource;
import nccloud.openapi.scmpub.pub.TransferMapToVOTool;
import org.json.JSONString;
import javax.ws.rs.Consumes;
@ -32,32 +29,57 @@ public class SubcontInResource extends NCCPubRestResource {
private static String HEADTABLE = "ic_subcontin_h";
private static String BODYTABLE = "ic_subcontin_b";
/**
*保存操作信息
*
* 该方法通过POST请求接收JSON格式的参数处理后返回JSON格式的结果
* 主要用于保存单个操作的信息将接收到的参数封装成列表的形式
* 调用另一个save方法进行实际的保存操作
*
* @param param 包含操作信息的键值对参数
* @return 返回保存操作的结果格式为JSON字符串
*/
@POST
@Path("operation/save")
@Consumes({"application/json"})
@Produces({"application/json"})
public JSONString save(Map<String, Object> param) {
// 将接收到的参数封装成列表以便调用实际的保存方法
List<Map<String, Object>> paramList = new ArrayList();
paramList.add(param);
// 调用实际的保存方法并返回保存结果
JSONString result = this.save(paramList);
return result;
}
/**
* 保存数据接口
* 该方法接收一个包含表头和表体信息的JSON数组尝试将其保存到数据库中
* 如果传入的数据格式不正确不包含表头或表体信息则返回错误信息
* 如果保存过程中发生异常则返回异常信息
*
* @param paramList 一个包含多个数据项的列表每个数据项是一个Map对象必须包含表头和表体信息
* @return 返回一个JSON字符串包含保存结果或错误信息
*/
@POST
@Path("save")
@Consumes({"application/json"})
@Produces({"application/json"})
public JSONString save(List<Map<String, Object>> paramList){
try {
// 遍历传入的参数列表检查每个Map对象是否包含表头和表体信息
for (Map<String, Object> map : paramList) {
if (!map.containsKey(HEADTABLE) || !map.containsKey(BODYTABLE)) {
// 如果任一数据项不包含表头或表体信息返回错误信息
return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含表头信息和表体信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
}
}
// 调用服务接口保存数据并返回保存结果
SubcontInVO[] save = NCLocator.getInstance().lookup(IAPISubcontInMaintain.class).save(paramList);
return ResultMessageUtil.toJSON(save, "保存成功");
}catch (Exception e){
} catch (Exception e) {
// 如果保存过程中发生异常返回异常信息
return ResultMessageUtil.exceptionToJSON(e);
}
}
}

View File

@ -84,7 +84,7 @@ public class SaleOutResource extends NCCPubRestResource {
return ResultMessageUtil.exceptionToJSON("传入参数为空,请检查", APIErrCodeEnum.BUSINESSEXCCODE.getCode());
}
try {
// 调用查询接口
//调用查询接口
IAPISaleOutQuery query =
NCLocator.getInstance().lookup(IAPISaleOutQuery.class);
SaleOutVO[] saleOutVOs = query.queryVOByScheme(paramMap);
@ -143,7 +143,7 @@ public class SaleOutResource extends NCCPubRestResource {
nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("4008027_0",
"04008027-0464")/* @res "销售出库单修改签字成功" */);
}else{
// 修改
//修改
SaleOutVO[] updateVO =
NCLocator.getInstance().lookup(IAPISaleOutMaintain.class)
.update(paramMapList);

View File

@ -136,7 +136,7 @@ public class OnhandResource {
if (remain == null || remain.isEmpty()) {
return null;
}
// 转换为 pk code 的映射
// 转换为 pk code 的映射
Map<String, String> pkCodeMap = new HashMap<>();
for (Map<String, Object> row : remain) {
if (row != null) {

View File

@ -0,0 +1,61 @@
package nccloud.pubitf.ic.pub.service;
import nc.vo.ic.general.define.ICBillHeadVO;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ic.transtype.TransTypeExtendVO;
import nc.vo.pub.ISuperVO;
import nc.vo.scmpub.res.billtype.ICBillType;
import nccloud.dto.ic.pub.entity.BillVOWithExtendInfo;
/**
* 库存单据查询接口
* @author hujieh
*
*/
public interface IICBillVOQueryService {
/**
* 根据父类主键查询聚合VO
* @param hids
* @return
*/
public ICBillVO[] query(ICBillType billtype, String[] hids);
/**
* 根据主键查询表头信息
* @param T
* @param hids
* @return
*
*/
public ICBillHeadVO[] query(Class<?> T,String[] hids);
/**
* 查询库存单据,并且包含扩展信息
* @param billtype
* @param hid
* @return
*/
public BillVOWithExtendInfo queryBillExt(ICBillType billtype, String hid);
public BillVOWithExtendInfo[] queryBillDev(ICBillType billtype, String[] hids);
/**
*查询交易类型扩展属性vo
* @param pk
* @return
*
*/
public TransTypeExtendVO qryTransTypeExtendVOByPK(String pk);
/**
* 库存出入库单据根据表头vo补充toSign(是否可以签字)标志并返回
* @param headvos
* @return
*/
public ICBillHeadVO[] queryHeadWithInfo(ICBillType billtype, ISuperVO[] headvos);
/**
* 查询库存单据,并且包含扩展信息
* @param vo
* @return
*/
public BillVOWithExtendInfo queryBillExtByVO(ICBillVO vo);
}

View File

@ -21,6 +21,7 @@ import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum;
public class PickmApproveBP {
private void addAfterRule(CompareAroundProcesser<AggPickmVO> processer) {
//备料计划审批推送锐制
IRule<AggPickmVO> pickmstatusFilterRule = new AfterApproveRuleSyncRZWMS();
processer.addAfterRule(pickmstatusFilterRule);
}

View File

@ -9,6 +9,7 @@ import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.pubitf.para.SysInitQuery;
import nc.vo.bd.defdoc.DefdocVO;
import nc.vo.bd.material.MaterialVO;
import nc.vo.bd.rt.rt0004.entity.RcVO;
import nc.vo.bd.stordoc.StordocVO;
@ -19,6 +20,7 @@ import nc.vo.mmpac.pickm.entity.PickmItemVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.scmpub.util.ArrayUtil;
@ -154,31 +156,31 @@ public class AfterApproveRuleSyncRZWMS implements IRule<AggPickmVO> {
singleObj.put("djxh", body.getVrowno());
//djrq datetime 单据日期 必填
singleObj.put("djrq", head.getDmakedate());
singleObj.put("djrq", head.getDmakedate().toString());
//wlbm_wbid varchar(100) 第三方系统物料名称id 必填 物料编码的后台ID
singleObj.put("wlbm_wbid", wlbm_wbid);
//scjh_wbid varchar(100) 第三方系统生产计划ID 必填 生产计划号外部ID一般ERP系统的生产订单号
singleObj.put("scjh_wbid", head.getCsourcebillid());
//jhxh numeric(5) 计划序号 -生产订单行号
singleObj.put("jhxh", head.getVsourcebillrowno());
//djsl numeric(18,3) 单据数量 必填
singleObj.put("djsl", body.getNpscnum().getDouble());
UFDouble djsl = body.getNplanoutastnum() == null ? UFDouble.ZERO_DBL : body.getNplanoutastnum();
singleObj.put("djsl", djsl.getDouble());
//sddd varchar(510) 送达地点 必填 传仓库名称要求上位ERP仓库名称不重复
singleObj.put("sddd", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.NAME, StordocVO.PK_STORDOC, body.getCoutstockid()));
//sddd varchar(510)送达地点 必填 传仓库名称要求上位ERP仓库名称不重复
// singleObj.put("sddd", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.NAME, StordocVO.PK_STORDOC, body.getCoutstockid()));
//ckbh_wbid varchar(100) 第三方系统仓库id 必填 储区根据仓库默认同仓库多储区时两者必填
singleObj.put("ckbh_wbid",transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.CODE, StordocVO.PK_STORDOC, body.getCoutstockid()));
// singleObj.put("ckbh_wbid",body.getCoutstockid());
//qfbj int 签发标记 必填 默认1上位系统审核传至MOM 1
singleObj.put("qfbj", 1);
//cght_wbid varchar(100) 第三方系统合同id 必填 委外订单
singleObj.put("cght_wbid", head.getVfirstbillcode());
//cght_wbid varchar(100) 第三方系统合同id 必填 委外订单主键ID
singleObj.put("cght_wbid",head.getCfirstbillid());
//htbh varchar(100) 合同号 委外订单单据号
singleObj.put("htbh",head.getVfirstbillcode());
//cght_wbid varchar(100) 第三方系统合同id 必填
// singleObj.put("cght_wbid", transferCodeByPk("bd_defdoc", DefdocVO.CODE, DefdocVO.PK_DEFDOC, body.getVbdef5()));
details.add(singleObj);
}

View File

@ -51,10 +51,10 @@ public class PMOApproveBP {
processer.addAfterRule(new PMOCreatePSCPlanRule());
ICompareRule<PMOAggVO> auditSupplyRule = new PMOApproveAuditSupplyRule();
processer.addAfterRule(auditSupplyRule);
// 审批后推送到RZ系统
// 审批后推送到锐制系统
processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ(true));
// 审批后推送流程生产订单到MES
processer.addAfterRule(new AfterApproveRuleSyncMes());
// processer.addAfterRule(new AfterApproveRuleSyncMes());
}

View File

@ -52,7 +52,7 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<PMOAggVO> {
return;
}
// 推送到RZ系统
// 推送到锐制系统
pushToRZMOM(filteredOrders.toArray(new PMOAggVO[0]));
} catch (Exception e) {
log.error("同步生产订单到RZ系统失败: " + e.getMessage());

View File

@ -30,7 +30,7 @@ public class WrAutoProdInFilterBP {
public AggWrVO[] filter(AggWrVO[] aggWrVOs) {
// 过滤交易类型是否勾选了自动入库
//过滤交易类型是否勾选了自动入库
List<String> transIDs = new ArrayList<String>();
for (AggWrVO aggvo : aggWrVOs) {
if (!WrBillStatusEnum.COMMITE.equalsValue(aggvo.getParentVO().getFbillstatus())) {
@ -96,7 +96,7 @@ public class WrAutoProdInFilterBP {
// 设置库存组织和仓库
IRule<AggWrVO> wrProdInSetInStockOrgRule = new WrProdInSetInStockOrgRule();
wrProdInSetInStockOrgRule.process(filterVOs);
//2025年5月30日08点45分 --外部系统推送接口时填了仓库此处不清空
//2025年5月30日08点45分 -- 外部系统推送接口时填了仓库此处不清空
String userCode = InvocationInfoProxy.getInstance().getUserCode();
if("rzmes".equals(userCode)||"MES".equals(userCode)){

View File

@ -21,7 +21,7 @@ public class WrProdInSetInStockOrgRule implements IRule<AggWrVO> {
@Override
public void process(AggWrVO[] vos) {
// 判空
//判空
if (MMValueCheck.isEmpty(vos)) {
return;
}
@ -122,7 +122,7 @@ public class WrProdInSetInStockOrgRule implements IRule<AggWrVO> {
}
//2025年5月30日08点45分 --外部系统推送接口时填了仓库此处不清空
//2025年5月30日08点45分 --外部系统推送接口时填了仓库 此处不清空
if("rzmes".equals(userCode)||"MES".equals(userCode)){
}else{

View File

@ -130,7 +130,7 @@ public class WrResource extends AbstractNCCRestResource {
voList.add(vo);
IAPIWrMaintain server = NCLocator.getInstance().lookup(IAPIWrMaintain.class);
List<AggWrVO> aggWrVOS = TransferCodeToPKTool.transferAggVO(voList);
//翻译报告类型
// 翻译报告类型
BaseDAO baseDAO = new BaseDAO();
for (AggWrVO aggWrVO : aggWrVOS) {
List<BilltypeVO> collection = (List<BilltypeVO>) baseDAO.retrieveByClause(BilltypeVO.class, " pk_billtypecode='" + aggWrVO.getParentVO().getVtrantypecode() + "'");
@ -609,7 +609,7 @@ public class WrResource extends AbstractNCCRestResource {
*/
private void processMESFields(Map<String, Object> itemMap, BaseDAO baseDAO) throws BusinessException {
// 检查是否需要处理MES字段
//检查是否需要处理MES字段
// 这里可以通过上下文用户信息或其他标识来判断
// 暂时通过检查是否存在特定字段来判断是MES用户
boolean isMESUser = isMESUser(itemMap);
@ -619,7 +619,7 @@ public class WrResource extends AbstractNCCRestResource {
}
try {
// 设置cbmoid保持和vbsrcid一致
//设置cbmoid保持和vbsrcid一致
if (itemMap.containsKey("vbsrcid") && MMValueCheck.isNotEmpty(itemMap.get("vbsrcid"))) {
itemMap.put("cbmoid", itemMap.get("vbsrcid"));
}

View File

@ -52,7 +52,7 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<OrderVO> {
if (newOrderVOS.isEmpty()) {
return;
}
// 推送到睿智系统
//推送到锐制系统
pushToRZMOM(newOrderVOS.toArray(new OrderVO[0]));
} catch (Exception e) {
log.error("同步采购订单到锐制系统失败: " + e.getMessage());

View File

@ -111,7 +111,7 @@ public class OrderApproveAction {
processer.addAfterRule(new OrderRewritePMStartDateRule(true));
processer.addAfterRule(new OrderApprovePMSupplyRule());
// 采购订单审批后同步到锐制MES系统
// 采购订单审批后同步到锐制系统
processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ());
}

View File

@ -0,0 +1,985 @@
package nc.impl.pu.m21.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nc.bs.pu.m21.action.rule.approve.AfterApprovingSynchronizeRuleRZ;
import nc.bs.pu.m21.maintain.OrderReviseUpdateBP;
import nc.bs.pu.m21.maintain.rule.save.SaveTransferMsgRule;
import nc.bs.pu.m21.plugin.OrderPluginPoint;
import nc.bs.scmpub.rule.VOSagaFrozenValidateRule;
import nc.impl.pu.m21.action.rule.approve.ApproveM21AndRewriteCTPayPlan;
import nc.impl.pu.m21.action.rule.approve.FilterOrderByStatusRule;
import nc.impl.pu.m21.action.rule.approve.OrderPriceMaintainRule;
import nc.impl.pu.m21.action.rule.revise.ArrivalOpenCheckRule;
import nc.impl.pu.m21.action.rule.revise.BrefwhenreturnCheckRule;
import nc.impl.pu.m21.action.rule.revise.CheckBfinalcloseRule;
import nc.impl.pu.m21.action.rule.revise.CheckOverPay;
import nc.impl.pu.m21.action.rule.revise.InvoiceOpenCkeckRule;
import nc.impl.pu.m21.action.rule.revise.ItemChangeCheckRule;
import nc.impl.pu.m21.action.rule.revise.ItemRule;
import nc.impl.pu.m21.action.rule.revise.ModifyStatusOnWayRule;
import nc.impl.pu.m21.action.rule.revise.ModifySupplyRule;
import nc.impl.pu.m21.action.rule.revise.NnumCheckRule;
import nc.impl.pu.m21.action.rule.revise.OneContractCheckRule;
import nc.impl.pu.m21.action.rule.revise.OpenCheckRule;
import nc.impl.pu.m21.action.rule.revise.OrderPayPlanVOReviseRule;
import nc.impl.pu.m21.action.rule.revise.ReviseBudgetCtrlRule;
import nc.impl.pu.m21.action.rule.revise.ReviseNumCheckRule;
import nc.impl.pubapp.pattern.data.bill.tool.BillConcurrentTool;
import nc.impl.pubapp.pattern.database.DataAccessUtils;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.itf.pu.reference.ic.ATPServices;
import nc.vo.pu.m21.context.OrderContext;
import nc.vo.pu.m21.entity.OrderFeeVO;
import nc.vo.pu.m21.entity.OrderHeaderVO;
import nc.vo.pu.m21.entity.OrderItemVO;
import nc.vo.pu.m21.entity.OrderMatFeeVO;
import nc.vo.pu.m21.entity.OrderVO;
import nc.vo.pu.m21.enumeration.EnumActive;
import nc.vo.pu.m21.enumeration.EnumRevise;
import nc.vo.pu.m21.utils.ExtBillHasGrandsonDataUtils;
import nc.vo.pu.pub.constant.PUEntity;
import nc.vo.pu.pub.enumeration.POEnumBillStatus;
import nc.vo.pu.pub.rule.ApprovingEditCheckRule;
import nc.vo.pu.pub.rule.ApprovingEditSendMsgRule;
import nc.vo.pu.pub.util.BillQuery;
import nc.vo.pu.pub.util.BillUpdate;
import nc.vo.pub.BusinessException;
import nc.vo.pub.JavaType;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.tool.performance.DeepCloneTool;
import nc.vo.scmpub.res.billtype.POBillType;
import nc.vo.scmpub.util.ArrayUtil;
import nc.vo.scmpub.util.TimeUtils;
import nccloud.commons.lang.ArrayUtils;
import nccloud.pubimpl.pu.mobile.service.order.MobAfterReviseForPoOrderImpl;
public class OrderReviseApproveAction {
/**
* 采购订单修订审批通过后的交换主键执行更新的操作
*/
public OrderVO[] approve(OrderVO[] orderVos, OrderContext ctx) {
if (ArrayUtils.isEmpty(orderVos)) {
return null;
}
// 取到client端vo
// OrderVO[] cliVOs = orderVos;
// BillTransferTool<OrderVO> tool = new BillTransferTool<OrderVO>(orderVos);
ExtBillHasGrandsonDataUtils<OrderVO> tool = new ExtBillHasGrandsonDataUtils<OrderVO>(orderVos);
DeepCloneTool clone = new DeepCloneTool();
// BillTransferTool<OrderVO> tool = new BillTransferTool<OrderVO>(orderVos);
OrderVO[] cliVOs = (OrderVO[])clone.deepClone(orderVos);;
String approver = cliVOs[0].getHVO().getApprover();
UFDate taudittime =cliVOs[0].getHVO().getTaudittime();
Integer forderstatus = cliVOs[0].getHVO().getForderstatus();
OrderVO[] voOrginal = tool.getOriginBills();
// 通过pk_src查询出原始vo
OrderVO[] oldOrgVos = this.queryOldVosByNewVos(cliVOs);
if (ArrayUtils.isEmpty(oldOrgVos)) {
return null;
}
String creator = oldOrgVos[0].getHVO().getCreator(); // 创建人
UFDateTime creationtime =oldOrgVos[0].getHVO().getCreationtime(); // 创建时间
// 可用量更新前处理
this.atpBeforeUpdate(oldOrgVos);
// 先查询原始版本vos对vos加锁再查询一遍这时能保证完全锁住vos获得的数据库vos是正确的
BillConcurrentTool utilBill = new BillConcurrentTool();
utilBill.lockBill(oldOrgVos);
oldOrgVos = this.queryOldVosByNewVos(cliVOs);
//获取原始版本的付款协议直接给最新版本使用
// OrderPaymentVO[] paymentItem = oldOrgVos[0].getPaymentVO();
cliVOs = this.setWriteBackNums(cliVOs, oldOrgVos);
// cliVOs = new BillUpdate<OrderVO>().update(cliVOs, voOrginal);
// 提交时补充孙表
// new FeeDetailVOUtils().setOrderMatFeeVO(cliVOs);
// new FeeDetailVOUtils().setOrderMatFeeVO(oldOrgVos);
// new FeeDetailVOUtils().setOrderMatFeeVO(voOrginal);
try{
cliVOs = (OrderVO[])new BillUpdate().update(cliVOs,voOrginal,OrderHeaderVO.PK_ORDER);
}catch (BusinessException e){
ExceptionUtils.wrappException(e);
}
Map<String, String> hmap = new HashMap<String, String>();
Map<String, String> bmap = new HashMap<String, String>();
OrderVO[] CliVOClone = new OrderVO[cliVOs.length];
for (int i = 0; i < CliVOClone.length; i++) {
CliVOClone[i] = (OrderVO) cliVOs[i].clone();
}
OrderVO[] OrgVoClone = new OrderVO[oldOrgVos.length];
for (int i = 0; i < OrgVoClone.length; i++) {
OrgVoClone[i] = (OrderVO) oldOrgVos[i].clone();
}
this.changePK(cliVOs,oldOrgVos, hmap,bmap);
OrderVO[] hisVOs =this.queryNewVosByOldVos(cliVOs);
OrderVO[] lastestVOs =this.queryNewVosByOldVos(oldOrgVos);
// // 提交时补充孙表
// new FeeDetailVOUtils().setOrderMatFeeVO(lastestVOs);
// // 提交时补充孙表
// new FeeDetailVOUtils().setOrderMatFeeVO(hisVOs);
OrgVoClone[0].getHVO().setForderstatus(lastestVOs[0].getHVO().getForderstatus());
// 交换cliVOs主键
OrderVO[] newCliVO = this.changeClientVoWithPK(oldOrgVos, lastestVOs, hmap,
bmap,forderstatus,approver,taudittime,creator,creationtime);
// 交换oldOrgVos主键 此方法返回变量无用先注掉
OrderVO[] newOrgVos = this.changeoldOrgVosWithPK(hisVOs, cliVOs, hmap,
bmap);
// 更新OrgVO
// this.updateOrgVO(newOrgVos, CliVOClone);
// 更新clientVO
OrderVO[] retVOs = this.updateClientVO(newCliVO, OrgVoClone, ctx);
return retVOs;
}
/**
* 方法功能描述可用量更新前处理后续会更新主键导致可用量数据不正确在此提前处理
* <p>
* <b>参数说明</b>
* <p>
*
* @since 6.0
* @author wuxla
* @time 2010-7-2 下午01:24:05
*/
private void atpBeforeUpdate(OrderVO[] vos) {
ATPServices.modifyATPBefore(POBillType.Order.getCode(), vos);
}
private void changePK(OrderVO[] cliVOs,OrderVO[] oldOrgVos, Map<String, String> hmap, Map<String, String> bmap) {
DataAccessUtils d = new DataAccessUtils();
List<List<Object>> datas = new ArrayList<List<Object>>();
List<List<Object>> srcdatas = new ArrayList<List<Object>>();
List<List<Object>> bdatas = new ArrayList<List<Object>>();
List<List<Object>> srcbdatas = new ArrayList<List<Object>>();
Map<String,String> newkeyhmap = new HashMap<String,String>();
Map<String,String> newkeybmap = new HashMap<String,String>();
// 费用项
List<List<Object>> feeBdatas = new ArrayList<List<Object>>();
List<List<Object>> feesrcBdatas = new ArrayList<List<Object>>();
// 费用明细
List<List<Object>> feeDetailBdatas = new ArrayList<List<Object>>();
List<List<Object>> feeDetailsrcBdatas = new ArrayList<List<Object>>();
//简单记录 原始订单 表头主键 A-~ ,修订订单 表头主键B-A
//过程如下 三步
//A-~, B-A
//A-~, C-A
//B-A, C-A
//B-A, A-A
//第一步 B-A,C-A
for (int i = 0; i < cliVOs.length; i++) {
//
OrderHeaderVO voHead = cliVOs[i].getHVO();
String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk
String newhpk ="1ZH" + pk_srcorder.substring(3);
hmap.put(pk_srcorder, voHead.getPk_order());
newkeyhmap.put(pk_srcorder, newhpk);
datas = this.getForeignAddParam(datas, newhpk, voHead.getPk_order());
//
OrderItemVO[] voBody = cliVOs[i].getBVO();
for (OrderItemVO body : voBody) {
if (body.getPk_srcorder_b() != null) {
bmap.put(body.getPk_srcorder_b(), body.getPk_order_b());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String newbpk = "1ZH" + body.getPk_srcorder_b().substring(3);
newkeybmap.put(body.getPk_srcorder_b(), newbpk);
bdatas = this.getForeignAddParam(bdatas, newbpk, body.getPk_order_b());
}
// 物料行对应费用明细
OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVOs)){
for (OrderMatFeeVO matFee : matFeeVOs) {
if (matFee.getPk_srcorder_bf() != null) {
bmap.put(matFee.getPk_srcorder_bf(), matFee.getPk_order_bf());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String newbpk = "1ZH" + matFee.getPk_order_bf().substring(3);
newkeybmap.put(matFee.getPk_srcorder_bf(), newbpk);
feeDetailBdatas = this.getForeignAddParam(feeDetailBdatas, newbpk, matFee.getPk_order_bf());
}
}
}
}
// 费用项
OrderFeeVO[] feeVos = cliVOs[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVos)){
for (OrderFeeVO fee : feeVos) {
if (fee.getPk_srcorder_f() != null) {
bmap.put(fee.getPk_srcorder_f(), fee.getPk_order_f());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String newbpk = "1ZH" + fee.getPk_srcorder_f().substring(3);
newkeybmap.put(fee.getPk_srcorder_f(), newbpk);
feeBdatas = this.getForeignAddParam(feeBdatas, newbpk, fee.getPk_order_f());
}
}
}
}
d.update(this.getSql(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas);
d.update(this.getSql(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas);
d.update(this.getSql(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas);
// if(feeBdatas.size() != 0){
// 费用项
d.update(this.getSql(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F),
new JavaType[] {
JavaType.String, JavaType.String
}, feeBdatas);
d.update(this.getSql(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas);
// }
// if(feeBdatas.size() != 0){
// 费用明细
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF),
new JavaType[] {
JavaType.String, JavaType.String
}, feeDetailBdatas);
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas);
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas);
// }
//第二步(1)A-~,A-A (2)A-A,B-A bmap key:A value:B newkeybmap:key:A value :C
List<List<Object>> datas2 = new ArrayList<List<Object>>();
List<List<Object>> bdatas2 = new ArrayList<List<Object>>();
List<List<Object>> feeDetailBdatas2 = new ArrayList<List<Object>>();
List<List<Object>> feeBdatas2 = new ArrayList<List<Object>>();
for (int i = 0; i < oldOrgVos.length; i++) {
//
OrderHeaderVO voHead = oldOrgVos[i].getHVO();
String pk_order = voHead.getPk_order();
if (hmap.containsKey(pk_order)) {
srcdatas = this.getForeignAddParam(srcdatas, pk_order, pk_order);
}
//
OrderItemVO[] voBody = oldOrgVos[i].getBVO();
for (OrderItemVO body : voBody) {
if (body.getPk_order_b() != null) {
if (bmap.containsKey(body.getPk_order_b())) {
srcbdatas= this.getForeignAddParam(srcbdatas, body.getPk_order_b(), body.getPk_order_b());
}
}
// 费用明细
OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVOs)){
for(OrderMatFeeVO matFeeVO : matFeeVOs){
if (matFeeVO.getPk_order_bf() != null) {
if (bmap.containsKey(matFeeVO.getPk_order_bf())) {
feeDetailsrcBdatas= this.getForeignAddParam(feeDetailsrcBdatas, matFeeVO.getPk_order_bf(), matFeeVO.getPk_order_bf());
}
}
}
}
}
// 费用项
OrderFeeVO[] feeVOS = oldOrgVos[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVOS)){
for(OrderFeeVO feeVO : feeVOS){
if (feeVO.getPk_order_f() != null) {
if (bmap.containsKey(feeVO.getPk_order_f())) {
feesrcBdatas= this.getForeignAddParam(feesrcBdatas, feeVO.getPk_order_f(), feeVO.getPk_order_f());
}
}
}
}
}
d.update(this.getSqlForHisVO(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_SRCORDER,OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, srcdatas);
d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderItemVO.PK_SRCORDER_B,OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, srcbdatas);
// if(feesrcBdatas.size() != 0){
// 费用项
d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderFeeVO.PK_SRCORDER_F,OrderFeeVO.PK_ORDER_F),
new JavaType[] {
JavaType.String, JavaType.String
}, feesrcBdatas);
// }
// if(feeDetailsrcBdatas.size() != 0){
// 费用明细
d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_SRCORDER_BF,OrderMatFeeVO.PK_ORDER_BF),
new JavaType[] {
JavaType.String, JavaType.String
}, feeDetailsrcBdatas);
// }
// A-A ,B-A
for (int i = 0; i < oldOrgVos.length; i++) {
//
OrderHeaderVO voHead = oldOrgVos[i].getHVO();
String pk_order = voHead.getPk_order();
String pk_src_order = null;
if (hmap.containsKey(pk_order)) {
pk_src_order = hmap.get(pk_order);
datas2 = this.getForeignAddParam(datas2, pk_src_order, pk_order);
}
//
OrderItemVO[] voBody = oldOrgVos[i].getBVO();
for (OrderItemVO body : voBody) {
if (body.getPk_order_b() != null) {
if (bmap.containsKey(body.getPk_order_b())) {
String pk_src_order_b = bmap.get(body.getPk_order_b());
bdatas2 = this.getForeignAddParam(bdatas2, pk_src_order_b, body.getPk_order_b());
}
}
// 费用明细
OrderMatFeeVO[] matFeeVOs = body.getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVOs)) {
for(OrderMatFeeVO matFeeVO : matFeeVOs){
if (matFeeVO.getPk_order_bf() != null) {
if (bmap.containsKey(matFeeVO.getPk_order_bf())) {
String pk_src_order_bf = bmap.get(matFeeVO.getPk_order_bf());
feeDetailBdatas2 = this.getForeignAddParam(feeDetailBdatas2, pk_src_order_bf, matFeeVO.getPk_order_bf());
}
}
}
}
}
// 费用项
OrderFeeVO[] feeVOS = oldOrgVos[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVOS)) {
for(OrderFeeVO fee : feeVOS){
if (fee.getPk_order_f() != null) {
if (bmap.containsKey(fee.getPk_order_f())) {
String pk_src_order_bf = bmap.get(fee.getPk_order_f());
feeBdatas2 = this.getForeignAddParam(feeBdatas2, pk_src_order_bf, fee.getPk_order_f());
}
}
}
}
}
d.update(this.getSqlForHisVO(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas2);
d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B,OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas2);
d.update(this.getSqlForHisVO(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas2);
// if(feeBdatas2.size() != 0){
// 费用项
d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F,OrderFeeVO.PK_ORDER_F),
new JavaType[] {
JavaType.String, JavaType.String
}, feeBdatas2);
d.update(this.getSqlForHisVO(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas2);
// }
// if(feeDetailBdatas2.size() != 0){
// 费用明细
d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF,OrderMatFeeVO.PK_ORDER_BF),
new JavaType[] {
JavaType.String, JavaType.String
}, feeDetailBdatas2);
d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER,OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas2);
d.update(this.getSqlForHisVO(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B,OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas2);
// }
//第三步C-A,A-A
List<List<Object>> datas3 = new ArrayList<List<Object>>();
List<List<Object>> bdatas3 = new ArrayList<List<Object>>();
List<List<Object>> feeDetailBdatas3 = new ArrayList<List<Object>>();
List<List<Object>> feeBdatas3 = new ArrayList<List<Object>>();
for (int i = 0; i < cliVOs.length; i++) {
//
OrderHeaderVO voHead = cliVOs[i].getHVO();
String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk
String needchangedhkey = newkeyhmap.get(pk_srcorder);
datas3 = this.getForeignAddParam(datas3, pk_srcorder, needchangedhkey);
//
OrderItemVO[] voBody = cliVOs[i].getBVO();
for (OrderItemVO body : voBody) {
if (body.getPk_srcorder_b() != null) {
bmap.put(body.getPk_srcorder_b(), body.getPk_order_b());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String needchangedbkey = newkeybmap.get(body.getPk_srcorder_b());
bdatas3 = this.getForeignAddParam(bdatas3, body.getPk_srcorder_b(), needchangedbkey);
}
// 费用明细
OrderMatFeeVO[] matFeeVOS = body.getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVOS)){
for(OrderMatFeeVO matFee : matFeeVOS){
if (matFee.getPk_srcorder_bf() != null) {
bmap.put(matFee.getPk_srcorder_bf(), matFee.getPk_order_bf());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String needchangedbfeekey = newkeybmap.get(matFee.getPk_srcorder_bf());
feeDetailBdatas3 = this.getForeignAddParam(feeDetailBdatas3, matFee.getPk_srcorder_bf(), needchangedbfeekey);
}
}
}
}
// 费用项
OrderFeeVO[] feeVOS = cliVOs[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVOS)){
for(OrderFeeVO fee : feeVOS){
if (fee.getPk_srcorder_f() != null) {
bmap.put(fee.getPk_srcorder_f(), fee.getPk_order_f());
// body.setPk_order_b(body.getPk_srcorder_b());// 将原始版本pk赋值给表体主键这里需要注意可能存在修订增行的场景导致pk_srcorder_b为空所以这里需要判断一下
String needchangedbfeedetailkey = newkeybmap.get(fee.getPk_srcorder_f());
feeBdatas3 = this.getForeignAddParam(feeBdatas3, fee.getPk_srcorder_f(), needchangedbfeedetailkey);
}
}
}
}
d.update(this.getSql(PUEntity.M21_H_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas3);
d.update(this.getSql(PUEntity.M21_B_TABLE, OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas3);
d.update(this.getSql(PUEntity.M21_B_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas3);
// if(feeBdatas3.size() != 0){
// 费用项
d.update(this.getSql(PUEntity.M21_F_TABLE, OrderFeeVO.PK_ORDER_F),
new JavaType[] {
JavaType.String, JavaType.String
}, feeBdatas3);
d.update(this.getSql(PUEntity.M21_F_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas3);
// }
// if(feeDetailBdatas3.size() != 0){
// 费用明细
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderMatFeeVO.PK_ORDER_BF),
new JavaType[] {
JavaType.String, JavaType.String
}, feeDetailBdatas3);
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderHeaderVO.PK_ORDER),
new JavaType[] {
JavaType.String, JavaType.String
}, datas3);
d.update(this.getSql(PUEntity.M21_B_F_TABLE, OrderItemVO.PK_ORDER_B),
new JavaType[] {
JavaType.String, JavaType.String
}, bdatas3);
// }
// return cliVOs;
}
/**
* 更新OrgVO
* @param newOrgVos
* @param cliVOs
*/
private OrderVO[] updateOrgVO(OrderVO[] newOrgVos, OrderVO[] cliVOs) {
OrderVO[] retVOs = null;
try{
retVOs = (OrderVO[])new BillUpdate().update(newOrgVos,cliVOs,OrderHeaderVO.PK_ORDER);
}catch (BusinessException e){
ExceptionUtils.wrappException(e);
}
return retVOs;
}
/**
* 更新clientVO
* @param newCliVO
* @param oldOrgVos
* @param ctx
*/
private OrderVO[] updateClientVO(OrderVO[] newCliVO, OrderVO[] oldOrgVos,
OrderContext ctx) {
if (ArrayUtils.isEmpty(newCliVO)) {
return null;
}
// 特殊处理
// 前台差异处理时因为界面没有付款计划所以将其设置为删除
// 设置成不变
// this.setPayPlanStatus(newCliVO);
// 规则
CompareAroundProcesser<OrderVO> processer = new CompareAroundProcesser<OrderVO>(
OrderPluginPoint.REVISE);
this.addBeforeRule(processer);
this.addAfterRule(processer, ctx);
// 执行最新版的采购订单保存
processer.before(newCliVO, oldOrgVos);
OrderVO[] retVOs = new OrderReviseUpdateBP(ctx).update(newCliVO, oldOrgVos);
processer.after(retVOs, oldOrgVos);
return retVOs;
}
// private void setPayPlanStatus(OrderVO[] voSaved) {
//
// for (OrderVO vo : voSaved) {
// ISuperVO[] vos = vo.getChildren(PayPlanVO.class);
// if (ArrayUtils.isEmpty(vos)) {
// continue;
// }
// PayPlanVO[] payplanVOs = ArrayUtil.convertArrayType(vos);
// for (PayPlanVO payplanVO : payplanVOs) {
// payplanVO.setStatus(VOStatus.UNCHANGED);
// }
// }
// }
/**
* 方法功能描述保存前规则
* <p>
* <b>参数说明</b>
*
* @param processer
* <p>
* @since 6.0
* @author wuxla
* @time 2010-3-26 下午06:41:24
*/
private void addBeforeRule(CompareAroundProcesser<OrderVO> processer) {
// 冻结状态校验 add by CONGKE for NCCNATIVE 2019-11-21
processer.addBeforeRule(new VOSagaFrozenValidateRule<OrderVO>(true));
//新增加一个前规则用来判断订单是否最终关闭如果已经最终关闭不允许修订add by zhanghrh 2021.9.22
processer.addBeforeRule(new CheckBfinalcloseRule());
// 参数合法性检查
processer.addBeforeRule(new ItemRule());
processer.addBeforeRule(new NnumCheckRule());
// 表头退货()基于原订单补货检查有后续单据不允许修改退货/库基于原订单补货字段
processer.addBeforeRule(new BrefwhenreturnCheckRule());
// 表体不能改变项检查有后续单据表体批次号需求部门项目收货仓库收货地址赠品不能修改
processer.addBeforeRule(new ItemChangeCheckRule());
// 合同检查修订前单据来自同一个合同则不能将订单改为来自多个合同的订单
processer.addBeforeRule(new OneContractCheckRule());
// 支持审批中修改修订的单据检查是否应该由当前审批人修改修订
processer.addBeforeFinalRule(
new ApprovingEditCheckRule<OrderVO>(POBillType.Order));
// 支持审批中修改修订的单据后台向所有已经处理过审批任务的人发送消息
processer.addBeforeFinalRule(new ApprovingEditSendMsgRule<OrderVO>());
// 移动端修订数量合法性检查 add by hanxqm 2019年6月22日 16点06分
//processer.addBeforeFinalRule(new MobBeforeReviseForPoOrderImpl());
// 校验修订后金额是否超过累计付款金额
processer.addBeforeFinalRule(new CheckOverPay());
}
/**
* 方法功能描述保存后规则
* <p>
* <b>参数说明</b>
*
* @param processer
* <p>
* @since 6.0
* @author wuxla
* @time 2010-3-26 下午06:41:30
*/
private void addAfterRule(CompareAroundProcesser<OrderVO> processer,
OrderContext ctx) {
// 修订数量合法性检查修订后的数量与原数量同正负且不能小于后续数量
processer.addAfterRule(
new ReviseNumCheckRule(ctx.getReviseToleranceConfirm().booleanValue()));
// 只处理审批后的数据因审批中修订会有未审批通过的数据过来
processer.addAfterRule(
new FilterOrderByStatusRule(POEnumBillStatus.APPROVE.toInt()));
processer.addAfterRule(new ModifySupplyRule());
processer.addAfterRule(new ReviseBudgetCtrlRule());
// 修改在途状态表中数据
processer.addAfterRule(new ModifyStatusOnWayRule());
// 更新价格表
processer.addAfterRule(new OrderPriceMaintainRule());
// ncm add by zhangllb 20170519 采购订单修订时更新订单付款计划
// processer.addAfterRule(new OrderPayPlanReviseRule());
// 采购订单修订更新采购订单付款计划 add by yinliangc 20220312
processer.addAfterRule(new OrderPayPlanVOReviseRule());
// 移动端向供应商发送通知消息 zhaofengt 2019/7/30
processer.addAfterRule(new MobAfterReviseForPoOrderImpl());
// 判断是否自动到货打开
processer.addAfterRule(new ArrivalOpenCheckRule());
// 判断是否自动入库打开
processer.addAfterRule(new OpenCheckRule());
// 判断是否自动开票打开
processer.addAfterRule(new InvoiceOpenCkeckRule());
// 采购订单修订审批回写采购合同付款计划
processer.addAfterFinalRule(new ApproveM21AndRewriteCTPayPlan());
// 调用内部交易信息
processer.addAfterRule(new SaveTransferMsgRule());
// 采购订单审批后同步到锐制系统
processer.addAfterFinalRule(new AfterApprovingSynchronizeRuleRZ());
}
/**
* 得到交换主键最新oldOrgVos
*
* @param oldOrgVos
* @return
*/
private OrderVO[] changeoldOrgVosWithPK(OrderVO[] oldOrgVos, OrderVO[] cliVOs,
Map<String, String> hmap, Map<String, String> bmap) {
UFDate correctdate = TimeUtils.getsrvBaseDate();
OrderVO[] cloneVos = new OrderVO[oldOrgVos.length];
// 交换oldOrgVos的pk
for (int i = 0; i < oldOrgVos.length; i++) {
cloneVos[i] = (OrderVO) oldOrgVos[i].clone();
//
OrderHeaderVO voHead = oldOrgVos[i].getHVO();
voHead.setStatus(VOStatus.UPDATED);
voHead.setBislatest(UFBoolean.FALSE);
voHead.setBisReviseLatest(UFBoolean.FALSE);
voHead.setRevisionStatus(Integer.valueOf(EnumRevise.REVISE.toIntValue()));
//
OrderItemVO[] voItems = oldOrgVos[i].getBVO();
for (int j = 0; j < voItems.length; ++j) {
//设置修订人员和日期
voItems[j].setDcorrectdate(correctdate);
voItems[j].setChandler(cliVOs[i].getHVO().getCrevisepsn());
//设置历史数据
voItems[j].setFisactive((Integer) EnumActive.REVISEHISTORY.value());
voItems[j].setStatus(VOStatus.UPDATED);
// 费用明细
OrderMatFeeVO[] matFeeVO = voItems[j].getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVO)){
for(OrderMatFeeVO matFee : matFeeVO){
matFee.setStatus(VOStatus.UPDATED);
}
}
}
// 费用项
OrderFeeVO[] feeVO = oldOrgVos[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVO)){
for(OrderFeeVO fee : feeVO){
fee.setStatus(VOStatus.UPDATED);
}
}
/*
* add by wandl 清空付款协议,付款计划主键修订含有付款协议的订单会报违反唯一约束
*/
// OrderPaymentVO[] paymentItem = newOrgVos[i].getPaymentVO();
// for (OrderPaymentVO payment : paymentItem) {
//// payment.setPk_payment(null);
// payment.setStatus(VOStatus.DELETED);
// }
// PayPlanVO[] payplanItem = (PayPlanVO[])newOrgVos[i].getChildren(PayPlanVO.class);
// for (PayPlanVO payplan : payplanItem) {
//// payplan.setPk_order_payplan(null);
// payplan.setStatus(VOStatus.DELETED);
// }
}
OrderVO[] retVO =this.updateOrgVO(oldOrgVos, cloneVos);
/**
* 注意付款协议表体
*/
return retVO;
}
/**
* 得到交换主键最新cliVOs
*
* @param cliVOs
* @param forderstatus
* @param taudittime
* @param approver
*/
private OrderVO[] changeClientVoWithPK(OrderVO[] oldOrgVos, OrderVO[] cliVOs,
Map<String, String> hmap, Map<String, String> bmap, Integer forderstatus,
String approver, UFDate taudittime, String creator,UFDateTime creationtime) {
OrderVO[] cloneVos =new OrderVO[cliVOs.length];
// 交换newCliVO的pk
for (int i = 0; i < cliVOs.length; i++) {
cloneVos[i] = (OrderVO) cliVOs[i].clone();
//
OrderHeaderVO voHead = cliVOs[i].getHVO();
voHead.setStatus(VOStatus.UPDATED);
voHead.setForderstatus(forderstatus);
voHead.setApprover(approver);
voHead.setTaudittime(taudittime);
voHead.setCreator(creator);
voHead.setCreationtime(creationtime);
voHead.setModifier(AppContext.getInstance().getPkUser());
voHead.setModifiedtime(AppContext.getInstance().getServerTime());
// String pk_srcorder = voHead.getPk_Srcorder();// 获取原始版本表头pk
// hmap.put(pk_srcorder, voHead.getPk_order());
// voHead.setPk_order(pk_srcorder);// 将原始版本pk赋值给表头主键
voHead.setBislatest(UFBoolean.TRUE);// 设置为最新版本
voHead.setBisReviseLatest(UFBoolean.TRUE);//设置修订可见最新版本
voHead.setRevisionStatus(Integer.valueOf(EnumRevise.SIMPLE.toIntValue()));// 将修订状态置为普通避免在采购订单维护节点收回的单据还会走采购订单修订的审批流
//
OrderItemVO[] voBody = cliVOs[i].getBVO();
for (OrderItemVO body : voBody) {
// body.setPk_order(pk_srcorder);// 将表体存放的表头主键也替换为原始版本pk
body.setStatus(VOStatus.UPDATED);
// 费用明细
OrderMatFeeVO[] matFeeVO = body.getGrandSonVOS();
if(!ArrayUtil.isEmpty(matFeeVO)){
for(OrderMatFeeVO matFee : matFeeVO){
matFee.setStatus(VOStatus.UPDATED);
}
}
}
// 费用项
OrderFeeVO[] feeVO = cliVOs[i].getOrderFeeVO();
if(!ArrayUtil.isEmpty(feeVO)){
for(OrderFeeVO fee : feeVO){
fee.setStatus(VOStatus.UPDATED);
}
}
/*
* clintVO在修订保存的时候清空了付款协议和付款计划在这补回来
*/
//付款协议
// OrderPaymentVO[] paymentItemcliVOs = newCliVO[i].getPaymentVO();
// OrderPaymentVO[] paymentItemOrgVos = oldOrgVos[i].getPaymentVO();
// for (int j = 0; j < paymentItemcliVOs.length; j++) {
// paymentItemcliVOs[j]
// .setPk_payment(paymentItemOrgVos[j].getPk_payment());
// paymentItemcliVOs[j].setStatus(VOStatus.UPDATED);
// }
//付款计划
// PayPlanVO[] payplanItemcliVOs = (PayPlanVO[]) newCliVO[i].getChildren(PayPlanVO.class);
// PayPlanVO[] payplanItemOrgVos = (PayPlanVO[]) oldOrgVos[i].getChildren(PayPlanVO.class);
// for(int k =0 ; k<payplanItemcliVOs.length; k++) {
// payplanItemcliVOs[k].setPk_order_payplan(payplanItemOrgVos[k].getPk_order_payplan());
// payplanItemcliVOs[k].setStatus(VOStatus.UPDATED);
// }
}
OrderVO[] retVO = this.updateOrgVO(cliVOs, cloneVos);
/**
* 注意付款协议表体
*/
return retVO;
}
/**
* 根据新版本VO数组查询原始版本VO数组
*
* @param newVos
* @since dev1.0
* @author zhanghrh
* @time 2021-6-9 下午04:39:00
*/
private OrderVO[] queryOldVosByNewVos(OrderVO[] newVos) {
String[] ids = new String[newVos.length];
for (int i = 0; i < newVos.length; i++) {
ids[i] = newVos[i].getHVO().getPk_Srcorder();
}
OrderVO[] hisVos = new BillQuery<OrderVO>(OrderVO.class).query(ids);
return hisVos;
}
/**
* 根据新版本VO数组查询原始版本VO数组
*
* @param newVos
* @since dev1.0
* @author zhanghrh
* @time 2021-6-9 下午04:39:00
*/
private OrderVO[] queryNewVosByOldVos(OrderVO[] newVos) {
String[] ids = new String[newVos.length];
for (int i = 0; i < newVos.length; i++) {
ids[i] = newVos[i].getHVO().getPk_order();
}
OrderVO[] hisVos = new BillQuery<OrderVO>(OrderVO.class).query(ids);
return hisVos;
}
/**
* 记录初始VO上所有下游回写订单的字段
*
* @param newVos
* @since dev1.0
* @author zhanghrh
* @time 2021-6-9 下午04:39:00
*/
private OrderVO[] setWriteBackNums(OrderVO[] newVos,OrderVO[] oldVos) {
Map<String,UFDouble[]> hmap = new HashMap<String,UFDouble[]>();
Map<String,UFDouble[]> bmap = new HashMap<String,UFDouble[]>();
Map<String,String[]> hmapString = new HashMap<String,String[]>();
Map<String,String[]> bmapString = new HashMap<String,String[]>();
Map<String,UFDate[]> bmapUFDate = new HashMap<String,UFDate[]>();
//遍历原始VO记录累计回写字段
for(OrderVO oldVo: oldVos) {
UFDouble[] hfiles = new UFDouble[3];
String[] hfilesString =new String[1];
OrderHeaderVO hvo =oldVo.getHVO();
//UFDouble类型
hfiles[0]=hvo.getNaccpayreqmny();//累计付款申请金额
hfiles[1]=hvo.getNaccpaymny();//累计付款金额
hfiles[2]=hvo.getNinvoicemny();//累计开票金额
hmap.put(hvo.getPk_order(), hfiles);
//String类型
hfilesString[0] = hvo.getVcoopordercode();//对方订单号
hmapString.put(hvo.getPk_order(), hfilesString);
OrderItemVO bvos[] = oldVo.getBVO();
for(OrderItemVO bvo: bvos) {
UFDouble[] bfiles = new UFDouble[17];
String[] bfilesString =new String[2];
UFDate[] bfilesUFDate =new UFDate[2];
//UFDouble类型
bfiles[0] = bvo.getNacccancelinvmny();//累计已核销开票金额
bfiles[1] = bvo.getNaccumarrvnum();//累计到货主数量
bfiles[2] = bvo.getNaccumdevnum();//累计运输主数量
bfiles[3] = bvo.getNaccuminvoicemny();//累计本币开票金额
bfiles[4] = bvo.getNaccuminvoicenum();//累计开票主数量
bfiles[5] = bvo.getNaccumpickupnum();//累计拣货主数量
bfiles[6] = bvo.getNaccumrpnum();//累计到货计划主数量
bfiles[7] = bvo.getNaccumstorenum();//累计入库主数量
bfiles[8] = bvo.getNaccumwastnum();//累计途耗主数量
bfiles[9] = bvo.getNbackarrvnum();//累计退货主数量
bfiles[10] = bvo.getNbackstorenum();//累计退库主数量
bfiles[11] = bvo.getNfeemny();//费用累计开票金额
bfiles[12] = bvo.getNconfirmnum();//确认数量
bfiles[13] = bvo.getNsuprsnum();//被预留数量
bfiles[14] = bvo.getNsendplannum();//送货计划数量
bfiles[15] = bvo.getNaccpaymny();//累计付款金额
bfiles[16] = bvo.getNaccpayreqmny();//累计付款申请金额
bmap.put(bvo.getPk_order_b(), bfiles);
//String类型
bfilesString[0] = bvo.getVvendorordercode();//对方订单号
bfilesString[1] = bvo.getVvendororderrow();//对方订单行号
// bfilesString[2] = bvo.getPk_schedule();//排程计划
// bfilesString[3] = bvo.getPk_schedule_b();//排程计划明细
bmapString.put(bvo.getPk_order_b(), bfilesString);
//UFDate类型
bfilesUFDate[0] = bvo.getDconfirmdate();//确认日期
bfilesUFDate[1] = bvo.getDcorrectdate();//修正日期
bmapUFDate.put(bvo.getPk_order_b(), bfilesUFDate);
}
}
//遍历前端传来的VO把累计回写字段按pk_src=pk 设置到前端VO中
for(OrderVO newVo :newVos) {
OrderHeaderVO newHVO =newVo.getHVO();
String pk_src_order = newHVO.getPk_Srcorder();
if(hmap.containsKey(pk_src_order)) {
newHVO.setStatus(VOStatus.UPDATED);
//UFDouble类型
newHVO.setNaccpayreqmny(hmap.get(pk_src_order)[0]);//累计付款申请金额
newHVO.setNaccpaymny(hmap.get(pk_src_order)[1]);//累计付款金额
newHVO.setNinvoicemny(hmap.get(pk_src_order)[2]);//累计开票金额
//String类型
newHVO.setVcoopordercode(hmapString.get(pk_src_order)[0]);//对方订单号
}
OrderItemVO newBVOs[] = newVo.getBVO();
for(OrderItemVO newBVO : newBVOs) {
String pk_src_order_b = newBVO.getPk_srcorder_b();
if(bmap.containsKey(pk_src_order_b)) {
newBVO.setStatus(VOStatus.UPDATED);
//UFDouble类型
newBVO.setNacccancelinvmny(bmap.get(pk_src_order_b)[0]);//累计已核销开票金额
newBVO.setNaccumarrvnum(bmap.get(pk_src_order_b)[1]);//累计到货主数量
newBVO.setNaccumdevnum(bmap.get(pk_src_order_b)[2]);//累计运输主数量
newBVO.setNaccuminvoicemny(bmap.get(pk_src_order_b)[3]);//累计本币开票金额
newBVO.setNaccuminvoicenum(bmap.get(pk_src_order_b)[4]);//累计开票主数量
newBVO.setNaccumpickupnum(bmap.get(pk_src_order_b)[5]);//累计拣货主数量
newBVO.setNaccumrpnum(bmap.get(pk_src_order_b)[6]);//累计到货计划主数量
newBVO.setNaccumstorenum(bmap.get(pk_src_order_b)[7]);//累计入库主数量
newBVO.setNaccumwastnum(bmap.get(pk_src_order_b)[8]);//累计途耗主数量
newBVO.setNbackarrvnum(bmap.get(pk_src_order_b)[9]);//累计退货主数量
newBVO.setNbackstorenum(bmap.get(pk_src_order_b)[10]);//累计退库主数量
newBVO.setNfeemny(bmap.get(pk_src_order_b)[11]);//费用累计开票金额
newBVO.setNconfirmnum(bmap.get(pk_src_order_b)[12]);//确认数量
newBVO.setNsuprsnum(bmap.get(pk_src_order_b)[13]);//被预留数量
newBVO.setNsendplannum(bmap.get(pk_src_order_b)[14]);//送货计划数量
newBVO.setNaccpaymny(bmap.get(pk_src_order_b)[15]);//累计付款金额
newBVO.setNaccpayreqmny(bmap.get(pk_src_order_b)[16]);//累计付款申请金额
//String类型
newBVO.setVvendorordercode(bmapString.get(pk_src_order_b)[0]);//对方订单号
newBVO.setVvendororderrow(bmapString.get(pk_src_order_b)[1]);//对方订单行号
//UFDate类型
newBVO.setDconfirmdate(bmapUFDate.get(pk_src_order_b)[0]);//确认日期
newBVO.setDcorrectdate(bmapUFDate.get(pk_src_order_b)[1]);//修正日期
}
}
}
return newVos;
}
private String getSql(String tableName, String fieldName) {
StringBuilder builder = new StringBuilder();
builder.append("update ");
builder.append(tableName);
builder.append(" set ");
builder.append(fieldName);
builder.append(" = ? where ");
builder.append(fieldName);
builder.append(" = ? ");
return builder.toString();
}
private String getSqlForHisVO(String tableName, String fieldName, String fieldName2) {
StringBuilder builder = new StringBuilder();
builder.append("update ");
builder.append(tableName);
builder.append(" set ");
builder.append(fieldName);
builder.append(" = ? where ");
builder.append(fieldName2);
builder.append(" = ? ");
// builder.append(" and ");
// builder.append(fieldName2+"=" + "");
return builder.toString();
}
private List<List<Object>> getForeignAddParam(List<List<Object>> datas,
String pk_ct_pu, String pk_origct) {
List<Object> list = new ArrayList<Object>();
list.add(pk_ct_pu);
list.add(pk_origct);
datas.add(list);
return datas;
}
}

View File

@ -91,7 +91,7 @@ public class AfterApproceRuleSyncRZWMSProcess implements IRule<SCOrderVO> {
// 第三方系统厂商id
singleObj.put("zbxx_gycs_wbid", head.getPk_supplier());
//zbxx_cgy_wbid varchar(100) 第三方系统采购员id
//zbxx_cgy_wbid varchar(100)第三方系统采购员id
singleObj.put("zbxx_cgy_wbid", head.getCemployeeid());
// 交货日期

View File

@ -192,9 +192,9 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<SaleOrderVO> {
// 销售订单新增两个字段 vbdef22-->MES客户订单号 vbdef13-->MES客户订单序号
detailItem.put("customNo", body.getVbdef22()); // 客户订单号
detailItem.put("customSN", body.getVbdef13()); // 客户订单序号
detailItem.put("remarks", body.getVrownote());
// 添加是否定制
detailItem.put("customized", body.getVbdef18());
detailItem.put("remarks", null);
// 添加自定义行号
JSONArray properties = new JSONArray();
JSONObject property = new JSONObject();
@ -285,3 +285,4 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<SaleOrderVO> {
return o.toString();
}
}

View File

@ -3,4 +3,5 @@
<rest>
<resource classname="nccloud.api.uapbd.QuerySync" exinfo=""/>
</rest>
</module>

View File

@ -0,0 +1,38 @@
package nccloud.api.uapbd.customer.listener;
import nc.bs.businessevent.IBusinessEvent;
import nc.bs.businessevent.IBusinessListener;
import nc.bs.businessevent.bd.BDCommonEvent;
import nc.bs.trade.business.HYPubBO;
import nc.vo.bd.cust.CustomerVO;
import nc.vo.bd.cust.custtax.CusttaxVO;
import nc.vo.pub.BusinessException;
public class CusttaxUpdateListener implements IBusinessListener{
@Override
public void doAction(IBusinessEvent event) throws BusinessException {
HYPubBO bo = new HYPubBO();
BDCommonEvent e = (BDCommonEvent) event;
if(e.getObjs().length>1) {
return;
}
CustomerVO newobjs = (CustomerVO) e.getObjs()[0];
CustomerVO oldobjs = (CustomerVO) e.getOldObjs()[0];
String newname = newobjs.getName();
String oldname = oldobjs.getName();
if(oldname!=null && !oldname.equals(newname)) {
CusttaxVO[] vos = (CusttaxVO[])bo.queryByCondition(CusttaxVO.class, "pk_customer = '"+oldobjs.getPrimaryKey()+"'");
if(vos.length>0) {
for(CusttaxVO vo: vos) {
vo.setBuyername(newname);
vo.setStatus(1);
}
bo.updateAry(vos);
}
}
}
}

View File

@ -0,0 +1,66 @@
package nc.bs.uapbd.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import com.google.common.collect.Lists;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.pub.pa.PreAlertObject;
import nc.bs.pub.taskcenter.BgWorkingContext;
import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
import nc.itf.bd.cust.assign.ICustAssignService;
import nc.vo.bd.cust.CustomerVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
public class CustomerAssginBackgroundPlugin implements IBackgroundWorkPlugin {
@Override
public PreAlertObject executeTask(BgWorkingContext context) throws BusinessException {
// 查询客户
String whereSql = " ts>'2025-05-01 00:00:00' order by ts desc";
List<CustomerVO> list = (List<CustomerVO>) new BaseDAO().retrieveByClause(CustomerVO.class, whereSql);
if (list == null || list.size() == 0) {
return null;
}
// 查询需要分配的业务单元
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] orgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new);
// 将客户按照100条进行拆分
List<List<CustomerVO>> batches = Lists.partition(list, 50);
for (int i = 0; i < batches.size(); i++) {
List<CustomerVO> custList = batches.get(i);
// 拿到客户编码
String[] custPks = toPropertyArray(custList, CustomerVO::getPk_customer, String.class);
((ICustAssignService) NCLocator.getInstance().lookup(ICustAssignService.class)).assignCustomerByPks(custPks,
orgPks, (String[]) null);
}
// 调用接口进行分配
return null;
}
public static <T, R> R[] toPropertyArray(List<T> list, Function<T, R> propertyExtractor, Class<R> clazz) {
return list.stream().map(propertyExtractor)
.toArray(size -> (R[]) java.lang.reflect.Array.newInstance(clazz, size));
}
/**
* 查询组织信息
*
* @author mzr
* @date 2025/05/29
*/
public OrgVO[] getVirtulaOrg() throws BusinessException {
String groupID = InvocationInfoProxy.getInstance().getGroupId();
// NCCForUAPLogger.debug("groupID = " + groupID);
// enablestate 启用状态 isbusinessunit 是否业务单元数据
String condition = "pk_group = '" + groupID + "' and ENABLESTATE = '2' and isbusinessunit='Y'";
Collection<OrgVO> collection = (new BaseDAO()).retrieveByClause(OrgVO.class, condition, "code");
return collection.toArray(new OrgVO[0]);
}
}

View File

@ -39,7 +39,7 @@ public class ThirdPartyPostRequestUtil {
connection.setReadTimeout(DEFAULT_READ_TIMEOUT); // 设置读取超时时间
connection.setRequestProperty("Content-Type", "application/json"); // 设置请求头
// 发送请求体
//发送请求体
try (OutputStream os = connection.getOutputStream()) {
byte[] input = requestBody.getBytes("utf-8");
os.write(input, 0, input.length);

View File

@ -39,7 +39,7 @@ public class QuerySync extends AbstractNCCRestResource {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR_OF_DAY, -3); // 减去 3 小时
//提前三小时防止ts与现实时间差别
//提前三小时防止ts与现实时间差别
UFDate adjustedUfDate = new UFDate(calendar.getTimeInMillis());
if (!ts.contains(",")) { // 单个时间戳
tsCondition = "ts >= '" + adjustedUfDate + "' AND ts <= '" + new UFDate(new Date()) + "'";

View File

@ -15,7 +15,7 @@ public class QuerySyncSqlUtils {
* 此方法假定传入的 `values` 列表是非空的由调用方 `buildUniversalCondition` 保证
*
* @param fieldName 字段名
* @param values 值的列表 (来自非空数组或List)
* @param values 值的列表 (来自非空数组或List)
* @return 构建好的IN子句字符串
*/
private static String buildInClause(String fieldName, List<?> values) {