SelFundPactControl.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using CoreFS.CA06;
  7. using DbHelp = Core.StlMes.Client.Sale.DbHelp;
  8. namespace Core.StlMes.Client.Sale.SaleFundMgt.FundBLL.SelFundPactControl
  9. {
  10. /// <summary>
  11. /// 外端调用资金系统的入口类
  12. /// 合同生效扣款:外端构造参数Model.SEL_FUND_CONTROL_PACT,外端判断是否是出口合同
  13. /// 下车扣款参数见定义
  14. /// </summary>
  15. public class SelFundPactControl:FundBaseBLL.FundBaseBLL
  16. {
  17. private OpeBase _ob;
  18. public SelFundPactControl(OpeBase ob)
  19. : base(ob)
  20. {
  21. _ob = ob;
  22. }
  23. /// <summary>
  24. /// 合同生效扣款
  25. /// </summary>
  26. /// <param name="pact"></param>
  27. /// <param name="errMsg"></param>
  28. public virtual void PayMentForPactToEffect(Model.SEL_FUND_CONTROL_PACT pact, out string errMsg)
  29. {
  30. errMsg = "";
  31. // 是否进行资金控制
  32. if (!FundVariable.FundConstVariable.isOpenFundControlMode)
  33. return;
  34. // 事务点
  35. DbHelp.DbTransaction transaction = base.GetTransaction();
  36. try
  37. {
  38. string secondLevelAccount = "";
  39. // 获取随机数
  40. string busiseq = Common.SaleFundCommon.GetBusiSeq();
  41. Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
  42. // 参数检查
  43. if (!Model.SEL_FUND_CONTROL_PACT.IsValid(pact, out errMsg))
  44. {
  45. return;
  46. }
  47. // 检查客户账户是否存在,不存在则提示错误,退出
  48. Model.SEL_FUND_CUST_ACCOUNT acct =
  49. base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(pact.CUSTCONTROL.BALANCESUBJECT,
  50. pact.CUSTCONTROL.BUYERCODE);
  51. if (acct == null)
  52. {
  53. errMsg = _errMsgNoCustAccount;
  54. return;
  55. }
  56. // 金额,这里有三个,总金额,货款,运费,如果货款为0,运费不为0,则也不处理
  57. if (pact.MONEY == 0)
  58. return;
  59. // 检测合同账号和二级账号,顺延创建二级账户和合同账户
  60. // 创建规则,有则跳过,没有则创建,减少一些不必要的判断
  61. // 获取其二级账户
  62. secondLevelAccount = base.GetFundPactAccountRelationInstance().GetHighestPriorRealationByRelName(pact.PRODLINE);
  63. // 不存在,则取默认
  64. if (secondLevelAccount.Length == 0)
  65. {
  66. secondLevelAccount = FundVariable.FundConstVariable.defaultSecondLevelAccount;
  67. }
  68. Model.SEL_FUND_PACT_ACCOUNT fundpact =
  69. base.GetFundPactAccount(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, secondLevelAccount, pact.PACTNO);
  70. fundpact.IMPORTOR = "System";
  71. // 创建二级账户和合同账户
  72. new FundBLL.FundSecondLevelAccount.FundSecondlevelAccountMgt(this._ob).CreateSecondLevelAccountAndPactAccount(fundpact, out errMsg);
  73. pact01 =
  74. base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
  75. (pact.CUSTCONTROL.BALANCESUBJECT,pact.CUSTCONTROL.BUYERCODE,pact.PACTNO);
  76. // 资金不足,退出
  77. if (!IsMoneyEnoughForPactEffect(pact01, pact.PAYMONEY, out errMsg))
  78. {
  79. return;
  80. }
  81. else
  82. {
  83. // 构造类
  84. Model.SEL_FUND_TRANS_PACT act = base.GetSelFundTransPact
  85. (pact01.BALANCESUBJECT, pact01.BUYERCODE, pact01.SECONDACCOUNT, pact01.PACTNO, -pact.PAYMONEY);
  86. pact.SECONDLEVELACCOUNT = pact01.SECONDACCOUNT;
  87. // 明细记录
  88. Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail(pact, busiseq, FundVariable.FundConstVariable._transTypePactEffect );
  89. // 开始事务
  90. transaction.BeginTransaction();
  91. // 合同账户扣款
  92. // base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
  93. // 先将原有的明细记录设置为无效
  94. base.GetFundPactUsedDetailInstance().UpdatePactEffectMoneyToUnValid(detail.BALANCESUBJECT,detail.BUYERCODE,detail.SECONDACCOUNT,detail.PACTNO,
  95. transaction);
  96. // 写明细记录
  97. // 排产款显示负数
  98. detail.MONEY = -detail.MONEY;
  99. detail.ASKPLAN_MONEY = -detail.ASKPLAN_MONEY;
  100. detail.TRANS_MONEY = -detail.TRANS_MONEY;
  101. base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
  102. // 提交
  103. transaction.Commit();
  104. // 记录明细
  105. errMsg = transaction.ErrMsg;
  106. }
  107. }
  108. catch(Exception ex)
  109. {
  110. errMsg = ex.Message;
  111. transaction.RollBack();
  112. }
  113. }
  114. private FundBLL.FundTransferMgt.FundTransferMgt GetInstanceTrans()
  115. {
  116. return new FundBLL.FundTransferMgt.FundTransferMgt(this._ob);
  117. }
  118. public Boolean IsAskplanIdExists(string balancesubject, string askPlanid)
  119. {
  120. return base.GetFundPactUsedDetailInstance().IsAskplanIdExists(balancesubject,askPlanid);
  121. }
  122. /// <summary>
  123. /// 检查一个车是否有装车冲减
  124. /// </summary>
  125. /// <param name="balancesubject"></param>
  126. /// <param name="askPlanid"></param>
  127. /// <returns></returns>
  128. public Boolean IsAskplanIdExistsLoad(string balancesubject, string askPlanid)
  129. {
  130. return base.GetFundPactUsedDetailInstance().IsAskplanIdExistsLoad(balancesubject, askPlanid);
  131. }
  132. /// <summary>
  133. /// 检查一个车是否有结算冲减
  134. /// </summary>
  135. /// <param name="balancesubject"></param>
  136. /// <param name="askPlanid"></param>
  137. /// <returns></returns>
  138. public Boolean IsAskplanIdExistsInvoince(string balancesubject, string askPlanid)
  139. {
  140. return base.GetFundPactUsedDetailInstance().IsAskplanIdExistsInvoince(balancesubject, askPlanid);
  141. }
  142. /// <summary>
  143. /// 判断资金是否足够,主要针对下车等实用剩余资金使用的
  144. /// </summary>
  145. /// <param name="pact"></param>
  146. /// <param name="RequestMoney"></param>
  147. /// <param name="errMsg"></param>
  148. /// <returns></returns>
  149. protected Boolean IsMoneyEnough(Model.SEL_FUND_PACT_ACCOUNT pact,double RequestMoney,out string errMsg)
  150. {
  151. errMsg = "";
  152. // 参数是否有效
  153. if (!Model.SEL_FUND_PACT_ACCOUNT.IsReasonable(pact, out errMsg))
  154. {
  155. return false;
  156. }
  157. Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
  158. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
  159. Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
  160. (pact.BALANCESUBJECT, pact.BUYERCODE);
  161. // 客户资金不足
  162. if (pact.LEAVEMONEY < RequestMoney)
  163. {
  164. // 检查二级账户资金+合同账户资金是否足够
  165. if (pact02 == null)
  166. {
  167. errMsg = _errMsgException;
  168. return false;
  169. }
  170. if (pact02.LEAVEMONEY + pact.LEAVEMONEY < RequestMoney)
  171. {
  172. // 检查三级账户+二级账户+合同账户是否足够
  173. if (pact03 == null)
  174. {
  175. errMsg = _errMsgException;
  176. return false;
  177. }
  178. if (pact03.LEAVEMONEY + pact02.LEAVEMONEY + pact.LEAVEMONEY < RequestMoney)
  179. {
  180. errMsg = base._errMsgMoneyNotEnough;
  181. return false;
  182. }
  183. else
  184. {
  185. // 资金足够,先将资金从客户账户转到二级账户,再从二级账户转到合同账户
  186. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  187. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY - pact02.LEAVEMONEY);
  188. // 转二级账户
  189. this.GetInstanceTrans().TransferMoneyCustToSecondAccount(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
  190. // 二级转三级
  191. traspact =
  192. base.GetSelFundTransPact
  193. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY);
  194. this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
  195. return true;
  196. }
  197. }
  198. else
  199. { // 资金足够,则先将金额从二级账户转到合同账户
  200. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  201. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.LEAVEMONEY);
  202. new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
  203. if (errMsg.Length > 0)
  204. return false;
  205. return true;
  206. }
  207. }
  208. else
  209. {
  210. return true;
  211. }
  212. }
  213. /// <summary>
  214. /// 装车冲减or结算冲减后,需要填平合同账户的负数问题
  215. /// 资金如果有负数,体现到客户账户
  216. /// </summary>
  217. /// <param name="pact"></param>
  218. /// <param name="RequestMoney"></param>
  219. /// <param name="errMsg"></param>
  220. protected void TransMoneyToPactAfterCredit(Model.SEL_FUND_PACT_ACCOUNT pact, out string errMsg)
  221. {
  222. //
  223. errMsg = "";
  224. try
  225. {
  226. if (pact.LEAVEMONEY >= 0)
  227. return;
  228. Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
  229. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
  230. Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
  231. (pact.BALANCESUBJECT, pact.BUYERCODE);
  232. if (pact02.LEAVEMONEY + pact.LEAVEMONEY >= 0)
  233. {
  234. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  235. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY);
  236. new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
  237. }
  238. else
  239. {
  240. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  241. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY - pact02.LEAVEMONEY);
  242. // 转二级账户
  243. this.GetInstanceTrans().TransferMoneyCustToSecondAccountWithNoLeaveMoneyCheck(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
  244. // 二级转三级
  245. traspact =
  246. base.GetSelFundTransPact
  247. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, 0 - pact.LEAVEMONEY);
  248. this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
  249. }
  250. }
  251. catch(Exception ex)
  252. {
  253. errMsg = ex.Message;
  254. }
  255. }
  256. /// <summary>
  257. /// 主要针对合同生效实用,生效比较的是合同总资金,
  258. /// 生效扣款的过程就是锁定合同资金,而不是实用资金
  259. /// </summary>
  260. /// <param name="pact"></param>
  261. /// <param name="RequestMoney"></param>
  262. /// <param name="errMsg"></param>
  263. /// <returns></returns>
  264. protected Boolean IsMoneyEnoughForPactEffect(Model.SEL_FUND_PACT_ACCOUNT pact, double RequestMoney, out string errMsg)
  265. {
  266. errMsg = "";
  267. // 参数是否有效
  268. if (!Model.SEL_FUND_PACT_ACCOUNT.IsReasonable(pact, out errMsg))
  269. {
  270. return false;
  271. }
  272. Model.SEL_FUND_SECONDLEVEL_ACCOUNT pact02 = base.GetFundSecondAccountInstance().GetSelFundSecondAccountBySecondAccount
  273. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT);
  274. Model.SEL_FUND_CUST_ACCOUNT pact03 = base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode
  275. (pact.BALANCESUBJECT, pact.BUYERCODE);
  276. // 客户资金不足
  277. // 合同生效扣款性质类似锁资金,而不是实用资金,
  278. // 需要用总资金比较
  279. if (pact.TOTALMONEY < RequestMoney)
  280. {
  281. // 检查二级账户资金+合同账户资金是否足够
  282. if (pact02 == null)
  283. {
  284. errMsg = _errMsgException;
  285. return false;
  286. }
  287. if (pact02.LEAVEMONEY + pact.TOTALMONEY < RequestMoney)
  288. {
  289. // 检查三级账户+二级账户+合同账户是否足够
  290. if (pact03 == null)
  291. {
  292. errMsg = _errMsgException;
  293. return false;
  294. }
  295. if (pact03.LEAVEMONEY + pact02.LEAVEMONEY + pact.TOTALMONEY < RequestMoney)
  296. {
  297. errMsg = base._errMsgMoneyNotEnough;
  298. return false;
  299. }
  300. else
  301. {
  302. // 资金足够,先将资金从客户账户转到二级账户,再从二级账户转到合同账户
  303. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  304. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY - pact02.LEAVEMONEY);
  305. // 转二级账户
  306. this.GetInstanceTrans().TransferMoneyCustToSecondAccount(traspact.FUND_TRANS_SECONDACCOUNT, out errMsg);
  307. // 二级转三级
  308. traspact =
  309. base.GetSelFundTransPact
  310. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY);
  311. this.GetInstanceTrans().TransferMoneySecondAccountToPact(traspact, out errMsg);
  312. return true;
  313. }
  314. }
  315. else
  316. { // 资金足够,则先将金额从二级账户转到合同账户
  317. Model.SEL_FUND_TRANS_PACT traspact = base.GetSelFundTransPact
  318. (pact.BALANCESUBJECT, pact.BUYERCODE, pact.SECONDACCOUNT, pact.PACTNO, RequestMoney - pact.TOTALMONEY);
  319. new FundBLL.FundTransferMgt.FundTransferMgt(this._ob).TransferMoneySecondAccountToPact(traspact, out errMsg);
  320. if (errMsg.Length > 0)
  321. return false;
  322. return true;
  323. }
  324. }
  325. else
  326. {
  327. return true;
  328. }
  329. }
  330. /// <summary>
  331. /// 出库指示扣款
  332. /// </summary>
  333. /// <param name="dliv"></param>
  334. public virtual void PayMentForDeliver(Model.SEL_FUND_CONTROL_DLIV dliv, out string errMsg)
  335. {
  336. errMsg = "";
  337. string secondLevelAccount = "";
  338. // 不需要资金控制
  339. if (!FundVariable.FundConstVariable.isOpenFundControlMode)
  340. return;
  341. string busiseq = Common.SaleFundCommon.GetBusiSeq();
  342. DbHelp.DbTransaction transaction = base.GetTransaction();
  343. // 开始事务
  344. transaction.BeginTransaction();
  345. Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
  346. try
  347. {
  348. // 参数检查
  349. if (!Model.SEL_FUND_CONTROL_DLIV.IsValid(dliv,out errMsg))
  350. {
  351. errMsg = _errMsgException;
  352. return;
  353. }
  354. List<Model.SEL_FUND_CONTROL_PACT> pactlist =
  355. dliv.GetSelFundControlPactList();
  356. // 先删除原有 同号的车,并退出资金
  357. DeleteDelivPlan(pactlist[0].CUSTCONTROL.BALANCESUBJECT, pactlist[0].CUSTCONTROL.BUYERCODE, dliv.ASKPLAN_ID, out errMsg);
  358. //if (errMsg.Length > 0)
  359. // return;
  360. // 先检查所有合同资金是否足够
  361. foreach (Model.SEL_FUND_CONTROL_PACT pact in pactlist)
  362. {
  363. // 参数检查
  364. if (!Model.SEL_FUND_CONTROL_PACT.IsValid(pact, out errMsg))
  365. {
  366. return;
  367. }
  368. // 检查客户账户是否存在,不存在则提示错误,退出
  369. Model.SEL_FUND_CUST_ACCOUNT acct =
  370. base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(pact.CUSTCONTROL.BALANCESUBJECT,
  371. pact.CUSTCONTROL.BUYERCODE);
  372. if (acct == null)
  373. {
  374. errMsg = _errMsgNoCustAccount;
  375. return;
  376. }
  377. // 金额,这里有三个,总金额,货款,运费,如果货款为0,运费不为0,则也不处理
  378. if (pact.MONEY == 0)
  379. continue;
  380. // 检测合同账号和二级账号,顺延创建二级账户和合同账户
  381. // 创建规则,有则跳过,没有则创建,减少一些不必要的判断
  382. // 获取其二级账户
  383. secondLevelAccount = base.GetFundPactAccountRelationInstance().GetHighestPriorRealationByRelName(pact.PRODLINE);
  384. // 不存在,则取默认
  385. if (secondLevelAccount.Length == 0)
  386. {
  387. secondLevelAccount = FundVariable.FundConstVariable.defaultSecondLevelAccount;
  388. }
  389. Model.SEL_FUND_PACT_ACCOUNT fundpact =
  390. base.GetFundPactAccount(pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, secondLevelAccount, pact.PACTNO);
  391. fundpact.IMPORTOR = "System";
  392. // 创建二级账户和合同账户
  393. new FundBLL.FundSecondLevelAccount.FundSecondlevelAccountMgt(this._ob).CreateSecondLevelAccountAndPactAccount(fundpact, out errMsg);
  394. pact01 =
  395. base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
  396. (pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, pact.PACTNO);
  397. // 资金不足,退出
  398. if (!IsMoneyEnough(pact01, pact.PAYMONEY, out errMsg))
  399. {
  400. return;
  401. }
  402. }
  403. // 资金充足情况,写明细
  404. foreach (Model.SEL_FUND_CONTROL_PACT pact in pactlist)
  405. {
  406. if (pact.PAYMONEY == 0)
  407. continue;
  408. // transaction.BeginTransaction();
  409. // 合同账户信息
  410. pact01 =
  411. base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
  412. (pact.CUSTCONTROL.BALANCESUBJECT, pact.CUSTCONTROL.BUYERCODE, pact.PACTNO);
  413. // 构造类
  414. Model.SEL_FUND_TRANS_PACT act = base.GetSelFundTransPact
  415. (pact01.BALANCESUBJECT, pact01.BUYERCODE, pact01.SECONDACCOUNT, pact01.PACTNO, -pact.PAYMONEY);
  416. pact.SECONDLEVELACCOUNT = pact01.SECONDACCOUNT;
  417. // 明细记录
  418. Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail(pact, busiseq, FundVariable.FundConstVariable._transTypePactDeliver);
  419. detail.ASKPLAN_ID = dliv.ASKPLAN_ID;
  420. // 合同账户扣款
  421. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
  422. // 先将原有的明细记录设置为无效
  423. base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
  424. dliv.ASKPLAN_ID, transaction);
  425. // 写明细记录
  426. base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
  427. // 记录明细
  428. errMsg = transaction.ErrMsg;
  429. transaction.Commit();
  430. }
  431. }
  432. catch(Exception ex)
  433. {
  434. errMsg = ex.Message;
  435. transaction.RollBack();
  436. }
  437. }
  438. /// <summary>
  439. /// 装车冲减
  440. /// </summary>
  441. /// <param name="balncesubject"></param>
  442. /// <param name="buyercode"></param>
  443. /// <param name="askPlanid"></param>
  444. /// <param name="errMsg"></param>
  445. public virtual void PayMentForLoad(string balncesubject,string buyercode,string askPlanid,string carNo, List<Model.SEL_FUND_CONTROL_PACT_DLIV> listPactDliv, out string errMsg)
  446. {
  447. // 检查是否有结算冲减的数据,如果有,则不允许冲减
  448. List<Model.SEL_FUND_PACT_FUNDUSEDETAIL> listInvoince =
  449. base.GetFundPactUsedDetailInstance().GetSelFundPctUsedInvoiceByBalanceAndBuyercodeAndAskplanId(balncesubject, buyercode, askPlanid);
  450. if (listInvoince != null && listInvoince.Count > 0)
  451. {
  452. errMsg = "存在结算信息,不允许装车冲减";
  453. return;
  454. }
  455. // 删除下车,包括退款
  456. DeleteDelivPlan(balncesubject, buyercode, askPlanid, out errMsg);
  457. // 删除装车,包括退款
  458. DeleteDelivLoad(balncesubject, buyercode, askPlanid, out errMsg);
  459. DlivCredit(balncesubject, buyercode, askPlanid, carNo, listPactDliv, FundVariable.FundConstVariable._transTypePactLoad, out errMsg);
  460. // 检查客户账户是否有负数,如果有,且其子账户有资金,则需要填平客户账户
  461. // 是否需要由开关FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero 决定
  462. UpdateCustAccountLeaveMoneyToGreaterThanZero(balncesubject,buyercode);
  463. this.DeleteAskplanIdLoadCredit(balncesubject, buyercode, askPlanid);
  464. }
  465. /// <summary>
  466. /// 结算冲减
  467. /// </summary>
  468. /// <param name="balncesubject"></param>
  469. /// <param name="buyercode"></param>
  470. /// <param name="askPlanid"></param>
  471. /// <param name="errMsg"></param>
  472. public virtual void PayMentForInvoice(string balncesubject, string buyercode, string askPlanid, string carNo, List<Model.SEL_FUND_CONTROL_PACT_DLIV> listPactDliv, out string errMsg)
  473. {
  474. // 删除下车,包括退款
  475. DeleteDelivPlan(balncesubject, buyercode, askPlanid, out errMsg);
  476. // 删除装车,包括退款
  477. DeleteDelivLoad(balncesubject, buyercode, askPlanid, out errMsg);
  478. // 删除结算数据
  479. DeleteDelivInvoice(balncesubject, buyercode, askPlanid, out errMsg);
  480. DlivCredit(balncesubject, buyercode, askPlanid, carNo, listPactDliv, FundVariable.FundConstVariable._transTypePactInvoice, out errMsg);
  481. // 检查客户账户是否有负数,如果有,且其子账户有资金,则需要填平客户账户
  482. // 是否需要由开关FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero 决定
  483. UpdateCustAccountLeaveMoneyToGreaterThanZero(balncesubject, buyercode);
  484. DeleteAskplanIdInvoiceCredit(balncesubject, buyercode, askPlanid);
  485. }
  486. /// <summary>
  487. /// 检查一个客户账户资金是否为负数,如果是,则检查其下面账户是否有剩余资金大于0
  488. /// 如果有,则需要先填充客户账户
  489. /// </summary>
  490. /// <param name="balancesubject"></param>
  491. /// <param name="buyercode"></param>
  492. public void UpdateCustAccountLeaveMoneyToGreaterThanZero(string balancesubject,string buyercode)
  493. {
  494. if (!FundVariable.FundConstVariable.isUpdateCustAccountLeavemoneyToGreaterThanZero)
  495. return;
  496. Model.SEL_FUND_CUST_ACCOUNT acct =
  497. base.GetFundCustAccountInstance().GetSelFundCustAccountModelByBalanceAndBuyercode(balancesubject,buyercode);
  498. if (acct == null)
  499. return;
  500. if (acct.LEAVEMONEY >= 0)
  501. return;
  502. List<Model.SEL_FUND_SECONDLEVEL_ACCOUNT> list
  503. = base.GetFundSecondAccountInstance().GetSelFundSecondAccountByBalanceSubjectAndBuyercode(balancesubject, buyercode);
  504. if (list == null || list.Count == 0)
  505. return;
  506. string errMsg = "";
  507. Model.SEL_FUND_TRANS_SECONDACCOUNT sectransact = null;
  508. // 总共需要填平的资金
  509. double totalMoney = -acct.LEAVEMONEY;
  510. // 每个二级账户去找,直到资金足够填充客户的剩余资金
  511. foreach (Model.SEL_FUND_SECONDLEVEL_ACCOUNT secacct in list)
  512. {
  513. if (totalMoney == 0)
  514. break;
  515. // 二级账户资金足够填充,则从二级账户扣
  516. if (secacct.LEAVEMONEY + acct.LEAVEMONEY >= 0)
  517. {
  518. sectransact = GetTransSecondAct(GetTransCust(balancesubject, buyercode, -acct.LEAVEMONEY), secacct.SECONDACCOUNT, -acct.LEAVEMONEY);
  519. this.GetInstanceTrans().TransferMoneySecondAccountToCust(sectransact,out errMsg);
  520. break;
  521. }
  522. else
  523. {
  524. // 二级账户有剩余资金,先将其剩余资金转到客户账户
  525. if (secacct.LEAVEMONEY > 0)
  526. {
  527. sectransact = GetTransSecondAct(GetTransCust(balancesubject, buyercode, secacct.LEAVEMONEY), secacct.SECONDACCOUNT, secacct.LEAVEMONEY);
  528. this.GetInstanceTrans().TransferMoneySecondAccountToCust(sectransact, out errMsg);
  529. totalMoney = totalMoney - secacct.LEAVEMONEY;
  530. }
  531. List<Model.SEL_FUND_PACT_ACCOUNT> pactList = base.GetFundPactAccountInstance()
  532. .GetSelFundPactAccountByBalanceAndSecAccount(balancesubject, buyercode, secacct.SECONDACCOUNT);
  533. foreach (Model.SEL_FUND_PACT_ACCOUNT pactact in pactList)
  534. {
  535. if (totalMoney == 0)
  536. break;
  537. if (pactact.LEAVEMONEY <= 0)
  538. continue;
  539. Model.SEL_FUND_TRANS_PACT transpact = null;
  540. if (pactact.LEAVEMONEY <= totalMoney)
  541. {
  542. transpact =
  543. this.GetTransPact(GetTransSecondAct(GetTransCust(balancesubject, buyercode, pactact.LEAVEMONEY), secacct.SECONDACCOUNT, pactact.LEAVEMONEY),
  544. pactact.PACTNO, pactact.LEAVEMONEY);
  545. totalMoney = totalMoney - pactact.LEAVEMONEY;
  546. }
  547. else
  548. {
  549. transpact =
  550. this.GetTransPact(GetTransSecondAct(GetTransCust(balancesubject, buyercode, totalMoney), secacct.SECONDACCOUNT, totalMoney),
  551. pactact.PACTNO, totalMoney);
  552. totalMoney = 0;
  553. }
  554. // 转二级
  555. this.GetInstanceTrans().TransferMoneyPactToSecondAccount(transpact, out errMsg);
  556. // 转客户
  557. this.GetInstanceTrans().TransferMoneySecondAccountToCust(transpact.FUND_TRANS_SECONDACCOUNT, out errMsg);
  558. }
  559. }
  560. }
  561. }
  562. /// <summary>
  563. ///
  564. /// </summary>
  565. /// <param name="balancesubject"></param>
  566. /// <param name="buyercode"></param>
  567. /// <param name="money"></param>
  568. /// <returns></returns>
  569. private Model.SEL_FUND_TRANS_CUST GetTransCust(string balancesubject,string buyercode,double money)
  570. {
  571. return new Model.SEL_FUND_TRANS_CUST(balancesubject, buyercode, money, "System", Util.DateTimeUtil.GetSystemDate());
  572. }
  573. private Model.SEL_FUND_TRANS_SECONDACCOUNT GetTransSecondAct(Model.SEL_FUND_TRANS_CUST cust, string secondact, double money)
  574. {
  575. return new Model.SEL_FUND_TRANS_SECONDACCOUNT(cust, secondact, money);
  576. }
  577. private Model.SEL_FUND_TRANS_PACT GetTransPact(Model.SEL_FUND_TRANS_SECONDACCOUNT secact,string pactno,double money)
  578. {
  579. Model.SEL_FUND_TRANS_PACT pact = new Model.SEL_FUND_TRANS_PACT();
  580. pact.FUND_TRANS_SECONDACCOUNT = secact;
  581. pact.PACTNO = pactno;
  582. pact.TRANS_MONEY = money;
  583. return pact;
  584. }
  585. /// <summary>
  586. /// 冲减共用方法
  587. /// </summary>
  588. /// <param name="balncesubject"></param>
  589. /// <param name="buyercode"></param>
  590. /// <param name="askPlanid"></param>
  591. /// <param name="carNo"></param>
  592. /// <param name="listPactDliv"></param>
  593. /// <param name="errMsg"></param>
  594. private void DlivCredit(string balncesubject, string buyercode, string askPlanid, string carNo, List<Model.SEL_FUND_CONTROL_PACT_DLIV> listPactDliv, string transType,out string errMsg)
  595. {
  596. errMsg = "";
  597. Model.SEL_FUND_CONTROL_PACT pact = null;
  598. Model.SEL_FUND_PACT_ACCOUNT pact01 = null;
  599. // 构造类
  600. Model.SEL_FUND_TRANS_PACT act = null;
  601. DbHelp.DbTransaction transaction = base.GetTransaction();
  602. transaction.BeginTransaction();
  603. try
  604. {
  605. foreach (Model.SEL_FUND_CONTROL_PACT_DLIV dliv in listPactDliv)
  606. {
  607. pact01 =
  608. base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
  609. (balncesubject, buyercode, dliv.PACTNO);
  610. Model.SEL_FUND_CONTROL_CUST cust = new Model.SEL_FUND_CONTROL_CUST
  611. (balncesubject, buyercode, "System", Util.DateTimeUtil.GetSystemDate());
  612. // 合同账户扣款
  613. pact = new Model.SEL_FUND_CONTROL_PACT
  614. (cust, pact01.SECONDACCOUNT, dliv.PACTNO, dliv.PRODLINE, dliv.WEIGHT, dliv.MONEY, dliv.TRANSMONEY);
  615. // 合同账户扣款
  616. act = base.GetSelFundTransPact(balncesubject, buyercode, pact01.SECONDACCOUNT, dliv.PACTNO, -dliv.MONEY - dliv.TRANSMONEY);
  617. Model.SEL_FUND_PACT_FUNDUSEDETAIL detail = Model.SEL_FUND_PACT_FUNDUSEDETAIL.GetSelFundPactUsedDetail
  618. (pact, Common.SaleFundCommon.GetBusiSeq(), transType);
  619. detail.ASKPLAN_ID = askPlanid;
  620. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
  621. base.GetFundPactUsedDetailInstance().Insert(detail, transaction);
  622. }
  623. transaction.Commit();
  624. foreach (Model.SEL_FUND_CONTROL_PACT_DLIV dliv in listPactDliv)
  625. {
  626. try
  627. {
  628. TransMoneyToPactAfterCredit(base.GetFundPactAccountInstance().GetSelFundPactAccountByBalanceAndBuyerCodeAndPactno
  629. (balncesubject, buyercode, dliv.PACTNO), out errMsg);
  630. }
  631. catch
  632. {
  633. }
  634. }
  635. }
  636. catch (Exception ex)
  637. {
  638. errMsg = ex.Message;
  639. transaction.RollBack();
  640. }
  641. }
  642. /// <summary>
  643. /// 删除一个出库指示,带事务,用在下车时用
  644. /// </summary>
  645. /// <param name="balanceSubject"></param>
  646. /// <param name="buyercode"></param>
  647. /// <param name="askPlan_id"></param>
  648. /// <param name="transaction"></param>
  649. public virtual void DeleteDelivPlan(string balanceSubject, string buyercode, string askPlan_id, DbHelp.DbTransaction transaction)
  650. {
  651. try
  652. {
  653. List<Model.SEL_FUND_PACT_FUNDUSEDETAIL> detal
  654. = base.GetFundPactUsedDetailInstance().GetSelFundPctUsedDelivByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
  655. if (detal == null)
  656. return;
  657. if (detal.Count == 0)
  658. return;
  659. Model.SEL_FUND_TRANS_PACT act = null;
  660. foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
  661. {
  662. act = base.GetSelFundTransPact
  663. (detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
  664. // 退钱到合同账户
  665. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
  666. // 先将原有的明细记录设置为无效
  667. base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
  668. detail.ASKPLAN_ID, transaction);
  669. }
  670. }
  671. catch(Exception ex)
  672. {
  673. transaction.ErrMsg = ex.Message;
  674. transaction.RollBack ();
  675. }
  676. }
  677. /// <summary>
  678. /// 删除一个出库指示,不带事务,在界面做删除操作时使用
  679. /// </summary>
  680. /// <param name="balanceSubject">结算单位</param>
  681. /// <param name="buyercode">客户编码</param>
  682. /// <param name="askPlan_id">计划单号</param>
  683. /// <param name="errMsg"></param>
  684. public virtual void DeleteDelivPlan(string balanceSubject, string buyercode, string askPlan_id,out string errMsg)
  685. {
  686. DbHelp.DbTransaction transaction = base.GetTransaction();
  687. errMsg = "";
  688. try
  689. {
  690. transaction.BeginTransaction();
  691. List<Model.SEL_FUND_PACT_FUNDUSEDETAIL> detal
  692. = base.GetFundPactUsedDetailInstance().GetSelFundPctUsedDelivByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
  693. if (detal == null)
  694. return;
  695. if (detal.Count == 0)
  696. return;
  697. Model.SEL_FUND_TRANS_PACT act = null;
  698. foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
  699. {
  700. act = base.GetSelFundTransPact
  701. (detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
  702. // 退钱到合同账户
  703. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, out errMsg);
  704. // 先将原有的明细记录设置为无效
  705. base.GetFundPactUsedDetailInstance().UpdateDlivMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
  706. detail.ASKPLAN_ID, out errMsg);
  707. }
  708. transaction.Commit();
  709. }
  710. catch(Exception ex)
  711. {
  712. errMsg = ex.Message;
  713. transaction.RollBack();
  714. }
  715. }
  716. /// <summary>
  717. /// 删除装车数据并退款
  718. /// </summary>
  719. /// <param name="balanceSubject"></param>
  720. /// <param name="buyercode"></param>
  721. /// <param name="askPlan_id"></param>
  722. /// <param name="transaction"></param>
  723. public virtual void DeleteDelivLoad(string balanceSubject, string buyercode, string askPlan_id, out string errMsg)
  724. {
  725. DbHelp.DbTransaction transaction = base.GetTransaction();
  726. errMsg = "";
  727. try
  728. {
  729. transaction.BeginTransaction();
  730. List<Model.SEL_FUND_PACT_FUNDUSEDETAIL> detal
  731. = base.GetFundPactUsedDetailInstance().GetSelFundPctUsedLoadByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
  732. if (detal == null)
  733. return;
  734. if (detal.Count == 0)
  735. return;
  736. Model.SEL_FUND_TRANS_PACT act = null;
  737. foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
  738. {
  739. act = base.GetSelFundTransPact
  740. (detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
  741. // 退钱到合同账户
  742. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, out errMsg);
  743. // 先将原有的明细记录设置为无效
  744. base.GetFundPactUsedDetailInstance().UpdateLoadMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
  745. detail.ASKPLAN_ID, out errMsg);
  746. }
  747. transaction.Commit();
  748. }
  749. catch (Exception ex)
  750. {
  751. transaction.ErrMsg = ex.Message;
  752. transaction.RollBack();
  753. }
  754. }
  755. /// <summary>
  756. /// 删除结算数据并退款
  757. /// </summary>
  758. /// <param name="balanceSubject"></param>
  759. /// <param name="buyercode"></param>
  760. /// <param name="askPlan_id"></param>
  761. /// <param name="errMsg"></param>
  762. public virtual void DeleteDelivInvoice(string balanceSubject, string buyercode, string askPlan_id, out string errMsg)
  763. {
  764. DbHelp.DbTransaction transaction = base.GetTransaction();
  765. errMsg = "";
  766. try
  767. {
  768. transaction.BeginTransaction();
  769. List<Model.SEL_FUND_PACT_FUNDUSEDETAIL> detal
  770. = base.GetFundPactUsedDetailInstance().GetSelFundPctUsedInvoiceByBalanceAndBuyercodeAndAskplanId(balanceSubject, buyercode, askPlan_id);
  771. if (detal == null)
  772. return;
  773. if (detal.Count == 0)
  774. return;
  775. Model.SEL_FUND_TRANS_PACT act = null;
  776. foreach (Model.SEL_FUND_PACT_FUNDUSEDETAIL detail in detal)
  777. {
  778. act = base.GetSelFundTransPact
  779. (detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO, detail.MONEY);
  780. // 退钱到合同账户
  781. base.GetFundPactAccountInstance().AddFundPactAccountLeaveMoney(act, transaction);
  782. // 先将原有的明细记录设置为无效
  783. base.GetFundPactUsedDetailInstance().UpdateInvoiceMoneyToUnValid(detail.BALANCESUBJECT, detail.BUYERCODE, detail.SECONDACCOUNT, detail.PACTNO,
  784. detail.ASKPLAN_ID, transaction);
  785. }
  786. transaction.Commit();
  787. }
  788. catch (Exception ex)
  789. {
  790. transaction.ErrMsg = ex.Message;
  791. transaction.RollBack();
  792. }
  793. }
  794. /// <summary>
  795. /// 结算冲减时,删除无效数据,真删除
  796. /// </summary>
  797. /// <param name="balanceSubject"></param>
  798. /// <param name="buyercode"></param>
  799. /// <param name="askPlan_id"></param>
  800. private void DeleteAskplanIdInvoiceCredit(string balanceSubject, string buyercode, string askPlan_id)
  801. {
  802. string errMsg = "";
  803. try
  804. {
  805. base.GetFundPactUsedDetailInstance().DeleteUnValidDelivAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
  806. base.GetFundPactUsedDetailInstance().DeleteUnValidLoadAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
  807. base.GetFundPactUsedDetailInstance().DeleteUnValidInvoinceAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
  808. }
  809. catch
  810. {
  811. }
  812. }
  813. /// <summary>
  814. /// 装车冲减时,删除已经假删除的数据
  815. /// </summary>
  816. /// <param name="balanceSubject"></param>
  817. /// <param name="buyercode"></param>
  818. /// <param name="askPlan_id"></param>
  819. private void DeleteAskplanIdLoadCredit(string balanceSubject, string buyercode, string askPlan_id)
  820. {
  821. string errMsg = "";
  822. try
  823. {
  824. base.GetFundPactUsedDetailInstance().DeleteUnValidDelivAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
  825. base.GetFundPactUsedDetailInstance().DeleteUnValidLoadAskPlanId(balanceSubject, buyercode, askPlan_id, out errMsg);
  826. }
  827. catch
  828. {
  829. }
  830. }
  831. private string _errMsgNoCustAccount = "客户账户未创建,请先创建客户的资金账户";
  832. private string _errMsgException = "异常错误";
  833. }
  834. }