Update 8092 bridge matching and construction plan view
This commit is contained in:
@@ -294,6 +294,7 @@ def init_db(conn):
|
|||||||
def ensure_db_schema(conn):
|
def ensure_db_schema(conn):
|
||||||
try:
|
try:
|
||||||
init_db(conn)
|
init_db(conn)
|
||||||
|
cleanup_site_records_after_retire(conn)
|
||||||
except sqlite3.OperationalError as error:
|
except sqlite3.OperationalError as error:
|
||||||
if 'locked' in str(error).lower():
|
if 'locked' in str(error).lower():
|
||||||
return False
|
return False
|
||||||
@@ -322,6 +323,61 @@ def _as_text(v):
|
|||||||
return str(v)
|
return str(v)
|
||||||
|
|
||||||
|
|
||||||
|
def _date_value(v):
|
||||||
|
m = re.match(r'^(\d{4})-(\d{2})-(\d{2})', _as_text(v).strip())
|
||||||
|
if not m:
|
||||||
|
return None
|
||||||
|
if m.group(0) in ('0000-00-00',):
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
return datetime(int(m.group(1)), int(m.group(2)), int(m.group(3))).date()
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _member_rows_for_site_work_day(name_to_members, kor_name, work_date):
|
||||||
|
# 사업관리 원본은 이름만 있어 재입사자가 같은 이름으로 중복 매칭될 수 있다.
|
||||||
|
# 같은 이름의 사번이 여러 개이면 작업일 기준으로 퇴사 전 사번/현재 사번을 나눠 붙인다.
|
||||||
|
members = name_to_members.get(_as_text(kor_name).strip()) or []
|
||||||
|
if len(members) <= 1:
|
||||||
|
return members
|
||||||
|
day = _date_value(work_date)
|
||||||
|
if not day:
|
||||||
|
return members
|
||||||
|
retired_valid = [m for m in members if m.get('retireDate') and day <= m['retireDate']]
|
||||||
|
if retired_valid:
|
||||||
|
return retired_valid
|
||||||
|
return [m for m in members if not m.get('retireDate') or day <= m['retireDate']]
|
||||||
|
|
||||||
|
|
||||||
|
def cleanup_site_records_after_retire(conn):
|
||||||
|
# 이미 저장된 사업관리 기록 중 같은 이름의 현재 사번이 존재하는데
|
||||||
|
# 퇴사 사번의 퇴사일 이후로 붙은 기록은 중복 집계 원인이므로 제거한다.
|
||||||
|
conn.execute(
|
||||||
|
'''
|
||||||
|
DELETE FROM site_worksheet_record
|
||||||
|
WHERE rowid IN (
|
||||||
|
SELECT s.rowid
|
||||||
|
FROM site_worksheet_record s
|
||||||
|
JOIN member oldm ON oldm.MemberNo = s.memberNo
|
||||||
|
WHERE IFNULL(oldm.retireFlag, '') NOT IN ('', '0000-00-00', '0000-00-00 00:00:00')
|
||||||
|
AND date(s.workDate) > date(substr(oldm.retireFlag, 1, 10))
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM member newm
|
||||||
|
WHERE newm.korName = oldm.korName
|
||||||
|
AND newm.MemberNo <> oldm.MemberNo
|
||||||
|
AND (
|
||||||
|
IFNULL(newm.retireFlag, '') IN ('', '0000-00-00', '0000-00-00 00:00:00')
|
||||||
|
OR date(s.workDate) <= date(substr(newm.retireFlag, 1, 10))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
def _find_col_key(cols, aliases):
|
def _find_col_key(cols, aliases):
|
||||||
if not cols:
|
if not cols:
|
||||||
return ''
|
return ''
|
||||||
@@ -1594,7 +1650,7 @@ def get_site_worksheet_records_by_days(conn, start_date, end_date, member_nos, r
|
|||||||
ph = ','.join(['?'] * len(member_nos))
|
ph = ','.join(['?'] * len(member_nos))
|
||||||
people_cur = conn.execute(
|
people_cur = conn.execute(
|
||||||
f'''
|
f'''
|
||||||
SELECT MemberNo, IFNULL(korName, '') AS korName
|
SELECT MemberNo, IFNULL(korName, '') AS korName, IFNULL(retireFlag, '') AS retireFlag
|
||||||
FROM member
|
FROM member
|
||||||
WHERE MemberNo IN ({ph})
|
WHERE MemberNo IN ({ph})
|
||||||
AND IFNULL(korName, '') <> ''
|
AND IFNULL(korName, '') <> ''
|
||||||
@@ -1602,8 +1658,11 @@ def get_site_worksheet_records_by_days(conn, start_date, end_date, member_nos, r
|
|||||||
member_nos
|
member_nos
|
||||||
)
|
)
|
||||||
name_to_members = {}
|
name_to_members = {}
|
||||||
for member_no, kor_name in people_cur.fetchall():
|
for member_no, kor_name, retire_flag in people_cur.fetchall():
|
||||||
name_to_members.setdefault(_as_text(kor_name).strip(), []).append(normalize_member_no(member_no))
|
name_to_members.setdefault(_as_text(kor_name).strip(), []).append({
|
||||||
|
'memberNo': normalize_member_no(member_no),
|
||||||
|
'retireDate': _date_value(retire_flag),
|
||||||
|
})
|
||||||
if not name_to_members:
|
if not name_to_members:
|
||||||
return {'rows': [], 'source': 'empty'}
|
return {'rows': [], 'source': 'empty'}
|
||||||
|
|
||||||
@@ -1772,8 +1831,9 @@ def get_site_worksheet_records_by_days(conn, start_date, end_date, member_nos, r
|
|||||||
found = 0
|
found = 0
|
||||||
for kor_name, job_type, work_text, note, person_count in cur.fetchall():
|
for kor_name, job_type, work_text, note, person_count in cur.fetchall():
|
||||||
found += 1
|
found += 1
|
||||||
matched_member_nos = name_to_members.get(_as_text(kor_name).strip()) or []
|
matched_members = _member_rows_for_site_work_day(name_to_members, kor_name, work_date)
|
||||||
for matched_member_no in matched_member_nos:
|
for matched_member in matched_members:
|
||||||
|
matched_member_no = matched_member.get('memberNo') if isinstance(matched_member, dict) else matched_member
|
||||||
conn.execute(
|
conn.execute(
|
||||||
'''
|
'''
|
||||||
INSERT OR REPLACE INTO site_worksheet_record
|
INSERT OR REPLACE INTO site_worksheet_record
|
||||||
@@ -1926,6 +1986,7 @@ def get_site_worksheet_records_by_days(conn, start_date, end_date, member_nos, r
|
|||||||
if progress is not None:
|
if progress is not None:
|
||||||
progress['phase'] = '달력 테이블 정리'
|
progress['phase'] = '달력 테이블 정리'
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
cleanup_site_records_after_retire(conn)
|
||||||
rebuild_work_calendar_tables(conn)
|
rebuild_work_calendar_tables(conn)
|
||||||
return {
|
return {
|
||||||
'rows': _site_record_rows_from_cache_for_members(conn, start_date, end_date, member_nos),
|
'rows': _site_record_rows_from_cache_for_members(conn, start_date, end_date, member_nos),
|
||||||
@@ -2147,6 +2208,7 @@ def get_member_site_worksheet_records(conn, start_date, end_date, member_no, ref
|
|||||||
if progress is not None:
|
if progress is not None:
|
||||||
progress['phase'] = '달력 테이블 정리'
|
progress['phase'] = '달력 테이블 정리'
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
cleanup_site_records_after_retire(conn)
|
||||||
rebuild_work_calendar_tables(conn)
|
rebuild_work_calendar_tables(conn)
|
||||||
return {'rows': _site_record_rows_from_cache(conn, start_date, end_date, member_no), 'source': 'erp_incremental', 'added': len(out)}
|
return {'rows': _site_record_rows_from_cache(conn, start_date, end_date, member_no), 'source': 'erp_incremental', 'added': len(out)}
|
||||||
|
|
||||||
|
|||||||
@@ -540,8 +540,8 @@
|
|||||||
<col style="width: 58px;">
|
<col style="width: 58px;">
|
||||||
<col style="width: 58px;">
|
<col style="width: 58px;">
|
||||||
<col style="width: 58px;">
|
<col style="width: 58px;">
|
||||||
<col style="width: 64px;">
|
<col style="width: 84px;">
|
||||||
<col style="width: 64px;">
|
<col style="width: 84px;">
|
||||||
<col style="width: 64px;">
|
<col style="width: 64px;">
|
||||||
<col style="width: 64px;">
|
<col style="width: 64px;">
|
||||||
<col style="width: 58px;">
|
<col style="width: 58px;">
|
||||||
@@ -662,6 +662,7 @@
|
|||||||
const text = String(value || '').trim();
|
const text = String(value || '').trim();
|
||||||
if (!text) return '-';
|
if (!text) return '-';
|
||||||
return text
|
return text
|
||||||
|
.replace(/\+/g, '+\n')
|
||||||
.replace(/~/g, '~\n')
|
.replace(/~/g, '~\n')
|
||||||
.replace(/=/g, '=\n')
|
.replace(/=/g, '=\n')
|
||||||
.replace(/\//g, '/\n')
|
.replace(/\//g, '/\n')
|
||||||
|
|||||||
Reference in New Issue
Block a user