diff --git a/lc123/cloud/app/api/controller/ArSettleRecordController.java b/lc123/cloud/app/api/controller/ArSettleRecordController.java index e69de29..dab8ddd 100644 --- a/lc123/cloud/app/api/controller/ArSettleRecordController.java +++ b/lc123/cloud/app/api/controller/ArSettleRecordController.java @@ -0,0 +1,104 @@ +package tqq9.lc123.cloud.app.api.controller; + +import com.alibaba.fastjson.JSONObject; +import com.drew.lang.annotations.NotNull; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.operate.result.IOperateInfo; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.openapi.common.custom.annotation.ApiController; +import kd.bos.openapi.common.custom.annotation.ApiParam; +import kd.bos.openapi.common.custom.annotation.ApiPostMapping; +import kd.bos.openapi.common.result.CustomApiResult; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import tqq9.lc123.cloud.app.api.utils.ApiResultExt; +import tqq9.lc123.cloud.app.api.utils.Constants; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + + +/** + * 应收结算记录反结算接口 + */ +@ApiController(value = "ArSettleRecordController", desc = "应收结算记录api接口,自定义插件") +public class ArSettleRecordController { + private final static Log logger = LogFactory.getLog(ArSettleRecordController.class); + public static final String LC_SETTLERECORD_PROPERTIES = "id,billno,org,mainbillid,mainbillentryid,totalsettleamt,localtotalsettleamt,settlerelation,settletype,mainbilltype," + + "exchangerate,settledate,corebillid,corebillentryid,settleentry,billentity,billstatus,isvoucher,entry.billtype,entry.currency,entry.settleamt,entry.billid,entry.billentryid," + + "entry.e_exchangerate,entry.billnum,e_settleentry,iswrittenoff,hadwrittenoff,e_hadwrittenoff,e_billentity,settleseq,mainpayableamt,entry.payableamt,entry.localsettleamt,autosettletype"; //应收结算记录 + + + @ApiPostMapping(value = "/ArSettleRecord_Unsettle", desc = "应收结算记录反结算api接口") + public CustomApiResult LC_ArSettleRecord_Unsettle + (@NotNull @ApiParam(value = "入参", example = "") ArrayList data) { + + + List results = new ArrayList<>(); + ApiResultExt resultExt = new ApiResultExt(); + QFilter qFilter = new QFilter("entry.billnum", QCP.in, data); + qFilter.and("billstatus", QCP.equals, "C"); + DynamicObject[] ar_settlerecords = BusinessDataServiceHelper.load(Constants.AR_SETTLERECORD, LC_SETTLERECORD_PROPERTIES, qFilter.toArray()); + HashMap map=new HashMap(); + for (DynamicObject ar_settlerecord : ar_settlerecords) { + DynamicObjectCollection entry = ar_settlerecord.getDynamicObjectCollection("entry"); + for (DynamicObject dynamicObject : entry) { + map.put(dynamicObject.getString("billnum"),ar_settlerecord.getString("id")); + } + } + Integer index=0; + for (int i = 0; i < data.size(); i++) { + String billno = data.get(i); + JSONObject keys = new JSONObject(); + keys.put("billno",billno); + ApiResultExt.ResultBean resultBean = new ApiResultExt.ResultBean(); + ApiResultExt.Error error = new ApiResultExt.Error(); + error.setRowMsg(new ArrayList()); + resultBean.setBillIndex(i); + resultBean.setKeys(keys); + resultBean.setNumber(billno); + resultBean.setType(Constants.TYPE_UNSETTLE); + if(map.containsKey(billno)){ + resultBean.setId(map.get(billno)); + resultBean.setBillStatus(true); + }else{ + List rowMsg = error.getRowMsg(); + rowMsg.add("根据传入编号:"+billno+"未找到对应结算记录,请核销后再进行反核销"); + error.setRowMsg(rowMsg); + error.setEntityKey(Constants.AR_SETTLERECORD); + error.setKeys(keys); + resultBean.setId(""); + resultBean.setBillStatus(false); + index++; + } + resultBean.setErrors(error); + results.add(resultBean); + } + + + OperateOption option = OperateOption.create(); + OperationResult unsettleResult = OperationServiceHelper.executeOperate(Constants.TYPE_UNSETTLE, Constants.AR_SETTLERECORD, ar_settlerecords, option); + List allErrorOrValidateInfo = unsettleResult.getAllErrorOrValidateInfo(); + if (!allErrorOrValidateInfo.isEmpty()) { + index++; + } + for (IOperateInfo iOperateInfo : allErrorOrValidateInfo) { + HashMap returnMap = resultExt.addErrorToResultBeanByNumber(results, iOperateInfo, Constants.AR_SETTLERECORD); + results= (List) returnMap.get("ResultBeanList"); + } + int failCount = index;//失败数量 + int successCount = data.size() - index;//成功数量 + resultExt.setFailCount(failCount); + resultExt.setSuccessCount(successCount); + resultExt.setResult(results); + return CustomApiResult.success(resultExt); + } +} + diff --git a/lc123/cloud/app/api/controller/CasPaybillController.java b/lc123/cloud/app/api/controller/CasPaybillController.java index e69de29..acdd153 100644 --- a/lc123/cloud/app/api/controller/CasPaybillController.java +++ b/lc123/cloud/app/api/controller/CasPaybillController.java @@ -0,0 +1,157 @@ +package tqq9.lc123.cloud.app.api.controller; + +import com.alibaba.fastjson.JSONObject; +import com.drew.lang.annotations.NotNull; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.operate.result.IOperateInfo; +import kd.bos.entity.operate.result.OperateInfo; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.openapi.common.custom.annotation.ApiController; +import kd.bos.openapi.common.custom.annotation.ApiParam; +import kd.bos.openapi.common.custom.annotation.ApiPostMapping; +import kd.bos.openapi.common.result.CustomApiResult; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import tqq9.lc123.cloud.app.api.utils.ApiResultExt; +import tqq9.lc123.cloud.app.api.utils.Constants; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + + +/** + * 应收结算记录反结算接口 + */ +@ApiController(value = "CasPaybillController", desc = "付款单api接口,自定义插件") +public class CasPaybillController { + public static final String LC_PAYBILL_PROPERTIES = "billno,id,billstatus,bizdate,billtype,paymenttype,payeetype,description,issingle,org,payeracctcash,payeracctbank,payerbank," + + "payee,payeeformid,payeename,payeeaccformid,payeeacctbank,payeebanknum,payeebank,payeebankname,actpayamt,currency,exchangerate,localamt,settletype,settletnumber,fundflowitem,usage," + + "expectdate,reccountry,recprovince,reccity,recaccbankname,recbanknumber,sourcetype,sourcebilltype,sourcebillid,cashier,paydate,bankcheckflag,bankcheckflag_tag,entrance,entrustorg," + + "applyorg,e_actamt,e_localamt,e_fundflowitem,e_remark,e_payableAmt,e_payablelocamt,e_discountamt,e_discountlocamt,e_sourcebillentryid,e_unsettledamt,e_settledamt,e_unsettledlocalamt," + + "e_unlockamt,e_material,e_expenseitem,e_corebillno,e_corebillentryseq,e_sourcebillid,e_corebillid,e_corebillentryid,e_corebilltype,conbillid,conbillentryid,settleorg,paymentchannel," + + "payeetype,payee,isvoucher,isdiffcur,dpamt,agreedrate,fee,dpcurrency,iscrosspay,dplocalamt,dpexchangerate,feecurrency,feeactbank,lossamt,draftbill,exratetable,exratedate,inneraccount," + + "acttradedate,feepayer,createtime,payeeacctcash,openorg,totalpayamt,payquotation,dppayquotation,agreedquotation,settletype,settletype.settlementtype,settletnumber,singlestream,basecurrency," + + "paymentidentify,feepaydate,feepay,matchamountpay,unmatchamountpay,unmatchamountrec,matchamountrec,matchflag,bizdate,auditdate,sourcebilltype,entry,entry.e_sourcebillid,cas_draftinfo.draftbillinfo," + + "cas_draftinfo.transamount,cas_draftinfo.draftbilllogid,entry.e_scheid,cas_draftinfo.srcbillindex,cas_draftinfo.paybillcurrency,entry.e_dpamt,tqq9_digital_receipt,tqq9_billstatus,iswaitsche,priority,changestatus," + + "istop,entry.e_refundamt,entry.e_remainrefundamt,totalrefundedamt,totalremainrefundamt,localrefundedamt,localremainrefundamt"; //应收结算记录 + private final static Log logger = LogFactory.getLog(CasPaybillController.class); + + @ApiPostMapping(value = "/CasPaybill_StatusChange", desc = "付款单状态变更api接口") + public CustomApiResult LC_CasPaybill_StatusChange + (@NotNull @ApiParam(value = "入参", example = "") List> data) throws ParseException { + List results = new ArrayList<>(); + ApiResultExt resultExt = new ApiResultExt(); + List billnos = new ArrayList<>(); + HashMap billStatusMap = new HashMap<>(); + HashMap billIdMap = new HashMap<>(); + Set validValues = new HashSet<>(); + validValues.add("4"); + validValues.add("5"); + validValues.add("6"); + validValues.add("7"); + validValues.add("8"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 目标日期格式 + for (int i = 0; i < data.size(); i++) { + HashMap dataMap = data.get(i); + String billno = (String) dataMap.get("billno"); + billnos.add(billno); + billStatusMap.put(billno, (String) dataMap.get("billstatus")); + } + QFilter qFilter = new QFilter("billno", QCP.in, billnos); + DynamicObject[] cas_paybills = BusinessDataServiceHelper.load(Constants.CAS_PAYBILL, LC_PAYBILL_PROPERTIES, qFilter.toArray()); + Integer index = 0; + for (int i = 0; i < data.size(); i++) { + HashMap dataMap = data.get(i); + String billno = (String) dataMap.get("billno"); + JSONObject keys = new JSONObject(); + keys.put("billno", billno); + ApiResultExt.ResultBean resultBean = new ApiResultExt.ResultBean(); + ApiResultExt.Error error = new ApiResultExt.Error(); + error.setRowMsg(new ArrayList()); + resultBean.setBillIndex(i); + resultBean.setKeys(keys); + resultBean.setNumber(billno); + resultBean.setType(Constants.TYPE_UPDATE); + Boolean iserror = true; + for (DynamicObject cas_paybill : cas_paybills) { + if (billno.equals(cas_paybill.getString("billno"))) { + Date bizdate = dateFormat.parse(dataMap.get("bizdate").toString()); +// cas_paybill.set("bizdate", bizdate); +// cas_paybill.set("openorg.number", dataMap.get("openorg_number")); +// cas_paybill.set("settletype.number", dataMap.get("settletype_number")); +// cas_paybill.set("payeracctbank.number", dataMap.get("bankaccountnumber")); +// cas_paybill.set("tqq9_billstatus", dataMap.get("billstatus")); + cas_paybill.set("description", dataMap.get("description")); + cas_paybill.set("tqq9_digital_receipt", dataMap.get("tqq9_digital_receipt")); + resultBean.setId(cas_paybill.getString("id")); + resultBean.setBillStatus(true); + iserror = false; + if(!validValues.contains((String)dataMap.get("billstatus"))){ + List rowMsg = error.getRowMsg(); + rowMsg.add("传入编号:" + billno + "的交易状态有误"); + error.setRowMsg(rowMsg); + error.setEntityKey(Constants.CAS_PAYBILL); + error.setKeys(keys); + resultBean.setId(""); + resultBean.setBillStatus(false); + index++; + } + } + } + if (iserror) { + List rowMsg = error.getRowMsg(); + rowMsg.add("根据传入编号:" + billno + "未找到对应付款单"); + error.setRowMsg(rowMsg); + error.setEntityKey(Constants.CAS_PAYBILL); + error.setKeys(keys); + resultBean.setId(""); + resultBean.setBillStatus(false); + index++; + } + resultBean.setErrors(error); + results.add(resultBean); + } + OperateOption option = OperateOption.create(); + + for (DynamicObject cas_paybill : cas_paybills) { + String billstatus = billStatusMap.get(cas_paybill.getString("billno")); + if (StringUtils.equals("5", billstatus)) { +// cas_paybill.set("billstatus", "D"); + OperationResult payResult = OperationServiceHelper.executeOperate(Constants.TYPE_PAY, Constants.CAS_PAYBILL, new DynamicObject[]{cas_paybill}, option); + List allErrorOrValidateInfo = payResult.getAllErrorOrValidateInfo(); + if (!allErrorOrValidateInfo.isEmpty()) { + index++; + } + for (IOperateInfo iOperateInfo : allErrorOrValidateInfo) { + HashMap returnMap = resultExt.addErrorToResultBeanByNumber(results, iOperateInfo, Constants.CAS_PAYBILL); + results = (List) returnMap.get("ResultBeanList"); + } + } else if (StringUtils.equals("4", billstatus) || StringUtils.equals("6", billstatus)) { + cas_paybill.set("billstatus", "F"); + SaveServiceHelper.save(new DynamicObject[]{cas_paybill}); + } else if (StringUtils.equals("7", billstatus)) { + cas_paybill.set("billstatus", "E"); + SaveServiceHelper.save(new DynamicObject[]{cas_paybill}); + } else if (StringUtils.equals("8", billstatus)) { + cas_paybill.set("billstatus", "G"); + SaveServiceHelper.save(new DynamicObject[]{cas_paybill}); + } + } + int failCount = index;//失败数量 + int successCount = data.size() - index;//成功数量 + resultExt.setFailCount(failCount); + resultExt.setSuccessCount(successCount); + resultExt.setResult(results); + return CustomApiResult.success(resultExt); + } +} + diff --git a/lc123/cloud/app/api/utils/ApiResultExt.java b/lc123/cloud/app/api/utils/ApiResultExt.java index e69de29..f83d414 100644 --- a/lc123/cloud/app/api/utils/ApiResultExt.java +++ b/lc123/cloud/app/api/utils/ApiResultExt.java @@ -0,0 +1,213 @@ +package tqq9.lc123.cloud.app.api.utils; + +import com.alibaba.fastjson.JSONObject; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.operate.result.IOperateInfo; +import kd.bos.entity.operate.result.OperateErrorInfo; +import kd.bos.openapi.common.custom.annotation.ApiModel; +import kd.bos.openapi.common.custom.annotation.ApiParam; +import kd.bos.servicehelper.BusinessDataServiceHelper; + +import java.io.Serializable; +import java.util.*; + +@ApiModel +public class ApiResultExt implements Serializable { + @ApiParam("操作失败数量") + private int failCount; + @ApiParam("操作成功数量") + private int successCount; + @ApiParam("返回结果") + private List result; + + public int getFailCount() { + return failCount; + } + + public void setFailCount(int failCount) { + this.failCount = failCount; + } + + public int getSuccessCount() { + return successCount; + } + + public void setSuccessCount(int successCount) { + this.successCount = successCount; + } + + public List getResult() { + return result; + } + + public void setResult(List result) { + this.result = result; + } + + @ApiModel + public static class ResultBean implements Serializable { + + + @ApiParam("数据索引") + private int billIndex; + @ApiParam("接口操作是否成功") + private boolean billStatus; + @ApiParam("错误信息") + private Error errors; + @ApiParam("金蝶单据id") + private String id; + @ApiParam("候选键信息") + private JSONObject keys; + @ApiParam("金蝶单据编号") + private String number; + @ApiParam("接口操作类型") + private String type; + + public int getBillIndex() { + return billIndex; + } + + public void setBillIndex(int billIndex) { + this.billIndex = billIndex; + } + + public boolean isBillStatus() { + return billStatus; + } + + public void setBillStatus(boolean billStatus) { + this.billStatus = billStatus; + } + + public Error getErrors() { + return errors; + } + + public void setErrors(Error errors) { + this.errors = errors; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public JSONObject getKeys() { + return keys; + } + + public void setKeys(JSONObject keys) { + this.keys = keys; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + + public static class Error implements Serializable { + private String entityKey; + private String entryRowIndex; + private JSONObject keys; + private List rowMsg; + private String subEntryRowIndex; + + // Getter 和 Setter + public String getEntityKey() { + return entityKey; + } + + public void setEntityKey(String entityKey) { + this.entityKey = entityKey; + } + + public String getEntryRowIndex() { + return entryRowIndex; + } + + public void setEntryRowIndex(String entryRowIndex) { + this.entryRowIndex = entryRowIndex; + } + + public JSONObject getKeys() { + return keys; + } + + public void setKeys(JSONObject keys) { + this.keys = keys; + } + + public List getRowMsg() { + return rowMsg; + } + + public void setRowMsg(List rowMsg) { + this.rowMsg = rowMsg; + } + + public String getSubEntryRowIndex() { + return subEntryRowIndex; + } + + public void setSubEntryRowIndex(String subEntryRowIndex) { + this.subEntryRowIndex = subEntryRowIndex; + } + } + + public HashMap addErrorToResultBeanByNumber(List resultBeans, IOperateInfo iOperateInfo, String entityKey) { + Set idSet = new HashSet<>(); + for (ResultBean resultBean : resultBeans) { + Error error = resultBean.getErrors(); + resultBean.setBillStatus(false); + String message = iOperateInfo.getMessage(); + String id = iOperateInfo.getPkValue().toString(); + if (StringUtils.equals(resultBean.getId(),id)) { + if (error == null) { + error = new Error(); + error.setRowMsg(new ArrayList()); + } + error.setKeys(resultBean.getKeys()); + error.setEntityKey(entityKey); + List rowMsg = error.getRowMsg(); + rowMsg.add(message); + error.setRowMsg(rowMsg); + resultBean.setErrors(error); + break; + } + } + HashMap returnMap = new HashMap<>(); + returnMap.put("ResultBeanList",resultBeans); + return returnMap; + } + + public static DynamicObject[] removeBillByBillno(DynamicObject[] bills, Set idSet) { + DynamicObject[] tempBills = new DynamicObject[bills.length]; + int index = 0; + + // 遍历原数组,复制不需要删除的元素到 tempBills + for (DynamicObject bill : bills) { + if (!idSet.contains(bill.getString("id"))) { + tempBills[index++] = bill; + } + } + // 使用 Arrays.copyOf 修剪数组到实际大小 + return Arrays.copyOf(tempBills, index); + } + +} diff --git a/lc123/cloud/app/api/utils/Constants.java b/lc123/cloud/app/api/utils/Constants.java index e69de29..a0ba163 100644 --- a/lc123/cloud/app/api/utils/Constants.java +++ b/lc123/cloud/app/api/utils/Constants.java @@ -0,0 +1,17 @@ +package tqq9.lc123.cloud.app.api.utils; + +public class Constants { + //单据类型 + public static final String AR_SETTLERECORD = "ar_settlerecord"; //应收结算记录 + public static final String CAS_PAYBILL = "cas_paybill"; //付款处理 + + //操作类型 + public static final String TYPE_SAVE = "save"; //保存类型 + public static final String TYPE_SUBMIT = "submit"; //提交类型 + public static final String TYPE_AUDIT = "audit"; //审核类型 + + public static final String TYPE_UPDATE = "update"; //更新类型 + public static final String TYPE_ADD = "add"; //新增类型 + public static final String TYPE_UNSETTLE = "unsettle"; //反结算类型 + public static final String TYPE_PAY = "pay"; //付款类型 +} diff --git a/lc123/cloud/app/plugin/form/pm/PurSuggestRptFromPlugin.java b/lc123/cloud/app/plugin/form/pm/PurSuggestRptFromPlugin.java index 909ecc7..62cd312 100644 --- a/lc123/cloud/app/plugin/form/pm/PurSuggestRptFromPlugin.java +++ b/lc123/cloud/app/plugin/form/pm/PurSuggestRptFromPlugin.java @@ -222,6 +222,7 @@ public class PurSuggestRptFromPlugin extends AbstractFormPlugin implements Plugi dynamicObject1.set("seq",i+1);//分录号 dynamicObject1.set("material",materialpurchaseinfo);//物料 dynamicObject1.set("materialname",tqq9_sku.getString("name"));//物料名称 + dynamicObject1.set("unit",tqq9_sku.getDynamicObject("baseunit"));//计量单位 dynamicObject1.set("baseunit",tqq9_sku.getDynamicObject("baseunit"));//基本单位 dynamicObject1.set("rowclosestatus","A");//行关闭状态 dynamicObject1.set("rowterminatestatus","A");//行终止状态