Compare commits

...

28 Commits
main ... dev

Author SHA1 Message Date
mzr 2a8e07b100 物料新增修改后同步艾普MES的物料、流程生产订单审批后推送艾普MES 2025-07-03 10:31:34 +08:00
mzr 1e908abe0f 工具类 2025-07-03 10:16:52 +08:00
mzr f326403576 消息接口 2025-07-03 10:16:02 +08:00
李正@用友 155c549ad0 互感器采购订单_生产订单_备料计划过滤103物料分类 2025-07-02 15:54:33 +08:00
李正@用友 e8f76b652f 互感器生产订单审批推送MES签发标记改默认1 2025-07-01 18:18:35 +08:00
李正@用友 2a6219d219 互感器采购订单_生产订单_备料计划过滤期初数据 2025-07-01 15:13:02 +08:00
李正@用友 87c25fbf45 材料出库接口去除电缆代码 2025-07-01 09:37:32 +08:00
lihao 691bbb8815 Merge remote-tracking branch 'origin/main' 2025-07-01 09:00:31 +08:00
lihao c094e6bb4b 优化 2025-07-01 09:00:19 +08:00
李正@用友 6adb7c637e ic_后端_材料出库单列表汇总打印_V3 2025-06-30 14:34:47 +08:00
李正@用友 77b29e0664 销售订单审批推送电缆新增行备注 2025-06-27 15:36:11 +08:00
sun be1e1713c9 凭证合并制单人按转换模板公式取值 2025-06-27 15:09:35 +08:00
sun 3323304d95 费用单据查询节点新增收款人查询条件 2025-06-27 15:09:34 +08:00
sun af5e267e07 客户修改同步更新税务信息购买方名称 2025-06-27 15:09:33 +08:00
sun 7fbae1323a 票据推送流水,对账标识码为用票据号+子票区间 2025-06-27 15:09:33 +08:00
李正@用友 558067ddda 采购订单修订审批推送锐制 2025-06-27 14:44:16 +08:00
李正@用友 386047337c 材料出库单列表汇总打印_增量 2025-06-27 13:52:49 +08:00
李正@用友 84cbe082da patch_dev_ic_材料出库单列表汇总打印_sdlizheng_20250627 2025-06-27 09:40:01 +08:00
zhangxinah@yonyou.com d7c30490b8 客户自动分配业务单元定时任务 2025-06-26 15:29:55 +08:00
zhangxinah@yonyou.com 201450acea 形态转换保存时辅助属性根据物料库存信息页签判断 2025-06-26 15:26:29 +08:00
李正@用友 f60c8845ac 互感器总补丁_重新出部分_未修改代码 2025-06-26 13:53:55 +08:00
李正@用友 2139c2ca26 委外备料计划添加合同信息 2025-06-24 17:36:54 +08:00
zhangxinah@yonyou.com 396350b474 新增模块 2025-06-24 16:20:18 +08:00
zhangxinah@yonyou.com 05e6066549 新电票补丁适配 2025-06-24 16:12:06 +08:00
李正@用友 de9f03c51d 互感器总补丁 2025-06-24 14:48:50 +08:00
mzr e1acb156e3 开票推税务云增加销售购买方地址电话字段 2025-06-24 11:15:09 +08:00
mzr 279c433e76 开票推税务云增加销售购买方地址电话字段 2025-06-24 11:09:46 +08:00
mzr 45bd2afa2d Revert "开票推税务云增加字段-代码回退"
This reverts commit 544db685db.
2025-06-24 10:36:58 +08:00
60 changed files with 7715 additions and 2314 deletions

File diff suppressed because one or more lines are too long

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
// }
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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() {

View File

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

View File

@ -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 {

View File

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

View File

@ -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;
}
}

View File

@ -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半成品入库

View File

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

View File

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

View File

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

View File

@ -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;
}
/**

View File

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

View File

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

View File

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

View File

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

View File

@ -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);

View File

@ -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
*

7
uapbd/META-INF/msg.rest Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding='gb2312'?>
<module>
<rest>
<resource classname="nccloud.api.uapbd.msg.MsgResource" exinfo=""/>
</rest>
</module>

View File

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

View File

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

View File

@ -0,0 +1,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");// 物料类型ERP1:专用件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-failerror:" + 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");
}
}

View File

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

View File

@ -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;
}
}

View File

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

View File

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

View File

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

View File

@ -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;