项目总结:HR员工系统

介绍两个模块:员工入职,和员工返职

1、员工入职:

这一部分模块主要涉及的是ComboBox和LookUpEdit(DevExpress)绑定数据源,GV列添加超链接列,超链接文本弹出窗体传值取值,单线程从Access数据库读取信息,Datagridview添加ComboBox列并赋值等。还涉及了递归部门的问题,这个在我其他文章里有单独讲,这里就不贴了。需要的可以移步https://blog.csdn.net/qq_38374540/article/details/106259895这里查看

  • ComboBox和LookUpEdit(DevExpress)绑定数据源

       其实我觉得这两个的主要区别就是两列和多列的问题,其他的功能暂时没涉及到,这里ComboBox只能绑定两列,显示只能显示一列,而LookupEdit可以绑定表。

            //ComboBox
            string sql;
            sql = "select company_FK,companyName from sys_tx_kqSystem_userLog where ISNULL(isuse,'N')='Y' and userID='" + FormM.lbluserLog.Text.Trim() + "'";
            DataTable dtRzgs;
            if (!DB.AF.execSql(sql, sqlconn, out dtRzgs))
            {
                return;
            }
            DataRow drRz = dtRzgs.NewRow();
            drRz["company_FK"] = "";
            drRz["companyName"] = "";
            dtRzgs.Rows.InsertAt(drRz, 0);
            ddlRzgs.DataSource = dtRzgs;
            ddlRzgs.ValueMember = "company_FK";
            ddlRzgs.DisplayMember = "companyName";

            //LookupEdit
            sql = "select replace(Code,' ','') as Code, replace(Name,' ','') as Name,replace( Remark,' ','') as Remark from sys_tx_zply a left join sys_tx_kqSystem b on a.kqSystem = b.kqSystem where b.company_FK = '" + ddlRzgs.SelectedValue.ToString().Trim() + "'";
            if (!DB.AF.execSql(sql, sqlconn, out dtzply))
            {
                return;
            }
            DataRow drzply = dtzply.NewRow();
            drzply["Code"] = "";
            drzply["Name"] = "";
            drzply["Remark"] = "";
            dtzply.Rows.InsertAt(drzply, 0);
            ddlzply.Properties.ShowHeader = false;
            ddlzply.Properties.ValueMember = "Code";
            ddlzply.Properties.DisplayMember = "Name";
            ddlzply.Properties.DataSource = dtzply;
            ddlzply.Properties.BestFitMode = BestFitMode.BestFitResizePopup;
            ddlzply.EditValue = "";
            ddlzply.Text = "";
  • GV列添加超链接列
            DataGridViewLinkColumn dlink = new DataGridViewLinkColumn();
            dlink.Text = "删除";
            dlink.Name = "linkDelete";
            dlink.HeaderText = "删除";
            dlink.UseColumnTextForLinkValue = true;
            GV.Columns.Insert(0, dlink);
  • 超链接文本弹出窗体传值取值
  //窗体实例化,弹出窗体,这里有个ShowDialog()和Show()的小知识点

        private void labgz_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                //因为我是表头表身都有这个超链接,所以我在传的时候判断了一下是点击表头的还是点击表身的,0是指行项,但是表头没有行项,所以传了0
                GongZhong gzForm = new GongZhong(this, "head", 0);
                gzForm.gz(ddlRzgs.SelectedValue.ToString().Trim());
                gzForm.ShowDialog();
                return;
            }
            catch (Exception ec)
            {
                MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
//表身的就写在GV的点击事件里
 private void GV_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            try
            {

                #region 删除
                string buttonText = this.GV.Rows[e.RowIndex].Cells[0].Value.ToString().Trim();
                if (buttonText == "删除" && e.RowIndex != -1 && e.ColumnIndex == 0)
                {

                    if (MessageBox.Show("确定删除吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                    {
                        string errMsg, sql;

                        this.GV.Rows.RemoveAt(e.RowIndex);
                        sesstab = (DataTable)GV.DataSource;
                        if (GV.Rows.Count > 0)
                        {
                            byte[] byteImage = (byte[])sesstab.Rows[0]["照片"];
                            MemoryStream ms = new MemoryStream(byteImage);
                            Bitmap bmpt = new Bitmap(ms);
                            pictureBox1.Image = bmpt;
                        }
                        else
                        {
                            if (ddlzc.SelectedValue.ToString() == "0")
                            {
                                //MessageBox.Show(ddlRzgs.SelectedValue.ToString().Trim());

                                MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                sql = "select a.companyName 公司, b.deptName 部门, a.userID 工号, a.userName 姓名, a.Pycounts 入职次数, a.Sfz 身份证号码, a.G_sfzyxr 身份证生效日 " +
                                    " , a.G_sfzsxr 身份证失效日, a.G_fzjg 签发机关, a.BornDate 出生日期,case when sex = '0' then '男' else '女' end 性别, " +
                                    " PyDate 入职日期,case when IfDaKa = 1 then '是' else '否' end 打卡, Nation_Name 民族, HomeAddr 籍贯, " +
                                    " case when ISNULL(isZc,'')= 'E' then '转厂入职' when ISNULL(isZc,'')= 'D' then '转厂离职' else '否' end 转厂, " +
                                    " case when State = '0' then '在职' else '离职' end 状态, " +
                                    " a.G_cy 人员性质, a.G_ygxz 用工性质, c.Name 计薪方式, d.Name 工种, a.G_zply 招聘途径, a.G_ 所属厂区, a.G_dkcq 打卡厂区, SUBSTRING(a.Memo, 1, CHARINDEX(',', a.Memo) - 1) 介绍人,e.Name 招聘来源, a.Memo 备注, " +
                                    " LzDate 离职日期,'[' + whr + ']' + a.whrName 维护人,a.whrq 维护日期, a.photo 照片 " +
                                    " from sys_tx_employee a " +
                                    " left join sys_tx_kqSystem_dept b on a.Dept = b.deptID and a.company_FK = b.company_FK " +
                                    " left join sys_tx_Jxfs c on a.Jxfs = c.Code " +
                                    " left join sys_tx_GongZhong d on a.GongZhong = d.Code and(select kqSystem from sys_tx_kqSystem where company_FK = a.company_FK) = d.kqSystem " +
                                    " left join sys_tx_zply e on replace(e.Code, ' ', '') = replace(SUBSTRING(a.Memo, CHARINDEX(',', a.Memo) + 1, len(a.Memo) - charindex(',', a.Memo)), ' ', '') " +
                                    " where a.company_FK = '" + ddlRzgs.SelectedValue.ToString() + "' and convert(varchar(10), a.whrq, 120) = convert(varchar(10), getdate(), 120) order by a.whrq desc ";
                                DataTable dt;
                                if (!DB.AF.execSql(sql, sqlconn, out dt, out errMsg))
                                {
                                    if (errMsg != "")
                                    {
                                        MessageBox.Show(errMsg, "错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }
                                GV.DataSource = dt;

                            }
                            else if (ddlzc.SelectedValue.ToString() == "1")
                            {

                                MessageBox.Show("转厂成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                sql = " select a.companyName 公司,b.deptName 部门 ,userID 工号,userName 姓名,Pycounts 入职次数,Sfz 身份证号码,BornDate 出生日期,case when sex = '0' then '男' else '女' end 性别, " +
                                    " PyDate 入职日期,case when IfDaKa = 1 then '是' else '否' end 打卡, Nation_Name 民族, HomeAddr 籍贯, " +
                                    " case when ISNULL(isZc,'')= 'E' then '转厂入职' when ISNULL(isZc,'')= 'D' then '转厂离职' else '否' end 转厂, " +
                                    " case when State = '0' then '在职' else '离职' end 状态, " +
                                    " a.G_cy 人员性质, a.G_ygxz 用工性质, c.Name 计薪方式, d.Name 工种, a.G_zply 招聘途径, a.G_ 所属厂区, a.G_dkcq 打卡厂区, SUBSTRING(a.Memo, 1, CHARINDEX(',', a.Memo) - 1) 介绍人,e.Name 招聘来源, a.Memo 备注, " +
                                    " LzDate 离职日期,'[' + whr + ']' + whrName 维护人,a.whrq 维护日期, photo 照片,G_sfzyxr 身份证生效日, G_sfzsxr 身份证失效日,G_fzjg 签发机关 " +
                                    " from sys_tx_employee a " +
                                    " left join sys_tx_kqSystem_dept b on a.Dept = b.deptID and a.company_FK = b.company_FK " +
                                    " left join sys_tx_Jxfs c on a.Jxfs = c.Code " +
                                    " left join sys_tx_GongZhong d on a.GongZhong = d.Code and(select kqSystem from sys_tx_kqSystem where company_FK = a.company_FK) = d.kqSystem " +
                                    " left join sys_tx_zply e on replace(e.Code, ' ', '') = replace(SUBSTRING(a.Memo, CHARINDEX(',', a.Memo) + 1, len(a.Memo) - charindex(',', a.Memo)), ' ', '') " +
                                    " where a.company_FK = '" + ddlRzgs.SelectedValue.ToString().Trim() + "' and convert(varchar(10), a.whrq, 120) = convert(varchar(10), getdate(), 120) and ISNULL(isZc,'') = 'E' order by a.whrq desc ";
                                DataTable dt;
                                if (!DB.AF.execSql(sql, sqlconn, out dt, out errMsg))
                                {
                                    if (errMsg != "")
                                    {
                                        MessageBox.Show(errMsg, "错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                }
                                GV.DataSource = dt;
                            }

                            GV.Columns[0].Visible = false;
                            GV.Columns[1].Visible = false;
                            GV.Columns["工种"].Visible = false;
                            GV.Columns["招聘来源"].Visible = false;
                            GV.Columns["计薪方式"].Visible = false;

                            tm.Stop();
                            btnReadCard.Text = "开始读卡";

                            txtRzrq.Text = DateTime.Now.ToShortDateString().ToString();
                            ddldept.Text = "";
                            btndept.Text = "";
                            deptId = "";
                            ddlDk.Text = "是";
                            ddlzc.Text = "否";
                            pictureBox1.Image = null;
                            ddljxfs.Text = "";
                            txtgzCode.Text = "";
                            txtgzName.Text = "";
                            ddlsscq.Text = "";
                            ddlDKArea.Text = "";
                            ddlPerXZ.Text = "";
                            ddlYGXZ.Text = "";
                            ddlZPTJ.Text = "";
                            txtjsr.Text = "";

                        }
                    }
                    else return;
                }
                #endregion

                #region 工种
                if (GV.Columns[e.ColumnIndex].Name == "btnd" && e.RowIndex != -1)
                {
                    GongZhong gzForm = new GongZhong(this, "gv", e.RowIndex);
                    gzForm.gz(ddlRzgs.SelectedValue.ToString().Trim());
                    gzForm.ShowDialog();
                    return;

                }
                #endregion



            }
            catch (Exception ec)
            {
                MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

//这是我另一个窗体,值传过来之后先赋值给全局变量,因为别的地方要用到
  public GongZhong(Form_employee_add fmz , string name,int row)
        {
            InitializeComponent();
            fm = fmz;
            flag = name;
            rowNo = row;
        }
//点击选择后把值写回原来的窗体
  private void GV_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (GV.Columns[e.ColumnIndex].Name == "btnd" && e.RowIndex != -1 )
                {
                    string Code, Name;
                    Code = GV.Rows[e.RowIndex].Cells[1].Value.ToString().Trim();
                    Name = GV.Rows[e.RowIndex].Cells[2].Value.ToString().Trim();

                    if (flag == "head")
                    {
                        fm.txtgzCode.Text = Code;
                        fm.txtgzName.Text = Name;
                    }
                    else if (flag == "gv")
                    {
                        fm.GV.Rows[rowNo].Cells["工种"].Value = Code;
                    }
                    this.Close();
                    return;
                }
            }
            catch (Exception ec)
            {
                MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
  • 单线程从Access数据库读取信息
        public Thread threads;
        public void getBarCodeData()
        {

            try
            {

                bz = 0;
                string sqlAccess = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files (x86)\神思二代证\ssid.mdb";
                OleDbConnection conn;
                conn = new OleDbConnection(sqlAccess);

                DataSet ds = new DataSet();
                conn.Open();
                string sql = "select * from citizen where isDK = 0 order by ID asc ";
                OleDbDataAdapter oda = new OleDbDataAdapter(sql, conn);
                OleDbCommandBuilder cb = new OleDbCommandBuilder(oda);
                oda.UpdateCommand = cb.GetUpdateCommand();
                oda.Fill(ds);
                DataTable dt;
                dt = ds.Tables[0];
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string sqln = "select count(userID) as iszz  from sys_tx_employee where State = 0 and Sfz= '" + dt.Rows[i]["IDCardNum"].ToString() + "'";
                    DataTable dtn;
                    if (!DB.AF.execSql(sqln, sqlconn, out dtn))
                    {
                        MessageBox.Show("获取员工在职信息失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    if (dtn.Rows[0]["iszz"].ToString() == "0")
                    {

                        GV.Columns[0].Visible = true;
                        string sqlPyCounts = "select COUNT(userID)+1 as PyCounts  from sys_tx_employee where ISNULL(isZc,'N') in ('N','E') and Sfz= '" + dt.Rows[i]["IDCardNum"].ToString() + "'";
                        DataTable dtPyCounts;
                        if (!DB.AF.execSql(sqlPyCounts, sqlconn, out dtPyCounts))
                        {
                            MessageBox.Show("获取员工入职次数等信息失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        DataRow dr = sesstab.NewRow();
                        dr["身份证号"] = dt.Rows[i]["IDCardNum"].ToString();
                        dr["姓名"] = dt.Rows[i]["Name"].ToString();
                        dr["性别"] = dt.Rows[i]["sex"].ToString();
                        dr["民族"] = dt.Rows[i]["Folk"].ToString();
                        dr["出生日期"] = dt.Rows[i]["BirthDay"].ToString();
                        dr["住址/籍贯"] = dt.Rows[i]["Address"].ToString();
                        dr["签发机关"] = dt.Rows[i]["IssueOrgan"].ToString();
                        dr["有效期始"] = dt.Rows[i]["AvailabilityBegin"].ToString();
                        dr["有效期止"] = dt.Rows[i]["AvailabilityEnd"].ToString();
                        dr["入职次数"] = dtPyCounts.Rows[0]["PyCounts"].ToString();
                        dr["照片"] = dt.Rows[i]["Photo"];

                        if (GV.DataSource != null)
                        {
                            DataGridViewRow row = GV.Rows.Cast<DataGridViewRow>()
                                .FirstOrDefault(rd => rd.Cells[6].EditedFormattedValue.Equals(dt.Rows[i]["IDCardNum"].ToString()));
                            if (row != null) GV.Rows.Remove(row);
                            sesstab.Rows.InsertAt(dr, 0);
                            GV.Rows[0].Cells["计薪方式"].Value = ddljxfs.SelectedValue;
                            GV.Rows[0].Cells["工种"].Value = txtgzCode.Text;
                            GV.Rows[0].Cells["招聘来源"].Value = ddlzply.EditValue;
                            GV.Rows[0].Cells["介绍人"].Value = txtjsr.Text;
                        }
                    }
                    else if (dtn.Rows[0]["iszz"].ToString() == "1")
                    {
                        MessageBox.Show("该员工【" + dt.Rows[i]["Name"].ToString() + "】在HR系统为在职状态!不允许再次入职!");
                    }
                    else
                    {
                        MessageBox.Show("该员工【" + dt.Rows[i]["Name"].ToString() + "】在HR系统存在多条在职信息");
                    }
                }
                if (dt.Rows.Count != 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        dt.Rows[i]["isDK"] = -1;
                    }
                    oda.Update(dt);
                    ds.AcceptChanges();
                }
                conn.Close();
                int r = dt.Rows.Count;
                if (sesstab.Rows.Count > 0)
                {
                    byte[] byteImage = (byte[])sesstab.Rows[0]["照片"];
                    MemoryStream ms = new MemoryStream(byteImage);
                    Bitmap bmpt = new Bitmap(ms);
                    pictureBox1.Image = bmpt;
                }
                Thread.Sleep(1000);
                bz = 1;
                return;
            }
            catch (Exception ec)
            {
                MessageBox.Show(ec.Message);
                bz = 1;
                return;
            }
        }
        private void tm_Tick(object sender, EventArgs e)
        {
            tm.Stop();
            if (bz == 1)
            {
                if (ddlzc.SelectedValue.ToString() == "0")
                    threads = new Thread(getBarCodeData);
                else if (ddlzc.SelectedValue.ToString() == "1")
                    threads = new Thread(getBarCodeDataZC);
                threads.IsBackground = true;
                threads.Start();
            }
            tm.Start();
            return;
        }
       private void btnbegin_Click(object sender, EventArgs e)
        {
            if (btnReadCard.Text == "开始读卡")
            {
                btnReadCard.Text = "结束读卡";
                GV.Columns[0].Visible = true;
                GV.Columns[1].Visible = true;
                GV.Columns["工种"].Visible = true;
                GV.Columns["招聘来源"].Visible = true;
                GV.Columns["计薪方式"].Visible = true;
                if (ddlzc.SelectedValue.ToString() == "0")
                {
                    #region GV
                    GV.DataSource = null;
                    sesstab = new DataTable();
                    sesstab.Columns.Add("介绍人", typeof(string));
                    sesstab.Columns.Add("身份证号", typeof(string));
                    sesstab.Columns.Add("姓名", typeof(string));
                    sesstab.Columns.Add("性别", typeof(string));
                    sesstab.Columns.Add("民族", typeof(string));
                    sesstab.Columns.Add("出生日期", typeof(string));
                    sesstab.Columns.Add("住址/籍贯", typeof(string));
                    sesstab.Columns.Add("入职次数", typeof(string));
                    sesstab.Columns.Add("照片", typeof(System.Byte[]));
                    sesstab.Columns.Add("签发机关", typeof(string));
                    sesstab.Columns.Add("有效期始", typeof(string));
                    sesstab.Columns.Add("有效期止", typeof(string));
                    sesstab.Columns.Add("错误信息", typeof(string));
                    this.GV.DataSource = sesstab;
                    this.GV.EditMode = DataGridViewEditMode.EditOnEnter;
                    GV.Columns["身份证号"].Width = 180;
                    GV.Columns["姓名"].Width = 75;
                    GV.Columns["性别"].Width = 60;
                    GV.Columns["民族"].Width = 75;
                    GV.Columns["出生日期"].Width = 100;
                    GV.Columns["住址/籍贯"].Width = 260;
                    GV.Columns["入职次数"].Width = 90;
                    GV.Columns["照片"].Width = 100;
                    GV.Columns["签发机关"].Width = 100;
                    GV.Columns["有效期始"].Width = 100;
                    GV.Columns["有效期止"].Width = 100;
                    GV.Columns["错误信息"].Width = 300;
                    GV.Columns["身份证号"].ReadOnly = true;
                    GV.Columns["姓名"].ReadOnly = true;
                    GV.Columns["性别"].ReadOnly = true;
                    GV.Columns["民族"].ReadOnly = true;
                    GV.Columns["出生日期"].ReadOnly = true;
                    GV.Columns["住址/籍贯"].ReadOnly = true;
                    GV.Columns["入职次数"].ReadOnly = true;
                    GV.Columns["照片"].ReadOnly = true;
                    GV.Columns["签发机关"].ReadOnly = true;
                    GV.Columns["有效期始"].ReadOnly = true;
                    GV.Columns["有效期止"].ReadOnly = true;
                    GV.Columns["错误信息"].ReadOnly = true;
                    #endregion
                    bz = 1;
                    tm.Start();
                }
               
            else if (btnReadCard.Text == "结束读卡")
            {
                btnReadCard.Text = "开始读卡";
                tm.Stop();
            }
        }
  • Datagridview添加ComboBox列并赋值

赋值的在上面了,这边就贴一下添加ComboBox列的方法:

DataGridViewComboBoxColumn jxfs = new DataGridViewComboBoxColumn();
 sql = "select Code,Name from sys_tx_Jxfs";
 DataTable dtjxfs;
 if (!DB.AF.execSql(sql, sqlconn, out dtjxfs))
 {
    return;
 }
    jxfs.Name = "计薪方式";
    jxfs.DataSource = dtjxfs;
    jxfs.ValueMember = "Code";
    jxfs.DisplayMember = "Name";

2、员工返职

这块主要就一个知识点,就是一般GV添加超链接列都是添加一整列,没办法根据行项的值设置该超链接列是否显示。这里就是解决这个问题。主要思路很简单就是在数据库里查出符合条件的行项,做成一列,然后把这列变成超链接,我这个好像在别的文章里写过,这里就不贴代码了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1.章 方案背景 5 1.1. XX集团概述 5 1.2. XX集团HR项目背景 5 第2.章 现状分析及建设思路 6 2.1. XX集团人力资源管理诊断及应对措施 6 2.1.1. 主要管理问题 6 2.1.2. 主要应对措施 6 2.2. XX集团HR建设思路 9 2.2.1. HR建设模式选择 9 2.2.2. HR建设阶段规划 9 第3.章 需求分析 13 3.1. 业务需求 13 3.1.1. 组织规划 13 3.1.2. 职位管理 13 3.1.3. 员工关系 13 3.1.4. 薪酬福利 13 3.1.5. 绩效管理 13 3.1.6. 培训管理 14 3.1.7. 招聘管理 14 3.2. 功能需求 14 3.2.1. 人事管理 14 3.2.2. 薪酬福利 15 3.2.3. 考勤休假 15 3.2.4. 培训管理 16 3.2.5. 招聘管理 16 3.2.6. 绩效管理 16 3.2.7. 报表中心 17 3.2.8. 员工自助 17 3.2.9. 业务后台管理 17 3.3. 非功能性需求及技术要求 17 3.3.1. 响应实效要求 17 3.3.2. 可靠性要求 18 3.3.3. 容量和吞吐量 18 3.3.4. 可扩展性要求 18 3.3.5. 用户界面及操作性要求 18 3.4. 信息安全保障需求 18 3.5. 设备需求 19 第4.章 XXHR总体设计 20 第1.章 方案背景 5 1.1. XX集团概述 5 1.2. XX集团HR项目背景 5 第2.章 现状分析及建设思路 6 2.1. XX集团人力资源管理诊断及应对措施 6 2.1.1. 主要管理问题 6 2.1.2. 主要应对措施 6 2.2. XX集团HR建设思路 9 2.2.1. HR建设模式选择 9 2.2.2. HR建设阶段规划 9 第3.章 需求分析 13 3.1. 业务需求 13 3.1.1. 组织规划 13 3.1.2. 职位管理 13 3.1.3. 员工关系 13 3.1.4. 薪酬福利 13 3.1.5. 绩效管理 13 3.1.6. 培训管理 14 3.1.7. 招聘管理 14 3.2. 功能需求 14 3.2.1. 人事管理 14 3.2.2. 薪酬福利 15 3.2.3. 考勤休假 15 3.2.4. 培训管理 16 3.2.5. 招聘管理 16 3.2.6. 绩效管理 16 3.2.7. 报表中心 17 3.2.8. 员工自助 17 3.2.9. 业务后台管理 17 3.3. 非功能性需求及技术要求 17 3.3.1. 响应实效要求 17 3.3.2. 可靠性要求 18 3.3.3. 容量和吞吐量 18 3.3.4. 可扩展性要求 18 3.3.5. 用户界面及操作性要求 18 3.4. 信息安全保障需求 18 3.5. 设备需求 19 第4.章 XXHR总体设计 20 4.1. 系统概述 20 4.2. 系统设计原则 20 4.3. 系统体系架构 21 4.4. 系统技术结构 23 4.5. 网络拓扑结构 23 4.6. 系统特点 24 4.6.1. 功能特点 24 4.6.2. 技术特点 27 第5.章 XXHR解决方案 30 5.1. 总体建设目标 30 5.2. HR系统功能介绍 30 5.2.1. 组织规划 31 5.2.2. 员工关系管理 34 5.2.3. 合同管理 41 5.2.4. 薪酬福利管理 42 5.2.5. 考勤休假管理 50 5.2.6. 培训管理 53 5.2.7. 招聘管理 58 5.2.8. 绩效管理 62 5.2.9. 报表中心 68 5.2.10. 员工自助 71 5.2.11. 业务后台维护 72 5.3. 协同流程平台 77 5.3.1. 概述 77 5.3.2. 系统建设目标 77 5.3.3. 协同流程平台介绍 77 5.3.4. 流程管理工具的组成 81 5.3.5. 全生命周期的流程管理 83 第6.章 技术解决方案 91 6.1. XX集团技术和软硬件配置 91 6.1.1. 技术要求及配置现状 91 6.1.2. 软硬件配置推荐 91 6.2. 技术路线 93 6.2.1. 选择先进的B/S运算模式 93 6.2.2. 选择先进的J2EE多层体系架构 94 6.2.3. 采用优秀的 Java 语言 95 6.2.4. 采用先进的设计模式 95 6.2.5. 强大的二次开发平台 96 6.2.6. 安装/配置方案 97 6.2.7. 技术支持方案 97 6.2.8. 安全方案 98 第7.章 实施方案 102 7.1. 项目实施计划 102 7.1.1. 项目各阶段实施计划 102 7.1.2. 项目实施进度 103 7.2. 项目管理 106 7.2.1. 项目组组织机构 106 7.2.2. 各级项目组织的任务和权限 107 7.2.3. 项目实施组织中各成员的任务和权限 108 7.2.4. 项目开发组织中各成员的任务和权限 111 7.2.5. XX项目组成员简介 113 7.3. 项目风险及对策 115 7.3.1. 时机不成熟的风险 115 7.3.2. 项目实施过程的风险 116 7.4. 成功关键因素 117 第8.章 质量保证措施 121 8.1. 测试任务与步骤 121 8.1.1. 制定测试策略和过程 121 8.1.2. 设计测试用例和数据 122 8.1.3. 建立测试环境 125 8.1.4. 测试执行 125 8.2. 工程系统集成测试 126 第9.章 培训、技术支持与服务计划 130 9.1. 培训方案 130 9.1.1. 培训意义 130 9.1.2. 培训目标 130 9.1.3. 培训对象 130 9.1.4. 培训方式 131 9.2. 技术支持与服务计划 131 9.2.1. VIP贵宾服务 131 9.2.2. 软件开发及客户化服务 131 9.2.3. 应用软件实施服务 132 9.2.4. 应用软件维护及支持服务 132 9.2.5. 服务模式 132 第10.章 验收方法和标准 134 10.1. 验收原则 134 10.2. 验收阶段 134 10.3. 验收规则 134 10.3.1. 试点功能验收 134 10.3.2. 试点运行验收 135 10.3.3. 最终验收 136 第11.章 项目文档 137 第12.章 典型案例 138 12.1. 巴士股份 138 12.2. 大众保险 140
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值