Merge remote-tracking branch 'origin/main'

This commit is contained in:
张明 2025-06-17 10:09:47 +08:00
commit 5a869f91ab
31 changed files with 2672 additions and 647 deletions

View File

@ -100,6 +100,11 @@
<classpathentry kind="src" output="bin" path="imag/src/private"/>
<classpathentry kind="src" output="bin" path="imag/src/test"/>
<classpathentry kind="src" output="bin" path="imag/resources"/>
<classpathentry kind="src" output="bin" path="mmpsc/src/public"/>
<classpathentry kind="src" output="bin" path="mmpsc/src/client"/>
<classpathentry kind="src" output="bin" path="mmpsc/src/private"/>
<classpathentry kind="src" output="bin" path="mmpsc/src/test"/>
<classpathentry kind="src" output="bin" path="mmpsc/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>

View File

@ -0,0 +1,62 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nc.bs.pub.action;
import nc.bs.arap.actions.N_BASE_ACTION;
import nc.bs.arap.util.GatheringBillAfter;
import nc.bs.framework.common.NCLocator;
import nc.vo.arap.gathering.AggGatheringBillVO;
import nc.vo.arap.pub.ArapConstant;
import nc.vo.fipub.exception.ExceptionHandler;
import nc.vo.pub.BusinessException;
import nc.vo.pub.compiler.PfParameterVO;
import nccloud.pubitf.arap.arappub.IArapBillPubUtilService;
import java.util.Hashtable;
public class N_F2_DELETE extends N_BASE_ACTION {
private Hashtable<String, Object> m_keyHas = null;
public N_F2_DELETE() {
}
public Object runComClass(PfParameterVO paraVo) throws BusinessException {
try {
if (paraVo.m_preValueVos == null) {
return null;
} else {
Object obj = null;
super.m_tmpVo = paraVo;
String actionCode = ArapConstant.DELETE;
((IArapBillPubUtilService) NCLocator.getInstance().lookup(IArapBillPubUtilService.class)).interceptorVaildator(paraVo.m_preValueVos, actionCode);
this.setParameter("context", paraVo.m_preValueVos);
obj = this.runClass("nc.bs.arap.actions.GatheringbillDeleteBatchBSAction", "deleteVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas);
this.afterCheck();
// 收款单删除后将对应的到账通知cmp_informer的生成状态generateflag修改为已生成hasnogenerate
AggGatheringBillVO[] aggVos = (AggGatheringBillVO[]) paraVo.m_preValueVos;
GatheringBillAfter.updateInformerGenerateFlag(aggVos, "hasnogenerate");
return obj;
}
} catch (Exception ex) {
throw ExceptionHandler.handleException(this.getClass(), ex);
}
}
public String getCodeRemark() {
return " arap action script not allowed to modify ,all rights reserved!";
}
protected void setParameter(String key, Object val) {
if (this.m_keyHas == null) {
this.m_keyHas = new Hashtable();
}
if (val != null) {
this.m_keyHas.put(key, val);
}
}
}

View File

@ -0,0 +1,186 @@
package nc.bs.pub.action;
import nc.bs.arap.actions.N_BASE_ACTION;
import nc.bs.arap.gatheringbp.GatherBillBO;
import nc.bs.arap.util.GatheringBillAfter;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Logger;
import nc.impl.pubapp.env.BSContext;
import nc.pubitf.so.m30.sobalance.ISoBalance4VerifyQryBill;
import nc.vo.arap.gathering.AggGatheringBillVO;
import nc.vo.arap.pub.ArapConstant;
import nc.vo.arap.pub.BillEnumCollection;
import nc.vo.arap.receivable.ReceivableBillItemVO;
import nc.vo.arap.utils.StringUtil;
import nc.vo.fi.pub.SqlUtils;
import nc.vo.fipub.exception.ExceptionHandler;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.compiler.PfParameterVO;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDouble;
import nccloud.bs.arap.util.commit.ArapCommitUtil;
import nccloud.impl.platform.common.util.StringUtils;
import nccloud.pubitf.arap.arappub.IArapBillPubUtilService;
import java.util.*;
public class N_F2_SAVE extends N_BASE_ACTION {
private Hashtable<String, Object> m_keyHas = null;
public String getCodeRemark() {
return " arap action script not allowed to modify ,all rights reserved!";
}
public Object runComClass(PfParameterVO paraVo) throws BusinessException {
try {
super.m_tmpVo = paraVo;
Object obj = null;
setParameter("context", paraVo.m_preValueVos);
if (paraVo.isCloudEntry) {
String actionCode = ArapConstant.SAVE;
((IArapBillPubUtilService) NCLocator.getInstance().lookup(IArapBillPubUtilService.class)).interceptorVaildator(paraVo.m_preValueVos, actionCode);
}
String code = InvocationInfoProxy.getInstance().getProperty(ArapConstant.NCCFlOW_PARAMTER);
if (!StringUtils.isEmpty(code)) {
String[] codes = code.split(",");
for (int i = 0; i < codes.length; i++) {
BSContext.getInstance().setSession(codes[i], UFBoolean.FALSE);
}
}
this.beforeCheck();
AggregatedValueObject bill = (paraVo.m_preValueVo == null) ? paraVo.m_preValueVos[0] : paraVo.m_preValueVo;
if (bill != null && bill.getChildrenVO() != null && bill.getChildrenVO().length > 0 && bill.getChildrenVO()[0] != null) {
String pk_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("pk_billtype");
String top_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("top_billtype");
String src_billtype = (String) bill.getChildrenVO()[0].getAttributeValue("src_billtype");
if ("F2".equals(pk_billtype) && "30".equals(src_billtype) && "F0".equals(top_billtype)) {
Map<String, UFDouble> f2mnyMap = new HashMap<>();
Map<String, UFDouble> f0mnyMap = new HashMap<>();
List<String> orderIds = new ArrayList<>();
List<String> f0pks = new ArrayList<>();
for (int i = 0; i < bill.getChildrenVO().length; i++) {
String src_billid = (String) bill.getChildrenVO()[i].getAttributeValue("src_billid");
UFDouble money_bal = (UFDouble) bill.getChildrenVO()[i].getAttributeValue("money_bal");
if (!StringUtil.isEmpty(src_billid)) {
orderIds.add((String) bill.getChildrenVO()[i].getAttributeValue("src_billid"));
}
if (f2mnyMap.get(src_billid) == null) {
f2mnyMap.put(src_billid, money_bal);
} else {
f2mnyMap.put(src_billid, ((UFDouble) f2mnyMap.get(src_billid)).add(money_bal));
}
f0pks.add((String) bill.getChildrenVO()[i].getAttributeValue("top_billid"));
}
String f0sql = SqlUtils.getInStr("pk_recbill", (String[]) f0pks.toArray(new String[0]), true);
Collection<ReceivableBillItemVO> foItemvos = (new BaseDAO()).retrieveByClause(ReceivableBillItemVO.class, f0sql);
for (ReceivableBillItemVO vo : foItemvos) {
String src_billid = (String) vo.getAttributeValue("src_billid");
UFDouble money_bal = (UFDouble) vo.getAttributeValue("money_bal");
if (f0mnyMap.get(src_billid) == null) {
f0mnyMap.put(src_billid, money_bal);
continue;
}
f0mnyMap.put(src_billid, ((UFDouble) f0mnyMap.get(src_billid)).add(money_bal));
}
Map<String, Map<String, UFDouble>> soOrderIdTOF2ItemMnyMap = ((ISoBalance4VerifyQryBill) NCLocator.getInstance().lookup(ISoBalance4VerifyQryBill.class)).querySobalanceAccVerifyMnyMap((String[]) orderIds.toArray(new String[0]));
if (soOrderIdTOF2ItemMnyMap != null && soOrderIdTOF2ItemMnyMap.size() > 0) {
for (String order : orderIds) {
Map<String, UFDouble> mnys = (Map) soOrderIdTOF2ItemMnyMap.get(order);
UFDouble summny = UFDouble.ZERO_DBL;
if (mnys == null || mnys.size() == 0) {
continue;
}
for (String key : mnys.keySet()) {
UFDouble mny = (mnys.get(key) == null) ? UFDouble.ZERO_DBL : (UFDouble) mnys.get(key);
summny = summny.add(mny);
}
if (f2mnyMap.get(order) == null) {
f2mnyMap.put(order, summny);
continue;
}
f2mnyMap.put(order, ((UFDouble) f2mnyMap.get(order)).add(summny));
}
for (String order : orderIds) {
if (f0mnyMap.get(order) != null && f2mnyMap.get(order) != null && ((UFDouble) f2mnyMap.get(order)).abs().compareTo(((UFDouble) f0mnyMap.get(order)).abs()) > 0) {
throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("2006pub_0", "02006pub-1678"));
}
}
}
}
}
String primaryKey = paraVo.m_preValueVos[0].getParentVO().getPrimaryKey();
if (hasBill(primaryKey)) {
obj = runClass("nc.bs.arap.actions.GatheringbillEditSaveBatchBSAction", "updateVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas);
} else {
paraVo = approveStatusChange(paraVo);
obj = runClass("nc.bs.arap.actions.GatheringbillSaveBatchBSAction", "insertVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas);
}
// 生成收款单后将对应的到账通知cmp_informer的生成状态generateflag修改为已生成hasgenerate
AggGatheringBillVO[] aggVos = (AggGatheringBillVO[]) paraVo.m_preValueVos;
GatheringBillAfter.updateInformerGenerateFlag(aggVos, "hasgenerate");
return (new ArapCommitUtil()).autoCommit(obj);
} catch (Exception exception) {
throw ExceptionHandler.handleException(getClass(), exception);
}
}
private boolean hasBill(String primaryKey) throws BusinessException {
boolean hasBill = false;
if (primaryKey != null) {
AggGatheringBillVO[] bvos = null;
try {
GatherBillBO payableBO = new GatherBillBO();
bvos = payableBO.findBillByPrimaryKey(new String[]{primaryKey});
} catch (Exception e) {
Logger.error(e.getMessage(), e);
}
if (bvos != null && bvos.length != 0 && bvos[0] != null) {
hasBill = true;
}
}
return hasBill;
}
protected void setParameter(String key, Object val) {
if (this.m_keyHas == null) {
this.m_keyHas = new Hashtable();
}
if (val != null)
this.m_keyHas.put(key, val);
}
private PfParameterVO approveStatusChange(PfParameterVO paraVo) {
for (AggregatedValueObject vo : paraVo.m_preValueVos) {
vo.getParentVO().setAttributeValue("approvestatus", BillEnumCollection.ApproveStatus.NOSTATE.VALUE);
}
return paraVo;
}
}

View File

@ -0,0 +1,58 @@
package nc.bs.arap.util;
import nc.bs.dao.BaseDAO;
import nc.bs.logging.Logger;
import nc.jdbc.framework.SQLParameter;
import nc.vo.arap.gathering.AggGatheringBillVO;
import nc.vo.arap.gathering.GatheringBillItemVO;
import nccloud.commons.lang.StringUtils;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* 更新到账通知的收款生成状态
*
* @author mzr
* @date 2025/6/13
*/
public class GatheringBillAfter {
/**
* 更新收款单对应的到账通知 cmp_informer generateflag 生成状态
*
* @param aggVos 收款单vo数组
* @param generateFlag 目标状态例如 "hasgenerate" "hasnogenerate"
*/
public static void updateInformerGenerateFlag(AggGatheringBillVO[] aggVos, String generateFlag) {
if (aggVos == null || aggVos.length == 0) {
return; // 参数为空时直接返回
}
try {
Set<String> codeSet = new LinkedHashSet<>();
for (AggGatheringBillVO aggVo : aggVos) {
GatheringBillItemVO[] bvos = aggVo.getBodyVOs();
for (GatheringBillItemVO bvo : bvos) {
String bankrelatedCode = bvo.getBankrelated_code();
if (StringUtils.isNotEmpty(bankrelatedCode) && !"~".equals(bankrelatedCode)) {
codeSet.add(bankrelatedCode);
}
}
}
String[] codes = codeSet.toArray(new String[0]);
Logger.error("updateInformerGenerateFlag-codes = " + Arrays.toString(codes));
if (codes.length == 0) {
return;
}
BaseDAO baseDAO = new BaseDAO();
String inStr = SqlUtils.getInStr("bankrelated_code", codes, true);
String sql = "UPDATE cmp_informer SET generateflag = ? WHERE " + inStr;
SQLParameter params = new SQLParameter();
params.addParam(generateFlag);
baseDAO.executeUpdate(sql, params);
} catch (Exception e) {
Logger.error("updateInformerGenerateFlag-exp:", e);
}
}
}

View File

@ -0,0 +1,128 @@
package nc.bs.ic.m45.insert;
import nc.bs.ic.general.insert.IInsertBP;
import nc.bs.ic.general.insert.InsertBPTemplate;
import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue;
import nc.bs.ic.general.rule.after.AtpAfterUpdate;
import nc.bs.ic.general.rule.before.CtplcustomeridCheck;
import nc.bs.ic.m45.base.BPPlugInPoint;
import nc.bs.ic.m45.base.rule.FillCostOrgRule;
import nc.bs.ic.m45.base.rule.PurchaseBillCheckRule;
import nc.bs.ic.m45.base.rule.PurchaseInAssetWarehouseCheck;
import nc.bs.ic.m45.base.rule.PurchaseInVOScaleCheckRule;
import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcess;
import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcessFor5805;
import nc.bs.ic.m45.base.rule.ReturnSnIsExistInEquipcardCheck;
import nc.bs.ic.m45.base.rule.VmiCheckRule;
import nc.bs.ic.m45.insert.rule.*;
import nc.bs.ic.pub.base.ICAroundProcesser;
import nc.bs.ic.pub.base.IInsertRuleProvider;
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
import nc.vo.bd.payment.IPaymentUtil;
import nc.vo.ic.general.define.MetaNameConst;
import nc.vo.ic.m45.entity.PurchaseInBodyVO;
import nc.vo.ic.m45.entity.PurchaseInVO;
import nc.vo.ic.pub.util.StringUtil;
import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobAfterPurchaseInSave;
/**
* 采购入库单后台新增BP
*
* @author songhy
*/
public class InsertBP implements IInsertBP<PurchaseInVO>,
IInsertRuleProvider<PurchaseInVO> {
@Override
public void addAfterRule(PurchaseInVO[] vos,
AroundProcesser<PurchaseInVO> processor) {
//红字采购入库单保存的时候增加判断逻辑如果表头仓库是直运仓不检查物料的现存量 放在前面设置session
processor.addAfterRule(new IsRedBookThrough());
/**
* 放在现存量更新规则OnhandAfterUpdate之后因为现存量更新时会调用预留接口预留接口会回写采购订单
* 如果入库数量=订单数量订单会自动入库关闭入库关闭会解除预留导致后续操作错误
*/
((ICAroundProcesser<PurchaseInVO>) processor).addAfterRuleAt(
new InsertRewritePORule(), AtpAfterUpdate.class);
processor.addAfterRule(new InsReWritePIM());
processor.addAfterRule(new InsertRewriteITRule());
processor.addAfterRule(new MobAfterPurchaseInSave());
processor.addAfterRule(new FeeDetailInsert());
//红字采购入库单原单退回保存回写累计入库退回主数量由于预留处理需要查询蓝字采购入库单回写操作应放在现存量更新规则OnhandAfterUpdate之后
((ICAroundProcesser<PurchaseInVO>) processor).addAfterRuleAt(new InsertRedReturnInRewriteRule(), AtpAfterUpdate.class);
((ICAroundProcesser<PurchaseInVO>) processor).addAfterRuleAt(new InsertRedReturnInRewriteSORule(), InsertRedReturnInRewriteRule.class);
// 回写付款计划
processor.addAfterRule(new InsertRewritePayPlanConfirmDataRule());
// 回写付款计划子孙开票数据 先票后入库 入库日期时点
processor.addAfterRule(new InsertOrSignRewritePayPlanInvoiceRule(IPaymentUtil.STORE_RECEIPT_DATE));
// 入库单保存回写采购合同付款计划
processor.addAfterRule(new M45SaveAndRewriteCTPayPlan());
// processor.addAfterRule(new InsertRewritePORule());
}
@Override
public void addBeforeRule(PurchaseInVO[] vos,
AroundProcesser<PurchaseInVO> processor) {
// 检查是否可以生成入库单
processor.addBeforeRule(new InsertCheckCanInRule());
processor.addBeforeRule(new FillCostOrgRule());
// processor.addBeforeRule(new SaveCheckFeeMnyRule());
processor.addBeforeRule(new PurchaseBillCheckRule());
processor.addBeforeRule(new PurchaseInAssetWarehouseCheck());
// 当数量主数量数量报价数量与采购订单一致时使采购入库单表体价格和单价与采购订单一致
//下面的规则处理会使入库单的改价不生效 hujieh
// processor.addBeforeRule(new AdjustPriceAndMnyWhenSameNumRule());
processor.addBeforeRule(new CtplcustomeridCheck<PurchaseInVO>());
processor.addBeforeRule(new VmiCheckRule());
processor.addBeforeRule(new ReturnSnIsExistInEquipcardCheck());
// 红蓝字入库单倒挤跟订单倒挤
processor.addBeforeRule(new PurchaseinRetMarginProcess());
processor.addBeforeRule(new PurchaseinRetMarginProcessFor5805());
processor.addBeforeRule(new PurchaseInVOScaleCheckRule());
processor.addBeforeRule(new InsertCheckMaterialUnit());
// 利润中心校验规则
processor.addBeforeRule(new CheckCliabilityValue<PurchaseInVO>(MetaNameConst.CLIABILITYOID,MetaNameConst.CIOLIABILITYOID));
// 来源于进口模块--流向单填充报价单位报价换算率
processor.addBeforeRule(new FillInVqtunitRule());
//2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目采购入库单保存时包含接口导入清除行项目材料出库单保存时包含接口导入清除行项目
processor.addBeforeRule(new PurchaseInProjectRule());
}
@Override
public PurchaseInVO[] insert(PurchaseInVO[] bills) {
// 应该在物理自由辅助属性检查规则执行前补充供应商
this.fillCvendorid(bills);
InsertBPTemplate<PurchaseInVO> insertBP =
new InsertBPTemplate<PurchaseInVO>(BPPlugInPoint.InsertBP, this);
return insertBP.insert(bills);
}
/**
* 补表体的供应商供应商已经挪到表头表体的供应商要跟表头供应商一样
*
* @param vos
*/
private void fillCvendorid(PurchaseInVO[] vos) {
String cvendor = null;
String cvendorvid = null;
for (PurchaseInVO vo : vos) {
// 取表头供应商
cvendor = vo.getHead().getCvendorid();
cvendorvid = vo.getHead().getCvendorvid();
if (StringUtil.isSEmptyOrNull(cvendor)) {
continue;
}
// 为表体供应商赋值
for (PurchaseInBodyVO body : vo.getBodys()) {
body.setCvendorid(cvendor);
body.setCvendorvid(cvendorvid);
}
}
}
}

View File

@ -0,0 +1,77 @@
package nc.bs.ic.m45.insert.rule;
import nc.bs.dao.BaseDAO;
import nc.bs.ic.pub.base.ICRule;
import nc.jdbc.framework.processor.MapListProcessor;
import nc.vo.ic.general.define.ICBillBodyVO;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ic.m45.entity.PurchaseInVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Classname PurchaseInProjectRule
* @Description TODO
* @Version 1.0.0
* @Date 2025/6/13 14:19
* @Created by ame
*/
public class PurchaseInProjectRule extends ICRule<PurchaseInVO> {
private static BaseDAO dao=new BaseDAO();
@Override
public void process(PurchaseInVO[] vos) {
if(vos==null || vos.length<1){
return;
}
try {
//获取表头计划组织及表体行物料
for (ICBillVO vo : vos) {
String pk_org = (String) vo.getParentVO().getAttributeValue("pk_org");
ICBillBodyVO[] bodys = vo.getBodys();
Map<String,String> material_construct = new HashMap<>();
Map<String,String> material_stock = new HashMap<>();
queryFix2ByMaterial(bodys,material_construct,material_stock,pk_org);
for(ICBillBodyVO body:bodys){
String cmaterialvid = body.getCmaterialvid();
if(material_construct.containsKey(cmaterialvid)&& "Y".equals(material_construct.get(cmaterialvid))&& (!material_stock.containsKey(cmaterialvid)|| "N".equals(material_stock.get(cmaterialvid)))){
body.setCprojectid(null);
}
}
}
} catch (BusinessException var6) {
ExceptionUtils.wrappException(var6);
}
}
private void queryFix2ByMaterial(ICBillBodyVO[] childrenVOs, Map<String, String> materialConstruct, Map<String, String> materialStock, String pkOrg) throws BusinessException {
List<String> materials=new ArrayList<>();
for (ICBillBodyVO childrenVO : childrenVOs){
String cmaterialvid = childrenVO.getCmaterialvid();
materials.add(cmaterialvid);
}
SqlBuilder sql =new SqlBuilder();
sql.append(" SELECT bdm.pk_material ,bdmf.fix2,bdms.fixasst2 ");
sql.append(" FROM bd_material bdm ");
sql.append(" LEFT JOIN bd_marasstframe bdmf ON bdm.pk_marasstframe =bdmf.pk_marasstframe ");
sql.append(" LEFT JOIN bd_materialstock bdms ON bdms.PK_MATERIAL =bdm.PK_MATERIAL AND bdms.PK_ORG ='"+pkOrg+"' ");
sql.append(" where ");
sql.append("bdm.pk_material",materials.toArray(new String[0]));
List<Map<String,Object>> remain = (List<Map<String, Object>>) dao.executeQuery(sql.toString(), new MapListProcessor());
if(remain==null || remain.isEmpty()){
throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"");
}
for (Map<String,Object> map:remain){
String fix2=map.get("fix2")==null?"N":map.get("fix2").toString();
String fixasst2=map.get("fixasst2")==null?"N":map.get("fixasst2").toString();
materialConstruct.put(map.get("pk_material").toString(),fix2);
materialStock.put(map.get("pk_material").toString(),fixasst2);
}
}
}

View File

@ -0,0 +1,153 @@
package nc.bs.ic.m45.update;
import nc.bs.ic.general.rule.after.AtpAfterUpdate;
import nc.bs.ic.general.rule.before.CtplcustomeridCheck;
import nc.bs.ic.general.update.IUpdateBP;
import nc.bs.ic.general.update.UpdateBPTemplate;
import nc.bs.ic.m45.base.BPPlugInPoint;
import nc.bs.ic.m45.base.rule.FillCostOrgRule;
import nc.bs.ic.m45.base.rule.PurchaseBillCheckRule;
import nc.bs.ic.m45.base.rule.PurchaseInAssetWarehouseCheck;
import nc.bs.ic.m45.base.rule.PurchaseInVOScaleCheckRule;
import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcess;
import nc.bs.ic.m45.base.rule.PurchaseinRetMarginProcessFor5805;
import nc.bs.ic.m45.base.rule.ReturnSnIsExistInEquipcardCheck;
import nc.bs.ic.m45.base.rule.VmiCheckRule;
import nc.bs.ic.m45.insert.rule.InsertCheckMaterialUnit;
import nc.bs.ic.m45.insert.rule.M45SaveAndRewriteCTPayPlan;
import nc.bs.ic.m45.insert.rule.PurchaseInProjectRule;
import nc.bs.ic.m45.update.rule.FeeDetailUpdate;
import nc.bs.ic.m45.update.rule.IsRedBookThroughUpdate;
import nc.bs.ic.m45.update.rule.UpdReWritePIM;
import nc.bs.ic.m45.update.rule.UpdateNumCheck;
import nc.bs.ic.m45.update.rule.UpdateRedReturnInRewriteRule;
import nc.bs.ic.m45.update.rule.UpdateRewriteITRule;
import nc.bs.ic.m45.update.rule.UpdateRewritePORule;
import nc.bs.ic.m45.update.rule.UpdateRewritePayPlanConfirmDataRule;
import nc.bs.ic.m45.update.rule.UpdateRewritePayPlanConfirmInvoicenumRule;
import nc.bs.ic.pub.base.ICCompareAroundProcesser;
import nc.bs.ic.pub.base.IUpdateRuleProvider;
import nc.bs.ic.pub.util.SagasUtils;
import nc.bs.scmpub.rule.VOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.itf.ic.m45.compensate.IPurchaseInSagasCompensate;
import nc.vo.ic.general.define.SagasConst;
import nc.vo.ic.m45.entity.PurchaseInBodyVO;
import nc.vo.ic.m45.entity.PurchaseInVO;
import nc.vo.ic.pub.util.StringUtil;
import nc.vo.pub.VOStatus;
import nc.vo.scmpub.res.billtype.ICBillType;
import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobAfterPurchaseInUpdate;
import nccloud.bs.ic.mobile.inbound.operation.rewrite.MobBeforePurchaseInUpdate;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 采购入库单后台更新BP
*
* @author songhy
*/
public class UpdateBP implements IUpdateBP<PurchaseInVO>, IUpdateRuleProvider<PurchaseInVO> {
@Override
public void addAfterRule(PurchaseInVO[] vos, PurchaseInVO[] originVOs,
CompareAroundProcesser<PurchaseInVO> processor) {
//红字采购入库修改单保存的时候增加判断逻辑如果表头仓库是直运仓不检查物料的现存量 放在前面设置session
processor.addAfterRule(new IsRedBookThroughUpdate());
/**
* 放在现存量更新规则OnhandAfterUpdate之后因为现存量更新时会调用预留接口预留接口会回写采购订单
* 如果入库数量=订单数量订单会自动入库关闭入库关闭会解除预留导致后续操作错误
*/
((ICCompareAroundProcesser<PurchaseInVO>) processor).addAfterRuleAt(new UpdateRewritePORule(),
AtpAfterUpdate.class);
processor.addAfterRule(new UpdReWritePIM());
processor.addAfterRule(new FeeDetailUpdate());
// processor.addAfterRule(new UpdateRewritePORule());
processor.addAfterRule(new UpdateRewriteITRule());
// 2020年3月19日 补充微协同增加采购入库单修改后消息
processor.addAfterRule(new MobAfterPurchaseInUpdate());
//红字采购入库单原单退回保存回写累计入库退回主数量由于预留处理需要查询蓝字采购入库单回写操作应放在现存量更新规则OnhandAfterUpdate之后
((ICCompareAroundProcesser<PurchaseInVO>) processor).addAfterRuleAt(new UpdateRedReturnInRewriteRule(), AtpAfterUpdate.class);
// 入库单保存回写采购合同付款计划
processor.addAfterRule(new M45SaveAndRewriteCTPayPlan());
// 入库修改保存回写采购订单付款计划 add by yinliangc 20220219
processor.addAfterRule(new UpdateRewritePayPlanConfirmDataRule());
// 入库修改保存回写付款计划开票信息
processor.addAfterRule(new UpdateRewritePayPlanConfirmInvoicenumRule());
}
@Override
public void addBeforeRule(PurchaseInVO[] vos, PurchaseInVO[] originVOs,
CompareAroundProcesser<PurchaseInVO> processor) {
// sagas冻结校验
processor.addBeforeRule(new VOSagaFrozenValidateRule<PurchaseInVO>(true));
processor.addBeforeRule(new FillCostOrgRule());
processor.addBeforeRule(new PurchaseBillCheckRule());
processor.addBeforeRule(new PurchaseInAssetWarehouseCheck());
processor.addBeforeRule(new CtplcustomeridCheck<PurchaseInVO>());
processor.addBeforeRule(new VmiCheckRule());
processor.addBeforeRule(new ReturnSnIsExistInEquipcardCheck());
processor.addBeforeRule(new PurchaseinRetMarginProcess());
processor.addBeforeRule(new PurchaseinRetMarginProcessFor5805());
processor.addBeforeRule(new PurchaseInVOScaleCheckRule());
// 利润中心校验规则
// processor.addBeforeRule(
// new CheckCliabilityValue<PurchaseInVO>(MetaNameConst.CLIABILITYOID, MetaNameConst.CIOLIABILITYOID));
processor.addBeforeRule(new InsertCheckMaterialUnit());
processor.addBeforeRule(new MobBeforePurchaseInUpdate());
//新加校验 出库跟踪入库场景 将采购入库单入库数量改小校验
processor.addBeforeRule(new UpdateNumCheck());
//2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目采购入库单保存时包含接口导入清除行项目材料出库单保存时包含接口导入清除行项目
processor.addBeforeRule(new PurchaseInProjectRule());
}
/**
* 父类方法重写
*
*/
@Override
public PurchaseInVO[] update(PurchaseInVO[] vos, PurchaseInVO[] originVOs) {
SagasUtils.frozenAndAddSaga(vos, ICBillType.PurchaseIn.getCode(), SagasConst.COMPENSABLE, null);
Map<String, Serializable> paramMap = new HashMap<String, Serializable>();
paramMap.put(SagasConst.KEY_ACTIONNAME, SagasConst.UPDATE_45);
paramMap.put(SagasConst.KEY_VOS, SagasUtils.produceLightVO(vos, originVOs));
SagasUtils.compensate(paramMap, IPurchaseInSagasCompensate.class);
this.fillCvendorid(vos);
UpdateBPTemplate<PurchaseInVO> updateBP = new UpdateBPTemplate<PurchaseInVO>(BPPlugInPoint.UpdateBP, this);
PurchaseInVO[] retVOs = updateBP.update(vos, originVOs);
return retVOs;
}
private void fillCvendorid(PurchaseInVO[] vos) {
String cvendor = null;
String cvendorvid = null;
for (PurchaseInVO vo : vos) {
// 取表头供应商
cvendor = vo.getHead().getCvendorid();
//取表头供应商vid
cvendorvid = vo.getHead().getCvendorvid();
// 为表体供应商赋值
for (PurchaseInBodyVO body : vo.getBodys()) {
if (StringUtil.isStringEqual(cvendor, body.getCvendorid())) {
continue;
}
body.setCvendorid(cvendor);
body.setCvendorvid(cvendorvid);
if (VOStatus.UNCHANGED == body.getStatus()) {
// 此处必须判断状态不能全部设为UPDATED否则删行后再新增行保存会报错
body.setStatus(VOStatus.UPDATED);
}
}
}
}
}

View File

@ -0,0 +1,121 @@
package nc.bs.ic.m4d.insert;
import nc.bs.ic.general.insert.IInsertBP;
import nc.bs.ic.general.insert.rule.after.InsertAfterEventRule;
import nc.bs.ic.general.insert.rule.after.RewriteQCInsertRule;
import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue;
import nc.bs.ic.general.insert.rule.before.InsertBeforeEventRule;
import nc.bs.ic.general.rule.after.AfterInsertRuleForRewriteSpecial;
import nc.bs.ic.general.rule.after.AtpAfterUpdate;
import nc.bs.ic.general.rule.before.CtplcustomeridCheck;
import nc.bs.ic.m45.insert.rule.PurchaseInProjectRule;
import nc.bs.ic.m4d.base.BPPlugInPoint;
import nc.bs.ic.m4d.base.MaterialOutCheckRule;
import nc.bs.ic.m4d.base.MaterialOutValueProcRule;
import nc.bs.ic.m4d.base.MaterialOutWarehouseAttriCheck;
import nc.bs.ic.m4d.base.PurchaseInDateCheck;
import nc.bs.ic.m4d.insert.rule.*;
import nc.bs.ic.pub.base.ICAroundProcesser;
import nc.bs.ic.pub.base.IInsertRuleProvider;
import nc.bs.scmpub.rule.CrossRuleValidateRule;
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
import nc.vo.ic.general.define.MetaNameConst;
import nc.vo.ic.m4d.entity.MaterialOutVO;
/**
* <p>
* <b>材料出库单新增BP</b>
* <ul>
* <li>
* </ul>
* <p>
* <p>
*
* @version 6.0
* @since 6.0
* @author chennn
* @time 2010-4-19 上午09:51:08
*/
public class InsertBP implements IInsertBP<MaterialOutVO>,
IInsertRuleProvider<MaterialOutVO> {
@Override
public void addAfterRule(MaterialOutVO[] vos,
AroundProcesser<MaterialOutVO> processor) {
/*
* 放在现存量更新规则之后因为回写销售订单发货单时如果出库数量等于订单数量
* 订单自动行关闭行关闭会执行预留解除导致现存量更新时处理预留业务产生错误
*/
((ICAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new UpdRewriteWorkOrder(), AtpAfterUpdate.class);
processor.addAfterRule(new InsReWriteSapplyBillRule());// 回写出库申请申请
processor.addAfterRule(new InsReWriteBuyingReqRule());// 回写物资需求申请
// 回写项目管理备料表放在回写出库申请之前为了解决以下问题
// 不能计算预占量的问题根本原因是因为出库申请的行关闭状态导致
// 之前出库单先回写出库申请再回写备料备料表回写备料表时项目管理要查询当前出库申请的行状态是否关闭根据该状态计算预占量
// 这样就不能区分此状态是因为出库单保存回写的还是出库单保存前就是关闭的
((ICAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new InsReWritePIM(), InsReWriteSapplyBillRule.class);
// 回写资产的领用单
processor.addAfterRule(new InsRewriteRM());
// 回写紧急放行单
processor.addAfterRule(new RewriteQCInsertRule<MaterialOutVO>());
/*
* 放在现存量更新规则之后因为回写销售订单发货单时如果出库数量等于订单数量
* 订单自动行关闭行关闭会执行预留解除导致现存量更新时处理预留业务产生错误
*/
((ICAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new InsRewriteMMPAC(), AtpAfterUpdate.class);
// 回写生产报告
processor.addAfterRule(new InsRewriteWR());
//回写发货单
processor.addAfterRule(new ReWriteSOInsertRule());
// 工序完工报告倒冲时回写备料计划
processor.addAfterRule(new InsRewriteMMSFC());
// 回写计划独立需求
processor.addAfterRule(new InsertRewriteMMDP());
// 回写特殊单据
processor
.addAfterRule(new AfterInsertRuleForRewriteSpecial<MaterialOutVO>());
((ICAroundProcesser<MaterialOutVO>) processor).replaceAfterRuleAt(
new InsAfterfEventRuleFor4D(), InsertAfterEventRule.class);
}
@Override
public void addBeforeRule(MaterialOutVO[] vos,
AroundProcesser<MaterialOutVO> processor) {
processor.addBeforeRule(new MaterialOutValueProcRule());
processor.addBeforeRule(new MaterialOutCheckRule());
// 利润中心校验规则
processor.addBeforeRule(new CheckCliabilityValue<MaterialOutVO>(MetaNameConst.CIOLIABILITYOID,MetaNameConst.CLIABILITYOID));
//processor.addBeforeRule(new CheckBiliValue<MaterialOutVO>());//领料利润中心有值时出库利润中心不能为空
processor.addBeforeRule(new CtplcustomeridCheck<MaterialOutVO>());//表体货主客户寄存供应商不能同时存在
processor.addBeforeRule(new MaterialOutWarehouseAttriCheck());
// 材料出库参照采购入库业务日期校验
processor.addBeforeRule(new PurchaseInDateCheck());
// 交叉校验规则
processor.addBeforeRule(new CrossRuleValidateRule<MaterialOutVO>());
((ICAroundProcesser<MaterialOutVO>) processor).replaceBeforeRuleAt(
new InsBeforeEventRuleFor4D(), InsertBeforeEventRule.class);
//2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目采购入库单保存时包含接口导入清除行项目材料出库单保存时包含接口导入清除行项目
processor.addBeforeRule(new MaterialOutProjectRule());
}
@Override
public MaterialOutVO[] insert(MaterialOutVO[] bills) {
M4dInsertBPTemplate<MaterialOutVO> insertBP =
new M4dInsertBPTemplate<MaterialOutVO>(BPPlugInPoint.InsertBP, this);
return insertBP.insert(bills);
}
}

View File

@ -0,0 +1,77 @@
package nc.bs.ic.m4d.insert.rule;
import nc.bs.dao.BaseDAO;
import nc.bs.ic.pub.base.ICRule;
import nc.jdbc.framework.processor.MapListProcessor;
import nc.vo.ic.general.define.ICBillBodyVO;
import nc.vo.ic.general.define.ICBillVO;
import nc.vo.ic.m4d.entity.MaterialOutVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Classname MaterialOutProjectRule
* @Description TODO
* @Version 1.0.0
* @Date 2025/6/13 14:59
* @Created by ame
*/
public class MaterialOutProjectRule extends ICRule<MaterialOutVO> {
private static BaseDAO dao=new BaseDAO();
@Override
public void process(MaterialOutVO[] vos) {
if(vos==null || vos.length<1){
return;
}
try {
//获取表头计划组织及表体行物料
for (ICBillVO vo : vos) {
String pk_org = (String) vo.getParentVO().getAttributeValue("pk_org");
ICBillBodyVO[] bodys = vo.getBodys();
Map<String,String> material_construct = new HashMap<>();
Map<String,String> material_stock = new HashMap<>();
queryFix2ByMaterial(bodys,material_construct,material_stock,pk_org);
for(ICBillBodyVO body:bodys){
String cmaterialvid = body.getCmaterialvid();
if(material_construct.containsKey(cmaterialvid)&& "Y".equals(material_construct.get(cmaterialvid))&& (!material_stock.containsKey(cmaterialvid)|| "N".equals(material_stock.get(cmaterialvid)))){
body.setCprojectid(null);
}
}
}
} catch (BusinessException var6) {
ExceptionUtils.wrappException(var6);
}
}
private void queryFix2ByMaterial(ICBillBodyVO[] childrenVOs, Map<String, String> materialConstruct, Map<String, String> materialStock, String pkOrg) throws BusinessException {
List<String> materials=new ArrayList<>();
for (ICBillBodyVO childrenVO : childrenVOs){
String cmaterialvid = childrenVO.getCmaterialvid();
materials.add(cmaterialvid);
}
SqlBuilder sql =new SqlBuilder();
sql.append(" SELECT bdm.pk_material ,bdmf.fix2,bdms.fixasst2 ");
sql.append(" FROM bd_material bdm ");
sql.append(" LEFT JOIN bd_marasstframe bdmf ON bdm.pk_marasstframe =bdmf.pk_marasstframe ");
sql.append(" LEFT JOIN bd_materialstock bdms ON bdms.PK_MATERIAL =bdm.PK_MATERIAL AND bdms.PK_ORG ='"+pkOrg+"' ");
sql.append(" where ");
sql.append("bdm.pk_material",materials.toArray(new String[0]));
List<Map<String,Object>> remain = (List<Map<String, Object>>) dao.executeQuery(sql.toString(), new MapListProcessor());
if(remain==null || remain.isEmpty()){
throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"");
}
for (Map<String,Object> map:remain){
String fix2=map.get("fix2")==null?"N":map.get("fix2").toString();
String fixasst2=map.get("fixasst2")==null?"N":map.get("fixasst2").toString();
materialConstruct.put(map.get("pk_material").toString(),fix2);
materialStock.put(map.get("pk_material").toString(),fixasst2);
}
}
}

View File

@ -0,0 +1,122 @@
package nc.bs.ic.m4d.update;
import nc.bs.ic.general.insert.rule.before.CheckCliabilityValue;
import nc.bs.ic.general.rule.after.AtpAfterUpdate;
import nc.bs.ic.general.rule.before.CtplcustomeridCheck;
import nc.bs.ic.general.update.IUpdateBP;
import nc.bs.ic.general.update.rule.after.RewriteQCUpdateRule;
import nc.bs.ic.m4d.base.BPPlugInPoint;
import nc.bs.ic.m4d.base.MaterialOutCheckRule;
import nc.bs.ic.m4d.base.MaterialOutValueProcRule;
import nc.bs.ic.m4d.base.MaterialOutWarehouseAttriCheck;
import nc.bs.ic.m4d.base.PurchaseInDateCheck;
import nc.bs.ic.m4d.insert.rule.MaterialOutProjectRule;
import nc.bs.ic.m4d.update.rule.ReWriteSOUpdateRule;
import nc.bs.ic.m4d.update.rule.UpdReWritePIM;
import nc.bs.ic.m4d.update.rule.UpdateRewriteMMDP;
import nc.bs.ic.pub.base.ICCompareAroundProcesser;
import nc.bs.ic.pub.base.IUpdateRuleProvider;
import nc.bs.scmpub.rule.CrossRuleValidateRule;
import nc.bs.scmpub.rule.VOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.vo.ic.general.define.MetaNameConst;
import nc.vo.ic.m4d.entity.MaterialOutVO;
/**
* <p>
* <b>材料出库单修改BP</b>
* <ul>
* <li>
* </ul>
* <p>
* <p>
*
* @version 6.0
* @since 6.0
* @author chennn
* @time 2010-4-19 上午09:56:22
*/
public class UpdateBP implements IUpdateBP<MaterialOutVO>,
IUpdateRuleProvider<MaterialOutVO> {
@Override
public void addAfterRule(MaterialOutVO[] vos, MaterialOutVO[] originVOs,
CompareAroundProcesser<MaterialOutVO> processor) {
/*
* 放在现存量更新规则之后因为回写销售订单发货单时如果出库数量等于订单数量
* 订单自动行关闭行关闭会执行预留解除导致现存量更新时处理预留业务产生错误
*/
((ICCompareAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new UpdRewriteWorkOrder(), AtpAfterUpdate.class);
// processor.addAfterRule(new UpdRewriteWorkOrder());
processor.addAfterRule(new UpdReWriteSapplyBillRule());// 回写出库申请单
processor.addAfterRule(new UpdReWriteBuyingReqRule());// 回写物资需求申请
// 回写资产的领用单
processor.addAfterRule(new UpdRewriteRM());
// 回写紧急放行单
processor.addAfterRule(new RewriteQCUpdateRule<MaterialOutVO>());
// 回写批次关联
processor.addAfterRule(new UpdRewriteBacthJoin());
//回写发货单
processor.addAfterRule(new ReWriteSOUpdateRule());
/*
* 放在现存量更新规则之后因为回写销售订单发货单时如果出库数量等于订单数量
* 订单自动行关闭行关闭会执行预留解除导致现存量更新时处理预留业务产生错误
*/
((ICCompareAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new UpdRewriteMMPAC(), AtpAfterUpdate.class);
// 回写备料计划
processor.addAfterRule(new UpdRewriteMMSFC());
// 回写计划独立需求
processor.addAfterRule(new UpdateRewriteMMDP());
// 回写项目管理备料表放在回写出库申请之前为了解决以下问题
// 不能计算预占量的问题根本原因是因为出库申请的行关闭状态导致
// 之前出库单先回写出库申请再回写备料备料表回写备料表时项目管理要查询当前出库申请的行状态是否关闭根据该状态计算预占量
// 这样就不能区分此状态是因为出库单保存回写的还是出库单保存前就是关闭的
((ICCompareAroundProcesser<MaterialOutVO>) processor).addAfterRuleAt(
new UpdReWritePIM(), UpdReWriteSapplyBillRule.class);
// ((ICCompareAroundProcesser<MaterialOutVO>) processor).replaceAfterRuleAt(
// new UpdAfterEventRuleFor4D(), UpdateAfterEventRule.class);
}
@Override
public void addBeforeRule(MaterialOutVO[] vos, MaterialOutVO[] originVOs,
CompareAroundProcesser<MaterialOutVO> processor) {
//saga状态校验材料出库既要校验表头也要校验表体
processor.addBeforeRule(new VOSagaFrozenValidateRule<MaterialOutVO>(true));
processor.addBeforeRule(new CtplcustomeridCheck<MaterialOutVO>());//表体货主客户寄存供应商不能同时存在
processor.addBeforeRule(new MaterialOutValueProcRule());
processor.addBeforeRule(new MaterialOutCheckRule());
// 利润中心校验规则
processor.addBeforeRule(new CheckCliabilityValue<MaterialOutVO>(MetaNameConst.CIOLIABILITYOID,MetaNameConst.CLIABILITYOID));
processor.addBeforeRule(new MaterialOutWarehouseAttriCheck());
// 交叉校验规则
processor.addBeforeRule(new CrossRuleValidateRule<MaterialOutVO>());
// 材料出库参照采购入库业务日期校验
processor.addBeforeRule(new PurchaseInDateCheck());
// ((ICCompareAroundProcesser<MaterialOutVO>) processor).replaceBeforeRuleAt(
// new UpdBeforeEventRuleFor4D(), UpdateBeforeEventRule.class);
//2025年6月13日09点38分 -- 物料档案基本页签启用项目辅助属性+库存组织未启用项目采购入库单保存时包含接口导入清除行项目材料出库单保存时包含接口导入清除行项目
processor.addBeforeRule(new MaterialOutProjectRule());
}
@Override
public MaterialOutVO[] update(MaterialOutVO[] vos, MaterialOutVO[] originVOs) {
M4DUpdateBPTempate<MaterialOutVO> updateBP =
new M4DUpdateBPTempate<MaterialOutVO>(BPPlugInPoint.UpdateBP, this);
return updateBP.update(vos, originVOs);
}
}

View File

@ -248,6 +248,11 @@ public class PInvoice extends SuperVO implements Serializable ,IEncode{
private PInvoiceCepz[] cepzs;
private PInvoiceTspz[] tspzs;
// 数电发票是否显示购销方地址电话
private String einvoiceShowGxfDzDh;
// 数电发票是否显示购销方银行账号
private String einvoiceShowGxfYhZh;
public String getApplyNumber() {
@ -945,6 +950,22 @@ 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;
}
@Override
public String toString() {

View File

@ -7,6 +7,7 @@ import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Log;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.jdbc.framework.SQLParameter;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.vo.bc.pmpub.project.ProjectHeadVO;
import nc.vo.bd.bom.bom0202.entity.BomVO;
@ -21,6 +22,7 @@ import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.scmpub.util.ArrayUtil;
import nc.vo.so.m30.entity.SaleOrderBVO;
import nc.vo.vorg.DeptVersionVO;
import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys;
@ -202,6 +204,12 @@ public class AfterApproveRuleSyncMes implements IRule<PMOAggVO> {
String vbillcode = head.getVbillcode(); // 单据号
String itemRow = item.getVrowno(); // 行号 obmlog.info("开始为生产订单 " + vbillcode + "" + itemRow + " 构建同步MES数据。");
// 检查是否需要同步到MES系统
if (!shouldSyncToMes(item)) {
obmlog.info("生产订单 " + vbillcode + "" + itemRow + " 不满足同步条件跳过同步到MES系统。");
return;
}
// orderNo String 生产订单号+行号 vbillcode+itemRow
String orderNoWithRow = vbillcode + itemRow;
if (orderNoWithRow.length() > 18) {
@ -425,4 +433,80 @@ public class AfterApproveRuleSyncMes implements IRule<PMOAggVO> {
return field;
}
/**
* 判断是否需要同步到MES系统
* 业务逻辑
* 1. 通过源头单据类型判断是否为销售订单源头单据类型为30
* 2. 如果是销售订单需要联查销售订单子实体
* 3. 判断销售订单是否有定制标识(vbdef18)
* 4. 如果有定制标识需要检查工艺配置完成时间(vbdef17)是否有值
* - 有值传递给MES
* - 无值不传递给MES
* 5. 如果无定制标识传递给MES
*
* @param item 生产订单明细
* @return true-需要同步false-不需要同步
* @throws BusinessException
*/
private boolean shouldSyncToMes(PMOItemVO item) throws BusinessException {
// 检查源头单据类型是否为销售订单30
if (!"30".equals(item.getVfirsttype())) {
// 非销售订单来源直接同步
obmlog.debug("生产订单明细行来源不是销售订单(源头单据类型:" + item.getVfirsttype() + "),允许同步。");
return true;
}
// 是销售订单来源需要进一步检查
String vfirstbid = item.getVfirstbid(); // 源头单据子表ID
if (StringUtils.isEmpty(vfirstbid)) {
obmlog.warn("生产订单明细行来源为销售订单但源头单据子表ID为空默认允许同步。");
return true;
}
try {
// 查询销售订单子实体的定制标识和工艺配置完成时间
SqlBuilder sqlBuilder = new SqlBuilder();
sqlBuilder.append(" SELECT vbdef18, vbdef17 ");
sqlBuilder.append(" FROM so_saleorder_b "); sqlBuilder.append(" WHERE csaleorderbid = ? ");
sqlBuilder.append(" AND dr = 0 ");
SQLParameter sqlParam = new SQLParameter();
sqlParam.addParam(vfirstbid);
SaleOrderBVO saleOrderBVO = (SaleOrderBVO) dao.retrieveByPK(SaleOrderBVO.class, vfirstbid);
if (Objects.isNull(saleOrderBVO)) {
obmlog.warn("未查询到销售订单子实体信息ID" + vfirstbid + "),默认允许同步。");
return true;
}
String vbdef18 = saleOrderBVO.getVbdef18();
String vbdef17 = saleOrderBVO.getVbdef17();
obmlog.debug("销售订单定制标识:" + vbdef18 + ",工艺配置完成时间:" + vbdef17);
// 如果无定制标识允许同步
if (StringUtils.isEmpty(vbdef18)) {
obmlog.debug("销售订单无定制标识,允许同步。");
return true;
}
if ("N".equals(vbdef18)) {
obmlog.debug("销售订单定制标识为N允许同步。");
return true;
}
// 有定制标识检查工艺配置完成时间
if (StringUtils.isEmpty(vbdef17)) {
obmlog.info("销售订单有定制标识但工艺配置完成时间为空,不允许同步。");
return false;
} else {
obmlog.debug("销售订单有定制标识且工艺配置完成时间有值,允许同步。");
return true;
}
} catch (Exception e) {
obmlog.error("查询销售订单信息失败:" + e.getMessage(), e);
// 查询失败时为了避免影响正常业务默认允许同步
throw new BusinessException("查询销售订单信息失败:" + e.getMessage());
}
}
}

View File

View File

View File

@ -0,0 +1,75 @@
package nc.bs.mmpsc.pscrecive.bp;
import nc.bs.mmpsc.pscrecive.plugin.bpplugin.PscrecivePluginPoint;
import nc.bs.mmpsc.pscrecive.rule.*;
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.util.mmf.framework.gc.GCUpdateBPTemplate;
import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO;
/**
* 单据审核的BP
*
* @since 6.0
* @version 2014-01-27 15:02:41
* @author computer
*/
public class PscreciveApproveBP {
/**
* 单据的持久化
*
* @param clientBills 单据VO
* @param originBills 原始单据VO
* @return 保存后的单据VO
*/
public AggPscreciveVO[] approve(AggPscreciveVO[] clientBills, AggPscreciveVO[] originBills) {
// 调用修改模板
GCUpdateBPTemplate<AggPscreciveVO> bp = new GCUpdateBPTemplate<AggPscreciveVO>(PscrecivePluginPoint.APPROVE);
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
this.addAfterRule(bp.getAroundProcesser(), originBills);
return bp.update(clientBills, originBills);
}
/**
* @param processer
* @param originBills
*/
private void addAfterRule(CompareAroundProcesser<AggPscreciveVO> processer, AggPscreciveVO[] originBills) {
// 自动业务关闭工序委外订单
IRule<AggPscreciveVO> closerule = new CloseOrderRule();
processer.addAfterRule(closerule);
//添加审批推送加工费结算单逻辑
IRule<AggPscreciveVO> pushrule = new Push55E6Rule();
processer.addAfterFinalRule(pushrule);
}
/**
* @param processer
*/
private void addBeforeRule(CompareAroundProcesser<AggPscreciveVO> processer) {
// 校验冻结状态 added by zhanghr
IRule<AggPscreciveVO> checkFrozenRule = new MMVOSagaFrozenValidateRule<AggPscreciveVO>(true);
processer.addBeforeRule(checkFrozenRule);
// 检查状态
IRule<AggPscreciveVO> irule = new ApproveBillStatusRule();
processer.addBeforeRule(irule);
// 工序委外订单状态检查规则
IRule<AggPscreciveVO> orderCheckRule = new CheckPscOrderStatusRule();
processer.addBeforeRule(orderCheckRule);
// 补充核销状态
IRule<AggPscreciveVO> vrule = new ApproveVerifyStatusRule();
processer.addBeforeRule(vrule);
// 修改审核信息
IRule<AggPscreciveVO> frule = new FillApprovePsnRule();
processer.addBeforeRule(frule);
// 更新审核状态
IRule<AggPscreciveVO> updaterule = new ApproveStatusUpdateRule();
processer.addBeforeRule(updaterule);
}
}

View File

@ -0,0 +1,144 @@
package nc.bs.mmpsc.pscrecive.bp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nc.bs.mmpsc.pscrecive.plugin.bpplugin.PscrecivePluginPoint;
import nc.bs.mmpsc.pscrecive.rule.*;
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMVOUtil;
import nc.util.mmf.framework.gc.GCUpdateBPTemplate;
import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO;
import nc.vo.mmpsc.pscrecive.entity.PscReciveTransTypeVO;
import nc.vo.mmpsc.pscrecive.util.QueryUtil;
import nc.vo.mmpsc.pscrecive.util.VOChangUtil;
/**
* 收货单自动审核的BP
*
* @since 6.0
* @version 2014-01-27 15:02:41
* @author computer
*/
public class PscreciveAutoApproveBP {
/**
* 单据的持久化
*
* @param clientBills 单据VO
* @param originBills 原始单据VO
* @return 保存后的单据VO
*/
public AggPscreciveVO[] approve(AggPscreciveVO[] clientBills) {
AggPscreciveVO[] approveVOs = this.filterAutoApprove(clientBills);
if (MMArrayUtil.isEmpty(approveVOs)) {
return clientBills;
}
AggPscreciveVO[] originBills = VOChangUtil.clone(approveVOs);
// 调用修改模板
GCUpdateBPTemplate<AggPscreciveVO> bp = new GCUpdateBPTemplate<AggPscreciveVO>(PscrecivePluginPoint.APPROVE);
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
this.addAfterRule(bp.getAroundProcesser(), originBills);
AggPscreciveVO[] returnBills = bp.update(clientBills, originBills);
return new QueryUtil().queryAfterUpdate(returnBills);
}
/**
* @param processer
* @param originBills
*/
private void addAfterRule(CompareAroundProcesser<AggPscreciveVO> processer, AggPscreciveVO[] originBills) {
//暂时没有规则
//添加审批推送加工费结算单逻辑
IRule<AggPscreciveVO> pushrule = new Push55E6Rule();
processer.addAfterFinalRule(pushrule);
}
/**
* @param processer
*/
private void addBeforeRule(CompareAroundProcesser<AggPscreciveVO> processer) {
// 校验冻结状态 added by zhanghr
IRule<AggPscreciveVO> checkFrozenRule = new MMVOSagaFrozenValidateRule<AggPscreciveVO>(true);
processer.addBeforeRule(checkFrozenRule);
// 检查状态
IRule<AggPscreciveVO> irule = new ApproveBillStatusRule();
processer.addBeforeRule(irule);
// 补充核销状态
IRule<AggPscreciveVO> vrule = new ApproveVerifyStatusRule();
processer.addBeforeRule(vrule);
// 修改审核信息
IRule<AggPscreciveVO> frule = new FillApprovePsnRule();
processer.addBeforeRule(frule);
// 更新审核状态
IRule<AggPscreciveVO> updaterule = new ApproveStatusUpdateRule();
processer.addBeforeRule(updaterule);
// 自动业务关闭工序委外订单
IRule<AggPscreciveVO> closerule = new CloseOrderRule();
processer.addBeforeRule(closerule);
}
/**
* 过滤出需要自动审核
*
* @param nowBills
* @return
*/
private AggPscreciveVO[] filterAutoApprove(AggPscreciveVO[] nowBills) {
if (nowBills == null || nowBills.length == 0) {
return null;
}
List<String> typeid = new ArrayList<String>();
for (AggPscreciveVO bill : nowBills) {
typeid.add(bill.getHeadVO().getCtrantype());
}
// 查询哪些交易类型需要自动审核
Map<String, Boolean> autoMap = this.isAutoApprove(typeid.toArray(new String[0]));
// 过滤
List<AggPscreciveVO> reList = new ArrayList<AggPscreciveVO>();
for (AggPscreciveVO bill : nowBills) {
Boolean is = autoMap.get(bill.getHeadVO().getCtrantype());
if (is != null && is.booleanValue()) {
reList.add(bill);
}
}
if (reList.size() > 0) {
return reList.toArray(new AggPscreciveVO[0]);
}
return null;
}
/**
* 是否自动审核
*
* @param ids
* @return
*/
private Map<String, Boolean> isAutoApprove(String[] ids) {
// 查询
PscReciveTransTypeVO[] types = MMVOUtil.query(PscReciveTransTypeVO.class, PscReciveTransTypeVO.CTRANTYPEID, ids);
Map<String, Boolean> map = new HashMap<String, Boolean>();
if (MMArrayUtil.isEmpty(types)) {
return map;
}
// 构造结果
for (PscReciveTransTypeVO type : types) {
if (type.getBautoapprove() != null && type.getBautoapprove().booleanValue()) {
map.put(type.getCtrantypeid(), Boolean.TRUE);
}
else {
map.put(type.getCtrantypeid(), Boolean.FALSE);
}
}
return map;
}
}

View File

@ -0,0 +1,126 @@
package nc.bs.mmpsc.pscrecive.rule;
import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.mmpsc.pscsettle.ISettleMaintain;
import nc.itf.uap.pf.IPfExchangeService;
import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMNumberUtil;
import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO;
import nc.vo.mmpsc.pscrecive.entity.PscreciveItemVO;
import nc.vo.mmpsc.pscrecive.entity.PscreciveQcVO;
import nc.vo.mmpsc.pscrecive.enumeration.PscReciveProcessMethodEnum;
import nc.vo.mmpsc.pscrecive.enumeration.PscReciveStatusEnum;
import nc.vo.mmpsc.pscsettle.entity.AggSettleVO;
import nc.vo.mmpsc.pscsettle.entity.SettleHeadVO;
import nc.vo.mmpsc.pscsettle.entity.SettleItemVO;
import nc.vo.pub.compiler.PfParameterVO;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Classname Push55E6Rule
* @Description TODO
* @Version 1.0.0
* @Date 2025/6/16 14:40
* @Created by ame
*/
public class Push55E6Rule implements IRule<AggPscreciveVO> {
@Override
public void process(AggPscreciveVO[] aggvos) {
if(aggvos==null || aggvos.length<1){
return;
}
ISettleMaintain service = NCLocator.getInstance().lookup(ISettleMaintain.class);
try {
AggPscreciveVO[] newAggvos = this.fiterData(aggvos);
if(newAggvos!=null && newAggvos.length>0){
IPfExchangeService ef = NCLocator.getInstance().lookup(IPfExchangeService.class);
AggSettleVO[] aggSettleVOs = (AggSettleVO[])ef.runChangeDataAryNeedClassify("55E5", "55E6", newAggvos, (PfParameterVO)null, 1);
if (aggSettleVOs != null && aggSettleVOs.length > 0) {
this.fillData(aggSettleVOs);
service.insertSettle(aggSettleVOs);
}
}
} catch (Exception e) {
ExceptionUtils.wrappBusinessException(e.getMessage());
}
}
private void fillData(AggSettleVO[] aggSettleVOs) {
for (AggSettleVO aggSettleVO : aggSettleVOs) {
SettleHeadVO headVO = aggSettleVO.getHeadVO();
SettleItemVO[] itemVO = aggSettleVO.getItemVO();
headVO.setStatus(2);
headVO.setFstatusflag(1);
//itemVOµÄvrowno¸ù¾ÝÐòºÅÉèÖÃÖµ£ºi*10
for (int i = 0; i < itemVO.length; i++) {
itemVO[i].setStatus(2);
itemVO[i].setVrowno(String.valueOf((i+1) * 10));
}
}
}
private AggPscreciveVO[] fiterData(AggPscreciveVO[] aggPscreciveVOs) {
AggPscreciveVO[] statusvos = this.fiterDataStatus(aggPscreciveVOs);
AggPscreciveVO[] qcvos = this.fiterDataQc(statusvos);
return qcvos;
}
private AggPscreciveVO[] fiterDataStatus(AggPscreciveVO[] vos) {
List<AggPscreciveVO> aggPscreciveVOs = new ArrayList<AggPscreciveVO>();
for (AggPscreciveVO aggPscreciveVO : vos) {
if (PscReciveStatusEnum.APPROVED.equalsValue(aggPscreciveVO.getHeadVO().getFstatusflag())) {
aggPscreciveVOs.add(aggPscreciveVO);
}
}
return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]);
}
private AggPscreciveVO[] fiterDataQc(AggPscreciveVO[] vos) {
if (MMArrayUtil.isEmpty(vos)) {
return null;
}
List<AggPscreciveVO> aggPscreciveVOs = new ArrayList<AggPscreciveVO>();
for (AggPscreciveVO aggPscreciveVO : vos) {
List<PscreciveItemVO> pscreciveItemVOs = new ArrayList<PscreciveItemVO>();
for (PscreciveItemVO pscreciveItemVO : aggPscreciveVO.getItemVO()) {
PscreciveQcVO[] pscreciveQcVOs = pscreciveItemVO.getCpscrecive_qcid();
if (MMArrayUtil.isNotEmpty(pscreciveQcVOs)) {
UFDouble sumNum = UFDouble.ZERO_DBL;
UFDouble sumAstNum = UFDouble.ZERO_DBL;
for (PscreciveQcVO pscreciveQcVO : pscreciveQcVOs) {
if (PscReciveProcessMethodEnum.PRODIN.equalsValue(pscreciveQcVO.getFqprocessmethod())
|| PscReciveProcessMethodEnum.MATERREJECT
.equalsValue(pscreciveQcVO.getFqprocessmethod())
|| PscReciveProcessMethodEnum.REWORK.equalsValue(pscreciveQcVO.getFqprocessmethod())) {
sumNum = MMNumberUtil.add(sumNum, pscreciveQcVO.getNqnum());
sumAstNum = MMNumberUtil.add(sumAstNum, pscreciveQcVO.getNqastnum());
}
}
if (MMNumberUtil.isGtZero(sumNum) && MMNumberUtil.isGtZero(sumAstNum)) {
pscreciveItemVO.setProcessastnum(sumAstNum);
pscreciveItemVO.setProcessnum(sumNum);
pscreciveItemVOs.add(pscreciveItemVO);
}
} else if (aggPscreciveVO.getHeadVO().getBreturn() != null
&& aggPscreciveVO.getHeadVO().getBreturn().booleanValue()) {
pscreciveItemVO.setProcessastnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbastrecivenum()));
pscreciveItemVO.setProcessnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbrecivenum()));
pscreciveItemVOs.add(pscreciveItemVO);
}
}
if (pscreciveItemVOs.size() > 0) {
aggPscreciveVO.setChildrenVO(pscreciveItemVOs.toArray(new PscreciveItemVO[0]));
aggPscreciveVOs.add(aggPscreciveVO);
}
}
return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]);
}
}

View File

0
mmpsc/src/test/.gitkeep Normal file
View File

View File

@ -719,10 +719,14 @@ public class APISaleOrderMaitainImpl implements IAPISaleOrderMaitain {
targetBVO.setVbdef18(sourceBVO.getVbdef18()); // 是否定制
targetBVO.setVbdef19(sourceBVO.getVbdef19()); // 计划开工日期
targetBVO.setVbdef20(sourceBVO.getVbdef20()); // 计划完工日期
targetBVO.setVbdef14(sourceBVO.getVbdef14()); // 合同销售订单变更明细id
targetBVO.setCrowno(sourceBVO.getCrowno()); // 行号
if (StringUtils.isNotEmpty(sourceBVO.getVbdef19())) {
targetBVO.setVbdef19(sourceBVO.getVbdef19()); // 计划开工日期
}
if (StringUtils.isNotEmpty(sourceBVO.getVbdef20())) {
targetBVO.setVbdef20(sourceBVO.getVbdef20()); // 计划完工日期
}
}

View File

@ -1,231 +0,0 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nccloud.web.uapbd.customer.baseinfo.action;
import com.alibaba.fastjson.JSONObject;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.uif2.LockFailedException;
import nc.bs.uif2.VersionConflictException;
import nc.itf.bd.cust.assign.ICustAssignService;
import nc.itf.bd.cust.baseinfo.ICustBaseInfoQueryService;
import nc.itf.bd.cust.baseinfo.ICustBaseInfoService;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.MapProcessor;
import nc.uap.utils.ResHelper;
import nc.vo.bd.cust.*;
import nc.vo.bd.supplier.SupplierVO;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVO;
import nc.vo.pub.lang.UFDateTime;
import nccloud.commons.lang.StringUtils;
import nccloud.framework.core.exception.ExceptionUtils;
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.processor.template.ExtBillCardConvertProcessor;
import nccloud.framework.web.ui.model.row.Row;
import nccloud.framework.web.ui.pattern.billcard.ExtSpecilAggBill;
import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCard;
import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCardOperator;
import nccloud.framework.web.ui.pattern.grid.Grid;
import nccloud.web.uapbd.customer.baseinfo.utils.CustSupExceptionHandle;
import nccloud.web.uapbd.customer.baseinfo.utils.CustomerExtendAggBill;
import nccloud.web.uapbd.customer.baseinfo.utils.CustomerResultMessage;
import nccloud.web.uapbd.customer.baseinfo.utils.CustomerService;
import nccloud.web.uapbd.supplier.supplier.action.SupplierCommonUtil;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.*;
public class CustomerSaveAction implements ICommonAction {
public CustomerSaveAction() {
}
public Object doAction(IRequest request) {
CustomerExtendAggBill fromJson = (CustomerExtendAggBill) JsonFactory.create().fromJson(request.read(), CustomerExtendAggBill.class);
ExtBillCard extspecilAggBill = fromJson.getExtspecilAggBill();
String step = fromJson.getStep();
boolean checkflag = fromJson.isCheckflag();
boolean createVersion = fromJson.isCreateversion();
String pagecode = fromJson.getPagecode();
List<String> exceptAreas = new ArrayList();
exceptAreas.add("custAddress");
exceptAreas.add("custBankaccbas");
exceptAreas.add("10140LM");
exceptAreas.add("customerassign_list");
exceptAreas.add("cust_sale_simple");
exceptAreas.add("cust_creditctl_simple");
exceptAreas.add("cust_finance_simple");
exceptAreas.add("customer_list_checkbyorg");
exceptAreas.add("versionList");
ExtBillCardConvertProcessor ebcp = new ExtBillCardConvertProcessor(exceptAreas);
ExtBillCardOperator ec = new ExtBillCardOperator(pagecode);
new CustomerResultMessage();
ExtBillCard ebc = null;
ExtSpecilAggBill bill = (ExtSpecilAggBill) ebcp.fromExtBillCard(extspecilAggBill);
CustomerVO customerVO = (CustomerVO) bill.getHead();
CustlinkmanVO[] custlikCustlinkmanVOs = (CustlinkmanVO[]) bill.getBodys(CustlinkmanVO.class);
CustCountrytaxesVO[] custCountrytaxesVOs = (CustCountrytaxesVO[]) bill.getBodys(CustCountrytaxesVO.class);
customerVO.setCustcontacts(custlikCustlinkmanVOs);
customerVO.setCusttaxtypes(custCountrytaxesVOs);
if ("2".equals(customerVO.getCalibrationstate()) && customerVO.getLatestcaltime() == null) {
customerVO.setLatestcaltime(new UFDateTime());
}
if (!SupplierCommonUtil.checkRegisterfund(customerVO.getRegisterfund())) {
ExceptionUtils.wrapBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("nccriauapbd0", "0nccriauapbd00466"));
}
CustomerService cs = new CustomerService();
try {
if (StringUtils.isNotBlank(step) && "one".equals(step)) {
if (createVersion) {
customerVO = ((ICustBaseInfoService) ServiceLocator.find(ICustBaseInfoService.class)).createCustomerVersion(customerVO);
} else if (StringUtils.isNotBlank(customerVO.getPk_customer())) {
CustomerVO[] temp = ((ICustBaseInfoQueryService) ServiceLocator.find(ICustBaseInfoQueryService.class)).queryDataByPkSet(new String[]{customerVO.getPk_customer()});
if (temp == null || temp.length == 0) {
ExceptionUtils.wrapException(new BusinessException("没有找到对应的客户信息"));
}
customerVO = cs.updateCustomer(customerVO, checkflag);
} else {
if (customerVO.getCustcontacts() != null && customerVO.getCustcontacts().length > 0) {
for (CustlinkmanVO custlinkmanvo : customerVO.getCustcontacts()) {
custlinkmanvo.setPk_customer((String) null);
}
}
if (customerVO.getCusttaxtypes() != null && customerVO.getCusttaxtypes().length > 0) {
for (CustCountrytaxesVO custCountrytaxesVO : customerVO.getCusttaxtypes()) {
custCountrytaxesVO.setPk_customer((String) null);
}
}
if (fromJson.getCopy_pk_customer() != null) {
customerVO = cs.insertCustomerVO(customerVO, checkflag);
((ICustAssignService) ServiceLocator.find(ICustAssignService.class)).copyCustomerAssignData(customerVO, fromJson.getCopy_pk_customer());
} else {
customerVO = cs.insertCustomerVO(customerVO, checkflag);
}
}
}
if (StringUtils.isNotBlank(step) && "two_yes".equals(step)) {
SupplierVO supplierVO = fromJson.getSupplierVO();
if (StringUtils.isNotBlank(customerVO.getPk_customer())) {
customerVO = cs.updateCustomerAndRelaToSup(customerVO, supplierVO);
} else {
Map<String, SuperVO> resultMap = cs.insertCustAndRelaToSup(customerVO, supplierVO);
customerVO = (CustomerVO) resultMap.get("customer");
}
}
if (StringUtils.isNotBlank(step) && "two_no".equals(step)) {
if (StringUtils.isNotBlank(customerVO.getPk_customer())) {
customerVO = cs.updateCustomer(customerVO, checkflag);
} else {
customerVO = cs.insertCustomerVO(customerVO, checkflag);
}
}
bill.putvo(CustlinkmanVO.class, customerVO.getCustcontacts());
customerVO.setCustcontacts((CustlinkmanVO[]) null);
bill.putvo(CustbankVO.class, customerVO.getCustbanks());
customerVO.setCustbanks((CustbankVO[]) null);
bill.putvo(CustCountrytaxesVO.class, customerVO.getCusttaxtypes());
customerVO.setCusttaxtypes((CustCountrytaxesVO[]) null);
bill.setHead(customerVO);
ec.setTransFlag(true);
ebc = ec.toCard(bill, exceptAreas);
Grid grid = ebc.getBody("custtaxtypes");
if (grid != null) {
List<Row> listRows = grid.getModel().getListRows();
Map<String, String> executeQuery = null;
if (listRows != null && listRows.size() > 0) {
for (Row row : listRows) {
if (row.getCell("pk_taxes").getValue() != null) {
String value = row.getCell("pk_taxes").getValue().toString();
executeQuery = (Map) ((IUAPQueryBS) ServiceLocator.find(IUAPQueryBS.class)).executeQuery("select custtaxesname from bd_custaxes where pk_custaxes = '" + value + "'", new MapProcessor());
row.getCell("pk_taxes").setDisplay(executeQuery != null ? (String) executeQuery.get("custtaxesname") : "");
}
}
}
}
// 自动分配组织
/*String[] customerPks = {customerVO.getPk_customer()};
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new);
ErrLogReturnValue errLogReturnValue = cs.getAssignService().assignCustomerByPks(customerPks, assignOrgPks, null);
Logger.error("CustomerSaveAction-errLogReturnValue = " + errLogReturnValue.getErrLogResult());*/
assignOrgApi(customerVO);
} catch (Exception e) {
if (e instanceof UndeclaredThrowableException) {
Throwable undeclaredThrowable = ((UndeclaredThrowableException) e).getUndeclaredThrowable();
InvocationTargetException ie = (InvocationTargetException) undeclaredThrowable;
Throwable targetException = ie.getTargetException();
if (targetException instanceof CustSupBusiException) {
CustSupBusiException cuBusiException = (CustSupBusiException) targetException;
CustomerResultMessage crm = CustSupExceptionHandle.handleCustSupException(cuBusiException);
return crm;
}
if (targetException instanceof VersionConflictException) {
VersionConflictException versionConflictException = (VersionConflictException) targetException;
Object busiObject = versionConflictException.getBusiObject();
ExceptionUtils.wrapBusinessException(ResHelper.getString("nccriauapbd0", "0nccriauapbd00030"));
} else if (targetException instanceof LockFailedException) {
ExceptionUtils.wrapBusinessException(ResHelper.getString("nccriauapbd0", "0nccriauapbd00030"));
} else {
ExceptionUtils.wrapException(targetException);
}
} else {
ExceptionUtils.wrapException(e);
}
}
return ebc;
}
public void assignOrgApi(CustomerVO customerVO) throws BusinessException {
String[] customerPks = {customerVO.getCode()};
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getCode).toArray(String[]::new);
JSONObject param = new JSONObject();
JSONObject ufinterfaceJson = new JSONObject();
JSONObject dataJson = new JSONObject();
dataJson.put("customer", customerPks);
dataJson.put("org", assignOrgPks);
ufinterfaceJson.put("sender", "default");
ufinterfaceJson.put("data", dataJson);
param.put("ufinterface", ufinterfaceJson);
BaseOpenApiReq req = new BaseOpenApiReq();
req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assign", param);
}
/**
* 查询组织信息
*
* @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

@ -1,158 +0,0 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nccloud.web.uapbd.customer.baseinfo.action;
import com.alibaba.fastjson.JSONObject;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.logging.Logger;
import nc.itf.bd.cust.baseinfo.ICustBaseInfoService;
import nc.pub.billcode.itf.IBillcodeManage;
import nc.pub.billcode.vo.BillCodeContext;
import nc.vo.bd.cust.CustCountrytaxesVO;
import nc.vo.bd.cust.CustlinkmanVO;
import nc.vo.bd.cust.CustomerVO;
import nc.vo.bd.errorlog.ErrLogReturnValue;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDateTime;
import nccloud.framework.core.exception.ExceptionUtils;
import nccloud.framework.web.action.itf.ICommonAction;
import nccloud.framework.web.container.IRequest;
import nccloud.framework.web.container.SessionContext;
import nccloud.framework.web.ui.pattern.billcard.ExtSpecilAggBill;
import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCard;
import nccloud.framework.web.ui.pattern.extbillcard.ExtBillCardOperator;
import nccloud.web.uapbd.customer.baseinfo.utils.CustomerService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CustomerSaveAddAction implements ICommonAction {
public CustomerSaveAddAction() {
}
public Object doAction(IRequest request) {
ExtBillCardOperator ec = new ExtBillCardOperator();
List<String> exceptAreas = new ArrayList();
exceptAreas.add("custAddress");
exceptAreas.add("custBankaccbas");
exceptAreas.add("10140LM");
exceptAreas.add("customerassign_list");
exceptAreas.add("cust_sale_simple");
exceptAreas.add("cust_creditctl_simple");
exceptAreas.add("cust_finance_simple");
exceptAreas.add("customer_list_checkbyorg");
ExtSpecilAggBill bill = (ExtSpecilAggBill) ec.toBill(request);
ExtBillCard ebc = null;
CustomerVO customerVO = (CustomerVO) bill.getHead();
CustlinkmanVO[] custlikCustlinkmanVOs = (CustlinkmanVO[]) bill.getBodys(CustlinkmanVO.class);
CustCountrytaxesVO[] custCountrytaxesVOs = (CustCountrytaxesVO[]) bill.getBodys(CustCountrytaxesVO.class);
if (custlikCustlinkmanVOs != null && custlikCustlinkmanVOs.length > 0) {
for (CustlinkmanVO custlinkmanvo : custlikCustlinkmanVOs) {
custlinkmanvo.setPk_customer((String) null);
}
}
if (custCountrytaxesVOs != null && custCountrytaxesVOs.length > 0) {
for (CustCountrytaxesVO custCountrytaxesVO : custCountrytaxesVOs) {
custCountrytaxesVO.setPk_customer((String) null);
}
}
customerVO.setCustcontacts(custlikCustlinkmanVOs);
customerVO.setCusttaxtypes(custCountrytaxesVOs);
if ("2".equals(customerVO.getCalibrationstate()) && customerVO.getLatestcaltime() == null) {
customerVO.setLatestcaltime(new UFDateTime());
}
CustomerService cs = new CustomerService();
ICustBaseInfoService getiCustBaseInfoService = cs.getiCustBaseInfoService();
IBillcodeManage billcodeManage = cs.getBillcodeManage();
String pk_group = SessionContext.getInstance().getClientInfo().getPk_group();
String billcode = "";
try {
customerVO.setIssupplier(UFBoolean.FALSE);
customerVO.setCuststate(1);
customerVO.setFrozenflag(UFBoolean.FALSE);
customerVO.setIsfreecust(UFBoolean.FALSE);
customerVO.setPk_group(pk_group);
customerVO.setPk_org(pk_group);
customerVO = getiCustBaseInfoService.insertCustomerVO(customerVO, false);
CustomerVO saveAddRe = new CustomerVO();
BillCodeContext billCodeContext = billcodeManage.getBillCodeContext("customer", pk_group, pk_group);
if (billCodeContext != null && billCodeContext.isPrecode()) {
billcode = billcodeManage.getPreBillCode_RequiresNew("customer", pk_group, pk_group);
}
saveAddRe.setCode(billcode);
saveAddRe.setIssupplier(UFBoolean.FALSE);
saveAddRe.setCuststate(1);
saveAddRe.setFrozenflag(UFBoolean.FALSE);
saveAddRe.setPk_country("0001Z010000000079UJJ");
saveAddRe.setPk_format("FMT0Z000000000000000");
saveAddRe.setPk_timezone("0001Z010000000079U2P");
saveAddRe.setIsfreecust(UFBoolean.FALSE);
saveAddRe.setPk_org(customerVO.getPk_org());
saveAddRe.setPk_group(customerVO.getPk_group());
bill.putvo(CustlinkmanVO.class, new CustlinkmanVO[0]);
bill.putvo(CustCountrytaxesVO.class, new CustCountrytaxesVO[0]);
bill.setHead(saveAddRe);
ebc = ec.toCard(bill, exceptAreas);
ec.setTransFlag(true);
ebc.setUserjson(billCodeContext == null ? "" : "" + billCodeContext.isEditable());
// 自动分配组织
/*String[] customerPks = {customerVO.getPk_customer()};
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new);
ErrLogReturnValue errLogReturnValue = cs.getAssignService().assignCustomerByPks(customerPks, assignOrgPks, null);
Logger.error("CustomerSaveAddAction-errLogReturnValue = " + errLogReturnValue.getErrLogResult());*/
assignOrgApi(customerVO);
} catch (BusinessException e) {
ExceptionUtils.wrapException(e);
}
return ebc;
}
public void assignOrgApi(CustomerVO customerVO) throws BusinessException {
String[] customerPks = {customerVO.getCode()};
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getCode).toArray(String[]::new);
JSONObject param = new JSONObject();
JSONObject ufinterfaceJson = new JSONObject();
JSONObject dataJson = new JSONObject();
dataJson.put("customer", customerPks);
dataJson.put("org", assignOrgPks);
ufinterfaceJson.put("sender", "default");
ufinterfaceJson.put("data", dataJson);
param.put("ufinterface", ufinterfaceJson);
BaseOpenApiReq req = new BaseOpenApiReq();
req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assign", param);
}
/**
* 查询组织信息
*
* @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,273 @@
package nc.bs.bd.bom.bom0202.bp;
import nc.bs.bd.bom.bom0202.plugin.bpplugin.BomPluginPoint;
import nc.bs.bd.bom.bom0202.rule.*;
import nc.bs.mmbd.pub.rule.MMAutoMaterialAssignRule;
import nc.bs.pubapp.pub.rule.FieldLengthCheckRule;
import nc.bs.pubapp.pub.rule.FillInsertDataRule;
import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule;
import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.impl.pubapp.pattern.rule.processer.AroundProcesser;
import nc.itf.org.IOrgConstBasic;
import nc.util.mmf.busi.rule.MMRowNoCheckRule;
import nc.util.mmf.framework.gc.GCInsertBPTemplate;
import nc.vo.bd.bom.bom0202.entity.AggBomVO;
import nc.vo.bd.bom.bom0202.entity.BomActivityVO;
import nc.vo.bd.bom.bom0202.entity.BomItemVO;
import nc.vo.bd.bom.bom0202.entity.BomOutputsVO;
import nc.vo.bd.bom.bom0202.entity.BomPosVO;
import nc.vo.bd.bom.bom0202.entity.BomReplVO;
import nc.vo.bd.bom.bom0202.entity.BomVO;
import nc.vo.bd.bom.bom0202.entity.BomWipVO;
public class BomInsertBP {
/**
* 是否校验工程变更单是否启用
*/
private boolean checkEcn = true;
/**
* 是否支持审批流
*/
private boolean isOnApprove;
public boolean isOnApprove() {
return this.isOnApprove;
}
public void setOnApprove(boolean isOnApprove) {
this.isOnApprove = isOnApprove;
}
public AggBomVO[] insert(AggBomVO[] aggVO) {
return this.insert(aggVO, true);
}
/**
* 跨组织复制时原bom主键
*/
private String[] origins = null;
/**
* 带参数的BOM新增插入方法
*
* @param aggVO
* @param newCheckEcn
* @return
*/
public AggBomVO[] insert(AggBomVO[] aggVO, boolean newCheckEcn) {
return this.insert(aggVO, newCheckEcn, null, false);
}
/**
* 带参数的BOM新增插入方法
*
* @param aggVO
* @param newCheckEcn
* @param orgins 跨组织复制原bom主键
* @param param 无效参数占位
* @return
*/
public AggBomVO[] insert(AggBomVO[] aggVO, boolean newCheckEcn, String[] origins, boolean param) {
this.setCheckEcn(newCheckEcn);
if (origins != null) {
this.setOrigins(origins);
}
GCInsertBPTemplate<AggBomVO> bp = new GCInsertBPTemplate<AggBomVO>(BomPluginPoint.INSERT);
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
this.addAfterRule(bp.getAroundProcesser());
AggBomVO[] returnvo = bp.insert(aggVO);
return returnvo;
}
/**
* 带参的新增方法是否支持ECN是否支持审批流
*
* @param aggVO
* @param isCheckEcn
* @param isOnApprove
* @return
*/
public AggBomVO[] insert(AggBomVO[] aggVO, boolean isCheckEcn, boolean isOnApprove) {
this.setCheckEcn(isCheckEcn);
this.setOnApprove(isOnApprove);
GCInsertBPTemplate<AggBomVO> bp = new GCInsertBPTemplate<AggBomVO>(BomPluginPoint.INSERT);
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
this.addAfterRule(bp.getAroundProcesser());
AggBomVO[] returnvo = bp.insert(aggVO);
return returnvo;
}
/**
* 新增前规则
*
* @param processor
*/
@SuppressWarnings("unchecked")
private void addBeforeRule(AroundProcesser<AggBomVO> processer) {
// 补充默认值规则
IRule<AggBomVO> rule = new FillInsertDataRule();
processer.addBeforeRule(rule);
// 组织停用校验
rule = new OrgDisabledCheckRule(BomVO.PK_ORG, IOrgConstBasic.PRODUCEPLANTYPE);
processer.addBeforeRule(rule);
if (this.getCheckEcn()) {
// 是否启用工程变更校验
rule = new ECNOrgEnableCheckRule();
processer.addBeforeRule(rule);
}
if (!this.getCheckEcn()) {
// 数据检查并设置默认值
rule = new BomSaveDataCheckRule();
processer.addBeforeRule(rule);
} else {
// 数据检查并设置默认值
rule = new BomSaveDataCheckRule(this.getCheckEcn());
processer.addBeforeRule(rule);
}
// 行号检查
rule = new MMRowNoCheckRule<AggBomVO>();
processer.addBeforeRule(rule);
// 物料信息检查
rule = new BomMaterialCheckRule();
processer.addBeforeRule(rule);
// 长度检查
rule = new FieldLengthCheckRule();
processer.addBeforeRule(rule);
// bom自定义项检查
String[] prefixs = new String[] { "hvdef", "vdef", "vbdef", "vdef", "vdef", "vdef", "vdef" };
Class<?>[] voClasses = new Class<?>[] { BomVO.class, BomItemVO.class, BomOutputsVO.class, BomActivityVO.class,
BomWipVO.class, BomPosVO.class, BomReplVO.class };
rule = new nc.impl.pubapp.bd.userdef.UserDefSaveRule<AggBomVO>(prefixs, voClasses);
processer.addBeforeRule(rule);
// 检查自由项
rule = new MarAssistantSaveRule<AggBomVO>();
processer.addBeforeRule(rule);
// delete by qianzhx
// BOM在非审批通过态可以支持存在多个默认 20150425
// BOM默认版本规则
// rule = new BomDefaultVersionCheckRule();
// processer.addBeforeRule(rule);
// edited by renshch 20150507
// 定制BOM不支持审批流最多一个默认此规则已做调整只对定制BOM处理
//选配修改这个规则仅处理定制BOM是否默认定制BOM生成的时候已经处理过默认了不需要再特殊校验为了性能先注释掉
//rule = new BomDefaultVersionCheckRule();
//processer.addBeforeRule(rule);
// 默认卷积在同一维度下只能有一个默认卷积业务单元+物料+物料版本+bom类型
ConvolutionRule ctRule = new ConvolutionRule();
processer.addBeforeRule(ctRule);
// 是否委外在同一维度下只能有一个委外BOM业务单元+物料+物料版本
OutsourceRule osRule = new OutsourceRule();
processer.addBeforeRule(osRule);
// 子项物料启用序列号校验规则
//此校验在BomSaveDataCheckRule里头已经校验这里注释掉
//rule = new SerialManageCheckRule();
//processer.addBeforeRule(rule);
// 定制/配置BOM材料页签的相关校验
// 选配修改去掉之前定制BOM关于特征码的校验改到下面的rule里校验
rule = new CfgBomAndCBomItemCheckRule();
processer.addBeforeRule(rule);
//选配修改增加模型BOM/可选类BOM/定制BOM 设置状态和校验
rule=new BomCheckForMatchRule();
processer.addBeforeRule(rule);
// 分配部分校验
rule = new BomSaveAssignVersionCheckRule();
processer.addBeforeRule(rule);
// 物料表头自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(new String[] { BomVO.HCMATERIALVID, BomVO.HCMATERIALID }, null,
null, new String[] { BomVO.PK_ORG }, null, null, BomVO.class, false);
processer.addBeforeFinalRule(rule);
// 表体材料物料自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null,
new String[] { BomItemVO.CMATERIALVID, BomItemVO.CMATERIALID }, null, null,
new String[] { BomItemVO.PK_ORG }, null, BomItemVO.class, false);
processer.addBeforeFinalRule(rule);
// 表体联副产品物料自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null,
new String[] { BomOutputsVO.CMATERIALVID, BomOutputsVO.CMATERIALID }, null, null,
new String[] { BomOutputsVO.PK_ORG }, null, BomOutputsVO.class, false);
processer.addBeforeFinalRule(rule);
// 孙表线上仓物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomWipVO.G_CMATERIALVID, null,
// new String[] { BomWipVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// // 孙表组装位置物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomPosVO.G_CMATERIALVID, null,
// new String[] { BomPosVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// // 孙表阶梯变动损耗物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomLossVO.CLMATERIALVID, null,
// new String[] { BomLossVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// 孙表替代料物料表体自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null, null,
new String[] { BomReplVO.CREPLMATERIALVID, BomReplVO.CREPLMATERIALOID }, null, null,
new String[] { BomReplVO.PK_ORG }, BomReplVO.class, false);
processer.addBeforeFinalRule(rule);
// 注册事件源
rule = new BomAddBeforeEventRule();
processer.addBeforeRule(rule);
if (this.origins != null) {
// 替代方案-物料分配
rule = new BomReplsMaterialAssignRule(this.origins);
processer.addBeforeRule(rule);
}
//2025年6月13日09点38分 -- BOM保存时校验各BOM子件本业务单元库存组织是否启用项目如果启用则项目专用料自动启用包含接口导入
rule =new BOMBprojectmaterialEnableRule();
processer.addBeforeRule(rule);
}
/**
* 新增后规则
*
* @param processor
*/
private void addAfterRule(AroundProcesser<AggBomVO> processer) {
// BOM版本检查规则
IRule<AggBomVO> rule = new BomVersionCheckRule();
processer.addAfterRule(rule);
// 注册事件源
rule = new BomAddAfterEventRule();
processer.addAfterRule(rule);
}
public void setCheckEcn(boolean checkEcn) {
this.checkEcn = checkEcn;
}
public boolean getCheckEcn() {
return this.checkEcn;
}
public String[] getOrigins() {
return origins;
}
public void setOrigins(String[] origins) {
this.origins = origins;
}
}

View File

@ -0,0 +1,399 @@
package nc.bs.bd.bom.bom0202.bp;
import nc.bs.bd.bom.bom0202.plugin.bpplugin.BomPluginPoint;
import nc.bs.bd.bom.bom0202.rule.*;
import nc.bs.mmbd.pub.rule.MMAutoMaterialAssignRule;
import nc.bs.pubapp.pub.rule.FieldLengthCheckRule;
import nc.bs.pubapp.pub.rule.FillUpdateDataRule;
import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule;
import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule;
import nc.impl.pubapp.pattern.rule.ICompareRule;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.itf.org.IOrgConstBasic;
import nc.mmbd.utils.factoryparam.MMBDFactoryParameter;
import nc.util.mmf.busi.rule.MMRowNoCheckRule;
import nc.util.mmf.framework.gc.GCUpdateBPTemplate;
import nc.vo.bd.bom.bom0202.entity.AggBomVO;
import nc.vo.bd.bom.bom0202.entity.BomActivityVO;
import nc.vo.bd.bom.bom0202.entity.BomItemVO;
import nc.vo.bd.bom.bom0202.entity.BomOutputsVO;
import nc.vo.bd.bom.bom0202.entity.BomPosVO;
import nc.vo.bd.bom.bom0202.entity.BomReplVO;
import nc.vo.bd.bom.bom0202.entity.BomVO;
import nc.vo.bd.bom.bom0202.entity.BomWipVO;
import nc.vo.pub.VOStatus;
import java.util.Map;
/**
* BOM更新BP
*
* @author baijl
*/
public class BomUpdateBP {
/**
* 是否校验工程变更单是否启用
*/
private boolean checkEcn = true;
public boolean getCheckEcn() {
return this.checkEcn;
}
public void setCheckEcn(boolean checkEcn) {
this.checkEcn = checkEcn;
}
/**
* 是否支持审批流
*/
private boolean onApprove;
public boolean getOnApprove() {
return this.onApprove;
}
public void setOnApprove(boolean onApprove) {
this.onApprove = onApprove;
}
/**
* 是否是bom或bom树修改保存区分反向bom维护bom子项批量修改等节点
*/
private boolean isFromBomAndBomTree = false;
private boolean isEcnOrgChanged = false;
private boolean isAssign = false;
private boolean isCancleAssign = false;
/**
* 跨组织复制时原bom主键
*/
private String[] origins = null;
private Map<String,String> rownoMap = null;
public Map<String, String> getRownoMap() {
return rownoMap;
}
public void setRownoMap(Map<String, String> rownoMap) {
this.rownoMap = rownoMap;
}
public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills) {
return this.update(fullBills, originBills, true, false, false);
}
public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn) {
return this.update(fullBills, originBills, newCheckEcn, false, false);
}
public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean isFromBom,
boolean isEcnOrg) {
return this.update(fullBills, originBills, newCheckEcn, isFromBom, isEcnOrg, null, false);
}
public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean isFromBom,
boolean isEcnOrg, String[] origins, Boolean param) {
this.setCheckEcn(newCheckEcn);
this.setFromBomAndBomTree(isFromBom);
this.setEcnOrgChanged(this.getIsOrgChanged(fullBills[0], isEcnOrg));
if (origins != null) {
this.setOrigins(origins);
}
// 调用修改模板
GCUpdateBPTemplate<AggBomVO> bp = new GCUpdateBPTemplate<AggBomVO>(BomPluginPoint.UPDATE);
for (AggBomVO vo : fullBills) {
if (vo.getParent().getStatus() != VOStatus.UPDATED && !this.isAssign) {
vo.getParent().setStatus(VOStatus.UPDATED);
}
}
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
this.addAfterRule(bp.getAroundProcesser());
return bp.update(fullBills, originBills);
}
/**
* 带参的更新方法是否支持ECN是否支持审批流
*
* @param fullBills
* @param originBills
* @param newCheckEcn
* @param onApprove
* @param isFromBom
* @param isEcnOrg
* @return
*/
public AggBomVO[] update(AggBomVO[] fullBills, AggBomVO[] originBills, boolean newCheckEcn, boolean onapprove,
boolean isFromBom, boolean isEcnOrg) {
this.setCheckEcn(newCheckEcn);
this.setOnApprove(onapprove);
this.setFromBomAndBomTree(isFromBom);
this.setEcnOrgChanged(this.getIsOrgChanged(fullBills[0], isEcnOrg));
// 调用修改模板
GCUpdateBPTemplate<AggBomVO> bp = new GCUpdateBPTemplate<AggBomVO>(BomPluginPoint.UPDATE);
for (AggBomVO vo : fullBills) {
if (vo.getParent().getStatus() != VOStatus.UPDATED && !this.isAssign) {
vo.getParent().setStatus(VOStatus.UPDATED);
}
}
// 执行前规则
this.addBeforeRule(bp.getAroundProcesser());
// 执行后规则
if (!this.isAssign && !this.isCancleAssign) {
this.addAfterRule(bp.getAroundProcesser());
}
return bp.update(fullBills, originBills);
}
/**
* 更新前规则
*
* @param processer
*/
@SuppressWarnings("unchecked")
private void addBeforeRule(CompareAroundProcesser<AggBomVO> processer) {
IRule<AggBomVO> rule = null;
if (this.isAssign || this.isCancleAssign) {
// 分配校验
if (this.isAssign) {
rule = new BomAssignCheckRule();
processer.addBeforeRule(rule);
// 分配组织vid
rule = new BomAssgnUseorgRule();
processer.addBeforeRule(rule);
}
if (this.isCancleAssign) {
// 分配部分校验
rule = new BomCancelAssignCheckRule();
processer.addBeforeRule(rule);
}
} else {
// 组织停用校验
rule = new OrgDisabledCheckRule(BomVO.PK_ORG, IOrgConstBasic.PRODUCEPLANTYPE);
processer.addBeforeRule(rule);
if (this.getIsFromBomAndBomTree()) {
// 判断组织启用工程变更的状态前后是否一致不一致不能修改
if (this.getIsEcnOrgChanged()) {
rule = new ECNOrgChangedRule();
processer.addBeforeRule(rule);
}
} else {
if (this.getCheckEcn()) {
// 如果启用工程的话不能修改保存bom(适用于批改反向bom维护bom子项批量替换场景)
rule = new ECNCheckForModifyBomRule();
processer.addBeforeRule(rule);
}
}
if (this.getCheckEcn()) {
// 数据检查
BomSaveDataCheckRule saveDataCheckRule = new BomSaveDataCheckRule();
saveDataCheckRule.setRownoMap(this.getRownoMap());
processer.addBeforeRule(saveDataCheckRule);
} else {
// 数据检查
BomSaveDataCheckRule saveDataCheckRule = new BomSaveDataCheckRule(!this.getCheckEcn());
saveDataCheckRule.setRownoMap(this.getRownoMap());
processer.addBeforeRule(saveDataCheckRule);
}
// 行号检查
rule = new MMRowNoCheckRule<AggBomVO>();
processer.addBeforeRule(rule);
// 物料信息检查
rule = new BomMaterialCheckRule();
processer.addBeforeRule(rule);
// 保存时分配信息校验
rule = new BomSaveAssignVersionCheckRule();
processer.addBeforeRule(rule);
// 长度检查
rule = new FieldLengthCheckRule();
processer.addBeforeRule(rule);
// if (this.getOnApprove()) {
// // 设置审计信息
// rule = new FillUpdateDataRule();
// processer.addBeforeRule(rule);
// } 注掉 因为定制BOM修改保存时最后修改人修改时间信息会写不进去
// 设置审计信息
rule = new FillUpdateDataRule();
processer.addBeforeRule(rule);
// 检查自由项
rule = new MarAssistantSaveRule<AggBomVO>();
processer.addBeforeRule(rule);
// 检查自定义项
String[] prefixs = new String[] { "hvdef", "vdef", "vbdef", "vdef", "vdef", "vdef", "vdef" };
Class<?>[] voClasses = new Class<?>[] { BomVO.class, BomItemVO.class, BomOutputsVO.class,
BomActivityVO.class, BomWipVO.class, BomPosVO.class, BomReplVO.class };
rule = new nc.impl.pubapp.bd.userdef.UserDefSaveRule<AggBomVO>(prefixs, voClasses);
processer.addBeforeRule(rule);
// delete by qianzhx
// BOM在非审批通过态可以支持存在多个默认 20150425
// BOM默认版本规则
// rule = new BomDefaultVersionCheckRule();
// processer.addBeforeRule(rule);
// edited by renshch 20150507
// 定制BOM不支持审批流最多一个默认此规则已做调整只对定制BOM处理
rule = new BomDefaultVersionCheckRule();
processer.addBeforeRule(rule);
//选配修改增加模型BOM/可选类BOM/定制BOM 校验
rule=new BomCheckForMatchRule();
processer.addBeforeRule(rule);
// 默认卷积在同一维度下只能有一个默认卷积业务单元+物料+物料版本+bom类型
ConvolutionRule ctRule = new ConvolutionRule();
processer.addBeforeRule(ctRule);
// 是否委外在同一维度下只能有一个委外BOM业务单元+物料+物料版本
OutsourceRule osRule = new OutsourceRule();
processer.addBeforeRule(osRule);
// 子项物料启用序列号校验规则
rule = new SerialManageCheckRule();
processer.addBeforeRule(rule);
// 配置BOM 材料页签的相关校验
// 选配修改去掉之前定制BOM关于特征码的校验改到下面的rule里校验
rule = new CfgBomAndCBomItemCheckRule();
processer.addBeforeRule(rule);
// 注册事件源
rule = new BomUpdateBeforeEventRule();
processer.addBeforeRule(rule);
// 被替代方案引用的子项不能修改
ICompareRule<AggBomVO> compareRule = new UpdateHasReplsCheckRule();
processer.addBeforeRule(compareRule);
}
// 物料表头自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(new String[] { BomVO.HCMATERIALVID, BomVO.HCMATERIALID }, null,
null, new String[] { BomVO.PK_ORG }, null, null, BomVO.class, this.isAssign);
processer.addBeforeFinalRule(rule);
// 表体材料物料自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null,
new String[] { BomItemVO.CMATERIALVID, BomItemVO.CMATERIALID }, null, null,
new String[] { BomItemVO.PK_ORG }, null, BomItemVO.class, this.isAssign);
processer.addBeforeFinalRule(rule);
// 表体联副产品物料自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null,
new String[] { BomOutputsVO.CMATERIALVID, BomOutputsVO.CMATERIALID }, null, null,
new String[] { BomOutputsVO.PK_ORG }, null, BomOutputsVO.class, this.isAssign);
processer.addBeforeFinalRule(rule);
// 孙表线上仓物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomWipVO.G_CMATERIALVID, null,
// new String[] { BomWipVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// // 孙表组装位置物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomPosVO.G_CMATERIALVID, null,
// new String[] { BomPosVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// // 孙表阶梯变动损耗物料表体自动分配
// rule = new MMAutoMaterialAssignRule<AggBomVO>(null, BomLossVO.CLMATERIALVID, null,
// new String[] { BomLossVO.PK_ORG });
// processer.addBeforeFinalRule(rule);
// 孙表替代料物料表体自动分配
rule = new MMAutoMaterialAssignRule<AggBomVO>(null, null,
new String[] { BomReplVO.CREPLMATERIALVID, BomReplVO.CREPLMATERIALOID }, null, null,
new String[] { BomReplVO.PK_ORG }, BomReplVO.class, this.isAssign);
processer.addBeforeFinalRule(rule);
if (this.origins != null) {
// 替代方案-物料分配
rule = new BomReplsMaterialAssignRule(this.origins);
processer.addBeforeRule(rule);
}
//2025年6月13日09点38分 -- BOM保存时校验各BOM子件本业务单元库存组织是否启用项目如果启用则项目专用料自动启用包含接口导入
rule =new BOMBprojectmaterialEnableRule();
processer.addBeforeRule(rule);
}
/**
* 更新后规则
*
* @param processer
*/
private void addAfterRule(CompareAroundProcesser<AggBomVO> processer) {
// BOM版本检查规则
IRule<AggBomVO> rule = new BomVersionCheckRule();
processer.addAfterRule(rule);
// 同步BOM匹配规则中的BOM版本 add by lijbe
ICompareRule<AggBomVO> updateBmrtRule = new BomUpdateBmrtVersionRule();
processer.addBeforeRule(updateBmrtRule);
// 注册事件源
IRule<AggBomVO> eventRrule = new BomUpdateAfterEventRule();
processer.addAfterRule(eventRrule);
}
public boolean getIsFromBomAndBomTree() {
return this.isFromBomAndBomTree;
}
public void setFromBomAndBomTree(boolean isFromBomAndBomTree) {
this.isFromBomAndBomTree = isFromBomAndBomTree;
}
public boolean getIsEcnOrgChanged() {
return false;
}
public void setEcnOrgChanged(boolean isEcnOrgChanged) {
this.isEcnOrgChanged = isEcnOrgChanged;
}
public boolean getIsOrgChanged(AggBomVO aggvo, boolean isEcn_old) {
BomVO bomvo = (BomVO) aggvo.getParentVO();
boolean isEcn_new = MMBDFactoryParameter.isAlterCtrl(bomvo.getPk_org());
if (isEcn_new != isEcn_old) {
// 前后不一致则赋值
return true;
}
return false;
}
public boolean isAssign() {
return this.isAssign;
}
public void setAssign(boolean isAssign) {
this.isAssign = isAssign;
}
public boolean isCancleAssign() {
return this.isCancleAssign;
}
public void setCancleAssign(boolean isCancleAssign) {
this.isCancleAssign = isCancleAssign;
}
public String[] getOrigins() {
return origins;
}
public void setOrigins(String[] origins) {
this.origins = origins;
}
}

View File

@ -0,0 +1,84 @@
package nc.bs.bd.bom.bom0202.rule;
import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.jdbc.framework.processor.MapListProcessor;
import nc.util.mmf.framework.base.MMValueCheck;
import nc.vo.bd.bom.bom0202.entity.AggBomVO;
import nc.vo.bd.bom.bom0202.entity.BomItemVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Classname BOMBprojectmaterialEnableRule
* @Description TODO
* @Version 1.0.0
* @Date 2025/6/13 9:43
* @Created by ame
*/
public class BOMBprojectmaterialEnableRule implements IRule<AggBomVO> {
private static BaseDAO dao = new BaseDAO();
@Override
public void process(AggBomVO[] vos) {
if (!MMValueCheck.isEmpty(vos)) {
try {
//获取表头计划组织及表体行物料
for (AggBomVO vo : vos) {
String pk_org = (String) vo.getParentVO().getAttributeValue("pk_org");
BomItemVO[] childrenVOs = vo.getChildrenVO();
Map<String,String> material_construct = new HashMap<>();
Map<String,String> material_stock = new HashMap<>();
queryFix2ByMaterial(childrenVOs,material_construct,material_stock,pk_org);
for(BomItemVO bomItemVO:childrenVOs){
String cmaterialvid = bomItemVO.getCmaterialvid();
if(material_construct.containsKey(cmaterialvid)&& "Y".equals(material_construct.get(cmaterialvid))&& material_stock.containsKey(cmaterialvid)&& "Y".equals(material_stock.get(cmaterialvid))){
bomItemVO.setBprojectmaterial(UFBoolean.TRUE);
}
}
}
} catch (BusinessException var6) {
ExceptionUtils.wrappException(var6);
}
}
}
private void queryFix2ByMaterial(BomItemVO[] childrenVOs, Map<String, String> materialConstruct, Map<String, String> materialStock, String pkOrg) throws BusinessException {
List<String> materials=new ArrayList<>();
for (BomItemVO childrenVO : childrenVOs){
String cmaterialvid = childrenVO.getCmaterialvid();
materials.add(cmaterialvid);
}
SqlBuilder sql =new SqlBuilder();
sql.append(" SELECT bdm.pk_material ,bdmf.fix2,bdms.fixasst2 ");
sql.append(" FROM bd_material bdm ");
sql.append(" LEFT JOIN bd_marasstframe bdmf ON bdm.pk_marasstframe =bdmf.pk_marasstframe ");
sql.append(" LEFT JOIN bd_materialstock bdms ON bdms.PK_MATERIAL =bdm.PK_MATERIAL AND bdms.PK_ORG ='"+pkOrg+"' ");
sql.append(" where ");
sql.append("bdm.pk_material",materials.toArray(new String[0]));
List<Map<String,Object>> remain = (List<Map<String, Object>>) dao.executeQuery(sql.toString(), new MapListProcessor());
if(remain==null || remain.isEmpty()){
throw new BusinessException("物料查询辅助属性结构失败,sql【"+sql+"");
}
for (Map<String,Object> map:remain){
String fix2=map.get("fix2")==null?"N":map.get("fix2").toString();
String fixasst2=map.get("fixasst2")==null?"N":map.get("fixasst2").toString();
materialConstruct.put(map.get("pk_material").toString(),fix2);
materialStock.put(map.get("pk_material").toString(),fixasst2);
}
}
}

View File

@ -0,0 +1,66 @@
package nccloud.api.uapbd.customer.tms.listener.kejian;
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.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.uapbd.util.BaseOpenApiReq;
import nc.vo.bd.cust.CustomerVO;
import nc.vo.org.OrgVO;
import nc.vo.pub.BusinessException;
import java.util.Arrays;
import java.util.Collection;
/**
* 创建客户后自动分配组织
*
* @author mzr
* @date 2025/06/16
*/
public class AssignCustomerListener implements IBusinessListener {
@Override
public void doAction(IBusinessEvent event) throws BusinessException {
BDCommonEvent e = (BDCommonEvent) event;
Object[] objs = e.getObjs();
CustomerVO[] useVOs = ArrayClassConvertUtil.convert(objs, CustomerVO.class);
for (CustomerVO customerVO : useVOs) {
assignOrgApi(customerVO);
}
}
public void assignOrgApi(CustomerVO customerVO) throws BusinessException {
String[] customerPks = {customerVO.getPk_customer()};
OrgVO[] virtulaOrg = getVirtulaOrg();
String[] assignOrgPks = Arrays.stream(virtulaOrg).map(OrgVO::getPk_org).toArray(String[]::new);
JSONObject param = new JSONObject();
JSONObject ufinterfaceJson = new JSONObject();
JSONObject dataJson = new JSONObject();
dataJson.put("customer", customerPks);
dataJson.put("org", assignOrgPks);
ufinterfaceJson.put("sender", "default");
ufinterfaceJson.put("data", dataJson);
param.put("ufinterface", ufinterfaceJson);
BaseOpenApiReq req = new BaseOpenApiReq();
req.assignOrgApi("/nccloud/api/uapbd/customermanageext/customer/assignByPk", param);
}
/**
* 查询组织信息
*
* @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

@ -1,4 +1,4 @@
package nccloud.web.uapbd.customer.baseinfo.action;
package nc.bs.uapbd.util;
import com.alibaba.fastjson.JSONObject;
@ -7,7 +7,6 @@ import com.sm.misc.BASE64Encoder;
import nc.bs.dao.DAOException;
import nc.bs.logging.Logger;
import nc.bs.trade.business.HYSuperDMO;
import nc.itf.arap.goldentax.SysParaInitQuery;
import nc.vo.opm.thirdapp.ThirdappVO;
import nc.ws.opm.pub.utils.security.SecurityUtil;
import org.apache.commons.httpclient.Header;
@ -61,7 +60,7 @@ public class BaseOpenApiReq {
if (apiInfo == null) {
return;
}
BASE_URL_DEV = SysParaInitQuery.getParaString("GLOBLE00000000000000", "GJBURL");
// BASE_URL_DEV = SysParaInitQuery.getParaString("GLOBLE00000000000000", "GJBURL");
CLIENT_ID = apiInfo.getApp_id();
CLIENT_SECRET = apiInfo.getApp_secret();
PUBLIC_KEY = apiInfo.getPublic_key();

View File

@ -1,4 +1,4 @@
package nccloud.web.uapbd.customer.baseinfo.action;
package nc.bs.uapbd.util;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;

View File

@ -0,0 +1,132 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package nccloud.api.uapbd.customermanage.customer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.itf.bd.cust.assign.ICustAssignService;
import nc.jdbc.framework.processor.ColumnListProcessor;
import nc.vo.pub.BusinessException;
import nccloud.api.rest.utils.ResultMessageUtil;
import nccloud.api.uapbd.common.utils.OpenApiPagenationUtils;
import nccloud.vo.sql.util.InSqlUtil;
import nccloud.ws.rest.resource.AbstractNCCRestResource;
import org.json.JSONString;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.List;
@Path("uapbd/customermanageext/customer")
public class AssignCustomerExtResource extends AbstractNCCRestResource {
public AssignCustomerExtResource() {
}
@POST
@Path("assign")
@Consumes({"application/json"})
@Produces({"application/json"})
public JSONString assign(JSONString json) {
JSONObject jObject = JSON.parseObject(json.toJSONString());
if (jObject == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("JSONString:null"));
} else {
JSONObject object = jObject.getJSONObject("ufinterface");
if (object == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("ufinterface:null"));
} else {
JSONObject data = object.getJSONObject("data");
if (data == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("data:null"));
} else {
JSONArray customer = data.getJSONArray("customer");
JSONArray org = data.getJSONArray("org");
List<String> customerList = OpenApiPagenationUtils.jSONArrayToList(customer);
List<String> orgList = OpenApiPagenationUtils.jSONArrayToList(org);
if (customerList.size() == 0) {
return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数中客户编码为空,请确认传入参数!"));
} else if (orgList.size() == 0) {
return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数待分配组织编码为空,请确认传入参数!"));
} else {
String pk_group = InvocationInfoProxy.getInstance().getGroupId();
String userid = InvocationInfoProxy.getInstance().getUserId();
try {
String[] customerPks = this.translateCustomers(customerList, pk_group);
String[] assignOrgPks = this.translateOrgPk(orgList, pk_group);
((ICustAssignService) NCLocator.getInstance().lookup(ICustAssignService.class)).assignCustomerByPks(customerPks, assignOrgPks, (String[]) null);
return ResultMessageUtil.toJSON("客户分配成功!");
} catch (BusinessException e) {
return ResultMessageUtil.exceptionToJSON(e);
}
}
}
}
}
}
@POST
@Path("assignByPk")
@Consumes({"application/json"})
@Produces({"application/json"})
public JSONString assignByPk(JSONString json) {
JSONObject jObject = JSON.parseObject(json.toJSONString());
if (jObject == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("JSONString:null"));
} else {
JSONObject object = jObject.getJSONObject("ufinterface");
if (object == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("ufinterface:null"));
} else {
JSONObject data = object.getJSONObject("data");
if (data == null) {
return ResultMessageUtil.exceptionToJSON(new NullPointerException("data:null"));
} else {
JSONArray customer = data.getJSONArray("customer");
JSONArray org = data.getJSONArray("org");
List<String> customerList = OpenApiPagenationUtils.jSONArrayToList(customer);
List<String> orgList = OpenApiPagenationUtils.jSONArrayToList(org);
if (customerList.size() == 0) {
return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数中客户编码为空,请确认传入参数!"));
} else if (orgList.size() == 0) {
return ResultMessageUtil.exceptionToJSON(new BusinessException("传入参数待分配组织编码为空,请确认传入参数!"));
} else {
try {
String[] customerPks = customerList.toArray(new String[0]);
String[] assignOrgPks = orgList.toArray(new String[0]);
((ICustAssignService) NCLocator.getInstance().lookup(ICustAssignService.class)).assignCustomerByPks(customerPks, assignOrgPks, null);
return ResultMessageUtil.toJSON("客户分配成功!");
} catch (BusinessException e) {
return ResultMessageUtil.exceptionToJSON(e);
}
}
}
}
}
}
private String[] translateCustomers(List<String> codes, String pk_group) throws BusinessException {
String sql = "select pk_customer from bd_customer where pk_group = '" + pk_group + "' and " + InSqlUtil.buildInSql("code", "or", "in", (String[]) codes.toArray(new String[0]));
List<String> pks = (List) (new BaseDAO()).executeQuery(sql, new ColumnListProcessor());
return pks != null && pks.size() > 0 ? (String[]) pks.toArray(new String[0]) : null;
}
private String[] translateOrgPk(List<String> codes, String pk_group) throws BusinessException {
String sql = "select pk_org from org_orgs where isbusinessunit = 'Y' and pk_group = '" + pk_group + "' and " + InSqlUtil.buildInSql("code", "or", "in", (String[]) codes.toArray(new String[0]));
List<String> pks = (List) (new BaseDAO()).executeQuery(sql, new ColumnListProcessor());
return pks != null && pks.size() > 0 ? (String[]) pks.toArray(new String[0]) : null;
}
public String getModule() {
return "uapbd";
}
}

View File

@ -32,12 +32,13 @@ import java.util.Date;
*/
@Path("uapbd/msg")
public class MsgResource extends AbstractNCCRestResource {
private static final String DEFAULT_SENDER = "NC_USER0000000000000";
public String getModule() {
return "uapbd";
}
private HYSuperDMO superDMO = null;
private HYSuperDMO superDMO;
public HYSuperDMO getSuperDMO() {
@ -65,7 +66,7 @@ public class MsgResource extends AbstractNCCRestResource {
// 根据传递的角色查询要发送消息的用户信息
UserVO[] userVOS = getUserByRole(roleId);
if (userVOS == null) {
if (userVOS == null || userVOS.length == 0) {
return ResultMessageUtil.toJSON(false, "未查询到用户");
}
@ -87,7 +88,7 @@ public class MsgResource extends AbstractNCCRestResource {
CommonMessageVO commonMessageVO = new CommonMessageVO();
commonMessageVO.setReceiver(users);
commonMessageVO.setTitle("BOM变更信息通知");
commonMessageVO.setSender("NC_USER0000000000000");
commonMessageVO.setSender(DEFAULT_SENDER);
commonMessageVO.setSendDataTime(new UFDateTime());
commonMessageVO.setPriority(1);
commonMessageVO.setMessageContent(content);
@ -95,8 +96,8 @@ public class MsgResource extends AbstractNCCRestResource {
PfMessageUtil.sendNoticeMessage(commonMessageVO);
return ResultMessageUtil.toJSON(true, "消息发送成功");
} catch (BusinessException e) {
Logger.error("MsgResource-exp:" + e.getMessage());
} catch (Exception e) {
Logger.error("MsgResource-exp:", e);
return ResultMessageUtil.exceptionToJSON(new BusinessException(e.getMessage(), e));
}
}