Пример #1
0
    def create(self):
        db = Database()
        sql = "insert into project (name, createUser, description) values (%s, %s, %s)"
        flag = db.execute(sql, (self.name, self.create_user, self.description))

        print(flag)
        return flag
Пример #2
0
def request_news_time_series():
    L.info("Start update news time series.")

    with open('./json/DXYNews-TimeSeries.json', 'r') as file:
        data = json.load(file)
    L.info("\tRead {} lines from file".format(len(data)))

    db = Database()
    update_num = 0
    for line in data:
        key = [
            'id', 'provinceId', 'title', 'summary', 'infoSource', 'sourceUrl',
            'pubDate', 'province'
        ]
        data = db.select("select * from news where id={}".format(line['id']))
        if not data:
            update_num += 1
            sql = "insert into news (" + ','.join(
                key) + ") values (" + ', '.join(['%s' for k in key]) + ")"
            line['pubDate'] = TS2S(line['pubDate'] / 1000.0)
            if line['provinceId'] == "":
                line['provinceId'] = None
            line['summary'] = line['summary'][0:4096]
            if 'province' not in line:
                line['province'] = None
            params = [line[k] for k in key]
            db.execute(sql, params)
    L.info('\tUpdate {} news data.'.format(update_num))
Пример #3
0
def get_time_data(level=1, code=86):
    db = Database()
    whr = "" if level == 1 else " and region_parent={}".format(code)
    sql = '''select a.region_code, region_name, numb_confirmed, numb_suspected, numb_die, numb_ok, 
            a.data_date, DATE(tm) from patients a 
        join (SELECT region_code, max(data_date) as tm FROM patients 
            where region_level={}'''.format(level) + whr + ''' 
            group by region_code, DATE(data_date)) b 
            on a.region_code=b.region_code and a.data_date=b.tm order by data_date'''
    dts, latest, yesterday, _yesterday = {}, {}, None, None
    regions = get_regions(code, db)
    
    '''数据检查与填充'''
    def data_fill(date_):
        for p in regions:
            if p['code'] in dts[date_]: continue
            dts[date_][p['code']] = latest.get(p['code'], [p['code'], 0, p['name'], 0, 0, 0, 0, date_])
    for (code, name, confirmed, suspected, die, ok, tm, date_) in db.select(sql):
        date_ = str(date_)
        if date_ not in dts: 
            dts[date_] = {}
            '''昨日数据检查填补,以下四行 '''
            if yesterday: data_fill(yesterday)
            _yesterday = yesterday
            yesterday = date_
        '''新增计算 '''
        '''TODO: 地域判别,code可能不是直属地区'''
        add_c = confirmed - dts[_yesterday][code][1] if _yesterday and code > 0 else confirmed
        '''各地区缓存一份最新数据,用于数据填补''' 
        latest[code] = [code, confirmed, name, suspected, die, ok, add_c, str(tm)] 
        
        dts[date_][code] = latest[code]
    if yesterday: data_fill(yesterday)
 
    return dict((k, list(dts[k].values())) for k in dts)
Пример #4
0
def get_task_hint(user, pid=None, project=None):
    if project == "": project = None
    if not pid and not project: return []
    db = Database()
    params = [user]
    sql = '''select task, taskId, moduleId from record_day r left join user u 
        on u.username=r.user where u.orgId=(select orgId from user where username=%s) 
        and task is not null'''
    if pid == None or int(pid) == -1:
        sql += " and project=%s"
        params.append(project)
    else:
        sql += " and projectId=%s"
        params.append(pid)
    sql = "select task, taskId, moduleId from ({}) a group by task, taskId, moduleId".format(sql) 
    ts = {}
    for task, taskId, moduleId in db.selectEx(sql, params):
        if task not in ts: 
            ts[task] = [taskId, moduleId]
        else:
            if ts[task][0] == None: ts[task] = [taskId, moduleId]  
    '''End For'''
    data = [{'name': k, 'id': fid(v[0]), 'mid': fid(v[1]) } for k, v in ts.items()]
    
    return data
def get_region_citys():
    db = Database()
    sql = "select name, code, level, parent from region"
    regions = {}
    for (name, code, level, parent) in db.select(sql):
        if level > 2: continue
        if level == 0: continue
        one = code if level == 1 else parent
        if one not in regions: regions[one] = {'children': {}}
        if level == 1: regions[code]['name'] = name
        if level == 2:
            regions[parent]['children'][code] = {'name': name}
            '''别名缓存'''
            if name in REGION_SHORT:
                regions[parent]['children'][code]['names'] = set(
                    REGION_SHORT[name])
        '''End If 1'''
    '''End For'''
    '''
                    建立查找索引·将各地区名称-代码列表存入name_code,含别名
                     特点:常规市含“市”;自治州不含“州”
    '''
    for p in regions:
        regions[p]['name_code'] = {}
        for c, v in regions[p]['children'].items():
            regions[p]['name_code'][v['name']] = c
            for n in v.get('names', []):
                regions[p]['name_code'][n] = c

    return regions
Пример #6
0
def get_task_list(mid, create_user, category, department):
    db = Database()
    keys = ['id', 'name', 'moduleId', 'createUser', 'status', 'executor', 'createTime', 'description',
            'category', 'department', 'mark', 'progress', 'planEndTime', 'multiUser']
    sql, params = "select " + ','.join(keys) + ", IFNULL(uc, 0) userCount from task t left join \
        (select taskId, count(*) uc from \
            (select taskId, user from record_day where moduleId=%s group by taskId, user \
            ) a group by taskId \
        ) r on t.id=r.taskId \
        left join \
        (select taskId, max(updateTime) utm from record_day where moduleId=%s group by taskId \
        ) b on t.id=r.taskId where t.moduleId=%s", [mid, mid, mid]
    
    if create_user != '': 
        sql += " and createUser=%s"
        params.append(create_user)
    if category != '': 
        sql += " and category=%s"
        params.append(category)
    if department != '': 
        sql += " and department=%s"
    sql += " order by utm, status desc"
    
    data = db.read_all(sql, params)
    
    for line in data: 
        line['planEndTime'] = str(line['planEndTime'])
        line['createTime'] = str(line['createTime']) 
    
    return data
Пример #7
0
def get_rumor_data(keyword=None, type=None, page=None, num=None):
    db = Database()
    sql = "select * from rumor"
    has_where = False

    if keyword:
        if keyword == '北京':
            sql += " where mainSummary not like '%北京时间%' and (mainSummary like '%北京%' or title like '%北京%' or body like '%北京%')"
            has_where = True
        else:
            sql += " where (mainSummary like '%{}%' or title like '%{}%' or body like '%{}%')".format(keyword, keyword, keyword)
            has_where = True

    if type and 0 <= int(type) <= 2:
        if has_where:
            sql += " and rumorType={}".format(type)
        else:
            sql += " where rumorType={}".format(type)
            has_where = True

    rumor = db.selectDict(sql)

    if page and num and int(page) > 0 and int(num) > 0:
        page = int(page)
        num = int(num)
        return rumor[(page - 1) * num:page * num], len(rumor)
    else:
        return rumor[0:10], len(rumor)
def submit_record(user, jobs, plans):
    db = Database()
    comands = []

    jps, keys, texts = [{}, {}], ["job", "plan"], ["任务", "计划"]
    for i, rs in enumerate([jobs, plans]):
        for r in rs:
            w = WorkRecord()
            w.load_data(user, r)
            sql, params = w.get_sql(i)
            comands.append([sql, params])

            if w.task_id == None:
                if w.task == "": return False, "任务不能为空!"
                continue
            if int(w.task_id) == -1: continue
            if w.task_id in jps[i]: return False, "%s项重复!" % texts[i]
            jps[i][w.task_id] = w.progress

            flag, msg = check_record(w, jps[0], db, keys[i])
            if not flag: return flag, msg
        '''End For 2'''
    '''End For 1'''

    flag, data = db.Transaction(comands)
    if not flag: data = "请检查数据问题或今日是否已提交"

    return flag, data
Пример #9
0
def get_regions(code=86, db=None):
    if code == 86: return src_province
    if not db: db = Database()
    sql = "select code, name from region where parent=%s"
    return [{
        'name': name,
        'code': code
    } for (code, name) in db.select(sql, (code, ))]
Пример #10
0
    def create(self):
        db = Database()
        sql = "insert into module (projectId, name, createUser, description) values (%s, %s, %s, %s)"
        flag = db.execute(
            sql,
            (self.project_id, self.name, self.create_user, self.description))

        return flag
Пример #11
0
def getLatest(db=None):
    if not db: db = Database()
    dt = {}
    sql = '''select region_code, region_name, region_parent, max(data_date) from patients \
        group by region_code, region_name, region_parent'''
    for (code, name, parent, tm) in db.select(sql):
        dt['_'.join([str(code), name, str(parent)])] = tm

    return dt
Пример #12
0
def get_topic(date):
    sql = ''
    if date:
        sql = "select date, topic, new, dead from topic where DATE_FORMAT(date, '%Y%m%d') ='{}'".format(date)
    else:
        sql = "select date, topic, new, dead from topic order by date desc"
    db = Database()
    data = db.select(sql)
    return data
Пример #13
0
def request_rumor_type_data(rumor_type=0):
    error_times = 0
    db = Database()
    i = 0
    while i < 5:
        i += 1
        L.info("Preparing for type {} page {}".format(str(rumor_type), str(i)))

        time.sleep(3)
        rst = request_data(
            "https://lab.isaaclin.cn/nCoV/api/rumors?num=50&rumorType={}&page={}"
            .format(str(rumor_type), str(i)), str(i))

        if rst['success'] == False:
            if error_times == 10: break
            error_times += 1
            L.info(
                "This is the {} times fail at getting page {}, will try it again."
                .format(str(error_times), str(i)))
            i -= 1
            continue
        else:
            error_times = 0

        if not rst['results']:
            L.info(
                "Collecting type {} rumor data finished.".format(rumor_type))
            break

        comands = []
        for line in rst['results']:
            ks = line.keys()
            params = line['title']
            sql = "select * from rumor where title ='{}'".format(params)
            data = db.select(sql)

            if not data:
                sql = "insert into rumor (" + ','.join(
                    ks) + ") values (" + ', '.join(['%s' for k in ks]) + ")"
                params = [line[k] for k in ks]
                comands.append([sql, params])
        try:
            db.Transaction(comands)
            L.info("Writing database for {} rumor.".format(str(len(comands))))
        except Exception as e:
            if error_times == 10: break
            error_times += 1
            L.info(
                "This is the {} times fail at wirting database due to {}, will try this page again."
                .format(str(error_times), str(e)))
            i -= 1
            continue

    if error_times == 10:
        L.info("Collecting rumor data finished with error.")
    else:
        L.info("Collecting rumor data finished.")
Пример #14
0
    def create(self):
        db = Database()
        sql = "insert into task (projectId, moduleId, name, createUser, description, planEndTime, executor) \
            values (%s, %s, %s, %s, %s, %s, %s)"

        flag = db.execute(
            sql, (self.project_id, self.module_id, self.name, self.create_user,
                  self.description, self.plan_end_time, self.executor))
        return flag
Пример #15
0
def generate_topics():
    L.info("Start update topic.")
    db = Database()
    db.run("delete from topic")
    data = db.select("select pubDate, summary from news order by pubDate asc")
    now = datetime.date(2019, 12, 31)
    news = ""
    topic = {}
    today = []
    yesterday = []
    dead = []
    new = []
    sql = "insert into topic (date, topic, dead, new) values (%s, %s, %s, %s)"

    for line in data:
        if line[0].date() == now:
            news += line[1]
        else:
            topic.clear()
            today.clear()
            for keyword, weight in textrank(news, topK=40, withWeight=True):
                topic[keyword] = weight
                today.append(keyword)
            for keyword in today:
                if keyword not in yesterday:
                    new.append(keyword)
            for keyword in yesterday:
                if keyword not in today:
                    dead.append(keyword)
            db.execute(sql, [
                now.strftime("%Y-%m-%d %H:%M:%S"),
                str(topic),
                str(dead),
                str(new)
            ])
            L.info("\tNow processing {}".format(now.strftime("%Y-%m-%d")))
            now = line[0].date()
            news = line[1]
            yesterday = today.copy()
            new.clear()
            dead.clear()

    topic.clear()
    today.clear()
    for keyword, weight in textrank(news, topK=20, withWeight=True):
        topic[keyword] = weight
        today.append(keyword)
    for keyword in today:
        if keyword not in yesterday:
            new.append(keyword)
    for keyword in yesterday:
        if keyword not in today:
            dead.append(keyword)
    db.execute(
        sql,
        [now.strftime("%Y-%m-%d %H:%M:%S"),
         str(topic),
         str(dead),
         str(new)])
    L.info("\tFinished update topic.")
Пример #16
0
def import_region():
    db = Database()
    lines = []
    levels = {'province': 1, 'city': 2, 'district': 3}
    with open("geojson/adcode-map.json", encoding='utf8') as load_f:
        dt = json.load(load_f)
        for item in dt:
            sql = "insert into region (name, code, level) values (%s, %s, %s)"
            param = (item['name'], item['adcode'], levels[item['level']])
            lines.append([sql, param])
    db.Transaction(lines)
def get_region_data(code=86):
    db = Database()
    sql = '''
        select name, geometry_type, geometry_coordinates, point_type, point_coordinates,
             data_date from patient_pos where province_code=%s
    '''
    lines = []
    for (name, tp, coords, p_tp, p_coords, tm) in db.select(sql, (code, )):
        lines.append([name, tp, coords, p_tp, p_coords, str(tm)])

    return lines
Пример #18
0
def login_out(user, ip='', address=''):
    del_token(user)
    db = Database()

    sqlU, paramsU = (
        "update user set onlineStatus = %s where userName = %s"), (0, user)
    sqlL, paramsL = ("insert into logs (user, ip, style, createTime, address) values (%s, %s, 1, %s, %s)"), \
        (user, ip, TM(), address)
    db.Transaction([[sqlU, paramsU], [sqlL, paramsL]])

    return {}
Пример #19
0
def import_region_special():
    db = Database()
    lines = []
    levels = {'province': 1, 'city': 2, 'district': 3}
    for key in ["110000", "500000", "120000", "310000"]:
        with open("geojson/" + key + ".json", encoding='utf8') as load_f:
            dt = json.load(load_f)
            for item in dt["features"]:
                sql = "insert into region (name, code, level, parent) values (%s, %s, %s, %s)"
                param = (item['properties']['name'], item['id'], 2, key)
                lines.append([sql, param])
    db.Transaction(lines)
Пример #20
0
def add_city_code():
    db = Database()
    sql = "select id, region_name, region_parent FROM patients WHERE region_level=2 and region_code=0"
    comands = []
    for (id_, name, parent) in db.select(sql):
        code = check_city(name, parent)
        if not code:
            print(parent, name, code)
            continue
        sql = "update patients set region_code=%s where id=%s"
        comands.append([sql, (code, id_)])
    db.Transaction(comands)
def import_data_from_files():
    db = Database()
    idx = 0
    for filename in get_files():
        idx += 1
        print(filename)
        commands = load_file_province(filename)
        db.Transaction(commands)
        print(idx, "OK! ")

    print("Finished!")
    for c in Position.Errors:
        print("未识别的城市:{}, {}处".format(c, Position.Errors[c]))
Пример #22
0
def set_region_parent():
    db = Database()
    sql = "select name, code, level from region"
    for (name, code, level) in db.select(sql):
        if len(str(code)) < 6:
            print('code short:', name, code, level)
            continue
        line = []
        if level == 1: line = [code, 86] 
        elif level == 2: line = [code, str(code)[:2] + "0000"]
        elif level == 3: line = [code, str(code)[:4] + "00"]    
        sql = "update region set parent = %s where code = %s"
        db.execute(sql, (line[1], line[0]))
Пример #23
0
def get_data_latest(level = 1, code=86):
    db = Database()
    whr = "" if level == 1 else " and region_parent={}".format(code)
    sql = '''select a.region_code, region_name, numb_confirmed, numb_suspected, numb_die, numb_ok, 
            a.data_date from patients a 
        join (SELECT region_code, max(data_date) as tm FROM patients 
            where region_level={}'''.format(level) + whr + ''' 
            group by region_code) b 
            on a.region_code=b.region_code and a.data_date=b.tm'''
    lines = []
    for (code, name, confirmed, suspected, die, ok, tm) in db.select(sql):
        lines.append([code, confirmed, name, suspected, die, ok, str(tm)])
        
    return lines
Пример #24
0
def add_change(user, t_id, plan_time, progress, reason):
    db = Database()
    '''获取任务基本信息'''
    sql = "select planEndTime, multiUser from task where id=%s"
    cnx, cursor = db.Query(sql, (t_id, ))
    src_time, multi_user = cursor.fetchone()
    
    '''获取历史变更信息'''
    sql = "select id, executor, createTime from plan_change where taskId=%s order by createTime desc limit 1 for update"
    cursor = db.select(sql, (t_id, ))
    line = cursor.fetchone()
    flag = True  
    
    if line:
        _, executor, tm = line
        '''协同任务或该用户已提交计划未执行'''
        if multi_user or executor == user: 
            sql = "select count(*) from record_day where taskId=%s and workday>%s "
            db.select(sql, (t_id, tm), cursor)
            count = cursor.fetchone()[0]
            if count == 0: flag = False
        '''End If 2'''
    '''End If 1'''
             
    '''有已更改的计划暂未实施,不能新增'''
    if not flag: 
        cursor.close()
        return False, "该任务有已更改的计划暂未实施,不能新增''"
    
    sql = "insert into plan_change (taskId, srcTime, planTime, changeUser, executor, progress, reason, multiUser) \
        values (%s, %s, %s, %s, %s, %s, %s, %s)"
    params = (t_id, src_time, plan_time, user, user, progress, reason, multi_user)
    flag, _ = db.Transaction([[sql, params]], cnx, cursor)
    
    return flag, "操作失败"
Пример #25
0
def detection_data_citys():
    db = Database()
    unknowns = {}    
    sql = '''SELECT region_parent, region_name FROM patients WHERE region_level=2 
        group by region_parent, region_name'''
    for (parent, name) in db.select(sql):
        if parent not in REGIONS:
            L.error("Not in Region Source: {}".format(parent))
            continue
        if check_city(name, parent): continue
        
        if parent not in unknowns: unknowns[parent] = set()
        unknowns[parent].add(name)

    for p in unknowns:
        print('----------------------')
        print([v['name'] for v in REGIONS[p]['children'].values()])
        print(list(unknowns[p]))
Пример #26
0
def request_data_time_series():
    L.info("Start update data time series.")
    needed = {}
    for p in SP:
        if p['name'] == '香港特别行政区':
            needed['香港'] = p
        if p['name'] == '澳门特别行政区':
            needed['澳门'] = p
        if p['name'] == '台湾省':
            needed['台湾'] = p
        needed[p['name']] = p

    with open('./json/DXYArea-TimeSeries.json', 'r') as file:
        data = json.load(file)

    db = Database()
    history = getLatest(db)
    lines = []
    for province in data:
        if province["provinceName"] in needed:
            p = needed[province["provinceName"]]
            translate([province], p, lines)

    L.info("\tRead {} lines from file".format(len(lines)))

    comands = []
    for line in lines:
        '''排除已有历史数据'''
        key = '_'.join([
            str(line['region_code']), line['region_name'],
            str(line['region_parent'])
        ])
        if key in history and not date_less(history[key], line['data_date']):
            continue
        ks = line.keys()
        sql = "insert into patients (" + ','.join(
            ks) + ") values (" + ', '.join(['%s' for k in ks]) + ")"
        params = [line[k] for k in ks]
        comands.append([sql, params])

    L.info("\tNew data lines count:" + str(len(comands)))
    if len(comands) > 0:
        db.Transaction(comands)
Пример #27
0
def generate_weibo_topics():
    L.info("Start update weibo topic.")
    db_weibo = pymysql.connect("localhost", "root", "root", "weibo")
    cursor = db_weibo.cursor()
    cursor.execute(
        "select publish_time, content from weibo order by publish_time asc")
    data = cursor.fetchall()

    db = Database()
    now = datetime.date(2019, 12, 31)
    news = ""
    topic = {}
    sql = "insert into topic (date, topic) values (%s, %s)"

    for line in data:
        if line[0].date() == now:
            news += line[1]
        else:
            topic.clear()
            for keyword, weight in textrank(news, topK=20, withWeight=True):
                topic[keyword] = weight
            db.execute(sql, [now.strftime("%Y-%m-%d %H:%M:%S"), str(topic)])
            L.info("\tNow processing {}".format(now.strftime("%Y-%m-%d")))
            now = line[0].date()
            news = line[1]

    topic.clear()
    for keyword, weight in textrank(news, topK=20, withWeight=True):
        topic[keyword] = weight
    db.execute(sql, [now.strftime("%Y-%m-%d %H:%M:%S"), str(topic)])
    L.info("\tFinished update weibo topic.")
def get_module_list(pid, create_user, category, department):
    db = Database()
    keys = [
        'id', 'name', 'projectId', 'createUser', 'status', 'manager',
        'createTime', 'description', 'category', 'department', 'mark'
    ]
    sql, params = "select " + ','.join(
        keys) + " from module where projectId=%s", [pid]
    if create_user != '':
        sql += " and createUser=%s"
        params.append(create_user)
    if category != '':
        sql += " and category=%s"
        params.append(category)
    if department != '':
        sql += " and department=%s"
    sql += " order by createTime desc"

    data = db.read_all(sql, params)
    for line in data:
        line['createTime'] = str(line['createTime'])

    return data
Пример #29
0
def request_rumor_time_series():
    L.info("Start update rumor time series.")
    with open('./json/DXYRumors-TimeSeries.json', 'r') as file:
        data = json.load(file)
    L.info("\tRead {} lines from file".format(len(data)))
    db = Database()
    update_num = 0
    for line in data:
        key = [
            'id', 'title', 'mainSummary', 'body', 'sourceUrl', 'rumorType',
            'crawlTime'
        ]
        data = db.select("select * from rumor where id={}".format(line['id']))
        if not data:
            update_num += 1
            sql = "insert into rumor (" + ','.join(
                key) + ") values (" + ', '.join(['%s' for k in key]) + ")"
            line['crawlTime'] = TS2S(line['crawlTime'] / 1000.0)
            line['mainSummary'] = line['mainSummary'][0:1024]
            line['body'] = line['body'][0:1024]
            params = [line[k] for k in key]
            db.execute(sql, params)
    L.info('\tUpdate {} rumor data.'.format(update_num))
Пример #30
0
def get_task_control(t_id, user=None, db=None):
    if not db: db = Database()
    
    '''取任务下所有人的最后提交记录'''
    sqlR = '''select r.user, updateTime, progress from record_day r right join (
        select max(updateTime) tm from record_day where taskId=%s
    ) a on r.updateTime=a.tm where taskId=%s order by progress desc limit 1
    '''
    '''取任务下的最新变更记录'''
    sqlP = '''select a.executor, updateTime, progress, multiUser from plan_change a right join 
          (select max(updateTime) tm from plan_change b where taskId=%s) b
        on a.updateTime=b.tm where taskId=%s order by progress limit 1  
    '''
    rec = db.selectLine(sqlR, (t_id, t_id))
    pla = db.selectLine(sqlP, (t_id, t_id))
    
    '''逻辑说明:
        1.无计划变更则以最后提交为准,无则为0
        2.有计划变更则以最新时间对应的进度为准
        注:提交时需检查进度合法性
        progress - 是否协作任务且今日已由其他人设置。
        注:若有最新计划变更,则协作任务不受其他成员今日进度限制
    '''
    info = {'min': 0, 'progress': None}
    if rec:
        ru, rt, rp = rec
        info['min'] = rp
        '''今日他人已设置'''
        if user != ru and is_today(rt): info['progress'] = rp
        '''有计划则看时间'''
        if pla and pla[1] > rt: info['min'], info['progress'] = pla[2], None  
    else:
        '''无提交但有计划变更,则以计划为准'''
        if pla: info['min'] = pla[2] 
    '''End If'''
    
    return info