diff --git a/ic/META-INF/OpenAPI_SCM_IC_INBOUND_EJB60.upm b/ic/META-INF/OpenAPI_SCM_IC_INBOUND_EJB60.upm new file mode 100644 index 0000000..94a2918 --- /dev/null +++ b/ic/META-INF/OpenAPI_SCM_IC_INBOUND_EJB60.upm @@ -0,0 +1,152 @@ + + + + + + nccloud.api.ic.m45.IAPIPurchaseInMaitain + nccloud.api.impl.ic.m45.APIPurchaseInMaitainImpl + + + + nccloud.api.ic.m45.IAPIPurchaseInQuery + nccloud.api.impl.ic.m45.APIPurchaseInQueryImpl + + + + nccloud.api.ic.m46.IAPIProductInMaitain + nccloud.api.impl.ic.m46.APIProductInMaitainImpl + + + + nccloud.api.ic.m46.IAPIProductInQuery + nccloud.api.impl.ic.m46.APIProductInQueryImpl + + + + + nccloud.api.ic.m4a.IAPIGeneralInMaitain + nccloud.api.impl.ic.m4a.APIGeneralInMaitainImpl + + + + nccloud.api.ic.m4a.IAPIGeneralInQuery + nccloud.api.impl.ic.m4a.APIGeneralInQueryImpl + + + + + nccloud.api.ic.m4e.IAPITransInMaitain + nccloud.api.impl.ic.m4e.APITransInMaitainImpl + + + + nccloud.api.ic.m4e.IAPITransInQuery + nccloud.api.impl.ic.m4e.APITransInQueryImpl + + + + + nccloud.api.ic.m4x.IAPIDiscardInMaitain + nccloud.api.impl.ic.m4x.APIDiscardInMaitainImpl + + + + nccloud.api.ic.m4x.IAPIDiscardInQuery + nccloud.api.impl.ic.m4x.APIDiscardInQueryImpl + + + + + nccloud.api.ic.m4455.IAPISapplyBillMaintain + nccloud.api.impl.ic.m4455.APISapplyBillMaintainImpl + + + + nccloud.api.ic.m4455.IAPISapplyBillQuery + nccloud.api.impl.ic.m4455.APISapplyBillQueryImpl + + + + + nccloud.api.ic.m4i.IAPIGeneralOutMaintain + nccloud.api.impl.ic.m4i.APIGeneralOutMaintainImpl + + + + nccloud.api.ic.m4i.IAPIGeneralOutQuery + nccloud.api.impl.ic.m4i.APIGeneralOutQueryImpl + + + + + nccloud.api.ic.m4c.IAPISaleOutMaintain + nccloud.api.impl.ic.m4c.APISaleOutMaintainImpl + + + + nccloud.api.ic.m4c.IAPISaleOutQuery + nccloud.api.impl.ic.m4c.APISaleOutQueryImpl + + + + + nccloud.api.ic.m4d.IAPIMaterialOutMaintain + nccloud.api.impl.ic.m4d.APIMaterialOutMaintainImpl + + + + nccloud.api.ic.m4d.IAPIMaterialOutQuery + nccloud.api.impl.ic.m4d.APIMaterialOutQueryImpl + + + + + nccloud.api.ic.m4k.IAPIWhsTransMaintain + nccloud.api.impl.ic.m4k.APIWhsTransMaintainImpl + + + + nccloud.api.ic.m4k.IAPIWhsTransQuery + nccloud.api.impl.ic.m4k.APIWhsTransQueryIpml + + + + + nccloud.api.ic.m4816.IAPIPrePaidInvoiceMaintain + nccloud.api.impl.ic.m4816.APIPrePaidInvoiceMaintainImpl + + + + nccloud.api.ic.m4q.IAPILocadjustMaintain + nccloud.api.impl.ic.m4q.APILocadjustMaintainImpl + + + + nccloud.api.ic.m4r.IAPIInvcountMaintain + nccloud.api.impl.ic.m4r.APIInvcountMaintainImpl + + + + nccloud.api.ic.m4r.IAPIInvcountQuery + nccloud.api.impl.ic.m4r.APIInvcountQueryImpl + + + + nccloud.api.ic.onhand.IAPIOnhandQuery + nccloud.api.impl.ic.onhand.APIOnhandQueryIpml + + + + nccloud.api.ic.atp.IAPIATPQuery + nccloud.api.impl.ic.atp.ATPQueryIpml + + + + + nccloud.api.ic.m47.IAPISubcontInMaintain + nccloud.api.impl.ic.m47.APISubcontInMaintainImpl + + + + + diff --git a/ic/META-INF/icbill.rest b/ic/META-INF/icbill.rest new file mode 100644 index 0000000..664b232 --- /dev/null +++ b/ic/META-INF/icbill.rest @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ic/src/private/nccloud/api/impl/ic/m47/APISubcontInMaintainImpl.java b/ic/src/private/nccloud/api/impl/ic/m47/APISubcontInMaintainImpl.java new file mode 100644 index 0000000..ee042be --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m47/APISubcontInMaintainImpl.java @@ -0,0 +1,45 @@ +package nccloud.api.impl.ic.m47; + +import nc.bs.framework.common.NCLocator; +import nc.itf.ic.m47.ISubcontInMaintain; +import nc.vo.ic.m47.entity.SubcontInVO; +import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule; +import nc.vo.scmpub.res.billtype.ICBillType; +import nccloud.api.ic.m47.IAPISubcontInMaintain; +import nccloud.api.impl.ic.m47.check.CheckSubcontInSaveValidator; +import nccloud.api.impl.ic.m47.fill.SubcontInSaveFillValue; +import nccloud.openapi.ic.util.ICAPILocationVOUtils; +import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; +import nccloud.openapi.scmpub.pub.TransferMapToVOTool; + +import java.util.List; +import java.util.Map; + +/** + * @Classname APISubcontInMaintainImpl + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 9:46 + * @Created by ame + */ +public class APISubcontInMaintainImpl implements IAPISubcontInMaintain { + @Override + public SubcontInVO[] save(List> subcontInVOList) throws Exception { + List aggVOList = TransferMapToVOTool.transferMapToAggVO(subcontInVOList, SubcontInVO.class); + SubcontInVO[] vos = aggVOList.toArray(new SubcontInVO[0]); + // 设置货位序列号VO + ICAPILocationVOUtils.setLocationVO(ICBillType.PurchaseIn.getCode(), vos); + // 1、传入数据基本非空校验 + BillVOsCheckRule checker = + new BillVOsCheckRule(new CheckSubcontInSaveValidator()); + checker.check(vos); + // 2、编码翻译成pk + aggVOList = TransferCodeToPKTool.transferAggVO(aggVOList); + // 翻译货位 + ICAPILocationVOUtils.translate(vos); + + new SubcontInSaveFillValue().setDefaultValue(vos); + SubcontInVO[] insert = NCLocator.getInstance().lookup(ISubcontInMaintain.class).insert(vos); + return insert; + } +} diff --git a/ic/src/private/nccloud/api/impl/ic/m47/check/CheckSubcontInSaveValidator.java b/ic/src/private/nccloud/api/impl/ic/m47/check/CheckSubcontInSaveValidator.java new file mode 100644 index 0000000..bf58986 --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m47/check/CheckSubcontInSaveValidator.java @@ -0,0 +1,100 @@ +package nccloud.api.impl.ic.m47.check; + +import nc.vo.ic.m47.entity.SubcontInBodyVO; +import nc.vo.ic.pub.define.ICPubMetaNameConst; +import nc.vo.pub.IAttributeMeta; +import nc.vo.pub.ISuperVO; +import nc.vo.pub.ValidationException; +import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill; +import nc.vo.pubapp.pattern.pub.MapList; +import nc.vo.scmpub.check.vovalidate.VONullValidate; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @Classname CheckSubcontInSaveValidator + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 9:54 + * @Created by ame + */ +public class CheckSubcontInSaveValidator extends VONullValidate { + @Override + public String[] getHeadNotNullFields() { + // TODO Auto-generated method stub + //组织,仓库,出入库类型编码 + String[] headnames = + { + ICPubMetaNameConst.PK_ORG, ICPubMetaNameConst.CWAREHOUSEID, ICPubMetaNameConst.VTRANTYPECODE + }; + return headnames; + } + + @Override + public String[] getBodyNotNullFields() { + String[] bodynames = { + ICPubMetaNameConst.CMATERIALVID, ICPubMetaNameConst.NSHOULDASSISTNUM +// , ICPubMetaNameConst.CASTUNITID + }; + return bodynames; + } + + @Override + public MapList getMultiBodyNotNullFields() { + return null; + } + + @Override + public void otherCheck(AbstractBill billVO, List exceptions) { +// check(billVO, null, new String[]{ +// ICPubMetaNameConst.NNUM, +// SubcontInBodyVO.NORIGTAXMNY +// }, exceptions); + } + + protected void check(AbstractBill bill, String[] headnullkeys, + String[] bodynullkeys, List exceptions) { + // 检查表头 + + // 检查表体 + checkBody(bill, bodynullkeys, exceptions); + } + + private void checkBody(AbstractBill bill, String[] bodynullkeys, + List exceptions) { + if (bodynullkeys != null) { + int row = 1; + ISuperVO[] supervos = bill.getChildren(SubcontInBodyVO.class); + Set messagelist = new HashSet(); + for (ISuperVO vo : supervos) { + Set nullbodyset = new HashSet(); + for (String bodynullkey : bodynullkeys) { + if (vo.getAttributeValue(bodynullkey) == null) { + IAttributeMeta attribute = vo.getMetaData().getAttribute(bodynullkey); + nullbodyset.add(attribute.getColumn().getLabel()); + } + } + if (nullbodyset.size() > 0 && nullbodyset.size() == bodynullkeys.length) { + String message = + "表体第" + row + "行以下字段不能同时为空:" + getshow(nullbodyset, "、");/*-=notranslate=-*/ + messagelist.add(message); + } + row++; + } + if (messagelist.size() > 0) { + exceptions.add(new ValidationException(getshow(messagelist, "\r\n"))); + } + } + } + + private String getshow(Set nullfields, String partition) { + StringBuffer str = new StringBuffer(); + for (String field : nullfields) { + str.append(field + partition); + } + str.deleteCharAt(str.length() - 1); + return str.toString(); + } +} diff --git a/ic/src/private/nccloud/api/impl/ic/m47/fill/SubcontInSaveFillValue.java b/ic/src/private/nccloud/api/impl/ic/m47/fill/SubcontInSaveFillValue.java new file mode 100644 index 0000000..35b277f --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m47/fill/SubcontInSaveFillValue.java @@ -0,0 +1,69 @@ +package nccloud.api.impl.ic.m47.fill; + +import nc.bs.ic.pub.base.ICRule; +import nc.vo.ic.m47.entity.SubcontInVO; +import nc.vo.ic.pub.rule.ICBodyNshouldassistnumCal; +import nc.vo.ic.pub.rule.ICCountryInfoFillRule; +import nc.vo.ic.pub.rule.ICCvendoridFillRule; +import nc.vo.ic.pub.rule.ICCwarehouseidFillRule; +import nc.vo.ic.pub.rule.ICMaterialFullRule; +import nc.vo.ic.pub.rule.ICNchangestdrateFillRule; +import nc.vo.ic.pub.rule.ICNtaxrateFillRule; +import nc.vo.ic.pub.rule.ICOrgFillRule; +import nc.vo.ic.pub.rule.ICTranstypeFillRule; +import nc.vo.ic.pub.rule.processer.ICAroundProcesser; +import nccloud.api.impl.ic.m47.rule.Choose47DefaultFillRule; + +/** + * @Classname SubcontInSaveFillValue + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 10:10 + * @Created by ame + */ +public class SubcontInSaveFillValue { + public void setDefaultValue(SubcontInVO[] vos) { + ICAroundProcesser processer = + new ICAroundProcesser(); + + // 组织 + ICRule rule = new ICOrgFillRule(); + processer.addFillvalueRule(rule); + + // 国家 + rule = new ICCountryInfoFillRule(); + processer.addFillvalueRule(rule); + + // 表头供应商 + rule = new ICCvendoridFillRule(); + processer.addFillvalueRule(rule); + + // 仓库 + rule = new ICCwarehouseidFillRule(); + processer.addFillvalueRule(rule); + + // 交易类型 + rule = new ICTranstypeFillRule(); + processer.addFillvalueRule(rule); + + // 物料 + rule = new ICMaterialFullRule(); + processer.addFillvalueRule(rule); + + // 财务组织等默认值填充 + rule = new Choose47DefaultFillRule(); + processer.addFillvalueRule(rule); + + // 设置汇率 + rule = new ICNchangestdrateFillRule(); + processer.addFillvalueRule(rule); + + // 数量,金额,汇率,税率处理 + rule = new ICBodyNshouldassistnumCal(); + processer.addFillvalueRule(rule); + + processer.fillvalue(vos); + + } + +} diff --git a/ic/src/private/nccloud/api/impl/ic/m47/rule/Choose47DefaultFillRule.java b/ic/src/private/nccloud/api/impl/ic/m47/rule/Choose47DefaultFillRule.java new file mode 100644 index 0000000..feaac16 --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/m47/rule/Choose47DefaultFillRule.java @@ -0,0 +1,103 @@ +package nccloud.api.impl.ic.m47.rule; + +import nc.bs.ic.pub.base.ICRule; +import nc.pubitf.uapbd.CurrencyRateUtilHelper; +import nc.vo.ic.general.define.ICBillFlag; +import nc.vo.ic.m47.entity.SubcontInBodyVO; +import nc.vo.ic.m47.entity.SubcontInHeadVO; +import nc.vo.ic.m47.entity.SubcontInVO; +import nc.vo.ic.org.OrgInfoQuery; +import nc.vo.ic.pub.define.ICPubMetaNameConst; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.AppContext; +import nc.vo.pubapp.pattern.pub.PubAppTool; + +/** + * @Classname Choose47DefaultFillRule + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 10:19 + * @Created by ame + */ +public class Choose47DefaultFillRule extends ICRule { + + @Override + public void process(E[] vos) { + for (E billvo : vos) { + // 填充默认值 + setDefultInfo(billvo); + // 设置财务组织,币种 + setFanaceorgValue(billvo); + } + } + + private void setFanaceorgValue(SubcontInVO vo) { + SubcontInHeadVO head = vo.getHead(); + String pk_org = head.getPk_org(); + if (pk_org != null) { + String cfinanceoid = + new OrgInfoQuery().getFinanceOrgIDByCalBodyID(pk_org); + String cfinancevid = + new OrgInfoQuery().getFinanceOrgVIDByCalBodyID(pk_org); + String pk_orgv = head.getPk_org_v(); + String cwareid = head.getCwarehouseid(); + + String ccurrencyid = CurrencyRateUtilHelper.getInstance() + .getLocalCurrtypeByOrgID(cfinanceoid); + SubcontInBodyVO[] bodys = vo.getBodys(); + for (SubcontInBodyVO body : bodys) { + + // 有来源的单据行不设置默认值,只有自制入才设置默认值 + String csourcebillbid = body.getCsourcebillbid(); + if (!PubAppTool.isNull(csourcebillbid)) { + continue; + } + // 币种 + if (null == body.getAttributeValue(SubcontInBodyVO.CORIGCURRENCYID)) { + body.setAttributeValue(SubcontInBodyVO.CORIGCURRENCYID, ccurrencyid);// TODO + body.setAttributeValue(SubcontInBodyVO.NCHANGESTDRATE, UFDouble.ONE_DBL); + } + body.setAttributeValue(SubcontInBodyVO.CCURRENCYID, ccurrencyid); + } + + } + + } + + private void setDefultInfo(SubcontInVO vo) { + // 单据状态 + vo.getHead().setAttributeValue(ICPubMetaNameConst.FBILLFLAG, + ICBillFlag.FREE.value()); + UFDate busdate = AppContext.getInstance().getBusiDate(); + String pk_group = (String) vo.getParentVO() + .getAttributeValue(ICPubMetaNameConst.PK_GROUP); + // 单据日期 + if (null == vo.getParentVO() + .getAttributeValue(ICPubMetaNameConst.DBILLDATE)) { + vo.getParentVO().setAttributeValue(ICPubMetaNameConst.DBILLDATE, busdate); + } + // 制单人 + if (null == vo.getParentVO() + .getAttributeValue(ICPubMetaNameConst.OPERATOR)) { + vo.getParentVO().setAttributeValue(ICPubMetaNameConst.OPERATOR, + AppContext.getInstance().getPkUser()); + } + // 集团 + if (null == pk_group) { + pk_group = AppContext.getInstance().getPkGroup(); + vo.getParentVO().setAttributeValue(ICPubMetaNameConst.PK_GROUP, pk_group); + } + for (SubcontInBodyVO body : vo.getBodys()) { + // 入库日期 + UFDate dbizdate = body.getDbizdate(); + if (null == dbizdate) { + body.setDbizdate(busdate); + } + body.setPk_org(vo.getParentVO().getPk_org()); + body.setPk_org_v(vo.getParentVO().getPk_org_v()); + body.setPk_group(pk_group); + } + } + +} diff --git a/ic/src/public/nccloud/api/ic/m47/IAPISubcontInMaintain.java b/ic/src/public/nccloud/api/ic/m47/IAPISubcontInMaintain.java new file mode 100644 index 0000000..b6a5d73 --- /dev/null +++ b/ic/src/public/nccloud/api/ic/m47/IAPISubcontInMaintain.java @@ -0,0 +1,18 @@ +package nccloud.api.ic.m47; + +import nc.vo.ic.m47.entity.SubcontInVO; + +import java.util.List; +import java.util.Map; + +/** + * @Classname IAPISubcontInMaintain + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 9:45 + * @Created by ame + */ +public interface IAPISubcontInMaintain { + + SubcontInVO[] save(List> subcontInVOList) throws Exception; +} diff --git a/ic/src/public/nccloud/openapi/ic/m47/SubcontInResource.java b/ic/src/public/nccloud/openapi/ic/m47/SubcontInResource.java new file mode 100644 index 0000000..c24fd95 --- /dev/null +++ b/ic/src/public/nccloud/openapi/ic/m47/SubcontInResource.java @@ -0,0 +1,63 @@ +package nccloud.openapi.ic.m47; + +import nc.bs.framework.common.NCLocator; +import nc.vo.ic.m47.entity.SubcontInVO; +import nc.vo.scmpub.res.billtype.ICBillType; +import nc.ws.opm.pub.utils.result.APIErrCodeEnum; +import nccloud.api.ic.m47.IAPISubcontInMaintain; +import nccloud.api.rest.utils.ResultMessageUtil; +import nccloud.openapi.ic.util.ICAPILocationVOUtils; +import nccloud.openapi.scmpub.pub.NCCPubRestResource; +import nccloud.openapi.scmpub.pub.TransferMapToVOTool; +import org.json.JSONString; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Classname SubcontInResource + * @Description TODO + * @Version 1.0.0 + * @Date 2025/5/15 8:54 + * @Created by sdlizheng + */ +@Path("ic/subcontin") +public class SubcontInResource extends NCCPubRestResource { + + private static String HEADTABLE = "ic_subcontin_h"; + private static String BODYTABLE = "ic_subcontin_b"; + + @POST + @Path("operation/save") + @Consumes({"application/json"}) + @Produces({"application/json"}) + public JSONString save(Map param) { + List> paramList = new ArrayList(); + paramList.add(param); + JSONString result = this.save(paramList); + return result; + } + @POST + @Path("save") + @Consumes({"application/json"}) + @Produces({"application/json"}) + public JSONString save(List> paramList){ + try { + for (Map map : paramList) { + if (!map.containsKey(HEADTABLE) || !map.containsKey(BODYTABLE)) { + return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含表头信息和表体信息", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + } + SubcontInVO[] save = NCLocator.getInstance().lookup(IAPISubcontInMaintain.class).save(paramList); + return ResultMessageUtil.toJSON(save, "保存成功"); + }catch (Exception e){ + return ResultMessageUtil.exceptionToJSON(e); + } + + } +}