using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Text; using DSWeb.Areas.TruckMng.Models.Comm; using HcUtility.Comm; using Microsoft.Practices.EnterpriseLibrary.Data; using DSWeb.Areas.TruckMng.DAL.MsWlBs; namespace DSWeb.Areas.TruckMng.DAL.Comm { public class MsChFeeDAL { #region 查询费用数据 static public List GetDataList(string strCondition,string userid) { var strSql = new StringBuilder(); strSql.Append("SELECT "); strSql.Append("GId,BsNo,FeeStatus,"); strSql.Append("(select EnumValueName from tSysEnumValue where LangId=0 and EnumTypeID=99024 and EnumValueID=ch_fee.FeeStatus) as FeeStatus_Ref"); strSql.Append(",FeeType,"); strSql.Append("(select EnumValueName from tSysEnumValue where LangId=0 and EnumTypeID=99020 and EnumValueID=ch_fee.FeeType) as FeeType_Ref"); strSql.Append(",FeeName,"); strSql.Append("(select top 1 NAME from vMsTruckFeeType where NAME=ch_fee.FeeName) as FeeName_Ref"); strSql.Append(",FeeDescription,CustomerType,CustomerName,"); strSql.Append("(select CustName from vMsTruckClient where CustName=ch_fee.CustomerName) as CustomerName_Ref"); strSql.Append(",Unit,UnitPrice,Quantity,Amount,Currency,ExChangerate,Reason"); strSql.Append(",Remark,Commissionrate,Settlement,Invoice,OrderAmount,OrderInvoice,SubmitDate"); strSql.Append(",Auditoperator,AuditDate,EnteroPerator,EnterDate,DebitNo,IsDebit,IsOpen"); strSql.Append(",IsAdvancedpay,Sort,IsInvoice,FeeFrt,IsCrmOrderFee,AuditStatus,InvoiceNum"); strSql.Append(",(select showname from [user] WHERE GID = ch_fee.ENTEROPERATOR) EnterOperatorName"); strSql.Append(",ChequeNum,WmsOutBsNo"); strSql.Append(" from ch_fee where 1=1 "); if (strCondition.Trim() != String.Empty) { strSql.Append(" and " + strCondition); } string powerstr = ""; int power = MsWlPcDAL.GetFFSFPower(userid); if (power == 1) { powerstr = @"and feetype = 1 "; } else if (power==2) { powerstr = @"and feetype = 2 "; } else if (power == 0) { powerstr = @"and 1=2 "; } strSql.Append(powerstr); return SetData(strSql); } private static List SetData(StringBuilder strSql) { var bodyList = new List(); Database db = DatabaseFactory.CreateDatabase(); using (IDataReader reader = db.ExecuteReader(CommandType.Text, strSql.ToString())) { while (reader.Read()) { MsChFee data = new MsChFee(); #region Set DB data to Object data.GId = Convert.ToString(reader["GId"]); data.BsNo = Convert.ToString(reader["BsNo"]); data.FeeStatus = Convert.ToDecimal(reader["FeeStatus"]); data.FeeStatus_Ref = Convert.ToString(reader["FeeStatus_Ref"]); data.FeeType = Convert.ToDecimal(reader["FeeType"]); data.FeeType_Ref = Convert.ToString(reader["FeeType_Ref"]); data.FeeName = Convert.ToString(reader["FeeName"]); data.FeeName_Ref = Convert.ToString(reader["FeeName_Ref"]); data.FeeDescription = Convert.ToString(reader["FeeDescription"]); data.CustomerType = Convert.ToString(reader["CustomerType"]); data.CustomerName = Convert.ToString(reader["CustomerName"]); data.CustomerName_Ref = Convert.ToString(reader["CustomerName_Ref"]); data.Unit = Convert.ToString(reader["Unit"]); data.UnitPrice = Convert.ToDecimal(reader["UnitPrice"]); data.Quantity = Convert.ToDecimal(reader["Quantity"]); data.Amount = Convert.ToDecimal(reader["Amount"]); data.Currency = Convert.ToString(reader["Currency"]); data.ExChangerate = Convert.ToDecimal(reader["ExChangerate"]); data.Reason = Convert.ToString(reader["Reason"]); data.Remark = Convert.ToString(reader["Remark"]); data.Commissionrate = Convert.ToDecimal(reader["Commissionrate"]); data.Settlement = Convert.ToDecimal(reader["Settlement"]); if (reader["Invoice"] != DBNull.Value) data.Invoice = Convert.ToDecimal(reader["Invoice"]); data.OrderAmount = Convert.ToDecimal(reader["OrderAmount"]); data.OrderInvoice = Convert.ToDecimal(reader["OrderInvoice"]); if (reader["SubmitDate"] != DBNull.Value) data.SubmitDate = Convert.ToDateTime(reader["SubmitDate"]); data.Auditoperator = Convert.ToString(reader["Auditoperator"]); if (reader["AuditDate"] != DBNull.Value) data.AuditDate = Convert.ToDateTime(reader["AuditDate"]); data.EnteroPerator = Convert.ToString(reader["EnteroPerator"]); if (reader["EnterDate"] != DBNull.Value) data.EnterDate = Convert.ToDateTime(reader["EnterDate"]); data.DebitNo = Convert.ToString(reader["DebitNo"]); data.IsDebit = Convert.ToString(reader["IsDebit"]); data.IsOpen = Convert.ToString(reader["IsOpen"]); data.IsAdvancedpay = Convert.ToString(reader["IsAdvancedpay"]); data.Sort = Convert.ToString(reader["Sort"]); data.IsInvoice = Convert.ToString(reader["IsInvoice"]); data.FeeFrt = Convert.ToString(reader["FeeFrt"]); data.IsCrmOrderFee = Convert.ToString(reader["IsCrmOrderFee"]); data.AuditStatus = Convert.ToDecimal(reader["AuditStatus"]); data.InvoiceNum = Convert.ToString(reader["InvoiceNum"]); data.ChequeNum = Convert.ToString(reader["ChequeNum"]); data.WmsOutBsNo = Convert.ToString(reader["WmsOutBsNo"]); data.EnterOperatorName = reader["EnterOperatorName"] == DBNull.Value ? "" : reader["EnterOperatorName"].ToString(); #endregion bodyList.Add(data); } reader.Close(); } return bodyList; } #endregion #region 提交申请 // 根据handle类型执行更新操作:更新费用信息ch_fee.feestatus和工作流运行表WorkFlowDo信息 // 费用状态值 费用状态主要有11个状态,分别为审核通过(STATUS=0)录入状态(STATUS=1)提交审核(STATUS=2)申请修改 (STATUS=3) // 取消申请(STATUS=5)驳回提交(STATUS=6)驳回申请(STATUS=7)部分结算(STATUS=8)结算完毕(STATUS=9) internal static DBResult Audit(int newStatus, List chfeeList) { var result = new DBResult(); foreach (var chFee in chfeeList) { var status = chFee.FeeStatus; var canAudit = true; if (newStatus == 2) { canAudit = status == 1 || status == 6; } else if (newStatus == 0) { canAudit = status == 2; } else if (newStatus == 6) { canAudit = status == 0 || status == 2; } else if (newStatus == 8 || newStatus == 9) { canAudit = status == 0 ; } if (!canAudit) { result.Success = false; if (newStatus == 2) result.Message = "只有在'录入状态'和'驳回提交'状态下才能提交审核操作"; else if (newStatus == 0) { result.Message = "只有在‘提交审核’状态下才能进行此操作"; } else if (newStatus == 6) { result.Message = "只有在‘审核通过’或‘提交审核’状态下才能进行此操作"; } else if (newStatus == 8 || newStatus == 9) { result.Message = "只有在‘审核通过’状态下才能进行此操作"; } return result; } } var feeBsNoList = new List(); foreach (var msChFee in chfeeList) { var bsNo = msChFee.BsNo; if (!feeBsNoList.Contains(bsNo)) { feeBsNoList.Add(bsNo); } } Database db = DatabaseFactory.CreateDatabase(); //费用锁定后不允许驳回。 foreach (var bsNo in feeBsNoList) { if (newStatus == 6) { string sql = string.Empty; if (bsNo.StartsWith("TMSBS")) { sql = "select FeeStatus from tMsWlBsHead where Gid=@gid"; }else { sql = "select FeeStatus from tMsWlPcHead where Gid=@gid"; ; } var cmdFeeStatus = db.GetSqlStringCommand(sql); db.AddInParameter(cmdFeeStatus, "@gid", DbType.String, bsNo); var feeStatus = Convert.ToString(db.ExecuteScalar(cmdFeeStatus)); if (feeStatus == "1") { result.Success = false; result.Message = "单据的费用已经锁定,不允许驳回费用"; return result; } } } var feeGIdList = new List(); foreach (var msChFee in chfeeList) { var GId = msChFee.GId; if (!feeGIdList.Contains(GId)) { feeGIdList.Add(GId); } } //费用锁定后不允许驳回。 foreach (var GId in feeGIdList) { if (newStatus == 6) { string sql = string.Empty; sql = "select case when ISVOU=1 or ACCDATE<>'' or accdate is not null then 1 else 0 end FeeStatus from ch_fee where bsno like '%XXH%' and Gid=@gid"; var cmdFeeStatus = db.GetSqlStringCommand(sql); db.AddInParameter(cmdFeeStatus, "@gid", DbType.String, GId); var feeStatus = Convert.ToString(db.ExecuteScalar(cmdFeeStatus)); if (feeStatus == "1") { result.Success = false; result.Message = "费用已经锁定或已生成凭证,不允许驳回或撤回"; return result; } } } const string selectSql = "select FeeStatus from ch_fee where gid=@gid"; const string updateSql = "update ch_fee set FeeStatus=@FeeStatus, Auditdate=getdate() where gid=@gid"; const string enumSql = "select EnumValueName from tSysEnumValue where LangId=0 and EnumTypeID=99024 and EnumValueID=@EnumValueID"; const string updateBsBillSql = "update tMsWlBsHead set FeeOpStatus=@FeeOpStatus where gid=@gid"; const string updatePcBillSql = "update tMsWlPcHead set FeeOpStatus=@FeeOpStatus where gid=@gid"; using (DbConnection connection = db.CreateConnection()) { connection.Open(); try { var cmdEnum = db.GetSqlStringCommand(enumSql); db.AddInParameter(cmdEnum, "@EnumValueID", DbType.Int32, newStatus); var newStatusRef = Convert.ToString(db.ExecuteScalar(cmdEnum)); DbTransaction transaction = connection.BeginTransaction(); try { foreach (var msChFee in chfeeList) { var cmdSelect = db.GetSqlStringCommand(selectSql); db.AddInParameter(cmdSelect, "@gid", DbType.String, msChFee.GId); var feeStatus = db.ExecuteScalar(cmdSelect, transaction); if (feeStatus == null) { throw new MsChFeeDealException("'" + msChFee.FeeName + "'数据还没有保存,不想允许提交,请保存后重试!"); } if (Convert.ToInt32(feeStatus) != msChFee.FeeStatus) { throw new MsChFeeDealException("'"+msChFee.FeeName+"'费用状态已经改变,不想允许提交,请刷新后重试!"); } var cmdUpdate = db.GetSqlStringCommand(updateSql); db.AddInParameter(cmdUpdate, "@FeeStatus", DbType.Int32, newStatus); db.AddInParameter(cmdUpdate, "@gid", DbType.String, msChFee.GId); db.ExecuteNonQuery(cmdUpdate, transaction); } foreach (var bsNo in feeBsNoList) { var rejectCount = GetFeeStatusRecordCount(db, bsNo, 6, transaction); if (rejectCount > 0) { SetBillFeeStatus(bsNo, "3", updateBsBillSql, updatePcBillSql, db, transaction);//驳回 } else { var passCount = GetFeeStatusRecordCount(db, bsNo, 0, transaction); if (passCount > 0) { SetBillFeeStatus(bsNo, "2", updateBsBillSql, updatePcBillSql, db, transaction);//审核通过 } else { var tjCount = GetFeeStatusRecordCount(db, bsNo, 2, transaction); if (tjCount > 0) { SetBillFeeStatus(bsNo, "1", updateBsBillSql, updatePcBillSql, db, transaction);//已提交 } } } } transaction.Commit(); result.Success = true; result.Message = "提交成功"; result.Data = newStatusRef; } catch (Exception e) { transaction.Rollback(); result.Success = false; if (e is MsChFeeDealException) result.Message = e.Message; else result.Message = "执行提交发生未知错误,请重试"; } } finally { connection.Close(); } } return result; } private static void SetBillFeeStatus( string bsNo, string feeOpStatus, string updateBsBillSql, string updatePcBillSql, Database db, DbTransaction transaction) { string sql = string.Empty; if (bsNo.StartsWith("TMSBS")) { sql = updateBsBillSql; } else { sql = updatePcBillSql; } var cmdUpdate = db.GetSqlStringCommand(sql); db.AddInParameter(cmdUpdate, "@FeeOpStatus", DbType.String, feeOpStatus); //驳回 db.AddInParameter(cmdUpdate, "@gid", DbType.String, bsNo); db.ExecuteNonQuery(cmdUpdate, transaction); } private static int GetFeeStatusRecordCount(Database db, string bsNo, int feeStatus, DbTransaction transaction) { var cmdRejectCount = db.GetSqlStringCommand("select count(*) from ch_fee where BsNo=@BsNo and FeeStatus=@FeeStatus"); db.AddInParameter(cmdRejectCount, "@BsNo", DbType.String, bsNo); db.AddInParameter(cmdRejectCount, "@FeeStatus", DbType.Int32, feeStatus); var rejectCount = Convert.ToInt32(db.ExecuteScalar(cmdRejectCount, transaction)); return rejectCount; } #endregion #region 查询应收/实收(现金帐目) static public List GetChFeeDo(string condition) { var strSql = new StringBuilder(); strSql.Append(" select fd.gid,f.bsno,f.customername,f.feeid,f.feename,fd.Doamount,f.feetype, "); strSql.Append("(select EnumValueName from tSysEnumValue where LangId=0 and EnumTypeID=99020 and EnumValueID=f.FeeType) as FeeType_Ref"); strSql.Append(" fd.createtime from ch_fee_do fd "); strSql.Append(" left join ch_fee f on f.gid=fd.feeid "); if (condition.Trim() != String.Empty) { strSql.Append(" where " + condition); } else { strSql.Clear(); }//防止无参数调用 return SetChFeeDo(strSql); } private static List SetChFeeDo(StringBuilder strSql) { var bodyList = new List(); Database db = DatabaseFactory.CreateDatabase(); using (IDataReader reader = db.ExecuteReader(CommandType.Text, strSql.ToString())) { while (reader.Read()) { MsChFeeDo data = new MsChFeeDo(); #region Set DB data to Object data.Gid = Convert.ToString(reader["Gid"]); data.bsno = Convert.ToString(reader["bsno"]); data.customername = Convert.ToString(reader["customername"]); data.feeid = Convert.ToString(reader["feeid"]); data.feename = Convert.ToString(reader["feename"]); data.Doamount = Convert.ToString(reader["Doamount"]); data.feetype = Convert.ToString(reader["feetype"]); data.createtime = Convert.ToString(reader["createtime"]); #endregion bodyList.Add(data); } reader.Close(); } return bodyList; } #endregion public static bool GetFeeCount(string BSNO) { var isfee = false; var strSql = new StringBuilder(); strSql.Append("Select count(*) as count "); strSql.Append(" from ch_fee "); strSql.Append(" where BSNO='" + BSNO + "'"); Database db = DatabaseFactory.CreateDatabase(); using (IDataReader reader = db.ExecuteReader(CommandType.Text, strSql.ToString())) { while (reader.Read()) { var evData = Convert.ToInt32(reader["count"]); if (evData > 0) { isfee = true; }; } reader.Close(); } return isfee; } /* static public int CWStart(string ContractNo) { var strSql = new StringBuilder(); strSql.Append(" exec smsCWStart '" + ContractNo + "'"); return setCWStart(strSql);//ExecuteNonQuery } private static int setCWStart(StringBuilder strSql) { var _count = 0; Database db = DatabaseFactory.CreateDatabase(); _count = db.ExecuteNonQuery(CommandType.Text, strSql.ToString()); return _count; }*/ } internal class MsChFeeDealException : Exception { internal MsChFeeDealException(string message) : base(message) { } } }