diff --git a/so/META-INF/saleinvoice.rest b/so/META-INF/saleinvoice.rest
new file mode 100644
index 0000000..94b8e77
--- /dev/null
+++ b/so/META-INF/saleinvoice.rest
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/so/src/public/nc/vo/so/m32/saleinvoice/operator/billSaveAction.java b/so/src/public/nc/vo/so/m32/saleinvoice/operator/billSaveAction.java
new file mode 100644
index 0000000..0e0b043
--- /dev/null
+++ b/so/src/public/nc/vo/so/m32/saleinvoice/operator/billSaveAction.java
@@ -0,0 +1,344 @@
+package nc.vo.so.m32.saleinvoice.operator;
+
+import com.alibaba.fastjson.JSONObject;
+import nc.bs.framework.common.NCLocator;
+import nc.bs.framework.core.util.ObjectCreator;
+import nc.bs.ia.audit.pub.CloneUtil;
+import nc.bs.logging.Logger;
+import nc.bs.trade.business.HYSuperDMO;
+import nc.itf.uap.IUAPQueryBS;
+import nc.pubitf.so.m32.api.ISaleinvoiceQueryAPI;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDate;
+import nc.vo.pub.lang.UFDouble;
+import nc.vo.scmpub.res.billtype.SOBillType;
+import nc.vo.so.m32.entity.SaleInvoiceBVO;
+import nc.vo.so.m32.entity.SaleInvoiceHVO;
+import nc.vo.so.m32.entity.SaleInvoiceVO;
+import nc.vo.sscivm.ivsale.IVApplicationAggVO;
+import nc.vo.sscivm.ivsale.IVApplicationBodyVO;
+import nc.vo.sscivm.ivsale.IVApplicationHeadVO;
+import nccloud.api.baseapp.exchange.convert.IExchangeForService;
+import nccloud.api.baseapp.exchange.convert.OpenApiConvertDataObject;
+import nccloud.api.baseapp.exchange.convert.OpenApiConvertDataResult;
+import nccloud.api.rest.utils.ResultMessageUtil;
+import nccloud.itf.sscivm.ivsale.impl.IVApplicationServiceImpl;
+import nccloud.pubitf.riart.pflow.CloudPFlowContext;
+import nccloud.pubitf.riart.pflow.ICloudScriptPFlowService;
+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("so/saleinvoice/operator")
+public class billSaveAction extends AbstractNCCRestResource {
+
+ public static String fplxStr = "";// Ʊ뷢Ʊ
+
+ public billSaveAction() {
+
+ }
+
+ public OpenApiConvertDataResult changeToExchangeData(OpenApiConvertDataObject openApiConvertDataObject)
+ throws Exception {
+ return getPFxxEJBService().changeToExchangeData(openApiConvertDataObject);
+ }
+
+ public static IExchangeForService getPFxxEJBService() {
+ IExchangeForService exchangeForService = (IExchangeForService) ObjectCreator.newInstance("ufesbexpress",
+ "nccloud.pubimpl.pfxx.convert.ExchangeForServiceImpl");
+ return exchangeForService;
+ }
+
+ @Override
+ public String getModule() {
+ return "so";
+ }
+
+ @POST
+ @Path("/billSaveRp")
+ @Consumes({"application/json"})
+ @Produces({"application/json"})
+ public JSONString billSaveRp(JSONString json) throws Exception {
+ /**
+ * ۷Ʊ壺
+ * 1.bipе۷Ʊidѯerp۷ƱVO
+ * 2.ݲѯ۷ƱVOɺ۷Ʊ
+ */
+ JSONObject jobject = JSONObject.parseObject(json.toJSONString());
+ if (jobject == null) {
+ return ResultMessageUtil.exceptionToJSON(new NullPointerException("JSONString:null"));
+ }
+ JSONObject bject = jobject.getJSONObject("billhead");
+ if (bject == null) {
+ return ResultMessageUtil.exceptionToJSON(new NullPointerException("billhead:null"));
+ }
+ String csaleinvoiceid = bject.getString("csaleinvoiceid"); // ۷Ʊid
+ // ۷Ʊʵidѯ۷Ʊ
+ String[] ids = {csaleinvoiceid};
+ SaleInvoiceVO[] saleInvoiceVOs = NCLocator.getInstance().lookup(ISaleinvoiceQueryAPI.class)
+ .queryVOByIDs(ids);
+ if (saleInvoiceVOs.length <= 0) {
+ return ResultMessageUtil.exceptionToJSON(new NullPointerException("δѯErpӦ۷Ʊ"));
+ }
+ try {
+ // úԭ۷Ʊװº巢Ʊ
+ SaleInvoiceVO saleInvoiceRedRushVO = makeNewRedRushSaleInvoice(saleInvoiceVOs[0], bject);
+ // ɺ巢Ʊ
+ ICloudScriptPFlowService flowService = NCLocator.getInstance().lookup(ICloudScriptPFlowService.class);
+ CloudPFlowContext context = new CloudPFlowContext();
+ context.setBillType("32");
+ context.setBillVos(new SaleInvoiceVO[]{saleInvoiceRedRushVO});
+ context.setActionName("WRITE");
+ SaleInvoiceVO[] returnSaveSaleInvoiceVOs = (SaleInvoiceVO[]) flowService.exeScriptPFlow(context);
+// SaleInvoiceVO[] returnSaveSaleInvoiceVO = (SaleInvoiceVO[])PfServiceScmUtil.processBatch("WRITE", SOBillType.Invoice.getCode(), new SaleInvoiceVO[] { saleInvoiceRedRushVO }, null, null);
+ if (returnSaveSaleInvoiceVOs != null && returnSaveSaleInvoiceVOs.length > 0) {
+ // ɺ巢Ʊɹִ۷Ʊ
+ context.setBillType("32");
+ context.setBillVos(returnSaveSaleInvoiceVOs);
+ context.setActionName("APPROVE");
+ SaleInvoiceVO[] returnApproveSaleInvoiceVOs = (SaleInvoiceVO[]) flowService.exeScriptPFlow(context);
+ if (returnApproveSaleInvoiceVOs == null && returnApproveSaleInvoiceVOs.length <= 0) {
+ throw new BusinessException("۷Ʊʧ");
+ }
+ /**
+ * Ʊ
+ * 1.۷ƱŲѯοƱ
+ * 2.ԭƱº
+ */
+ String vBillcode = saleInvoiceVOs[0].getParentVO().getVbillcode();
+ HYSuperDMO dmo = new HYSuperDMO();
+ // Ʊ뵥
+ IVApplicationHeadVO[] iVApplicationHeadVO = (IVApplicationHeadVO[]) dmo.queryByWhereClause(IVApplicationHeadVO.class, "src_billno='" + vBillcode + "' and dr=0 ");
+ String pk_ivapplication = iVApplicationHeadVO[0].getPk_ivapplication(); // Ʊid
+ // Ʊ뵥ӱ
+ IVApplicationBodyVO[] iVApplicationBodyVOs = (IVApplicationBodyVO[]) dmo.queryByWhereClause(IVApplicationBodyVO.class, "pk_ivapplication='" + pk_ivapplication + "' and dr=0 ");
+ // úװƱVO
+ IVApplicationAggVO iVApplicationAggVO = makeNewRedRushIVApplicationAggVO(iVApplicationHeadVO[0], iVApplicationBodyVOs, bject, returnApproveSaleInvoiceVOs);
+ // ɺĿƱ
+// context.setBillType("SSCIVA");
+// context.setBillVos( new IVApplicationAggVO[] { iVApplicationAggVO });
+// context.setActionName("SAVE");
+// IVApplicationAggVO[] returnSaveIVApplicationAggVO = (IVApplicationAggVO[] )flowService.exeScriptPFlow(context);
+ IVApplicationServiceImpl serviceImpl = new IVApplicationServiceImpl();
+ IVApplicationAggVO returnSaveIVApplicationAggVO = serviceImpl.save(iVApplicationAggVO);
+// Object returnIVApplicationAggVO = PfServiceScmUtil.processBatch("SAVE", "SSCIVA", new IVApplicationAggVO[] { iVApplicationAggVO }, null, null);
+ if (returnSaveIVApplicationAggVO != null) {
+ return ResultMessageUtil.toJSON(null, "ӿڵóɹ");
+ } else {
+ Exception e = new Exception("ӿڵʧ");
+ return ResultMessageUtil.exceptionToJSON(e);
+ }
+ } else {
+ Exception e = new Exception("ӿڵʧ");
+ return ResultMessageUtil.exceptionToJSON(e);
+ }
+ } catch (BusinessException e) {
+ Logger.error("writeBack Error: ", e);
+ return ResultMessageUtil.exceptionToJSON(e);
+ }
+ }
+
+ /**
+ * 巢ƱVO
+ *
+ * @param originalSaleInvoiceVO
+ * @param bject
+ * @return
+ * @throws Exception
+ */
+ public static SaleInvoiceVO makeNewRedRushSaleInvoice(SaleInvoiceVO originalSaleInvoiceVO, JSONObject bject) throws Exception {
+ try {
+ SaleInvoiceVO saleInvoiceVO = new SaleInvoiceVO();
+ SaleInvoiceHVO saleInvoiceHVO = originalSaleInvoiceVO.getParentVO(); // ʵ
+ SaleInvoiceBVO[] saleInvoiceBVOs = originalSaleInvoiceVO.getChildrenVO(); // ʵ
+ SaleInvoiceHVO newSaleInvoiceHVO = new SaleInvoiceHVO(); // ʵ
+
+ // ʵԸֵ
+ UFDouble sumNum = new UFDouble(); // ϼ
+ UFDouble sumNtax = new UFDouble(); // ϼ˰
+ UFDouble sumNcaltaxmny = new UFDouble(); // ϼƼ˰
+ UFDouble sumNorigmny = new UFDouble(); // ϼ˰
+ UFDouble sumNorigtaxmny = new UFDouble(); // ϼƼ˰ϼ
+ int i = 0;
+ com.alibaba.fastjson.JSONArray paramsSaleInvoiceBVOsJSA = (com.alibaba.fastjson.JSONArray) bject.get("SaleInvoiceBVOs"); // ʵ
+ List paramsSaleInvoiceBVOs = paramsSaleInvoiceBVOsJSA.toJavaList(JSONObject.class);
+ SaleInvoiceBVO[] newSaleInvoiceBVOs = new SaleInvoiceBVO[paramsSaleInvoiceBVOs.size()]; // ʵ
+ for (SaleInvoiceBVO saleInvoiceBVO : saleInvoiceBVOs) {
+ String csaleinvoicebid = saleInvoiceBVO.getCsaleinvoicebid(); // ӱid
+ // ɸѡӱ
+ List newParamsSaleInvoiceBVOs = paramsSaleInvoiceBVOs.stream().filter(item -> {
+ String parCsaleinvoicebid = item.getString("csaleinvoicebid") + "";
+ return csaleinvoicebid.equals(parCsaleinvoicebid);
+ }).toList();
+ if (newParamsSaleInvoiceBVOs.size() <= 0) {
+ continue;
+ }
+ JSONObject paramSaleInvoiceBVO = newParamsSaleInvoiceBVOs.get(0); // ӱ
+ SaleInvoiceBVO newSaleInvoiceBVO = new SaleInvoiceBVO();
+// BeanUtil.copyProperties(saleInvoiceBVO,newSaleInvoiceBVO);
+ // ¡ȡֵԭӱ۷Ʊ
+ newSaleInvoiceBVO = (SaleInvoiceBVO) CloneUtil.depthClone(saleInvoiceBVO);
+ // ֵ֮ʵʱֶ
+ newSaleInvoiceBVO.setCsaleinvoicebid(null); // Ʊʵid
+ newSaleInvoiceBVO.setDbilldate(newSaleInvoiceHVO.getDbilldate()); // Ʊ
+ newSaleInvoiceBVO.setNastnum(new UFDouble(paramSaleInvoiceBVO.getString("nastnum"))); //
+ newSaleInvoiceBVO.setNnum(new UFDouble(paramSaleInvoiceBVO.getString("nnum"))); //
+ newSaleInvoiceBVO.setNtax(new UFDouble(paramSaleInvoiceBVO.getString("ntax"))); // ˰
+ newSaleInvoiceBVO.setNmny(new UFDouble(paramSaleInvoiceBVO.getString("nmny"))); // ˰
+ newSaleInvoiceBVO.setNtaxmny(new UFDouble(paramSaleInvoiceBVO.getString("ntaxmny"))); // Ҽ˰ϼ
+ newSaleInvoiceBVO.setNcaltaxmny(new UFDouble(paramSaleInvoiceBVO.getString("ncaltaxmny"))); // ˰
+ newSaleInvoiceBVO.setNorigmny(new UFDouble(paramSaleInvoiceBVO.getString("norigmny"))); // ˰
+ newSaleInvoiceBVO.setNorigtaxmny(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny"))); // ˰ϼ
+ newSaleInvoiceBVO.setCopposesrcbid(paramSaleInvoiceBVO.getString("csaleinvoicebid")); // ԳԴӱid
+ newSaleInvoiceBVO.setNqtunitnum(null); //
+ newSaleInvoiceBVO.setCsaleinvoiceid(null); // Ʊid
+ newSaleInvoiceBVO.setNtotalcostnum(null); // ۼƳɱ
+ newSaleInvoiceBVO.setNtotalincomemny(null); // ۼȷӦս
+ newSaleInvoiceBVO.setNtotalincomenum(null); // ۼȷӦ
+ newSaleInvoiceBVO.setVchangerate("1.00/1.00"); //
+ newSaleInvoiceBVOs[i++] = newSaleInvoiceBVO;
+ sumNum = sumNum.add(new UFDouble(paramSaleInvoiceBVO.getString("nnum")));
+ sumNtax = sumNtax.add(new UFDouble(paramSaleInvoiceBVO.getString("ntax")));
+ sumNcaltaxmny = sumNcaltaxmny.add(new UFDouble(paramSaleInvoiceBVO.getString("ncaltaxmny")));
+ sumNorigmny = sumNorigmny.add(new UFDouble(paramSaleInvoiceBVO.getString("norigmny")));
+ sumNorigtaxmny = sumNorigtaxmny.add(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny")));
+ }
+
+ // ¡ȡֵԭӱ۷Ʊ
+ newSaleInvoiceHVO = (SaleInvoiceHVO) CloneUtil.depthClone(saleInvoiceHVO);
+ // ֵ֮ʵʱֶ
+ newSaleInvoiceHVO.setCsaleinvoiceid(null); // Ʊʵid
+ newSaleInvoiceHVO.setVbillcode(null); // Ʊ
+ newSaleInvoiceHVO.setDbilldate(new UFDate()); // Ʊ
+ newSaleInvoiceHVO.setDmakedate(new UFDate()); // Ƶ
+ newSaleInvoiceHVO.setBsubunitflag(UFBoolean.TRUE); // ֱ
+ newSaleInvoiceHVO.setFopposeflag(2); // Գ 2Գɣ
+ newSaleInvoiceHVO.setFstatusflag(1); // ״̬ 1̬
+ newSaleInvoiceHVO.setNtotalastnum(null); //
+ newSaleInvoiceHVO.setNtotalorigsubmny(null); // ֽ
+ newSaleInvoiceHVO.setNtotalorigmny(null); // ˰ϼ
+ newSaleInvoiceHVO.setVopposesrccode(saleInvoiceHVO.getVbillcode()); // ԳԴƱ
+ newSaleInvoiceHVO.setCopposesrcid(saleInvoiceHVO.getCsaleinvoiceid()); // ԳԴƱid
+ newSaleInvoiceHVO.setApprover(null); //
+ newSaleInvoiceHVO.setTaudittime(null); //
+
+ // װVO
+ saleInvoiceVO.setParentVO(newSaleInvoiceHVO);
+ saleInvoiceVO.setChildrenVO(newSaleInvoiceBVOs);
+ return saleInvoiceVO;
+ } catch (Exception e) {
+ throw new BusinessException(e.getMessage());
+ }
+ }
+
+ /**
+ * 忪ƱVO
+ *
+ * @param ivApplicationHeadVO ԭƱʵ
+ * @param ivApplicationBodyVOS ԭƱʵ
+ * @param bject bip
+ * @param returnApproveSaleInvoiceVOs ɵĺ۷Ʊʵ
+ * @return
+ * @throws Exception
+ */
+ public static IVApplicationAggVO makeNewRedRushIVApplicationAggVO(IVApplicationHeadVO ivApplicationHeadVO, IVApplicationBodyVO[] ivApplicationBodyVOS, JSONObject bject, SaleInvoiceVO[] returnApproveSaleInvoiceVOs) throws Exception {
+ try {
+ IVApplicationAggVO ivApplicationAggVO = new IVApplicationAggVO();
+ IVApplicationHeadVO newivApplicationHeadVO = new IVApplicationHeadVO(); // ʵ
+
+ // ȡɺ巢Ʊʵ
+ String csaleinvoiceid = returnApproveSaleInvoiceVOs[0].getParentVO().getCsaleinvoiceid();
+ String[] ids = {csaleinvoiceid};
+ SaleInvoiceVO[] rpSaleInvoiceVOs = NCLocator.getInstance().lookup(ISaleinvoiceQueryAPI.class)
+ .queryVOByIDs(ids);
+ SaleInvoiceHVO rpSaleInvoiceHVO = rpSaleInvoiceVOs[0].getParentVO();
+
+ // ʵԸֵ
+// BeanUtil.copyProperties(ivApplicationHeadVO,newivApplicationHeadVO, CopyOptions.create().setIgnoreNullValue(true));
+ // ¡ȡֵԭӱƱ
+ newivApplicationHeadVO = (IVApplicationHeadVO) CloneUtil.depthClone(ivApplicationHeadVO);
+ // ݲжǷΪֺ
+ boolean isPartHCFlag = false;
+ UFDouble paramNtotalorigmny = new UFDouble(bject.getString("ntotalorigmny")); // ˰ϼƣ
+ UFDouble ntotalorigmny = ivApplicationHeadVO.getJshj(); // ԭƱ˰ϼ
+ // 뿪ƱԴ˰ϼƱȽֵ㣬Ϊֺ
+ if (ntotalorigmny.add(paramNtotalorigmny).compareTo(UFDouble.ZERO_DBL) > 0) {
+ isPartHCFlag = true;
+ }
+ UFDouble sumXmsl = new UFDouble(); // ϼ
+ UFDouble sumXmje = new UFDouble(); // ϼƽ
+ UFDouble sumXmjshj = new UFDouble(); // ϼƼ˰ϼ
+ UFDouble sumBchcje = new UFDouble(); // ϼƱκ
+ UFDouble sumSe = new UFDouble(); // ϼ˰
+ // ʵԸֵ
+ int i = 0;
+ com.alibaba.fastjson.JSONArray paramsSaleInvoiceBVOsJSA = (com.alibaba.fastjson.JSONArray) bject.get("SaleInvoiceBVOs"); // ʵ
+ List paramsSaleInvoiceBVOs = paramsSaleInvoiceBVOsJSA.toJavaList(JSONObject.class);
+ IVApplicationBodyVO[] newivApplicationBodyVOS = new IVApplicationBodyVO[paramsSaleInvoiceBVOs.size()]; // ʵ
+ for (IVApplicationBodyVO ivApplicationBodyVO : ivApplicationBodyVOS) {
+ String src_pkdetail = ivApplicationBodyVO.getSrc_pkdetail(); // Դid
+ // ɸѡӱ
+ List newParamsSaleInvoiceBVOs = paramsSaleInvoiceBVOs.stream().filter(item -> {
+ String parCsaleinvoicebid = item.getString("csaleinvoicebid") + "";
+ return src_pkdetail.equals(parCsaleinvoicebid);
+ }).toList();
+ if (newParamsSaleInvoiceBVOs.size() <= 0) {
+ continue;
+ }
+ JSONObject paramSaleInvoiceBVO = newParamsSaleInvoiceBVOs.get(0); // ӱ
+ IVApplicationBodyVO newivApplicationBodyVO = new IVApplicationBodyVO();
+// BeanUtil.copyProperties(ivApplicationBodyVO,newivApplicationBodyVO, CopyOptions.create().setIgnoreNullValue(true));
+ // ¡ȡֵԭӱƱ
+ newivApplicationBodyVO = (IVApplicationBodyVO) CloneUtil.depthClone(ivApplicationBodyVO);
+ // ֵ֮ʵʱֶ
+ newivApplicationBodyVO.setPk_ivappdetail(null); // Ʊʵid
+ newivApplicationBodyVO.setBillno(null); // Ʊʵ嵥ݺ
+ newivApplicationBodyVO.setSe(new UFDouble(paramSaleInvoiceBVO.getString("ntax"))); // ˰
+ newivApplicationBodyVO.setXmsl(new UFDouble(paramSaleInvoiceBVO.getString("nnum"))); //
+ newivApplicationBodyVO.setXmje(new UFDouble(paramSaleInvoiceBVO.getString("norigmny"))); //
+ newivApplicationBodyVO.setXmjshj(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny"))); // ˰ϼ
+ newivApplicationBodyVO.setBchcje(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny")).multiply(new UFDouble(-1))); // κ = β
+ newivApplicationBodyVOS[i++] = newivApplicationBodyVO;
+ sumSe = sumSe.add(new UFDouble(paramSaleInvoiceBVO.getString("ntax")));
+ sumXmsl = sumXmsl.add(new UFDouble(paramSaleInvoiceBVO.getString("nnum")));
+ sumXmje = sumXmje.add(new UFDouble(paramSaleInvoiceBVO.getString("norigmny")));
+ sumXmjshj = sumXmjshj.add(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny")));
+ sumBchcje = sumBchcje.add(new UFDouble(paramSaleInvoiceBVO.getString("norigtaxmny")).multiply(new UFDouble(-1)));
+ }
+ // ֵ֮ʵʱֶ
+ newivApplicationHeadVO.setPk_ivapplication(null); // Ʊ뵥ʵid
+ newivApplicationHeadVO.setBillno(null); // ݺ
+ newivApplicationHeadVO.setPreparedate(new UFDate()); //
+ newivApplicationHeadVO.setJshj(sumXmjshj); // ˰ϼ
+ newivApplicationHeadVO.setHjje(sumXmje); // ϼƽ
+ newivApplicationHeadVO.setHjse(sumSe); // ϼ˰
+ newivApplicationHeadVO.setBchcje(sumBchcje); // κ
+ newivApplicationHeadVO.setHzfp(UFBoolean.TRUE); // ַƱ
+ newivApplicationHeadVO.setSrc_billtype(SOBillType.Invoice.getCode()); // Դ
+ newivApplicationHeadVO.setSrc_tradetype(rpSaleInvoiceHVO.getCtrantypeid()); // Դ
+ newivApplicationHeadVO.setTranstypecode(rpSaleInvoiceHVO.getVtrantypecode()); // Դͱ
+ newivApplicationHeadVO.setSrc_pkbusibill(rpSaleInvoiceHVO.getCsaleinvoiceid()); // Դid
+ newivApplicationHeadVO.setSrc_billno(rpSaleInvoiceHVO.getVbillcode()); // Դݱ
+ newivApplicationHeadVO.setHcyy("2"); // ԭ2Ʊ
+
+ // װVO
+ ivApplicationAggVO.setParentVO(newivApplicationHeadVO);
+ ivApplicationAggVO.setChildrenVO(newivApplicationBodyVOS);
+ return ivApplicationAggVO;
+ } catch (Exception e) {
+ throw new BusinessException(e.getMessage());
+ }
+ }
+
+ public IUAPQueryBS getQueryService() {
+ return NCLocator.getInstance().lookup(IUAPQueryBS.class);
+ }
+
+}
\ No newline at end of file