清账单和明细单操作插件代码完善
This commit is contained in:
parent
ee1f69f9e4
commit
8d55cf498b
|
|
@ -1,21 +1,28 @@
|
||||||
package shjh.jhzj7.fi.fi.plugin.operate;
|
package shjh.jhzj7.fi.fi.plugin.operate;
|
||||||
|
|
||||||
import kd.bos.dataentity.entity.DynamicObject;
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
||||||
import kd.bos.db.DB;
|
import kd.bos.db.DB;
|
||||||
import kd.bos.db.DBRoute;
|
import kd.bos.db.DBRoute;
|
||||||
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
|
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
|
||||||
import kd.bos.entity.plugin.args.AfterOperationArgs;
|
import kd.bos.entity.plugin.args.AfterOperationArgs;
|
||||||
import kd.bos.entity.plugin.args.BeforeOperationArgs;
|
import kd.bos.entity.plugin.args.BeforeOperationArgs;
|
||||||
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||||
|
import kd.bos.servicehelper.operation.SaveServiceHelper;
|
||||||
import kd.sdk.plugin.Plugin;
|
import kd.sdk.plugin.Plugin;
|
||||||
import shjh.jhzj7.fi.fi.utils.JhzjUtils;
|
import shjh.jhzj7.fi.fi.utils.JhzjUtils;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清账明细单据操作插件
|
* 清账明细单据操作插件
|
||||||
*/
|
*/
|
||||||
public class ClearDetailBillOperation extends AbstractOperationServicePlugIn implements Plugin {
|
public class ClearDetailBillOperation extends AbstractOperationServicePlugIn implements Plugin {
|
||||||
|
|
||||||
private static final String updateDetailByID = "update tk_shjh_clear_acctdetail set fbillstatus='A' where fid=?;";
|
private static final String updateDetailSave = "update tk_shjh_clear_acctdetail set fbillstatus='A' where fid=?;";
|
||||||
|
private static final String updateDetailReject = "update tk_shjh_clear_acctdetail set fbillstatus='E' where fid=?;";
|
||||||
|
private static final String updateClearBillSave = "update tk_shjh_clear_account set fbillstatus='A' where fbillstatus='B' and fid=?;";
|
||||||
|
private static final String clearBillName = "shjh_clear_account";//清账单
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 操作校验通过之后,开启事务之前,触发此事件;
|
* 操作校验通过之后,开启事务之前,触发此事件;
|
||||||
|
|
@ -28,7 +35,8 @@ public class ClearDetailBillOperation extends AbstractOperationServicePlugIn imp
|
||||||
String eok = e.getOperationKey();
|
String eok = e.getOperationKey();
|
||||||
if("submit".equals(eok) || "revoke".equals(eok) || "reject".equals(eok)){
|
if("submit".equals(eok) || "revoke".equals(eok) || "reject".equals(eok)){
|
||||||
DynamicObject[] dos = e.getDataEntities();
|
DynamicObject[] dos = e.getDataEntities();
|
||||||
DynamicObject prinfo;
|
DynamicObject prinfo;//清账明细单
|
||||||
|
DynamicObject clearBillInfo;//清账单
|
||||||
String billno;
|
String billno;
|
||||||
for (int i = 0; i < dos.length; i++) {
|
for (int i = 0; i < dos.length; i++) {
|
||||||
//反审核操作之前系统未把info对象所有属性加载出来,尤其是二开的字段,需要在此处重新load一下
|
//反审核操作之前系统未把info对象所有属性加载出来,尤其是二开的字段,需要在此处重新load一下
|
||||||
|
|
@ -36,7 +44,7 @@ public class ClearDetailBillOperation extends AbstractOperationServicePlugIn imp
|
||||||
billno = prinfo.getString("billno");
|
billno = prinfo.getString("billno");
|
||||||
if("submit".equals(eok)){
|
if("submit".equals(eok)){
|
||||||
if("B".equals(prinfo.getString("billstatus"))){
|
if("B".equals(prinfo.getString("billstatus"))){
|
||||||
e.setCancelMessage(prinfo.getString("billno")+"单据已提交,不允许重复提交");
|
e.setCancelMessage(billno+"单据已提交,不允许重复提交");
|
||||||
e.setCancel(true);
|
e.setCancel(true);
|
||||||
}
|
}
|
||||||
//清账明细单【未清金额】+【账扣金额】+【尾差金额】≥【本次核销金额合计】
|
//清账明细单【未清金额】+【账扣金额】+【尾差金额】≥【本次核销金额合计】
|
||||||
|
|
@ -44,24 +52,56 @@ public class ClearDetailBillOperation extends AbstractOperationServicePlugIn imp
|
||||||
e.setCancelMessage(billno+"【未清金额】+【账扣金额】+【尾差金额】≥【本次核销金额合计】,才允许提交");
|
e.setCancelMessage(billno+"【未清金额】+【账扣金额】+【尾差金额】≥【本次核销金额合计】,才允许提交");
|
||||||
e.setCancel(true);
|
e.setCancel(true);
|
||||||
}
|
}
|
||||||
|
//判断对应的清账单是否已提交,如果是,则不允许提交此明细单
|
||||||
|
clearBillInfo = BusinessDataServiceHelper.loadSingle(prinfo.getString("shjh_clearbillid"),clearBillName,"id,billno,billstatus");
|
||||||
|
if("B".equals(clearBillInfo.getString("billstatus"))){
|
||||||
|
e.setCancelMessage(clearBillInfo.getString("billno")+"清账单已提交,此明细单无需提交");
|
||||||
|
e.setCancel(true);
|
||||||
|
}
|
||||||
}else if("revoke".equals(eok) && !"B".equals(prinfo.getString("billstatus"))){
|
}else if("revoke".equals(eok) && !"B".equals(prinfo.getString("billstatus"))){
|
||||||
//清账明细单【单据状态】=已提交,才允许撤销
|
//清账明细单【单据状态】=已提交,才允许撤销
|
||||||
e.setCancelMessage(billno+"【单据状态】=已提交,才允许撤销");
|
e.setCancelMessage(billno+"【单据状态】=已提交,才允许撤销");
|
||||||
e.setCancel(true);
|
e.setCancel(true);
|
||||||
//若对应的清账单【单据状态】=已提交,则不允许清账明细单撤销,可联系财务驳回
|
//若对应的清账单【单据状态】=已提交,则不允许清账明细单撤销,可联系财务驳回
|
||||||
}else if("reject".equals(eok) && !"B".equals(prinfo.getString("billstatus"))){
|
}else if("reject".equals(eok)){
|
||||||
//清账明细单【单据状态】=已提交,才允许点击驳回按钮
|
if(!"B".equals(prinfo.getString("billstatus"))){
|
||||||
e.setCancelMessage(billno+"【单据状态】=已提交,才允许驳回");
|
//清账明细单【单据状态】=已提交,才允许点击驳回按钮
|
||||||
e.setCancel(true);
|
e.setCancelMessage(billno+"【单据状态】=已提交,才允许驳回");
|
||||||
|
e.setCancel(true);
|
||||||
|
}
|
||||||
|
//判断对应的清账单是否已审核,如果是,则不允许驳回此明细单
|
||||||
|
clearBillInfo = BusinessDataServiceHelper.loadSingle(prinfo.getString("shjh_clearbillid"),clearBillName,"id,billno,billstatus");
|
||||||
|
if("C".equals(clearBillInfo.getString("billstatus"))){
|
||||||
|
e.setCancelMessage(clearBillInfo.getString("billno")+"清账单已审核,此明细单无需驳回");
|
||||||
|
e.setCancel(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkAmount(DynamicObject prinfo){
|
private boolean checkAmount(DynamicObject prinfo){
|
||||||
|
//TODO【未清金额】+【账扣金额】+【尾差金额】≥【本次核销金额合计】
|
||||||
//校验通过返回true
|
BigDecimal billtotal = BigDecimal.ZERO;
|
||||||
return true;
|
BigDecimal a1 = prinfo.getBigDecimal("");
|
||||||
|
BigDecimal a2 = prinfo.getBigDecimal("");
|
||||||
|
BigDecimal a3 = prinfo.getBigDecimal("");
|
||||||
|
if(a1 != null){
|
||||||
|
billtotal = billtotal.add(a1);
|
||||||
|
}
|
||||||
|
//获取分录本次核销金额合计
|
||||||
|
BigDecimal entrytotal = BigDecimal.ZERO;
|
||||||
|
DynamicObjectCollection doc = prinfo.getDynamicObjectCollection("");//获取分录
|
||||||
|
for (int i = 0; i < doc.size(); i++) {
|
||||||
|
if(doc.get(i).getBigDecimal("") != null){
|
||||||
|
entrytotal = entrytotal.add(doc.get(i).getBigDecimal(""));//累计分录本次核销金额
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(billtotal.compareTo(entrytotal) >= 0){
|
||||||
|
//校验通过返回true
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -83,12 +123,85 @@ public class ClearDetailBillOperation extends AbstractOperationServicePlugIn imp
|
||||||
//提交具体实现
|
//提交具体实现
|
||||||
DynamicObject[] dos = e.getDataEntities();
|
DynamicObject[] dos = e.getDataEntities();
|
||||||
DynamicObject prinfo;
|
DynamicObject prinfo;
|
||||||
|
String result;
|
||||||
for (int i = 0; i < dos.length; i++) {
|
for (int i = 0; i < dos.length; i++) {
|
||||||
prinfo = dos[i];
|
prinfo = dos[i];
|
||||||
|
//TODO 将清账明细分录反写至清账单分录,清账单【收款金额】+【账扣】+【尾差】≥【本次核销金额合计】
|
||||||
|
result = reWriteClearBill(prinfo);
|
||||||
|
if(!"success".equals(result)){
|
||||||
|
this.operationResult.setSuccess(false);
|
||||||
|
this.operationResult.setMessage("反写清账单失败,原因是:"+result);//前端界面提示内容
|
||||||
|
this.operationResult.setShowMessage(true);//前端界面 是否显示提示消息
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//清账明细单的OA待办转成已办
|
//清账明细单的OA待办转成已办
|
||||||
JhzjUtils.handleOA(prinfo,"2", "0");
|
JhzjUtils.handleOA(prinfo,"2", "0");
|
||||||
}
|
}
|
||||||
//将清账明细反写清账单,清账单【收款金额】+【账扣】+【尾差】≥【本次核销金额合计】
|
}
|
||||||
|
|
||||||
|
private String reWriteClearBill(DynamicObject detailBillInfo){
|
||||||
|
//根据清账明细单反写清账单
|
||||||
|
String clearBillid = detailBillInfo.getString("shjh_clearbillid");
|
||||||
|
DynamicObject clearBillInfo = BusinessDataServiceHelper.loadSingle(clearBillid,clearBillName);
|
||||||
|
if(clearBillInfo == null){
|
||||||
|
return detailBillInfo.getString("shjh_clearbillno")+"清账单未找到";
|
||||||
|
}
|
||||||
|
//给清账单增加互斥锁,如果失败反馈用户
|
||||||
|
String lockresult = JhzjUtils.lockBill(clearBillInfo);
|
||||||
|
if(!"success".equals(lockresult)){
|
||||||
|
return clearBillInfo.getString("billno")+lockresult;
|
||||||
|
}
|
||||||
|
//清账明细单分录
|
||||||
|
DynamicObjectCollection detaildoc = detailBillInfo.getDynamicObjectCollection("");
|
||||||
|
//清账单分录
|
||||||
|
DynamicObjectCollection cleardoc = clearBillInfo.getDynamicObjectCollection("");
|
||||||
|
DynamicObject detailEntryInfo;
|
||||||
|
DynamicObject clearEntryInfo;
|
||||||
|
for (int i = 0; i < detaildoc.size(); i++) {
|
||||||
|
detailEntryInfo = detaildoc.get(i);
|
||||||
|
clearEntryInfo = cleardoc.addNew();
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//凭证号
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//凭证类型
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//凭证行项目号
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//发票号
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getDate(""));//发票日期
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 总账科目
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 分配
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 参照
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//参考代码1
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 参考代码2
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 文本
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getDate(""));// 过账日期
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getBigDecimal(""));//未核销金额
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getBigDecimal(""));//本次核销金额
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));//会计年度
|
||||||
|
clearEntryInfo.set("",detailEntryInfo.getString(""));// 清账凭证文本
|
||||||
|
}
|
||||||
|
//处理清账单账扣
|
||||||
|
BigDecimal q1 = JhzjUtils.addTwoAmount(clearBillInfo.getBigDecimal(""),
|
||||||
|
detailBillInfo.getBigDecimal(""));
|
||||||
|
clearBillInfo.set("",q1);
|
||||||
|
//处理清账单尾差
|
||||||
|
BigDecimal q2 = JhzjUtils.addTwoAmount(clearBillInfo.getBigDecimal(""),
|
||||||
|
detailBillInfo.getBigDecimal(""));
|
||||||
|
clearBillInfo.set("",q2);
|
||||||
|
//获取清账单收款金额
|
||||||
|
BigDecimal q3 =clearBillInfo.getBigDecimal("");
|
||||||
|
//获取清账单的本次核销金额合计
|
||||||
|
BigDecimal entrytotal = BigDecimal.ZERO;
|
||||||
|
for (int i = 0; i < cleardoc.size(); i++) {
|
||||||
|
clearEntryInfo = cleardoc.get(i);
|
||||||
|
entrytotal = entrytotal.add(clearEntryInfo.getBigDecimal(""));
|
||||||
|
}
|
||||||
|
//清账单的收款金额+账扣+尾差=本次核销金额合计,即可提交
|
||||||
|
if(entrytotal.compareTo(q1.add(q2).add(q3)) == 0){
|
||||||
|
clearBillInfo.set("billstatus","B");
|
||||||
|
}
|
||||||
|
SaveServiceHelper.save(new DynamicObject[]{clearBillInfo});
|
||||||
|
//解除清账单互斥锁
|
||||||
|
JhzjUtils.unLockBill(clearBillInfo);
|
||||||
|
|
||||||
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleRevoke(AfterOperationArgs e){
|
private void handleRevoke(AfterOperationArgs e){
|
||||||
|
|
@ -98,15 +211,25 @@ public class ClearDetailBillOperation extends AbstractOperationServicePlugIn imp
|
||||||
DynamicObject prinfo;
|
DynamicObject prinfo;
|
||||||
for (int i = 0; i < dos.length; i++) {
|
for (int i = 0; i < dos.length; i++) {
|
||||||
prinfo = dos[i];
|
prinfo = dos[i];
|
||||||
DB.update(DBRoute.of("fi"), updateDetailByID, new Object[]{prinfo.getLong("id")});
|
DB.update(DBRoute.of("fi"), updateDetailSave, new Object[]{prinfo.getLong("id")});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleReject(AfterOperationArgs e){
|
private void handleReject(AfterOperationArgs e){
|
||||||
//驳回具体实现
|
//驳回具体实现
|
||||||
//清账明细单【单据状态】=驳回
|
DynamicObject[] dos = e.getDataEntities();
|
||||||
//若清账单【单据状态】=提交,则需调用清账单撤销,清账单【单据状态】=暂存。
|
DynamicObject prinfo;
|
||||||
//业务员可修改后,再次提交。驳回时,对清账明细单创建人发送邮件通知,OA待办
|
for (int i = 0; i < dos.length; i++) {
|
||||||
|
prinfo = BusinessDataServiceHelper.loadSingle(dos[i].getPkValue(),dos[i].getDataEntityType().getName());
|
||||||
|
//若清账单【单据状态】=已提交,则更新清账单【单据状态】=暂存。
|
||||||
|
DB.update(DBRoute.of("fi"), updateClearBillSave, new Object[]{prinfo.getString("shjh_clearbillid")});
|
||||||
|
//清账明细单【单据状态】=驳回
|
||||||
|
DB.update(DBRoute.of("fi"), updateDetailReject, new Object[]{prinfo.getLong("id")});
|
||||||
|
//驳回时,对清账明细单修改人发送邮件通知,OA待办 业务员可修改后,再次提交。
|
||||||
|
JhzjUtils.sendEmail(prinfo.getDynamicObject("modifier").getString("email"),"请登录资金系统操作清账明细单",
|
||||||
|
prinfo.getString("billno")+"\n 详情页面"+JhzjUtils.getBillPCURL(prinfo),"清账明细单新增");
|
||||||
|
JhzjUtils.handleOA(prinfo,"0", "0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package shjh.jhzj7.fi.fi.plugin.task;
|
||||||
|
|
||||||
|
import kd.bos.context.RequestContext;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.exception.KDException;
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
|
import kd.bos.orm.query.QCP;
|
||||||
|
import kd.bos.orm.query.QFilter;
|
||||||
|
import kd.bos.schedule.executor.AbstractTask;
|
||||||
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||||
|
import kd.sdk.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务更新资金计划收款实际数
|
||||||
|
*/
|
||||||
|
public class FundPlanCollectionTask extends AbstractTask implements Plugin {
|
||||||
|
private static final String entityName = "bd_accountview";
|
||||||
|
|
||||||
|
|
||||||
|
private static final Log logger = LogFactory.getLog(FundPlanCollectionTask.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
||||||
|
//查询当月已审核收款类资金计划(收款不区分公司,当月应只有一个)
|
||||||
|
QFilter qFilter = new QFilter("receredtype", QCP.equals, "0");
|
||||||
|
qFilter.and("creditamount", QCP.not_equals, BigDecimal.ZERO);
|
||||||
|
qFilter.and("claimnoticebillno", QCP.equals, "");
|
||||||
|
qFilter.and("billno", QCP.equals, "20250211-0000000094");
|
||||||
|
DynamicObject[] collection = BusinessDataServiceHelper.load(entityName, "id", qFilter.toArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
package shjh.jhzj7.fi.fi.plugin.task;
|
||||||
|
|
||||||
|
import kd.bos.context.RequestContext;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.entity.operate.result.OperationResult;
|
||||||
|
import kd.bos.exception.KDException;
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
|
import kd.bos.orm.query.QCP;
|
||||||
|
import kd.bos.orm.query.QFilter;
|
||||||
|
import kd.bos.schedule.executor.AbstractTask;
|
||||||
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||||
|
import kd.sdk.plugin.Plugin;
|
||||||
|
import shjh.jhzj7.fi.fi.utils.JhzjUtils;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务收款单自动下推生成清账单
|
||||||
|
*/
|
||||||
|
public class ReceBillToClearBillTask extends AbstractTask implements Plugin {
|
||||||
|
private static final String srcEntityName = "cas_recbill";//源单 收款单
|
||||||
|
private static final String destEntityName = "shjh_clear_account";//目标单 清账单
|
||||||
|
|
||||||
|
private static final Log logger = LogFactory.getLog(FundPlanCollectionTask.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
||||||
|
//设置定时任务,按时下推清账单,T+1日下推T及T之前收款单,生成清账单
|
||||||
|
QFilter qFilter = new QFilter("receredtype", QCP.equals, "0");
|
||||||
|
qFilter.and("creditamount", QCP.not_equals, BigDecimal.ZERO);
|
||||||
|
qFilter.and("claimnoticebillno", QCP.equals, "");
|
||||||
|
qFilter.and("billno", QCP.equals, "20250211-0000000094");
|
||||||
|
DynamicObject[] collection = BusinessDataServiceHelper.load(srcEntityName, "id", qFilter.toArray());
|
||||||
|
|
||||||
|
OperationResult operationResult3 = JhzjUtils.push(srcEntityName, destEntityName, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,15 +2,20 @@ package shjh.jhzj7.fi.fi.utils;
|
||||||
|
|
||||||
import kd.bos.context.RequestContext;
|
import kd.bos.context.RequestContext;
|
||||||
import kd.bos.dataentity.entity.DynamicObject;
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.dataentity.entity.ILocaleString;
|
||||||
|
import kd.bos.dataentity.entity.LocaleString;
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
import kd.bos.message.api.EmailInfo;
|
import kd.bos.message.api.EmailInfo;
|
||||||
|
import kd.bos.message.api.MessageChannels;
|
||||||
import kd.bos.message.service.handler.EmailHandler;
|
import kd.bos.message.service.handler.EmailHandler;
|
||||||
|
import kd.bos.mutex.DataMutex;
|
||||||
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||||
import kd.bos.servicehelper.operation.SaveServiceHelper;
|
import kd.bos.servicehelper.operation.SaveServiceHelper;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import kd.bos.data.BusinessDataReader;
|
import kd.bos.data.BusinessDataReader;
|
||||||
import kd.bos.dataentity.OperateOption;
|
import kd.bos.dataentity.OperateOption;
|
||||||
|
|
@ -27,8 +32,8 @@ import kd.bos.entity.operate.result.IOperateInfo;
|
||||||
import kd.bos.entity.operate.result.OperationResult;
|
import kd.bos.entity.operate.result.OperationResult;
|
||||||
import kd.bos.exception.KDBizException;
|
import kd.bos.exception.KDBizException;
|
||||||
import kd.bos.servicehelper.botp.ConvertServiceHelper;
|
import kd.bos.servicehelper.botp.ConvertServiceHelper;
|
||||||
import java.util.ArrayList;
|
import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
|
||||||
import java.util.List;
|
import kd.bos.workflow.engine.msg.info.MessageInfo;
|
||||||
|
|
||||||
|
|
||||||
public class JhzjUtils {
|
public class JhzjUtils {
|
||||||
|
|
@ -36,10 +41,23 @@ public class JhzjUtils {
|
||||||
public static final Long GROUPID = 100000l;//组织根节点ID
|
public static final Long GROUPID = 100000l;//组织根节点ID
|
||||||
public static final Long CNY = 1l;//人民币-币别ID
|
public static final Long CNY = 1l;//人民币-币别ID
|
||||||
|
|
||||||
|
private static final String groupId = "default_netctrl";//单据网络互斥默认分组
|
||||||
|
|
||||||
|
private static final Log logger = LogFactory.getLog(JhzjUtils.class);
|
||||||
|
|
||||||
public static boolean isEmpty(String value) {
|
public static boolean isEmpty(String value) {
|
||||||
return value == null || value.trim().length() <= 0;
|
return value == null || value.trim().length() <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存接口调用过程中的日志
|
||||||
|
* @param billno 单据编号
|
||||||
|
* @param jkname 接口名称
|
||||||
|
* @param inputs 接口入参
|
||||||
|
* @param outputs 接口出参
|
||||||
|
* @param isSuccess 接口是否调用成功
|
||||||
|
* @param operation 上游操作触发
|
||||||
|
*/
|
||||||
public static void saveLog(String billno,String jkname,String inputs,String outputs,boolean isSuccess,String operation){
|
public static void saveLog(String billno,String jkname,String inputs,String outputs,boolean isSuccess,String operation){
|
||||||
//保存星瀚与第三方接口调用之间的日志记录
|
//保存星瀚与第三方接口调用之间的日志记录
|
||||||
//参数说明:单据编号、接口名称、接口入参、接口返回值、接口执行结果是否成功、操作名称(audit、unaudit等)
|
//参数说明:单据编号、接口名称、接口入参、接口返回值、接口执行结果是否成功、操作名称(audit、unaudit等)
|
||||||
|
|
@ -74,6 +92,40 @@ public class JhzjUtils {
|
||||||
saveLog(email,"邮件",content,(String)sendResult.get("description"),(Boolean)sendResult.get("result"),operation);
|
saveLog(email,"邮件",content,(String)sendResult.get("description"),(Boolean)sendResult.get("result"),operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 组装入参,给指定人员发企微消息
|
||||||
|
* @param email 邮箱地址
|
||||||
|
* @param title1 邮件主题
|
||||||
|
* @param content1 邮件内容
|
||||||
|
* @param operation 上游操作触发
|
||||||
|
*/
|
||||||
|
public static void sendWEIXINQY(String email, String title1, String content1,String operation){
|
||||||
|
//构建消息体发送
|
||||||
|
MessageInfo message = new MessageInfo();
|
||||||
|
//信息title
|
||||||
|
ILocaleString title = new LocaleString("测试消息主题");
|
||||||
|
message.setMessageTitle(title);
|
||||||
|
//信息主体
|
||||||
|
ILocaleString content = new LocaleString("消息主体内容,请登录资金系统处理业务");
|
||||||
|
message.setMessageContent(content);
|
||||||
|
//信息接收人
|
||||||
|
ArrayList<Long> receivers = new ArrayList<>();
|
||||||
|
receivers.add(RequestContext.get().getCurrUserId());
|
||||||
|
message.setUserIds(receivers);
|
||||||
|
//信息标签
|
||||||
|
ILocaleString tag = new LocaleString("消息提醒");
|
||||||
|
message.setTag(tag.getLocaleValue_zh_CN());
|
||||||
|
message.setMessageTag(tag);
|
||||||
|
//信息发送人
|
||||||
|
message.setSenderId(RequestContext.get().getCurrUserId());
|
||||||
|
message.setType(MessageInfo.TYPE_MESSAGE);
|
||||||
|
StringBuilder notifyType = new StringBuilder();
|
||||||
|
notifyType.append(MessageChannels.WEIXINQY).append(",");
|
||||||
|
notifyType.append(MessageChannels.EMAIL);
|
||||||
|
message.setNotifyType(notifyType.toString());
|
||||||
|
MessageCenterServiceHelper.sendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 组装入参,处理OA接口调用
|
* 组装入参,处理OA接口调用
|
||||||
* @param prinfo 清账明细单
|
* @param prinfo 清账明细单
|
||||||
|
|
@ -111,6 +163,100 @@ public class JhzjUtils {
|
||||||
OAUtils.thirdParty(thirdPartyMap);
|
OAUtils.thirdParty(thirdPartyMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定的对象增加网络互斥,让其他人不可修改
|
||||||
|
* @param prinfo 具体对象,可以是收付款单、清账单和明细单
|
||||||
|
**/
|
||||||
|
public static String lockBill(DynamicObject prinfo){
|
||||||
|
try (DataMutex dataMutex = DataMutex.create()) {
|
||||||
|
//如果需要和标准操作(如保存、提交、审核)互斥,则可使用default_netctrl(默认分组),不需要和标准操作互斥则需要用自定义的groupId
|
||||||
|
String entityKey = prinfo.getDataEntityType().getName();
|
||||||
|
List mutexRequireList = new ArrayList<>(1);
|
||||||
|
Map requireParam = new HashMap<>();
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_DATAOBJID, prinfo.getString("id"));//数据id
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_GROUPID, groupId);
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_ENTITYKEY, entityKey);
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_OPERATIONKEY, "modify");
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_ISSTRICT, true);
|
||||||
|
//建议设置自定义标识,用于后续区分标准操作和自定义申请的网控
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_DATA_CALL_SOURCE, "reWriteClearBill");
|
||||||
|
mutexRequireList.add(requireParam);
|
||||||
|
Map mutexResult = dataMutex.batchrequire(mutexRequireList);
|
||||||
|
Iterator it = mutexResult.entrySet().iterator();
|
||||||
|
if(it.hasNext()){
|
||||||
|
Map.Entry next = (Map.Entry) it.next();
|
||||||
|
// String key = (String) next.getKey();
|
||||||
|
if ((Boolean) next.getValue()) {
|
||||||
|
//申请互斥成功的
|
||||||
|
return "success";
|
||||||
|
} else {
|
||||||
|
return "清账单锁定失败,已被其他人占用";
|
||||||
|
// Map lockInfo = dataMutex.getLockInfo(key, groupId, entityKey);
|
||||||
|
// if (lockInfo != null) {
|
||||||
|
// //申请锁失败,提示已经存在的锁信息
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "清账单锁定异常,请稍后再试";
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e);
|
||||||
|
return "清账单锁定异常,请稍后再试";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定的对象清除网络互斥,让其他人可修改
|
||||||
|
* @param prinfo 具体对象,可以是收付款单、清账单和明细单
|
||||||
|
**/
|
||||||
|
public static void unLockBill(DynamicObject prinfo){
|
||||||
|
try (DataMutex dataMutex = DataMutex.create()) {
|
||||||
|
List mutexRequireList = new ArrayList<>(1);
|
||||||
|
Map requireParam = new HashMap<>();
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_DATAOBJID, prinfo.getString("id"));
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_GROUPID, groupId);
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_ENTITYKEY, prinfo.getDataEntityType().getName());
|
||||||
|
requireParam.put(DataMutex.PARAMNAME_OPERATIONKEY, "modify");
|
||||||
|
mutexRequireList.add(requireParam);
|
||||||
|
dataMutex.batchRelease(mutexRequireList);
|
||||||
|
// Set set = mutexResult.entrySet();
|
||||||
|
// Iterator it = set.iterator();
|
||||||
|
// while(it.hasNext()){
|
||||||
|
// Map.Entry next = (Map.Entry) it.next();
|
||||||
|
// String key = (String) next.getKey();
|
||||||
|
// Boolean value = (Boolean) next.getValue();
|
||||||
|
// if (value) {
|
||||||
|
// //申请互斥成功的
|
||||||
|
// } else {
|
||||||
|
// Map lockInfo = dataMutex.getLockInfo(key, groupId, entityKey);
|
||||||
|
// if (lockInfo != null) {
|
||||||
|
// //申请锁失败,提示已经存在的锁信息
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 两个金额字段相加,如果两个都为null,返回0
|
||||||
|
* 两个有一个为null,返回其中一个值;两个都不为null,则相加
|
||||||
|
* */
|
||||||
|
public static BigDecimal addTwoAmount(BigDecimal a1, BigDecimal a2){
|
||||||
|
if(a1 == null && a2 != null){
|
||||||
|
return a2;
|
||||||
|
}else if(a2 == null && a1 != null){
|
||||||
|
return a1;
|
||||||
|
}else if(a1 != null && a2 != null){
|
||||||
|
return a1.add(a2);
|
||||||
|
}
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定的对象获取其详情界面的url
|
||||||
|
* @param prinfo 具体对象,可以是收付款单、清账单和明细单
|
||||||
|
**/
|
||||||
public static String getBillPCURL(DynamicObject prinfo){
|
public static String getBillPCURL(DynamicObject prinfo){
|
||||||
//获得单据的pc详情url
|
//获得单据的pc详情url
|
||||||
//https://ip:port/ierp/index.html?formId=er_tripreqbill&pkId=721810009540800512
|
//https://ip:port/ierp/index.html?formId=er_tripreqbill&pkId=721810009540800512
|
||||||
|
|
@ -121,6 +267,8 @@ public class JhzjUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收款单下推清账单-默认下推
|
* 收款单下推清账单-默认下推
|
||||||
|
* @param oribill 源单标识-收款单
|
||||||
|
* @param tobill 目标单标识-清账单
|
||||||
**/
|
**/
|
||||||
public static OperationResult push(String oribill, String tobill, String oribillid) {
|
public static OperationResult push(String oribill, String tobill, String oribillid) {
|
||||||
// 生成下推参数PushArgs
|
// 生成下推参数PushArgs
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,8 @@ public class PersonControler implements Serializable {
|
||||||
// itemInfo.put("message","");
|
// itemInfo.put("message","");
|
||||||
//更新人员对应客户的银行信息
|
//更新人员对应客户的银行信息
|
||||||
handlePersonForCustomer(result);
|
handlePersonForCustomer(result);
|
||||||
|
//TODO 处理人员金蝶id和企微id的对应关系
|
||||||
|
handlePersonImmapping(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -250,6 +252,18 @@ public class PersonControler implements Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handlePersonImmapping(UserParam ups){
|
||||||
|
/*
|
||||||
|
* 这里可以使用企业微信同步用户,也可以直接在系统库中t_bas_immapping表插入数据,需要苍穹中用户的主键和微信中用户的openId,可以在苍穹的系统库使用sql:
|
||||||
|
insert into t_bas_immapping (fid, FIMTYPEID, FOPENID) value (主键, 类型(暂时随便给值也可以), '微信公众号用户的openId');
|
||||||
|
update t_bas_immapping SET FUSERID = (select fid from t_sec_user where fphone = '用户手机号') where fid = '用户手机号';
|
||||||
|
如果没有同步用户,即t_bas_immapping表中查不到数据,则会跳转到苍穹登陆界面;用户输入信息之后苍穹会自动在t_bas_immapping中获取openid并存储;
|
||||||
|
* ( 此逻辑在kd.bos.login.thirdauth.app.tencent.WxgzhLoginAfter中,目前标准代码存在bug,多系统对接对于同一个fuserid会替换openid,
|
||||||
|
* 导致单点登录到别的系统失败,多系统对接需要修改总部标准代码或者联系总部出私包解决 )
|
||||||
|
* */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void handlePersonForCustomer(UserParam ups){
|
private void handlePersonForCustomer(UserParam ups){
|
||||||
String cusnumber = (String) ups.getDataMap().get("number");//客户编号-即是 人员的编号
|
String cusnumber = (String) ups.getDataMap().get("number");//客户编号-即是 人员的编号
|
||||||
DynamicObject currentCus = BusinessDataServiceHelper.loadSingle(cusEntityName,new QFilter[]{new QFilter("number","=",cusnumber)});
|
DynamicObject currentCus = BusinessDataServiceHelper.loadSingle(cusEntityName,new QFilter[]{new QFilter("number","=",cusnumber)});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue