/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:F_HR_1202.cs * 2.功能描述:工资结算记录查询 * 编辑履历: * 作者 日期 版本 修改内容 * 庄天威 2014/09/12 1.00 新建 *******************************************************************************/ using System; using System.Data; using System.Windows.Forms; using System.Text; using Dongke.IBOSS.PRD.Basics.BaseControls; using Dongke.IBOSS.PRD.Basics.BaseResources; using Dongke.IBOSS.PRD.Basics.Library; using Dongke.IBOSS.PRD.Client.CommonModule; using Dongke.IBOSS.PRD.Client.DataModels; using Dongke.IBOSS.PRD.WCF.Proxys; using Dongke.IBOSS.PRD.WCF.Proxys.HRModuleService; using Dongke.IBOSS.PRD.WCF.DataModels; namespace Dongke.IBOSS.PRD.Client.HRModule { public partial class F_HR_1202 : FormBase { #region 成员变量 /// /// 主信息ID /// public int _mainId; /// /// 结算月 /// public DateTime? _smouth; /// /// 窗体模式 /// public Constant.FormMode _formType; /// /// 基础信息数据集 /// public DataSet _dsBase; /// /// 策略明细数据集 /// public DataSet _dsStrategy; /// /// 结算起始日 /// public DateTime? _salaryDateS; /// /// 结算终止日 /// public DateTime? _salaryDateE; /// /// 结算天数 /// public int _mouthDay; /// /// 结算金额 /// public decimal _salaryTotalMoney; /// /// 调整金额 /// public decimal _adjustmentAmount; /// /// 顶端显示模式 /// public int _topMode = 0; /// /// 当前页面是否结算 /// public int _nowSettlement = 0; public DataTable _dtStaffSalary; public DataTable _dtBasicSalary; public DataTable _dtAttendance; public DataTable _dtWages; public DataTable _dtDefectFine; public DataTable _dtScrapFine; public DataTable _dtAdmin; public DataTable _dtAdminDetail; public DataTable _dtProgress; public DataTable _dtProgressDetail; public DataTable _dtManagerSalary; public DataTable _dtMain; #endregion #region 构造函数 /// /// 构造函数 /// public F_HR_1202(int mainId,Constant.FormMode formType) { InitializeComponent(); _mainId = mainId; _formType = formType; } #endregion private void F_HR_1202_Load(object sender, EventArgs e) { try { CreateTable(); BindPage(); if(_formType == Constant.FormMode.Edit) { this.tsbtnSettlement.Text = "结算or筛选(&J)"; //根据主ID获取全部明细信息 this.tsbtnSettlement.Enabled = false; this.dtpStartTime.Enabled = false; _nowSettlement = 1; //已经通过审批的则不可以修改 foreach(DataGridViewRow gvrFor in this.dgvSettlement.Rows) { int AuditValue = Convert.ToInt32(gvrFor.Cells["AuditStatus"].Value); if (AuditValue == 1) { gvrFor.Cells["AdjustmentAmount"].ReadOnly = true; gvrFor.Cells["Remarks"].ReadOnly = true; } } } else if(_formType == Constant.FormMode.Display) { this.tsbtnSettlement.Text = "结算or筛选(&J)"; //根据主ID获取全部明细信息 //控件除提交外全部不可用 //列表内复选框列可见 this.dgvSettlement.Columns["AuditStatus"].Visible = true; this.dgvSettlement.Columns["AdjustmentAmount"].ReadOnly = true; this.dgvSettlement.Columns["Remarks"].ReadOnly = true; //已经被选中的要设置为只读 foreach(DataGridViewRow gvrFor in this.dgvSettlement.Rows) { int AuditValue = Convert.ToInt32(gvrFor.Cells["AuditStatus"].Value); if(AuditValue == 1) { gvrFor.Cells["AuditStatus"].ReadOnly = true; } } this.dtpStartTime.Enabled = false; this.btnSettlement.Enabled = false; this.txtRemarks.Enabled = false; _nowSettlement = 1; } this.dgvSettlement.IsSetInputColumnsColor = true; } catch(Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } private void tsbtnSettlement_Click(object sender, EventArgs e) { try { if(_topMode == 0) { if (_nowSettlement == 0) { MessageBox.Show("请先进行结算操作!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } _topMode = 1; this.cgbSelect.Visible = true; this.cgbBase.Visible = false; } else { _topMode = 0; this.cgbSelect.Visible = false; this.cgbBase.Visible = true; } } catch(Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } private void tsbtnAdaptive_Click(object sender, EventArgs e) { this.dgvSettlement.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); } private void btnSubmit_Click(object sender, EventArgs e) { try { GetAdjustmentAmount(); if (_formType == Constant.FormMode.Add) { if (_nowSettlement == 0) { MessageBox.Show("当前页未成功进行结算,无法提交!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //创建主信息实体 GetSalaryEntity gsEntity = new GetSalaryEntity(); gsEntity.AccountMonth = _smouth; gsEntity.SalaryDateS = _salaryDateS; gsEntity.SalaryDateE = _salaryDateE; gsEntity.SettlementAmount = _salaryTotalMoney; gsEntity.AdjustmentAmount = _adjustmentAmount; gsEntity.TotalAmount = gsEntity.SettlementAmount + gsEntity.AdjustmentAmount; gsEntity.Remarks = this.txtRemarks.Text; //创建各明细信息数据集 DataSet dsStaffSalary = new DataSet(); dsStaffSalary.Tables.Add(_dtStaffSalary.Copy()); dsStaffSalary.Tables.Add(_dtBasicSalary.Copy()); dsStaffSalary.Tables.Add(_dtWages.Copy()); dsStaffSalary.Tables.Add(_dtDefectFine.Copy()); dsStaffSalary.Tables.Add(_dtScrapFine.Copy()); dsStaffSalary.Tables.Add(_dtAdmin.Copy()); dsStaffSalary.Tables.Add(_dtAdminDetail.Copy()); dsStaffSalary.Tables.Add(_dtProgress.Copy()); dsStaffSalary.Tables.Add(_dtProgressDetail.Copy()); dsStaffSalary.Tables.Add(_dtManagerSalary.Copy()); int SalaryReturn = HRModuleProxy.Service.AddSalarySettlement(gsEntity, dsStaffSalary, _dsBase); if (SalaryReturn > 0) { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_I001, "工资结算", "保存"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } else { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_W001, "工资结算", "保存"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else if(_formType == Constant.FormMode.Edit) { GetSalaryEntity gsEntity = new GetSalaryEntity(); gsEntity.AdjustmentAmount = _adjustmentAmount; gsEntity.TotalAmount = _salaryTotalMoney + _adjustmentAmount; gsEntity.Remarks = this.txtRemarks.Text; gsEntity.SalarySettlementID = _mainId; int SalaryReturn = HRModuleProxy.Service.EditSalarySettlement(gsEntity, _dtStaffSalary); if (SalaryReturn > 0) { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_I001, "工资结算", "调整"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } else { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_W001, "工资结算", "调整"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else if(_formType == Constant.FormMode.Display) { int SalaryReturn = HRModuleProxy.Service.AuditSalarySettlement(_dtStaffSalary); if (SalaryReturn > 0) { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_I001, "工资结算", "审批"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } else { // 提示信息 MessageBox.Show(string.Format(Messages.MSG_CMN_W001, "工资结算", "审批"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } private void BindPage() { try { if (_formType == Constant.FormMode.Add) { DataSet dsSMouth = SystemModuleProxy.Service.GetSettlementTime(); if (dsSMouth != null) { this.dtpStartTime.Enabled = false; this.dtpStartTime.Value = Convert.ToDateTime(dsSMouth.Tables[0].Rows[0]["DateValue"]); _smouth = Convert.ToDateTime(dsSMouth.Tables[0].Rows[0]["DateValue"]); } else { this.dtpStartTime.Enabled = true; } } else if(_formType == Constant.FormMode.Edit || _formType == Constant.FormMode.Display) { this.dgvSettlement.AutoGenerateColumns = false; this.dgvSettlement.DataSource = _dtStaffSalary; this.txtRemarks.Text = _dtMain.Rows[0]["Remarks"].ToString(); this.dtpStartTime.Value = Convert.ToDateTime(_dtMain.Rows[0]["AccountMonth"]); } } catch(Exception ex) { throw ex; } } private void GetBaseData() { try { GetSalaryEntity gsEntity = new GetSalaryEntity(); //首先获取结算日期 int SDay = 0; DataTable dtSysData = SystemModuleProxy.Service.GetSystemData().Tables[0]; foreach (DataRow drFor in dtSysData.Rows) { if (drFor["SettingCode"].ToString().Trim() == "S_CMN_0003") { if (drFor["SettingValue"].ToString() == "月末") { SDay = Convert.ToInt32(DateTime.DaysInMonth(this.dtpStartTime.Value.Year, this.dtpStartTime.Value.Month)); } } } //然后获取结算月,如果有取那个月,如果没有界面获取的月 DateTime dtSMouth; if (_smouth != null) { dtSMouth = Convert.ToDateTime(_smouth).AddDays(-Convert.ToDateTime(_smouth).Day + 1); } else { dtSMouth = this.dtpStartTime.Value.Date.AddDays(-this.dtpStartTime.Value.Date.Day + 1); _smouth = dtSMouth; } //计算出结算起始日和终止日 DateTime SalaryDateS = dtSMouth; DateTime SalaryDateE = dtSMouth.AddDays(SDay); gsEntity.SalaryDateS = SalaryDateS; gsEntity.SalaryDateE = SalaryDateE.AddHours(23).AddMinutes(59).AddSeconds(59).AddDays(-1); _salaryDateS = SalaryDateS; _salaryDateE = SalaryDateE; //因为要算上结算最后一天的本体,所以要+1 _mouthDay = ((TimeSpan)(SalaryDateE - SalaryDateS)).Days; //获取全部策略明细信息 DataSet dsStrategy = TATModuleProxy.Service.GetAllUseStrategy(SalaryDateS); _dsStrategy = dsStrategy; if (_dsStrategy.Tables[2].Rows.Count != 0 && _dsStrategy.Tables[3].Rows.Count != 0) { gsEntity.WagesMainId = Convert.ToInt32(_dsStrategy.Tables[2].Rows[0]["WagesId"]); gsEntity.WagesMainIdE = Convert.ToInt32(_dsStrategy.Tables[3].Rows[0]["WagesId"]); } else { //没有对应的工价明细 return; } //最后获取全部基础信息 DataSet dsBase = HRModuleProxy.Service.GetSalaryData(gsEntity); _dsBase = dsBase; //进行结算 Settlement(); } catch(Exception ex) { throw ex; } } private void Settlement() { int row = 0; try { //获取全部员工并遍历 DataTable dtStaff = _dsBase.Tables[6]; foreach (DataRow drStaff in dtStaff.Rows) { //if (row > 10) //{ // break; //} row++; //if(row==1564) //{ // int a = 0; //} //员工ID int StaffId = Convert.ToInt32(drStaff["StaffId"]); //员工工种 int StaffJobsId = Convert.ToInt32(drStaff["Jobs"]); //员工状态 int StaffStatus = Convert.ToInt32(drStaff["StaffStatus"]); //员工入职时间 if (drStaff["EntryDate"] != DBNull.Value) { DateTime StaffEntryDate = Convert.ToDateTime(drStaff["EntryDate"]); } //员工离职时间 DateTime? StaffTurnoverDate = null; if (drStaff["TurnoverDate"] != DBNull.Value) { StaffTurnoverDate = Convert.ToDateTime(drStaff["TurnoverDate"]); } #region 基本工资 + 行政奖惩 + 进度奖惩 //该员工基本工资(基本工资+出勤考核) decimal BSalary = 0; //该员工行政考核总额 decimal ASalary = 0; //该员工进度考核总额 decimal PSalary = 0; //基本工资部分,首先查看该人员是否有人事变动 DataTable dtRecord = _dsBase.Tables[7].Copy(); dtRecord.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtRecordNow = dtRecord.DefaultView.ToTable(); //如果有人事变动的话 if (dtRecordNow.Rows.Count != 0) { //遍历人事变动,从结算开始日起,到第一条记录的审批日期,为该员工担当该履历调整前工种 //后面的以此类推,第一条记录的审批日期至第二条记录的审批日期,为该员工担当第二条履历的调整前工种 //当然,存储过程获取的是结算时间段内审批通过的信息,所以无需担心审批日大于结算终止日 //结算每一条履历完毕后要把已结算日期(RecordStartTime)保存起来,履历遍历结束后如果记录时间小于结算终止日,还要计算员工当前工种的工资 //计算当前工种工资为最后一条履历的审批时间至结算终止日 DateTime RecordStartTime = Convert.ToDateTime(_salaryDateS); int LastTargetJobs = 0; int LastStatus = 0; foreach (DataRow drRecordFor in dtRecordNow.Rows) { //首先查看该履历中的变动前状态,如果是未入职/离职的话,直接下一条信息 if (Convert.ToInt32(drRecordFor["OriginalStaffStatus"]) == 0 || Convert.ToInt32(drRecordFor["OriginalStaffStatus"]) == 3) { RecordStartTime = Convert.ToDateTime(drRecordFor["ApprovalDate"]); LastStatus = Convert.ToInt32(drRecordFor["TargetStaffStatus"]); LastTargetJobs = Convert.ToInt32(drRecordFor["TargetJobs"]); continue; } //其次获取该履历中的变动前工种,即该员工从开始结算日-审批日中间的工种 int RFJobsId = Convert.ToInt32(drRecordFor["OriginalJobs"]); //获取变动前状态,分辨是试用还是正式 int RFStatus = Convert.ToInt32(drRecordFor["OriginalStaffStatus"]); //获取审批通过时间(即变化工种时间) DateTime UpdateTime = Convert.ToDateTime(drRecordFor["ApprovalDate"]); //计算该工种担当时间的工资,累加(-1天是因为审核当天就变成另一个工种了,那一天是下次结算的) BSalary += this.GetBSalaryByJobsId(StaffId, RFJobsId, RFStatus, RecordStartTime, UpdateTime); //并同时计算该时间段的行政奖惩金额 ASalary += this.GetASalaryByJobsId(StaffId, RFJobsId, RFStatus, RecordStartTime, UpdateTime); //并同时计算该时间段的进度奖惩金额 PSalary += this.GetPSalaryByJobsId(StaffId, RFJobsId, RFStatus, RecordStartTime, UpdateTime); //更新已结算日期,循环 RecordStartTime = UpdateTime; LastStatus = Convert.ToInt32(drRecordFor["TargetStaffStatus"]); if (LastStatus == 0 || LastStatus == 3)//同上,保护后面的值不会取空 { continue; } LastTargetJobs = Convert.ToInt32(drRecordFor["TargetJobs"]); } //如果循环完毕后,如果已结算日期不等于结算终止日 //那么要算出已结算日期-结算终止日的循环完毕后遗留的“变动后工种”的工资 //步骤同上 if (LastStatus != 0 && LastStatus != 3) { BSalary += this.GetBSalaryByJobsId(StaffId, LastTargetJobs, LastStatus, RecordStartTime, Convert.ToDateTime(_salaryDateE)); ASalary += this.GetASalaryByJobsId(StaffId, LastTargetJobs, LastStatus, RecordStartTime, Convert.ToDateTime(_salaryDateE)); PSalary += this.GetPSalaryByJobsId(StaffId, LastTargetJobs, LastStatus, RecordStartTime, Convert.ToDateTime(_salaryDateE)); } } else { //当段时间内没有人事变动的话,要获取结算日期前的最后一次履历,进行相关逻辑结算 DataTable dtUpRecord = _dsBase.Tables[8]; dtUpRecord.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtUpRecordNow = dtRecord.DefaultView.ToTable(); if (dtUpRecordNow.Rows.Count != 0) { DataRow drUpRecord = dtUpRecord.Rows[0]; BSalary += this.GetBSalaryByJobsId(StaffId, Convert.ToInt32(drUpRecord["TargetJobs"]), Convert.ToInt32(drUpRecord["TargetStaffStatus"]), Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); ASalary += this.GetASalaryByJobsId(StaffId, Convert.ToInt32(drUpRecord["TargetJobs"]), Convert.ToInt32(drUpRecord["TargetStaffStatus"]), Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); PSalary += this.GetPSalaryByJobsId(StaffId, Convert.ToInt32(drUpRecord["TargetJobs"]), Convert.ToInt32(drUpRecord["TargetStaffStatus"]), Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); } else //直接取员工本身的 { BSalary += this.GetBSalaryByJobsId(StaffId, StaffJobsId, StaffStatus, Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); ASalary += this.GetASalaryByJobsId(StaffId, StaffJobsId, StaffStatus, Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); PSalary += this.GetPSalaryByJobsId(StaffId, StaffJobsId, StaffStatus, Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE)); } } #endregion #region 计件工资 //该员工计件工资 decimal CSalary = 0; //获取该员工参与的全部生产数据(计条码,计件,计窑车) DataTable dtBarCode = _dsBase.Tables[9].Copy(); dtBarCode.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtBarCodeNow = dtBarCode.DefaultView.ToTable(); foreach (DataRow drNowFor in dtBarCodeNow.Rows) { //计条码的,直接累加对应商品的工价*计价单位数量即可 if (drNowFor["PieceNum"] != DBNull.Value || drNowFor["Wages"] != DBNull.Value) { CSalary += Convert.ToDecimal(drNowFor["PieceNum"]) * Convert.ToDecimal(drNowFor["Wages"]); } //添加计件工资明细 DataRow drWages = _dtWages.NewRow(); drWages["WagesJobs"] = drNowFor["UJobsID"]; drWages["StaffID"] = StaffId; drWages["SalaryType"] = drNowFor["StaffStatus"]; drWages["PriceType"] = drNowFor["PriceType"]; drWages["AccountDateFrom"] = _salaryDateS; drWages["AccountDateTo"] = _salaryDateE; drWages["BarCode"] = drNowFor["BarCode"]; drWages["GoodsId"] = drNowFor["GoodsId"]; drWages["GoodsLevelTypeID"] = drNowFor["GoodsLevelTypeID"]; drWages["Wages"] = drNowFor["Wages"]; drWages["Salary"] = Convert.ToDecimal(drNowFor["PieceNum"]) * Convert.ToDecimal(drNowFor["Wages"]); _dtWages.Rows.Add(drWages); } DataTable dtCount = _dsBase.Tables[0].Copy(); dtCount.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtCountNow = dtCount.DefaultView.ToTable(); foreach (DataRow drNowFor in dtCountNow.Rows) { //计件同理,直接累加对应商品的工价*计价单位数量即可 if (drNowFor["PieceNum"] != DBNull.Value || drNowFor["Wages"] != DBNull.Value) { CSalary += Convert.ToDecimal(drNowFor["PieceNum"]) * Convert.ToDecimal(drNowFor["Wages"]); } //添加计件工资明细 DataRow drWages = _dtWages.NewRow(); drWages["WagesJobs"] = drNowFor["UJobsID"]; drWages["StaffID"] = StaffId; drWages["SalaryType"] = drNowFor["StaffStatus"]; drWages["PriceType"] = drNowFor["PriceType"]; drWages["AccountDateFrom"] = _salaryDateS; drWages["AccountDateTo"] = _salaryDateE; drWages["BarCode"] = drNowFor["BarCode"]; drWages["GoodsId"] = drNowFor["GoodsId"]; drWages["GoodsLevelTypeID"] = drNowFor["GoodsLevelTypeID"]; drWages["Wages"] = drNowFor["Wages"]; drWages["Salary"] = Convert.ToDecimal(drNowFor["PieceNum"]) * Convert.ToDecimal(drNowFor["Wages"]); _dtWages.Rows.Add(drWages); } DataTable dtCar = _dsBase.Tables[5].Copy(); dtCar.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtCarNow = dtCar.DefaultView.ToTable(); foreach (DataRow drNowFor in dtCarNow.Rows) { //计车的,累加每车单价以及计车单位数 CSalary += Convert.ToDecimal(drNowFor["KilnCarNum"]) * Convert.ToDecimal(drNowFor["CarPricing"]); //添加计件工资明细 DataRow drWages = _dtWages.NewRow(); drWages["WagesJobs"] = drNowFor["UJobsID"]; drWages["StaffID"] = StaffId; drWages["SalaryType"] = drNowFor["StaffStatus"]; drWages["PriceType"] = drNowFor["PriceType"]; drWages["AccountDateFrom"] = _salaryDateS; drWages["AccountDateTo"] = _salaryDateE; drWages["KilnID"] = drNowFor["KilnID"]; drWages["KilnCarID"] = drNowFor["KilnCarID"]; drWages["IntoKilnTime"] = drNowFor["IntoKilnTime"]; drWages["OutKilnTime"] = drNowFor["OutKilnTime"]; drWages["Wages"] = drNowFor["CarPricing"]; drWages["Salary"] = Convert.ToDecimal(drNowFor["KilnCarNum"]) * Convert.ToDecimal(drNowFor["CarPricing"]); _dtWages.Rows.Add(drWages); } DataTable dtWeight = _dsBase.Tables[11].Copy(); dtWeight.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtWeightNow = dtWeight.DefaultView.ToTable(); foreach(DataRow drNowFor in dtWeightNow.Rows) { //计重量的,用重量乘单价乘单位数 CSalary += Convert.ToDecimal(drNowFor["Lusterwareweight"]) * Convert.ToDecimal(drNowFor["WeightPricing"]) * Convert.ToDecimal(drNowFor["Weight"]); //添加计件工资明细 DataRow drWages = _dtWages.NewRow(); drWages["WagesJobs"] = drNowFor["UJobsID"]; drWages["StaffID"] = StaffId; drWages["SalaryType"] = drNowFor["StaffStatus"]; drWages["PriceType"] = drNowFor["PriceType"]; drWages["AccountDateFrom"] = _salaryDateS; drWages["AccountDateTo"] = _salaryDateE; drWages["Wages"] = drNowFor["WeightPricing"]; drWages["Salary"] = Convert.ToDecimal(drNowFor["Lusterwareweight"]) * Convert.ToDecimal(drNowFor["WeightPricing"]) * Convert.ToDecimal(drNowFor["Weight"]); _dtWages.Rows.Add(drWages); } #endregion #region 缺陷扣罚 //该员工缺陷扣罚总额 decimal DSalary = 0; //获取该员工相关的缺陷扣罚信息 DataTable dtDefect = _dsBase.Tables[3].Copy(); dtDefect.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtDefectNow = dtDefect.DefaultView.ToTable(); //获取全部缺陷扣罚明细 DataTable dtDefectDetail = _dsStrategy.Tables[4].Copy(); foreach (DataRow drFor in dtDefectNow.Rows) { //首先根据缺陷扣罚类别,获取明细 dtDefectDetail.DefaultView.RowFilter = " DefectFine = " + drFor["DefectFine"].ToString() + " and SalaryType = " + (Convert.ToInt32(drFor["StaffStatus"]) - 1); DataTable dtDefectDetailNow = dtDefectDetail.DefaultView.ToTable(); if (dtDefectDetailNow.Rows.Count != 0) { //那么首先获取第一行,如果是按金额扣罚,直接获取金额即可 //如果是按工价比例扣罚,那么还要进一步根据产品来匹配工价以及策略扣罚比例 DataRow drDetailTop = dtDefectDetailNow.Rows[0]; DataRow drDefect = _dtDefectFine.NewRow(); drDefect["StaffID"] = StaffId; drDefect["StaffStatus"] = drFor["StaffStatus"]; drDefect["JobsID"] = drFor["UJobsID"]; drDefect["SalaryType"] = (Convert.ToInt32(drFor["StaffStatus"]) - 1); drDefect["BeginDate"] = _salaryDateS; ; drDefect["EndDate"] = _salaryDateE; drDefect["BarCode"] = drFor["BarCode"]; drDefect["DefectFine"] = drFor["DefectFine"]; drDefect["FineType"] = drDetailTop["FineType"]; if (Convert.ToInt32(drDetailTop["FineType"]) == 2) { //筛选条件包含工种,状态,产品 dtDefectDetailNow.DefaultView.RowFilter = " JobsID = " + drFor["UJobsID"] + " and GoodsID = " + drFor["GoodsID"] + " and SalaryType = " + (Convert.ToInt32(drFor["StaffStatus"]) - 1); DataTable dtDefectGoods = dtDefectDetailNow.DefaultView.ToTable(); if (dtDefectGoods.Rows.Count != 0) { DSalary += Convert.ToDecimal(dtDefectGoods.Rows[0]["FineAmount"]); drDefect["FineAmount"] = Convert.ToDecimal(dtDefectGoods.Rows[0]["FineAmount"]); } } else { //借用结算计件工资时的两个数据集,因为这时候不清楚缺陷扣罚的那个生产数据是根据什么计的,所以要分别在两个数据集中找 //找到了之后,用工价乘以缺陷扣罚中的百分比即可 dtBarCodeNow.DefaultView.RowFilter = " BarCode = " + drFor["BarCode"] + " and UJobsID = " + drFor["UJobsID"] + " and StaffStatus = " + drFor["StaffStatus"]; DataTable dtWagesByBarCode = dtBarCodeNow.DefaultView.ToTable(); dtCountNow.DefaultView.RowFilter = " BarCode = " + drFor["BarCode"] + " and UJobsID = " + drFor["UJobsID"] + " and StaffStatus = " + drFor["StaffStatus"]; DataTable dtWagesByCount = dtCountNow.DefaultView.ToTable(); if (dtWagesByBarCode.Rows.Count != 0) { DSalary += Convert.ToDecimal(dtWagesByBarCode.Rows[0]["Wages"]) * Convert.ToDecimal(drDetailTop["Coefficient"]) / 100; drDefect["FineAmount"] = Convert.ToDecimal(dtWagesByBarCode.Rows[0]["Wages"]) * Convert.ToDecimal(drDetailTop["Coefficient"]) / 100; } else if (dtWagesByCount.Rows.Count != 0) { DSalary += Convert.ToDecimal(dtWagesByCount.Rows[0]["Wages"]) * Convert.ToDecimal(drDetailTop["Coefficient"]) / 100; drDefect["FineAmount"] = Convert.ToDecimal(dtWagesByCount.Rows[0]["Wages"]) * Convert.ToDecimal(drDetailTop["Coefficient"]) / 100; } else { drDefect["FineAmount"] = 0; } } _dtDefectFine.Rows.Add(drDefect); } else { continue; } } #endregion #region 损坯扣罚 //损坯扣罚金额 decimal SSalary = 0; //获取该员工相关的缺陷扣罚信息 DataTable dtScrapProduct = _dsBase.Tables[10].Copy(); dtScrapProduct.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtScrapProductNow = dtScrapProduct.DefaultView.ToTable(); foreach (DataRow drFor in dtScrapProductNow.Rows) { SSalary += Convert.ToDecimal(drFor["ScrapFine"]); DataRow drScrapFine = _dtScrapFine.NewRow(); drScrapFine["StaffID"] = StaffId; drScrapFine["StaffStatus"] = drFor["StaffStatus"]; drScrapFine["JobsID"] = drFor["UJobsID"]; drScrapFine["BeginDate"] = _salaryDateS; drScrapFine["EndDate"] = _salaryDateE; drScrapFine["BarCode"] = drFor["BarCode"]; drScrapFine["GoodsID"] = drFor["GoodsID"]; drScrapFine["ScrapTime"] = drFor["ScrapDate"]; drScrapFine["ScrapFine"] = drFor["ScrapFine"]; _dtScrapFine.Rows.Add(drScrapFine); } #endregion #region 工资总计 DataRow drStaffSalary = _dtStaffSalary.NewRow(); drStaffSalary["StaffID"] = StaffId; drStaffSalary["StaffName"] = drStaff["StaffName"]; drStaffSalary["OrganizationName"] = drStaff["OrganizationName"]; drStaffSalary["PostName"] = drStaff["PostName"]; drStaffSalary["AccountMonth"] = _smouth; drStaffSalary["AccountDateFrom"] = _salaryDateS; drStaffSalary["AccountDateTo"] = _salaryDateE; drStaffSalary["BasicSalary"] = BSalary; drStaffSalary["WagesSalary"] = CSalary; drStaffSalary["DefectFine"] = DSalary; drStaffSalary["ScrapFine"] = SSalary; drStaffSalary["AdminSalary"] = ASalary; drStaffSalary["ProgressSalary"] = PSalary; drStaffSalary["AuditStatus"] = 0; drStaffSalary["TotalAmount"] = BSalary + CSalary - DSalary - SSalary + ASalary + PSalary; drStaffSalary["SettlementAmount"] = BSalary + CSalary - DSalary - SSalary + ASalary + PSalary; drStaffSalary["AdjustmentAmount"] = 0; _dtStaffSalary.Rows.Add(drStaffSalary); #endregion _salaryTotalMoney += BSalary + CSalary - DSalary - SSalary + ASalary + PSalary; } #region 管理者工资 //全部结算完毕后,重新循环一次页面列表数据源 foreach(DataRow drFor in _dtStaffSalary.Rows) { decimal MSalary = 0; //过程就是,获取每一个已结算的员工,查询该员工在管理者策略中是否担当管理者 //如果是,那么查询该管理者所属的所有组员,获取他们的已结算工资,并根据管理者策略明细计算出该管理者的工资 //如果否,进入下一个员工的循环 int StaffId = Convert.ToInt32(drFor["StaffID"]); DataTable dtManagersDetail = _dsStrategy.Tables[7]; dtManagersDetail.DefaultView.RowFilter = " Manager = " + StaffId; DataTable dtManagerToMember = dtManagersDetail.DefaultView.ToTable(); //如果筛选后依然存在信息,那么该员工就是管理者 if(dtManagerToMember.Rows.Count != 0) { //首先获取第一行,查看该管理者工资的计算方式 int SalaryType = Convert.ToInt32(dtManagerToMember.Rows[0]["SalaryType"]); int MemberId = Convert.ToInt32(dtManagerToMember.Rows[0]["ManagersID"]); int ManagerSalaryID = Convert.ToInt32(dtManagerToMember.Rows[0]["ManagerSalaryID"]); if(SalaryType == 1) //平均工资的话,遍历所有组员,找到对应结算信息,累加工资,并算出平均数 { int MemberCount = 0; decimal MemberTotalSalary = 0; foreach(DataRow drMemberFor in dtManagerToMember.Rows) { _dtStaffSalary.DefaultView.RowFilter = " StaffId = " + drMemberFor["Member"]; DataTable dtMemberSalary = _dtStaffSalary.DefaultView.ToTable(); if(dtMemberSalary.Rows.Count != 0) { MemberTotalSalary += Convert.ToDecimal(dtMemberSalary.Rows[0]["SettlementAmount"]); MemberCount++; } } MSalary = MemberTotalSalary / MemberCount; } else if (SalaryType == 2) //最高工资的话,遍历所有组员,获取最高的金额 { decimal MemberMaxSalary = 0; foreach (DataRow drMemberFor in dtManagerToMember.Rows) { _dtStaffSalary.DefaultView.RowFilter = " StaffId = " + drMemberFor["Member"]; DataTable dtMemberSalary = _dtStaffSalary.DefaultView.ToTable(); if (dtMemberSalary.Rows.Count != 0) { decimal MemberSalaryFor = Convert.ToDecimal(dtMemberSalary.Rows[0]["SettlementAmount"]); if(MemberMaxSalary < MemberSalaryFor) { MemberMaxSalary = MemberSalaryFor; } } } MSalary = MemberMaxSalary; } else if(SalaryType == 3) { decimal MemberMinSalary = 0; foreach (DataRow drMemberFor in dtManagerToMember.Rows) { _dtStaffSalary.DefaultView.RowFilter = " StaffId = " + drMemberFor["Member"]; DataTable dtMemberSalary = _dtStaffSalary.DefaultView.ToTable(); if (dtMemberSalary.Rows.Count != 0) { decimal MemberSalaryFor = Convert.ToDecimal(dtMemberSalary.Rows[0]["SettlementAmount"]); if (MemberMinSalary > MemberSalaryFor) { MemberMinSalary = MemberSalaryFor; } } } MSalary = MemberMinSalary; } //保存管理者工资明细 DataRow drManagerSalary = _dtManagerSalary.NewRow(); drManagerSalary["StaffID"] = StaffId; drManagerSalary["Member"] = MemberId; drManagerSalary["Salary"] = MSalary; _dtManagerSalary.Rows.Add(drManagerSalary); //并修改界面数据源的值 drFor["ManagerSalary"] = MSalary; drFor["TATManagersID"] = ManagerSalaryID; drFor["TotalAmount"] = Convert.ToDecimal(drFor["TotalAmount"]) + MSalary; drFor["SettlementAmount"] = Convert.ToDecimal(drFor["SettlementAmount"]) + MSalary; _salaryTotalMoney += MSalary; } else { drFor["ManagerSalary"] = 0; continue; } } #endregion //清空筛选条件 _dtStaffSalary.DefaultView.RowFilter = ""; this.dgvSettlement.AutoGenerateColumns = false; this.dgvSettlement.DataSource = _dtStaffSalary; this.dgvSettlement.IsSetInputColumnsColor = true; _nowSettlement = 1; } catch(Exception ex) { int errorrow = row; throw ex; } } /// /// 统计一段时间内有多少个星期几 /// /// 开始日期 /// 结束日期 /// 星期几 /// 返回个数 public int TotalWeeks(DateTime TimeStart, DateTime TimeEnd, DayOfWeek AWeek) { TimeSpan vTimeSpan = new TimeSpan(TimeEnd.Ticks - TimeStart.Ticks); int Result = (int)vTimeSpan.TotalDays / 7; for (int i = 0; i <= vTimeSpan.TotalDays % 7; i++) if (TimeStart.AddDays(i).DayOfWeek == AWeek) return Result + 1; return Result; } /// /// 计算基本工资 /// /// 员工ID /// 工种ID /// 状态(正式或实习) /// 开始时间 /// 结束时间 /// public decimal GetBSalaryByJobsId(int StaffId,int JobsId,int JobsStatus,DateTime StartTime,DateTime EndTime) { try { decimal BisicSalary = 0; //变动前工种持续时间(天数) int JobsDay = ((TimeSpan)(EndTime - StartTime)).Days; //查询该工种的基本工资策略明细,以获取基本工资(月)以及补贴 decimal BasicSalaryMouth = 0; //基本工资(月) decimal Subsidy = 0; //补贴 DataTable dtBasic = _dsStrategy.Tables[0].Copy(); dtBasic.DefaultView.RowFilter = "salarytype = " + (JobsStatus - 1) + " and JobsID = " + JobsId;//筛选条件为工种+状态 DataTable dtBasicNow = dtBasic.DefaultView.ToTable(); if (dtBasicNow.Rows.Count == 0) { //没有对应工资策略,返回 return 0; } else { BasicSalaryMouth = Convert.ToDecimal(dtBasicNow.Rows[0]["BasicSalary"]); Subsidy = Convert.ToDecimal(dtBasicNow.Rows[0]["Subsidy"]); } //然后要获取该工种的出勤策略明细,以计算该工种的日工资和每月可休息天数 decimal daySalrty = 0; //日工资 int restDaysMouth = 0; //每月可休息天数 int restDaysNow = 0; //担当该工种时间内可休息天数 int PunishMode = 0; //扣罚方式 1:比例 2:阶梯 int RestmMode = 0; //休息方式 1:星期某 2:天数 DataTable dtAttendance = _dsStrategy.Tables[1].Copy(); dtAttendance.DefaultView.RowFilter = " JobsId = " + JobsId; DataTable dtAttendanceNow = dtAttendance.DefaultView.ToTable(); //查看该策略明细的休息方式 //如果取出多条,是因为阶梯扣罚的关系,取第一条即可 if (dtAttendanceNow.Rows.Count != 0) { DataRow drAttendanceNow = dtAttendanceNow.Rows[0]; PunishMode = Convert.ToInt32(drAttendanceNow["PunishMode"]); RestmMode = Convert.ToInt32(drAttendanceNow["RestmMode"]); if (Convert.ToInt32(drAttendanceNow["RestmMode"]) == 1) //如果是按照星期某休 { //遍历7个星期字段,如果星期某是休息,那么算出该段时间内有几个星期某,累加在休息天数上 //-1是因为要算改变前的那一天。 //同时算出该月可休多少天,以及担当该工种时间内可休多少天 if (Convert.ToInt32(drAttendanceNow["Monday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Monday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Monday); } if (Convert.ToInt32(drAttendanceNow["Tuesday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Tuesday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Tuesday); } if (Convert.ToInt32(drAttendanceNow["Wednesday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Wednesday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Wednesday); } if (Convert.ToInt32(drAttendanceNow["Thursday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Thursday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Thursday); } if (Convert.ToInt32(drAttendanceNow["Friday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Friday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Friday); } if (Convert.ToInt32(drAttendanceNow["Saturday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Saturday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Saturday); } if (Convert.ToInt32(drAttendanceNow["Sunday"]) == 0) { restDaysMouth += TotalWeeks(Convert.ToDateTime(_salaryDateS), Convert.ToDateTime(_salaryDateE).AddDays(-1), DayOfWeek.Sunday); restDaysNow += TotalWeeks(StartTime, EndTime.AddDays(-1), DayOfWeek.Sunday); } } else //反之,无论月可休息日以及阶段可休息日统一为可休息天数 { restDaysNow = Convert.ToInt32(drAttendanceNow["RestDays"]); restDaysMouth = Convert.ToInt32(drAttendanceNow["RestDays"]); } } else { //如果没有考核策略,那么直接月基本工资/月应出勤天数*履历天数 return 0; } //用结算天数-休息天数(月),得出应出勤天数(月) int AttendanceDayMouth = _mouthDay - restDaysMouth; //基本工资(月)/应出勤天数(月),得出日工资 daySalrty = Math.Round(Convert.ToDecimal(BasicSalaryMouth / AttendanceDayMouth), 2); //获取该工种持续时间的出勤情况 DataTable dtStaffAttendance = _dsBase.Tables[1].Copy(); dtStaffAttendance.DefaultView.RowFilter = " StaffID = " + StaffId; DataTable dtStaffAttendanceNow = dtStaffAttendance.DefaultView.ToTable(); double realDay = 0; //实际出勤天数 foreach (DataRow drFor in dtStaffAttendanceNow.Rows) { int Status = Convert.ToInt32(drFor["AttendanceStatus"]); DateTime AttendanceDate = Convert.ToDateTime(drFor["AttendanceDate"]); if (AttendanceDate >= StartTime && AttendanceDate < EndTime) //必须是此工种持续时间范围内的 { if (Status == 1) { realDay += 1; } else if (Status == 2) { realDay += 0.5; } } } double QDay = JobsDay - realDay; //缺勤天数 double SQDay = QDay - restDaysNow; //实际缺勤天数(缺勤天数 - 休息天数) decimal KMoney = 0; //最终判断 //如果出勤扣罚的类型是工资百分比,那么直接计算出勤天数即可 //反之如果是阶梯扣罚,那么就要用日工资*工种阶段天数 - 缺勤天数对应的阶梯扣罚单价*缺勤天数 if (PunishMode == 1) { //如果实际出勤天数大于等于应出勤天数,直接满勤即可。 if (AttendanceDayMouth <= Convert.ToDecimal(realDay)) { BisicSalary += BasicSalaryMouth; } else { BisicSalary += Convert.ToDecimal(realDay) * daySalrty; } if (SQDay > 0) { KMoney = Convert.ToDecimal(SQDay) * daySalrty; } else { KMoney += 0; } } else { //阶梯扣罚单价 decimal ladderPrice = 0; //遍历获取到的阶梯扣罚区间,当实际缺勤天数小于零,要计算缺勤阶梯价格 if (SQDay > 0) { foreach (DataRow drFor in dtAttendanceNow.Rows) { int StartDay = Convert.ToInt32(drFor["BeginAbsentDays"]); int EndDay = Convert.ToInt32(drFor["EndAbsentDays"]); if (SQDay >= StartDay && SQDay <= EndDay) { ladderPrice = Convert.ToDecimal(drFor["PunishAmount"]); } } BisicSalary += BasicSalaryMouth - ladderPrice * Convert.ToDecimal(SQDay); KMoney += ladderPrice * Convert.ToDecimal(SQDay); } else //如果没有缺勤甚至还存在加班的话,暂不算加班时间,即(应出勤天数 - 应休息天数) * 日工资 { BisicSalary += BasicSalaryMouth; KMoney += 0; } } #region 此阶段结算完毕后,要向数据集中添加数据(基本工资明细)。 //基本工资明细 DataRow drBasicSalary = _dtBasicSalary.NewRow(); drBasicSalary["StaffID"] = StaffId; drBasicSalary["JobsID"] = JobsId; drBasicSalary["SalaryType"] = JobsStatus; drBasicSalary["BeginDate"] = StartTime; drBasicSalary["EndDate"] = EndTime; drBasicSalary["BasicSalary"] = BisicSalary; drBasicSalary["Subsidy"] = Subsidy; drBasicSalary["CheckedDays"] = AttendanceDayMouth; drBasicSalary["AttendanceDays"] = realDay; drBasicSalary["AbsenceDays"] = SQDay > 0 ? SQDay : 0; drBasicSalary["FineAmount"] = KMoney; drBasicSalary["TotalAmount"] = BisicSalary + Subsidy; _dtBasicSalary.Rows.Add(drBasicSalary); #endregion return BisicSalary + Subsidy; } catch(Exception ex) { throw ex; } } public decimal GetASalaryByJobsId(int StaffId, int JobsId, int JobsStatus, DateTime StartTime, DateTime EndTime) { try { //该员工行政考核总额 decimal ASalary = 0; //获取该员工相关的行政奖惩信息 DataTable dtAdmin = _dsBase.Tables[2].Copy(); dtAdmin.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtAdminNow = dtAdmin.DefaultView.ToTable(); //获取全部行政考核策略明细,并根据工种和员工状态筛选 DataTable dtAdminDetail = _dsStrategy.Tables[5].Copy(); dtAdminDetail.DefaultView.RowFilter = " JobsID = " + JobsId + " and SalaryType = " + (JobsStatus - 1); DataTable dtAdminDetailNow = dtAdminDetail.DefaultView.ToTable(); if (dtAdminDetailNow.Rows.Count != 0) { //如果有对应策略,那么遍历这些策略明细 foreach (DataRow drAdminDetailFor in dtAdminDetailNow.Rows) { //获取该策略明细的基础金额以及是否扣完的标签 decimal BaseAmount = Convert.ToDecimal(drAdminDetailFor["BaseAmount"]); int IsEnd = Convert.ToInt32(drAdminDetailFor["IsEnd"]); decimal TotalAmount = BaseAmount; decimal RAPAmount = 0; //并进一步过滤行政奖惩信息(根据该策略的行政考核类别) dtAdminNow.DefaultView.RowFilter = " AdministrationType = " + drAdminDetailFor["AdministrationType"]; DataTable dtAdminNowByAType = dtAdminNow.DefaultView.ToTable(); //然后遍历该时间段内的该策略对应的考核类别的奖惩信息,进行加减运算 foreach (DataRow drFor in dtAdminNowByAType.Rows) { //遍历每一条奖惩信息,如果在该履历变动时间范围内并且奖惩类别相同的话,就根据字段进行加减运算 DateTime dtAuditDate = Convert.ToDateTime(drFor["AccountDate"]); if (dtAuditDate >= StartTime && dtAuditDate <= EndTime) { RAPAmount += Convert.ToDecimal(drFor["RAPType"]) * Convert.ToDecimal(drFor["RAPAmount"]); //添加明细 DataRow drAddSsmAdminDetail = _dtAdminDetail.NewRow(); drAddSsmAdminDetail["AdminRAPID"] = drFor["RAPID"]; drAddSsmAdminDetail["StaffID"] = StaffId; //在AdminID字段中存一个策略ID,以便在后台插入时,区分哪些明细对应哪个策略 drAddSsmAdminDetail["AdminID"] = drAdminDetailFor["AdministrationID"]; drAddSsmAdminDetail["AccountId"] = drAdminDetailFor["SalaryType"]; drAddSsmAdminDetail["StaffSalaryID"] = drAdminDetailFor["JobsId"]; _dtAdminDetail.Rows.Add(drAddSsmAdminDetail); } } //遍历完成后,根据结果以及扣完为止的标签,对总值进行相加 TotalAmount = BaseAmount + RAPAmount; if (IsEnd == 1 && TotalAmount < 0) { TotalAmount = 0; } ASalary += TotalAmount; //保存行政考核结算信息 DataRow drAddSsmAdmin = _dtAdmin.NewRow(); drAddSsmAdmin["StaffID"] = StaffId; drAddSsmAdmin["JobsID"] = JobsId; drAddSsmAdmin["SalaryType"] = JobsStatus - 1; drAddSsmAdmin["BeginDate"] = _salaryDateS; drAddSsmAdmin["EndDate"] = _salaryDateE; drAddSsmAdmin["TATAdminID"] = drAdminDetailFor["AdministrationID"]; drAddSsmAdmin["AdministrationType"] = drAdminDetailFor["AdministrationType"]; drAddSsmAdmin["BaseAmount"] = BaseAmount; drAddSsmAdmin["IsEnd"] = IsEnd; drAddSsmAdmin["RAPAmount"] = RAPAmount; drAddSsmAdmin["TotalAmount"] = TotalAmount; _dtAdmin.Rows.Add(drAddSsmAdmin); } } else { return 0; } return ASalary; } catch(Exception ex) { throw ex; } } public decimal GetPSalaryByJobsId(int StaffId, int JobsId, int JobsStatus, DateTime StartTime, DateTime EndTime) { try { //该员工进度考核总额 decimal PSalary = 0; //获取该员工相关的进度奖惩信息 DataTable dtProgress = _dsBase.Tables[4].Copy(); dtProgress.DefaultView.RowFilter = " StaffId = " + StaffId; DataTable dtProgressNow = dtProgress.DefaultView.ToTable(); //获取全部行政考核策略明细,并根据工种和员工状态筛选 DataTable dtProgressDetail = _dsStrategy.Tables[6].Copy(); dtProgressDetail.DefaultView.RowFilter = " JobsID = " + JobsId + " and SalaryType = " + (JobsStatus - 1); DataTable dtProgressDetailNow = dtProgressDetail.DefaultView.ToTable(); if (dtProgressDetailNow.Rows.Count != 0) { //如果有对应策略,那么遍历这些策略明细 foreach (DataRow drProgressDetailFor in dtProgressDetailNow.Rows) { //获取该策略明细的基础金额以及是否扣完的标签 decimal BaseAmount = Convert.ToDecimal(drProgressDetailFor["BaseAmount"]); int IsEnd = Convert.ToInt32(drProgressDetailFor["IsEnd"]); decimal TotalAmount = BaseAmount; decimal RAPAmount = 0; //然后遍历该时间段内的该策略对应的奖惩信息,进行加减运算 foreach (DataRow drFor in dtProgressNow.Rows) { //遍历每一条奖惩信息,如果在该履历变动时间范围内并且奖惩类别相同的话,就根据字段进行加减运算 DateTime dtAuditDate = Convert.ToDateTime(drFor["AccountDate"]); if (dtAuditDate >= StartTime && dtAuditDate <= EndTime) { RAPAmount += Convert.ToDecimal(drFor["RAPType"]) * Convert.ToDecimal(drFor["RAPAmount"]); //添加明细 DataRow drAddSsmProgressDetail = _dtProgressDetail.NewRow(); drAddSsmProgressDetail["ProgressRAPID"] = drFor["RAPID"]; drAddSsmProgressDetail["StaffID"] = StaffId; //将工种以及状态保存起来,后台录入时,区分明细归属于哪个主体信息 drAddSsmProgressDetail["ProgressID"] = drProgressDetailFor["JobsId"]; drAddSsmProgressDetail["AccountID"] = drProgressDetailFor["SalaryType"]; _dtProgressDetail.Rows.Add(drAddSsmProgressDetail); } } //遍历完成后,根据结果以及扣完为止的标签,对总值进行相加 TotalAmount = BaseAmount + RAPAmount; if (IsEnd == 1 && TotalAmount < 0) { continue; } else { PSalary += TotalAmount; } //保存行政考核结算信息 DataRow drAddSsmProgress = _dtProgress.NewRow(); drAddSsmProgress["StaffID"] = StaffId; drAddSsmProgress["JobsID"] = JobsId; drAddSsmProgress["SalaryType"] = JobsStatus - 1; drAddSsmProgress["BeginDate"] = _salaryDateS; drAddSsmProgress["EndDate"] = _salaryDateE; drAddSsmProgress["TATProgressID"] = drProgressDetailFor["ProgressID"]; drAddSsmProgress["BaseAmount"] = BaseAmount; drAddSsmProgress["IsEnd"] = IsEnd; drAddSsmProgress["RAPAmount"] = RAPAmount; drAddSsmProgress["TotalAmount"] = TotalAmount; _dtProgress.Rows.Add(drAddSsmProgress); } } else { return 0; } return PSalary; } catch(Exception ex) { throw ex; } } private void CreateTable() { try { //首先根据主ID查询工资总汇数据集,如果是新建结算那么主ID会等于零,即查回一个空集。 //(包括其他各项工资明细的集合,目的是在添加时可直接向表中添加内容) DataSet dsSourse = HRModuleProxy.Service.GetSettlementDetail(_mainId); _dtStaffSalary = dsSourse.Tables[0]; if (_mainId == 0) //只有在新建时,才带回这些表结构,调整时是不允许修改这些的 { _dtBasicSalary = dsSourse.Tables[1]; _dtAttendance = dsSourse.Tables[2]; _dtWages = dsSourse.Tables[3]; _dtDefectFine = dsSourse.Tables[4]; _dtScrapFine = dsSourse.Tables[5]; _dtAdmin = dsSourse.Tables[6]; _dtAdminDetail = dsSourse.Tables[7]; _dtProgress = dsSourse.Tables[8]; _dtProgressDetail = dsSourse.Tables[9]; _dtManagerSalary = dsSourse.Tables[10]; } else { _dtMain = dsSourse.Tables[1]; } } catch(Exception ex) { throw ex; } } private void dgvSettlement_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { try { if (this.dgvSettlement.Rows[e.RowIndex].Cells["StaffSalaryID"].Value != DBNull.Value && this.dgvSettlement.Rows[e.RowIndex].Cells["StaffSalaryID"].Value != null) { int StaffSalaryId = Convert.ToInt32(this.dgvSettlement.Rows[e.RowIndex].Cells["StaffSalaryID"].Value); int StaffId = Convert.ToInt32(this.dgvSettlement.Rows[e.RowIndex].Cells["StaffId"].Value); string StaffName = this.dgvSettlement.Rows[e.RowIndex].Cells["StaffName"].Value.ToString(); //以新建模式打开信息窗体 F_HR_1203 frmHR1203 = new F_HR_1203(StaffSalaryId, StaffId, StaffName); DialogResult dialogResult = frmHR1203.ShowDialog(); } } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } private void dgvSettlement_CellValueChanged(object sender, DataGridViewCellEventArgs e) { try { if (e.RowIndex != -1) { DataGridViewRow gvrNow = this.dgvSettlement.Rows[e.RowIndex]; //调整金额改变 if (this.dgvSettlement.Columns[e.ColumnIndex].Name == "AdjustmentAmount") { gvrNow.Cells["TotalAmount"].Value = Convert.ToDecimal(gvrNow.Cells["SettlementAmount"].Value) + Convert.ToDecimal(gvrNow.Cells["AdjustmentAmount"].Value); } } } catch(Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } /// /// 获取调整总金额与合计总金额 /// private void GetAdjustmentAmount() { foreach(DataGridViewRow gvrFor in this.dgvSettlement.Rows) { _adjustmentAmount += Convert.ToDecimal(gvrFor.Cells["AdjustmentAmount"].Value); if (_formType == Constant.FormMode.Edit) { _salaryTotalMoney += Convert.ToDecimal(gvrFor.Cells["SettlementAmount"].Value); } } } private void btnSettlement_Click(object sender, EventArgs e) { try { GetBaseData(); if(_nowSettlement == 1) { this.btnSettlement.Enabled = false; } else { this.btnSettlement.Enabled = true; } } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } private void btnSelect_Click(object sender, EventArgs e) { try { if (_nowSettlement == 0) { MessageBox.Show("当前页未成功进行结算,无法进行筛选!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else { StringBuilder sbRow = new StringBuilder(); sbRow.Append (" 1=1"); if(!string.IsNullOrEmpty(this.txtName.Text)) { sbRow.Append("and StaffName like '%" + this.txtName.Text + "%'"); } if(!string.IsNullOrEmpty(this.txtOrg.Text)) { sbRow.Append("and OrganizationName like '%" + this.txtOrg.Text + "%'"); } _dtStaffSalary.DefaultView.RowFilter = sbRow.ToString(); this.dgvSettlement.IsSetInputColumnsColor = true; } } catch(Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } } }