using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CoreFS.CA06;
using DbHelp = Core.StlMes.Client.Sale.DbHelp;
namespace Core.StlMes.Client.Sale.SaleFundMgt.FundBLL.SelFundPactControl
{
///
/// 外端调用资金系统的入口类
/// 合同生效扣款:外端构造参数Model.SEL_FUND_CONTROL_PACT,外端判断是否是出口合同
/// 下车扣款参数见定义
///
public class SelFundPactControl:FundBaseBLL.FundBaseBLL
{
private OpeBase _ob;
public SelFundPactControl(OpeBase ob)
: base(ob)
{
_ob = ob;
}
///
/// 合同生效扣款
///
///
///
public virtual void PayMentForPactToEffect(Model.SEL_FUND_CONTROL_PACT pact, out string errMsg)
{
errMsg = "";
// 是否进行资金控制
if (!FundVariable.FundConstVariable.isOpenFundControlMode)
return;
// 事务点
DbHelp.DbTransaction transaction = base.GetTransaction();
try
{
string secondLevelAccount = "";
// 获取随机数
string busiseq = Common.SaleFundCommon.GetBusiSeq();
Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
// 参数检查
if (!Model.SEL_FUND_CONTROL_PACT.IsValid(pact, out errMsg))
{
return;
}
// 检查客户账户是否存在,不存在则提示错误,退出
Model.SEL_FUND_CUST_ACCOUNT acct =
base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(pact.CUSTCONTROL.BALANCESUBJECT,
pact.CUSTCONTROL.BUYERCODE);
if (acct == null)
{
errMsg = _errMsgNoCustAccount;
return;
}
// 金额,这里有三个,总金额,货款,运费,如果货款为0,运费不为0,则也不处理
if (pact.MONEY == 0)
return;
// 检测合同账号和二级账号,顺延创建二级账户和合同账户
// 创建规则,有则跳过,没有则创建,减少一些不必要的判断
// 获取其二级账户
secondLevelAccount = base.GetFundPactAccountRelationInstance().GetHighestPriorRealationByRelName(pact.PRODLINE);
// 不存在,则取默认
if (secondLevelAccount.Length == 0)
{
secondLevelAccount = FundVariable.FundConstVariable.defaultSecondLevelAccount;
}
Model.SEL_FUND_PACT_ACCOUNT fundpact =
base.GetFundPactAccount(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, secondLevelAccount, pact.PACTNO);
fundpact.IMPORTOR = "System";
// 创建二级账户和合同账户
new FundBLL.FundSecondLevelAccount.FundSecondlevelAccountMgt(this._ob).CreateSecondLevelAccountAndPactAccount(fundpact, out errMsg);
pact01 =
base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
(pact.CUSTCONTROL.BALANCESUBJECT,pact.CUSTCONTROL.BUYERCODE,pact.PACTNO);
// 资金不足,退出
if (!IsMoneyEnoughForPactEffect(pact01, pact.PAYMONEY, out errMsg))
{
return;
}
else
{
// 构造类
Model.SEL_FUND_TRANS_PACT act = base.GetSelFundTransPact
(pact01.BALANCESUBJECT, pact01.BUYERCODE, pact01.SECONDACCOUNT, pact01.PACTNO, -pact.PAYMONEY);
pact.SECONDLEVELACCOUNT = pact01.SECONDACCOUNT;
// 明细记录
Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail(pact, busiseq, FundVariable.FundConstVariable._transTypePactEffect );
// 开始事务
transaction.BeginTransaction();
// 合同账户扣款
// base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdatePactEffectMoneyToUnValid(detail.BALANCESUBJECT,detail.BUYERCODE,detail.SECONDACCOUNT,detail.PACTNO,
transaction);
// 写明细记录
// 排产款显示负数
detail.MONEY = -detail.MONEY;
detail.ASKPLAN_MONEY = -detail.ASKPLAN_MONEY;
detail.TRANS_MONEY = -detail.TRANS_MONEY;
base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
// 提交
transaction.Commit();
// 记录明细
errMsg = transaction.ErrMsg;
}
}
catch(Exception ex)
{
errMsg = ex.Message;
transaction.RollBack();
}
}
private FundBLL.FundTransferMgt.FundTransferMgt GetInstanceTrans()
{
return new FundBLL.FundTransferMgt.FundTransferMgt(this._ob);
}
public Boolean IsAskplanIdExists(string balancesubject, string askPlanid)
{
return base.GetFundPactUsedDetailInstance().IsAskplanIdExists(balancesubject,askPlanid);
}
///
/// 检查一个车是否有装车冲减
///
///
///
///
public Boolean IsAskplanIdExistsLoad(string balancesubject, string askPlanid)
{
return base.GetFundPactUsedDetailInstance().IsAskplanIdExistsLoad(balancesubject, askPlanid);
}
///
/// 检查一个车是否有结算冲减
///
///
///
///
public Boolean IsAskplanIdExistsInvoince(string balancesubject, string askPlanid)
{
return base.GetFundPactUsedDetailInstance().IsAskplanIdExistsInvoince(balancesubject, askPlanid);
}
///
/// 判断资金是否足够,主要针对下车等实用剩余资金使用的
///
///
///
///
///
protected Boolean IsMoneyEnough(Model.SEL_FUND_PACT_ACCOUNT pact,double RequestMoney,out string errMsg)
{
errMsg = "";
// 参数是否有效
if (!Model.SEL_FUND_PACT_ACCOUNT.IsReasonable(pact, out errMsg))
{
return false;
}
Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
(pact.BALANCESUBJECT, pact.BUYERCODE);
// 客户资金不足
if (pact.LEAVEMONEY < RequestMoney)
{
// 检查二级账户资金+合同账户资金是否足够
if (pact02 == null)
{
errMsg = _errMsgException;
return false;
}
if (pact02.LEAVEMONEY + pact.LEAVEMONEY < RequestMoney)
{
// 检查三级账户+二级账户+合同账户是否足够
if (pact03 == null)
{
errMsg = _errMsgException;
return false;
}
if (pact03.LEAVEMONEY + pact02.LEAVEMONEY + pact.LEAVEMONEY < RequestMoney)
{
errMsg = base._errMsgMoneyNotEnough;
return false;
}
else
{
// 资金足够,先将资金从客户账户转到二级账户,再从二级账户转到合同账户
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY - pact02.LEAVEMONEY);
// 转二级账户
this.GetInstanceTrans().TransferMoneyCustToSecondAccount(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
// 二级转三级
traspact =
base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY);
this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
return true;
}
}
else
{ // 资金足够,则先将金额从二级账户转到合同账户
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY);
new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
if (errMsg.Length > 0)
return false;
return true;
}
}
else
{
return true;
}
}
///
/// 装车冲减or结算冲减后,需要填平合同账户的负数问题
/// 资金如果有负数,体现到客户账户
///
///
///
///
protected void TransMoneyToPactAfterCredit(Model.SEL_FUND_PACT_ACCOUNT pact, out string errMsg)
{
//
errMsg = "";
try
{
if (pact.LEAVEMONEY >= 0)
return;
Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
(pact.BALANCESUBJECT, pact.BUYERCODE);
if (pact02.LEAVEMONEY + pact.LEAVEMONEY >= 0)
{
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY);
new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
}
else
{
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY - pact02.LEAVEMONEY);
// 转二级账户
this.GetInstanceTrans().TransferMoneyCustToSecondAccountWithNoLeaveMoneyCheck(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
// 二级转三级
traspact =
base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY);
this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
}
}
catch(Exception ex)
{
errMsg = ex.Message;
}
}
///
/// 主要针对合同生效实用,生效比较的是合同总资金,
/// 生效扣款的过程就是锁定合同资金,而不是实用资金
///
///
///
///
///
protected Boolean IsMoneyEnoughForPactEffect(Model.SEL_FUND_PACT_ACCOUNT pact, double RequestMoney, out string errMsg)
{
errMsg = "";
// 参数是否有效
if (!Model.SEL_FUND_PACT_ACCOUNT.IsReasonable(pact, out errMsg))
{
return false;
}
Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
(pact.BALANCESUBJECT, pact.BUYERCODE);
// 客户资金不足
// 合同生效扣款性质类似锁资金,而不是实用资金,
// 需要用总资金比较
if (pact.TOTALMONEY < RequestMoney)
{
// 检查二级账户资金+合同账户资金是否足够
if (pact02 == null)
{
errMsg = _errMsgException;
return false;
}
if (pact02.LEAVEMONEY + pact.TOTALMONEY < RequestMoney)
{
// 检查三级账户+二级账户+合同账户是否足够
if (pact03 == null)
{
errMsg = _errMsgException;
return false;
}
if (pact03.LEAVEMONEY + pact02.LEAVEMONEY + pact.TOTALMONEY < RequestMoney)
{
errMsg = base._errMsgMoneyNotEnough;
return false;
}
else
{
// 资金足够,先将资金从客户账户转到二级账户,再从二级账户转到合同账户
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY - pact02.LEAVEMONEY);
// 转二级账户
this.GetInstanceTrans().TransferMoneyCustToSecondAccount(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
// 二级转三级
traspact =
base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY);
this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
return true;
}
}
else
{ // 资金足够,则先将金额从二级账户转到合同账户
Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
(pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY);
new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
if (errMsg.Length > 0)
return false;
return true;
}
}
else
{
return true;
}
}
///
/// 出库指示扣款
///
///
public virtual void PayMentForDeliver(Model.SEL_FUND_CONTROL_DLIV dliv, out string errMsg)
{
errMsg = "";
string secondLevelAccount = "";
// 不需要资金控制
if (!FundVariable.FundConstVariable.isOpenFundControlMode)
return;
string busiseq = Common.SaleFundCommon.GetBusiSeq();
DbHelp.DbTransaction transaction = base.GetTransaction();
// 开始事务
transaction.BeginTransaction();
Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
try
{
// 参数检查
if (!Model.SEL_FUND_CONTROL_DLIV.IsValid(dliv,out errMsg))
{
errMsg = _errMsgException;
return;
}
List pactlist =
dliv.GetSelFundControlPactList();
// 先删除原有 同号的车,并退出资金
DeleteDelivPlan(pactlist[0].CUSTCONTROL.BALANCESUBJECT, pactlist[0].CUSTCONTROL.BUYERCODE, dliv.ASKPLAN_ID, out errMsg);
//if (errMsg.Length > 0)
// return;
// 先检查所有合同资金是否足够
foreach (Model.SEL_FUND_CONTROL_PACT pact in pactlist)
{
// 参数检查
if (!Model.SEL_FUND_CONTROL_PACT.IsValid(pact, out errMsg))
{
return;
}
// 检查客户账户是否存在,不存在则提示错误,退出
Model.SEL_FUND_CUST_ACCOUNT acct =
base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(pact.CUSTCONTROL.BALANCESUBJECT,
pact.CUSTCONTROL.BUYERCODE);
if (acct == null)
{
errMsg = _errMsgNoCustAccount;
return;
}
// 金额,这里有三个,总金额,货款,运费,如果货款为0,运费不为0,则也不处理
if (pact.MONEY == 0)
continue;
// 检测合同账号和二级账号,顺延创建二级账户和合同账户
// 创建规则,有则跳过,没有则创建,减少一些不必要的判断
// 获取其二级账户
secondLevelAccount = base.GetFundPactAccountRelationInstance().GetHighestPriorRealationByRelName(pact.PRODLINE);
// 不存在,则取默认
if (secondLevelAccount.Length == 0)
{
secondLevelAccount = FundVariable.FundConstVariable.defaultSecondLevelAccount;
}
Model.SEL_FUND_PACT_ACCOUNT fundpact =
base.GetFundPactAccount(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, secondLevelAccount, pact.PACTNO);
fundpact.IMPORTOR = "System";
// 创建二级账户和合同账户
new FundBLL.FundSecondLevelAccount.FundSecondlevelAccountMgt(this._ob).CreateSecondLevelAccountAndPactAccount(fundpact, out errMsg);
pact01 =
base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, pact.PACTNO);
// 资金不足,退出
if (!IsMoneyEnough(pact01, pact.PAYMONEY, out errMsg))
{
return;
}
}
// 资金充足情况,写明细
foreach (Model.SEL_FUND_CONTROL_PACT pact in pactlist)
{
if (pact.PAYMONEY == 0)
continue;
// transaction.BeginTransaction();
// 合同账户信息
pact01 =
base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, pact.PACTNO);
// 构造类
Model.SEL_FUND_TRANS_PACT act = base.GetSelFundTransPact
(pact01.BALANCESUBJECT, pact01.BUYERCODE, pact01.SECONDACCOUNT, pact01.PACTNO, -pact.PAYMONEY);
pact.SECONDLEVELACCOUNT = pact01.SECONDACCOUNT;
// 明细记录
Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail(pact, busiseq, FundVariable.FundConstVariable._transTypePactDeliver);
detail.ASKPLAN_ID = dliv.ASKPLAN_ID;
// 合同账户扣款
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
dliv.ASKPLAN_ID, transaction);
// 写明细记录
base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
// 记录明细
errMsg = transaction.ErrMsg;
transaction.Commit();
}
}
catch(Exception ex)
{
errMsg = ex.Message;
transaction.RollBack();
}
}
///
/// 装车冲减
///
///
///
///
///
public virtual void PayMentForLoad(string balncesubject,string buyercode,string askPlanid,string carNo, List listPactDliv, out string errMsg)
{
// 检查是否有结算冲减的数据,如果有,则不允许冲减
List listInvoince =
base.GetFundPactUsedDetailInstance().GetSelFundPctUsedInvoiceByBalanceAndBuyercodeAndAskplanId(balncesubject, buyercode, askPlanid);
if (listInvoince != null && listInvoince.Count > 0)
{
errMsg = "存在结算信息,不允许装车冲减";
return;
}
// 删除下车,包括退款
DeleteDelivPlan(balncesubject, buyercode, askPlanid, out errMsg);
// 删除装车,包括退款
DeleteDelivLoad(balncesubject, buyercode, askPlanid, out errMsg);
DlivCredit(balncesubject, buyercode, askPlanid, carNo, listPactDliv, FundVariable.FundConstVariable._transTypePactLoad, out errMsg);
// 检查客户账户是否有负数,如果有,且其子账户有资金,则需要填平客户账户
// 是否需要由开关FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero 决定
UpdateCustAccountLeaveMoneyToGreaterThanZero(balncesubject,buyercode);
this.DeleteAskplanIdLoadCredit(balncesubject, buyercode, askPlanid);
}
///
/// 结算冲减
///
///
///
///
///
public virtual void PayMentForInvoice(string balncesubject, string buyercode, string askPlanid, string carNo, List listPactDliv, out string errMsg)
{
// 删除下车,包括退款
DeleteDelivPlan(balncesubject, buyercode, askPlanid, out errMsg);
// 删除装车,包括退款
DeleteDelivLoad(balncesubject, buyercode, askPlanid, out errMsg);
// 删除结算数据
DeleteDelivInvoice(balncesubject, buyercode, askPlanid, out errMsg);
DlivCredit(balncesubject, buyercode, askPlanid, carNo, listPactDliv, FundVariable.FundConstVariable._transTypePactInvoice, out errMsg);
// 检查客户账户是否有负数,如果有,且其子账户有资金,则需要填平客户账户
// 是否需要由开关FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero 决定
UpdateCustAccountLeaveMoneyToGreaterThanZero(balncesubject, buyercode);
DeleteAskplanIdInvoiceCredit(balncesubject, buyercode, askPlanid);
}
///
/// 检查一个客户账户资金是否为负数,如果是,则检查其下面账户是否有剩余资金大于0
/// 如果有,则需要先填充客户账户
///
///
///
public void UpdateCustAccountLeaveMoneyToGreaterThanZero(string balancesubject,string buyercode)
{
if (!FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero)
return;
Model.SEL_FUND_CUST_ACCOUNT acct =
base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(balancesubject,buyercode);
if (acct == null)
return;
if (acct.LEAVEMONEY >= 0)
return;
List list
= base.GetFundSecondAccountInstance().GetSelFundSecondAccountByBalanceSubjectAndBuyercode(balancesubject, buyercode);
if (list == null || list.Count == 0)
return;
string errMsg = "";
Model.SEL_FUND_TRANS_SECONDACCOUNT sectransact = null;
// 总共需要填平的资金
double totalMoney = -acct.LEAVEMONEY;
// 每个二级账户去找,直到资金足够填充客户的剩余资金
foreach (Model.SEL_FUND_SECONDLEVEL_ACCOUNT secacct in list)
{
if (totalMoney == 0)
break;
// 二级账户资金足够填充,则从二级账户扣
if (secacct.LEAVEMONEY + acct.LEAVEMONEY >= 0)
{
sectransact = GetTransSecondAct(GetTransCust(balancesubject, buyercode, -acct.LEAVEMONEY), secacct.SECONDACCOUNT, -acct.LEAVEMONEY);
this.GetInstanceTrans().TransferMoneySecondAccountToCust(sectransact,out errMsg);
break;
}
else
{
// 二级账户有剩余资金,先将其剩余资金转到客户账户
if (secacct.LEAVEMONEY > 0)
{
sectransact = GetTransSecondAct(GetTransCust(balancesubject, buyercode, secacct.LEAVEMONEY), secacct.SECONDACCOUNT, secacct.LEAVEMONEY);
this.GetInstanceTrans().TransferMoneySecondAccountToCust(sectransact, out errMsg);
totalMoney = totalMoney - secacct.LEAVEMONEY;
}
List pactList = base.GetFundPactAccountInstance()
.GetSelFundPactAccountByBalanceAndSecAccount(balancesubject, buyercode, secacct.SECONDACCOUNT);
foreach (Model.SEL_FUND_PACT_ACCOUNT pactact in pactList)
{
if (totalMoney == 0)
break;
if (pactact.LEAVEMONEY <= 0)
continue;
Model.SEL_FUND_TRANS_PACT transpact = null;
if (pactact.LEAVEMONEY <= totalMoney)
{
transpact =
this.GetTransPact(GetTransSecondAct(GetTransCust(balancesubject, buyercode, pactact.LEAVEMONEY), secacct.SECONDACCOUNT, pactact.LEAVEMONEY),
pactact.PACTNO, pactact.LEAVEMONEY);
totalMoney = totalMoney - pactact.LEAVEMONEY;
}
else
{
transpact =
this.GetTransPact(GetTransSecondAct(GetTransCust(balancesubject, buyercode, totalMoney), secacct.SECONDACCOUNT, totalMoney),
pactact.PACTNO, totalMoney);
totalMoney = 0;
}
// 转二级
this.GetInstanceTrans().TransferMoneyPactToSecondAccount(transpact, out errMsg);
// 转客户
this.GetInstanceTrans().TransferMoneySecondAccountToCust(transpact.FUND_TRANS_SECONDACCOUNT, out errMsg);
}
}
}
}
///
///
///
///
///
///
///
private Model.SEL_FUND_TRANS_CUST GetTransCust(string balancesubject,string buyercode,double money)
{
return new Model.SEL_FUND_TRANS_CUST(balancesubject, buyercode, money, "System", Util.DateTimeUtil.GetSystemDate());
}
private Model.SEL_FUND_TRANS_SECONDACCOUNT GetTransSecondAct(Model.SEL_FUND_TRANS_CUST cust, string secondact, double money)
{
return new Model.SEL_FUND_TRANS_SECONDACCOUNT(cust, secondact, money);
}
private Model.SEL_FUND_TRANS_PACT GetTransPact(Model.SEL_FUND_TRANS_SECONDACCOUNT secact,string pactno,double money)
{
Model.SEL_FUND_TRANS_PACT pact = new Model.SEL_FUND_TRANS_PACT();
pact.FUND_TRANS_SECONDACCOUNT = secact;
pact.PACTNO = pactno;
pact.TRANS_MONEY = money;
return pact;
}
///
/// 冲减共用方法
///
///
///
///
///
///
///
private void DlivCredit(string balncesubject, string buyercode, string askPlanid, string carNo, List listPactDliv, string transType,out string errMsg)
{
errMsg = "";
Model.SEL_FUND_CONTROL_PACT pact = null;
Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
// 构造类
Model.SEL_FUND_TRANS_PACT act = null;
DbHelp.DbTransaction transaction = base.GetTransaction();
transaction.BeginTransaction();
try
{
foreach (Model.SEL_FUND_CONTROL_PACT_DLIV dliv in listPactDliv)
{
pact01 =
base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
(balncesubject, buyercode, dliv.PACTNO);
Model.SEL_FUND_CONTROL_CUST cust = new Model.SEL_FUND_CONTROL_CUST
(balncesubject, buyercode, "System", Util.DateTimeUtil.GetSystemDate());
// 合同账户扣款
pact = new Model.SEL_FUND_CONTROL_PACT
(cust, pact01.SECONDACCOUNT, dliv.PACTNO, dliv.PRODLINE, dliv.WEIGHT, dliv.MONEY, dliv.TRANSMONEY);
// 合同账户扣款
act = base.GetSelFundTransPact(balncesubject, buyercode, pact01.SECONDACCOUNT, dliv.PACTNO, -dliv.MONEY - dliv.TRANSMONEY);
Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail
(pact, Common.SaleFundCommon.GetBusiSeq(), transType);
detail.ASKPLAN_ID = askPlanid;
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
}
transaction.Commit();
foreach (Model.SEL_FUND_CONTROL_PACT_DLIV dliv in listPactDliv)
{
try
{
TransMoneyToPactAfterCredit(base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
(balncesubject, buyercode, dliv.PACTNO), out errMsg);
}
catch
{
}
}
}
catch (Exception ex)
{
errMsg = ex.Message;
transaction.RollBack();
}
}
///
/// 删除一个出库指示,带事务,用在下车时用
///
///
///
///
///
public virtual void DeleteDelivPlan(string balanceSubject, string buyercode, string askPlan_id, DbHelp.DbTransaction transaction)
{
try
{
List detal
= base.GetFundPactUsedDetailInstance().GetSelFundPctUsedDelivByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
if (detal == null)
return;
if (detal.Count == 0)
return;
Model.SEL_FUND_TRANS_PACT act = null;
foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
{
act = base.GetSelFundTransPact
(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
// 退钱到合同账户
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
detail.ASKPLAN_ID, transaction);
}
}
catch(Exception ex)
{
transaction.ErrMsg = ex.Message;
transaction.RollBack ();
}
}
///
/// 删除一个出库指示,不带事务,在界面做删除操作时使用
///
/// 结算单位
/// 客户编码
/// 计划单号
///
public virtual void DeleteDelivPlan(string balanceSubject, string buyercode, string askPlan_id,out string errMsg)
{
DbHelp.DbTransaction transaction = base.GetTransaction();
errMsg = "";
try
{
transaction.BeginTransaction();
List detal
= base.GetFundPactUsedDetailInstance().GetSelFundPctUsedDelivByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
if (detal == null)
return;
if (detal.Count == 0)
return;
Model.SEL_FUND_TRANS_PACT act = null;
foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
{
act = base.GetSelFundTransPact
(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
// 退钱到合同账户
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, out errMsg);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
detail.ASKPLAN_ID, out errMsg);
}
transaction.Commit();
}
catch(Exception ex)
{
errMsg = ex.Message;
transaction.RollBack();
}
}
///
/// 删除装车数据并退款
///
///
///
///
///
public virtual void DeleteDelivLoad(string balanceSubject, string buyercode, string askPlan_id, out string errMsg)
{
DbHelp.DbTransaction transaction = base.GetTransaction();
errMsg = "";
try
{
transaction.BeginTransaction();
List detal
= base.GetFundPactUsedDetailInstance().GetSelFundPctUsedLoadByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
if (detal == null)
return;
if (detal.Count == 0)
return;
Model.SEL_FUND_TRANS_PACT act = null;
foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
{
act = base.GetSelFundTransPact
(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
// 退钱到合同账户
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, out errMsg);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdateLoadMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
detail.ASKPLAN_ID, out errMsg);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.ErrMsg = ex.Message;
transaction.RollBack();
}
}
///
/// 删除结算数据并退款
///
///
///
///
///
public virtual void DeleteDelivInvoice(string balanceSubject, string buyercode, string askPlan_id, out string errMsg)
{
DbHelp.DbTransaction transaction = base.GetTransaction();
errMsg = "";
try
{
transaction.BeginTransaction();
List detal
= base.GetFundPactUsedDetailInstance().GetSelFundPctUsedInvoiceByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
if (detal == null)
return;
if (detal.Count == 0)
return;
Model.SEL_FUND_TRANS_PACT act = null;
foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
{
act = base.GetSelFundTransPact
(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
// 退钱到合同账户
base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
// 先将原有的明细记录设置为无效
base.GetFundPactUsedDetailInstance().UpdateInvoiceMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
detail.ASKPLAN_ID, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.ErrMsg = ex.Message;
transaction.RollBack();
}
}
///
/// 结算冲减时,删除无效数据,真删除
///
///
///
///
private void DeleteAskplanIdInvoiceCredit(string balanceSubject, string buyercode, string askPlan_id)
{
string errMsg = "";
try
{
base.GetFundPactUsedDetailInstance().DeleteUnValidDelivAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
base.GetFundPactUsedDetailInstance().DeleteUnValidLoadAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
base.GetFundPactUsedDetailInstance().DeleteUnValidInvoinceAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
}
catch
{
}
}
///
/// 装车冲减时,删除已经假删除的数据
///
///
///
///
private void DeleteAskplanIdLoadCredit(string balanceSubject, string buyercode, string askPlan_id)
{
string errMsg = "";
try
{
base.GetFundPactUsedDetailInstance().DeleteUnValidDelivAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
base.GetFundPactUsedDetailInstance().DeleteUnValidLoadAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
}
catch
{
}
}
private string _errMsgNoCustAccount = "客户账户未创建,请先创建客户的资金账户";
private string _errMsgException = "异常错误";
}
}