You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DS7/DSWeb/EntityDA/FeePaySettleDA.cs

1342 lines
89 KiB
C#

2 years ago
using System;
using System.Data;
using System.Data.SqlClient;
using WebSqlHelper;
using DSWeb.Models;
using System.Collections;
using System.Collections.Generic;
namespace DSWeb.EntityDA
{
public class FeePaySettleDA
{
//ch_fee_settlement
private const string PARM_FEE_SETTLEMENT_GID = "@gid";
private const string PARM_FEE_SETTLEMENT_BILL_NO = "@bill_no";
private const string PARM_FEE_SETTLEMENT_BILL_DATE = "@bill_date";
private const string PARM_FEE_SETTLEMENT_SETTLE_MODE = "@settle_mode";
private const string PARM_FEE_SETTLEMENT_CUSTOMER_NAME = "@customer_name";
private const string PARM_FEE_SETTLEMENT_SETTLE_TYPE = "@settle_type";
private const string PARM_FEE_SETTLEMENT_AMOUNT_RMB = "@amount_rmb";
private const string PARM_FEE_SETTLEMENT_ACCOUNT_RMB = "@account_rmb";
private const string PARM_FEE_SETTLEMENT_RATE = "@rate";
private const string PARM_FEE_SETTLEMENT_AMOUNT_USD = "@amount_usd";
private const string PARM_FEE_SETTLEMENT_ACCOUNT_USD = "@account_usd";
private const string PARM_FEE_SETTLEMENT_BILL_TYPE = "@bill_type";
private const string PARM_FEE_SETTLEMENT_VOUCHER_NO = "@voucher_no";
private const string PARM_FEE_SETTLEMENT_SETTLE_USER = "@settle_user";
private const string PARM_FEE_SETTLEMENT_SETTLE_TIME = "@settle_time";
private const string PARM_FEE_SETTLEMENT_AUDIT_USER = "@audit_user";
private const string PARM_FEE_SETTLEMENT_AUDIT_TIME = "@audit_time";
private const string PARM_FEE_SETTLEMENT_IS_EXPORT = "@is_export";
private const string PARM_FEE_SETTLEMENT_FINANCIAL_VOUCHER = "@financial_voucher";
private const string PARM_FEE_SETTLEMENT_BILL_STATUS = "@bill_status";
private const string PARM_FEE_SETTLEMENT_REMARK = "@remark";
private const string PARM_FEE_SETTLEMENT_IS_DELETE = "@is_delete";
private const string PARM_FEE_SETTLEMENT_DELETE_USER = "@delete_user";
private const string PARM_FEE_SETTLEMENT_DELETE_TIME = "@delete_time";
private const string PARM_FEE_SETTLEMENT_LIKE = "@like";
private const string PARM_FEE_SETTLEMENT_COMPANY_ID = "@company_id";
//ch_fee_settle_link
private const string PARM_FEE_SETTLE_LINK = "@gid";
//ch_fee_do
private const string PARM_FEE_DO_GID = "@gid";
private const string PARM_FEE_DO_BILL_NO = "@bill_no";
private const string PARM_FEE_DO_BSNO = "@bsno";
private const string PARM_FEE_DO_MBL_NO = "@mbl_no";
private const string PARM_FEE_DO_HBL_NO = "@nbl_no";
private const string PARM_FEE_DO_CUSTOMER_NAME = "@customer_name";
private const string PARM_FEE_DO_BSTYPE = "@bs_type";
private const string PARM_FEE_DO_FEE_ID = "@fee_id";
private const string PARM_FEE_DO_FEE_NAME = "@fee_name";
private const string PARM_FEE_DO_CURRENCY = "@currency";
private const string PARM_FEE_DO_AMOUNT = "@amount";
private const string PARM_FEE_DO_DO_AMOUNT = "@do_amount";
private const string PARM_FEE_DO_FEE_TYPE = "@fee_type";
private const string PARM_FEE_DO_CATEGORY = "@category";
private const string PARM_FEE_DO_BILL_STATUS = "@bill_status";
private const string PARM_FEE_DO_REMARK = "@remark";
private const string PARM_FEE_DO_EXCHANGE_RATE = "@exchange_rate";
private const string PARM_FEE_DO_COMPANY_ID = "@company_id";
private const string PARM_FEE_DO_DELETE_USER = "@delete_user";
private const string PARM_FEE_DO_ORIG_AMOUNT = "@orig_amount";
//ch_fee
private const string PARM_FEE_GID = "@gid";
private const string PARM_FEE_STATUS = "@fee_status";
private const string PARM_FEE_SETTLEMENT = "@settlement";
private const string PARM_FEE_CHEQUE_NUM = "@cheque_num";
//fee_gain
private const string PARM_FEE_GAIN_STL_CR_RMB = "@stl_crrmb";
private const string PARM_FEE_GAIN_STL_CR_USD = "@stl_crusd";
private const string PARM_FEE_GAIN_STL_CR_TTL = "@stl_crttl";
private const string PARM_FEE_GAIN_BSNO = "@bsno";
//run_fee_settlement
private const string PARM_RUN_FEE_SETTLEMENT_GID = "@gid";
private const string PARM_RUN_FEE_SETTLEMENT_BILL_NO = "@bill_no";
private const string PARM_RUN_FEE_SETTLEMENT_APPLICANT = "@applicant";
private const string PARM_RUN_FEE_SETTLEMENT_SETTLE_USER = "@settle_user";
private const string PARM_RUN_FEE_SETTLEMENT_REMARK = "@remark";
private const string PARM_RUN_FEE_SETTLEMENT_PAYSETTLE_ID = "@paysettle_id";
private const string PARM_RUN_FEE_SETTLEMENT_COMPANY_ID = "@company_id";
//run_fee_do
private const string PARM_RUN_FEE_DO_BILL_NO = "@bill_no";
private const string PARM_RUN_FEE_DO_RUN_SETTLE_ID = "@runsettle_id";
//结算关联表ch_fee_settle_link
private const string PARM_CH_FEE_SETTLE_LINK = "@gid";
private const string PARM_CH_FEE_SETTLE_SETTLE_ID = "@settle_id";
private const string PARM_CH_FEE_SETTLE_TYPE = "@type";
private const string PARM_CH_FEE_SETTLE_RELATION_SUB_ID = "@relation_sub_id";
private const string PARM_CH_FEE_SETTLE_CREATE_USER = "@create_user";
private const string PARM_CH_FEE_SETTLE_CREATE_TIME = "@create_time";
//ch_fee_payapplication
private const string PARM_CH_FEE_PAY_APP_GID = "@gid";
private const string SQL_SELECT_GET_SERVERTIME = " SELECT GETDATE() ";//获取服务端时间
private const string SQL_SELECT_LAST_BILL_NO = " SELECT TOP 1 BILLNO FROM ch_fee_settlement WHERE BILLNO LIKE @like AND COMPANYID = @company_id ORDER BY BILLNO DESC ";
private const string SQL_INSERT_FEE_DO = " INSERT INTO ch_fee_do(GID,BILLNO,BSNO,MBLNO,HBLNO,CUSTOMERNAME,BSTYPE,FEEID,FEENAME,CURRENCY,AMOUNT,DOAMOUNT,FEETYPE,CATEGORY,BILLSTATUS,REMARK,EXCHANGERATE,COMPANYID,ORIGAMOUNT) "
+ " VALUES(@gid,@bill_no,@bsno,@mbl_no,@nbl_no,@customer_name,@bs_type,@fee_id,@fee_name,@currency,@amount,@do_amount,@fee_type,@category,@bill_status,@remark,@exchange_rate,@company_id,@orig_amount) ";
private const string SQL_UPDATE_FEE = " UPDATE ch_fee SET ch_fee.SETTLEMENT = ch_fee.SETTLEMENT+@settlement,ch_fee.FEESTATUS = C.FEESTATUS,ch_fee.CHEQUENUM = @cheque_num "
+ " FROM "
+ " (SELECT A.GID,CASE WHEN B.AMOUNT < A.AMOUNT THEN CASE WHEN B.AMOUNT+A.SETTLEMENT = A.AMOUNT THEN 9 ELSE 8 END ELSE "
+ " CASE WHEN B.AMOUNT = A.AMOUNT THEN 9 END END as FEESTATUS FROM ch_fee as A INNER JOIN ch_fee_do as B ON A.GID = B.FEEID WHERE B.GID = @gid) as C "
+ " WHERE C.GID = ch_fee.GID ";
//合计更新利润信息表
private const string SQL_UPDATE_FEE_GAIN = " UPDATE fee_gain SET STLCRRMB = ISNULL(STLCRRMB,0) + @stl_crrmb,STLCRUSD = ISNULL(STLCRUSD,0) + @stl_crusd,STLCRTTL = ISNULL(STLCRTTL,0) + @stl_crttl WHERE BSNO = @bsno ";
private string SQL_SELECT_FEE_SETTLEMENT_BY_GID = " SELECT GID, BILLNO, BILLDATE, SETTLEMODE, CUSTOMERNAME, SETTLETYPE, AMOUNTRMB, ACCOUNTRMB, RATE, AMOUNTUSD, ACCOUNTUSD,"
+ " BILLTYPE, VOUCHERNO, SETTLEUSER, SETTLETIME, AUDITUSER, AUDITTIME, ISEXPORT, FINANCIALVOUCHER, BILLSTATUS, REMARK FROM ch_fee_settlement WHERE GID = @gid";
private const string SQL_VALID_CH_FEE_SETTLEMENT_BY_RUNFEEDO = " SELECT COUNT(A.GID)-SUM(CASE WHEN C.AMOUNT = C.SETTLEMENT THEN -1 ELSE CASE WHEN (C.AMOUNT - C.SETTLEMENT) < A.ORIGAMOUNT THEN -1 ELSE "
+ " CASE WHEN (C.AMOUNT - C.SETTLEMENT) >= A.ORIGAMOUNT THEN 1 END END END) FROM run_fee_do as A INNER JOIN run_fee_settlement as B "
+ " ON A.RUNSETTLEID = B.GID INNER JOIN ch_fee as C ON A.FEEID = C.GID WHERE B.GID = @gid ";
//删除运行结算信息表
private const string SQL_DELETE_RUN_FEE_SETTLEMENT_BY_GID = " DELETE FROM run_fee_settlement WHERE GID = @gid ";
//删除运行结算明细表信息
private const string SQL_DELETE_RUN_FEE_DO_BY_RUNSETTLE_ID = " DELETE FROM run_fee_do WHERE RUNSETTLEID = @runsettle_id ";
//将运行结算明细表中的费用明细插入到ch_fee_do
private const string SQL_INSERT_CH_FEE_FEE_DO_RUN = " INSERT INTO ch_fee_do(GID,BILLNO,BSNO,MBLNO,HBLNO,CUSTOMERNAME,BSTYPE,FEEID,FEENAME,CURRENCY,AMOUNT,DOAMOUNT,FEETYPE,CATEGORY,BILLSTATUS,"
+ " REMARK,CREATETIME,EXCHANGERATE,ORIGCURRENCY,ORIGAMOUNT,INVOICESETTLENO,COMPANYID) "
+ " SELECT newid(),@bill_no,BSNO,MBLNO,HBLNO,CUSTOMERNAME,BSTYPE,FEEID,FEENAME,CURRENCY,AMOUNT,DOAMOUNT,FEETYPE,CATEGORY,BILLSTATUS,REMARK,GETDATE(), "
+ " EXCHANGERATE,ORIGCURRENCY,ORIGAMOUNT,INVOICESETTLENO,COMPANYID FROM run_fee_do WHERE RUNSETTLEID = @runsettle_id ";
private const string SQL_UPDATE_CH_FEE_BY_RUN_FEE_DO = " UPDATE ch_fee SET ch_fee.SETTLEMENT = ISNULL(ch_fee.SETTLEMENT,0) + ch_fee_do.ORIGAMOUNT,ch_fee.FEESTATUS = 9 FROM ch_fee_do WHERE ch_fee.GID = ch_fee_do.FEEID AND ch_fee_do.BILLNO = @bill_no AND ch_fee_do.COMPANYID = @company_id ";
private const string SQL_SELECT_CH_FEE_PAY_APPLICATION_BILLNO = " SELECT BILLNO FROM ch_fee_settlement WHERE GID = @gid ";
//将已保存的未结算付费插入到费用结算表
private const string SQL_INSERT_CH_FEE_SETTLEMENT_RUN = "INSERT INTO ch_fee_settlement(GID, BILLNO, BILLDATE, SETTLEMODE, CUSTOMERNAME, SETTLETYPE, AMOUNTRMB, ACCOUNTRMB, RATE, AMOUNTUSD, ACCOUNTUSD,"
+ " BILLTYPE, VOUCHERNO, SETTLEUSER, SETTLETIME, ISEXPORT, FINANCIALVOUCHER, BILLSTATUS, REMARK,COMPANYID)"
+ " SELECT @paysettle_id,@bill_no,GETDATE(),SETTLEMODE,CUSTOMERNAME,SETTLETYPE,AMOUNTRMB,ACCOUNTRMB,RATE,AMOUNTUSD,ACCOUNTUSD,"
+ " BILLTYPE,VOUCHERNO,@settle_user,GETDATE(),ISEXPORT,FINANCIALVOUCHER,BILLSTATUS,REMARK,@company_id "
+ " FROM run_fee_settlement WHERE GID = @gid ";
//还原已经进行付费结算的费用(撤销付费结算)
private const string SQL_UPDATE_CH_FEE_FOR_CANCELPAYSETTLE = " UPDATE ch_fee SET ch_fee.FEESTATUS = (CASE WHEN ch_fee_do.ORIGAMOUNT = ch_fee.SETTLEMENT THEN 0 ELSE 8 END), "
+ " ch_fee.SETTLEMENT = isnull((ISNULL(ch_fee.SETTLEMENT,0) - ch_fee_do.ORIGAMOUNT),0) "
+ " FROM ch_fee_do WHERE ch_fee.GID = ch_fee_do.FEEID AND ch_fee_do.BILLNO = @bill_no AND COMPANYID = @company_id ";
//删除付费结算费用明细表(撤销付费结算)
private const string SQL_DELETE_CH_FEE_DO = " UPDATE ch_fee_do SET ISDELETED = 1,DELETEUSER = @delete_user,DELETETIME = GETDATE() WHERE BILLNO = @bill_no AND COMPANYID = @company_id ";
//删除付费结算表(撤销付费结算)
private const string SQL_DELETE_CH_FEE_SETTLEMENT = " UPDATE ch_fee_settlement SET ISDELETE = 1,DELETEUSER = @delete_user,DELETETIME = GETDATE() WHERE BILLNO = @bill_no AND COMPANYID = @company_id ";
//获取付费结算来源
private const string SQL_VALID_PAY_SETTLE_SOURCE = " SELECT COUNT(*) FROM ch_fee_settle_link WHERE SETTLEID = @settle_id ";
//校验费用是否满足付费结算金额
private const string SQL_VALID_CH_FEE_SETTLEMENT_FOR_MERGE = " SELECT COUNT(A.GID)-SUM(CASE WHEN C.AMOUNT = C.SETTLEMENT THEN -1 ELSE CASE WHEN (C.AMOUNT - C.SETTLEMENT) < A.ORIGAMOUNT THEN -1 ELSE "
+ " CASE WHEN (C.AMOUNT - C.SETTLEMENT) >= A.ORIGAMOUNT THEN 1 END END END) FROM ch_fee_do as A INNER JOIN ch_fee_payapplication as B "
+ " ON A.BILLNO = B.BILLNO AND A.COMPANYID = B.COMPANYID INNER JOIN ch_fee as C ON A.FEEID = C.GID INNER JOIN ch_fee_settle_link as D ON B.GID = D.RELATIONSUBID WHERE D.SETTLEID = @settle_id ";
//将所有合并付费申请费用明细插入付费结算
private const string SQL_INSERT_CH_FEE_FEE_DO_FOR_MERGE = " INSERT INTO ch_fee_do(GID,BILLNO,BSNO,MBLNO,HBLNO,CUSTOMERNAME,BSTYPE,FEEID,FEENAME,CURRENCY,AMOUNT,DOAMOUNT,FEETYPE,CATEGORY,BILLSTATUS,"
+ " REMARK,CREATETIME,EXCHANGERATE,ORIGCURRENCY,ORIGAMOUNT,INVOICESETTLENO,COMPANYID) "
+ " SELECT newid(),@bill_no,A.BSNO,A.MBLNO,A.HBLNO,A.CUSTOMERNAME,A.BSTYPE,A.FEEID,A.FEENAME,A.CURRENCY,A.AMOUNT,A.DOAMOUNT,A.FEETYPE,A.CATEGORY,A.BILLSTATUS,A.REMARK,GETDATE(), "
+ " A.EXCHANGERATE,A.ORIGCURRENCY,A.ORIGAMOUNT,A.INVOICESETTLENO,A.COMPANYID FROM ch_fee_do AS A INNER JOIN ch_fee_payapplication as B ON A.BILLNO = B.BILLNO AND A.COMPANYID = B.COMPANYID "
+ " INNER JOIN ch_fee_settle_link as C ON B.GID = C.RELATIONSUBID WHERE C.SETTLEID = @settle_id ";
//根据付费申请费用明细更新费用表
private const string SQL_UPDATE_CH_FEE_BY_CH_FEE_DO_FOR_MERGE = " UPDATE ch_fee SET ch_fee.SETTLEMENT = ISNULL(ch_fee.SETTLEMENT,0) + ch_fee_do.ORIGAMOUNT "
+ " FROM ch_fee_do WHERE ch_fee.GID = ch_fee_do.FEEID AND ch_fee_do.BILLNO = @bill_no AND ch_fee_do.COMPANYID = @company_id ";
//建立付费结算关联信息(生成付费结算和付费申请关联关系)
private const string SQL_INSERT_CH_FEE_SETTLE_LINK = " INSERT INTO ch_fee_settle_link(GID,TYPE,SETTLEID,RELATIONSUBID,CREATEUSER,CREATETIME) "
+ " VALUES(newid(),@type,@settle_id,@relation_sub_id,@create_user,GETDATE()) ";
//更新付费申请状态为已经结算
private const string SQL_UPDATE_CH_FEE_PAY_APP_SETTLED = " UPDATE ch_fee_payapplication SET BILLSTATUS = 4 FROM ch_fee_settle_link WHERE ch_fee_settle_link.RELATIONSUBID = ch_fee_payapplication.GID AND SETTLEID = @settle_id ";
//更新付费申请相关的费用状态
private const string SQL_UPDATE_CH_FEE_DO_APP_SETTLED = " UPDATE ch_fee_do SET ISDELETED = 1 FROM ch_fee_payapplication WHERE ch_fee_payapplication.BILLNO = ch_fee_do.BILLNO AND ch_fee_payapplication.COMPANYID = ch_fee_do.COMPANYID AND ch_fee_payapplication.GID = @gid ";
//更新付费申请状态从已经结算更新为已审核(撤销结算)
//private const string SQL_UPDATE_CH_FEE_PAY_APP_FOR_CANCEL = " UPDATE ch_fee_payapplication SET BILLSTATUS = 0 FROM ch_fee_settle_link WHERE ch_fee_settle_link.RELATIONSUBID = ch_fee_payapplication.GID AND SETTLEID = @settle_id ";
//更新付费申请相关的费用状态为激活状态(撤销结算)
private const string SQL_UPDATE_CH_FEE_DO_APP_FOR_CANCEL = " UPDATE ch_fee_do SET ISDELETED = 0 FROM ch_fee_payapplication WHERE ch_fee_payapplication.BILLNO = ch_fee_do.BILLNO AND ch_fee_payapplication.COMPANYID = ch_fee_do.COMPANYID AND ch_fee_payapplication.GID = @gid ";
//删除合并结算关联信息表记录
private const string SQL_DELETE_CH_FEE_SETTLE_LINK = " DELETE FROM ch_fee_settle_link WHERE SETTLEID = @settle_id ";
#region 插入付费结算
/// <summary>
/// 插入付费结算
/// </summary>
/// <param name="tempFeeSettlementEntity">付费结算实体类</param>
/// <returns>值1-插入完成 值-1插入失败</returns>
public int InsertFeePaySettle(IList<FeeDoEntity> tempFeeDoEntities, FeeSettlementEntity tempFeeSettlementEntity)
{
int iResult = 0;
using (SqlTransaction sqlTran = SqlHelper.BeginTransaction(SqlHelper.ConnectionStringLocalTransaction))
{
try
{
string strLastBillNo = "";
string strNewBillNo = "";
//先获取SQL SERVER 数据库端服务器时间
DateTime nowServerDateTime = (DateTime)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_GET_SERVERTIME, null);
if (nowServerDateTime == DateTime.MinValue)
{
throw new Exception("未正常获取到服务端时间");
}
//获取分公司的票号头字符
string tempBANKSHEAD = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, "SELECT TOP 1 BANKSHEAD FROM company WHERE GID='" + tempFeeSettlementEntity.CompanyID.ToString().Trim() + "'", null) as string;
//生成申请编号起始串
string strBillNoProfix = CreateBeginTitleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4);
SqlParameter[] getLastBillParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_SETTLEMENT_LIKE, SqlDbType.VarChar, 200),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36)
};
getLastBillParms[0].Value = strBillNoProfix + "%";
getLastBillParms[1].Value = tempFeeSettlementEntity.CompanyID;
//获取最大的编号
string tempLastBillNo = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_LAST_BILL_NO, getLastBillParms) as string;
strLastBillNo = tempLastBillNo ?? "";
//生成付费申请编号
strNewBillNo = CreateSettleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4, strLastBillNo);
foreach (FeeDoEntity feeDoEntity in tempFeeDoEntities)
{
SqlParameter[] doParms = new SqlParameter[]{
new SqlParameter(PARM_FEE_DO_GID, SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_DO_BILL_NO, SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_BSNO, SqlDbType.VarChar,100),
new SqlParameter(PARM_FEE_DO_MBL_NO,SqlDbType.VarChar,30),
new SqlParameter(PARM_FEE_DO_HBL_NO,SqlDbType.VarChar,30),
new SqlParameter(PARM_FEE_DO_CUSTOMER_NAME,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_BSTYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_DO_FEE_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_DO_FEE_NAME,SqlDbType.VarChar,100),
new SqlParameter(PARM_FEE_DO_CURRENCY,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_AMOUNT,SqlDbType.Decimal,40),
new SqlParameter(PARM_FEE_DO_DO_AMOUNT,SqlDbType.Decimal,40),
new SqlParameter(PARM_FEE_DO_FEE_TYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_DO_CATEGORY,SqlDbType.Int),
new SqlParameter(PARM_FEE_DO_BILL_STATUS,SqlDbType.Int),
new SqlParameter(PARM_FEE_DO_REMARK,SqlDbType.VarChar,1024),
new SqlParameter(PARM_FEE_DO_EXCHANGE_RATE,SqlDbType.Decimal,21),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_DO_ORIG_AMOUNT,SqlDbType.Decimal,20)
};
doParms[0].Value = feeDoEntity.GID;
doParms[1].Value = strNewBillNo;
doParms[2].Value = feeDoEntity.BSNO;
doParms[3].Value = feeDoEntity.MBLNO;
doParms[4].Value = feeDoEntity.HBLNO;
doParms[5].Value = feeDoEntity.CustomerName;
doParms[6].Value = feeDoEntity.BSType;
doParms[7].Value = feeDoEntity.FeeID;
doParms[8].Value = feeDoEntity.FeeName;
doParms[9].Value = feeDoEntity.Currency;
doParms[10].Value = feeDoEntity.OriginalFeeCSTL;
doParms[11].Value = feeDoEntity.DoAmount;
doParms[12].Value = feeDoEntity.FeeType;
doParms[13].Value = feeDoEntity.Category;
doParms[14].Value = feeDoEntity.BillStatus;
doParms[15].Value = feeDoEntity.Remark;
doParms[16].Value = feeDoEntity.ExchangeRate;
doParms[17].Value = feeDoEntity.CompanyID;
doParms[18].Value = feeDoEntity.OriginalFeeCSTL;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_FEE_DO, doParms);
//
SqlParameter[] feeParms = new SqlParameter[]{
new SqlParameter(PARM_FEE_DO_GID,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_CHEQUE_NUM,SqlDbType.VarChar,200)
};
feeParms[0].Value = feeDoEntity.GID;
feeParms[1].Value = feeDoEntity.OriginalFeeCSTL;
if (feeDoEntity.Currency.ToString().Trim() == "RMB")
{
feeParms[2].Value = tempFeeSettlementEntity.ChequeNo;
}
else
{
feeParms[2].Value = tempFeeSettlementEntity.ChequeNoUsd;
}
//private const string SQL_UPDATE_FEE = " UPDATE ch_fee SET ch_fee.SETTLEMENT = ch_fee.SETTLEMENT+@settlement,ch_fee.FEESTATUS = C.FEESTATUS,ch_fee.CHEQUENUM = @cheque_num "
// + " FROM "
// + " (SELECT A.GID,CASE WHEN B.AMOUNT < A.AMOUNT THEN CASE WHEN B.AMOUNT+A.SETTLEMENT = A.AMOUNT THEN 9 ELSE 8 END ELSE "
// + " CASE WHEN B.AMOUNT = A.AMOUNT THEN 9 END END as FEESTATUS FROM ch_fee as A INNER JOIN ch_fee_do as B ON A.GID = B.FEEID WHERE B.GID = @gid) as C "
// + " WHERE C.GID = ch_fee.GID ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_FEE, feeParms);
//更新合计利润综合信息
SqlParameter[] updateFeeGainParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_GAIN_STL_CR_RMB,SqlDbType.Decimal,21),
new SqlParameter(PARM_FEE_GAIN_STL_CR_USD,SqlDbType.Decimal,21),
new SqlParameter(PARM_FEE_GAIN_STL_CR_TTL,SqlDbType.Decimal,21),
new SqlParameter(PARM_FEE_GAIN_BSNO,SqlDbType.VarChar,100)
};
if (feeDoEntity.Currency == "RMB")
{
updateFeeGainParms[0].Value = feeDoEntity.OriginalFeeCSTL;
updateFeeGainParms[1].Value = 0;
updateFeeGainParms[2].Value = feeDoEntity.OriginalFeeCSTL;
updateFeeGainParms[3].Value = feeDoEntity.BSNO;
}
else if(feeDoEntity.Currency == "USD")
{
updateFeeGainParms[0].Value = 0;
updateFeeGainParms[1].Value = feeDoEntity.OriginalFeeCSTL;
updateFeeGainParms[2].Value = decimal.Parse(C1Round(double.Parse((feeDoEntity.OriginalFeeCSTL * feeDoEntity.ExchangeRate).ToString()),2).ToString());
updateFeeGainParms[3].Value = feeDoEntity.BSNO;
}
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_FEE_GAIN, updateFeeGainParms);
}
//
SqlParameter[] settleParms = new SqlParameter[]{
new SqlParameter(PARM_FEE_SETTLEMENT_GID, SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_NO, SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_MODE, SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_CUSTOMER_NAME,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_TYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_AMOUNT_RMB,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_ACCOUNT_RMB,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_RATE,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_AMOUNT_USD,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_ACCOUNT_USD,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_TYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_VOUCHER_NO,SqlDbType.VarChar,50),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_USER,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_IS_EXPORT,SqlDbType.Bit),
new SqlParameter(PARM_FEE_SETTLEMENT_FINANCIAL_VOUCHER,SqlDbType.VarChar,50),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_STATUS,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_REMARK,SqlDbType.VarChar,1024),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36),
new SqlParameter("@ACCOUNTS_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@ACCOUNTS_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@ACCOUNTS_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@PREPAY_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@PREPAY_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@PREPAY_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@AHSR_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@AHSR_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@AHSR_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@FINANCIAL_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@FINANCIAL_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@FINANCIAL_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@ADVANCE_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@ADVANCE_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@ADVANCE_MONEY", SqlDbType.Decimal,9)
};
settleParms[0].Value = tempFeeSettlementEntity.GID;
settleParms[1].Value = strNewBillNo;
settleParms[2].Value = tempFeeSettlementEntity.SettleMode;
settleParms[3].Value = tempFeeSettlementEntity.CustomerName;
settleParms[4].Value = tempFeeSettlementEntity.SettleType;
settleParms[5].Value = tempFeeSettlementEntity.AmountRMB;
settleParms[6].Value = tempFeeSettlementEntity.AccountRMB;
settleParms[7].Value = tempFeeSettlementEntity.Rate;
settleParms[8].Value = tempFeeSettlementEntity.AmountUSD;
settleParms[9].Value = tempFeeSettlementEntity.AccountUSD;
settleParms[10].Value = tempFeeSettlementEntity.BillType;
settleParms[11].Value = tempFeeSettlementEntity.VoucherNO;
settleParms[12].Value = tempFeeSettlementEntity.SettleUser;
settleParms[13].Value = tempFeeSettlementEntity.IsExport;
settleParms[14].Value = tempFeeSettlementEntity.FinancialVoucher;
settleParms[15].Value = tempFeeSettlementEntity.BillStatus;
settleParms[16].Value = tempFeeSettlementEntity.Remark;
settleParms[17].Value = tempFeeSettlementEntity.CompanyID;
settleParms[18].Value = tempFeeSettlementEntity.ACCOUNTS_CURRENCY;//记账资料_币别
settleParms[19].Value = tempFeeSettlementEntity.ACCOUNTS_RATE;//记账资料_汇率
settleParms[20].Value = tempFeeSettlementEntity.ACCOUNTS_MONEY;//记账资料_金额
settleParms[21].Value = tempFeeSettlementEntity.PREPAY_CURRENCY;//预付支资料_币别
settleParms[22].Value = tempFeeSettlementEntity.PREPAY_RATE;//预付支资料_汇率
settleParms[23].Value = tempFeeSettlementEntity.PREPAY_MONEY;//预付支资料_金额
settleParms[24].Value = tempFeeSettlementEntity.AHSR_CURRENCY;//实付支资料_币别
settleParms[25].Value = tempFeeSettlementEntity.AHSR_RATE;//实付支资料_汇率
settleParms[26].Value = tempFeeSettlementEntity.AHSR_MONEY;//实付支资料_金额
settleParms[27].Value = tempFeeSettlementEntity.FINANCIAL_CURRENCY;//财务费用_币别
settleParms[28].Value = tempFeeSettlementEntity.FINANCIAL_RATE;//财务费用_汇率
settleParms[29].Value = tempFeeSettlementEntity.FINANCIAL_MONEY;//财务费用_金额
settleParms[30].Value = tempFeeSettlementEntity.ADVANCE_CURRENCY;//预付支取用资料_币别
settleParms[31].Value = tempFeeSettlementEntity.ADVANCE_RATE;//预付支取用资料_汇率
settleParms[32].Value = tempFeeSettlementEntity.ADVANCE_MONEY;//预付支取用资料_金额
//
string SETTLETIME = tempFeeSettlementEntity.SettleTime.ToString().Trim().IndexOf("0001") > -1 ? "GETDATE()," : "'" + tempFeeSettlementEntity.SettleTime.ToString().Trim() + "',";
string SETTLETIME_NAME = tempFeeSettlementEntity.SettleTime.ToString().Trim().IndexOf("0001") > -1 ? "SETTLETIME," : "SETTLETIME,";
string SQL_INSERT_FEE_SETTLEMENT = String.Format("INSERT INTO ch_fee_settlement(GID, BILLNO, BILLDATE, SETTLEMODE, CUSTOMERNAME, SETTLETYPE, AMOUNTRMB, ACCOUNTRMB, RATE, AMOUNTUSD, ACCOUNTUSD, BILLTYPE, VOUCHERNO, SETTLEUSER, {0} ISEXPORT, FINANCIALVOUCHER, BILLSTATUS, REMARK,COMPANYID,ACCOUNTS_CURRENCY,ACCOUNTS_RATE,ACCOUNTS_MONEY,PREPAY_CURRENCY,PREPAY_RATE,PREPAY_MONEY,AHSR_CURRENCY,AHSR_RATE,AHSR_MONEY,FINANCIAL_CURRENCY,FINANCIAL_RATE,FINANCIAL_MONEY,ADVANCE_CURRENCY,ADVANCE_RATE,ADVANCE_MONEY)"
+ " VALUES(@gid,@bill_no,GETDATE(),@settle_mode,@customer_name,@settle_type,@amount_rmb,@account_rmb,@rate,@amount_usd,@account_usd,@bill_type,@voucher_no,@settle_user, {1}@is_export,@financial_voucher,@bill_status,@remark,@company_id,@ACCOUNTS_CURRENCY,@ACCOUNTS_RATE,@ACCOUNTS_MONEY,@PREPAY_CURRENCY,@PREPAY_RATE,@PREPAY_MONEY,@AHSR_CURRENCY,@AHSR_RATE,@AHSR_MONEY,@FINANCIAL_CURRENCY,@FINANCIAL_RATE,@FINANCIAL_MONEY,@ADVANCE_CURRENCY,@ADVANCE_RATE,@ADVANCE_MONEY)", SETTLETIME_NAME, SETTLETIME);
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_FEE_SETTLEMENT, settleParms);
//事务提交
sqlTran.Commit();
iResult = 1;//状态为1表示插入成功
}
catch (Exception execError)
{
iResult = -1;//有异常,插入失败
sqlTran.Rollback();
iResult = -2;//插入异常,事务已回滚成功
throw execError;
}
finally
{
SqlHelper.CloseConnection();
}
}
return iResult;
}
#endregion
#region 生成付费结算编号起始串
/// <summary>
/// 生成付费结算编号起始串
/// </summary>
/// <param name="tempNowDateTime">当前服务器时间</param>
/// <param name="tempBeginTitle">结算编号起始串头字母</param>
/// <param name="tempCodeLength">结算编号累计编码长度</param>
/// <returns>返回结算编号起始串</returns>
private string CreateBeginTitleCode(DateTime tempNowDateTime, string tempBeginTitle, int tempCodeLength)
{
int CodeLength = tempCodeLength;
string strFeeType = tempBeginTitle;
//解析当前时间
DateTime nowDateTime = tempNowDateTime;
string strYear = nowDateTime.Year.ToString();
string strMonth = nowDateTime.Month.ToString().Length < 2 ? "0" + nowDateTime.Month.ToString() : nowDateTime.Month.ToString();
//获取年+月组合的字符串
string strDateTime = strYear + strMonth;
//将申请编号抬头+日期作为结算编号
string strCodePrefix = strFeeType + strDateTime;
return strCodePrefix;
}
#endregion
#region 生成付费结算编号
/// <summary>
/// 生成付费结算编号
/// </summary>
/// <param name="tempNowDateTime">当前服务器时间</param>
/// <param name="tempBeginTitle">结算编号起始串头字母</param>
/// <param name="tempCodeLength">结算编号累计编码长度</param>
/// <param name="tempLastBillNo">最大结算编号</param>
/// <returns>返回新的付费结算编号</returns>
private string CreateSettleCode(DateTime tempNowDateTime, string tempBeginTitle, int tempCodeLength, string tempLastBillNo)
{
int CodeLength = tempCodeLength;
string strSettleCode = "";
string strFeeType = tempBeginTitle;
//解析当前时间
DateTime nowDateTime = tempNowDateTime;
string strYear = nowDateTime.Year.ToString();
string strMonth = nowDateTime.Month.ToString().Length < 2 ? "0" + nowDateTime.Month.ToString() : nowDateTime.Month.ToString();
//获取年+月组合的字符串
string strDateTime = strYear + strMonth;
//将结算编号抬头+日期作为结算编号
string strCodePrefix = strFeeType + strDateTime;
//string strSql = "SELECT TOP 1 BILLNO FROM ch_fee_payapplication WHERE BILLNO LIKE '" + strFeeType + strDateTime + "%' ORDER BY BILLNO DESC";
//DataTable billTable = feeDoDA.GetExcuteSql(strSql).Tables[0];
ArrayList codeArg = new ArrayList();
for (int i = 0; i < CodeLength; i++)
{
codeArg.Add(0);
}
string strCode = "";//编号
if (tempLastBillNo != "")
{
string oldCode = tempLastBillNo;
if (oldCode.IndexOf(strCodePrefix) >= 0)
{
oldCode = oldCode.Substring(strCodePrefix.Length, oldCode.Length - strCodePrefix.Length);
if (oldCode.Length == CodeLength)
{
for (int i = 0; i < oldCode.Length; i++)
{
if (oldCode[i].ToString().IndexOf("0") == 0)
{
oldCode = oldCode.Remove(i, 1);
i = -1;
continue;
}
else
{
break;
}
}
}
}
int newNum = int.Parse(oldCode);
newNum = newNum + 1;
string strNewNum = newNum.ToString();
int codeArgCount = codeArg.Count - 1;
for (int i = strNewNum.Length - 1; i >= 0; i--)
{
codeArg[codeArgCount] = strNewNum[i];
codeArgCount--;
}
//for (int i = 0; i < strNewNum.Length; i++)
//{
// codeArg[i] = strNewNum[i];
//}
}
else
{
int iOld = int.Parse(codeArg[codeArg.Count - 1].ToString());
codeArg[codeArg.Count - 1] = (iOld + 1).ToString();
}
for (int i = 0; i < codeArg.Count; i++)
{
strCode += codeArg[i].ToString();
}
strSettleCode = strFeeType + strDateTime + strCode;
return strSettleCode;
}
#endregion
#region 金额四舍五入
/// <summary>
/// 金额四舍五入
/// </summary>
/// <param name="value">金额值</param>
/// <param name="digit">小数点后位数</param>
/// <returns>返回Double型四舍五入金额</returns>
public double C1Round(double value, int digit)
{
double vt = Math.Pow(10, digit);
double vx = value * vt;
vx += 0.5;
return (Math.Floor(vx) / vt);
}
#endregion
#region 通过SQL语句获取数据
/// <summary>
/// 通过SQL语句获取数据
/// </summary>
/// <param name="strSql">要执行查询的SQL语句</param>
/// <returns>返回DataSet数据</returns>
public DataSet GetDataSetBySql(string strSql)
{
DataSet dataSet = new DataSet();
dataSet = SqlHelper.ExecuteDataset(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, strSql);
return dataSet;
}
#endregion
#region 通过惟一主键获取付费结算信息
/// <summary>
/// 通过惟一主键获取付费结算信息
/// </summary>
/// <param name="tempFeeSettlementID">费用结算GID</param>
/// <returns>返回实体类FeeSettlementEntity</returns>
public FeeSettlementEntity GetFeeSettlementByGID(string tempFeeSettlementID)
{
SqlParameter parm = new SqlParameter(PARM_FEE_SETTLEMENT_GID, SqlDbType.VarChar, 36);
parm.Value = tempFeeSettlementID;
FeeSettlementEntity feeSettlementEntity = null;
using (SqlDataReader sqlRead = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_FEE_SETTLEMENT_BY_GID, parm))
{
try
{
while (sqlRead.Read())
{
feeSettlementEntity = new FeeSettlementEntity();
if (!sqlRead.IsDBNull(0))
{
feeSettlementEntity.GID = sqlRead.GetString(0);
}
if (!sqlRead.IsDBNull(1))
{
feeSettlementEntity.BillNO = sqlRead.GetString(1);
}
if (!sqlRead.IsDBNull(2))
{
feeSettlementEntity.BillDate = sqlRead.GetDateTime(2);
}
if (!sqlRead.IsDBNull(3))
{
feeSettlementEntity.SettleMode = sqlRead.GetInt32(3);
}
if (!sqlRead.IsDBNull(4))
{
feeSettlementEntity.CustomerName = sqlRead.GetString(4);
}
if (!sqlRead.IsDBNull(5))
{
feeSettlementEntity.SettleType = sqlRead.GetInt32(5);
}
if (!sqlRead.IsDBNull(6))
{
feeSettlementEntity.AmountRMB = sqlRead.GetDecimal(6);
}
if (!sqlRead.IsDBNull(7))
{
feeSettlementEntity.AccountRMB = sqlRead.GetString(7);
}
if (!sqlRead.IsDBNull(8))
{
feeSettlementEntity.Rate = sqlRead.GetDecimal(8);
}
if (!sqlRead.IsDBNull(9))
{
feeSettlementEntity.AmountUSD = sqlRead.GetDecimal(9);
}
if (!sqlRead.IsDBNull(10))
{
feeSettlementEntity.AccountUSD = sqlRead.GetString(10);
}
if (!sqlRead.IsDBNull(11))
{
feeSettlementEntity.BillType = sqlRead.GetInt32(11);
}
if (!sqlRead.IsDBNull(12))
{
feeSettlementEntity.VoucherNO = sqlRead.GetString(12);
}
if (!sqlRead.IsDBNull(13))
{
feeSettlementEntity.SettleUser = sqlRead.GetString(13);
}
if (!sqlRead.IsDBNull(14))
{
feeSettlementEntity.SettleTime = sqlRead.GetDateTime(14);
}
if (!sqlRead.IsDBNull(15))
{
feeSettlementEntity.AuditUser = sqlRead.GetString(15);
}
if (!sqlRead.IsDBNull(16))
{
feeSettlementEntity.AuditTime = sqlRead.GetDateTime(16);
}
if (!sqlRead.IsDBNull(17))
{
feeSettlementEntity.IsExport = sqlRead.GetBoolean(17);
}
if (!sqlRead.IsDBNull(18))
{
feeSettlementEntity.FinancialVoucher = sqlRead.GetString(18);
}
if (!sqlRead.IsDBNull(19))
{
feeSettlementEntity.BillStatus = sqlRead.GetInt32(19);
}
if (!sqlRead.IsDBNull(20))
{
feeSettlementEntity.Remark = sqlRead.GetString(20);
}
}
}
catch (Exception execError)
{
throw execError;
}
}
return feeSettlementEntity;
}
#endregion
public string GetBillNoByPaySettleID(string tempPaySettleID)
{
string result = "";
using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringLocalTransaction))
{
try
{
SqlParameter parm = new SqlParameter(PARM_FEE_SETTLEMENT_GID, SqlDbType.VarChar, 36);
parm.Value = tempPaySettleID;
result = (String)SqlHelper.ExecuteScalar(conn, CommandType.Text, SQL_SELECT_CH_FEE_PAY_APPLICATION_BILLNO, parm) as String ?? "";
}
catch (Exception error)
{
throw error;
}
}
return result;
}
#region 将已保存的未结算的付费进行结算
/// <summary>
/// 将已保存的未结算的付费进行结算
/// </summary>
/// <param name="tempFeeSettleID">付费结算GID</param>
/// <param name="tempRunSettleID">运行结算GID</param>
/// <param name="tempOperator">操作人GID</param>
/// <param name="tempRemark">备注</param>
/// <param name="tempCompanyID">分公司GID</param>
/// <returns>值1表示结算成功 值不等于1表示结算失败</returns>
public int PostSavePaySettle(string tempFeeSettleID, string tempRunSettleID, string tempOperator, string tempRemark, string tempCompanyID)
{
int iResult = 0;
using (SqlTransaction sqlTran = SqlHelper.BeginTransaction(SqlHelper.ConnectionStringLocalTransaction))
{
try
{
string strLastBillNo = "";
string strNewBillNo = "";
//先校验费用申请金额是否满足申请要求
int validState = 0;
//先校验是否费用已经做了申请
SqlParameter[] validFeeParms = new SqlParameter[]{
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_GID,SqlDbType.VarChar,36)
};
validFeeParms[0].Value = tempRunSettleID;
validState = (int)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_VALID_CH_FEE_SETTLEMENT_BY_RUNFEEDO, validFeeParms);
if (validState == 0)
{
//先获取SQL SERVER 数据库端服务器时间
DateTime nowServerDateTime = (DateTime)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_GET_SERVERTIME, null);
if (nowServerDateTime == DateTime.MinValue)
{
throw new Exception("未正常获取到服务端时间");
}
//获取分公司的票号头字符
string tempBANKSHEAD = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, "SELECT TOP 1 BANKSHEAD FROM company WHERE GID='" + tempCompanyID.Trim() + "'", null) as string;
//生成申请编号起始串
string strBillNoProfix = CreateBeginTitleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4);
SqlParameter[] getLastBillParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_SETTLEMENT_LIKE, SqlDbType.VarChar, 200),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36)
};
getLastBillParms[0].Value = strBillNoProfix + "%";
getLastBillParms[1].Value = tempCompanyID;
//获取最大的编号
string tempLastBillNo = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_LAST_BILL_NO, getLastBillParms) as string;
strLastBillNo = tempLastBillNo ?? "";
//生成付费申请编号
strNewBillNo = CreateSettleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4, strLastBillNo);
SqlParameter[] insertSettleParms = new SqlParameter[]{
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_PAYSETTLE_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_GID,SqlDbType.VarChar,36),
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_SETTLE_USER,SqlDbType.VarChar,36),
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_REMARK,SqlDbType.VarChar,1024),
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36)
};
insertSettleParms[0].Value = tempFeeSettleID;
insertSettleParms[1].Value = tempRunSettleID;
insertSettleParms[2].Value = strNewBillNo;
insertSettleParms[3].Value = tempOperator;
insertSettleParms[4].Value = tempRemark;
insertSettleParms[5].Value = tempCompanyID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_CH_FEE_SETTLEMENT_RUN, insertSettleParms);
//
SqlParameter[] insertFeeDoParms = new SqlParameter[] {
new SqlParameter(PARM_RUN_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_RUN_FEE_DO_RUN_SETTLE_ID,SqlDbType.VarChar,36)
};
insertFeeDoParms[0].Value = strNewBillNo;
insertFeeDoParms[1].Value = tempRunSettleID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_CH_FEE_FEE_DO_RUN, insertFeeDoParms);
//
//将运行结算主表中的RMB支票号插入到ch_fee
string SQL_UPDATE_CH_FEE_BY_RUN_FEE_SETTLEMENT_RMB = " update ch_fee set CHEQUENUM=(select top 1 CHEQUENO from run_fee_settlement where gid=@runsettle_id) where gid in (SELECT feeid FROM run_fee_do WHERE RUNSETTLEID = @runsettle_id and CURRENCY='RMB') and CURRENCY='RMB'";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_BY_RUN_FEE_SETTLEMENT_RMB, insertFeeDoParms);
//
//将运行结算主表中的USD支票号插入到ch_fee
string SQL_UPDATE_CH_FEE_BY_RUN_FEE_SETTLEMENT_USD = " update ch_fee set CHEQUENUM=(select top 1 CHEQUENOUSD from run_fee_settlement where gid=@runsettle_id) where gid in (SELECT feeid FROM run_fee_do WHERE RUNSETTLEID = @runsettle_id and CURRENCY='USD') and CURRENCY='USD'";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_BY_RUN_FEE_SETTLEMENT_USD, insertFeeDoParms);
//
SqlParameter[] updateFeeParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36)
};
updateFeeParms[0].Value = strNewBillNo;
updateFeeParms[1].Value = tempCompanyID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_BY_RUN_FEE_DO, updateFeeParms);
//
SqlParameter[] deleteRunSettleParms = new SqlParameter[] {
new SqlParameter(PARM_RUN_FEE_SETTLEMENT_GID,SqlDbType.VarChar,36)
};
deleteRunSettleParms[0].Value = tempRunSettleID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_DELETE_RUN_FEE_SETTLEMENT_BY_GID, deleteRunSettleParms);
//
SqlParameter[] deleteRunDoParms = new SqlParameter[] {
new SqlParameter(PARM_RUN_FEE_DO_RUN_SETTLE_ID,SqlDbType.VarChar,36)
};
deleteRunDoParms[0].Value = tempRunSettleID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_DELETE_RUN_FEE_DO_BY_RUNSETTLE_ID, deleteRunDoParms);
}
//事务提交
sqlTran.Commit();
if (validState == 0)
{
iResult = 1;//状态为1表示插入成功
}
else
{
iResult = -3;//费用表没有足够的申请金额使用,无法提交付费申请
}
}
catch (Exception execError)
{
iResult = -1;//有异常,插入失败
sqlTran.Rollback();
iResult = -2;//插入异常,事务已回滚成功
throw execError;
}
finally
{
SqlHelper.CloseConnection();
}
}
return iResult;
}
#endregion
#region 撤销付费结算
/// <summary>
/// 撤销付费结算
/// </summary>
/// <param name="tempPaySettleID">付费结算GID</param>
/// <param name="tempPaySettleID">付费结算单号</param>
/// <param name="tempOperator">操作人GID</param>
/// <param name="tempCompanyID">分公司GID</param>
/// <returns>值1表示撤销结算成功 值不等于1表示撤销结算失败</returns>
public int CacelPaySettle(string tempPaySettleID,string tempBillNO,string tempOperator,string tempCompanyID)
{
int iResult = 0;
using (SqlTransaction sqlTran = SqlHelper.BeginTransaction(SqlHelper.ConnectionStringLocalTransaction))
{
try
{
int iSourceState = 0;
string sSourceState2 = "";
//再判断当前结算信息是否来自付费申请
SqlParameter[] isPayAppParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36)
};
isPayAppParms[0].Value = tempPaySettleID;
//获取付费结算来源
//string SQL_VALID_PAY_SETTLE_SOURCE = " SELECT COUNT(*) FROM ch_fee_settle_link WHERE SETTLEID = @settle_id ";
iSourceState = (int)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_VALID_PAY_SETTLE_SOURCE, isPayAppParms);
//iSourceState为0表示付费结算是直接结算 iSourceState大于0表示付费结算是通过付费申请结算
if (iSourceState > 0)
{
string sSQL = "SELECT COUNT(*) FROM ch_fee_settle_link WHERE RELATIONSUBID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "')";
iSourceState = (int)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, sSQL, null);
//
string sCURRENCY = "RMB";
sSQL = "SELECT (case when isnull(AMOUNTRMB,0)<>0 then 'RMB' else (case when isnull(AMOUNTUSD,0)<>0 then 'USD' else 'RMB' end) end) as CURRENCY from ch_fee_payapplication where GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "') and (ISDELETE is null or ISDELETE=0) ";
object statusObj = SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, sSQL, null);
if (statusObj != null)
{
sCURRENCY = statusObj.ToString().Trim();
}
//
if (sCURRENCY == "RMB")
{
sSQL = "SELECT (case when isnull(AMOUNTRMB,0)=(case when isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)=0 then isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20,2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) end) then '全部结算' else '部分结算' end) as zt from ch_fee_payapplication where GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "') and (ISDELETE is null or ISDELETE=0) ";
statusObj = SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, sSQL, null);
if (statusObj == null)
{
sSourceState2 = "全部结算";
}
else
{
sSourceState2 = statusObj.ToString().Trim();
}
}
else
{
sSQL = "SELECT (case when isnull(AMOUNTUSD,0)=(case when isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20,2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)=0 then isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20,2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) end) then '全部结算' else '部分结算' end) as zt from ch_fee_payapplication where GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "') and (ISDELETE is null or ISDELETE=0) ";
statusObj = SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, sSQL, null);
if (statusObj == null)
{
sSourceState2 = "全部结算";
}
else
{
sSourceState2 = statusObj.ToString().Trim();
}
}
//说明是部分结算
if (iSourceState > 0 && sSourceState2 == "部分结算")
{
//更新ch_fee_payapplication的部分结算金额(撤销结算)
if (sCURRENCY == "RMB")
{
sSQL = " UPDATE ch_fee_payapplication SET "
+ " SETTLERMB=isnull((SETTLERMB-(case when isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)<>0 then isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else (case when isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20, 2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)<>0 then isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20, 2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else SETTLERMB end) end)),0) "
+ " FROM ch_fee_settle_link WHERE ch_fee_settle_link.RELATIONSUBID = ch_fee_payapplication.GID AND SETTLEID = '" + tempPaySettleID + "' and (ch_fee_payapplication.ISDELETE is null or ch_fee_payapplication.ISDELETE=0) ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
}
else
{
sSQL = " UPDATE ch_fee_payapplication SET "
+ " SETTLEUSD=isnull((SETTLEUSD-(case when isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20, 2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)<>0 then isnull((select CAST(sum(DOAMOUNT*EXCHANGERATE) as decimal(20, 2)) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='RMB' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else (case when isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0)<>0 then isnull((select sum(DOAMOUNT) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and CURRENCY='USD' and feename<>'汇率损益' and (ISDELETED is null or ISDELETED=0)),0) else SETTLEUSD end) end)),0) "
+ " FROM ch_fee_settle_link WHERE ch_fee_settle_link.RELATIONSUBID = ch_fee_payapplication.GID AND SETTLEID = '" + tempPaySettleID + "' and (ch_fee_payapplication.ISDELETE is null or ch_fee_payapplication.ISDELETE=0) ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
}
//更新付费申请状态从已经结算更新为已审核(撤销结算)
string SQL_UPDATE_CH_FEE_PAY_APP_FOR_CANCEL = " UPDATE ch_fee_payapplication SET "
+ "BILLSTATUS=(case when isnull(AMOUNTRMB,0)<>0 then (case when isnull(AMOUNTRMB,0)=isnull(SETTLERMB,0) then 4 else (case when isnull(SETTLERMB,0)=0 then 0 else 5 end) end) else (case when isnull(AMOUNTUSD,0)<>0 then (case when isnull(AMOUNTUSD,0)=isnull(SETTLEUSD,0) then 4 else (case when isnull(SETTLEUSD,0)=0 then 0 else 5 end) end)else 0 end) end)"
+ " from ch_fee_payapplication where GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "') and (ISDELETE is null or ISDELETE=0) ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_PAY_APP_FOR_CANCEL, null);
//更新ch_fee_do的结算金额-部分结算金额(撤销结算)
sSQL = " update ch_fee_do set "
+ " DOAMOUNT=(case when DOAMOUNT-(select DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and feeid=D.feeid and (ISDELETED is null or ISDELETED=0))>0 then DOAMOUNT-(select DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and feeid=D.feeid and (ISDELETED is null or ISDELETED=0)) else isnull(AMOUNT,0) end) "
+ " from ch_fee_do as D where D.billno=(select top 1 billno from ch_fee_payapplication where GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "') and (ISDELETE is null or ISDELETE=0)) and (D.ISDELETED is null or D.ISDELETED=0)";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
//更新ch_fee的结算金额-部分结算金额(撤销结算)
sSQL = " update ch_fee set "
+ " SETTLEMENT=isnull((SETTLEMENT-(select (case when AMOUNT-DOAMOUNT=0 then AMOUNT else DOAMOUNT end) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and feeid=D.GID and (ISDELETED is null or ISDELETED=0))),0) "
+ ",FEESTATUS=(case when SETTLEMENT-(select (case when AMOUNT-DOAMOUNT=0 then AMOUNT else DOAMOUNT end) as DOAMOUNT from ch_fee_do where billno = '" + tempBillNO + "' and feeid=D.GID and (ISDELETED is null or ISDELETED=0))=0 then 0 else 8 end) "
+ "from ch_fee as D where D.GID in (select feeid from ch_fee_do where billno = '" + tempBillNO + "' and (ISDELETED is null or ISDELETED=0))";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
//更新付费申请费用明细状态未结算
SqlParameter[] updateFeeDoStateParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_PAY_APP_GID,SqlDbType.VarChar,36)
};
updateFeeDoStateParms[0].Value = tempPaySettleID;
//更新付费申请相关的费用状态为激活状态(撤销结算)
//string SQL_UPDATE_CH_FEE_DO_APP_FOR_CANCEL = " UPDATE ch_fee_do SET ISDELETED = 0 FROM ch_fee_payapplication WHERE ch_fee_payapplication.BILLNO = ch_fee_do.BILLNO AND ch_fee_payapplication.COMPANYID = ch_fee_do.COMPANYID AND ch_fee_payapplication.GID = @gid ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_DO_APP_FOR_CANCEL, updateFeeDoStateParms);
}
else
{
//更新付费申请状态从已经结算更新为已审核(撤销结算)
string SQL_UPDATE_CH_FEE_PAY_APP_FOR_CANCEL = " UPDATE ch_fee_payapplication SET BILLSTATUS=0,SETTLERMB=0,SETTLEUSD=0 FROM ch_fee_settle_link WHERE ch_fee_settle_link.RELATIONSUBID = ch_fee_payapplication.GID AND SETTLEID = '" + tempPaySettleID + "' and (ch_fee_payapplication.ISDELETE is null or ch_fee_payapplication.ISDELETE=0) ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_PAY_APP_FOR_CANCEL, null);
//更新ch_fee_do的结算金额-部分结算金额(撤销结算)
sSQL = " update ch_fee_do set "
+ " DOAMOUNT=AMOUNT "
+ "from ch_fee_do as D where D.billno=(select top 1 billno from ch_fee_payapplication where (ISDELETE is null or ISDELETE=0) and GID=(select top 1 RELATIONSUBID from ch_fee_settle_link where SETTLEID = '" + tempPaySettleID + "')) and (D.ISDELETED is null or D.ISDELETED=0)";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
//更新付费申请费用明细状态未结算
SqlParameter[] updateFeeDoStateParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_PAY_APP_GID,SqlDbType.VarChar,36)
};
updateFeeDoStateParms[0].Value = tempPaySettleID;
//更新付费申请相关的费用状态为激活状态(撤销结算)
//string SQL_UPDATE_CH_FEE_DO_APP_FOR_CANCEL = " UPDATE ch_fee_do SET ISDELETED = 0 FROM ch_fee_payapplication WHERE ch_fee_payapplication.BILLNO = ch_fee_do.BILLNO AND ch_fee_payapplication.COMPANYID = ch_fee_do.COMPANYID AND ch_fee_payapplication.GID = @gid ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_DO_APP_FOR_CANCEL, updateFeeDoStateParms);
//先将费用表的结算信息更新到结算前状态
SqlParameter[] updateFeeParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36)
};
updateFeeParms[0].Value = tempBillNO;
updateFeeParms[1].Value = tempCompanyID;
//还原已经进行付费结算的费用(撤销付费结算)
//string SQL_UPDATE_CH_FEE_FOR_CANCELPAYSETTLE = " UPDATE ch_fee SET ch_fee.FEESTATUS = (CASE WHEN ch_fee_do.ORIGAMOUNT = ch_fee.SETTLEMENT THEN 0 ELSE 8 END), "
//+ " ch_fee.SETTLEMENT = ISNULL(ch_fee.SETTLEMENT,0) - ch_fee_do.ORIGAMOUNT "
//+ " FROM ch_fee_do WHERE ch_fee.GID = ch_fee_do.FEEID AND ch_fee_do.BILLNO = @bill_no AND COMPANYID = @company_id ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_FOR_CANCELPAYSETTLE, updateFeeParms);
}
//更新ch_fee的结算金额-部分结算金额(撤销结算)
sSQL = " delete from ch_fee where GID in (select feeid from ch_fee_do where billno = '" + tempBillNO + "' and (ISDELETED is null or ISDELETED=0)) and feename='汇率损益'";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, sSQL, null);
}
else
{
//先将费用表的结算信息更新到结算前状态
SqlParameter[] updateFeeParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36)
};
updateFeeParms[0].Value = tempBillNO;
updateFeeParms[1].Value = tempCompanyID;
//还原已经进行付费结算的费用(撤销付费结算)
//string SQL_UPDATE_CH_FEE_FOR_CANCELPAYSETTLE = " UPDATE ch_fee SET ch_fee.FEESTATUS = (CASE WHEN ch_fee_do.ORIGAMOUNT = ch_fee.SETTLEMENT THEN 0 ELSE 8 END), "
//+ " ch_fee.SETTLEMENT = ISNULL(ch_fee.SETTLEMENT,0) - ch_fee_do.ORIGAMOUNT "
//+ " FROM ch_fee_do WHERE ch_fee.GID = ch_fee_do.FEEID AND ch_fee_do.BILLNO = @bill_no AND COMPANYID = @company_id ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_FOR_CANCELPAYSETTLE, updateFeeParms);
}
//删除FeeDo记录
SqlParameter[] deleteFeeDoParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_DO_DELETE_USER,SqlDbType.VarChar,36)
};
deleteFeeDoParms[0].Value = tempBillNO;
deleteFeeDoParms[1].Value = tempCompanyID;
deleteFeeDoParms[2].Value = tempOperator;
//删除付费结算费用明细表(撤销付费结算)
//string SQL_DELETE_CH_FEE_DO = " UPDATE ch_fee_do SET ISDELETED = 1,DELETEUSER = @delete_user,DELETETIME = GETDATE() WHERE BILLNO = @bill_no AND COMPANYID = @company_id ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_DELETE_CH_FEE_DO, deleteFeeDoParms);
//更新主表,更新要删除的预收预付明细表中的预付支取用资料
string ssql = "update [ch_fee_advance_payment] set DOAMOUNT=isnull((DOAMOUNT-(select sum(DOAMOUNT) from ch_fee_advance_payment_detail where SETTLEBILLNO='" + tempBillNO + "' and LINKGID=ch_fee_advance_payment.GID and (ISDELETE=0 or ISDELETE is null))),0),ISFINISH=0 where GID in (select LINKGID from ch_fee_advance_payment_detail where SETTLEBILLNO='" + tempBillNO + "' and (ISDELETE=0 or ISDELETE is null))";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, ssql, null);
//删除预收预付明细表中的预付支取用资料
ssql = "delete from ch_fee_advance_payment_detail where SETTLEBILLNO='" + tempBillNO + "'";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, ssql, null);
//删除预收预付主表中的预付支资料
ssql = "delete from ch_fee_advance_payment where BILLNO='" + tempBillNO + "'";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, ssql, null);
//删除FeeSettlement记录
SqlParameter[] deletePaySettleParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_DELETE_USER,SqlDbType.VarChar,36)
};
deletePaySettleParms[0].Value = tempBillNO;
deletePaySettleParms[1].Value = tempCompanyID;
deletePaySettleParms[2].Value = tempOperator;
//删除付费结算表(撤销付费结算)
//string SQL_DELETE_CH_FEE_SETTLEMENT = " UPDATE ch_fee_settlement SET ISDELETE = 1,DELETEUSER = @delete_user,DELETETIME = GETDATE() WHERE BILLNO = @bill_no AND COMPANYID = @company_id ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_DELETE_CH_FEE_SETTLEMENT, deletePaySettleParms);
//
SqlParameter[] deleteLinkParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36)
};
deleteLinkParms[0].Value = tempPaySettleID;
//删除合并结算关联信息表记录
//string SQL_DELETE_CH_FEE_SETTLE_LINK = " DELETE FROM ch_fee_settle_link WHERE SETTLEID = @settle_id ";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_DELETE_CH_FEE_SETTLE_LINK, deleteLinkParms);
//事务提交
sqlTran.Commit();
iResult = 1;//状态为1表示插入成功
}
catch (Exception execError)
{
iResult = -1;//有异常,插入失败
sqlTran.Rollback();
iResult = -2;//插入异常,事务已回滚成功
throw execError;
}
finally
{
SqlHelper.CloseConnection();
}
}
return iResult;
}
#endregion
public int MergePayApplicationSettle(IList<FeePayApplicationEntity> tempFeePayAppEntities,FeeSettlementEntity tempFeeSettlementEntity,string tempCompanyID,string tempOperator)
{
int iResult = 0;
using (SqlTransaction sqlTran = SqlHelper.BeginTransaction(SqlHelper.ConnectionStringLocalTransaction))
{
try
{
string strLastBillNo = "";
string strNewBillNo = "";
//先校验费用申请金额是否满足申请要求
int validState = 0;
//string strPayAppIdGroup = "";
for (int i = 0; i < tempFeePayAppEntities.Count; i++)
{
//if (i == tempFeePayAppEntities.Count - 1)
//{
// strPayAppIdGroup += "'" + tempFeePayAppEntities[i].GID + "' ";
//}
//else
//{
// strPayAppIdGroup += "'" + tempFeePayAppEntities[i].GID + "',";
//}
SqlParameter[] insertSettleLinkParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_CH_FEE_SETTLE_TYPE,SqlDbType.Int),
new SqlParameter(PARM_CH_FEE_SETTLE_RELATION_SUB_ID,SqlDbType.VarChar,36),
new SqlParameter(PARM_CH_FEE_SETTLE_CREATE_USER,SqlDbType.VarChar,36),
};
insertSettleLinkParms[0].Value = tempFeeSettlementEntity.GID;
insertSettleLinkParms[1].Value = 1;
insertSettleLinkParms[2].Value = tempFeePayAppEntities[i].GID;
insertSettleLinkParms[3].Value = tempOperator;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_CH_FEE_SETTLE_LINK, insertSettleLinkParms);
}
//if (strPayAppIdGroup.EndsWith(","))
//{
// strPayAppIdGroup = strPayAppIdGroup.Substring(0, strPayAppIdGroup.Length - 1);
//}
//string strValidSql = String.Format(,strPayAppIdGroup);
SqlParameter[] validParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36)
};
validParms[0].Value = tempFeeSettlementEntity.GID;
validState = (int)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_VALID_CH_FEE_SETTLEMENT_FOR_MERGE, validParms);
if (validState == 0)
{
//先获取SQL SERVER 数据库端服务器时间
DateTime nowServerDateTime = (DateTime)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_GET_SERVERTIME, null);
if (nowServerDateTime == DateTime.MinValue)
{
throw new Exception("未正常获取到服务端时间");
}
//获取分公司的票号头字符
string tempBANKSHEAD = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, "SELECT TOP 1 BANKSHEAD FROM company WHERE GID='" + tempCompanyID.Trim() + "'", null) as string;
//生成申请编号起始串
string strBillNoProfix = CreateBeginTitleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4);
SqlParameter[] getLastBillParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_SETTLEMENT_LIKE, SqlDbType.VarChar, 200),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36)
};
getLastBillParms[0].Value = strBillNoProfix + "%";
getLastBillParms[1].Value = tempCompanyID;
//获取最大的编号
string tempLastBillNo = (String)SqlHelper.ExecuteScalar(sqlTran, CommandType.Text, SQL_SELECT_LAST_BILL_NO, getLastBillParms) as string;
strLastBillNo = tempLastBillNo ?? "";
//生成付费申请编号
strNewBillNo = CreateSettleCode(nowServerDateTime, tempBANKSHEAD+"CR", 4, strLastBillNo);
SqlParameter[] settleParms = new SqlParameter[]{
new SqlParameter(PARM_FEE_SETTLEMENT_GID, SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_NO, SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_MODE, SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_CUSTOMER_NAME,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_TYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_AMOUNT_RMB,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_ACCOUNT_RMB,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_RATE,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_AMOUNT_USD,SqlDbType.Decimal,20),
new SqlParameter(PARM_FEE_SETTLEMENT_ACCOUNT_USD,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_TYPE,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_VOUCHER_NO,SqlDbType.VarChar,50),
new SqlParameter(PARM_FEE_SETTLEMENT_SETTLE_USER,SqlDbType.VarChar,36),
new SqlParameter(PARM_FEE_SETTLEMENT_IS_EXPORT,SqlDbType.Bit),
new SqlParameter(PARM_FEE_SETTLEMENT_FINANCIAL_VOUCHER,SqlDbType.VarChar,50),
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_STATUS,SqlDbType.Int),
new SqlParameter(PARM_FEE_SETTLEMENT_REMARK,SqlDbType.VarChar,1024),
new SqlParameter(PARM_FEE_SETTLEMENT_COMPANY_ID,SqlDbType.VarChar,36),
new SqlParameter("@ACCOUNTS_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@ACCOUNTS_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@ACCOUNTS_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@PREPAY_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@PREPAY_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@PREPAY_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@AHSR_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@AHSR_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@AHSR_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@FINANCIAL_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@FINANCIAL_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@FINANCIAL_MONEY", SqlDbType.Decimal,9) ,
new SqlParameter("@ADVANCE_CURRENCY", SqlDbType.VarChar,20) ,
new SqlParameter("@ADVANCE_RATE", SqlDbType.Decimal,9) ,
new SqlParameter("@ADVANCE_MONEY", SqlDbType.Decimal,9)
};
settleParms[0].Value = tempFeeSettlementEntity.GID;
settleParms[1].Value = strNewBillNo;
settleParms[2].Value = tempFeeSettlementEntity.SettleMode;
settleParms[3].Value = tempFeeSettlementEntity.CustomerName;
settleParms[4].Value = tempFeeSettlementEntity.SettleType;
settleParms[5].Value = tempFeeSettlementEntity.AmountRMB;
settleParms[6].Value = tempFeeSettlementEntity.AccountRMB;
settleParms[7].Value = tempFeeSettlementEntity.Rate;
settleParms[8].Value = tempFeeSettlementEntity.AmountUSD;
settleParms[9].Value = tempFeeSettlementEntity.AccountUSD;
settleParms[10].Value = tempFeeSettlementEntity.BillType;
settleParms[11].Value = tempFeeSettlementEntity.VoucherNO;
settleParms[12].Value = tempFeeSettlementEntity.SettleUser;
settleParms[13].Value = tempFeeSettlementEntity.IsExport;
settleParms[14].Value = tempFeeSettlementEntity.FinancialVoucher;
settleParms[15].Value = tempFeeSettlementEntity.BillStatus;
settleParms[16].Value = tempFeeSettlementEntity.Remark;
settleParms[17].Value = tempFeeSettlementEntity.CompanyID;
settleParms[18].Value = tempFeeSettlementEntity.ACCOUNTS_CURRENCY;//记账资料_币别
settleParms[19].Value = tempFeeSettlementEntity.ACCOUNTS_RATE;//记账资料_汇率
settleParms[20].Value = tempFeeSettlementEntity.ACCOUNTS_MONEY;//记账资料_金额
settleParms[21].Value = tempFeeSettlementEntity.PREPAY_CURRENCY;//预付支资料_币别
settleParms[22].Value = tempFeeSettlementEntity.PREPAY_RATE;//预付支资料_汇率
settleParms[23].Value = tempFeeSettlementEntity.PREPAY_MONEY;//预付支资料_金额
settleParms[24].Value = tempFeeSettlementEntity.AHSR_CURRENCY;//实付支资料_币别
settleParms[25].Value = tempFeeSettlementEntity.AHSR_RATE;//实付支资料_汇率
settleParms[26].Value = tempFeeSettlementEntity.AHSR_MONEY;//实付支资料_金额
settleParms[27].Value = tempFeeSettlementEntity.FINANCIAL_CURRENCY;//财务费用_币别
settleParms[28].Value = tempFeeSettlementEntity.FINANCIAL_RATE;//财务费用_汇率
settleParms[29].Value = tempFeeSettlementEntity.FINANCIAL_MONEY;//财务费用_金额
settleParms[30].Value = tempFeeSettlementEntity.ADVANCE_CURRENCY;//预付支取用资料_币别
settleParms[31].Value = tempFeeSettlementEntity.ADVANCE_RATE;//预付支取用资料_汇率
settleParms[32].Value = tempFeeSettlementEntity.ADVANCE_MONEY;//预付支取用资料_金额
//将所有合并付费申请生成的结算信息插入付费结算
string SQL_INSERT_CH_FEE_SETTLEMENT_FOR_MERGE = "INSERT INTO ch_fee_settlement(GID, BILLNO, BILLDATE, SETTLEMODE, CUSTOMERNAME, SETTLETYPE, AMOUNTRMB, ACCOUNTRMB, RATE, AMOUNTUSD, ACCOUNTUSD, BILLTYPE, VOUCHERNO, SETTLEUSER, SETTLETIME, ISEXPORT, FINANCIALVOUCHER, BILLSTATUS, REMARK,COMPANYID,ACCOUNTS_CURRENCY,ACCOUNTS_RATE,ACCOUNTS_MONEY,PREPAY_CURRENCY,PREPAY_RATE,PREPAY_MONEY,AHSR_CURRENCY,AHSR_RATE,AHSR_MONEY,FINANCIAL_CURRENCY,FINANCIAL_RATE,FINANCIAL_MONEY,ADVANCE_CURRENCY,ADVANCE_RATE,ADVANCE_MONEY)"
+ " VALUES(@gid,@bill_no,GETDATE(),@settle_mode,@customer_name,@settle_type,@amount_rmb,@account_rmb,@rate,@amount_usd,@account_usd,@bill_type,@voucher_no,@settle_user,GETDATE(),@is_export,@financial_voucher,@bill_status,@remark,@company_id,@ACCOUNTS_CURRENCY,@ACCOUNTS_RATE,@ACCOUNTS_MONEY,@PREPAY_CURRENCY,@PREPAY_RATE,@PREPAY_MONEY,@AHSR_CURRENCY,@AHSR_RATE,@AHSR_MONEY,@FINANCIAL_CURRENCY,@FINANCIAL_RATE,@FINANCIAL_MONEY,@ADVANCE_CURRENCY,@ADVANCE_RATE,@ADVANCE_MONEY)";
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_CH_FEE_SETTLEMENT_FOR_MERGE, settleParms);
//
SqlParameter[] insertFeeDoParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_SETTLEMENT_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36)
};
insertFeeDoParms[0].Value = strNewBillNo;
insertFeeDoParms[1].Value = tempFeeSettlementEntity.GID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_INSERT_CH_FEE_FEE_DO_FOR_MERGE, insertFeeDoParms);
//更新付费申请为已结算
SqlParameter[] updatePayAppStateParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_SETTLE_SETTLE_ID,SqlDbType.VarChar,36)
};
updatePayAppStateParms[0].Value = tempFeeSettlementEntity.GID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_PAY_APP_SETTLED, updatePayAppStateParms);
//更新付费申请费用明细状态为已结算
SqlParameter[] updateFeeDoStateParms = new SqlParameter[] {
new SqlParameter(PARM_CH_FEE_PAY_APP_GID,SqlDbType.VarChar,36)
};
updateFeeDoStateParms[0].Value = tempFeeSettlementEntity.GID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_DO_APP_SETTLED, updateFeeDoStateParms);
SqlParameter[] updateFeeParms = new SqlParameter[] {
new SqlParameter(PARM_FEE_DO_BILL_NO,SqlDbType.VarChar,20),
new SqlParameter(PARM_FEE_DO_COMPANY_ID,SqlDbType.VarChar,36)
};
updateFeeParms[0].Value = strNewBillNo;
updateFeeParms[1].Value = tempCompanyID;
SqlHelper.ExecuteNonQuery(sqlTran, CommandType.Text, SQL_UPDATE_CH_FEE_BY_CH_FEE_DO_FOR_MERGE, updateFeeParms);
}
//事务提交
sqlTran.Commit();
if (validState == 0)
{
iResult = 1;//状态为1表示插入成功
}
else
{
iResult = -3;//费用表没有足够的申请金额使用,无法提交付费申请
}
}
catch (Exception execError)
{
iResult = -1;//有异常,插入失败
sqlTran.Rollback();
iResult = -2;//插入异常,事务已回滚成功
throw execError;
}
finally
{
SqlHelper.CloseConnection();
}
}
return iResult;
}
}
}