diff --git a/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java b/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java new file mode 100644 index 0000000..ee95445 --- /dev/null +++ b/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java @@ -0,0 +1,113 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package nc.bs.pub.action; + +import java.math.BigDecimal; +import java.util.Hashtable; +import nc.bs.arap.actions.N_BASE_ACTION; +import nc.bs.arap.paybp.PayBillBO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Logger; +import nc.vo.arap.pay.AggPayBillVO; +import nc.vo.arap.pub.ArapConstant; +import nc.vo.arap.pub.BillEnumCollection.ApproveStatus; +import nc.vo.fipub.exception.ExceptionHandler; +import nc.vo.pub.AggregatedValueObject; +import nc.vo.pub.BusinessException; +import nc.vo.pub.compiler.PfParameterVO; +import nccloud.bs.arap.util.commit.ArapCommitUtil; +import nccloud.pubitf.arap.arappub.IArapBillPubUtilService; + +public class N_F3_SAVE extends N_BASE_ACTION { + private Hashtable m_keyHas; + + public N_F3_SAVE() { + new Hashtable(); + } + + private boolean hasBill(String primaryKey) throws BusinessException { + boolean hasBill = false; + if (primaryKey != null) { + AggPayBillVO[] bvos = null; + + try { + PayBillBO payableBO = new PayBillBO(); + 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; + } + + public Object runComClass(PfParameterVO paraVo) throws BusinessException { + try { + if (paraVo.m_preValueVos == null) { + return null; + } else { + Object obj = null; + super.m_tmpVo = paraVo; + if (paraVo.isCloudEntry) { + String actionCode = ArapConstant.SAVE; + ((IArapBillPubUtilService)NCLocator.getInstance().lookup(IArapBillPubUtilService.class)).interceptorVaildator(paraVo.m_preValueVos, actionCode); + } + + this.setParameter("context", paraVo.m_preValueVos); + this.beforeCheck(); + String primaryKey = paraVo.m_preValueVos[0].getParentVO().getPrimaryKey(); + if (this.hasBill(primaryKey)) { + obj = this.runClass("nc.bs.arap.actions.PaybillEditSaveBatchBSAction", "updateVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); + } else { + paraVo = this.approveStatusChange(paraVo); + obj = this.runClass("nc.bs.arap.actions.PaybillSaveBatchBSAction", "insertVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); + } + + this.afterCheck(); + obj = (new ArapCommitUtil()).autoCommit(obj); + return obj; + } + } catch (Exception exception) { + throw ExceptionHandler.handleException(this.getClass(), exception); + } + } + + 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); + } + + } + + public String getCodeRemark() { + return " arap action script not allowed to modify ,all rights reserved!"; + } + + private PfParameterVO approveStatusChange(PfParameterVO paraVo) { + for(AggregatedValueObject vo : paraVo.m_preValueVos) { + vo.getParentVO().setAttributeValue("approvestatus", ApproveStatus.NOSTATE.VALUE); + } + + return paraVo; + } + + private PfParameterVO def10Change(PfParameterVO paraVo) { + for(AggregatedValueObject vo : paraVo.m_preValueVos) { + vo.getParentVO().setAttributeValue("approvestatus", ApproveStatus.NOSTATE.VALUE); + } + + return paraVo; + } + +} diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java index 5435fad..6ca5fdb 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveRuleSyncMes.java @@ -196,16 +196,15 @@ public class AfterApproveRuleSyncMes implements IRule { private void syncOrderItemToMes(PMOHeadVO head, PMOItemVO item) throws BusinessException { JSONObject data = new JSONObject(); String vbillcode = head.getVbillcode(); // 单据号 - String itemRow = item.getVrowno(); // 行号 + String itemRow = item.getVrowno(); // 行号 obmlog.info("开始为生产订单 " + vbillcode + " 行 " + itemRow + " 构建同步MES数据。"); - obmlog.info("开始为生产订单 " + vbillcode + " 行 " + itemRow + " 构建同步MES数据。"); - - // orderNo String 是 生产订单号 vbillcode - if (vbillcode.length() > 18) { - throw new BusinessException("MES同步要求:生产订单 " + vbillcode + " 行 " + itemRow + " 单据号长度不能超过18位。"); + // orderNo String 是 生产订单号+行号 vbillcode+itemRow + String orderNoWithRow = vbillcode + itemRow; + if (orderNoWithRow.length() > 18) { + throw new BusinessException("MES同步要求:生产订单 " + vbillcode + " 行 " + itemRow + " 单据号+行号长度不能超过18位,当前长度:" + orderNoWithRow.length()); } - data.put("orderNo", vbillcode); + data.put("orderNo", orderNoWithRow); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); diff --git a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java index e291e10..7e640e9 100644 --- a/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java +++ b/mmpac/src/public/nccloud/openapi/mmpac/wr/WrResource.java @@ -1,18 +1,18 @@ package nccloud.openapi.mmpac.wr; + import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; import nc.bs.framework.common.NCLocator; import nc.bs.logging.Log; import nc.bs.uif2.validation.ValidationFailure; +import nc.jdbc.framework.SQLParameter; +import nc.jdbc.framework.processor.ColumnProcessor; import nc.util.mmf.framework.base.MMArrayUtil; import nc.util.mmf.framework.base.MMCollectionUtil; import nc.util.mmf.framework.base.MMNumberUtil; import nc.util.mmf.framework.base.MMValueCheck; -import nc.vo.mmpac.wr.entity.AggWrVO; -import nc.vo.mmpac.wr.entity.WrItemVO; -import nc.vo.mmpac.wr.entity.WrQualityVO; -import nc.vo.mmpac.wr.entity.WrSerialNoVO; -import nc.vo.mmpac.wr.entity.WrVO; +import nc.vo.mmpac.wr.entity.*; import nc.vo.mmpac.wr.enumeration.WrBillStatusEnum; import nc.vo.pub.BusinessException; import nc.vo.pub.VOStatus; @@ -31,14 +31,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Path("mmpac/wr") public class WrResource extends AbstractNCCRestResource { @@ -312,6 +305,9 @@ public class WrResource extends AbstractNCCRestResource { Map bodyInfo = (Map) paramMap.get(BODYTABLE); itemInfos.add(bodyInfo); } + + // 预处理数据:处理仓库转换和MES相关字段 + preProcessMesData(headInfo, itemInfos, baseDAO); AggWrVO vo = new AggWrVO(); WrVO head = new WrVO(); head.setPk_group(AppContext.getInstance().getPkGroup()); @@ -577,9 +573,169 @@ public class WrResource extends AbstractNCCRestResource { } server.delete(deleteVos.toArray(new AggWrVO[0])); return ResultMessageUtil.toJSON(new String[0], "生产报告删除成功"); - } catch (Exception e) { - return ResultMessageUtil.exceptionToJSON(e); + } catch (Exception e) { return ResultMessageUtil.exceptionToJSON(e); } } + /** + * 预处理数据:包含仓库转换和MES相关字段处理 + * @param headInfo 表头信息 + * @param itemInfos 表体信息列表 + * @param baseDAO 数据库操作对象 + * @throws BusinessException 处理失败时抛出异常 + */ + private void preProcessMesData(Map headInfo, List> itemInfos, BaseDAO baseDAO) + throws BusinessException { + // 处理表体信息中的数据转换 + for (Map itemMap : itemInfos) { + // 处理MES相关字段自动赋值 + processMESFields(itemMap, baseDAO); + + // 处理质量信息中的仓库转换 + if (itemMap.containsKey(QUALITYTABLE)) { + List> qualityInfos = (List>) itemMap.get(QUALITYTABLE); + processWarehouseConversion(qualityInfos, baseDAO); + } + } + } + + /** + * 处理MES相关字段自动赋值 + * 如果用户code是MES,那么将cbmoid保持和vbsrcid一致,cbmobid保持和vbsrcrowid一致 + * 增加vbmobillcode单据号,通过cbmoid查询流程生产订单表的vbillcode + * @param itemMap 表体信息 + * @param baseDAO 数据库操作对象 + * @throws BusinessException 查询失败时抛出异常 + */ + + private void processMESFields(Map itemMap, BaseDAO baseDAO) throws BusinessException { + // 检查是否需要处理MES字段 + // 这里可以通过上下文、用户信息或其他标识来判断 + // 暂时通过检查是否存在特定字段来判断是MES用户 + boolean isMESUser = isMESUser(itemMap); + + if (!isMESUser) { + return; + } + + try { + // 设置cbmoid保持和vbsrcid一致 + if (itemMap.containsKey("vbsrcid") && MMValueCheck.isNotEmpty(itemMap.get("vbsrcid"))) { + itemMap.put("cbmoid", itemMap.get("vbsrcid")); + } + + // 设置cbmobid保持和vbsrcrowid一致 + if (itemMap.containsKey("vbsrcrowid") && MMValueCheck.isNotEmpty(itemMap.get("vbsrcrowid"))) { + itemMap.put("cbmobid", itemMap.get("vbsrcrowid")); + } + // 通过cbmoid查询流程生产订单表的vbillcode + if (itemMap.containsKey("cbmoid") && MMValueCheck.isNotEmpty(itemMap.get("cbmoid"))) { + String cbmoid = String.valueOf(itemMap.get("cbmoid")); + String sql = "SELECT vbillcode FROM mm_pmo WHERE cpmohid = ? AND dr = 0"; + SQLParameter param = new SQLParameter(); + param.addParam(cbmoid); + String vbillcode = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor()); + + if (MMValueCheck.isEmpty(vbillcode)) { + throw new BusinessException("通过流程生产订单主键【" + cbmoid + "】查询不到对应的单据号,请检查数据"); + } + + itemMap.put("vbmobillcode", vbillcode); + } + + } catch (Exception e) { + if (e instanceof BusinessException) { + throw e; + } + throw new BusinessException("处理MES字段失败:" + e.getMessage()); + } + } + /** + * 判断是否为MES用户 + * 通过获取线程上下文中的用户编码来判断是否为MES用户 + * @param itemMap 表体信息(保留参数以保持方法签名一致性) + * @return 是否为MES用户 + */ + + private boolean isMESUser(Map itemMap) { + try { + // 获取当前线程上下文中的用户编码 + String userCode = InvocationInfoProxy.getInstance().getUserCode(); + + // 判断用户编码是否为MES + return "MES".equals(userCode); + + } catch (Exception e) { + // 如果获取用户编码失败,记录日志并返回false + Log.getInstance("mm-mes").error("获取用户编码失败:" + e.getMessage(), e); + return false; + } + } + + /** + * 处理仓库转换(将原有的仓库转换逻辑包装成独立函数) + * @param qualityInfos 质量信息列表 + * @param baseDAO 数据库操作对象 + * @throws BusinessException 转换失败时抛出异常 + */ + private void processWarehouseConversion(List> qualityInfos, BaseDAO baseDAO) + throws BusinessException { + if (qualityInfos == null || qualityInfos.isEmpty()) { + return; + } + + for (Map qualityInfo : qualityInfos) { + if (qualityInfo.containsKey("cgwarehouseid") && MMValueCheck.isNotEmpty(qualityInfo.get("cgwarehouseid"))) { + String warehouseValue = String.valueOf(qualityInfo.get("cgwarehouseid")); + String warehousePk = convertWarehouseCodeToPk(warehouseValue, baseDAO); + qualityInfo.put("cgwarehouseid", warehousePk); + } + } + } + + /** + * 转换仓库编码为主键 + * 首先假设传入值是主键,如果查询不到,再假设是编码进行查询 + * @param warehouseValue 仓库值(可能是主键或编码) + * @param baseDAO 数据库操作对象 + * @return 仓库主键 + * @throws BusinessException 如果仓库不存在 + */ + private String convertWarehouseCodeToPk(String warehouseValue, BaseDAO baseDAO) throws BusinessException { + if (MMValueCheck.isEmpty(warehouseValue)) { + return warehouseValue; + } + try { + // 首先假设是主键,直接查询 + String sql = "SELECT pk_stordoc FROM bd_stordoc WHERE pk_stordoc = ? AND dr = 0"; + SQLParameter param = new SQLParameter(); + param.addParam(warehouseValue); + String result = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor()); + + if (MMValueCheck.isNotEmpty(result)) { + // 主键查询成功,直接返回 + return warehouseValue; + } + + // 主键查询失败,假设是编码查询 + sql = "SELECT pk_stordoc FROM bd_stordoc WHERE code = ? AND dr = 0"; + param = new SQLParameter(); + param.addParam(warehouseValue); + result = (String) baseDAO.executeQuery(sql, param, new ColumnProcessor()); + + if (MMValueCheck.isNotEmpty(result)) { + // 编码查询成功,返回主键 + return result; + } + + // 都查询不到,抛出异常 + throw new BusinessException("仓库【" + warehouseValue + "】不存在,请检查仓库编码或主键"); + + } catch (Exception e) { + if (e instanceof BusinessException) { + throw e; + } + throw new BusinessException("查询仓库信息失败:" + e.getMessage()); + } + } } diff --git a/arap/src/private/nc/bs/sc/m61/referred/rule/pm/AfterApproceRuleSyncRZWMSProcess.java b/sc/src/private/nc/bs/sc/m61/referred/rule/pm/AfterApproceRuleSyncRZWMSProcess.java similarity index 100% rename from arap/src/private/nc/bs/sc/m61/referred/rule/pm/AfterApproceRuleSyncRZWMSProcess.java rename to sc/src/private/nc/bs/sc/m61/referred/rule/pm/AfterApproceRuleSyncRZWMSProcess.java diff --git a/arap/src/private/nc/impl/sc/m61/action/approve/SCOrderApproveAction.java b/sc/src/private/nc/impl/sc/m61/action/approve/SCOrderApproveAction.java similarity index 100% rename from arap/src/private/nc/impl/sc/m61/action/approve/SCOrderApproveAction.java rename to sc/src/private/nc/impl/sc/m61/action/approve/SCOrderApproveAction.java diff --git a/so/src/public/nccloud/api/so/saleinvoice/operator/IAPISaleInvMaitainImpl.java b/so/src/public/nccloud/api/so/saleinvoice/operator/IAPISaleInvMaitainImpl.java index d9c2071..283af1c 100644 --- a/so/src/public/nccloud/api/so/saleinvoice/operator/IAPISaleInvMaitainImpl.java +++ b/so/src/public/nccloud/api/so/saleinvoice/operator/IAPISaleInvMaitainImpl.java @@ -204,7 +204,7 @@ public class IAPISaleInvMaitainImpl { Logger.error("=====================inv-red-audit-end==============="); // 查询新生成红冲发票的信息 - String newPk = returnApproveSaleInvoiceVOs[0].getParentVO().getCsaleinvoiceid(); + String newPk = returnSaveSaleInvoiceVOs[0].getParentVO().getCsaleinvoiceid(); String[] idsNew = {newPk}; // String[] idsNew = {"1001A11000000FSB45YA"}; SaleInvoiceVO[] redVos = querySaleInvoiceByIds(idsNew); @@ -503,8 +503,10 @@ public class IAPISaleInvMaitainImpl { } // BIP合同平台的数量对应BIP2312的主数量,BIP2312的 数量=主数量*换算关系 UFDouble nnum = new UFDouble(bipBvoJson.getString("nnum")); - newInvBVO.setNastnum(nnum.multiply(vchangerateNum).setScale(2, 4)); // 数量 + UFDouble nastnum = nnum.multiply(vchangerateNum).setScale(2, 4); + newInvBVO.setNastnum(nastnum); // 数量 newInvBVO.setNnum(nnum); // 主数量 + newInvBVO.setNqtunitnum(nastnum); // 报价数量 newInvBVO.setNqtorigtaxprice(new UFDouble(bipBvoJson.getString("nqtorigtaxprice"))); // 含税单价 newInvBVO.setNqtorigprice(new UFDouble(bipBvoJson.getString("nqtorigprice"))); // 无税单价 newInvBVO.setNorigtaxprice(new UFDouble(bipBvoJson.getString("norigtaxprice"))); // 主含税单价 @@ -528,11 +530,17 @@ public class IAPISaleInvMaitainImpl { newInvBVO.setNtaxmny(new UFDouble(bipBvoJson.getString("ntaxmny"))); // 本币价税合计 newInvBVO.setNcaltaxmny(new UFDouble(bipBvoJson.getString("nmny"))); // 计税金额=本币无税金额 newInvBVO.setCopposesrcbid(bipBvoJson.getString("vbdef15")); // 对冲来源子表id - newInvBVO.setNqtunitnum(null); // 报价数量 + newInvBVO.setCunitid(bipBvoJson.getString("castunitid"));// 主单位 + newInvBVO.setCqtunitid(bipBvoJson.getString("castunitid"));// 报价单位 + // 通过 ntaxrate 获取 taxcode + String taxcodeStr = getTaxcode(bipBvoJson.getString("ntaxrate")); + newInvBVO.setCtaxcodeid(taxcodeStr);// 税码 + newInvBVO.setCsaleinvoiceid(null); // 发票关联主表id newInvBVO.setNtotalcostnum(null); // 累计成本结算数量 newInvBVO.setNtotalincomemny(null); // 累计确认应收金额 newInvBVO.setNtotalincomenum(null); // 累计确认应收数量 + newSaleInvoiceBVOs[i++] = newInvBVO; sumNum = sumNum.add(new UFDouble(bipBvoJson.getString("nnum"))); sumNtax = sumNtax.add(new UFDouble(bipBvoJson.getString("ntax"))); @@ -558,6 +566,8 @@ public class IAPISaleInvMaitainImpl { newSaleInvoiceHVO.setCopposesrcid(saleInvoiceHVO.getCsaleinvoiceid()); // 对冲来源发票id newSaleInvoiceHVO.setApprover(null); // 审批人 newSaleInvoiceHVO.setTaudittime(null); // 审批日期 + newSaleInvoiceHVO.setVdef13(null); // 发票号码 + newSaleInvoiceHVO.setVdef17(bject.getString("vdef17")); // BIP申请单号 // 组装VO saleInvoiceVO.setParentVO(newSaleInvoiceHVO);