Compare commits
28 Commits
Author | SHA1 | Date |
---|---|---|
|
2a8e07b100 | |
|
1e908abe0f | |
|
f326403576 | |
|
155c549ad0 | |
|
e8f76b652f | |
|
2a6219d219 | |
|
87c25fbf45 | |
|
691bbb8815 | |
|
c094e6bb4b | |
|
6adb7c637e | |
|
77b29e0664 | |
|
be1e1713c9 | |
|
3323304d95 | |
|
af5e267e07 | |
|
7fbae1323a | |
|
558067ddda | |
|
386047337c | |
|
84cbe082da | |
|
d7c30490b8 | |
|
201450acea | |
|
f60c8845ac | |
|
2139c2ca26 | |
|
396350b474 | |
|
05e6066549 | |
|
de9f03c51d | |
|
e1acb156e3 | |
|
279c433e76 | |
|
45bd2afa2d |
File diff suppressed because one or more lines are too long
|
@ -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
|
@ -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银承:银行档案; 银行参照:signagrbank;2商承:客商档案客商参照:pk_signagrbank;3文本: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
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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());
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -48,9 +48,9 @@ import java.util.*;
|
|||
|
||||
public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{
|
||||
|
||||
private static final BaseDAO DAO = new BaseDAO();
|
||||
|
||||
private static final IHttpPostOtherSys HTTP_POST_OTHER_SYS = NCLocator.getInstance().lookup(IHttpPostOtherSys.class);
|
||||
// private static final BaseDAO DAO = new BaseDAO();
|
||||
|
||||
// private static final IHttpPostOtherSys HTTP_POST_OTHER_SYS = NCLocator.getInstance().lookup(IHttpPostOtherSys.class);
|
||||
|
||||
@Override
|
||||
public MaterialOutVO[] save(List<Map<String, Object>> paramList) throws BusinessException {
|
||||
|
@ -70,16 +70,16 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{
|
|||
// 翻译货位
|
||||
ICAPILocationVOUtils.translate(vos);
|
||||
|
||||
boolean isSpecialCase = checkSpecialCondition(paramList);
|
||||
// boolean isSpecialCase = checkSpecialCondition(paramList);
|
||||
// 如果判定成功,处理金思维的材料出库,将来源的相关数据补充上
|
||||
if (isSpecialCase) {
|
||||
processPickingPlanSpecialLogic(vos);
|
||||
}
|
||||
// if (isSpecialCase) {
|
||||
// processPickingPlanSpecialLogic(vos);
|
||||
// }
|
||||
//其他数据填充
|
||||
new MaterialOutSaveFillValue().setDefaultValue(vos);
|
||||
|
||||
IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class);
|
||||
//设置每行行号
|
||||
// 设置每行行号
|
||||
setMaterialOutRowNum(vos);
|
||||
return materialOut.insertBills(vos);
|
||||
}
|
||||
|
@ -283,132 +283,132 @@ public class APIMaterialOutMaintainImpl implements IAPIMaterialOutMaintain{
|
|||
/**
|
||||
* 检查是否满足特殊条件:需要同步的组织
|
||||
*/
|
||||
private boolean checkSpecialCondition(List<Map<String, Object>> materialOutVOS) throws BusinessException {
|
||||
|
||||
List<MaterialOutVO> aggVOList =
|
||||
TransferMapToVOTool.transferMapToAggVO(materialOutVOS, MaterialOutVO.class);
|
||||
MaterialOutVO[] vos =
|
||||
aggVOList.toArray(new MaterialOutVO[aggVOList.size()]);
|
||||
|
||||
if(Objects.isNull(materialOutVOS)){
|
||||
return false;
|
||||
}
|
||||
for (MaterialOutVO materialOutVO : vos) {
|
||||
MaterialOutHeadVO head = materialOutVO.getHead();
|
||||
// 提取组织
|
||||
String pkOrg = head.getPk_org();
|
||||
// 翻译成code
|
||||
// String orgCode = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_ORG, pkOrg);
|
||||
// 使用统一的组织判断方法
|
||||
if(HTTP_POST_OTHER_SYS.checkIfIncludeOrg(pkOrg)){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// private boolean checkSpecialCondition(List<Map<String, Object>> materialOutVOS) throws BusinessException {
|
||||
//
|
||||
// List<MaterialOutVO> aggVOList =
|
||||
// TransferMapToVOTool.transferMapToAggVO(materialOutVOS, MaterialOutVO.class);
|
||||
// MaterialOutVO[] vos =
|
||||
// aggVOList.toArray(new MaterialOutVO[aggVOList.size()]);
|
||||
//
|
||||
// if(Objects.isNull(materialOutVOS)){
|
||||
// return false;
|
||||
// }
|
||||
// for (MaterialOutVO materialOutVO : vos) {
|
||||
// MaterialOutHeadVO head = materialOutVO.getHead();
|
||||
// // 提取组织
|
||||
// String pkOrg = head.getPk_org();
|
||||
// // 翻译成code
|
||||
//// String orgCode = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_ORG, pkOrg);
|
||||
// // 使用统一的组织判断方法
|
||||
//// if(HTTP_POST_OTHER_SYS.checkIfIncludeOrg(pkOrg)){
|
||||
//// return true;
|
||||
//// }
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 处理备料计划特殊逻辑
|
||||
*/
|
||||
private void processPickingPlanSpecialLogic(MaterialOutVO[] vos) throws BusinessException {
|
||||
|
||||
for (MaterialOutVO vo : vos) {
|
||||
MaterialOutBodyVO[] bodyVOs = vo.getBodys();
|
||||
if (bodyVOs != null) {
|
||||
for (MaterialOutBodyVO bodyVO : bodyVOs) {
|
||||
// 获取物料编码
|
||||
String materialCode = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, bodyVO.getCmaterialvid());
|
||||
if (StringUtils.isEmpty(materialCode)|| StringUtils.isEmpty(bodyVO.getCsourcebillbid())) {
|
||||
continue;
|
||||
}
|
||||
// 基于mmpickmview视图查询备料计划相关数据
|
||||
String sql = buildPickingPlanQuery(materialCode,bodyVO.getCsourcebillbid());
|
||||
|
||||
try {
|
||||
List<Map<String, Object>> pickingPlanData = (List<Map<String, Object>>) DAO.executeQuery(sql, new MapListProcessor());
|
||||
|
||||
// 不唯一或者找不到,这样是有问题,抛出
|
||||
if(pickingPlanData==null || pickingPlanData.isEmpty()){
|
||||
throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview找不到数据,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql);
|
||||
}
|
||||
|
||||
if(pickingPlanData.size()!=1){
|
||||
throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview不唯一,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql);
|
||||
}
|
||||
|
||||
if (pickingPlanData != null && !pickingPlanData.isEmpty()) {
|
||||
// 处理查询到的备料计划数据
|
||||
processPickingPlanData(bodyVO, pickingPlanData);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new BusinessException("查询备料计划数据失败: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// private void processPickingPlanSpecialLogic(MaterialOutVO[] vos) throws BusinessException {
|
||||
//
|
||||
// for (MaterialOutVO vo : vos) {
|
||||
// MaterialOutBodyVO[] bodyVOs = vo.getBodys();
|
||||
// if (bodyVOs != null) {
|
||||
// for (MaterialOutBodyVO bodyVO : bodyVOs) {
|
||||
// // 获取物料编码
|
||||
// String materialCode = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, bodyVO.getCmaterialvid());
|
||||
// if (StringUtils.isEmpty(materialCode)|| StringUtils.isEmpty(bodyVO.getCsourcebillbid())) {
|
||||
// continue;
|
||||
// }
|
||||
// // 基于mmpickmview视图查询备料计划相关数据
|
||||
// String sql = buildPickingPlanQuery(materialCode,bodyVO.getCsourcebillbid());
|
||||
//
|
||||
// try {
|
||||
// List<Map<String, Object>> pickingPlanData = (List<Map<String, Object>>) DAO.executeQuery(sql, new MapListProcessor());
|
||||
//
|
||||
// // 不唯一或者找不到,这样是有问题,抛出
|
||||
// if(pickingPlanData==null || pickingPlanData.isEmpty()){
|
||||
// throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview找不到数据,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql);
|
||||
// }
|
||||
//
|
||||
// if(pickingPlanData.size()!=1){
|
||||
// throw new BusinessException("根据生产订单明细主键和物料编码去查询bip的中间视图mmpickmview不唯一,无法进行材料出库的上游主键赋值,请检查数据,报错SQL:"+sql);
|
||||
// }
|
||||
//
|
||||
// if (pickingPlanData != null && !pickingPlanData.isEmpty()) {
|
||||
// // 处理查询到的备料计划数据
|
||||
// processPickingPlanData(bodyVO, pickingPlanData);
|
||||
// }
|
||||
//
|
||||
// } catch (Exception e) {
|
||||
// throw new BusinessException("查询备料计划数据失败: " + e.getMessage(), e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* 构建备料计划查询SQL(基于mmpickmview视图)
|
||||
*/
|
||||
private String buildPickingPlanQuery(String materialCode,String cpmohid) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ");
|
||||
sql.append(" CODE,"); // 物料编码
|
||||
sql.append(" PK_BILLTYPECODE,"); // 备料计划交易类型编码
|
||||
sql.append(" CPICKMID,"); // 备料计划主键
|
||||
sql.append(" CMOID,"); // 流程生产订单行主键
|
||||
sql.append(" CPMOHID,"); // 流程生产订单主键
|
||||
sql.append(" VROWNO,"); // 备料计划明细行号
|
||||
sql.append(" CPICKM_BID "); // 备料计划明细主键
|
||||
sql.append("FROM MMPICKMVIEW ");
|
||||
sql.append("WHERE CODE = '").append(materialCode).append("' AND ")
|
||||
.append("cmoid ='").append(cpmohid).append("'");
|
||||
return sql.toString();
|
||||
}
|
||||
// private String buildPickingPlanQuery(String materialCode,String cpmohid) {
|
||||
// StringBuilder sql = new StringBuilder();
|
||||
// sql.append("SELECT ");
|
||||
// sql.append(" CODE,"); // 物料编码
|
||||
// sql.append(" PK_BILLTYPECODE,"); // 备料计划交易类型编码
|
||||
// sql.append(" CPICKMID,"); // 备料计划主键
|
||||
// sql.append(" CMOID,"); // 流程生产订单行主键
|
||||
// sql.append(" CPMOHID,"); // 流程生产订单主键
|
||||
// sql.append(" VROWNO,"); // 备料计划明细行号
|
||||
// sql.append(" CPICKM_BID "); // 备料计划明细主键
|
||||
// sql.append("FROM MMPICKMVIEW ");
|
||||
// sql.append("WHERE CODE = '").append(materialCode).append("' AND ")
|
||||
// .append("cmoid ='").append(cpmohid).append("'");
|
||||
// return sql.toString();
|
||||
// }
|
||||
|
||||
/**
|
||||
* 处理备料计划数据
|
||||
*/
|
||||
private void processPickingPlanData(MaterialOutBodyVO bodyVO, List<Map<String, Object>> pickingPlanData) {
|
||||
if (pickingPlanData == null || pickingPlanData.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Map<String, Object> firstRow = pickingPlanData.get(0);
|
||||
|
||||
// 设置备料计划相关字段
|
||||
if (firstRow.get("cpickmid") != null) {
|
||||
bodyVO.setCsourcebillhid(firstRow.get("cpickmid").toString()); // 来源单据ID
|
||||
}
|
||||
|
||||
if (firstRow.get("cpickm_bid") != null) {
|
||||
bodyVO.setCsourcebillbid(firstRow.get("cpickm_bid").toString()); // 来源单据行ID
|
||||
}
|
||||
|
||||
if (firstRow.get("pk_billtypecode") != null) {
|
||||
bodyVO.setCsourcetranstype(firstRow.get("pk_billtypecode").toString()); // 交易类型编码
|
||||
}
|
||||
bodyVO.setCsourcetype("55A3");
|
||||
}
|
||||
// private void processPickingPlanData(MaterialOutBodyVO bodyVO, List<Map<String, Object>> pickingPlanData) {
|
||||
// if (pickingPlanData == null || pickingPlanData.isEmpty()) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// Map<String, Object> firstRow = pickingPlanData.get(0);
|
||||
//
|
||||
// // 设置备料计划相关字段
|
||||
// if (firstRow.get("cpickmid") != null) {
|
||||
// bodyVO.setCsourcebillhid(firstRow.get("cpickmid").toString()); // 来源单据ID
|
||||
// }
|
||||
//
|
||||
// if (firstRow.get("cpickm_bid") != null) {
|
||||
// bodyVO.setCsourcebillbid(firstRow.get("cpickm_bid").toString()); // 来源单据行ID
|
||||
// }
|
||||
//
|
||||
// if (firstRow.get("pk_billtypecode") != null) {
|
||||
// bodyVO.setCsourcetranstype(firstRow.get("pk_billtypecode").toString()); // 交易类型编码
|
||||
// }
|
||||
// bodyVO.setCsourcetype("55A3");
|
||||
// }
|
||||
|
||||
/**
|
||||
* 根据主键查询编码
|
||||
*/
|
||||
private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
|
||||
if (nc.vo.cmp.util.StringUtils.isEmpty(pk)) {
|
||||
return null;
|
||||
}
|
||||
SqlBuilder sqlBuilder = new SqlBuilder();
|
||||
sqlBuilder.append(" select " + selectField);
|
||||
sqlBuilder.append(" from " + tableName);
|
||||
sqlBuilder.append(" where ");
|
||||
sqlBuilder.append(pkField, pk);
|
||||
Object o = DAO.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
|
||||
if (o == null) {
|
||||
throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】");
|
||||
}
|
||||
return o.toString();
|
||||
}
|
||||
// private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
|
||||
// if (nc.vo.cmp.util.StringUtils.isEmpty(pk)) {
|
||||
// return null;
|
||||
// }
|
||||
// SqlBuilder sqlBuilder = new SqlBuilder();
|
||||
// sqlBuilder.append(" select " + selectField);
|
||||
// sqlBuilder.append(" from " + tableName);
|
||||
// sqlBuilder.append(" where ");
|
||||
// sqlBuilder.append(pkField, pk);
|
||||
// Object o = DAO.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
|
||||
// if (o == null) {
|
||||
// throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】");
|
||||
// }
|
||||
// return o.toString();
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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];
|
||||
// }
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ public interface IAPISaleOutMaintain {
|
|||
public SaleOutVO[] saveRefSaleOrder(List<Map<String, Object>> paramMapList)
|
||||
throws BusinessException;
|
||||
/**
|
||||
* 根据发货单生成销售出库单
|
||||
* 根据发货单生成销售出库单
|
||||
* @param vos
|
||||
* @return
|
||||
* @throws BusinessException
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
//
|
||||
// Source code recreated from a .class file by IntelliJ IDEA
|
||||
// (powered by FernFlower decompiler)
|
||||
//
|
||||
|
||||
package nccloud.api.ic.m4d;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import nc.vo.ic.m4d.entity.MaterialOutVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
|
||||
public interface IAPIMaterialOutMaintain {
|
||||
MaterialOutVO[] save(List<Map<String, Object>> var1) throws BusinessException;
|
||||
|
||||
MaterialOutVO[] update(List<Map<String, Object>> var1) throws BusinessException;
|
||||
|
||||
MaterialOutVO[] delete(MaterialOutVO[] var1) throws BusinessException;
|
||||
|
||||
MaterialOutVO[] sign(MaterialOutVO[] var1) throws BusinessException;
|
||||
|
||||
MaterialOutVO[] unSign(MaterialOutVO[] var1) throws BusinessException;
|
||||
|
||||
MaterialOutVO[] saveByRef(List<Map<String, Object>> var1) throws BusinessException;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -248,6 +248,23 @@ public class PInvoice extends SuperVO implements Serializable ,IEncode{
|
|||
private PInvoiceCepz[] cepzs;
|
||||
|
||||
private PInvoiceTspz[] tspzs;
|
||||
// 数电发票是否显示购销方地址电话
|
||||
private String einvoiceShowGxfDzDh;
|
||||
|
||||
// 数电发票是否显示购销方银行、账号
|
||||
private String einvoiceShowGxfYhZh;
|
||||
|
||||
// 销售方电话
|
||||
private String xsfDh;
|
||||
|
||||
// 销售方地址
|
||||
private String xsfDz;
|
||||
|
||||
// 购买方地址
|
||||
private String gmfDz;
|
||||
|
||||
// 购买方电话
|
||||
private String gmfDh;
|
||||
|
||||
public String getApplyNumber() {
|
||||
|
||||
|
@ -945,6 +962,54 @@ public class PInvoice extends SuperVO implements Serializable ,IEncode{
|
|||
this.kqysssxbgglbm = kqysssxbgglbm;
|
||||
}
|
||||
|
||||
public String getEinvoiceShowGxfDzDh() {
|
||||
return einvoiceShowGxfDzDh;
|
||||
}
|
||||
|
||||
public void setEinvoiceShowGxfDzDh(String einvoiceShowGxfDzDh) {
|
||||
this.einvoiceShowGxfDzDh = einvoiceShowGxfDzDh;
|
||||
}
|
||||
|
||||
public String getEinvoiceShowGxfYhZh() {
|
||||
return einvoiceShowGxfYhZh;
|
||||
}
|
||||
|
||||
public void setEinvoiceShowGxfYhZh(String einvoiceShowGxfYhZh) {
|
||||
this.einvoiceShowGxfYhZh = einvoiceShowGxfYhZh;
|
||||
}
|
||||
|
||||
public String getXsfDh() {
|
||||
return xsfDh;
|
||||
}
|
||||
|
||||
public void setXsfDh(String xsfDh) {
|
||||
this.xsfDh = xsfDh;
|
||||
}
|
||||
|
||||
public String getXsfDz() {
|
||||
return xsfDz;
|
||||
}
|
||||
|
||||
public void setXsfDz(String xsfDz) {
|
||||
this.xsfDz = xsfDz;
|
||||
}
|
||||
|
||||
public String getGmfDz() {
|
||||
return gmfDz;
|
||||
}
|
||||
|
||||
public void setGmfDz(String gmfDz) {
|
||||
this.gmfDz = gmfDz;
|
||||
}
|
||||
|
||||
public String getGmfDh() {
|
||||
return gmfDh;
|
||||
}
|
||||
|
||||
public void setGmfDh(String gmfDh) {
|
||||
this.gmfDh = gmfDh;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -4,27 +4,30 @@ package nc.bs.mmpac.pickm.bp.rule;
|
|||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.dao.BaseDAO;
|
||||
import nc.bs.framework.common.NCLocator;
|
||||
import nc.bs.logging.Log;
|
||||
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||
import nc.impl.pubapp.pattern.rule.IRule;
|
||||
import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService;
|
||||
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||
import nc.pubitf.para.SysInitQuery;
|
||||
import nc.vo.bd.material.MaterialVO;
|
||||
import nc.vo.bd.rt.rt0004.entity.RcVO;
|
||||
import nc.vo.bd.stordoc.StordocVO;
|
||||
import nc.vo.cmp.util.StringUtils;
|
||||
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
||||
import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
||||
import nc.vo.org.OrgVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pub.CircularlyAccessibleValueObject;
|
||||
import nc.vo.pub.ISuperVO;
|
||||
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;
|
||||
import nc.vo.util.CloneUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class AfterApproveRuleSyncRZWMS implements IRule<AggPickmVO> {
|
||||
|
||||
|
@ -38,8 +41,9 @@ public class AfterApproveRuleSyncRZWMS implements IRule<AggPickmVO> {
|
|||
return;
|
||||
}
|
||||
try {
|
||||
AggPickmVO[] cloneOrderVOS = (AggPickmVO[]) CloneUtil.deepClone(vos);
|
||||
// 检查并筛选领料组织
|
||||
List<AggPickmVO> newAggPickmVOS = checkAndFilterBillSrcOrg(vos);
|
||||
List<AggPickmVO> newAggPickmVOS = checkAndFilterBillSrcOrg(cloneOrderVOS);
|
||||
if (newAggPickmVOS.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
@ -154,31 +158,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);
|
||||
|
||||
}
|
||||
|
@ -186,18 +190,73 @@ public class AfterApproveRuleSyncRZWMS implements IRule<AggPickmVO> {
|
|||
|
||||
private List<AggPickmVO> checkAndFilterBillSrcOrg(AggPickmVO[] aggPickmVOS) throws BusinessException {
|
||||
List<AggPickmVO> aggvoList = new ArrayList<>();
|
||||
List<AggPickmVO> finalList = new ArrayList<>();
|
||||
|
||||
for (AggPickmVO aggvo : aggPickmVOS) {
|
||||
String pkOrg = aggvo.getParentVO().getPk_org();
|
||||
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
|
||||
//过滤上游不是生产订单和委外订单的备料计划
|
||||
String vfirstbilltype = aggvo.getParentVO().getVfirstbilltype();
|
||||
if ("C022".equals(orgCode)&& 1 == aggvo.getParentVO().getFbillstatus()&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0) {
|
||||
if("61".equals(vfirstbilltype)||"55A2".equals(vfirstbilltype)){
|
||||
aggvoList.add(aggvo);
|
||||
String vdef20 = aggvo.getParentVO().getVdef20();
|
||||
if(vdef20==null||"N".equals(vdef20)){
|
||||
if ("C022".equals(orgCode)&& 1 == aggvo.getParentVO().getFbillstatus()&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0) {
|
||||
if("61".equals(vfirstbilltype)||"55A2".equals(vfirstbilltype)){
|
||||
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||
//获取表体物料信息
|
||||
aggvoList.add(aggvo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return aggvoList;
|
||||
//再次筛选
|
||||
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||
//获取表体物料信息
|
||||
if(aggvoList.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
Set<String> materialpks=new HashSet<>();
|
||||
for (AggPickmVO aggvo : aggvoList) {
|
||||
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
|
||||
for (PickmItemVO item : items) {
|
||||
String cbmaterialvid = item.getCbmaterialvid();
|
||||
materialpks.add(cbmaterialvid);
|
||||
}
|
||||
}
|
||||
if(materialpks.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
//根据物料id查询物料信息
|
||||
MaterialVO[] vos = NCLocator.getInstance().lookup(IMaterialBaseInfoQueryService.class).queryDataByPks(materialpks.toArray(new String[0]));
|
||||
//组装Map
|
||||
Map<String, String> materialMap = new HashMap<>();
|
||||
if(vos==null || vos.length<1){
|
||||
throw new BusinessException("Failed to query material info , please check !!!");
|
||||
}
|
||||
for (MaterialVO vo : vos) {
|
||||
String cmaterialvid = vo.getPk_material();
|
||||
String cmaterialcode =vo.getCode();
|
||||
materialMap.put(cmaterialvid, cmaterialcode);
|
||||
}
|
||||
//筛选行数据
|
||||
for (AggPickmVO aggvo : aggvoList) {
|
||||
List<PickmItemVO> newItems = new ArrayList<>();
|
||||
PickmItemVO[] items = (PickmItemVO[]) aggvo.getChildren(PickmItemVO.class);
|
||||
for (PickmItemVO item : items) {
|
||||
String cmaterialvid = item.getCbmaterialvid();
|
||||
if (materialMap.containsKey(cmaterialvid)) {
|
||||
String materialCode = materialMap.get(cmaterialvid);
|
||||
if(!materialCode.startsWith("103")){
|
||||
newItems.add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!newItems.isEmpty()) {
|
||||
aggvo.setChildren(PickmItemVO.class,newItems.toArray(new PickmItemVO[0]));
|
||||
finalList.add(aggvo);
|
||||
}
|
||||
}
|
||||
return finalList;
|
||||
}
|
||||
|
||||
private void pushToRZMOMBy55A2(AggPickmVO[] aggPickmVOS) throws BusinessException {
|
||||
|
|
|
@ -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());
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,184 @@
|
|||
package nc.bs.mmpac.pmo.pac0002.bp.rule;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.logging.Log;
|
||||
import nc.bs.logging.Logger;
|
||||
import nc.bs.uapbd.util.MyHelper;
|
||||
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||
import nc.impl.pubapp.pattern.rule.IRule;
|
||||
import nc.itf.arap.goldentax.SysParaInitQuery;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO;
|
||||
import nc.vo.org.FactoryVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.scmpub.util.ArrayUtil;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 流程生产订单审批后推送艾普MES
|
||||
*
|
||||
* @author mzr
|
||||
* @date 2025/7/3
|
||||
*/
|
||||
public class AfterApproveSyncEpicMesRule implements IRule<PMOAggVO> {
|
||||
|
||||
private static final String LOG_INFO_NAME = "OALOG";
|
||||
|
||||
private static final Log obmlog = Log.getInstance(LOG_INFO_NAME);
|
||||
|
||||
private static final String MES_PMO_SYNC_URL = "/prj-v5-web/ext/api/wrokOrder";
|
||||
|
||||
@Override
|
||||
public void process(PMOAggVO[] pmoAggVOS) {
|
||||
if (ArrayUtil.isEmpty(pmoAggVOS)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
List<PMOAggVO> filteredOrders = checkAndFilterBillSrcOrg(pmoAggVOS);
|
||||
if (filteredOrders.isEmpty()) {
|
||||
obmlog.debug("没有符合条件的生产订单需要同步到MES系统。");
|
||||
return;
|
||||
}
|
||||
|
||||
obmlog.info("开始同步生产订单到MES系统,符合条件的订单数量: " + filteredOrders.size());
|
||||
// 推送到MES系统
|
||||
JSONArray dataArr = new JSONArray();
|
||||
for (PMOAggVO aggVO : filteredOrders) {
|
||||
PMOHeadVO head = aggVO.getParentVO();
|
||||
PMOItemVO[] bodys = aggVO.getChildrenVO();
|
||||
|
||||
if (bodys == null || bodys.length == 0) {
|
||||
obmlog.warn("生产订单 " + head.getVbillcode() + " 没有行信息,跳过同步。");
|
||||
continue;
|
||||
}
|
||||
JSONObject object = buildSyncData(aggVO);
|
||||
dataArr.add(object);
|
||||
}
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("workOrders", dataArr);
|
||||
pushData(data);
|
||||
obmlog.info("生产订单同步到MES系统处理完成。");
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
obmlog.error("同步生产订单到MES系统失败: " + e.getMessage(), e);
|
||||
ExceptionUtils.wrappException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用MES接口并处理特定错误
|
||||
*
|
||||
* @param param 请求体
|
||||
* @throws BusinessException 如果发生非特定可忽略的错误
|
||||
*/
|
||||
private void pushData(JSONObject param) throws BusinessException {
|
||||
String responseString = null;
|
||||
try {
|
||||
String baseUrl = SysParaInitQuery.getParaString("GLOBLE00000000000000", "EPICMESURL");
|
||||
String requestUrl = baseUrl + MES_PMO_SYNC_URL;
|
||||
responseString = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, param.toJSONString());
|
||||
obmlog.info(" MES系统原始返回: " + responseString);
|
||||
|
||||
JSONObject jsonResponse = JSONObject.parseObject(responseString);
|
||||
} catch (Exception e) {
|
||||
obmlog.error(" 调用MES或处理响应时发生错误。原始响应: " + responseString + " 错误: " + e.getMessage(), e);
|
||||
throw new BusinessException("调用MES或处理响应时发生错误:" + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查并筛选需要同步的单据
|
||||
*/
|
||||
private List<PMOAggVO> checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException {
|
||||
List<PMOAggVO> aggvoList = new ArrayList<>();
|
||||
for (PMOAggVO aggVo : pmoAggVOS) {
|
||||
String pkOrg = aggVo.getParentVO().getPk_org();
|
||||
String orgCode = MyHelper.transferField(FactoryVO.getDefaultTableName(), FactoryVO.CODE, FactoryVO.PK_FACTORY, pkOrg);
|
||||
// 检查当前组织是否为电力电子
|
||||
if (MyHelper.checkIfDldzOrg(orgCode)) {
|
||||
aggvoList.add(aggVo);
|
||||
}
|
||||
}
|
||||
return aggvoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 组装数据
|
||||
*/
|
||||
private JSONObject buildSyncData(PMOAggVO aggVO) {
|
||||
PMOHeadVO headVo = aggVO.getParentVO();
|
||||
PMOItemVO[] pmoItems = aggVO.getChildrenVO();
|
||||
JSONObject data = new JSONObject();
|
||||
// {
|
||||
// "workOrders": [
|
||||
// {
|
||||
// "id": null, // 唯一标识(主键)
|
||||
// "siteCode": "04", // 工厂编码
|
||||
// "contractNo": "HDDK0111325", // 合同号
|
||||
// "workOrderCode": "DSF01-2501230028",// 工单号
|
||||
// "qty": "1.000", // 计划数量(字符串类型)
|
||||
// "produCode": "103248250005", // 产品编码
|
||||
// "produName": "150KV滤抗-特高压宝塔山(试装)-低端", // 产品名称
|
||||
// "bomCode": "103248250005", // BOM 编码
|
||||
// "planBeginDate": 1751328000000, // 计划开始时间(毫秒级时间戳)
|
||||
// "planEndDate": 1751328000000, // 计划结束时间(毫秒级时间戳)
|
||||
// "endDate": 1751328000000, // 试验结束时间(毫秒级时间戳)
|
||||
// "type": null, // 类型(I:新增 U:修改 D:删除)
|
||||
// "auditCode": "Y", // 审核码(Y:已审核 N:未审核)
|
||||
// "contractName": "特高压宝塔山±800 千伏换流站工程", // 合同名称
|
||||
// "transferPlanTime": "2025-07-01", // 生产转检计划时间(格式:YYYY-MM-DD)
|
||||
// "receiptScheduledTime": "2025-07-01", // 完工入库时间(格式:YYYY-MM-DD)
|
||||
// "companyCode": "DLDZ", // 公司编码
|
||||
// "companyName": "泰开电力电子" // 公司名称
|
||||
// }
|
||||
// ],
|
||||
// "mrls": [
|
||||
// {
|
||||
// "workOrderCode": "DSF01-2501230028",// 工单号
|
||||
// "mrlCode": "2305050447", // 物料编码
|
||||
// "mrlName": "铝加工件", // 物料名称
|
||||
// "qty": 1.000, // 数量(浮点数)
|
||||
// "unit": "套" // 单位
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换特殊字段 如 1/1 转换为小数 1.0
|
||||
*/
|
||||
|
||||
private String transferSpecialField(String field) {
|
||||
if (field == null || field.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
String[] split = field.split("/");
|
||||
if (split.length == 2) {
|
||||
String numStr = split[0].trim();
|
||||
String denStr = split[1].trim();
|
||||
if (denStr.equals("0")) {
|
||||
return "0.00"; // 分母不能为零
|
||||
}
|
||||
try {
|
||||
BigDecimal numerator = new BigDecimal(numStr);
|
||||
BigDecimal denominator = new BigDecimal(denStr);
|
||||
return numerator.divide(denominator, 2, RoundingMode.HALF_UP).toString();
|
||||
} catch (NumberFormatException e) {
|
||||
return field; // 非法数字,返回原字段
|
||||
}
|
||||
}
|
||||
return field;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,14 +3,17 @@ package nc.bs.mmpac.pmo.pac0002.bp.rule;
|
|||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.dao.BaseDAO;
|
||||
import nc.bs.framework.common.NCLocator;
|
||||
import nc.bs.logging.Log;
|
||||
import nc.bs.mmpac.pmo.pac0002.bp.service.PMOBPService;
|
||||
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||
import nc.impl.pubapp.pattern.rule.IRule;
|
||||
import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService;
|
||||
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||
import nc.pubitf.para.SysInitQuery;
|
||||
import nc.util.mmf.framework.base.MMValueCheck;
|
||||
import nc.vo.bd.defdoc.DefdocVO;
|
||||
import nc.vo.bd.material.MaterialVO;
|
||||
import nc.vo.cmp.util.StringUtils;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO;
|
||||
import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO;
|
||||
|
@ -21,11 +24,9 @@ import nc.vo.pub.lang.UFBoolean;
|
|||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.pubapp.pattern.pub.SqlBuilder;
|
||||
import nc.vo.scmpub.util.ArrayUtil;
|
||||
import nc.vo.util.CloneUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 流程生产订单审批后推送RZ
|
||||
|
@ -46,13 +47,14 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<PMOAggVO> {
|
|||
return;
|
||||
}
|
||||
try {
|
||||
PMOAggVO[] cloneOrderVOS = (PMOAggVO[]) CloneUtil.deepClone(pmoAggVOS);
|
||||
// 检查并筛选生产订单
|
||||
List<PMOAggVO> filteredOrders = checkAndFilterBillSrcOrg(pmoAggVOS);
|
||||
List<PMOAggVO> filteredOrders = checkAndFilterBillSrcOrg(cloneOrderVOS);
|
||||
if (filteredOrders.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// ÍÆË͵½RZϵͳ
|
||||
// 推送到锐制系统
|
||||
pushToRZMOM(filteredOrders.toArray(new PMOAggVO[0]));
|
||||
} catch (Exception e) {
|
||||
log.error("同步生产订单到RZ系统失败: " + e.getMessage());
|
||||
|
@ -66,6 +68,7 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<PMOAggVO> {
|
|||
private List<PMOAggVO> checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException {
|
||||
List<PMOAggVO> aggvoList = new ArrayList<>();
|
||||
List<String> tranidList = new ArrayList<String>();
|
||||
List<PMOAggVO> finalList = new ArrayList<>();
|
||||
for (PMOAggVO aggvo : pmoAggVOS) {
|
||||
PMOHeadVO headvo = aggvo.getParentVO();
|
||||
String tranid = headvo.getCtrantypeid();
|
||||
|
@ -77,25 +80,72 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<PMOAggVO> {
|
|||
if (tranidList.size() > 0) {
|
||||
bSaveApproveMap = PMOBPService.getIPMOTransTypeQueryService()
|
||||
.getBSaveApproveByTranTypeIDs(tranidList.toArray(new String[0]));
|
||||
|
||||
}
|
||||
for (PMOAggVO aggvo : pmoAggVOS) {
|
||||
String pkOrg = aggvo.getParentVO().getPk_org();
|
||||
Integer fbillstatus = aggvo.getParentVO().getFbillstatus();
|
||||
String tranid = aggvo.getParentVO().getCtrantypeid();
|
||||
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
|
||||
if(this.flag){
|
||||
if ("C022".equals(orgCode) && 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length>0) {
|
||||
aggvoList.add(aggvo);
|
||||
}
|
||||
}else{
|
||||
if ("C022".equals(orgCode)&& 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0 && !bSaveApproveMap.isEmpty()&&!bSaveApproveMap.getOrDefault(tranid, UFBoolean.FALSE).booleanValue()) {
|
||||
aggvoList.add(aggvo);
|
||||
String vtrantypecode = aggvo.getParentVO().getVtrantypecode();
|
||||
if(!"55A2-Cxx-01".equals(vtrantypecode)){
|
||||
if(this.flag){
|
||||
if ("C022".equals(orgCode) && 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length>0) {
|
||||
aggvoList.add(aggvo);
|
||||
}
|
||||
}else{
|
||||
if ("C022".equals(orgCode)&& 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0 && !bSaveApproveMap.isEmpty()&&!bSaveApproveMap.getOrDefault(tranid, UFBoolean.FALSE).booleanValue()) {
|
||||
aggvoList.add(aggvo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return aggvoList;
|
||||
//再次筛选
|
||||
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||
//获取表体物料信息
|
||||
if(aggvoList.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
Set<String> materialpks=new HashSet<>();
|
||||
for (PMOAggVO aggvo : aggvoList) {
|
||||
for (PMOItemVO item : aggvo.getChildrenVO()) {
|
||||
String cbmaterialvid = item.getCmaterialvid();
|
||||
materialpks.add(cbmaterialvid);
|
||||
}
|
||||
}
|
||||
if(materialpks.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
//根据物料id查询物料信息
|
||||
MaterialVO[] vos = NCLocator.getInstance().lookup(IMaterialBaseInfoQueryService.class).queryDataByPks(materialpks.toArray(new String[0]));
|
||||
//组装Map
|
||||
Map<String, String> materialMap = new HashMap<>();
|
||||
if(vos==null || vos.length<1){
|
||||
throw new BusinessException("Failed to query material info , please check !!!");
|
||||
}
|
||||
for (MaterialVO vo : vos) {
|
||||
String cmaterialvid = vo.getPk_material();
|
||||
String cmaterialcode =vo.getCode();
|
||||
materialMap.put(cmaterialvid, cmaterialcode);
|
||||
}
|
||||
//筛选行数据
|
||||
for (PMOAggVO aggvo : aggvoList) {
|
||||
List<PMOItemVO> newItems = new ArrayList<>();
|
||||
PMOItemVO[] items = (PMOItemVO[]) aggvo.getChildren(PMOItemVO.class);
|
||||
for (PMOItemVO item : items) {
|
||||
String cmaterialvid = item.getCmaterialvid();
|
||||
if (materialMap.containsKey(cmaterialvid)) {
|
||||
String materialCode = materialMap.get(cmaterialvid);
|
||||
if(!materialCode.startsWith("103")){
|
||||
newItems.add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!newItems.isEmpty()) {
|
||||
aggvo.setChildren(PMOItemVO.class,newItems.toArray(new PMOItemVO[0]));
|
||||
finalList.add(aggvo);
|
||||
}
|
||||
}
|
||||
return finalList;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,7 +224,8 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<PMOAggVO> {
|
|||
// bzsm varchar(400) 备注说明
|
||||
detailItem.put("bzsm", body.getVnote());
|
||||
// qfbj int 签发标记 默认0;上位ERP签发后传MOM时,签发仍=0;
|
||||
detailItem.put("qfbj", body.getFitemstatus());
|
||||
//默认1
|
||||
detailItem.put("qfbj", 1);
|
||||
// 计划产出数量
|
||||
detailItem.put("jhsl", body.getNmmastnum().getDouble());
|
||||
//jhlx int 计划类型 必填 0成品入库、1半成品入库
|
||||
|
|
|
@ -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)){
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
|
@ -3,9 +3,11 @@ package nc.bs.pu.m21.action.rule.approve;
|
|||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.dao.BaseDAO;
|
||||
import nc.bs.framework.common.NCLocator;
|
||||
import nc.bs.logging.Log;
|
||||
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||
import nc.impl.pubapp.pattern.rule.IRule;
|
||||
import nc.itf.bd.material.baseinfo.IMaterialBaseInfoQueryService;
|
||||
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||
import nc.pubitf.para.SysInitQuery;
|
||||
import nc.vo.bd.defdoc.DefdocVO;
|
||||
|
@ -24,9 +26,9 @@ 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;
|
||||
import nc.vo.util.CloneUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
import static nccloud.openapi.ic.m4c.mapping.M4cFieldsEnum.cmaterialvid;
|
||||
|
||||
|
@ -47,12 +49,13 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<OrderVO> {
|
|||
return;
|
||||
}
|
||||
try {
|
||||
OrderVO[] cloneOrderVOS = (OrderVO[]) CloneUtil.deepClone(orderVOS);
|
||||
//检查并筛选销售出库单据为互感器公司
|
||||
List<OrderVO> newOrderVOS = checkAndFilterBillSrcOrg(orderVOS);
|
||||
if (newOrderVOS.isEmpty()) {
|
||||
List<OrderVO> newOrderVOS = checkAndFilterBillSrcOrg(cloneOrderVOS);
|
||||
if (newOrderVOS==null||newOrderVOS.size()<1) {
|
||||
return;
|
||||
}
|
||||
// 推送到睿智系统
|
||||
//推送到锐制系统
|
||||
pushToRZMOM(newOrderVOS.toArray(new OrderVO[0]));
|
||||
} catch (Exception e) {
|
||||
log.error("同步采购订单到锐制系统失败: " + e.getMessage());
|
||||
|
@ -62,15 +65,65 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule<OrderVO> {
|
|||
|
||||
private List<OrderVO> checkAndFilterBillSrcOrg(OrderVO[] OrderVOS) throws BusinessException {
|
||||
List<OrderVO> aggvoList = new ArrayList<>();
|
||||
List<OrderVO> finalList = new ArrayList<>();
|
||||
|
||||
for (OrderVO aggvo : OrderVOS) {
|
||||
String pkOrg = aggvo.getHVO().getPk_org();
|
||||
Integer forderstatus = aggvo.getHVO().getForderstatus();
|
||||
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
|
||||
if ("C022".equals(orgCode) && 3 == forderstatus && aggvo.getBVO()!=null && aggvo.getBVO().length > 0) {
|
||||
aggvoList.add(aggvo);
|
||||
String vdef20 = aggvo.getHVO().getVdef20();
|
||||
if(vdef20==null||"N".equals(vdef20)){
|
||||
if ("C022".equals(orgCode) && 3 == forderstatus && aggvo.getBVO()!=null && aggvo.getBVO().length > 0) {
|
||||
aggvoList.add(aggvo);
|
||||
}
|
||||
}
|
||||
}
|
||||
return aggvoList;
|
||||
//再次筛选
|
||||
//2025年7月2日10点33分--新增不传--表体物料编码前三位为103时不传
|
||||
//获取表体物料信息
|
||||
if(aggvoList.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
Set<String> materialpks=new HashSet<>();
|
||||
for (OrderVO aggvo : aggvoList) {
|
||||
for (OrderItemVO item : aggvo.getBVO()) {
|
||||
String cmaterialvid = item.getPk_material();
|
||||
materialpks.add(cmaterialvid);
|
||||
}
|
||||
}
|
||||
if(materialpks.isEmpty()){
|
||||
return aggvoList;
|
||||
}
|
||||
//根据物料id查询物料信息
|
||||
MaterialVO[] vos = NCLocator.getInstance().lookup(IMaterialBaseInfoQueryService.class).queryDataByPks(materialpks.toArray(new String[0]));
|
||||
//组装Map
|
||||
Map<String, String> materialMap = new HashMap<>();
|
||||
if(vos==null || vos.length<1){
|
||||
throw new BusinessException("Failed to query material info , please check !!!");
|
||||
}
|
||||
for (MaterialVO vo : vos) {
|
||||
String cmaterialvid = vo.getPk_material();
|
||||
String cmaterialcode =vo.getCode();
|
||||
materialMap.put(cmaterialvid, cmaterialcode);
|
||||
}
|
||||
//筛选行数据
|
||||
for (OrderVO aggvo : aggvoList) {
|
||||
List<OrderItemVO> newItems = new ArrayList<>();
|
||||
for (OrderItemVO item : aggvo.getBVO()) {
|
||||
String cmaterialvid = item.getPk_material();
|
||||
if (materialMap.containsKey(cmaterialvid)) {
|
||||
String materialCode = materialMap.get(cmaterialvid);
|
||||
if(!materialCode.startsWith("103")){
|
||||
newItems.add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!newItems.isEmpty()) {
|
||||
aggvo.setBVO(newItems.toArray(new OrderItemVO[0]));
|
||||
finalList.add(aggvo);
|
||||
}
|
||||
}
|
||||
return finalList;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -111,7 +111,7 @@ public class OrderApproveAction {
|
|||
processer.addAfterRule(new OrderRewritePMStartDateRule(true));
|
||||
processer.addAfterRule(new OrderApprovePMSupplyRule());
|
||||
|
||||
// 采购订单审批后同步到锐制MES系统
|
||||
// 采购订单审批后同步到锐制系统
|
||||
processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ());
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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());
|
||||
|
||||
// 交货日期
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ import javax.ws.rs.Consumes;
|
|||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.Produces;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -75,6 +76,16 @@ public class CloseSoResource extends AbstractNCCRestResource {
|
|||
ISaleOrderQueryAPI iSaleOrderQueryAPI= NCLocator.getInstance()
|
||||
.lookup(ISaleOrderQueryAPI.class);
|
||||
SaleOrderVO[] billvos = iSaleOrderQueryAPI.queryVOByIDs(ids);
|
||||
billvos = Arrays.stream(billvos)
|
||||
.filter(vo -> vo.getParentVO().getFstatusflag() != 4)
|
||||
.toArray(SaleOrderVO[]::new);
|
||||
if(billvos.length == 0){
|
||||
errojson.put("status", "1");
|
||||
errojson.put("message", "单据已经被关闭");
|
||||
errojson.put("codeList", "");
|
||||
return ResultMessageUtil.toJSON(errojson);
|
||||
|
||||
}
|
||||
// ISCMBatchOprContext context = new SCMBatchOprContext();
|
||||
// context.setInterfaceName("nc.itf.so.m30.closemanage.ISaleOrderCloseManageMaintain");
|
||||
// context.setMethodName("closeSaleOrder");
|
||||
|
@ -87,10 +98,10 @@ public class CloseSoResource extends AbstractNCCRestResource {
|
|||
.lookup(ISaleOrderCloseManageMaintain.class);
|
||||
SaleOrderVO[] saleOrderVOS= iSaleOrderCloseManageMaintain.closeSaleOrder(billvos);
|
||||
if(saleOrderVOS.length == 0){
|
||||
errojson.put("status", "0");
|
||||
errojson.put("message", "¹Ø±Õʧ°Ü");
|
||||
errojson.put("codeList", "");
|
||||
return ResultMessageUtil.toJSON(errojson);
|
||||
errojson.put("status", "0");
|
||||
errojson.put("message", "关闭失败");
|
||||
errojson.put("codeList", "");
|
||||
return ResultMessageUtil.toJSON(errojson);
|
||||
|
||||
}
|
||||
errojson.put("status", "1");
|
||||
|
@ -130,7 +141,22 @@ public class CloseSoResource extends AbstractNCCRestResource {
|
|||
// 直接获取每个元素的字符串形式
|
||||
stringArray[i] = array.getString(i);
|
||||
}
|
||||
SaleOrderViewVO[] result = this.buttonClick(stringArray, "billOpen");
|
||||
|
||||
SaleOrderViewVO[] vos = queryViewByBIDs(stringArray, "");
|
||||
CombineViewToAggUtil<SaleOrderVO> combineViewToAggUtil = new CombineViewToAggUtil(SaleOrderVO.class, SaleOrderHVO.class, SaleOrderBVO.class);
|
||||
SaleOrderVO[] bills = (SaleOrderVO[])combineViewToAggUtil.combineViewToAgg(vos, "csaleorderid");
|
||||
|
||||
bills = Arrays.stream(bills)
|
||||
.filter(vo -> vo.getParentVO().getFstatusflag() == 4)
|
||||
.toArray(SaleOrderVO[]::new);
|
||||
if(bills.length == 0){
|
||||
errojson.put("status", "1");
|
||||
errojson.put("message", "打开成功");
|
||||
errojson.put("codeList", "");
|
||||
// 返回表示操作成功的JSON字符串
|
||||
return ResultMessageUtil.toJSON(errojson);
|
||||
}
|
||||
SaleOrderViewVO[] result = this.buttonClick(bills, "billOpen");
|
||||
if (result.length == 0 ){
|
||||
errojson.put("status", "0");
|
||||
errojson.put("message", "打开失败");
|
||||
|
@ -172,10 +198,7 @@ public class CloseSoResource extends AbstractNCCRestResource {
|
|||
|
||||
|
||||
|
||||
public static SaleOrderViewVO[] buttonClick(String [] bids, String buttonType) throws BusinessException {
|
||||
SaleOrderViewVO[] vos = queryViewByBIDs(bids, "");
|
||||
CombineViewToAggUtil<SaleOrderVO> combineViewToAggUtil = new CombineViewToAggUtil(SaleOrderVO.class, SaleOrderHVO.class, SaleOrderBVO.class);
|
||||
SaleOrderVO[] bills = (SaleOrderVO[])combineViewToAggUtil.combineViewToAgg(vos, "csaleorderid");
|
||||
public static SaleOrderViewVO[] buttonClick(SaleOrderVO[] bills, String buttonType) throws BusinessException {
|
||||
ISaleOrderCloseMaintainService service=NCLocator.getInstance()
|
||||
.lookup(ISaleOrderCloseMaintainService.class);
|
||||
SaleOrderViewVO[] saleOrderViewVOS= service.billOpen(bills,false);
|
||||
|
|
|
@ -1333,9 +1333,54 @@ public class InvoiceTransferUtil {
|
|||
pinvoice.setCjh(headvo.getCjh());
|
||||
// pinvoice.setKqysssxbgglbm(headvo.getKqysssxbgglbm());
|
||||
|
||||
setOtherField(headvo, pinvoice);
|
||||
return pinvoice;
|
||||
}
|
||||
|
||||
private static void setOtherField(IVApplicationHeadVO headvo, PInvoice pinvoice) {
|
||||
// 是否展示销售方开户银行及账号 Y-是/N-否
|
||||
String def3 = headvo.getDef3();
|
||||
// 是否展示销售方地址电话
|
||||
String def4 = headvo.getDef4();
|
||||
// 是否填写收款人及复核人
|
||||
String def16 = headvo.getDef16();
|
||||
// 是否展示购买方单位、地址电话
|
||||
String def17 = headvo.getDef17();
|
||||
// 是否展示购买方开户行、银行账号
|
||||
String def18 = headvo.getDef18();
|
||||
|
||||
// einvoiceShowGxfDzDh 表示是否显示购方和销方的地址电话
|
||||
// 根据需求:0: 不显示 1: 显示购方地址电话 2: 显示销方地址电话 3: 显示购方和销方地址电话
|
||||
int einvoiceShowGxfDzDh = 0;
|
||||
|
||||
if ("Y".equals(def3)) {
|
||||
einvoiceShowGxfDzDh += 1; // 购方地址电话显示
|
||||
}
|
||||
if ("Y".equals(def17)) {
|
||||
einvoiceShowGxfDzDh += 2; // 销方地址电话显示
|
||||
}
|
||||
|
||||
// einvoiceShowGxfYhZh 表示是否显示购方和销方的小银行账户
|
||||
// 根据需求:0: 不显示 1: 显示购方银行账户 2: 显示销方银行账户 3: 显示购方和销方银行账户
|
||||
int einvoiceShowGxfYhZh = 0;
|
||||
|
||||
if ("Y".equals(def4)) {
|
||||
einvoiceShowGxfYhZh += 1; // 购方银行账户显示
|
||||
}
|
||||
if ("Y".equals(def18)) {
|
||||
einvoiceShowGxfYhZh += 2; // 销方银行账户显示
|
||||
}
|
||||
// 数电发票是否显示购销方地址电话 0:不显示 1:仅显示销地址、电话 2:仅显示购买方地址、电话 3:购销方地址、电话都显示
|
||||
pinvoice.setEinvoiceShowGxfDzDh(String.valueOf(einvoiceShowGxfDzDh));
|
||||
// 数电发票是否显示购销方银行、账号: 0:不显示 1:仅显示销售方银行、账号 2:仅显示购买方银行、账号 3:购销方银行、账号都显示
|
||||
pinvoice.setEinvoiceShowGxfYhZh(String.valueOf(einvoiceShowGxfYhZh));
|
||||
|
||||
pinvoice.setGmf_dh(headvo.getGmf_dh());
|
||||
pinvoice.setGmf_dz(headvo.getGmf_dz());
|
||||
pinvoice.setXsf_dz(headvo.getXsf_dz());
|
||||
pinvoice.setXsf_dz(headvo.getXsf_dh());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据红冲申请转换成发票平台VO
|
||||
*
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding='gb2312'?>
|
||||
<module>
|
||||
<rest>
|
||||
<resource classname="nccloud.api.uapbd.msg.MsgResource" exinfo=""/>
|
||||
</rest>
|
||||
|
||||
</module>
|
|
@ -3,4 +3,5 @@
|
|||
<rest>
|
||||
<resource classname="nccloud.api.uapbd.QuerySync" exinfo=""/>
|
||||
</rest>
|
||||
|
||||
</module>
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
package nccloud.api.uapbd.material.listener;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.bd.baseservice.ArrayClassConvertUtil;
|
||||
import nc.bs.businessevent.IBusinessEvent;
|
||||
import nc.bs.businessevent.IBusinessListener;
|
||||
import nc.bs.businessevent.bd.BDCommonEvent;
|
||||
import nc.bs.logging.Logger;
|
||||
import nc.bs.uapbd.util.MyHelper;
|
||||
import nc.bs.uapbd.util.ThirdPartyPostRequestUtil;
|
||||
import nc.itf.arap.goldentax.SysParaInitQuery;
|
||||
import nc.vo.bd.material.MaterialVO;
|
||||
import nc.vo.bd.material.marbasclass.MarBasClassVO;
|
||||
import nc.vo.bd.material.measdoc.MeasdocVO;
|
||||
import nc.vo.org.FactoryVO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 物料新增修改后同步艾普MES的物料
|
||||
*
|
||||
* @author mzr
|
||||
* @date 2025/06/27
|
||||
*/
|
||||
public class MaterialToEpicMesListener implements IBusinessListener {
|
||||
|
||||
private static final String reqUrl = "/prj-v5-web/ext/api/mrl";
|
||||
|
||||
@Override
|
||||
public void doAction(IBusinessEvent event) throws BusinessException {
|
||||
BDCommonEvent e = (BDCommonEvent) event;
|
||||
String eventType = event.getEventType();
|
||||
Object[] objs = e.getObjs();
|
||||
MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class);
|
||||
// EventType是事件编码
|
||||
if ("1002".equals(eventType)) {
|
||||
// 新增后
|
||||
buildSyncData(useVOs, eventType);
|
||||
} else if ("1004".equals(eventType)) {
|
||||
// 修改后
|
||||
buildSyncData(useVOs, eventType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建同步数据
|
||||
*/
|
||||
private void buildSyncData(MaterialVO[] useVOs, String eventType) throws BusinessException {
|
||||
for (MaterialVO vo : useVOs) {
|
||||
// 判断物料的业务单元是否是电力电子公司,不是则跳过
|
||||
String pkOrg = vo.getPk_org();
|
||||
String orgCode = MyHelper.transferField(FactoryVO.getDefaultTableName(), FactoryVO.CODE, FactoryVO.PK_FACTORY, pkOrg);
|
||||
if (!MyHelper.checkIfDldzOrg(orgCode)) {
|
||||
continue;
|
||||
}
|
||||
// 1=未启用;2=已启用;3=已停用;
|
||||
Integer enablestate = vo.getEnablestate();
|
||||
String statusCode = (3 == enablestate) ? "N" : "Y";
|
||||
JSONObject singleObj = new JSONObject();
|
||||
singleObj.put("id", null);// 唯一标识(主键)
|
||||
singleObj.put("siteCode", null);// 工厂编码
|
||||
singleObj.put("mrlCode", vo.getCode());// 物料编码
|
||||
singleObj.put("mrlName", vo.getName());// 物料名称
|
||||
String pkMeasdoc = vo.getPk_measdoc();
|
||||
String unitName = MyHelper.transferField(MeasdocVO.getDefaultTableName(), MeasdocVO.NAME, MeasdocVO.PK_MEASDOC, pkMeasdoc);
|
||||
singleObj.put("unit", unitName);// 单位
|
||||
singleObj.put("model", vo.getMaterialtype());// 型号
|
||||
singleObj.put("specification", vo.getMaterialspec());// 规格
|
||||
singleObj.put("type", getType(eventType));// 类型(I:新增 U:修改 D:删除)
|
||||
singleObj.put("deputyUnit", null);// 副单位
|
||||
singleObj.put("auditCode", "1");// 审核码
|
||||
singleObj.put("statusCode", statusCode);// 状态码(Y表示启用,N表示停用)
|
||||
singleObj.put("mrlTypeErp", "1");// 物料类型ERP(1:专用件,3:通用件)
|
||||
String pk_marbasclass = vo.getPk_marbasclass();
|
||||
String mrlTypeCOde = MyHelper.transferField(MarBasClassVO.getDefaultTableName(), MarBasClassVO.CODE, MarBasClassVO.PK_MARBASCLASS, pk_marbasclass);
|
||||
singleObj.put("mrlType", mrlTypeCOde);// 物料分类编码
|
||||
singleObj.put("convertRate", "1");// 单位换算率
|
||||
singleObj.put("isCheck", "1");// 是否选中(1:是,0:否)
|
||||
pushData(singleObj);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送同步数据
|
||||
*/
|
||||
private void pushData(JSONObject param) throws BusinessException {
|
||||
String baseUrl = SysParaInitQuery.getParaString("GLOBLE00000000000000", "EPICMESURL");
|
||||
String requestUrl = baseUrl + reqUrl;
|
||||
String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, param.toJSONString());
|
||||
JSONObject resultObj = JSONObject.parseObject(result);
|
||||
Logger.error("EpicMes-Material-req = " + result);
|
||||
|
||||
if ("false".equals(resultObj.getString("success"))) {
|
||||
throw new BusinessException("EpicMes-Material-fail,error:" + resultObj.getString("msg"));
|
||||
} else {
|
||||
Logger.error("EpicMes-Material-suc,result[" + resultObj.toJSONString() + "]");
|
||||
}
|
||||
}
|
||||
|
||||
private String getType(String eventType) {
|
||||
// 类型(I:新增 U:修改 D:删除)
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("1002", "I");
|
||||
map.put("1004", "U");
|
||||
return map.getOrDefault(eventType, "I");
|
||||
}
|
||||
|
||||
}
|
|
@ -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]);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package nc.bs.uapbd.util;
|
||||
|
||||
import nc.bs.dao.BaseDAO;
|
||||
import nc.bs.logging.Logger;
|
||||
import nc.itf.arap.goldentax.SysParaInitQuery;
|
||||
import nc.jdbc.framework.processor.ColumnProcessor;
|
||||
import nc.vo.cmp.util.StringUtils;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pubapp.pattern.pub.SqlBuilder;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
|
||||
/**
|
||||
* 工具类
|
||||
*
|
||||
* @author mzr
|
||||
* @date 2025/7/3
|
||||
*/
|
||||
public class MyHelper {
|
||||
private static final BaseDAO dao = new BaseDAO();
|
||||
|
||||
/**
|
||||
* 根据主键查询编码
|
||||
*/
|
||||
public static String transferField(String tableName, String selectField, String pkField, String pk) throws BusinessException {
|
||||
if (StringUtils.isEmpty(pk)) {
|
||||
return null;
|
||||
}
|
||||
SqlBuilder sqlBuilder = new SqlBuilder();
|
||||
sqlBuilder.append(" select " + selectField);
|
||||
sqlBuilder.append(" from " + tableName);
|
||||
sqlBuilder.append(" where ");
|
||||
sqlBuilder.append(pkField, pk);
|
||||
Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
|
||||
if (o == null) {
|
||||
throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】");
|
||||
}
|
||||
return o.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查当前组织是否为电力电子
|
||||
*/
|
||||
public static boolean checkIfDldzOrg(String code) throws BusinessException {
|
||||
String targetCode = SysParaInitQuery.getParaString("GLOBLE00000000000000", "DLDZORG");
|
||||
if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) {
|
||||
throw new BusinessException("未配置组织参数,请前往 [业务参数设置-全局] 配置DLDZORG参数");
|
||||
}
|
||||
String[] orgItem = targetCode.split(";");
|
||||
for (String orgCode : orgItem) {
|
||||
if (!orgCode.isEmpty() && orgCode.equals(code)) {
|
||||
Logger.debug("当前处理组织校验为电力电子:" + code);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换特殊字段 如 1/1 转换为小数 1.0
|
||||
*/
|
||||
|
||||
private String transferSpecialField(String field) {
|
||||
if (field == null || field.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
String[] split = field.split("/");
|
||||
if (split.length == 2) {
|
||||
String numStr = split[0].trim();
|
||||
String denStr = split[1].trim();
|
||||
if (denStr.equals("0")) {
|
||||
return "0.00"; // 分母不能为零
|
||||
}
|
||||
try {
|
||||
BigDecimal numerator = new BigDecimal(numStr);
|
||||
BigDecimal denominator = new BigDecimal(denStr);
|
||||
return numerator.divide(denominator, 2, RoundingMode.HALF_UP).toString();
|
||||
} catch (NumberFormatException e) {
|
||||
return field; // 非法数字,返回原字段
|
||||
}
|
||||
}
|
||||
return field;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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()) + "'";
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -3,15 +3,15 @@ package nccloud.api.uapbd.msg;
|
|||
import com.alibaba.fastjson.JSONObject;
|
||||
import nc.bs.dao.DAOException;
|
||||
import nc.bs.logging.Logger;
|
||||
import nc.bs.pub.pf.PfMessageUtil;
|
||||
import nc.bs.trade.business.HYSuperDMO;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pub.lang.UFDateTime;
|
||||
import nc.vo.pub.msg.CommonMessageVO;
|
||||
import nc.vo.pub.msg.UserNameObject;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.sm.UserVO;
|
||||
import nccloud.api.rest.utils.ResultMessageUtil;
|
||||
import nccloud.baseapp.core.log.NCCForUAPLogger;
|
||||
import nccloud.bs.pub.pf.PfMessageUtil;
|
||||
import nccloud.commons.lang.StringUtils;
|
||||
import nccloud.ws.rest.resource.AbstractNCCRestResource;
|
||||
import org.json.JSONString;
|
||||
|
@ -57,7 +57,7 @@ public class MsgResource extends AbstractNCCRestResource {
|
|||
String roleId = (String) jsonObject.get("roleId");
|
||||
try {
|
||||
// 通知消息字段,最大为4000位。
|
||||
if (content.length() > 1500) {
|
||||
if (content != null && content.length() > 1500) {
|
||||
content = content.substring(0, 1500);
|
||||
}
|
||||
|
||||
|
@ -111,17 +111,18 @@ public class MsgResource extends AbstractNCCRestResource {
|
|||
return null;
|
||||
}
|
||||
String strWhere = " dr = 0 AND cuserid in (" +
|
||||
"select cuserid from sm_user_role where pk_role = [roleId] and (disabledate is null or disabledate >= [now]) " +
|
||||
"select cuserid from sm_user_role where pk_role = '[roleId]' and (disabledate is null or disabledate >= '[now]') " +
|
||||
")";
|
||||
strWhere = strWhere.replace("[roleId]", roleId);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String time = sdf.format(new Date());
|
||||
strWhere = strWhere.replace("[now]", time);
|
||||
NCCForUAPLogger.debug("time = " + time);
|
||||
// NCCForUAPLogger.debug("time = " + time);
|
||||
try {
|
||||
vos = (UserVO[]) getSuperDMO().queryByWhereClause(UserVO.class, strWhere);
|
||||
} catch (DAOException e) {
|
||||
Logger.error("MsgResource-getUserByRole-exp:" + e.getMessage());
|
||||
ExceptionUtils.wrappBusinessException(e.getMessage());
|
||||
}
|
||||
return vos;
|
||||
|
||||
|
|
Loading…
Reference in New Issue