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)
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)
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)
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)
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)