Exemple #1
0
 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
Exemple #3
0
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}
Exemple #4
0
    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}
Exemple #6
0
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)
Exemple #7
0
 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 = []
Exemple #8
0
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)

    """插入分页"""
Exemple #9
0
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()
Exemple #10
0
# -*- 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')
Exemple #12
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')
Exemple #13
0
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))
Exemple #14
0
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
Exemple #17
0
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')