wip:出口报关明细报表,原币海运费,美元海运费
This commit is contained in:
parent
d428ff953e
commit
92f5446ce8
@ -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<String> 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<String, List<DynamicObject>> map = new LinkedHashMap<>();
|
||||
for (DynamicObject d : collection) {
|
||||
String declaredocxno = d.getString("yem_declaredocxno");
|
||||
List<DynamicObject> 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<String, List<DynamicObject>> entry : map.entrySet()) {
|
||||
List<DynamicObject> 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<DynamicObject> value) {
|
||||
return value.indexOf(d) == value.size() - 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询出口报关 报关商品对照表
|
||||
* 查询需要拼接的字段,完成拼接
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
private DataSet queryDeclareDocx_Relation(ReportQueryParam param) {
|
||||
|
||||
QFilter qFilter = getCommonDeclareDocxFilter(param);
|
||||
|
||||
ArrayList<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user