def __init__(self, project_name): global config self.mongo_db = mongodb_class.mongoDB(project_name) """将工作日志独立记录""" self.mongo_db_worklogs = mongodb_class.mongoDB("WORK_LOGS") self.jira = JIRA(config.get('JIRA', 'url'), basic_auth=(config.get('JIRA', 'user'), config.get('JIRA', 'password'))) self.gh = GreenHopper({'server': config.get('JIRA', 'url')}, basic_auth=(config.get('JIRA', 'user'), config.get('JIRA', 'password'))) self.name = project_name self.project = self.jira.project(self.name) self.pj_name = u"%s" % self.project.name self.pj_manager = u"%s" % self.project.lead.displayName """获取项目版本信息 """ _versions = self.jira.project_versions(self.name) self.version = {} self.sprints = self._get_sprints() for _v in _versions: _key = (u"%s" % _v).replace('.', '^') if not self.version.has_key(_key): self.version[_key] = {} self.version[_key][u"id"] = _v.id self.version[_key]['startDate'] = "" self.version[_key]['releaseDate'] = "" if 'startDate' in dir(_v): self.version[_key]['startDate'] = _v.startDate if 'releaseDate' in dir(_v): self.version[_key]['releaseDate'] = _v.releaseDate self.mongo_db.handler("project", "update", {"version": _key}, dict({"version": _key}, **self.version[_key])) self.issue = None
def __init__(self, project_name): self.mongo_db = mongodb_class.mongoDB(project_name) self.jira = JIRA('http://172.16.60.13:8080', basic_auth=('shenwei','sw64419')) self.gh = GreenHopper({'server': 'http://172.16.60.13:8080'}, basic_auth=('shenwei', 'sw64419')) self.name = project_name self.project = self.jira.project(self.name) self.pj_name = u"%s" % self.project.name self.pj_manager = u"%s" % self.project.lead.displayName """获取项目版本信息 """ _versions = self.jira.project_versions(self.name) self.version = {} self.sprints = self._get_sprints() for _v in _versions: _key = (u"%s" % _v).replace('.', '^') if not self.version.has_key(_key): self.version[_key] = {} self.version[_key][u"id"] = _v.id self.version[_key]['startDate'] = "" self.version[_key]['releaseDate'] = "" if 'startDate' in dir(_v): self.version[_key]['startDate'] = _v.startDate if 'releaseDate' in dir(_v): self.version[_key]['releaseDate'] = _v.releaseDate self.mongo_db.handler("project", "update", {"version": _key}, dict({"version": _key}, **self.version[_key])) self.issue = None
def main(filename): mongo_db = mongodb_class.mongoDB('ext_system') if filename is None: filename = sys.argv[1] print filename xlsx_handler = XlsxHandler(filename) try: _str, _ncols = xlsx_handler.getXlsxColStr() if _str not in TableName: # print(">>> Err: [%s][%s] not be recognised" % (filename, _str)) return { "OK": False, "INFO": u">>> Err: [%s][%s] not be recognised" % (filename, _str) } _table = TableName[_str].lower() _ret = doList(xlsx_handler, mongo_db, _table, "APPEND", _ncols, range(xlsx_handler.getNcols())) # print("%s- Done" % time.ctime()) return _ret except Exception, e: # print e return {"OK": False, "INFO": "%s" % e}
def __init__(self, date=None, landmark=None): """ 构建 :param date: 统计分析的起止日期 :param landmark: (或)统计分析需指定的里程碑 :return: """ """【注意】personal与members的区别 在personal中保存的是与部门相关的人员及其工作数据(任务和工作日志) 在members中仅保存公司所有(在职,包含外包)人员信息及其归属部门,注:外包人员归属项目/交付中心 """ """人员集""" self.personal = {} """用于记录人员的归属部门""" self.members = {} self.mongodb = mongodb_class.mongoDB() self.landmark = landmark """用于做sankey图的参数""" self.nodes = [] self.links = [] self.plan_links = [] """初始化统计日期""" if date is None: """本系统构建于2018年1月""" self.st_date = "2018-01-01" self.ed_date = "2018-12-31" else: self.st_date = date['st_date'] self.ed_date = date['ed_date'] """指定统计用的时标:created/updated""" self.whichdate = "created"
def main(filename): mongo_db = mongodb_class.mongoDB('ext_system') if filename is None: filename = sys.argv[1] print filename xlsx_handler = XlsxHandler(filename) try: _str, _ncols = xlsx_handler.getXlsxColStr() # print _str # print _ncols # _table = "star_task" _table = xlsx_handler.getTableName() _ret = doList(xlsx_handler, mongo_db, _table, "APPEND", _ncols) # print("%s- Done<%s>" % (time.ctime(), _table)) return _ret except Exception, e: print e # print("%s- Done[Nothing to do]" % time.ctime()) return {"OK": False, "INFO": "%s" % e}
def main(): """MySQL数据库 """ mysql_db = mysql_hdr.SqlService( MySQLdb.connect(host="47.93.192.232", user="******", passwd="sw64419" ,db="nebula", charset='utf8')) group_name = {"FAST": u'云平台研发组', "HUBBLE": u'大数据研发组', "CPSJ": u'产品设计组', "ROOOT": u'系统组', "TESTCENTER": u'测试组'} for source in ['FAST', 'HUBBLE', 'CPSJ', 'ROOOT', 'TESTCENTER']: """mongoDB数据库 """ mongo_db = mongodb_class.mongoDB(source) load_worklog(mysql_db, mongo_db, group_name[source], source)
def __init__(self, name, dpt): """ 初始化 :param name: 姓名 :param dpt: 部门 """ self.name = name self.dpt = dpt self.task = [] self.work_log = [] self.quota = 0. self.plan_quota = 0. self.ext_quota = 0. self.ext_plan_quota = 0. self.ind = None self.mongodb = mongodb_class.mongoDB() self.email = self._get_email() self.m = []
def getPjTaskListByGroup(pg): """ 按组列出 项目入侵 任务。 :param pg: 插入点 :return: """ _print(u'任务明细如下:') doc.addTable(1, 5, col_width=(2, 4, 2, 2, 2)) _title = (('text', u'任务工单号'), ('text', u'任务'), ('text', u'耗时'), ('text', u'状态'), ('text', u'执行人')) doc.addRow(_title) _spent_time = 0 _count = 0 _total_cost = 0. for _grp in GroupName: """mongoDB数据库 """ mongodb = mongodb_class.mongoDB(ProjectAlias[_grp]) _search = {'issue_type': 'epic', 'summary': u'项目入侵'} _epic = mongodb.handler('issue', 'find_one', _search) if _epic is None: continue _search = {'epic_link': _epic['issue']} _cur = mongodb.handler('issue', 'find', _search) if _cur.count() == 0: continue _text = (('text', u'%s' % _grp), ('text', ""), ('text', ""), ('text', ""), ('text', "") ) doc.addRow(_text) for _issue in _cur: _text = () for _it in ['components', 'summary', 'spent_time', 'status', 'users']: if type(_issue[_it]) is not types.NoneType: if type(_issue[_it]) is not types.IntType: _text += (('text', _issue[_it]),) else: _text += (('text', "%0.2f" % (float(_issue[_it])/3600.)),) _spent_time += _issue[_it] if u'电科云' in _issue['summary']: _total_cost += (float(_issue['spent_time']) / 3600.) else: _text += (('text', '-'),) doc.addRow(_text) _count += 1 print u"电科云:", _total_cost doc.setTableFont(8) _print("") _print(u"目前,产品研发资源共执行%d个工程项目任务,投入%0.2f工时。" % (_count, float(_spent_time)/3600.), paragrap=pg) """插入分页"""
def getOprWorkTime(cur): """ 生成个人工时执行情况 :param cur: 数据源 :param mongodb:issue数据源 :return: 内容 """ global TotalMember, orgWT, doc """考勤情况""" _print("考勤情况:", title=True, title_lvl=2) _print(u'数据来源于“钉钉”考勤系统。') data1 = getChkOnAm(cur) data2 = getChkOnPm(cur) if len(data1)>0 and len(data2)>0: _f1, _f2, _f3 = doHour.doChkOnHour(data1, data2) doc.addPic(_f3) doc.addText(u"图1 考勤分布总体情况", align=WD_ALIGN_PARAGRAPH.CENTER) doc.addPic(_f1) doc.addText(u"图2 考勤(上班时间)分布情况", align=WD_ALIGN_PARAGRAPH.CENTER) doc.addPic(_f2) doc.addText(u"图3 考勤(下班时间)分布情况", align=WD_ALIGN_PARAGRAPH.CENTER) else: _print("【无“考勤”数据】") _print("请假情况:", title=True, title_lvl=2) _print(u'数据来源于“钉钉”考勤系统。') doc.addTable(1, 2, col_width=(2, 4)) _title = (('text', u'名称'), ('text', u'关联的审批单')) doc.addRow(_title) _sql = 'select KQ_NAME,KQ_REF from checkon_t ' \ 'where KQ_REF != "#" and created_at > "2018-03-19 12:00:00" and' \ ' str_to_date(KQ_DATE,"%%y-%%m-%%d") between "%s" and "%s"' % (st_date, ed_date) _res = doSQL(cur, _sql) _old_row = () for _row in _res: _text = (('text', u"%s" % _row[0]), ('text', (u"%s" % _row[1]).replace('^',' ')) ) if _old_row != _text: doc.addRow(_text) _old_row = _text doc.setTableFont(8) _print("") _print("工作日志工时统计:", title=True, title_lvl=2) _print(u'数据来源于任务管理系统。') orgWT = () for _grp in GroupName: """mongoDB数据库 """ mongodb = mongodb_class.mongoDB(ProjectAlias[_grp]) _print(_grp, title=True, title_lvl=3) _sql = 'select MM_XM from member_t where MM_POST="%s" and MM_ZT=1' % _grp _res = doSQL(cur, _sql) for _row in _res: if u"%s" % _row[0] in sp_name: continue _search = {"author": {'$regex': ".*%s.*" % _row[0]}, "$and": [{"started": {"$gte": "%s" % st_date}}, {"started": {"$lt": "%s" % ed_date}}]} _cur = mongodb.handler('worklog', 'find', _search) _n = 0. for _rec in _cur: _n += float(_rec['timeSpentSeconds'])/3600. # print "---> " + _grp + " " + _row[0] + " : %0.2f" % _n if _n == 0.: continue _color = None _s = "[员工:" + str(_row[0]) + ",工作 %0.2f 工时" % _n if _n > float(workhours): _s = _s + ",加班 %0.2f 工时" % (_n - workhours) + ",占比 %0.2f %%" % ((_n-workhours)*100./workhours) _color = (255, 0, 0) if _n<workhours: _s = _s + ",剩余 %0.2f 工时" % (workhours - _n) + ",占比 %0.2f %%" % ((workhours-_n)*100/workhours) _color = (50, 100, 50) _s = _s + ']' _print(_s, color=_color) orgWT = orgWT + (_n,) if len(orgWT)>0: _fn = doHour.doOprHour(orgWT, workhours) doc.addPic(_fn) doc.addText(u"图4 本周“人-工时”分布情况", align=WD_ALIGN_PARAGRAPH.CENTER) """插入分页""" doc.addPageBreak() _print("工作日志明细:", title=True, title_lvl=2) _print(u'数据来源于任务管理系统。') for _grp in GroupName: """mongoDB数据库 """ mongodb = mongodb_class.mongoDB(ProjectAlias[_grp]) _print(_grp, title=True, title_lvl=3) doc.addTable(1, 4, col_width=(2, 3, 2, 1)) _title = (('text', u'名称'), ('text', u'任务'), ('text', u'开始时间'), ('text', u'耗时')) doc.addRow(_title) _sql = 'select MM_XM from member_t where MM_ZT=1 and MM_POST="%s"' % _grp _res = doSQL(cur, _sql) for _row in _res: if u"%s" % _row[0] in sp_name: continue _text = (('text', u"%s" % str(_row[0])), ('text', ""), ('text', ""), ('text', "") ) doc.addRow(_text) _search = {"author": {'$regex': ".*%s.*" % _row[0]}, "$and": [{"started": {"$gte": "%s" % st_date}}, {"started": {"$lt": "%s" % ed_date}}]} _cur = mongodb.handler('worklog', 'find', _search).sort([('started', 1)]) _tot = 0. for _rec in _cur: _text = (('text', ""), ('text', (u"%s:\n%s" % (_rec['issue'], _rec['comment']))), ('text', _rec['started'].split('T')[0]), ('text', _rec['timeSpent']) ) doc.addRow(_text) _tot += float(_rec['timeSpentSeconds'])/3600. _text = (('text', "-"), ('text', u"小计"), ('text', ""), ('text', "%0.2f" % _tot) ) doc.addRow(_text) doc.setTableFont(8) _print("") """插入分页""" doc.addPageBreak()
# -*- coding: utf-8 -*- # # 生成数据文件,并通过邮件发送 # ============================ # 2019.8.1 @Chengdu # from DataHandler import exceltools import mongodb_class mongo_db = mongodb_class.mongoDB() line_number = 1 def write_title(_book, _titles): _v = 0 for _t in _titles: _book.write((0, _v, _t)) _v += 1 def do_search(table, search): """ 有条件获取表数据 :param table: 表名 :param search: 条件 :return: 数据列表 """ _value = [] _cur = mongo_db.handler(table, "find", search)
def main(): global Personals, key_object, key_active, key_depth, doc if len(sys.argv) != 3: print("\tUsage: %s bg_date ed_date\n" % sys.argv[0]) return _sql, _bgdate, _eddate = build_sql("created", sys.argv[1], sys.argv[2]) print _sql _cnt = 0 """创建word文档实例 """ doc = DataHandler.crWord.createWord() """写入"主题" """ doc.addHead(u'《个人行为特征分析》报告', 0, align=WD_ALIGN_PARAGRAPH.CENTER) _print('>>> 报告生成日期【%s】 <<<' % time.ctime(), align=WD_ALIGN_PARAGRAPH.CENTER) write_title(_bgdate, _eddate) import mongodb_class db = mongodb_class.mongoDB() for _job in ['WORK_LOGS']: db.connect_db(_job) _cur = db.handler("worklog", "find", _sql) for _v in _cur: if _v.has_key('author'): _job = _v['issue'].split('-')[0] if _v['author'] not in Personals: Personals[_v['author']] = {'comment': '', 'object': {}, 'active': {}, 'depth': {}, 'subject_pd': {}, 'subject_pj': {}, 'issues': [], 'issue': 0} Personals[_v['author']]['comment'] += _v['comment'].\ replace('"', '').\ replace("'", '').\ replace(' ', '').\ replace('\n', '').\ replace('\r', '').upper() Personals[_v['author']]['issues'].append(_v['issue']) if _job in handler.pd_list: if _job not in Personals[_v['author']]['subject_pd']: Personals[_v['author']]['subject_pd'][_job] = 0 Personals[_v['author']]['subject_pd'][_job] += 1 else: if _job not in Personals[_v['author']]['subject_pj']: Personals[_v['author']]['subject_pj'][_job] = 0 Personals[_v['author']]['subject_pj'][_job] += 1 Personals[_v['author']]['issue'] += 1 """添加issue的summary信息""" for _p in Personals: for _i in Personals[_p]['issues']: __sql = _sql __sql['issue'] = _i db.connect_db(_i.split('-')[0]) _cur = db.handler("issue", "find_one", __sql) if _cur is not None: Personals[_p]['comment'] += _cur['summary'] doc.addPageBreak() _print(u"II、总体工作行为特征", title=True, title_lvl=1) _print(u"本节说明全体员工的总体工作行为情况,包括工作日志情况、重点工作投向、工作的聚焦点和工作的行为特点。") _log_sum = 0 _text_sum = 0 _obj_sum = 0 _act_sum = 0 for _p in sorted(Personals): _log_sum += Personals[_p]['issue'] _text_sum += len(Personals[_p]['comment']) for _obj in sorted(key_object): if _obj not in Personals[_p]['object']: Personals[_p]['object'][_obj] = 0 Personals[_p]['object'][_obj] += count(Personals[_p]['comment'], _obj) _obj_sum += Personals[_p]['object'][_obj] for _act in sorted(key_active): if _act not in Personals[_p]['active']: Personals[_p]['active'][_act] = 0 Personals[_p]['active'][_act] += count(Personals[_p]['comment'], _act) _act_sum += Personals[_p]['active'][_act] for _dep in sorted(key_depth): if _dep not in Personals[_p]['depth']: Personals[_p]['depth'][_dep] = 0 Personals[_p]['depth'][_dep] += count(Personals[_p]['comment'], _dep) _print(u"1)参与人员总数:%d 名" % len(Personals)) _print(u"2)全员工作日志记录总数:%d 个,信息量:%d 字" % (_log_sum, _text_sum)) _print(u"3)全员有效主题和行为各 %d、%d 个" % (_obj_sum, _act_sum)) _q = float(np.mean([_obj_sum, _act_sum]))/float(_log_sum) _q_str = u"极差" if _q >= 1.0: _q_str = u"优" elif _q >= 0.8: _q_str = u"良" elif _q >= 0.5: _q_str = u"中" elif _q >= 0.3: _q_str = u"差" _print(u"4)日志记录的总体质量:%s(%0.2f)" % (_q_str, _q)) _print(u"一、全员工作范围") doc.addTable(1, 3, col_width=(1, 1, 2)) _title = (('text', u'产品范围'), ('text', u'项目范围'), ('text', u'特征')) doc.addRow(_title) """产品研发投向""" _issue_sum = 0 _labels = [] _data = [] _pd_items = [] _items = {} for _p in Personals: for _pd in sorted(handler.pd_list): if _pd not in _items: _items[_pd] = 0 if _pd in Personals[_p]['subject_pd']: _issue_sum += Personals[_p]['subject_pd'][_pd] _items[_pd] += Personals[_p]['subject_pd'][_pd] for _i in _items: _data.append(_items[_i]) _labels.append(_i) _pd_items.append((_i, _items[_i])) _fn_pd = DataHandler.doBox.radar_chart(u"【产品】工作范围", _labels, _data) """项目开发投向""" _labels = [] _data = [] _pj_items = [] _items = {} for _p in Personals: for _pj in sorted(handler.pj_list): if _pj not in _items: _items[_pj] = 0 if _pj in Personals[_p]['subject_pj']: _issue_sum += Personals[_p]['subject_pj'][_pj] _items[_pj] += Personals[_p]['subject_pj'][_pj] for _i in _items: _data.append(_items[_i]) _labels.append(_i) _pj_items.append((_i, _items[_i])) _fn_pj = DataHandler.doBox.radar_chart(u"【项目】工作范围", _labels, _data) _v = sorted(_pd_items, key=itemgetter(1), reverse=True) _str = "" if len(_v) > 0: if _v[0][1] > 0: _str = u"• 产品研发的投向以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: _str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: _str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break _str = _str[:-1] _str += u"。" _v = sorted(_pj_items, key=itemgetter(1), reverse=True) __str = "" if len(_v) > 0: if _v[0][1] > 0: __str = u"• 项目开发的投向以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: __str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: __str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break __str = __str[:-1] __str += u"。" doc.addRow((('pic', _fn_pd, 1.6), ('pic', _fn_pj, 1.6), ('text', u'%s\n%s' % (_str, __str)))) _print(u"二、全员行为特征") doc.addTable(1, 3, col_width=(1.6, 1.6, 2)) _title = (('text', u'主题分布'), ('text', u'行为分布'), ('text', u'特征')) doc.addRow(_title) _labels = [] _data = [] _sum = {} _obj_items = [] for _obj in sorted(object_class): _labels.append(_obj) if _obj not in _sum: _sum[_obj] = 0 for _o in object_class[_obj]: for _p in Personals: _sum[_obj] += Personals[_p]['object'][_o] _data.append(_sum[_obj]) _obj_items.append((_obj, _sum[_obj])) _fn_object = DataHandler.doBox.radar_chart(u"工作主题分布", _labels, _data) _labels = [] _data = [] _act_items = [] for _obj in sorted(active_class): _labels.append(_obj) if _obj not in _sum: _sum[_obj] = 0 for _o in active_class[_obj]: for _p in Personals: _sum[_obj] += Personals[_p]['active'][_o] _data.append(_sum[_obj]) _act_items.append((_obj, _sum[_obj])) _fn_active = DataHandler.doBox.radar_chart(u"工作行为分布", _labels, _data) _v = sorted(_obj_items, key=itemgetter(1), reverse=True) _str = "" if len(_v) > 0: if _v[0][1] > 0: _str = u"• 工作以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: _str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: _str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break _str = _str[:-1] _str += u"。" _v = sorted(_act_items, key=itemgetter(1), reverse=True) __str = "" if len(_v) > 0: if _v[0][1] > 0: __str = u"• 工作行为集中在%s" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: __str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: __str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break __str = __str[:-1] __str += u"。" doc.addRow((('pic', _fn_object, 1.6), ('pic', _fn_active, 1.6), ('text', u'%s\n%s' % (_str, __str)))) doc.addPageBreak() _print(u"III、个人工作行为特征", title=True, title_lvl=1) _print(u"本节针对每位员工,给出:") _print(u"1)工作日志情况:包含日志记录个数,日志信息量(字数),日志中包含有效关键字的情况," u"并对日志质量进行评价。") _print(u"2)工作范围;包含员工在产品研发和项目开发方面的工作投入情况。") _print(u"3)行为特征;包含员工在日常工作的重点方向和主要工作行为。") for _p in sorted(Personals): doc.addPageBreak() _print(_p, title=True, title_lvl=2) _obj_sum = 0 _act_sum = 0 for _obj in sorted(key_object): _obj_sum += Personals[_p]['object'][_obj] for _act in sorted(key_active): _act_sum += Personals[_p]['active'][_act] _print(u"1)工作日志记录总数:%d 个,信息量:%d 字" % (Personals[_p]['issue'], len(Personals[_p]['comment']))) _print(u"2)有效主题和行为各 %d、%d 个" % (_obj_sum, _act_sum)) _q = float(np.mean([_obj_sum, _act_sum]))/float(Personals[_p]['issue']) _q_str = u"极差" if _q >= 1.0: _q_str = u"优" elif _q >= 0.8: _q_str = u"良" elif _q >= 0.5: _q_str = u"中" elif _q >= 0.3: _q_str = u"差" _print(u"3)日志记录的质量:%s(%0.2f)" % (_q_str, _q)) _print(u"一、工作范围") doc.addTable(1, 3, col_width=(1, 1, 2)) _title = (('text', u'产品范围'), ('text', u'项目范围'), ('text', u'特征')) doc.addRow(_title) _issue_sum = 0 _labels = [] _data = [] _pd_items = [] for _pd in sorted(handler.pd_list): _labels.append(_pd) if _pd in Personals[_p]['subject_pd']: # print _pd, Personals[_p]['subject_pd'][_pd], ";", _issue_sum += Personals[_p]['subject_pd'][_pd] _data.append(Personals[_p]['subject_pd'][_pd]) _pd_items.append((_pd, Personals[_p]['subject_pd'][_pd])) else: _data.append(0) _pd_items.append((_pd, 0)) _fn_pd = DataHandler.doBox.radar_chart(u"【产品】工作范围", _labels, _data) _labels = [] _data = [] _pj_items = [] for _pj in sorted(handler.pj_list): _labels.append(_pj) if _pj in Personals[_p]['subject_pj']: # print _pj, Personals[_p]['subject_pj'][_pj], ";", _issue_sum += Personals[_p]['subject_pj'][_pj] _data.append(Personals[_p]['subject_pj'][_pj]) _pj_items.append((_pj, Personals[_p]['subject_pj'][_pj])) else: _data.append(0) _pj_items.append((_pj, 0)) _fn_pj = DataHandler.doBox.radar_chart(u"【项目】工作范围", _labels, _data) _v = sorted(_pd_items, key=itemgetter(1), reverse=True) _str = "" if len(_v) > 0: if _v[0][1] > 0: _str = u"• 产品研发以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: _str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: _str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break _str = _str[:-1] _str += u"。" _v = sorted(_pj_items, key=itemgetter(1), reverse=True) __str = "" if len(_v) > 0: if _v[0][1] > 0: __str = u"• 项目开发以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: __str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: __str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break __str = __str[:-1] __str += u"。" doc.addRow((('pic', _fn_pd, 1.6), ('pic', _fn_pj, 1.6), ('text', u'%s\n%s' % (_str, __str)))) _print(u"二、行为特征") doc.addTable(1, 3, col_width=(1.6, 1.6, 2)) _title = (('text', u'主题分布'), ('text', u'行为分布'), ('text', u'特征')) doc.addRow(_title) _labels = [] _data = [] _sum = {} _obj_items = [] for _obj in sorted(object_class): _labels.append(_obj) if _obj not in _sum: _sum[_obj] = 0 for _o in object_class[_obj]: _sum[_obj] += Personals[_p]['object'][_o] _data.append(_sum[_obj]) _obj_items.append((_obj, _sum[_obj])) _fn_object = DataHandler.doBox.radar_chart(u"工作主题分布", _labels, _data) _labels = [] _data = [] _act_items = [] for _obj in sorted(active_class): _labels.append(_obj) if _obj not in _sum: _sum[_obj] = 0 for _o in active_class[_obj]: _sum[_obj] += Personals[_p]['active'][_o] _data.append(_sum[_obj]) _act_items.append((_obj, _sum[_obj])) _fn_active = DataHandler.doBox.radar_chart(u"工作行为分布", _labels, _data) _v = sorted(_obj_items, key=itemgetter(1), reverse=True) _str = "" if len(_v) > 0: if _v[0][1] > 0: _str = u"• 工作以%s为主" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: _str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: _str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break _str = _str[:-1] _str += u"。" _v = sorted(_act_items, key=itemgetter(1), reverse=True) __str = "" if len(_v) > 0: if _v[0][1] > 0: __str = u"• 工作行为集中在%s" % _v[0][0] if len(_v) > 1 and _v[1][1] > 0: __str += u",其次分别为" _lvl = 0 for _vv in _v[1:]: if _vv[1] > 0: __str += u"%s," % _vv[0] _lvl += 1 if _lvl > 3: break __str = __str[:-1] __str += u"。" doc.addRow((('pic', _fn_object, 1.6), ('pic', _fn_active, 1.6), ('text', u'%s\n%s' % (_str, __str)))) doc.saveFile('behavior_analysis_report.docx')
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 Personals with open('per.txt', 'r', encoding='utf-8') as f: for _line in f.readlines(): _line = _line.replace("\n", "").replace("\r", "") print("[{}]".format(_line)) Personals[_line] = 0. db = mongodb_class.mongoDB() # WORK_LOGS db.connect_db("WORK_LOGS") _sql = { '$and': [ { 'updated': { '$gte': "2019-01-01" } }, { 'updated': { '$lte': "2019-12-31" } }, ] } _cur = db.handler("worklog", "find", _sql) for _rec in _cur: if _rec["author"] in Personals: Personals[_rec["author"]] += float(_rec["timeSpentSeconds"]) # DevOpesTask db.connect_db("ext_system") _sql = {} _cur = db.handler("devops_task", "find", _sql) for _rec in _cur: _per = _rec["执行者"].split("(")[0] if "已完成" not in _rec['任务状态']: continue if "2019" not in _rec['开始时间']: continue if _per in Personals: # print(">>> DevOpesTask: {}".format(_per)) bg = _rec['开始时间'].split(" ")[0] ed = _rec['完成时间'].split(" ")[0] if "年" in bg: _n = calDay(bg, ed, "%Y年%m月%d日") elif "-" in bg: _n = calDay(bg, ed, "%Y-%m-%d") else: _n = calDay(bg, ed, "%Y/%m/%d") Personals[_per] += float(8 * 3600 * _n) # OpsTask db.connect_db("ext_system") _sql = {} _cur = db.handler("ops_task", "find", _sql) for _rec in _cur: if "执行人" not in _rec: continue _per = _rec["执行人"] if _per in Personals: Personals[_per] += float(8 * 3600) # TowerTask db.connect_db("ext_system") _sql = {} _pp = {} _cur = db.handler("tower", "find", _sql) for _rec in _cur: if "负责人" not in _rec: continue _per = _rec["负责人"] if _per not in _pp: _pp[_per] = [] if _rec["完成时间"] not in _pp[_per]: _pp[_per].append(_rec["完成时间"]) for _p in _pp: if _p in Personals: Personals[_per] += float(8 * 3600 * len(_pp[_p])) # StarTask db.connect_db("ext_system") _sql = {} _cur = db.handler("star_task", "find", _sql) for _rec in _cur: if "责任人" not in _rec: continue _per = _rec["责任人"] if "完成" not in _rec['任务状态']: continue if "2019" not in _rec['完成时间']: continue if _per in Personals: bg = _rec['开始时间'].split(" ")[0] ed = _rec['完成时间'].split(" ")[0] if "年" in bg: _n = calDay(bg, ed, "%Y年%m月%d日") elif "-" in bg: _n = calDay(bg, ed, "%Y-%m-%d") else: _n = calDay(bg, ed, "%Y/%m/%d") Personals[_per] += float(8 * 3600 * _n) _max = 0 _val = [] for _p in sorted(Personals, key=lambda x: Personals[x], reverse=True): if Personals[_p] > _max: _max = Personals[_p] Personals[_p] = Personals[_p] / 2 print("> [{}]\t{}\t".format(_p, Personals[_p]), end=" ") print("=" * int((80 * Personals[_p]) / _max)) _val.append(Personals[_p]) x = np.array(_val) _mean = int(x.mean()) _std = int(x.std()) print(">>>\t Mean: {}\tStd: {}".format(_mean, int(_std))) _high = _mean + _std _low = _mean - _std l0 = [] l1 = [] l2 = [] l3 = [] for _p in sorted(Personals, key=lambda x: Personals[x], reverse=True): if Personals[_p] >= _high: l0.append((_p, Personals[_p])) elif Personals[_p] >= _mean: l1.append((_p, Personals[_p])) elif Personals[_p] >= _low: l2.append((_p, Personals[_p])) else: l3.append((_p, Personals[_p])) # L0 for _p in l0: _w = calw(l0, _p[1], Level0) print("{}\t优\t{}".format(_p[0], _w)) # L1 for _p in l1: _w = calw(l1, _p[1], Level1) print("{}\t良\t{}".format(_p[0], _w)) # L2 for _p in l2: _w = calw(l2, _p[1], Level2) print("{}\t中\t{}".format(_p[0], _w)) # L3 for _p in l3: _w = calw(l3, _p[1], Level3) print("{}\t差\t{}".format(_p[0], _w))
def main(): global doc if len(sys.argv) != 4: print("\tUsage: %s DB bg_date ed_date\n" % sys.argv[0]) return _lvl = 1 """创建word文档实例 """ doc = DataHandler.crWord.createWord() """写入"主题" """ doc.addHead(u'《项目上测试资源投入明细》', 0, align=WD_ALIGN_PARAGRAPH.CENTER) _print('>>> 报告生成日期【%s】(%s - %s) <<<' % (time.ctime(), sys.argv[2], sys.argv[3]), align=WD_ALIGN_PARAGRAPH.CENTER) db = mongodb_class.mongoDB() db.connect_db(sys.argv[1]) _sql = build_sql(sys.argv[2], sys.argv[3]) _rec = db.handler("issue", "find", _sql) print _rec.count() _pj = {} for _r in _rec: if _r['project_alias'] not in _pj: _pj[_r['project_alias']] = [] _pj[_r['project_alias']].append(_r) for _p in sorted(_pj): _print(u"%d、项目【%s】" % (_lvl, _p), title=True, title_lvl=1) _lvl += 1 _sn = 1 doc.addTable(1, 5, col_width=(1, 4, 3, 2, 2)) _title = ( ('text', u'序号'), ('text', u'任务内容'), ('text', u'执行日期'), ('text', u'工时'), ('text', u'执行人'), ) doc.addRow(_title) _sum = 0. for _r in _pj[_p]: _v = float(_r['spent_time']) / 3600. _text = ( ('text', "%d" % _sn), ('text', _r['summary']), ('text', _r['updated'].split('.')[0]), ('text', "%0.2f" % _v), ('text', _r['users']), ) doc.addRow(_text) _sn += 1 _sum += _v _text = ( ('text', '总计'), ('text', ''), ('text', ''), ('text', "%0.2f" % _sum), ('text', ''), ) doc.addRow(_text) doc.saveFile('task_detail.docx')
def main(): global Personals, key_object, key_active, key_depth, doc if len(sys.argv) != 3: print("\tUsage: %s bg_date ed_date\n" % sys.argv[0]) return _sql, _bgdate, _eddate = build_sql("started", sys.argv[1], sys.argv[2]) print _sql _cnt = 0 """创建word文档实例 """ doc = DataHandler.crWord.createWord() """写入"主题" """ doc.addHead(u'《个人工作行为说明》报告', 0, align=WD_ALIGN_PARAGRAPH.CENTER) _print('>>> 报告生成日期【%s】 <<<' % time.ctime(), align=WD_ALIGN_PARAGRAPH.CENTER) write_title(_bgdate, _eddate) import mongodb_class db = mongodb_class.mongoDB() for _job in ['WORK_LOGS']: db.connect_db(_job) _cur = db.handler("worklog", "find", _sql) for _v in _cur: if _v.has_key('author') and ('SCGA-' in _v['issue']): if _v['author'] not in Personals: Personals[_v['author']] = [] Personals[_v['author']].append(_v) _print(u"I、个人工作行为", title=True, title_lvl=1) _print(u"本节提供了全体员工的工作行为情况,包括日常工作任务、内容和耗时。") for _p in sorted(Personals): _task = {} for _t in Personals[_p]: _date = _t['started'].split('T')[0] if _date not in _task: _task[_date] = {} if _t['issue'] not in _task[_date]: _task[_date][_t['issue']] = [] _task[_date][_t['issue']].append({ "cost": _t['timeSpentSeconds'], "comment": _t['comment'] }) doc.addPageBreak() _print(_p, title=True, title_lvl=2) doc.addTable(1, 4, col_width=(1, 1, 1, 3)) _title = ( ('text', u'日期'), ('text', u'任务'), ('text', u'工时'), ('text', u'内容'), ) doc.addRow(_title) print(u"name: %s" % _p) _sum = 0. _count = 0 for _t in sorted(_task): _day = 0. print(u"date: %s" % _t) doc.addRow(( ('text', _t), ('text', ''), ('text', ''), ('text', ''), )) for _work in _task[_t]: _bg = True for _v in _task[_t][_work]: _vv = float(_v['cost']) / 3600. _sum += _vv _day += _vv if _bg: _tt = _work _bg = False else: _tt = "" doc.addRow( (('text', ''), ('text', _tt), ('text', "%0.2f" % _vv), ('text', _v['comment']))) _count += 1 doc.addRow(( ('text', u'小计'), ('text', ''), ('text', "%0.2f" % _day), ('text', ''), )) doc.addRow(( ('text', u'总计'), ('text', "%d" % _count), ('text', "%0.2f" % _sum), ('text', ''), )) doc.saveFile('work_analysis_report.docx')
def do_main(_bg_date, _now): db = mongodb_class.mongoDB() db.connect_db("WORK_LOGS") print _bg_time, " --> ", _now _sql = { "$and": [{ "created": { "$gt": _bg_time } }, { "created": { "$lte": _now } }] } _rec = db.handler("worklog", "find", _sql) _macs = [] print _rec.count() if _rec.count() == 0: return for _r in _rec: if "TESTCENTER" in _r['issue'].split('-')[0]: continue _mac = (_r['issue'].split('-')[0], _r['author'], float(_r['timeSpentSeconds']) / 3600.) # print _mac _macs.append(_mac) G, _label, _center = pj_obj_graph(_macs) # print _center H = nx.Graph(G) edgewidth = [] wins = dict.fromkeys(G.nodes(), 0.01) for (u, v, d) in H.edges(data=True): edgewidth.append(d['weight']) if u in _center: wins[u] += d['weight'] if v in _center: wins[v] += d['weight'] # print wins try: import matplotlib.pyplot as plt plt.rcParams['text.usetex'] = False plt.figure(figsize=(18, 24), dpi=120) plt.rcParams['text.usetex'] = False plt.axis('off') pos = nx.spring_layout(H, iterations=16) nx.draw_networkx_edges(H, pos, alpha=0.3, width=edgewidth, edge_color='y') _node_size = [wins[v] * 60 for v in H] nx.draw_networkx_nodes(H, pos, node_size=_node_size, node_color='m', alpha=0.2) nx.draw_networkx_edges(H, pos, alpha=0.4, node_size=0, width=0.2, edge_color='k') nx.draw_networkx_labels(H, pos, fontsize=8) font = { 'fontname': 'SimHei', 'color': 'k', 'fontweight': 'bold', 'fontsize': 16 } plt.title(u"资源分布【%s - %s】" % (_bg_time, _now), font) font = { 'fontname': 'SimHei', 'color': 'k', 'fontweight': 'bold', 'fontsize': 12 } plt.text(0.5, 0.98, u"项目节点大小 = 总工作量", font, horizontalalignment='center', transform=plt.gca().transAxes) plt.text(0.5, 0.96, u"边大小 = 个人工作量", font, horizontalalignment='center', transform=plt.gca().transAxes) plt.savefig("network%s-%s.png" % (_bg_time.split('T')[0].replace( '-', ''), _now.split('T')[0].replace('-', ''))) except Exception, e: print e return
def file_handler(_file): _short_file = _file.split("\\")[-1] # print "fileHandler: ", _short_file if ('.docx' not in _short_file) and ('.doc' in _short_file): print "Invalid file name: ", _short_file return else: mongo_db = mongodb_class.mongoDB('PM_DAILY') _heading_lvl = 0 _step = -1 _desc = "" _way = "" _doc = docx.Document(_file) _total_target_lvl = 1.1 _daily = {} for para in _doc.paragraphs: _params = getParam(para.text) if "Title" in para.style.name: _daily['title'] = { "alias": _params[0], "project_id": _params[2] } else: if para.style.name in ["Normal", "List Paragraph"]: if _heading_lvl == 0 and u"日报" in para.text: _text_lvl = 1 _daily['title']['date'] = _params[0] elif _heading_lvl == 1: if 'total_target' not in _daily: _daily['total_target'] = [] if para.style.name in "List Paragraph": # print ">>> %0.1f <<< %d" % (_total_target_lvl, len(_params)) if len(_params) == 3: _daily['total_target'].append({ 'id': "%0.1f" % _total_target_lvl, 'summary': _params[0], 'date': _params[1], 'percent': _params[2], 'daily_date': _daily['title']['date'] }) elif len(_params) == 5: _daily['total_target'].append({ 'id': "%0.1f" % _total_target_lvl, 'summary': _params[0], 'requirement': _params[1], 'method': _params[2], 'date': _params[3], 'percent': _params[4], 'daily_date': _daily['title']['date'] }) elif len(_params) == 4: # print _params _daily['total_target'].append({ 'id': "%0.1f" % _total_target_lvl, 'summary': _params[0], 'requirement': _params[1], 'method': "", 'date': _params[2], 'percent': _params[3], 'daily_date': _daily['title']['date'] }) else: print(u"文档正文【目标】格式错误!") return _total_target_lvl += 0.1 else: if len(_params) == 4: _daily['total_target'].append({ 'id': _params[0], 'summary': _params[1], 'date': _params[2], 'percent': _params[3], 'daily_date': _daily['title']['date'] }) elif len(_params) == 6: _daily['total_target'].append({ 'id': _params[0], 'summary': _params[1], 'requirement': _params[2], 'method': _params[3], 'date': _params[4], 'percent': _params[5], 'daily_date': _daily['title']['date'] }) else: print(u"文档正文【目标】格式错误!") return elif _heading_lvl == 2: if para.style.name in "List Paragraph": print(u"文档正文【阶段目标】格式错误!") return if 'stage_target' not in _daily: _daily['stage_target'] = [] if len(_params) == 5: _daily['stage_target'].append({ 'sub_id': _params[0], 'id': _params[1], 'summary': _params[2], 'date': _params[3], 'percent': _params[4], 'daily_date': _daily['title']['date'] }) elif len(_params) == 7: _daily['stage_target'].append({ 'sub_id': _params[0], 'id': _params[1], 'summary': _params[2], 'requirement': _params[3], 'method': _params[4], 'date': _params[5], 'percent': _params[6], 'daily_date': _daily['title']['date'] }) elif len(_params) >= 6: _daily['stage_target'].append({ 'sub_id': _params[0], 'id': _params[1], 'summary': _params[2], 'requirement': _params[3], 'method': _params[4], 'date': _params[5], 'daily_date': _daily['title']['date'] }) else: # show_message(hwnd, u"文档正文【阶段目标】格式错误!") print(u"文档正文【阶段目标】参数个数错误!<%d>" % len(_params)) elif _heading_lvl == 3: if para.style.name in "List Paragraph": print(u"文档正文【今日工作汇报】格式错误!") return if 'today' not in _daily: _daily['today'] = [] if len(_params) >= 5: _daily['today'].append({ 'sub_id': _params[0], 'summary': _params[1], 'date': _params[2], 'percent': _params[3], 'member': _params[4], 'daily_date': _daily['title']['date'] }) elif _heading_lvl == 4: if para.style.name in "List Paragraph": print(u"文档正文【明日工作计划】格式错误!") return if 'tomorrow' not in _daily: _daily['tomorrow'] = [] if len(_params) >= 4: _daily['tomorrow'].append({ 'sub_id': _params[0], 'summary': _params[1], 'date': _params[2], 'member': _params[3], 'daily_date': _daily['title']['date'] }) elif _heading_lvl == 5: if 'risk' not in _daily: _daily['risk'] = [] if len(_params) > 1: if u"描述" in _params[0]: _desc = _params[1].replace(":", "").replace( ":", "") elif u"应对" in _params[0]: _way = _params[1].replace(":", "").replace(":", "") if len(_desc) > 0 or len(_way) > 0: _daily['risk'].append({ "index": _step, "desc": _desc, "way": _way, 'daily_date': _daily['title']['date'] }) elif _heading_lvl == 6: if 'problem' not in _daily: _daily['problem'] = [] if len(_params) > 1: if u"描述" in _params[0]: _desc = _params[1].replace(":", "").replace( ":", "") elif u"应对" in _params[0]: _way = _params[1].replace(":", "").replace(":", "") if len(_desc) > 0 or len(_way) > 0: _daily['problem'].append({ "index": _step, "desc": _desc, "way": _way, 'daily_date': _daily['title']['date'] }) elif _heading_lvl == 7: if 'other' not in _daily: _daily['other'] = [] _step = 0 _daily['other'].append(para.text) if "Heading 1" in para.style.name: if u"总体目标" in para.text: _heading_lvl = 1 """总体目标完成百分比""" _daily['title']['total_percent'] = _params[0] elif u"阶段目标" in para.text: _heading_lvl = 2 elif u"今日工作" in para.text: _heading_lvl = 3 elif u"明日工作" in para.text: _heading_lvl = 4 elif u"风险" in para.text: _heading_lvl = 5 _step = -1 elif u"问题" in para.text: _heading_lvl = 6 _step = -1 else: _heading_lvl = 7 elif "Heading 2" in para.style.name: if _heading_lvl in [5, 6]: _step += 1 """去重:是否已录入""" _t = mongo_db.handler("pm_daily", "find_one", _daily['title']) if _t is None: """记录项目标题""" mongo_db.handler("pm_daily", "insert", _daily['title']) """记录总体目标情况""" _idx = 1 for _v in _daily['total_target']: _daily['title']['_id'] = build_id([ str(_idx), "total_target", _daily['title']['date'], _daily['title']['project_id'] ]) try: mongo_db.handler( "total_target", "insert", dict(_daily['title'].items() + _v.items())) except Exception, e: print e _idx += 1 """记录阶段目标情况""" _idx = 1 for _v in _daily['stage_target']: _daily['title']['_id'] = build_id([ str(_idx), "stage_target", _daily['title']['date'], _daily['title']['project_id'] ]) try: mongo_db.handler( "stage_target", "insert", dict(_daily['title'].items() + _v.items())) except Exception, e: print e _idx += 1 """记录当天任务执行情况""" _idx = 1 for _v in _daily['today']: _daily['title']['_id'] = build_id([ str(_idx), "today", _daily['title']['date'], _daily['title']['project_id'] ]) try: mongo_db.handler( "today_task", "insert", dict(_daily['title'].items() + _v.items())) except Exception, e: print e _idx += 1
def main(filter=None, mx=False, mday=22): global doc _sql, _bgdate, _eddate = build_sql('started', sys.argv[-2], sys.argv[-1]) """创建word文档实例 """ doc = DataHandler.crWord.createWord() """写入"主题" """ doc.addHead(u'《个人行为特征分析》报告', 0, align=WD_ALIGN_PARAGRAPH.CENTER) _print('>>> 报告生成日期【%s】 <<<' % time.ctime(), align=WD_ALIGN_PARAGRAPH.CENTER) write_title(_bgdate, _eddate) import mongodb_class db = mongodb_class.mongoDB() Personals = [] for _job in ['WORK_LOGS']: db.connect_db(_job) _cur = db.handler("worklog", "find", _sql) for _v in _cur: if _v.has_key('author'): if (filter is not None) and (filter not in _v['issue']): continue _job = _v['issue'].split('-')[0] if _v['author'] not in Personals: Personals.append(_v['author']) _print(u"I、个人工作行为特征", title=True, title_lvl=1) _print(u"本节针对每位员工,给出:") _print(u"1)工作日志情况:包含日志记录个数,日志信息量(字数),日志中包含有效关键字的情况," u"并对日志质量进行评价。") _print(u"2)工作范围;包含员工在产品研发和项目开发方面的工作投入情况。") _print(u"3)行为特征;包含员工在日常工作的重点方向和主要工作行为。") for _p in sorted(Personals): doc.addPageBreak() _print(_p, title=True, title_lvl=2) _list, _text, _row = WorkLogHandler.behavior_analysis(_p, _bgdate, _eddate, filter=filter, mday=mday) for _v in _text: _print(_v) _print(u"一、工作范围") doc.addTable(1, 3, col_width=(1, 1, 2)) _title = (('text', u'产品范围'), ('text', u'项目范围'), ('text', u'特征')) doc.addRow(_title) doc.addRow(_row[0]) _print(u"二、行为特征") doc.addTable(1, 3, col_width=(1.6, 1.6, 2)) _title = (('text', u'主题分布'), ('text', u'行为分布'), ('text', u'特征')) doc.addRow(_title) doc.addRow(_row[1]) if mx: _print(u"三、工作明细") doc.addTable(1, 4, col_width=(1, 1, 1, 3)) _title = (('text', u'日期'), ('text', u'任务'), ('text', u'工时'), ('text', u'内容'), ) doc.addRow(_title) for _v in _list: doc.addRow(_v) else: _print(u"三、工作特性") _print(u"%s执行%s,%s;%s,%s" % ( _list[-1][0][1], _list[-1][1][1], _list[-1][4][1], _list[-1][2][1], _list[-1][5][1])) doc.saveFile('behavior_analysis_report.docx')