From 92f5446ce88834cfbc2590b4ba8773c6505de761 Mon Sep 17 00:00:00 2001 From: "zzs01@yunemao.com" Date: Wed, 4 Sep 2024 17:16:59 +0800 Subject: [PATCH] =?UTF-8?q?wip:=E5=87=BA=E5=8F=A3=E6=8A=A5=E5=85=B3?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E6=8A=A5=E8=A1=A8,=E5=8E=9F=E5=B8=81?= =?UTF-8?q?=E6=B5=B7=E8=BF=90=E8=B4=B9,=E7=BE=8E=E5=85=83=E6=B5=B7?= =?UTF-8?q?=E8=BF=90=E8=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExportDeclarationDetailsReportPlugin.java | 399 ++++++++++++++++++ 1 file changed, 399 insertions(+) create mode 100644 src/main/java/com/yem/rf/salescommission/ExportDeclarationDetailsReportPlugin.java diff --git a/src/main/java/com/yem/rf/salescommission/ExportDeclarationDetailsReportPlugin.java b/src/main/java/com/yem/rf/salescommission/ExportDeclarationDetailsReportPlugin.java new file mode 100644 index 00000000..11ae47e2 --- /dev/null +++ b/src/main/java/com/yem/rf/salescommission/ExportDeclarationDetailsReportPlugin.java @@ -0,0 +1,399 @@ +package com.yem.rf.salescommission; + +import com.yem.tws.common1.BigDecimalUtils; +import com.yem.wm.utils.RptUtil; +import com.yem.wm.utils.YEM; +import com.yem.wm.utils.groupfunc.GroupConcatFunction; +import com.yem.wm.utils.groupfunc.GroupConcatFunctionByComma; +import com.yem.wm.utils.groupfunc.GroupTopOneFunction; +import kd.bos.algo.DataSet; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.report.AbstractReportListDataPlugin; +import kd.bos.entity.report.FilterInfo; +import kd.bos.entity.report.ReportQueryParam; +import kd.bos.orm.ORM; +import kd.bos.orm.query.QFilter; +import org.apache.commons.compress.utils.Lists; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static com.yem.rf.utils.RFUtils.getBaseQFilter; + +/** + * @Description: 出口报关明细报表 + * @Date: 2024/9/4 10:04 + * @Created: by ZZSLL + */ + +public class ExportDeclarationDetailsReportPlugin extends AbstractReportListDataPlugin { + + private static final String algoKey = ExportDeclarationDetailsReportPlugin.class.getName(); + + + @Override + public DataSet query(ReportQueryParam param, Object o) throws Throwable { + + DataSet declaredocx = queryDeclareDocx(param); + + DataSet declaredocx_relation = queryDeclareDocx_Relation(param); + + DataSet exportinvoice = queryExportInvoice(param); + + DataSet dataSet; + + dataSet = declaredocx.leftJoin(declaredocx_relation) + .on("merged_seq", "rl_merged_seq") + .select(RptUtil.getDataSetFiledAlias(declaredocx), RptUtil.getDataSetFiledAlias(declaredocx_relation)) + .finish(); + + dataSet = dataSet.leftJoin(exportinvoice) + .on("merged_id", "ddd_id_ei_entry_fk") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(exportinvoice)) + .finish(); + + return dataSet; + } + + + /** + * 查询出口报关单 + * 查询出口报关单.报关商品 + * @param param + * @return + */ + private DataSet queryDeclareDocx(ReportQueryParam param) { + + QFilter qFilter = getCommonDeclareDocxFilter(param); + + ArrayList selectfields = Lists.newArrayList(); + selectfields.add("id declaredocx_id"); + selectfields.add("billno yem_declaredocxno");//出口报关单号 + selectfields.add("yem_es_declare_ec.seq merged_seq");//报关商品分录序号 + selectfields.add("yem_es_declare_ec.id merged_id");//报关商品分录序号 + selectfields.add("yem_custombrokers yem_custombrokers");//报关行 + selectfields.add("yem_cfscompnaytxt yem_cfscompnaytxt");//货代公司(文本) + selectfields.add("yem_customer.id yem_customer");//订单客户 + selectfields.add("TO_CHAR(yem_exportdate, 'yyyy-MM-dd') yem_exportdate");//出口日期 + selectfields.add("yem_customer.group.id yem_customer_group");//买方所在国 + selectfields.add("yem_commcountry yem_destinationcount");//贸易国别-目的国 + selectfields.add("yem_es_declare_ec.yem_cusqty yem_qty");//数量 + selectfields.add("yem_es_declare_ec.yem_cushscode yem_hscode");//海关商品编码-出口商品代码 + selectfields.add("yem_es_declare_ec.yem_decmatericalname yem_cncustomclass");//报关分类名称-商品名称中文 + selectfields.add("yem_settlement yem_settlementxt");//结算方式-付款方式 + selectfields.add("yem_currency yem_currency");//结算币别-币别 + selectfields.add("yem_priceitem yem_priceitem");//价格条款-贸易方式 + selectfields.add("yem_es_declare_ec.yem_cusconsalesprice yem_unitprice");//单价 + selectfields.add("yem_es_declare_ec.yem_cusamount yem_amount");//金额 + selectfields.add("yem_realbringbillno yem_ladingno");//提单号 + selectfields.add("yem_sctcompnayname.id yem_sctcompnayname");//船公司 + selectfields.add("yem_cyreightamt yem_cyreightamt");//海运费币别 + selectfields.add("yem_cypmamt yem_cypmamt");//保费币别 + selectfields.add("yem_reightamt yem_seausdamtsum");//海运费(原币)-海运费USD总价 + selectfields.add("yem_premiumamt yem_premiumamt");//保费(原币)-保险费 + selectfields.add("yem_usbexrate yem_usdrate");//美元汇率 + selectfields.add("yem_es_declare_ec.yem_taxrefundrates yem_degrate");//退税率 + selectfields.add("yem_declarenumber yem_declarationno");//报关单号 + + selectfields.add("yem_reightamtbase yem_reightamtbase");//海运费(本位币) + selectfields.add("yem_premiumamtbase yem_premiumamtbase");//保费(本位币) + + + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_es_declaredocx", String.join(",", selectfields), qFilter.toArray()); + + dataSet = dataSet.select(String.join(",", RptUtil.getDataSetFiledAlias(dataSet)) + "," + + // 2、海运费(美元)=海运费(本位币)/美元汇率; + "yem_reightamtbase / yem_usdrate usd_sea_amt, " + + // 3、运保费(美元)=运保费(本位币)/美元汇率; + "yem_premiumamtbase / yem_usdrate usd_pmamt_amt"); + + DataSet aggPort = aggBaseDataPort(qFilter); + + dataSet = dataSet.leftJoin(aggPort) + .on("declaredocx_id", "declaredocx_id_agg_port_fk") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(aggPort)) + .finish(); + + dataSet = doAmountApportionment(dataSet); + + return dataSet; + } + + /** + * 金额分摊处理 + * @param dataSet + * @return + */ + private DataSet doAmountApportionment(DataSet dataSet) { + dataSet = dataSet.addField("0.0", "yem_baseseaamt");//原币海运费 + dataSet = dataSet.addField("0.0", "yem_usdseaamt");//美元海运费 + dataSet = dataSet.addField("0.0", "yem_basepremiumamt");//原币保险费 + dataSet = RptUtil.zeroNullNums(dataSet); + DynamicObjectCollection collection = ORM.create().toPlainDynamicObjectCollection(dataSet.copy()); + Map> map = new LinkedHashMap<>(); + for (DynamicObject d : collection) { + String declaredocxno = d.getString("yem_declaredocxno"); + List list; + if (map.containsKey(declaredocxno)) { + list = map.get(declaredocxno); + } else { + list = new ArrayList<>(); + } + list.add(d); + map.put(declaredocxno, list); + } + + DynamicObjectCollection dc = new DynamicObjectCollection(); + + for (Map.Entry> entry : map.entrySet()) { + List value = entry.getValue(); + + BigDecimal sumAmt = BigDecimal.ZERO; + + for (DynamicObject d : value) { + BigDecimal amount = d.getBigDecimal("yem_amount"); + sumAmt = sumAmt.add(amount); + } + + BigDecimal share_baseseaamt = BigDecimal.ZERO;//原币海运费分摊 + BigDecimal share_usdseaamt = BigDecimal.ZERO;//美元海运费分摊 + for (DynamicObject d : value) { + BigDecimal amount = d.getBigDecimal("yem_amount");//金额 + BigDecimal seausdamtsum = d.getBigDecimal("yem_seausdamtsum");//海运费USD总价 + BigDecimal usdSeaAmt = d.getBigDecimal("usd_sea_amt");//海运费(美元) + + //金额/金额汇总*海运费(原币) + BigDecimal baseseaamt = BigDecimalUtils.div(amount, sumAmt, 10).multiply(seausdamtsum); + baseseaamt = baseseaamt.setScale(2, RoundingMode.HALF_UP); + + //金额/金额汇总*海运费(美元) + BigDecimal usdseaamt = BigDecimalUtils.div(amount, sumAmt, 10).multiply(usdSeaAmt); + usdseaamt = usdseaamt.setScale(2, RoundingMode.HALF_UP); + + //金额/金额汇总*保险费(美元) + + + if (isLastRow(d, value)) { + d.set("yem_baseseaamt", seausdamtsum.subtract(share_baseseaamt)); + d.set("yem_usdseaamt", usdSeaAmt.subtract(share_usdseaamt)); + } else { + share_baseseaamt = share_baseseaamt.add(baseseaamt); + share_usdseaamt = share_usdseaamt.add(usdseaamt); + d.set("yem_baseseaamt", baseseaamt); + d.set("yem_usdseaamt", usdseaamt); + } + + + + + + dc.add(d); + } + } + return RptUtil.plainDataSet(algoKey, dataSet, dc); + } + + private boolean isLastRow(DynamicObject d, List value) { + return value.indexOf(d) == value.size() - 1; + } + + + /** + * 查询出口报关 报关商品对照表 + * 查询需要拼接的字段,完成拼接 + * @param param + * @return + */ + private DataSet queryDeclareDocx_Relation(ReportQueryParam param) { + + QFilter qFilter = getCommonDeclareDocxFilter(param); + + ArrayList selectfields = Lists.newArrayList(); + + selectfields.add("yem_es_declare_ecd.yem_fgseq rl_detail_seq");//商品明细序号 + selectfields.add("yem_es_declare_ecd.yem_decsourceentryidtext rl_detail_id");//商品明细分录行id + selectfields.add("yem_es_declare_ecd.yem_decgoodsseq rl_merged_seq");//报关商品序号 + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_es_declaredocx", String.join(",", selectfields), qFilter.toArray()); + dataSet = dataSet.select("CAST(rl_detail_seq as Integer) rl_detail_seq, CAST(rl_detail_id as Long) rl_detail_id, CAST(rl_merged_seq as Integer) rl_merged_seq"); + + DataSet declaredocx_detail = queryDeclareDocx_Detail(param); + + DataSet delivernotice = queryDeliverNotice(param); + + DataSet salesorder = querySalesOrder(param); + + dataSet = dataSet.leftJoin(declaredocx_detail) + .on("rl_detail_id","detail_id") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(declaredocx_detail)) + .finish(); + + dataSet = dataSet.leftJoin(delivernotice) + .on("main_order_id_ddd_fk", "dn_main_id_fk") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(delivernotice)) + .finish(); + + dataSet = dataSet.leftJoin(salesorder) + .on("dn_main_id_fk", "main_id") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(salesorder)) + .finish(); + + DataSet infoDataSet1 = dataSet.copy().groupBy(new String[]{"rl_merged_seq"}) + .agg(new GroupConcatFunctionByComma(), "yem_bizdate", "yem_shipdate") + .agg(new GroupConcatFunctionByComma(), "yem_contactno", "yem_contactno") + .finish() + .select("rl_merged_seq rl_merged_seq_1, yem_shipdate, yem_contactno"); + + DataSet infoDataSet2 = dataSet.copy().groupBy(new String[]{"rl_merged_seq"}) + .agg(new GroupTopOneFunction(), "yem_declarationele", "yem_declarationele") + .agg(new GroupTopOneFunction(), "rl_detail_id", "rl_detail_id") + .finish() + .select("rl_merged_seq rl_merged_seq_2, yem_declarationele, rl_detail_id"); + + dataSet = infoDataSet1.leftJoin(infoDataSet2) + .on("rl_merged_seq_1", "rl_merged_seq_2") + .select(RptUtil.getDataSetFiledAlias(infoDataSet1), RptUtil.getDataSetFiledAlias(infoDataSet2)) + .finish(); + + dataSet = dataSet.select(String.join(",", RptUtil.getDataSetFiledAlias(dataSet)) + ", rl_merged_seq_1 rl_merged_seq"); + + return dataSet; + } + + /** + * 查询出口报关 商品明细 + * @param param + * @return + */ + private DataSet queryDeclareDocx_Detail(ReportQueryParam param) { + QFilter qFilter = getCommonDeclareDocxFilter(param); + + ArrayList selectfields = Lists.newArrayList(); + + selectfields.add("yem_es_materialinfo.id detail_id"); + selectfields.add("yem_es_materialinfo.yem_coreentryid main_order_id_ddd_fk"); + selectfields.add("yem_es_materialinfo.yem_declarationele yem_declarationele"); + + + return ORM.create().queryDataSet(algoKey, "yem_es_declaredocx", String.join(",", selectfields), qFilter.toArray()); + } + + /** + * 查询销售出库 + * @param param + * @return + */ + private DataSet queryDeliverNotice(ReportQueryParam param) { + + QFilter qFilter = getBaseQFilter(); + + ArrayList selectfields = Lists.newArrayList(); + + selectfields.add("yem_es_materialinfo.yem_coreentryid dn_main_id_fk");//合同分录ID + selectfields.add("yem_bizdate");//业务日期 + + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_es_delivernotice", String.join(",", selectfields), qFilter.toArray()); + return dataSet.select("dn_main_id_fk, TO_CHAR(yem_bizdate, 'yyyy-MM-dd') yem_bizdate"); + } + + + /** + * 查询外销合同 + * @param param + * @return + */ + private DataSet querySalesOrder(ReportQueryParam param) { + + QFilter qFilter = getBaseQFilter(); + + ArrayList selectfields = Lists.newArrayList(); + + selectfields.add("yem_agreementew.billno framework_billno");//框架合同 + selectfields.add("yem_agreementew.billno framework_id");//框架合同 + selectfields.add("billno contact_billno");//外销合同号 + selectfields.add("yem_es_materialinfo.id main_id");//合同分录ID + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_es_salesorder", String.join(",", selectfields), qFilter.toArray()); + dataSet = dataSet.select("main_id, contact_billno, framework_id, framework_billno, " + + // 有框架合同取框架合同号,否则取合同号 + "CASE WHEN framework_billno IS NOT NULL AND framework_billno != '' " + + "THEN framework_billno " + + "ELSE contact_billno " + + "END yem_contactno, " + + // 是否有框架合同,有1.0 没有0.0 + "CASE WHEN framework_billno IS NOT NULL AND framework_billno != '' " + + "THEN 1.0 " + + "ELSE 0.0 " + + "END contains_framework_sign "); + + DataSet framework = dataSet.copy().where("contains_framework_sign = 1.0"); + + framework = framework.groupBy(new String[]{"framework_billno"}) + .agg(new GroupConcatFunctionByComma(), "contact_billno", "yem_orderno") + .finish(); + + framework = framework.select("framework_billno framework_billno_fk, yem_orderno"); + + dataSet = dataSet.leftJoin(framework) + .on("framework_billno", "framework_billno_fk") + .select(RptUtil.getDataSetFiledAlias(dataSet), RptUtil.getDataSetFiledAlias(framework)) + .finish(); + + return dataSet; + } + + public QFilter getCommonDeclareDocxFilter(ReportQueryParam param) { + FilterInfo filter = param.getFilter(); + String fdeclaredocxno = filter.getString("yem_fdeclaredocxno"); + + QFilter qFilter = getBaseQFilter(); + + if (YEM.isNotEmpty(fdeclaredocxno)) { + qFilter.and("billno", "=", fdeclaredocxno); + } + + return qFilter; + } + + /** + * 查询多选基础资料、港口 + * + * @param qFilter + * @return + */ + private DataSet aggBaseDataPort(QFilter qFilter) { + + ArrayList selectfields = Lists.newArrayList(); + selectfields.add("id declaredocx_id_agg_port_fk"); + selectfields.add("yem_shipports.fbasedataid.name yem_departurport");//起运港 + selectfields.add("yem_destports.fbasedataid.name yem_destinationport");//目的港 + + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_es_declaredocx", String.join(",", selectfields), qFilter.toArray()); + + dataSet = dataSet.groupBy(new String[]{"declaredocx_id_agg_port_fk"}) + .agg(new GroupConcatFunctionByComma(), "yem_departurport", "yem_departurport") + .agg(new GroupConcatFunctionByComma(), "yem_destinationport", "yem_destinationport") + .finish(); + return dataSet; + } + + /** + * 查询出口发票 + * @param param + * @return + */ + private DataSet queryExportInvoice(ReportQueryParam param) { + + QFilter qFilter = getBaseQFilter(); + + ArrayList selectfields = Lists.newArrayList(); + selectfields.add("billno exportinvoice_billno"); + selectfields.add("yem_exportinvoice_c.yem_customsdeclaration yem_unit"); + selectfields.add("yem_exportinvoice_c.yem_sourcebillentryid ddd_id_ei_entry_fk"); + DataSet dataSet = ORM.create().queryDataSet(algoKey, "yem_exportinvoice", String.join(",", selectfields), qFilter.toArray()); + return dataSet; + } +}