Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
xuhaihui 2025-11-06 14:12:33 +08:00
commit 27309cc3d0
2 changed files with 226 additions and 9 deletions

View File

@ -1,5 +1,7 @@
package zcgj.zcdev.zcdev.pr.plugin.form;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
@ -18,6 +20,8 @@ import kd.bos.form.operate.FormOperate;
import kd.bos.list.ListShowParameter;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.openapi.common.result.OpenApiResult;
import kd.bos.openapi.common.util.OpenApiSdkUtil;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
@ -95,6 +99,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
filter.and(new QFilter("currency", "=", currencyId));
filter.and(new QFilter("invoicestatus", "!=", "2"));
filter.and(new QFilter("unapplyamount", ">", BigDecimal.ZERO));
filter.and(new QFilter("zcgj_isbind", "=", false)); //发票被 rim_expense_relation 关系绑定
QFilter filter1 = new QFilter("isclaimed", "=", true);
filter1.and(new QFilter("billstatus", "=", "C"));
DynamicObject contract = (DynamicObject)this.getModel().getValue("zcgj_contract");
@ -105,34 +110,35 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
DynamicObjectCollection contInvEntryCol = this.getModel().getEntryEntity("zcgj_entryentity");
if (contInvEntryCol.size() > 0) {
List<Long> selectedInvIds = new ArrayList(8);
for(DynamicObject contInvEntryObj : contInvEntryCol) {
for(DynamicObject contInvEntryObj : contInvEntryCol) {//剔除合同下的发票
DynamicObject invoice = contInvEntryObj.getDynamicObject("zcgj_invoice");
selectedInvIds.add(invoice.getLong("id"));
}
filter1.and(new QFilter("id", "not in", selectedInvIds));
}
filter1.and(new QFilter("zcgj_isbind", "=", false));
ListShowParameter param = ShowFormHelper.createShowListForm("ec_in_invoice_f7", true);
param.getListFilterParameter().setFilter(filter.or(filter1));
// param.getListFilterParameter().setFilter(filter.or(filter1));
param.setMultiSelect(true);
param.setCloseCallBack(new CloseCallBack(this, entryType));
param.getOpenStyle().setShowType(ShowType.Modal);
this.getView().showForm(param);
}else{
this.getView().showErrorNotification("请选择合同!");
}
}
protected void invoiceCloseCallBack(ClosedCallBackEvent event) {
ListSelectedRowCollection rows = (ListSelectedRowCollection)event.getReturnData();
DynamicObject[] invArr = new DynamicObject[rows.size()];
List<DynamicObject> invList= new ArrayList<>(rows.size());
int index = 0;
DynamicObject upContract = (DynamicObject)this.getModel().getValue("zcgj_contract");
for(ListSelectedRow row : rows) {
Object invoicePk = row.getPrimaryKeyValue().toString();
int rowIndex = this.getModel().createNewEntryRow("zcgj_entryentity");
this.getModel().setValue("zcgj_invoice", invoicePk.toString(), rowIndex);
DynamicObject invoice = BusinessDataServiceHelper.loadSingle(invoicePk, "ec_in_invoice", "unapplyinvtax,unapplyamount,isClaimed,contract,project,connecttype,currency,totalamount,totaltax,totaloftaxamount");
DynamicObject invoice = BusinessDataServiceHelper.loadSingle(invoicePk, "ec_in_invoice", "unapplyinvtax,unapplyamount,isClaimed,contract,project,connecttype,currency,totalamount,totaltax,totaloftaxamount,serialno,candeduct,zcgj_isbind");
this.getModel().setValue("zcgj_invoicecurrency", invoice.getDynamicObject("currency") == null ? Long.valueOf("0") : invoice.getDynamicObject("currency").getPkValue(), rowIndex);
this.getModel().setValue("zcgj_invoiceamount", invoice.getBigDecimal("totalamount"), rowIndex);
this.getModel().setValue("zcgj_invoicetax", invoice.getBigDecimal("totaltax"), rowIndex);
@ -145,8 +151,11 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
invoice.set("contract", upContract);
invoice.set("project", (DynamicObject)this.getModel().getValue("zcgj_project"));
invoice.set("connecttype", "contract");
invoice.set("zcgj_isbind", true);
invList.add(invoice);
}
SaveServiceHelper.save(invArr);
bindInvoice(invList,"60");
this.getView().invokeOperation("invoicesave");
}
@ -257,6 +266,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
invoice.set("contract", upContract);
invoice.set("project", (DynamicObject)this.getModel().getValue("zcgj_project"));
invoice.set("connecttype", "contract");
invoice.set("zcgj_isbind", true);
invArr.add(invoice);
}
}
@ -264,6 +274,7 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
if (invArr.size() > 0) {
SaveServiceHelper.save((DynamicObject[])invArr.toArray(new DynamicObject[invoices.size()]));
bindInvoice(invArr,"60");
}
this.getView().invokeOperation("invoicesave");
}
@ -310,19 +321,23 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
}
if (!updateInvoicePks.isEmpty()) {
DynamicObject[] invoices = BusinessDataServiceHelper.load("ec_in_invoice", "isinvoiceclaim,isclaimed,contract,project,connecttype",
DynamicObject[] invoices = BusinessDataServiceHelper.load("ec_in_invoice", "isinvoiceclaim,isclaimed,contract,project,connecttype,serialno,zcgj_isbind",
new QFilter[]{new QFilter("id", "in", updateInvoicePks)});
List<DynamicObject> invList = new ArrayList<>();
for(DynamicObject invoice : invoices) {
if (!invoice.getBoolean("isinvoiceclaim")) {
invoice.set("isclaimed", false);
invoice.set("contract", (Object)null);
invoice.set("project", (Object)null);
invoice.set("connecttype", "null");
invoice.set("zcgj_isbind", false);
invList.add(invoice);
}
}
SaveServiceHelper.save(invoices);
//删除发票和单据绑定关系
//deleteInvoiceBind(invoices);
bindInvoice(invList,"1");
}
DeleteServiceHelper.delete(subDT, delPks);
@ -331,4 +346,108 @@ public class OutContractFinaceConfirmeInvoicePlugin extends AbstractBillPlugIn i
}
}
//删除发票 结束
//绑定发票
public void bindInvoice(List<DynamicObject> invArr,String status){
Object pkValue = this.getModel().getDataEntity(true).getPkValue();
log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+pkValue);
/*for (DynamicObject invoiceData : invArr) {
}
Object billno = this.getModel().getValue("billno");
String par = "{" +
" \"messageType\": \"billSave\"," +
" \"messageId\": \"202511051701\"," +
" \"data\": {\n" +
" \"billId\": "+pkValue+"," +
" \"billNo\": "+billno+"," +
" \"billType\": \"zcgj_ec_out_finaceconfirm\"," +
" \"status\": \"60\"," +
" \"resource\": \"4\"," +
" \"invoiceData\": [" +
" {" +
" \"serialNo\": "+invArr.get(0).getString("serialno") +
" }" +
" ]" +
" }" +
"}";*/
StringBuilder invoiceDataBuilder = new StringBuilder("[");
for (int i = 0; i < invArr.size(); i++) {
DynamicObject invoiceData = invArr.get(i);
String serialNo = invoiceData.getString("serialno");
invoiceDataBuilder.append("{")
.append("\"serialNo\": \"").append(serialNo).append("\"")
.append("}");
if (i < invArr.size() - 1) {
invoiceDataBuilder.append(",");
}
}
invoiceDataBuilder.append("]");
// 获取单据号
Object billno = this.getModel().getValue("billno");
// 拼接完整 JSON
String par = "{"
+ "\"messageType\": \"billSave\","
+ "\"messageId\": "+System.currentTimeMillis()+","
+ "\"data\": {"
+ "\"billId\": \"" + pkValue + "\","
+ "\"billNo\": \"" + billno + "\","
+ "\"billType\": \"zcgj_ec_out_finaceconfirm\","
+ "\"status\": \""+status+"\"," //1-未用30-在用60-已用
+ "\"resource\": \"4\","
+ "\"invoiceData\": " + invoiceDataBuilder
+ "}"
+ "}";
Gson gson = new Gson();
//String json = gson.toJson(balanceQueryParamApi);
Map<String, Object> params = gson.fromJson(par,
new TypeToken<Map<String, Object>>() {
}.getType());
OpenApiResult balanceData = OpenApiSdkUtil.invoke("/v2/rim/message/service", params);
log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+balanceData.getMessage());
System.out.println();
//当前单据id
/*Object pkValue = this.getModel().getDataEntity(true).getPkValue();
log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定-"+pkValue);
Object billno = this.getModel().getValue("billno");
for (DynamicObject invoiceData : invArr) {
DynamicObject bindData = BusinessDataServiceHelper.newDynamicObject("rim_expense_relation");
bindData.set("resource","4");//报销单来源
bindData.set("view_page","zcgj_ec_out_finaceconfirm");//详情页面
bindData.set("entityid","zcgj_ec_out_finaceconfirm");//报销单实体id
bindData.set("expense_id",pkValue);//报销单id
bindData.set("expense_num",billno);//报销单编号
log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定- billno-"+billno);
bindData.set("serial_no",invoiceData.getString("serialno"));//发票流水号
log.info("OutContractFinaceConfirmeInvoicePlugin:发票绑定- serialno-"+invoiceData.getString("serialno"));
if(invoiceData.getBoolean("candeduct")){
bindData.set("deduction_flag",1);//是否可抵扣
bindData.set("effective_tax_amount",invoiceData.getBigDecimal("totaltax"));//可抵扣税额-税额
}else{
bindData.set("deduction_flag",0);
}
bindData.set("deduction_amount",invoiceData.getBigDecimal("totaltax"));//入账税额-税额
bindData.set("expense_amount",invoiceData.getBigDecimal("totaloftaxamount"));//报销金额-价税合计
bindData.set("status","60");//报销单状态
bindData.set("output_amount",invoiceData.getBigDecimal("totaltax"));//转出金额-税额
bindData.set("use_type",1);//使用类型
bindData.set("billtaxamount",invoiceData.getBigDecimal("totaltax"));//本次报账税额
SaveServiceHelper.saveOperate("rim_expense_relation", new DynamicObject[]{bindData}, null);//支出合同实体
}*/
}
public void deleteInvoiceBind(DynamicObject[] invArr){
/*Long pkValue = (Long)this.getModel().getDataEntity(true).getPkValue();
for (DynamicObject invData : invArr) {
String serialno = invData.getString("serialno");
QFilter idFilter = new QFilter("expense_id", QCP.equals,pkValue);
QFilter serialnoFilter = new QFilter("serial_no", QCP.equals,serialno);
//DynamicObject[] loadInvoiceData = BusinessDataServiceHelper.load("rim_expense_relation", "serial_no", new QFilter[]{idFilter,serialnoFilter});
DeleteServiceHelper.delete("rim_expense_relation", new QFilter[]{idFilter.and(serialnoFilter)});
}*/
}
}

View File

@ -0,0 +1,98 @@
package zcgj.zcdev.zcdev.pr.plugin.operate;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.entity.operate.OperateOptionConst;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.message.api.MessageChannels;
import kd.bos.metadata.dao.MetaCategory;
import kd.bos.metadata.dao.MetadataDao;
import kd.bos.metadata.form.FormMetadata;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.DeleteServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
import kd.bos.workflow.engine.msg.info.MessageInfo;
import java.util.ArrayList;
import java.util.List;
/**
* 支出财务确认单删除时删除发票绑定关系
*/
public class OutFinaceconfirmDelInvoiceBindOp extends AbstractOperationServicePlugIn {
private static final Log log = LogFactory.getLog(OutFinaceconfirmDelInvoiceBindOp.class);
//OperationResult result = OperationServiceHelper.executeOperate("submit", "ec_out_contract_settle", new DynamicObject[]{outContractSettle}, option);
//
public void onPreparePropertys(PreparePropertysEventArgs e) {
e.getFieldKeys().add("zcgj_ec_out_contractid"); //支出结算单id
e.getFieldKeys().add("zcgj_entryentity"); //发票分录
e.getFieldKeys().add("zcgj_entryentity.zcgj_invoice"); //发票
}
@Override
public void endOperationTransaction(EndOperationTransactionArgs e) {
String operationKey = e.getOperationKey();
DynamicObject[] dataEntities = e.getDataEntities();
switch (operationKey) {
case "delete"://删除
case "delback":
deleteInvoiceBind(dataEntities);
break;
}
}
/**
* 删除支出财务确认单发票绑定关系
*/
public void deleteInvoiceBind(DynamicObject[] dataEntities){
for (DynamicObject dataEntity : dataEntities) {
long pkValue = dataEntity.getLong("id");//支出合同确认单id
List<Long> delInvoiceIds = new ArrayList<>();
DynamicObjectCollection invoiceCollection = dataEntity.getDynamicObjectCollection("zcgj_entryentity");
for (DynamicObject dynamicObject : invoiceCollection) {
DynamicObject zcgjInvoice = dynamicObject.getDynamicObject("zcgj_invoice");
if (zcgjInvoice!=null){
delInvoiceIds.add( zcgjInvoice.getLong("id"));
}
}
DynamicObject[] invoices = BusinessDataServiceHelper.load("ec_in_invoice", "isinvoiceclaim,isclaimed,contract,project,connecttype,serialno,zcgj_isbind",
new QFilter[]{new QFilter("id", "in", delInvoiceIds)});
List<String> invoiceserialno = new ArrayList<>();
for (DynamicObject invData : invoices) {
invData.set("isclaimed", false);
invData.set("contract", (Object)null);
invData.set("project", (Object)null);
invData.set("connecttype", "null");
invData.set("zcgj_isbind", false);
String serialno = invData.getString("serialno");
invoiceserialno.add(serialno);
}
if(!delInvoiceIds.isEmpty()){
SaveServiceHelper.save(invoices);
}
QFilter idFilter = new QFilter("expense_id", QCP.equals,pkValue);
QFilter serialnoFilter = new QFilter("serial_no", QCP.in,invoiceserialno);
//DynamicObject[] loadInvoiceData = BusinessDataServiceHelper.load("rim_expense_relation", "serial_no", new QFilter[]{idFilter,serialnoFilter});
DeleteServiceHelper.delete("rim_expense_relation", new QFilter[]{idFilter.and(serialnoFilter)});
}
}
}