Exemple #1
0
def main():
    """
    周报2018版本主体
    :return: 周报
    """

    global TotalMember, orgWT, costProject, fd, st_date, ed_date, numb_days, doc, workhours
    global config

    if len(sys.argv) != 4:
        print("\n\tUsage: python %s start_date end_date numb_days\n" %
              sys.argv[0])
        return

    st_date = sys.argv[1]
    ed_date = sys.argv[2]
    numb_days = sys.argv[3]
    """按一个工作日8小时计算"""
    workhours = int(numb_days) * 8
    """创建word文档实例
    """
    doc = crWord.createWord()
    """写入"主题"
    """
    doc.addHead(u'产品研发中心周报', 0, align=WD_ALIGN_PARAGRAPH.CENTER)

    db = MySQLdb.connect(host=config.get('MYSQL', 'host'),
                         user=config.get('MYSQL', 'user'),
                         passwd=config.get('MYSQL', 'password'),
                         db="nebula",
                         charset='utf8')
    # db = MySQLdb.connect(host="172.16.101.117", user="******",passwd="123456", db="nebula", charset='utf8')
    cur = db.cursor()

    _print('>>> 报告生成日期【%s】 <<<' % time.ctime(),
           align=WD_ALIGN_PARAGRAPH.CENTER)
    """
    _print("在研产品情况", title=True, title_lvl=1)
    getPdingList(cur)
    """

    _print("工程项目的支撑情况", title=True, title_lvl=1)
    pg = _print("任务明细", title=True, title_lvl=2)
    getPjTaskListByGroup(pg)

    _print("人力资源投入", title=True, title_lvl=1)
    getOprWorkTime(cur)

    db.close()
    doc.saveFile('week.docx')
    _cmd = 'python doc2pdf.py week.docx weekly-%s.pdf' % time.strftime(
        '%Y%m%d', time.localtime(time.time()))
    os.system(_cmd)
    """删除过程文件"""
    _cmd = 'del /Q pic\\*'
    os.system(_cmd)
Exemple #2
0
def main(project="PRD-2017-PROJ-00003"):

    global doc, ProjectAlias
    """创建word文档实例
    """
    doc = crWord.createWord()
    """写入"主题"
    """
    doc.addHead(u'产品项目计划跟踪报告', 0, align=WD_ALIGN_PARAGRAPH.CENTER)
    #doc.addHead(u'产品项目【%s】' % project, 1, align=WD_ALIGN_PARAGRAPH.CENTER)

    db = MySQLdb.connect(host="47.93.192.232",
                         user="******",
                         passwd="sw64419",
                         db="nebula",
                         charset='utf8')
    cur = db.cursor()

    _print('>>> 报告生成日期【%s】 <<<' % time.ctime(),
           align=WD_ALIGN_PARAGRAPH.CENTER)
    """计划期限"""
    _plan_date = []
    """计划拟完成任务量"""
    _plan_quta = []
    """计划投入工时"""
    _plan_work_hour = []
    """实际完成任务量"""
    _active_quta = []
    """修正后的实际完成任务量"""
    _active_ing_quta = []
    """实际投入工时"""
    _active_value = []
    """报告结论"""
    _results = []
    """获取项目计划的起始时间"""
    _sql = 'select start_date from project_task_t where task_level="1"'
    _res = doSQL(cur, _sql)
    _pj_start_date = _res[0][0].replace('年', '-').replace('月', '-').replace(
        '日', '-').split('-')

    _year = int(_pj_start_date[0])
    _month = int(_pj_start_date[1])
    _day = int(_pj_start_date[2])

    _pj_start_date = datetime.date(_year, _month, _day)

    #_sql = 'select end_date from project_task_t where task_resources<>"#" and PJ_XMBH="%s" order by end_date' % project
    _sql = 'select PJ_KSSJ,PJ_JSSJ from project_t where PJ_XMBH="%s"' % project
    _res = doSQL(cur, _sql)

    _str_date = _res[0]
    _start_date = _res[0][0].replace('年',
                                     '-').replace('月',
                                                  '-').replace('日',
                                                               '').split('-')
    _end_date = _res[0][1].replace('年',
                                   '-').replace('月',
                                                '-').replace('日',
                                                             '').split('-')

    _year = int(_start_date[0])
    _month = int(_start_date[1])
    _day = int(_start_date[2])

    start_date = datetime.date(_year, _month, _day)

    _year = int(_end_date[0])
    _month = int(_end_date[1])
    _day = int(_end_date[2])

    end_date = datetime.date(_year, _month, _day)

    _sql = 'select PJ_XMMC,PJ_XMFZR,PJ_KSSJ,PJ_JSSJ,PJ_XMJJ,PJ_XMYS from project_t where PJ_XMBH="%s"' % project
    _res = doSQL(cur, _sql)
    if _res is None or len(_res) == 0:
        print("\n\tErr: Invalid number of project: %s)" % project)

    _print(u"项目基本信息", title=True, title_lvl=1)

    _print(u'项目名称:%s' % _res[0][0])
    _print(u'项目编号:%s' % project)
    _print(u'项目负责人:%s' % _res[0][1])
    _print(u'项目起止日期:%s 至 %s' % (_res[0][2], _res[0][3]))
    _print(u'项目预算(工时成本):%s 万元' % _res[0][5])
    _print(u'项目功能简介:%s' % _res[0][4])

    _pre_cost = float(_res[0][5])

    _kv, _max_n, _act_n = getQ(cur)
    _q = float(_act_n * 100) / float(_max_n)
    if _q < 85:
        _print(u'任务定义问题:在已分配的%d个任务中,仅有%d个(占比%0.2f%%)与计划匹配。' %
               (_max_n, _act_n, _q),
               color=(255, 0, 0))
    """需要在此插入语句"""
    _paragrap = _print(u"计划指标与实际情况", title=True, title_lvl=1)
    """计划
    """
    _print(u"任务数量分布情况", title=True, title_lvl=2)
    """当日完成任务的Σ工时
    """
    _now = datetime.datetime.now()
    _today = datetime.date(_now.year, _now.month, _now.day)

    _start_date = start_date
    _sum = 0
    while True:
        _date = _start_date.strftime(u"%Y年%m月%d日").replace(u'年0',
                                                           u'年').replace(
                                                               u'月0', u'月')
        _sql = 'select sum(work_hour) from project_task_t ' \
               'where end_date like "%%%s%%" and task_resources<>"#" and PJ_XMBH="%s" order by task_id' % (_date,project)
        _n = int(doSQLcount(cur, _sql))
        _plan_work_hour.append([_sum, _sum + _n])
        _sum += _n

        _start_date = _start_date + datetime.timedelta(days=1)
        if _start_date > end_date:
            break

    _start_date = start_date
    _sum = 0
    _sum_ing = 0
    _pro_cost = 0
    while True:
        _date = _start_date.strftime("%Y-%m-%d")
        _sql = 'select sum(TK_GZSJ) from task_t ' \
               'where created_at BETWEEN "%s 00:00:00" AND "%s 23:59:59" and TK_XMBH="%s"' % (_date, _date, project)
        _n = int(doSQLcount(cur, _sql))
        _active_value.append([_sum, _sum + _n])
        _sum += _n

        if _start_date >= _pj_start_date:
            _active_ing_quta.append([_sum_ing, _sum_ing + _n])
            _sum_ing += _n
        else:
            _active_ing_quta.append([0, 0])

        _start_date = _start_date + datetime.timedelta(days=1)
        if _start_date == _pj_start_date:
            _pro_cost = _sum
        if _start_date > _today:
            break

    _start_date = start_date
    while True:
        _date = _start_date.strftime(u"%Y年%m月%d日").replace(u'年0',
                                                           u'年').replace(
                                                               u'月0', u'月')
        _sql = 'select count(*) from project_task_t ' \
               'where end_date like "%%%s%%" and task_resources<>"#" and PJ_XMBH="%s" order by task_id' % (_date,project)
        _n = int(doSQLcount(cur, _sql))
        _plan_date.append(_start_date)
        _plan_quta.append(_n)

        _start_date = _start_date + datetime.timedelta(days=1)
        if _start_date > end_date:
            break

    _line_n = 0
    _start_date = start_date
    while True:
        _date = _start_date.strftime(u"%Y-%m-%d")
        _sql = 'select count(*) from jira_task_t ' \
               'where project_alias="%s" and endDate like "%%%s%%"' \
               ' and issue_status="完成" and issue_type="story" order by id' %\
               (ProjectAlias[project],_date)
        _n = int(doSQLcount(cur, _sql))
        _active_quta.append(_n)

        _line_n += 1
        _start_date = _start_date + datetime.timedelta(days=1)
        if _start_date > _today:
            break
    """生成【计划】曲线(数据)"""
    _data = []
    _total = []
    _sum = 0
    for _v in _plan_quta:
        _sum += _v
        _total.append(_sum)
    _data.append([_total, "#8f8f8f", "^", u"计划"])
    """生成【执行】曲线(数据)"""
    _total_complete = []
    _sum = 0
    for _v in _active_quta:
        _sum += _v
        _total_complete.append(_sum)
    _data.append([_total_complete, "#1a1a1a", ".", u"完成"])
    """计算延期(天)"""
    _plan_day = 0
    for _day_quta in _total:
        if _day_quta >= _sum:
            break
        _plan_day += 1
    _delay_day = _line_n - _plan_day
    """形成【计划任务量分布说明】"""
    _lines = [[_line_n, '-', 'red', u'当前日期']]
    __data = [[[range(len(_plan_quta)), _plan_quta], "b", "-", u"当天完成任务数"]]
    _fn = doBox.doStem(u'计划的任务量分布图',
                       u'Δ任务完成数量(个)',
                       u'日期【%s 至 %s】(天)' % (_str_date[0], _str_date[1]),
                       __data,
                       lines=_lines)
    doc.addPic(_fn, sizeof=3.2)
    _print(u'【图例说明】:图示研发计划中任务数量的分配情况。'
           u'横坐标是工作时间,纵坐标是计划当天要完成的任务个数,'
           u'红竖线是当前位置。'
           u'通过图示可大致了解当前是否处于任务的“密集区”。')

    _print(u"资源投入计划与实际情况", title=True, title_lvl=2)

    _ylines = []
    _ylines.append([
        _plan_work_hour[_line_n][1], '--', 'k',
        u'计划投入%d个人时' % _plan_work_hour[_line_n][1]
    ])
    _ylines.append([
        _active_value[_line_n - 1][1], '--', 'r',
        u'实际投入%d个人时' % _active_value[_line_n - 1][1]
    ])

    if _active_value[_line_n - 1][1] > _plan_work_hour[_line_n][1]:
        _dlt = float(
            (_active_value[_line_n - 1][1] - _plan_work_hour[_line_n][1]) *
            100) / float(_plan_work_hour[_line_n - 1][1])
        _print(
            u'【风险提示】:本期项目的实际资源投入(人时费用)已超过计划预期。'
            u'本期计划投入%d个人时,实际投入%d个人时,超出%0.2f%%)。' %
            (_plan_work_hour[_line_n][1], _active_value[_line_n - 1][1], _dlt),
            color=(250, 0, 0))
        _print(u'注:在项目立项和设计阶段已投入【%d】个人时。' % _pro_cost, color=(255, 0, 0))
        _v = float(_active_value[_line_n - 1][1]) * CostHour / 10000.0
        _results.append([
            u'● 【风险提示】资源投入量超出计划%0.2f%%。本期计划投入%d个人时(工时成本%0.2f 万元),'
            u'实际投入%d个人时(工时成本%0.2f 万元,占预算%0.2f%%)。' %
            (_dlt, _plan_work_hour[_line_n][1],
             float(_plan_work_hour[_line_n][1]) * CostHour / 10000.0,
             _active_value[_line_n - 1][1], _v, _v * 100.0 / _pre_cost),
            (255, 0, 0)
        ])
        if _v / _pre_cost > 1.0:
            _results.append([
                u'● 【风险提示】资源投入已超预算(超%0.2f万元)。' % (_v - _pre_cost), (255, 0, 0)
            ])
    else:
        _print(u'当前本项目的实际资源投入(人时费用)满足计划要求。')
        _results.append([u'● 资源投入量满足计划预期要求。', None])

    # [[range(len(_active_ing_quta)), _active_ing_quta], "g", "-", u"阶段投入"],
    __data = [[[range(len(_active_value)), _active_value], "r", "-", u"已投入"],
              [[range(len(_plan_work_hour)), _plan_work_hour], "k", "-",
               u"计划投入"]]
    _fn = doBox.doLine(u'投入分布图',
                       u'Δ投入工时(人时)',
                       u'日期【%s 至 %s】(天)' % (_str_date[0], _str_date[1]),
                       __data,
                       label_pos='upper left',
                       lines=_lines,
                       ylines=_ylines)
    doc.addPic(_fn, sizeof=3.2)
    _print(u'【图例说明】:图示过程中资源(人时)计划和实际投入情况。'
           u'图中,黑纵线段为计划的工时量,红纵线段为实际投入的工时量。'
           u'黑横线为当天计划投入总量;红横线为实际投入总量。')

    _print(u"过程情况", title=True, title_lvl=1)
    _print(u'1)单元测试情况:')
    _fn = showJinkinsRec.doJinkinsRec(cur)
    doc.addPic(_fn, sizeof=6.2)
    _print(u'【图例说明】:数据采自Jenkins系统,以展示项目中每个模块的单元测试情况。')
    _print(u'2)单元测试覆盖率:')
    _fn = showJinkinsCoverage.doJinkinsCoverage(cur)
    doc.addPic(_fn, sizeof=5.8)
    _print(u'【图例说明】:数据采自Jenkins系统,以展示项目中每个模块的单元测试覆盖率。')

    _print(u"计划跟踪", title=True, title_lvl=1)

    #_date = _today.strftime(u"%Y-%m-%d")
    #_sql = 'select count(*) from jira_task_t where endDate>"%s" order by id' % _date
    _sql = 'select count(*) from jira_task_t where issue_status="处理中" and issue_type="story" order by issue_id'
    _n = int(doSQLcount(cur, _sql))
    _sql = 'select count(*) from jira_task_t where issue_status="待办" and issue_type="story" order by issue_id'
    _m = int(doSQLcount(cur, _sql))
    _sql = 'select count(*) from jira_task_t where issue_status="处理中" and summary like "%入侵%"' \
           ' and issue_type="story" order by issue_id'
    _r = int(doSQLcount(cur, _sql))
    _sql = 'select count(*) from jira_task_t where issue_status="完成" and summary like "%入侵%"' \
           ' and issue_type="story" order by issue_id'
    _r_completed = int(doSQLcount(cur, _sql))
    _sql = 'select count(*) from jira_task_t where issue_status="待办" and summary like "%入侵%"' \
           ' and issue_type="story" order by issue_id'
    _r_waitting = int(doSQLcount(cur, _sql))

    _print(u"● 截至本迭代周期已完成任务有【%d】个。" % _sum)
    if _n > 0:
        _print(u"● 本迭代周期内正在执行的任务有【%d】个。" % _n)
    if _m > 0:
        _print(u"● 本迭代周期内等待执行的任务有【%d】个。" % _m)
    if _r + _r_completed + _r_waitting > 0:
        _print(
            u"● “入侵”的任务有【%d】个,其中已完成%d个、正在执行%d个和待执行%d个。" %
            (_r + _r_completed + _r_waitting, _r_completed, _r, _r_waitting),
            color=(150, 0, 0))

    _ylines = []
    _ylines.append(
        [_total[_line_n + 1], '--', 'k',
         u'计划完成%d个' % _total[_line_n + 1]])
    _ylines.append([_sum + _n, '--', 'r', u'即将完成%d个' % (_sum + _n)])
    _ylines.append([_sum + _n + _m, '--', 'g', u'等待完成%d个' % _m])

    _dlt = (float(_sum + _n + _m - _total[-1]) * 100.) / float(_total[-1])
    print ">>>", _dlt
    if _dlt > 5.:
        _print(u'【风险提示】:实际制定的任务量已超出计划量%0.2f%%,须调整计划。' % _dlt,
               color=(250, 0, 0))
        _results.append(
            [u'● 【风险提示】实际制定的任务量已超出计划量%0.2f%%,须调整计划。' % _dlt, (250, 0, 0)])

    _dlt = float(
        (_total[_line_n + 1] - (_sum + _n)) * 100) / float(_total[_line_n + 1])
    if _dlt > 5:
        _print(u'【风险提示】:本期实际完成的任务总量已“负偏离”计划量(偏离%0.2f%%),估计延期%d个工作日。' %
               (_dlt, _delay_day),
               color=(250, 0, 0))
        _results.append([
            u'● 【风险提示】完成任务未达到计划要求,负偏离%0.2f%%,估计延期%d个工作日。' % (_dlt, _delay_day),
            (255, 0, 0)
        ])
    else:
        _results.append([u'● 任务完成情况满足计划要求。', None])

    if _delay_day < 0:
        _results.append([u'● 进度超前计划【%d】个工作日。' % _delay_day, (0, 200, 0)])

    _dots = [[_line_n + 1, _sum + _n, ">", 'r', u"预期(执行中)"],
             [_line_n + 1, _sum + _n + _m, ">", 'g', u"预期(等待中)"]]

    _fn = doBox.doDotBase(u'任务完成趋势图',
                          u'Σ任务数量(个)',
                          u'日期【%s 至 %s】(天)' % (_str_date[0], _str_date[1]),
                          _data,
                          label_pos='upper left',
                          lines=_lines,
                          ylines=_ylines,
                          dots=_dots)

    doc.addPic(_fn, sizeof=5)
    _print(u'【图例说明】:图示该项目计划的完成状态。'
           u'图中包括计划的、已完成的及本期(本迭代周期)将达到的任务数量水平,'
           u'以直观了解该项目的计划与执行是否存在+/-偏差,以及偏差大小。'
           u'图中,黑线为当天计划的目标;红线为即将达到的目标;绿线为本期预定目标。')

    _print(u'本期项目状态:', paragrap=_paragrap)
    for _r in _results:
        _print(_r[0], paragrap=_paragrap, color=_r[1])

    db.close()
    doc.saveFile('%s-proj.docx' % project)
    """删除过程文件"""
    _cmd = 'del /Q pic\\*'
    os.system(_cmd)

    _cmd = 'python doc2pdf.py %s-proj.docx %s-proj-%s.pdf' % \
           (project, project, time.strftime('%Y%m%d', time.localtime(time.time())))
    os.system(_cmd)
Exemple #3
0
def main():

    global TotalMember, orgWT, costProject, fd, st_date, ed_date, numb_days, doc, workhours

    if len(sys.argv) != 4:
        print("\n\tUsage: python %s start_date end_date numb_days\n" % sys.argv[0])
        return

    st_date = sys.argv[1]
    ed_date = sys.argv[2]
    numb_days = sys.argv[3]
    workhours = int(numb_days) * 8

    """创建word文档实例
    """
    doc = crWord.createWord()
    """写入"主题"
    """
    doc.addHead(u'产品研发中心周报', 0, align=WD_ALIGN_PARAGRAPH.CENTER)

    db = MySQLdb.connect(host="47.93.192.232",user="******",passwd="sw64419",db="nebula",charset='utf8')
    cur = db.cursor()

    _print('>>> 报告生成日期【%s】 <<<' % time.ctime(), align=WD_ALIGN_PARAGRAPH.CENTER)
    _info = Load_json('info.json')
    if _info is not None:
        for k,v in sorted(_info.items()):
            _k = k.split(',')
            if len(_k)>1:
                doc.addText(u'● %s:%s' % (_k[1],v))
            else:
                doc.addText(u'● %s:%s' % (k,v))

    """获取研发管理任务情况
    """
    _doit = []
    _plan = []
    _sql = "select PDM_TASK from pd_management_t where PDM_STATE=1 and created_at between '%s' and '%s'" % (st_date, ed_date)
    _res = doSQL(cur,_sql)
    for _row in _res:
        _doit.append(_row[0])
    _sql = "select PDM_TASK, created_at from pd_management_t where PDM_STATE=0"
    _res = doSQL(cur,_sql)
    for _row in _res:
        _plan.append((_row[0],_row[1]))

    if len(_doit)>0:
        doc.addText(u'● 研发管理已完成:')
        _i = 1
        for _it in _doit:
            doc.addText(u'\t%d、%s' % (_i, str(_it)))
            _i += 1

    if len(_plan)>0:
        doc.addText(u'● 研发管理计划有:')
        _i = 1
        for _it in _plan:
            doc.addText(u'\t%d、%s【任务创建于 %s】' % (_i, str(_it[0]), str(_it[1])))
            _i += 1

    """获取现有产品信息
    """
    getPdList(cur)

    _print("总数据统计", title=True, title_lvl=1)
    #_print("报告时段:%s 至 %s" % (st_date, ed_date))
    doCount(db,cur)
    """计划:每周一做上一周的“周报”,故时间间隔 7 天
    """
    _print("本周新增记录数: %d" % getSum(cur))

    """
    _print("产品交付情况", title=True, title_lvl=1)
    getPdDeliverList(cur)
    """
    _print("在研产品情况", title=True, title_lvl=1)
    getPdingList(cur)

    _print("风险情况", title=True, title_lvl=1)
    getRisk(cur)

    _print("本周事件", title=True, title_lvl=1)
    getEvent(cur)

    _print("人力资源投入", title=True, title_lvl=1)
    getOprWorkTime(cur)

    _print("小组资源投入情况", title=True, title_lvl=1)
    getGrpWorkTime(cur)
Exemple #4
0
def main():

    global TotalMember, orgWT, costProject, fd, st_date, ed_date, numb_days, doc, workhours

    if len(sys.argv) != 4:
        print("\n\tUsage: python %s start_date end_date numb_days\n" %
              sys.argv[0])
        return

    st_date = sys.argv[1]
    ed_date = sys.argv[2]
    numb_days = sys.argv[3]
    workhours = int(numb_days) * 8
    """创建word文档实例
    """
    doc = crWord.createWord()
    """写入"主题"
    """
    doc.addHead(u'产品研发中心周报', 0, align=WD_ALIGN_PARAGRAPH.CENTER)

    db = MySQLdb.connect(host="47.93.192.232",
                         user="******",
                         passwd="sw64419",
                         db="nebula",
                         charset='utf8')
    cur = db.cursor()

    _print('>>> 报告生成日期【%s】 <<<' % time.ctime(),
           align=WD_ALIGN_PARAGRAPH.CENTER)
    _info = Load_json('info.json')
    if _info is not None:
        for k, v in sorted(_info.items()):
            _k = k.split(',')
            if len(_k) > 1:
                doc.addText(u'● %s:%s' % (_k[1], v))
            else:
                doc.addText(u'● %s:%s' % (k, v))
    """获取研发管理任务情况
    """
    _doit = []
    _plan = []
    _sql = "select PDM_TASK from pd_management_t where PDM_STATE=1 and created_at between '%s' and '%s'" % (
        st_date, ed_date)
    _res = doSQL(cur, _sql)
    for _row in _res:
        _doit.append(_row[0])
    _sql = "select PDM_TASK, created_at from pd_management_t where PDM_STATE=0"
    _res = doSQL(cur, _sql)
    for _row in _res:
        _plan.append((_row[0], _row[1]))

    if len(_doit) > 0:
        doc.addText(u'● 研发管理已完成:')
        _i = 1
        for _it in _doit:
            doc.addText(u'\t%d、%s' % (_i, str(_it)))
            _i += 1

    if len(_plan) > 0:
        doc.addText(u'● 研发管理计划有:')
        _i = 1
        for _it in _plan:
            doc.addText(u'\t%d、%s【任务创建于 %s】' % (_i, str(_it[0]), str(_it[1])))
            _i += 1
    """获取现有产品信息
    """
    getPdList(cur)

    _print("总数据统计", title=True, title_lvl=1)
    #_print("报告时段:%s 至 %s" % (st_date, ed_date))
    doCount(db, cur)
    """计划:每周一做上一周的“周报”,故时间间隔 7 天
    """
    _print("本周新增记录数: %d" % getSum(cur))
    """
    _print("产品交付情况", title=True, title_lvl=1)
    getPdDeliverList(cur)
    """
    _print("在研产品情况", title=True, title_lvl=1)
    getPdingList(cur)

    _print("风险情况", title=True, title_lvl=1)
    getRisk(cur)

    _print("本周事件", title=True, title_lvl=1)
    getEvent(cur)

    _print("人力资源投入", title=True, title_lvl=1)
    getOprWorkTime(cur)

    _print("小组资源投入情况", title=True, title_lvl=1)
    getGrpWorkTime(cur)
    """
    _pd_fn, _pj_fn = doBarOnTable.doWorkHourbyGroup(cur, begin_date=st_date, end_date=ed_date)
    doc.addPic(_pd_fn, sizeof=5.2)
    doc.addText(u"图5-1 各组在产品研发上的投入", align=WD_ALIGN_PARAGRAPH.CENTER)
    doc.addPic(_pj_fn, sizeof=4.6)
    doc.addText(u"图5-2 各组在工程项目和非项目上的投入", align=WD_ALIGN_PARAGRAPH.CENTER)

    """

    _print("各项目投入情况", title=True, title_lvl=1)
    getProjectWorkTime(cur)

    _print("各项目投入统计", title=True, title_lvl=1)
    if len(costProject) > 0:
        _fn = doPie.doProjectPie(costProject)
        _print(u"产品项目投入:%d【人时】,工时成本 %0.2f【万元】" %
               (costProject[0], costProject[0] * 125.0 / 10000.0))
        _print(u"工程项目投入:%d【人时】,工时成本 %0.2f【万元】" %
               (costProject[1], costProject[1] * 125.0 / 10000.0))
        _print(u"非项目类事务投入:%d【人时】,工时成本 %0.2f【万元】" %
               (costProject[2], costProject[2] * 125.0 / 10000.0))
        _print("")
        _print(u"总投入:%d【人时】,工时成本 %0.2f【万元】" %
               (sum(costProject), sum(costProject) * 125.0 / 10000.0))
        doc.addPic(_fn, sizeof=4)
        doc.addText(u"图5 项目投入比例", align=WD_ALIGN_PARAGRAPH.CENTER)

    _print("测试内容统计", title=True, title_lvl=1)
    _pd_ok, _pd_oking, _pd_err = getTstRcdSts(cur)

    _print("1、已关闭的:", title=True, title_lvl=2)
    for _r in _pd_ok:
        _str = ("产品 %s %s 关闭的问题 %d 个," % (_r[0], _r[1], _r[2]))
        if len(_r[3]) > 0:
            _str = _str + "分类统计【 "
            for _v in _r[3]:
                _str = _str + str(_v[0]) + ":" + str(_v[1]) + "个,"
            _str = _str + '】'
            _print(_str)

    _print("2、已解决的:", title=True, title_lvl=2)
    for _r in _pd_oking:
        _str = ("产品 %s %s 已解决但未回归测试的问题 %d 个," % (_r[0], _r[1], _r[2]))
        if len(_r[3]) > 0:
            _str = _str + "分类统计【 "
            for _v in _r[3]:
                _str = _str + str(_v[0]) + ":" + str(_v[1]) + "个,"
            _str = _str + '】'
            _print(_str)

    _print("3、待解决的:", title=True, title_lvl=2)
    for _r in _pd_err:
        _str = ("产品 %s %s 仍存在问题 %d 个," % (_r[0], _r[1], _r[2]))
        if len(_r[3]) > 0:
            _str = _str + "分类统计【 "
            for _v in _r[3]:
                _str = _str + str(_v[0]) + ":" + str(_v[1]) + "个,"
            _str = _str + '】'
            _print(_str, color=(255, 0, 0))

    db.close()
    doc.saveFile('week.docx')
    _cmd = 'python doc2pdf.py week.docx weekly-%s.pdf' % time.strftime(
        '%Y%m%d', time.localtime(time.time()))
    os.system(_cmd)
    """删除过程文件"""
    _cmd = 'del /Q pic\\*'
    os.system(_cmd)
Exemple #5
0
def main(bg_date, ed_date):

    global doc

    _lvl = 1
    """创建word文档实例
    """
    doc = crWord.createWord()
    """写入"主题"
    """
    doc.addHead(u'《项目周报》', 0, align=WD_ALIGN_PARAGRAPH.CENTER)

    _print('>>> 报告生成日期【%s】 <<<' % time.ctime(),
           align=WD_ALIGN_PARAGRAPH.CENTER)
    _print('周报期间【%s-%s】' % (bg_date, ed_date), align=WD_ALIGN_PARAGRAPH.CENTER)

    db = mongodb_class.mongoDB("PM_DAILY")

    _sql = build_sql("date", bg_date, ed_date)

    _rec = db.handler("pm_daily", "find", _sql)
    print _rec.count()

    _print(u"%d、本周项目工时统计" % _lvl, title=True, title_lvl=1)
    _lvl += 1
    _print(u"根据本周项目日报统计的各项目资源投入工时如下:")

    _pj = {}
    for _r in _rec:
        # print(u"%s: %s" % (_r['project_id'], _r['alias']))
        if _r['project_id'] not in _pj:
            _pj[_r['project_id']] = {}
            _pj[_r['project_id']]['alias'] = _r['alias']
        if 'date' not in _pj[_r['project_id']]:
            _pj[_r['project_id']]['date'] = []
        _pj[_r['project_id']]['date'].append(_r['date'])

    _sql = build_sql("daily_date", bg_date, ed_date)
    _rec = db.handler("total_target", "find", _sql)
    print(">>>_sql: %s %d" % (_sql, _rec.count()))
    for _r in _rec:
        if bg_date[1][:5] not in _r['date']:
            continue
        if _r['project_id'] not in _pj:
            print(u">>> Error: total_target[%s:%s] not in pm_daily" %
                  (_r['project_id'], _r['alias']))
            continue
        if 'id' not in _pj[_r['project_id']]:
            _pj[_r['project_id']]['id'] = {}

        # _r['id'] = _r['id']
        if _r['id'] not in _pj[_r['project_id']]['id']:
            _pj[_r['project_id']]['id'][_r['id']] = {
                'summary': _r['summary'],
                'date': _r['date'],
                'percent': []
            }

        if '%' in _r['percent']:
            _pct = _r['percent'].split('%')[0].split('.')[0]
        else:
            _pct = '0'
        _pj[_r['project_id']]['id'][_r['id']]['percent'].append(_pct)

    _work_hour = {}
    _pg_list = None
    for _p in sorted(_pj):

        _pg = _print(u"%d、%s【%s】" % (_lvl, _p, _pj[_p]['alias']),
                     title=True,
                     title_lvl=1)
        if _pg_list is None:
            _pg_list = _pg
        _lvl += 1

        print(">>> project_id: %s" % _p)
        _rec = db.handler("stage_target", "find", {'project_id': _p})
        _stage = {}
        for _r in _rec:
            if _r['id'] not in _stage:
                _stage[_r['id']] = {}
            if _r['sub_id'] not in _stage[_r['id']]:
                _stage[_r['id']][_r['sub_id']] = {'percent': []}

            if "percent" in _r and '%' in _r['percent']:
                _pct = (_r['percent'].split('%')[0]).split('.')[0]
            else:
                _pct = '0'
            _stage[_r['id']][_r['sub_id']]['percent'].append(_pct)
            _stage[_r['id']][_r['sub_id']]['summary'] = _r['summary']
            _stage[_r['id']][_r['sub_id']]['date'] = _r['date']

        _print(u"一、目标完成情况", title=True, title_lvl=3)

        if "id" in _pj[_p]:
            for _id in sorted(_pj[_p]['id'],
                              key=lambda x: int(x.split('.')[1])):
                _pct = sorted(_pj[_p]['id'][_id]['percent'],
                              key=lambda x: int(x))

                _print(u"\t%s)%s" % (_id, _pj[_p]['id'][_id]['summary']),
                       title=True,
                       title_lvl=3)

                if _pct[0] != _pct[-1]:
                    _print(u"计划完成时间:%s,本周完成率从 %s%% 变为 %s%% 。" %
                           (_pj[_p]['id'][_id]['date'], _pct[0], _pct[-1]),
                           color=(0, 100, 0))
                else:
                    if int(_pct[0]) == 100:
                        _print(u"计划完成时间:%s,目标已完成。" %
                               (_pj[_p]['id'][_id]['date']))
                    else:
                        _print(u"计划完成时间:%s,本周没有进展,完成率仍保持在%s%% 。" %
                               (_pj[_p]['id'][_id]['date'], _pct[0]),
                               color=(255, 0, 0))

                if _id not in _stage:
                    continue

                if len(_stage) == 0:
                    continue

                _print(u"包含的阶段目标有:")
                for _sub in sorted(_stage[_id],
                                   key=lambda x: int(x.split('.')[1])):
                    _pct = sorted(_stage[_id][_sub]['percent'],
                                  key=lambda x: int(x))
                    if _pct[0] != _pct[-1]:
                        _print(u"\t● 阶段目标:%s,计划在 %s 完成,本周完成率从 %s%% 变为 %s%% 。" %
                               (_stage[_id][_sub]['summary'],
                                _stage[_id][_sub]['date'], _pct[0], _pct[-1]),
                               color=(0, 10, 0))
                    else:
                        if int(_pct[0]) == 100:
                            _print(u"\t● 阶段目标:%s,计划在 %s 完成,目标已完成。" %
                                   (_stage[_id][_sub]['summary'],
                                    _stage[_id][_sub]['date']))
                        else:
                            _print(
                                u"\t● 阶段目标:%s,计划在 %s 完成,本周没有进展,完成率仍保持在%s%% 。" %
                                (_stage[_id][_sub]['summary'],
                                 _stage[_id][_sub]['date'], _pct[0]),
                                color=(255, 0, 0))
        else:
            _print(u"无时间计划。")

        _print(u"二、任务完成情况", title=True, title_lvl=3)

        _pg = _print(u"任务明细如下:")
        _sql = build_sql("daily_date", bg_date, ed_date)
        _sql['project_id'] = _p
        _rec = db.handler("today_task", "find", _sql)
        _task = {}
        for _r in _rec:
            if _r['daily_date'] not in _task:
                _task[_r['daily_date']] = {}
            if _r['sub_id'] not in _task[_r['daily_date']]:
                _task[_r['daily_date']][_r['sub_id']] = []
            _task[_r['daily_date']][_r['sub_id']].append({
                'summary':
                _r['summary'],
                'date':
                _r['date'],
                'member':
                _r['member'],
                'percent':
                _r['percent']
            })

        doc.addTable(1, 5, col_width=(1, 4, 1, 1, 2))
        _title = (
            ('text', u'日期'),
            ('text', u'任务内容'),
            ('text', u'计划'),
            ('text', u'进度'),
            ('text', u'执行人'),
        )
        doc.addRow(_title)

        _cnt = 0

        for _t in sorted(_task):
            _text = (
                ('text', _t),
                ('text', ''),
                ('text', ''),
                ('text', ''),
                ('text', ''),
            )
            doc.addRow(_text)
            _personal = []
            for _sub in sorted(_task[_t], key=lambda x: int(x.split('.')[1])):
                for _data in _task[_t][_sub]:
                    """排除外协类、领导和资源缺失?
                    """
                    if ((u"外协" or u"总" or u"缺失")
                            not in _data['member']) and (_data['member']
                                                         not in _personal):
                        _personal.append(_data['member'])
                    _text = (
                        ('text', ''),
                        ('text', _data['summary']),
                        ('text', _data['date']),
                        ('text', _data['percent']),
                        ('text', _data['member']),
                    )
                    doc.addRow(_text)
            """资源投入(人日)就是当天参与任务执行的人员个数"""
            _cnt += len(_personal)

        _print(u"本周工作量:%d(人天)" % _cnt, paragrap=_pg)
        _work_hour[_p] = _cnt

        _print(u"三、本周风险", title=True, title_lvl=3)

        _sql = build_sql("daily_date",
                         bg_date,
                         ed_date,
                         opt_sql={'project_id': _p})
        _rec = db.handler("risk", "find", _sql)
        if _rec.count() == 0:
            _print(u"无。")
        else:
            _risk = {}
            for _r in _rec:
                _str = _r["desc"]
                if len(_str) < 2:
                    continue
                if _r["desc"] not in _risk:
                    _risk[_r["desc"]] = _r['way']

            if len(_risk) == 0:
                _print(u"无。")
            else:
                doc.addTable(1, 2, col_width=(3, 4))
                _title = (
                    ('text', u'风险'),
                    ('text', u'解决办法'),
                )
                doc.addRow(_title)

                for _r in _risk:
                    _text = (('text', _r), ('text', _risk[_r]))
                    doc.addRow(_text)

        _print(u"四、本周问题", title=True, title_lvl=3)
        _rec = db.handler("problem", "find", _sql)
        if _rec.count() == 0:
            _print(u"无。")
        else:
            _problem = {}
            for _r in _rec:
                _str = _r["desc"]
                if len(_str) < 2:
                    continue
                if _r["desc"] not in _problem:
                    _problem[_r["desc"]] = _r['way']

            if len(_problem) == 0:
                _print(u"无。")
            else:
                doc.addTable(1, 2, col_width=(3, 4))
                _title = (
                    ('text', u'问题'),
                    ('text', u'解决办法'),
                )
                doc.addRow(_title)

                for _r in _problem:
                    _text = (('text', _r), ('text', _problem[_r]))
                    doc.addRow(_text)

        doc.addPageBreak()

    for _w in _work_hour:
        _print(u"\t● %-20s:%d 人天" % (_w, _work_hour[_w]), paragrap=_pg_list)

    doc.saveFile('weekly_rpt.docx')
def main():

    global db, Topic_lvl_number, TotalMember, orgWT, costProject, fd, st_date, ed_date,\
        numb_days, doc, workhours, TaskPlayQ, PersonalKPILevel

    if len(sys.argv) != 4:
        print("\n\tUsage: python %s start_date end_date numb_days\n" % sys.argv[0])
        return

    st_date = sys.argv[1]
    ed_date = sys.argv[2]
    numb_days = sys.argv[3]
    workhours = int(numb_days) * 8

    db = MySQLdb.connect(host="47.93.192.232",user="******",passwd="sw64419",db="nebula",charset='utf8')
    cur = db.cursor()

    """统计非产品类资源投入(成本)
    """
    statTask(db, cur)
    """获取现有产品信息
    """
    getPdList(cur)

    """创建word文档实例
    """
    doc = crWord.createWord()

    """
    *** 封面 ***
    """
    """写入"主题"
    """
    doc.addHead(u'产品研发中心月报', 0, align=WD_ALIGN_PARAGRAPH.CENTER)

    _print(u'>>> 报告生成日期【%s】 <<<' % time.ctime(), align=WD_ALIGN_PARAGRAPH.CENTER)

    Topic_lvl_number = 0
    _print(u"数据统计", title=True, title_lvl=1)
    _print(u"总体特征", title=True, title_lvl=2)

    _personal = getOnDutyPersonalCount(cur)
    _pd,_pj,_other = getTaskStat(cur)
    _hour = getWorkHourPerDay(cur)
    _print(u"本月在岗 %d 人,执行任务 %d 个(产品类 %d 个、工程类 %d 个和非项目类 %d 个),日均工作时间 %0.2f 小时。"
           % (_personal,(_pd+_pj+_other),_pd,_pj,_other,_hour))

    _print(u"1、任务执行情况", title=True, title_lvl=3)
    getProjectWorkTime(cur)
    if len(costProject)>0:
        _fn = doPie.doProjectPie(costProject)
        _print(u"产品项目投入:%d【人时】,工时成本 %0.2f【万元】" % (costProject[0], costProject[0]*CostHour/10000.0))
        _print(u"工程项目投入:%d【人时】,工时成本 %0.2f【万元】" % (costProject[1], costProject[1]*CostHour/10000.0))
        _print(u"非项目类事务投入:%d【人时】,工时成本 %0.2f【万元】" % (costProject[2], costProject[2]*CostHour/10000.0))
        _print("")
        _print(u"总投入:%d【人时】,工时成本 %0.2f【万元】" % (sum(costProject), sum(costProject)*CostHour/10000.0))
        doc.addPic(_fn, sizeof=4)
        _print(u'任务执行资源投入占比', align=WD_ALIGN_PARAGRAPH.CENTER)

    """计算工作量指标【注:不按月计】"""
    getRdGroupMember(cur)
    _sql = 'select MM_XM,MM_GH from member_t where MM_ZT<>"0"'
    _res = doSQL(cur, _sql)
    _data = ()
    for _m in _res:
        if _m[0] in SpName:
            continue
        _sql = 'select sum(TK_GZSJ+0.) from task_t where TK_XMBH<>"#" and TK_ZXR="%s"' % _m[0]
        _sql += " and created_at between '%s' and '%s'" % (st_date, ed_date)
        _v1 = doSQLcount(cur, _sql)
        _sql = 'select sum(TK_GZSJ+0.) from task_t where TK_XMBH="#" and TK_ZXR="%s"' % _m[0]
        _sql += " and created_at between '%s' and '%s'" % (st_date, ed_date)
        _v2 = doSQLcount(cur, _sql)
        if _m[0] in RdGroupMember:
            _data += (float(_v1)*PjProportion_RD+float(_v2)*NonPjProportion_RD,)
        else:
            _data += (float(_v1) * PjProportion_nRD + float(_v2) * NonPjProportion_nRD,)

    """获取评分参数"""
    __fn, _bxs = doBox.doBox([u'评分参数'], [[_data]], y_limit=(-5, max(_data) + 5))
    bx = _bxs[0]
    PersonalKPILevel = [
        int(bx["whiskers"][0].get_ydata()[0]),  # 优
        int(bx["medians"][0].get_ydata()[0]),  # 良
        int(bx["whiskers"][1].get_ydata()[0]),  # 中
        int(bx["whiskers"][1].get_ydata()[1])]  # 差

    _print(u"2、出勤情况", title=True, title_lvl=3)
    getTotalChkOn(cur, doc)

    _print(u"3、产品货架情况", title=True, title_lvl=3)
    getPdedList(cur)
    _print(u"4、在研产品情况", title=True, title_lvl=3)
    getPdingList(cur)
    _print(u"5、产品交付情况", title=True, title_lvl=3)
    getPdDeliverList(cur)

    #doc.addPageBreak()
    Topic_lvl_number = 0
    _print(u"数据分析与评价", title=True, title_lvl=1)

    _print(u"研发投入趋势分析", title=True, title_lvl=2)
    statCostTrend(cur, doc)
    _print("")

    _print(u'研发组参与工程项目和非项目类任务的明细(前10名):')
    _fn,_project,_key,_row = getGroupTaskSummary(cur)
    doc.addPic(_fn,sizeof=6.4)
    _print(u'研发组投入工程项目和非项目类任务图', align=WD_ALIGN_PARAGRAPH.CENTER)
    _print(u'图例说明:')
    _i = 0
    for _k in range(len(_key)):
        _sum = sum(_row[_i])
        if _sum>0:
            _print(u"\t【%s】表示:%s,投入:%d(人时)" % (_key[_k], _project[_k], _sum))
        _i += 1

    _print("资源投入分类明细", title=True, title_lvl=2)
    _print("1、产品项目类资源投入情况", title=True, title_lvl=3)
    doc.addTable(1, 3)
    _title = (('text',u'项目'),('text',u'名称'),('text',u'投入工时(小时)'))
    doc.addRow(_title)
    addPDList(cur, doc)
    _print("")
    _print("2、工程项目和非项目类资源投入情况", title=True, title_lvl=3)
    doc.addTable(1, 2)
    _title = (('text',u'项目名称'),('text',u'投入工时(小时)'))
    doc.addRow(_title)
    addNoPDList(cur, doc)
    _print("")

    _print("团队、个人综合评价", title=True, title_lvl=2)

    """2017.12.28:利用“正太分布”方法模型"""
    _plan_fn_1, _plan_fn_2, _lvl, TaskPlayQ = doBox.getPersonalPlanQ(cur)

    _print("1、团队综合评价", title=True, title_lvl=3)
    statGroupInd(cur)
    _print("")
    _print("2、个人综合评价", title=True, title_lvl=3)
    #print PersonalKPILevel
    statPersonalInd(cur)
    _print("")

    db.close()
    doc.saveFile('month.docx')
    _cmd = 'python doc2pdf.py month.docx monthly-%s.pdf' % \
           time.strftime('%Y%m%d', time.localtime(time.time()))
    os.system(_cmd)

    """删除过程文件"""
    _cmd = 'del /Q pic\\*'
    os.system(_cmd)