55 Commits

Author SHA1 Message Date
Danamir
86713fc75f uncommited changes 2025-11-10 08:11:46 +03:00
Danamir
c24a1fa8c6 Last coommit before refactoring 2025-08-04 10:33:21 +03:00
1c33775f92 fixed table 2024-05-22 15:58:16 +03:00
43ab114e1a fixed table 2024-05-22 13:42:52 +03:00
946ad5c31f add sorting func 2024-05-18 20:58:55 +03:00
Your Name
7b956d89bf merge head by alembic 2024-05-06 08:29:58 -04:00
0891abc0e1 add fumc for login 2024-05-06 15:23:24 +03:00
08393f6685 Merge branch 'main' of https://git.danamir.su/danamir/asuinventory 2024-05-06 15:15:23 +03:00
9cde4e2c7d add readexcell func 2024-05-06 15:14:47 +03:00
Your Name
0a60a16344 bug fix 2024-04-09 23:52:19 +03:00
Your Name
496ef3fa9d bug fix 2024-04-09 23:51:48 +03:00
Your Name
3494e5d17c Merge branch 'main' of https://git.danamir.su/danamir/asuinventory 2024-04-08 10:49:58 +03:00
Your Name
29b0070260 add reload page 2024-04-08 10:47:54 +03:00
Your Name
2e9cc918d5 update db schema 2024-04-05 01:26:46 +03:00
Your Name
d943894ae8 all done2 2024-04-04 22:55:38 +03:00
Your Name
1c901ddb00 all done 2024-04-04 22:51:45 +03:00
Your Name
f9a188c927 add data to db 2024-04-04 20:00:26 +03:00
Your Name
1fce4b41c0 add modal fucnc 2024-04-04 19:31:07 +03:00
Your Name
7ccbba06c1 add click on row 2024-04-04 12:48:43 +03:00
Your Name
63115f0328 asdsadsa 2024-04-03 23:28:55 +03:00
cb862c63a6 add new func 2024-04-03 22:50:16 +03:00
927d8d75a9 edit db scheme 2024-04-03 22:37:57 +03:00
509a3ee913 edit gitignore 2024-04-03 22:31:08 +03:00
86f0f9d977 db check 2024-04-03 22:24:02 +03:00
0c4bf4b9fd 12333 2024-04-03 20:05:36 +03:00
d71945ecb2 11111 2024-04-03 20:02:05 +03:00
3cd5fe63b5 12311 2024-04-03 20:01:50 +03:00
0c6001b297 Resolve merge conflict by incorporating both suggestions 2024-04-03 19:58:22 +03:00
682b6c4ffd 1112 2024-04-03 19:57:28 +03:00
9c859d4660 111 2024-04-03 19:55:02 +03:00
Your Name
f6b720e4eb Merge branch 'dev' of https://git.danamir.su/danamir/asuinventory into dev 2024-04-03 12:17:54 +03:00
Your Name
2fda39a449 123 2024-04-03 12:11:33 +03:00
291e5d0e25 db upgrade 2024-04-03 12:08:40 +03:00
45d8dfd870 change js 2024-04-03 12:04:44 +03:00
Your Name
4c6166c907 add to model 2024-04-02 23:09:27 +03:00
Your Name
2c51bdc695 Merge branch 'dev' 2024-04-02 23:07:44 +03:00
Your Name
c2f3f10c9b add to model 2024-04-02 23:04:45 +03:00
Your Name
f1c755c6ec 123 2024-04-02 22:59:04 +03:00
d2b01f56ec Merge branch 'dev' of https://git.danamir.su/danamir/asuinventory into dev 2024-04-02 22:50:42 +03:00
34ea972560 add new fictures 2024-04-02 22:50:36 +03:00
87c4ebe33e db schema update 2024-04-02 16:34:06 +03:00
Your Name
3a3e62a375 111 2024-04-01 22:43:02 +03:00
Your Name
bf93bf0fdb local changes 2024-04-01 22:37:14 +03:00
Your Name
027b1dc855 1111 2024-04-01 22:35:26 +03:00
4a47746e9d merge 2024-04-01 15:21:43 +03:00
12a63278f7 Merge branch 'dev' 2024-04-01 15:17:53 +03:00
294d646bb6 remove cache 2024-04-01 15:17:12 +03:00
e464960fe5 rename column to model 2024-04-01 15:11:24 +03:00
1b472f4fee some func 2024-04-01 13:05:38 +03:00
54c61b9756 some func 2024-04-01 13:05:06 +03:00
68e50ee4a8 123 2024-04-01 13:01:51 +03:00
Your Name
965695a693 add raspologenie and vde numbers 2024-03-31 23:33:26 +03:00
Your Name
b47e9391ba add bug 2024-03-27 09:45:57 +03:00
Your Name
5259dc5292 sss 2024-03-26 23:03:26 +03:00
Your Name
a6eea28071 add funce 2024-03-26 23:02:37 +03:00
57 changed files with 1692 additions and 241 deletions

13
.gitignore vendored
View File

@@ -2,13 +2,10 @@
.vscode .vscode
instance instance
venv/ venv/
__pychache__/
123 123
*.csv
*.db
zabalans.csv
project.db
c*.txt c*.txt
migrations
__pycache__
.idea

BIN
VedomostMOL.xls Normal file

Binary file not shown.

BIN
VedomostMOL.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

0
addoborudtodb Normal file
View File

183
app.py
View File

@@ -6,7 +6,7 @@ from flask_migrate import Migrate
from datetime import * from datetime import *
import csv import csv
import random import random
from urllib.parse import unquote
app = Flask(__name__) app = Flask(__name__)
@@ -21,7 +21,13 @@ db.init_app(app)
migrate = Migrate(app, db) migrate = Migrate(app, db)
@app.route("/", methods=['GET', 'POST'])
@app.route("/login", methods=['GET', 'POST'])
def login():
return render_template('login.html')
@app.route("/", methods=['GET', 'POST'])
def index(): def index():
results = [] results = []
results1 = [] results1 = []
@@ -45,7 +51,7 @@ def index():
results1.append(s.nazvanie) results1.append(s.nazvanie)
aud = db.session.get(Auditory, s.aud_id) aud = db.session.get(Auditory, s.aud_id)
results1.append(aud.audnazvanie) results1.append(aud.audnazvanie)
return render_template('index.html', aud=all_aud, results=results, res1=results1) return render_template('index.html', aud=all_aud, results=results, res1=results1)
return render_template('index.html', aud=all_aud, results=results, res1=results1) return render_template('index.html', aud=all_aud, results=results, res1=results1)
@@ -77,10 +83,12 @@ def searchonaud():
results = [] results = []
for auditory, oboruds in q: for auditory, oboruds in q:
results.append({ results.append({
'num_ved': oboruds.numberved,
'auditory_id': auditory.id, 'auditory_id': auditory.id,
'auditory_name': auditory.audnazvanie, 'auditory_name': auditory.audnazvanie,
'inv_number': oboruds.invNumber, 'inv_number': oboruds.invNumber,
'oboruds_id': oboruds.nazvanie, 'oboruds_id': oboruds.nazvanie,
'raspolog': oboruds.raspologenie,
}) })
return jsonify(results) return jsonify(results)
@@ -88,7 +96,7 @@ def searchonaud():
return render_template('searchonaud.html', aud=all_aud, res=res) return render_template('searchonaud.html', aud=all_aud, res=res)
@app.route("/addaudtodb", methods=['GET', 'POST']) @app.route("/addaudtodb", methods=['GET', 'POST'])
def addaudtodb(): def addaudtodb():
if request.method == 'POST': if request.method == 'POST':
aud = request.form.get('auditory') aud = request.form.get('auditory')
@@ -111,25 +119,38 @@ def addoborudtodb():
@app.route('/all') @app.route('/all')
def alloborud(): def alloborud():
return render_template('all.html')
result = db.session.query(Oboruds).order_by(Oboruds.invNumber).all()
res = [] @app.route('/getall')
def getall():
oborud = db.session.query(Oboruds).order_by(Oboruds.invNumber).all()
for ob in result: results = []
if ob.aud_id is not None: for oboruds in oborud:
aud = db.session.query(Auditory).filter_by(id=ob.aud_id).first() if oboruds.aud_id is None:
res.append([ob.invNumber, ob.nazvanie, aud.audnazvanie]) results.append({
'invNumber': oboruds.invNumber,
'nazvanie': oboruds.nazvanie,
'raspologenie': oboruds.raspologenie,
'balancenumber': oboruds.balancenumber,
'kolichestvo': oboruds.kolichestvo,
'numberppasu': oboruds.numberppasu,
'numberved': oboruds.numberved,
'aud': ""})
else: else:
res.append([ob.invNumber, ob.nazvanie]) aud = db.session.query(Auditory).filter_by(id=oboruds.aud_id).first()
results.append({
'invNumber': oboruds.invNumber,
'nazvanie': oboruds.nazvanie,
'raspologenie': oboruds.raspologenie,
'balancenumber': oboruds.balancenumber,
'kolichestvo': oboruds.kolichestvo,
'numberppasu': oboruds.numberppasu,
'numberved': oboruds.numberved,
'aud': aud.audnazvanie})
return render_template('all.html', res=res) return jsonify(results)
@app.route('/updateduplicate', methods=['GET', 'POST'])
def updateduplicate():
if request.method == 'POST':
aud = request.form.get('auditory_dubl')
@app.route('/vneaud', methods=['GET', 'POST']) @app.route('/vneaud', methods=['GET', 'POST'])
@@ -140,12 +161,12 @@ def vneaud():
ak = db.session.query(Oboruds).all() ak = db.session.query(Oboruds).all()
for dt in data: for dt in data:
res.append([dt.invNumber, dt.nazvanie, dt.typeBalanse]) res.append([dt.invNumber, dt.nazvanie])
return render_template('vneaud.html', res=res, kolvo=len(data), all_kol=len(ak)) return render_template('vneaud.html', res=res, kolvo=len(data), all_kol=len(ak))
@app.route('/zametki', methods=['GET', 'POST']) @app.route('/zametki', methods=['GET', 'POST'])
def zametki(): def zametki():
zam = db.session.query(Zametki).filter(Zametki.rmdt == None).all() zam = db.session.query(Zametki).filter(Zametki.rmdt == None).all()
if request.method == 'POST': if request.method == 'POST':
@@ -168,7 +189,7 @@ def js2():
return jsonify({'success': True}), 200, {'ContentType': 'application/json'} return jsonify({'success': True}), 200, {'ContentType': 'application/json'}
@app.route('/zamsearch', methods=['GET', 'POST']) @app.route('/zamsearch', methods=['GET', 'POST'])
def zamsearch(): def zamsearch():
p = request.form.get('srch') p = request.form.get('srch')
@@ -176,48 +197,61 @@ def zamsearch():
Zametki.txtzam.contains(p)).ll() Zametki.txtzam.contains(p)).ll()
zam = [] zam = []
for item in searchedZam: for item in searchedZam:
zam.append([item.txtzam, item.created_date]) zam.append([item.txtzam, item.created_date])
return render_template('zametki.html', zam=zam) return render_template('zametki.html', zam=zam)
@app.route('/addraspved', methods=['GET', 'POST']) @app.route('/addraspved', methods=['GET', 'POST'])
def addraspved(): def addraspved():
if request.method == 'POST': if request.method == 'POST':
query_string = request.data query_string = request.data.decode()
# Convert the bytes object to a string
query_string_str = query_string.decode("utf-8")
# Split the query string by '&' to get individual key-value pairs un_query_string = unquote(unquote(query_string)).split(',')
key_value_pairs = query_string_str.split("&")
# Create a dictionary to store the key-value pairs ob = db.session.query(Oboruds).filter_by(invNumber=un_query_string[0]).first()
query_dict = {}
for pair in key_value_pairs:
key, value = pair.split("=")
query_dict[key] = value
# Retrieve the values for specific keys ob.numberved = un_query_string[1]
rasp_value = query_dict.get("rasp") ob.kolichestvo = un_query_string[2]
ved_value = query_dict.get("ved") ob.balancenumber = un_query_string[3]
ob.raspologenie = un_query_string[4]
print(f"Value for 'rasp': {rasp_value}") db.session.commit()
print(f"Value for 'ved': {ved_value}") db.session.close()
return jsonify({'success': True}, 200, {'ContentType': 'application/json'})
@app.route('/addoborudasu', methods=['GET', 'POST'])
def addoborud():
if request.method == 'POST':
query_string = request.data.decode()
return jsonify({'success': True}, 200, {'ContentType': 'application/json'}) un_query_string = unquote(unquote(query_string)).split(',')
db.session.add(
Oboruds(invNumber=un_query_string[0],
nazvanie=un_query_string[5],
raspologenie=un_query_string[4],
numberved=un_query_string[1],
kolichestvo=un_query_string[2],
balancenumber=un_query_string[3]
)
)
db.session.commit()
return jsonify({'success': True}, 200, {'ContentType': 'application/json'})
# ================================================================================== # ==================================================================================
def ranomraspr(): def ranomraspr():
with app.app_context(): with app.app_context():
while len(db.session.query(Oboruds).filter(Oboruds.aud_id == None).all()) > 0: while len(db.session.query(Oboruds).filter(Oboruds.aud_id is None).all()) > 0:
audid = random.choice(db.session.query(Auditory).all()) audid = random.choice(db.session.query(Auditory).all())
oborud = random.choice(db.session.query(Oboruds).filter(Oboruds.aud_id == None).all()) oborud = random.choice(db.session.query(Oboruds).filter(Oboruds.aud_id is None).all())
oborud.aud_id = audid.id oborud.aud_id = audid.id
db.session.commit() db.session.commit()
def createdb(): def createdb():
@@ -259,23 +293,52 @@ def createdb():
for row in csv_reader: for row in csv_reader:
db.session.add( db.session.add(
Oboruds(invNumber=row[0], nazvanie=row[1], typeBalanse='баланс')) Oboruds(invNumber=row[0], nazvanie=row[1], typeBalanse='баланс'))
db.session.commit()
"""
with open('zabalans.csv', encoding='utf-8') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=';')
for row in csv_reader:
print(row)
db.session.add(
Oboruds(invNumber=row[0], nazvanie=row[1], typeBalanse="забаланс"))
db.session.commit() db.session.commit()
"""
def write2excell():
wb = xlrd.open_workbook("VedIsh.xls")
sheet = wb.sheet_by_index(0)
newFile = copy(wb)
newSheet = newFile.get_sheet(0)
invNomerColum = 6
column_index = 1
for row_idx in range(sheet.nrows):
cell_value = sheet.cell(row_idx, column_index)
if cell_value:
tmp_inv_number = str(cell_value).split(':')[1]
try:
a = tmp_inv_number[1:-1]
inv_number = int(tmp_inv_number[1:-1])
with app.app_context():
auditory_obj = db.session.query(Auditory).join(Oboruds, Oboruds.aud_id == Auditory.id).filter(
Oboruds.invNumber == inv_number).first()
print(auditory_obj.audnazvanie)
# cur.execute("SELECT aud.audnazvanie FROM oboruds AS ob JOIN auditory AS aud ON ob.aud_id = aud.id WHERE ob.invNumber = ?", (inv_number,))
except:
pass
"""
else:
#newSheet.write(row_idx, invNomerColum, "Нет инв номера")
pass
newFile.save("Ved31.xls")
"""
if __name__ == '__main__': if __name__ == '__main__':
#write2excell()
#ranomraspr() app.run(debug=True, host='0.0.0.0', port='3800')
#createdb()
app.run(debug=True, host='0.0.0.0', port='3800')

5
backend/create_new_db.py Normal file
View File

@@ -0,0 +1,5 @@
from backend.models import Base
from backend.database import engine
Base.metadata.drop_all(bind=engine) # Опционально, если вдруг есть
Base.metadata.create_all(bind=engine)

15
backend/database.py Normal file
View File

@@ -0,0 +1,15 @@
# backend/database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
SQLALCHEMY_DATABASE_URL = "sqlite:///./app.db" # или PostgreSQL URL
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

37
backend/main.py Normal file
View File

@@ -0,0 +1,37 @@
# backend/main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from backend.routers.equipment_types import equipment_types
from backend.routers.auditories import auditories
from backend.routers.oboruds import oboruds
from backend.routers.components import components
from backend.routers.rashodniki import consumables
from backend.routers.zametki import zametki
app = FastAPI()
# Для фронтенда Vue.js
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # заменить на ['http://localhost:5173'] для безопасности
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/ping")
def ping():
return {"message": "pong"}
# Подключение роутов
app.include_router(equipment_types)
app.include_router(auditories)
app.include_router(oboruds)
app.include_router(components)
app.include_router(consumables)
app.include_router(zametki)

69
backend/migrate_data.py Normal file
View File

@@ -0,0 +1,69 @@
import sys
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
from backend.database import SessionLocal as NewSession
from backend import models
OLD_DB_URL = "sqlite:///./backend/old_app.db"
old_engine = create_engine(OLD_DB_URL, connect_args={"check_same_thread": False})
OldSession = sessionmaker(bind=old_engine)
old_db = OldSession()
new_db = NewSession()
def log(msg: str):
print(f"[INFO] {msg}", file=sys.stderr)
def migrate():
log("Запуск переноса данных из old_app.db → app.db")
# Тип оборудования по умолчанию
log("Добавление типа оборудования по умолчанию: 'Неизвестно'")
default_type = models.EquipmentType(name="Неизвестно")
new_db.add(default_type)
new_db.commit()
# Перенос аудиторий
log("Перенос аудиторий...")
auditory_map = {}
aud_rows = old_db.execute(text("SELECT id, audnazvanie FROM auditory")).fetchall()
for aud in aud_rows:
new_aud = models.Auditory(audnazvanie=aud.audnazvanie)
new_db.add(new_aud)
new_db.flush()
auditory_map[aud.id] = new_aud.id
log(f" → перенесено: {len(aud_rows)}")
# Перенос оборудования
log("Перенос оборудования...")
ob_rows = old_db.execute(text("SELECT * FROM oboruds")).fetchall()
for ob in ob_rows:
new_ob = models.Oboruds(
invNumber=ob.invNumber,
nazvanie=ob.nazvanie,
raspologenie=ob.raspologenie,
numberppasu=ob.numberppasu,
kolichestvo=ob.kolichestvo,
aud_id=auditory_map.get(ob.aud_id),
type_id=default_type.id
)
new_db.add(new_ob)
log(f" → перенесено: {len(ob_rows)}")
# Перенос заметок
log("Перенос заметок...")
z_rows = old_db.execute(text("SELECT * FROM zametki")).fetchall()
for z in z_rows:
new_z = models.Zametki(
txtzam=z.txtzam,
created_date=z.created_date,
rmdt=z.rmdt
)
new_db.add(new_z)
log(f" → перенесено: {len(z_rows)}")
new_db.commit()
log("✅ Перенос завершён успешно.")
if __name__ == "__main__":
migrate()

82
backend/models.py Normal file
View File

@@ -0,0 +1,82 @@
# backend/models.py
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship, declarative_base
import datetime
from flask_sqlalchemy import SQLAlchemy
Base = declarative_base()
db = SQLAlchemy()
class Auditory(Base):
__tablename__ = 'auditories'
id = Column(Integer, primary_key=True)
audnazvanie = Column(String)
oboruds = relationship("Oboruds", back_populates="auditory")
class EquipmentType(Base):
__tablename__ = 'equipment_types'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True, nullable=False)
oboruds = relationship("Oboruds", back_populates="type")
class Oboruds(Base):
__tablename__ = 'oboruds'
id = Column(Integer, primary_key=True)
invNumber = Column(Integer)
nazvanie = Column(String(500))
raspologenie = Column(String(200))
numberppasu = Column(String(100))
kolichestvo = Column(Integer)
aud_id = Column(Integer, ForeignKey("auditories.id"))
auditory = relationship("Auditory", back_populates="oboruds")
type_id = Column(Integer, ForeignKey("equipment_types.id"))
type = relationship("EquipmentType", back_populates="oboruds")
components = relationship("Component", back_populates="oborud")
consumables = relationship("Consumable", back_populates="oborud")
class Component(Base):
__tablename__ = 'components'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String)
oborud_id = Column(Integer, ForeignKey("oboruds.id"))
oborud = relationship("Oboruds", back_populates="components")
class Consumable(Base):
__tablename__ = 'consumables'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String)
oborud_id = Column(Integer, ForeignKey("oboruds.id"))
oborud = relationship("Oboruds", back_populates="consumables")
class Zametki(Base):
__tablename__ = 'zametki'
id = Column(Integer, primary_key=True)
txtzam = Column(String(10000))
created_date = Column(DateTime, default=datetime.datetime.utcnow)
rmdt = Column(DateTime)

BIN
backend/requirements.txt Normal file

Binary file not shown.

View File

@@ -0,0 +1,18 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
auditories = APIRouter(prefix="/auditories", tags=["auditories"])
@auditories.post("/", response_model=schemas.AuditoryRead)
def create_auditory(item: schemas.AuditoryCreate, db: Session = Depends(database.get_db)):
obj = models.Auditory(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@auditories.get("/", response_model=list[schemas.AuditoryRead])
def list_auditories(db: Session = Depends(database.get_db)):
return db.query(models.Auditory).all()

View File

@@ -0,0 +1,18 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
components = APIRouter(prefix="/components", tags=["components"])
@components.post("/", response_model=schemas.ComponentRead)
def create_component(item: schemas.ComponentCreate, db: Session = Depends(database.get_db)):
obj = models.Component(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@components.get("/", response_model=list[schemas.ComponentRead])
def list_components(db: Session = Depends(database.get_db)):
return db.query(models.Component).all()

View File

@@ -0,0 +1,17 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
equipment_types = APIRouter(prefix="/equipment-types", tags=["equipment_types"])
@equipment_types.post("/", response_model=schemas.EquipmentTypeRead)
def create_equipment_type(item: schemas.EquipmentTypeCreate, db: Session = Depends(database.get_db)):
obj = models.EquipmentType(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@equipment_types.get("/", response_model=list[schemas.EquipmentTypeRead])
def list_equipment_types(db: Session = Depends(database.get_db)):
return db.query(models.EquipmentType).all()

View File

@@ -0,0 +1,24 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
oboruds = APIRouter(prefix="/oboruds", tags=["oboruds"])
@oboruds.post("/", response_model=schemas.OborudRead)
def create_oborud(item: schemas.OborudCreate, db: Session = Depends(database.get_db)):
obj = models.Oboruds(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@oboruds.get("/", response_model=list[schemas.OborudRead])
def list_oboruds(db: Session = Depends(database.get_db)):
return db.query(models.Oboruds).all()
@oboruds.get("/{oborud_id}", response_model=schemas.OborudRead)
def get_oborud(oborud_id: int, db: Session = Depends(database.get_db)):
obj = db.query(models.Oboruds).filter(models.Oboruds.id == oborud_id).first()
if not obj:
raise HTTPException(status_code=404, detail="Oborud not found")
return obj

View File

@@ -0,0 +1,17 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
consumables = APIRouter(prefix="/consumables", tags=["consumables"])
@consumables.post("/", response_model=schemas.ConsumableRead)
def create_consumable(item: schemas.ConsumableCreate, db: Session = Depends(database.get_db)):
obj = models.Consumable(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@consumables.get("/", response_model=list[schemas.ConsumableRead])
def list_consumables(db: Session = Depends(database.get_db)):
return db.query(models.Consumable).all()

View File

@@ -0,0 +1,17 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, database
zametki = APIRouter(prefix="/zametki", tags=["zametki"])
@zametki.post("/", response_model=schemas.ZametkaRead)
def create_zametka(item: schemas.ZametkaCreate, db: Session = Depends(database.get_db)):
obj = models.Zametki(**item.dict())
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@zametki.get("/", response_model=list[schemas.ZametkaRead])
def list_zametki(db: Session = Depends(database.get_db)):
return db.query(models.Zametki).all()

102
backend/schemas.py Normal file
View File

@@ -0,0 +1,102 @@
# backend/schemas.py
from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime
# === Equipment Type ===
class EquipmentTypeBase(BaseModel):
name: str
class EquipmentTypeCreate(EquipmentTypeBase):
pass
class EquipmentTypeRead(EquipmentTypeBase):
id: int
class Config:
orm_mode = True
# === Component ===
class ComponentBase(BaseModel):
name: str
description: Optional[str] = None
class ComponentCreate(ComponentBase):
oborud_id: int
class ComponentRead(ComponentBase):
id: int
class Config:
orm_mode = True
# === Consumable ===
class ConsumableBase(BaseModel):
name: str
description: Optional[str] = None
class ConsumableCreate(ConsumableBase):
oborud_id: int
class ConsumableRead(ConsumableBase):
id: int
class Config:
orm_mode = True
# === Oborud ===
class OborudBase(BaseModel):
invNumber: Optional[int]
nazvanie: str
raspologenie: Optional[str] = None
numberppasu: Optional[str] = None
kolichestvo: Optional[int] = None
aud_id: int
type_id: int
class OborudCreate(OborudBase):
pass
class OborudRead(OborudBase):
id: int
type: EquipmentTypeRead
components: List[ComponentRead] = []
consumables: List[ConsumableRead] = []
class Config:
orm_mode = True
# === Auditory ===
class AuditoryBase(BaseModel):
audnazvanie: str
class AuditoryCreate(AuditoryBase):
pass
class AuditoryRead(AuditoryBase):
id: int
class Config:
orm_mode = True
# === Zametka ===
class ZametkaBase(BaseModel):
txtzam: str
rmdt: Optional[datetime] = None
class ZametkaCreate(ZametkaBase):
pass
class ZametkaRead(ZametkaBase):
id: int
created_date: datetime
class Config:
orm_mode = True

View File

@@ -0,0 +1,32 @@
"""empty message
Revision ID: 10da3140ab2e
Revises: 4eacd6dcd461
Create Date: 2024-04-05 01:25:48.931573
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '10da3140ab2e'
down_revision = '4eacd6dcd461'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('kolichestvo', sa.Integer(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.drop_column('kolichestvo')
# ### end Alembic commands ###

View File

@@ -0,0 +1,54 @@
"""empty message
Revision ID: 4eacd6dcd461
Revises: c208cbc25232
Create Date: 2024-04-03 23:25:42.271936
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '4eacd6dcd461'
down_revision = 'c208cbc25232'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('numberved', sa.String(length=100), nullable=True))
batch_op.add_column(sa.Column('numberppasu', sa.String(length=100), nullable=True))
batch_op.add_column(sa.Column('balancenumber', sa.Integer(), nullable=True))
batch_op.alter_column('nazvanie',
existing_type=sa.TEXT(length=500),
type_=sa.String(length=500),
existing_nullable=True)
batch_op.alter_column('raspologenie',
existing_type=sa.TEXT(length=200),
type_=sa.String(length=200),
existing_nullable=True)
batch_op.drop_column('buhnumberpp')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('buhnumberpp', sa.VARCHAR(length=100), nullable=True))
batch_op.alter_column('raspologenie',
existing_type=sa.String(length=200),
type_=sa.TEXT(length=200),
existing_nullable=True)
batch_op.alter_column('nazvanie',
existing_type=sa.String(length=500),
type_=sa.TEXT(length=500),
existing_nullable=True)
batch_op.drop_column('balancenumber')
batch_op.drop_column('numberppasu')
batch_op.drop_column('numberved')
# ### end Alembic commands ###

View File

@@ -0,0 +1,34 @@
"""empty message
Revision ID: 6fc3d1adb061
Revises: be7c94c549e5
Create Date: 2024-04-02 16:32:23.180273
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '6fc3d1adb061'
down_revision = 'be7c94c549e5'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('buhnumberpp', sa.String(length=100), nullable=True))
batch_op.add_column(sa.Column('kolichestvo', sa.Integer(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.drop_column('kolichestvo')
batch_op.drop_column('buhnumberpp')
# ### end Alembic commands ###

View File

@@ -0,0 +1,32 @@
"""empty message
Revision ID: 885bdd7b5161
Revises: be7c94c549e5
Create Date: 2024-04-02 23:03:59.401369
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '885bdd7b5161'
down_revision = 'be7c94c549e5'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('kolichestvo', sa.Integer(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.drop_column('kolichestvo')
# ### end Alembic commands ###

View File

@@ -0,0 +1,54 @@
"""empty message
Revision ID: 8e5efc4de919
Revises: c208cbc25232
Create Date: 2024-04-03 22:36:46.208266
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '8e5efc4de919'
down_revision = 'c208cbc25232'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('numberved', sa.String(length=100), nullable=True))
batch_op.add_column(sa.Column('numberppasu', sa.String(length=100), nullable=True))
batch_op.add_column(sa.Column('balancenumber', sa.Integer(), nullable=True))
batch_op.alter_column('nazvanie',
existing_type=sa.TEXT(length=500),
type_=sa.String(length=500),
existing_nullable=True)
batch_op.alter_column('raspologenie',
existing_type=sa.TEXT(length=200),
type_=sa.String(length=200),
existing_nullable=True)
batch_op.drop_column('buhnumberpp')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('buhnumberpp', sa.TEXT(length=100), nullable=True))
batch_op.alter_column('raspologenie',
existing_type=sa.String(length=200),
type_=sa.TEXT(length=200),
existing_nullable=True)
batch_op.alter_column('nazvanie',
existing_type=sa.String(length=500),
type_=sa.TEXT(length=500),
existing_nullable=True)
batch_op.drop_column('balancenumber')
batch_op.drop_column('numberppasu')
batch_op.drop_column('numberved')
# ### end Alembic commands ###

View File

@@ -0,0 +1,34 @@
"""empty message
Revision ID: be7c94c549e5
Revises: 8e838956713f
Create Date: 2024-04-01 15:09:52.082987
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'be7c94c549e5'
down_revision = '8e838956713f'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('balancenumber', sa.String(length=30), nullable=True))
batch_op.drop_column('typeBalanse')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('oboruds', schema=None) as batch_op:
batch_op.add_column(sa.Column('typeBalanse', sa.VARCHAR(length=30), nullable=True))
batch_op.drop_column('balancenumber')
# ### end Alembic commands ###

View File

@@ -0,0 +1,24 @@
"""empty message
Revision ID: c208cbc25232
Revises: 6fc3d1adb061, 885bdd7b5161
Create Date: 2024-04-03 22:11:15.008480
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c208cbc25232'
down_revision = ('6fc3d1adb061', '885bdd7b5161')
branch_labels = None
depends_on = None
def upgrade():
pass
def downgrade():
pass

View File

@@ -0,0 +1,24 @@
"""empty message
Revision ID: d4a8e4c9e65a
Revises: 10da3140ab2e, 8e5efc4de919
Create Date: 2024-05-06 08:27:39.088982
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd4a8e4c9e65a'
down_revision = ('10da3140ab2e', '8e5efc4de919')
branch_labels = None
depends_on = None
def upgrade():
pass
def downgrade():
pass

View File

@@ -1,32 +1,76 @@
# backend/models.py
from flask_sqlalchemy import SQLAlchemy from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship, declarative_base
import datetime import datetime
db = SQLAlchemy() Base = declarative_base()
class Auditory(db.Model): class Auditory(Base):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) __tablename__ = 'auditories'
audnazvanie=db.Column(db.String)
oboruds = db.relationship('Oboruds')
id = Column(Integer, primary_key=True)
class Oboruds(db.Model): audnazvanie = Column(String)
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
invNumber=db.Column(db.Integer) oboruds = relationship("Oboruds", back_populates="auditory")
nazvanie=db.Column(db.String(500))
typeBalanse = db.Column(db.String(30))
raspologenie = db.Column(db.String(200))
numberved = db.Column(db.String(100))
aud_id = db.Column(db.Integer, db.ForeignKey(Auditory.id))
class EquipmentType(Base):
__tablename__ = 'equipment_types'
class Zametki(db.Model): id = Column(Integer, primary_key=True)
id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = Column(String, unique=True, nullable=False)
txtzam=db.Column(db.String(10000))
created_date = db.Column(db.DateTime, default=datetime.datetime.utcnow) oboruds = relationship("Oboruds", back_populates="type")
rmdt = db.Column(db.DateTime)
class Oboruds(Base):
__tablename__ = 'oboruds'
id = Column(Integer, primary_key=True)
invNumber = Column(Integer)
nazvanie = Column(String(500))
raspologenie = Column(String(200))
numberppasu = Column(String(100))
kolichestvo = Column(Integer)
aud_id = Column(Integer, ForeignKey("auditories.id"))
auditory = relationship("Auditory", back_populates="oboruds")
type_id = Column(Integer, ForeignKey("equipment_types.id"))
type = relationship("EquipmentType", back_populates="oboruds")
components = relationship("Component", back_populates="oborud")
consumables = relationship("Consumable", back_populates="oborud")
class Component(Base):
__tablename__ = 'components'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String)
oborud_id = Column(Integer, ForeignKey("oboruds.id"))
oborud = relationship("Oboruds", back_populates="components")
class Consumable(Base):
__tablename__ = 'consumables'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String)
oborud_id = Column(Integer, ForeignKey("oboruds.id"))
oborud = relationship("Oboruds", back_populates="consumables")
class Zametki(Base):
__tablename__ = 'zametki'
id = Column(Integer, primary_key=True)
txtzam = Column(String(10000))
created_date = Column(DateTime, default=datetime.datetime.utcnow)
rmdt = Column(DateTime)

Binary file not shown.

6
serve.py Normal file
View File

@@ -0,0 +1,6 @@
from waitress import serve
from app import app
if __name__ == '__main__':
serve(app, port='3800')

View File

@@ -8,7 +8,7 @@ body {
min-width: 580px; min-width: 580px;
} }
.row{ .row {
text-align: center; text-align: center;
@@ -18,12 +18,13 @@ body {
border: 1px; border: 1px;
} }
header { header {
text-align: center; text-align: center;
background-color: #6A90B6; background-color: #6A90B6;
padding: 2px; padding: 2px;
} }
@@ -34,7 +35,7 @@ a:hover {
color: #041322; color: #041322;
} }
a{ a {
color: #041322; color: #041322;
@@ -53,7 +54,7 @@ button {
.card { .card {
width: 200px; /*width: 200px; */
margin: 10px; margin: 10px;
border-radius: 15px; border-radius: 15px;
border-color: #E07D54; border-color: #E07D54;
@@ -66,20 +67,62 @@ h5 {
} }
.hidden-column {
.hidden-column{ display: none;
display: none;
} }
nav{ nav {
width:100%; width: 100%;
} }
table {
word-break: break-all;
border-collapse: separate !important;
}
.table td {
font-size: 14px;
padding: 0;
max-width: 10rem;
word-break: break-all;
border-collapse: separate !important;
}
.aud {
width: 110px;
}
.inv {
width: 400px;
}
.rasp {
width: 200px;
word-break: break-word;
white-space: nowrap;
}
#modal_matcenn {
margin-left: 20px;
}
.datatable {
background-color: whitesmoke;
}
.datatable th:nth-child(7) {
width: 200px;
}
@media print { @media print {
*{ * {
font-family: "Times New Roman", Times, serif; font-family: "Times New Roman", Times, serif;
} }
@@ -87,7 +130,7 @@ nav{
margin: 0; margin: 0;
padding: 0; padding: 0;
background-color: transparent; background-color: transparent;
} }
@@ -107,29 +150,30 @@ nav{
width: 100%; width: 100%;
} }
.no-print { .no-print {
display: none; display: none;
} }
table.rs-table-bordered{ table.rs-table-bordered {
border:1px solid #000000; border: 1px solid #000000;
margin-top:20px; margin-top: 20px;
font-size: 14pt; font-size: 14pt;
} }
table.rs-table-bordered > thead > tr > th{
border:1px solid #000000; table.rs-table-bordered > thead > tr > th {
border: 1px solid #000000;
padding: 2px; padding: 2px;
font-size: 14pt; font-size: 14pt;
} }
table.rs-table-bordered > tbody > tr > td{
border:1px solid #000000; table.rs-table-bordered > tbody > tr > td {
border: 1px solid #000000;
padding: 10px; padding: 10px;
font-size: 14pt; font-size: 14pt;
} }
} }

282
static/js/allmatc.js Normal file
View File

@@ -0,0 +1,282 @@
function clearTable() {
var table = document.getElementById("alldatatable");
var rowCount = table.rows.length;
// Iterate through each row and remove it
for (var i = rowCount - 1; i > 0; i--) {
table.deleteRow(i);
}
}
function getAllData() {
clearTable();
let tableBody = document.getElementById('alldatatable').getElementsByTagName("tbody")[0];
i = 0;
$.getJSON("/getall", function (data) {
$.each(data, function (index, item) {
let newRow = tableBody.insertRow(tableBody.rows.length);
let cell1 = newRow.insertCell(0);
let cell2 = newRow.insertCell(1);
let cell3 = newRow.insertCell(2);
let cell4 = newRow.insertCell(3);
let cell5 = newRow.insertCell(4);
let cell6 = newRow.insertCell(5);
let cell7 = newRow.insertCell(6);
let cell8 = newRow.insertCell(7);
i++;
cell1.innerText = i;
cell2.innerText = item.numberved;
cell3.innerText = item.invNumber;
cell4.innerText = item.nazvanie;
cell5.innerText = item.kolichestvo;
cell6.innerText = item.balancenumber;
cell7.innerText = item.aud;
cell8.innerText = item.raspologenie;
$(newRow).data('itemData', i);
$(newRow).on("click", function () {
let vednumbertxt = newRow.cells[1].innerText;
let invnomertxt = newRow.cells[2].innerText;
let nazvanietxt = newRow.cells[3].innerText;
let kolvotxt = newRow.cells[4].innerText;
let schettxt = newRow.cells[5].innerText;
let raspologtxt = newRow.cells[7].innerText;
$('#getmodal').modal('show');
let vedomost = document.getElementById('modal_vednumber')
let invnom = document.getElementById('modal_invnom')
let matcen = document.getElementById('modal_matcenn')
let kolvo = document.getElementById('modal_kolvo')
let balancenumber = document.getElementById('modal_balance')
let rasp = document.getElementById('modal_rapolog')
invnom.innerText = invnomertxt
matcen.innerText = nazvanietxt.substring(0, 20)
if (vednumbertxt.length > 0) {
vedomost.value = vednumbertxt;
}
if (kolvotxt.length > 0) {
kolvo.value = kolvotxt;
}
if (schettxt.length > 0) {
balancenumber.value = schettxt;
}
if (raspologtxt.length > 0) {
rasp.value = raspologtxt;
}
});
});
});
}
$(document).ready(function () {
getAllData();
});
$('#modalclose').click(function () {
let vednumber = document.getElementById('modal_vednumber')
let kolvo = document.getElementById('modal_kolvo')
let balancenumber = document.getElementById('modal_balance')
let matcen = document.getElementById('modal_matcenn')
let rasp = document.getElementById('modal_rapolog')
vednumber.value = '';
kolvo.value = '';
balancenumber.value = '';
matcen.value = '';
rasp.value = '';
$('#getmodal').modal('hide')
})
$('#modalsavetodb').click(function () {
let invnom = document.getElementById('modal_invnom')
let vednumber = document.getElementById('modal_vednumber')
let kolvo = document.getElementById('modal_kolvo')
let balancenumber = document.getElementById('modal_balance')
let matcen = document.getElementById('modal_matcenn')
let rasp = document.getElementById('modal_rapolog')
let nazv = document.getElementById('modal_nazvanie')
let changeddata = new Array()
changeddata[0] = invnom.text;
changeddata[1] = vednumber.value;
changeddata[2] = kolvo.value;
changeddata[3] = balancenumber.value;
changeddata[4] = rasp.value;
let sendData = changeddata.join(',')
console.log(sendData)
$.ajax({
url: "/addraspved",
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
data: sendData,
success: function () {
$('#getmodal').modal('hide')
vednumber.value = '';
kolvo.value = '';
balancenumber.value = '';
matcen.value = '';
rasp.value = '';
changeddata = [];
window.location.reload();
},
})
})
$('#addoborud').click(function () {
$('#addmodal').modal('show');
})
$('#modal2savetodb').click(function () {
let invnomer = document.getElementById('modal2_invnom')
let vednumber = document.getElementById('modal2_vednumber')
let kolvo = document.getElementById('modal2_kolvo')
let balancenumber = document.getElementById('modal2_balance')
let matcen = document.getElementById('modal2_matcenn')
let rasp = document.getElementById('modal2_rapolog')
let nazv = document.getElementById('modal2_nazvanie')
let changeddata = new Array()
changeddata[0] = invnomer.value;
changeddata[1] = vednumber.value;
changeddata[2] = kolvo.value;
changeddata[3] = balancenumber.value;
changeddata[4] = rasp.value;
changeddata[5] = nazv.value;
let sendData = changeddata.join(',')
console.log(sendData)
$.ajax({
url: "/addoborudasu",
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
data: sendData,
success: function () {
vednumber.value = '';
invnomer.value = '';
nazvanie.value = '';
kolvo.value = '';
balancenumber.value = '';
matcen.value = '';
rasp.value = '';
$('#addmodal').modal('hide')
window.location.reload()
},
})
})
$('#modal2close').click(function () {
let vednumber = document.getElementById('modal2_vednumber')
let invnomer = document.getElementById('modal2_invnom')
let nazvanie = document.getElementById('modal2_nazvanie')
let kolvo = document.getElementById('modal2_kolvo')
let balancenumber = document.getElementById('modal2_balance')
let matcen = document.getElementById('modal2_matcenn')
let rasp = document.getElementById('modal2_rapolog')
vednumber.value = '';
invnomer.value = '';
nazvanie.value = '';
kolvo.value = '';
balancenumber.value = '';
matcen.value = '';
rasp.value = '';
$('#addmodal').modal('hide')
})
$('#modal2').on('hidden.bs.modal', function () {
location.reload();
})
$(document).ready(function () {
// Слушаем событие клика по заголовкам таблицы
$('#alldatatable thead th').on('click', function () {
var columnIndex = $(this).index(); // Индекс колонки
var sortColumn = $(this).text().toLowerCase(); // Текст заголовка колонки
// Сортируем таблицу по выбранной колонке
$('#alldatatable tbody tr').sort(function (a, b) {
var valA;
var valB;
if (isNaN(parseFloat($(a).find('td:eq(' + columnIndex + ')').text()))) {
// если это текстовая колонка, то сортируем по алфавиту
valA = $(a).find('td:eq(' + columnIndex + ')').text().toLowerCase();
valB = $(b).find('td:eq(' + columnIndex + ')').text().toLowerCase();
} else {
// если это числовая колонка, то сортируем по числовому значению
valA = parseFloat($(a).find('td:eq(' + columnIndex + ')').text());
valB = parseFloat($(b).find('td:eq(' + columnIndex + ')').text());
}
if (valA < valB) return -1;
if (valA > valB) return 1;
return 0;
}).appendTo('#alldatatable tbody');
// Обновляем классы для активной колонки
$('#alldatatable thead th').removeClass('active');
$(this).addClass('active');
});
});

35
static/js/allmatcen.js Normal file
View File

@@ -0,0 +1,35 @@
function getData(){
const audid = document.getElementById('auditory')
$.ajax({
url: "/getall",
type: "get",
contentType: 'application/json',
dataType: 'json',
success: function(response){
var data = response;
const table = document.getElementById('datatable')
table.innerHTML = ''
var headTable = '<tr> <td >Номер в Инв. вед</td> <td id="invnomer">Инв. номер</td><td>Название</td><td class="no-print aud">Аудитория</td> <td >Расположение</td> <td id="proverka"class="hidden-column"> Проверено</td> </tr>'
table.innerHTML += headTable
var tr =""
data.forEach(element => {
tr += '<tr onclick="tableclick(this)">'
tr += '<td>' + element.num_ved + '</td>'
tr += '<td clas="inv">' + element.inv_number + '</td>'
tr += '<td>' + element.oboruds_id + '</td>'
tr += '<td class="no-print">' + element.auditory_name + '</td>'
tr += '<td class="rasp">' +element.raspolog + '</td>'
tr += '<td>' + '\n' + '</td>'
tr += '</tr>'
});
table.innerHTML += tr
}
})
}

View File

@@ -13,25 +13,27 @@ function getData(){
}, },
success: function(response){ success: function(response){
var data = response; var data = response;
const table = document.getElementById('datatable') const table = document.getElementById('datatable')
table.innerHTML = ''
var headTable = '<tr> <td >Номер в Инв. вед</td> <td>Инв. номер</td><td>Название</td><td class="no-print">Аудитория</td> <td >Расположение</td> <td id="proverka"class="hidden-column"> Проверено</td> </tr>' var headTable = '<tr> <td >Номер в Инв. вед</td> <td id="invnomer">Инв. номер</td><td>Название</td><td class="no-print aud">Аудитория</td> <td >Расположение</td> <td id="proverka"class="hidden-column"> Проверено</td> </tr>'
table.innerHTML += headTable
var tr ="" var tr =""
data.forEach(element => { data.forEach(element => {
tr += '<tr onclick="tableclick(this)">' tr += '<tr onclick="tableclick(this)">'
tr += '<td> </td>' tr += '<td>' + element.num_ved + '</td>'
tr += '<td>' + element.inv_number + '</td>' tr += '<td clas="inv">' + element.inv_number + '</td>'
tr += '<td>' + element.oboruds_id + '</td>' tr += '<td>' + element.oboruds_id + '</td>'
tr += '<td class="no-print">' + element.auditory_name + '</td>' tr += '<td class="no-print">' + element.auditory_name + '</td>'
tr += '<td> </td>' tr += '<td class="rasp">' +element.raspolog + '</td>'
tr += '<td>' + '\n' + '</td>' tr += '<td>' + '\n' + '</td>'
tr += '</tr>' tr += '</tr>'
}); });
table.innerHTML += tr table.innerHTML = headTable + tr
} }
}) })
} }
@@ -40,58 +42,84 @@ $("#searchbutton").click(function(){
getData(); getData();
}) })
function tableclick(x){ $('#modalsavetodb').click(function(){
let roww = x.rowIndex
let data = document.getElementById(x.rowIndex)
let datas = x.innerText.split('\t') let rasp = document.getElementById('modal_rapolog')
let vedomost = document.getElementById('modal_vednumber')
let invnom = document.getElementById('modal_invnom')
let matcen = document.getElementById('modal_matcenn')
console.log(datas) let changeddata = new Array()
$('#getmodal').modal('show') changeddata[0] = invnom.text
changeddata[1] = vedomost.value
changeddata[2] = rasp.value
let rasp = document.getElementById('rapolog') let sendData = changeddata.join(',')
let vedomost = document.getElementById('vednumber')
if (datas[0].length>0){ changeddata = []
rasp.value=datas[0]; $.ajax({
url: "/addraspved",
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
data: sendData,
success: function(){
/*
rasp='',
vedomost = '',
invnom = '',
matcen = '',
changeddata = []
*/
$('#getmodal').modal('hide').data( 'bs.modal', null );
getData();
} }
if (datas[4].length>0){
vedomost.value=datas[4]
}
$('#modalclose').click(function(){
$('#getmodal').modal('hide');
} )
$('#modalsavetodb').click(function(){
console.log(datas)
$.ajax({
url: "/addraspved",
type: "post",
contentType: 'application/json',
dataType: 'json',
data: {
rasp: rasp.value,
ved: vedomost.value
},
})
rasp.value='';
vedomost.value='';
$('#getmodal').modal('hide');
// getData();
}) })
}
})
function tableclick(tableRow){
let nomved = tableRow.childNodes[0].innerHTML;
let invnomer = tableRow.childNodes[1].innerHTML;
let nazvanie = tableRow.childNodes[2].innerHTML;
let raspolog = tableRow.childNodes[4].innerHTML;
$('#getmodal').modal('show')
let rasp = document.getElementById('modal_rapolog')
let vedomost = document.getElementById('modal_vednumber')
let invnom = document.getElementById('modal_invnom')
let matcen = document.getElementById('modal_matcenn')
invnom.innerText = invnomer
matcen.innerText = nazvanie.substring(0,15)
if (nomved.length >0){
vedomost.value = nomved
}
if(raspolog.length>0){
rasp.value = raspolog
}
$("#mimodal").on('hidden.bs.modal', function () {
$(this).data('bs.modal', null);
});
$('#modalclose').click(function(){
$('#getmodal').modal('hide').data( 'bs.modal', null );
} )
}

47
static/js/tmp.js Normal file
View File

@@ -0,0 +1,47 @@
function tableclick(x){
// let data = document.getElementById(x.rowIndex)
let datas = x.innerText.split('\t')
invnom.innerText=datas[1]+"\t"
matcen.innerText=datas[2]
if (datas[4].length>0){
rasp.value=datas[4];
}
if (datas[0].length>0){
vedomost.value=datas[0]
}
$('#modalclose').click(function(){
$('#getmodal').modal('hide');
} )
$('#modalsavetodb').click(function(){
$.ajax({
url: "/addraspved",
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
data: {
rasp: rasp.value,
ved: vedomost.value,
inv: invnomer
},
success:function() {
rasp.value = '';
vedomost.value= '';
data=[];
rasp
$('#getmodal').modal('hide');
getData();
}
})
})}

View File

@@ -2,39 +2,146 @@
{% block content %} {% block content %}
<div class="row">
<div class="card col-md-10 col-10">
<div class="card-body">
<form> <!-- Modal -->
<h3 class=" no-print card-title"> Все мат. ценности </h3> <div class="modal fade" id="getmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<button id="printallbutton"> Печать </button> <div class="modal-dialog modal-dialog-centered" role="document">
<table class="table pagebreak" col-md-10> <div class="modal-content">
<thead> <div class="modal-body" id="textarea">
<tr>
<th scope="col">Инв. номер</th>
<th scope="col">Название</th>
<th scope="col">Аудитория</th>
</tr>
</thead>
{% for item in res: %}
<tr>
<td> <input type="hidden" name="invnomer" value="{{ item[0] }}"> {{ item[0] }} </td>
<td> {{ item[1] }} </td>
<div class="row">
<td> <a id="modal_invnom"> </a><a id="modal_matcenn"></a>
{{ item[2] }}
</td>
</tr>
{% endfor %}
</table>
</form>
</div> </div>
<div class="row">
№ из ведомости
<input type="text" class="form-control" id ='modal_vednumber' placeholder="Номер из ведомости">
</div>
<div class="row">
Количество
<input type="text" class="form-control" id ='modal_kolvo' placeholder="Количество">
</div>
<div class="row">
Балансовый счёт
<input type="text" class="form-control" id ='modal_balance' placeholder="Балансовый счёт">
</div>
<div class="row">
Расположение
<input type="text" class="form-control" id ='modal_rapolog' placeholder="Введите расположение">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="modalclose">Закрыть</button>
<button type="button" class="btn btn-primary" id="modalsavetodb" >Сохранить изменения</button>
</div>
</div> </div>
</div>
</div>
</div>
<!-- Modal2 -->
<div class="modal fade" id="addmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-body" id="textarea">
<div class="row">
<a id="modal_invnom"> </a><a id="modal2_matcenn"></a>
</div>
<div class="row">
№ из ведомости
<input type="text" class="form-control" id ='modal2_vednumber' placeholder="Номер из ведомости">
<div class="row">
Инвентарный номер
<input type="text" class="form-control" id ='modal2_invnom' placeholder="Инвентарный номер">
</div>
</div>
<div class="row">
Название
<input type="text" class="form-control" id ='modal2_nazvanie' placeholder="Название">
</div>
<div class="row">
Количество
<input type="text" class="form-control" id ='modal2_kolvo' placeholder="Количество">
</div>
<div class="row">
Балансовый счёт
<input type="text" class="form-control" id ='modal2_balance' placeholder="Балансовый счёт">
</div>
<div class="row">
Расположение
<input type="text" class="form-control" id ='modal2_rapolog' placeholder="Введите расположение">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="modal2close">Закрыть</button>
<button type="button" class="btn btn-primary" id="modal2savetodb" >Сохранить изменения</button>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<h3 id ='123' class=" no-print"> Все мат. ценности </h3>
</div> </div>
<div class="row col-12">
<button class="button" id="printallbutton"> Печать </button>
</div>
<div class="row col-12">
<button class="button" id="addoborud"> Добавить </button>
</div>
<div class="row">
<div class="card col-md-11 table-responsive">
<table id="alldatatable" class="alldatable table pagebreak" >
<thead>
<tr>
<th scope="col"><br>п/п <br>АСУ</th>
<th scope="col">№ п/п <br>вед</th>
<th scope="col">Инв. номер</th>
<th scope="col">Название</th>
<th scope="col">Кол-во</th>
<th scope="col">Счёт</th>
<th scope="col">Ауд - я</th>
<th scope="col">Расположение</th>
</tr>
</thead>
<tr>
</tr>
</table>
</div>
</div>
<script src="{{url_for('static', filename='js/allmatc.js') }}"></script>
{% endblock %} {% endblock %}

View File

@@ -9,4 +9,5 @@
<script src="{{url_for('static', filename='js/zametki.js') }}"></script> <script src="{{url_for('static', filename='js/zametki.js') }}"></script>
<script src="{{url_for('static', filename='js/searchonaud.js') }}"></script> <script src="{{url_for('static', filename='js/searchonaud.js') }}"></script>
<script src="{{url_for('static', filename='js/print.js') }}"></script> <script src="{{url_for('static', filename='js/print.js') }}"></script>
<script src="{{url_for('static', filename='js/modal.js') }}"></script> <script src="{{url_for('static', filename='js/modal.js') }}"></script>
<script src="{{url_for('static', filename='js/allmatc.js') }}"></script>

62
templates/login.html Normal file
View File

@@ -0,0 +1,62 @@
{% extends 'base.html' %}
{% block content %}
<div class="row">
<div class="card col-4" >
<div class="card-body">
<form class="form-horizontal">
<fieldset>
<!-- Form Name -->
<legend>Авторизация</legend>
<!-- Text input-->
<div class="form-group">
<label control-label" for="logininput">Логин</label>
<div>
<input id="logininput" name="logininput" type="text" placeholder="Введите логин" class="form-control input-md">
</div>
</div>
<!-- Password input-->
<div class="form-group">
<label class="control-label" for="passwordinput">Пароль</label>
<input id="passwordinput" name="passwordinput" type="password" placeholder="Введите пароль" class="form-control input-md">
</div>
</div>
<div class="row">
<button id="btn_login" name="btn_login" class="btn btn-primary">Войти</button>
</div>
</fieldset>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@@ -3,72 +3,98 @@
{% block content %} {% block content %}
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="getmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> <div class="modal fade" id="getmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle"
<div class="modal-dialog modal-dialog-centered" role="document"> aria-hidden="true">
<div class="modal-content"> <div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-body" id="textarea"> <div class="modal-content">
<div class="modal-body" id="textarea">
<input type="text" class="form-control" id ='rapolog' placeholder="Введите расположение">
<input type="text" class="form-control" id ='vednumber' placeholder="Номер из веломости">
<input type="text" class="form-control" id='vednumber' placeholder="Номер из веломости">
<input type="text" class="form-control" id='rapolog' placeholder="Введите расположение">
<div class="row">
<a id="modal_invnom"> </a><a id="modal_matcenn"></a>
</div>
<form method="POST" action="/addraspved">
<div class="row">
№ из ведомости
<input type="text" class="form-control" name="modal_vednumber" id='modal_vednumber'
placeholder="Номер из ведомости">
</div>
<div class="row">
Расположение
<input type="text" class="form-control" name="modal_rapolog" id='modal_rapolog'
placeholder="Введите расположение">
</div>
</form>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="modalclose">Закрыть
</button>
<button type="button" class="btn btn-primary" id="modalsavetodb">Сохранить изменения</button>
</div>
</div>
</div>
</div> </div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="modalclose">Закрыть</button>
<button type="button" class="btn btn-primary" id="modalsavetodb" >Сохранить изменения</button>
</div>
</div>
</div> </div>
</div>
<div class="row no-print"> <div class="row no-print">
<div class="card col-md-10 col-10"> <div class="card col-md-10 col-10">
<div class="card-body"> <div class="card-body">
<select name="auditory" id="auditory">
{% for item in aud: %} <select name="auditory" id="auditory">
<option name="optauditory" value="{{item.id}}">{{ item.audnazvanie }}</option>
{% endfor %}
</select>
<button id="searchbutton"> Найти </button> {% for item in aud: %}
<button id="printbutton"> Печать </button> <option name="optauditory" value="{{ item.id }}">{{ item.audnazvanie }}</option>
{% endfor %}
</select>
<button id="searchbutton"> Найти</button>
<button id="printbutton"> Печать</button>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="card col-md-10 col-10"> <div class="card col-md-10 col-10">
<div class="card-body"> <div class="card-body">
<h3 class="card-title no-print"> Поаудиторно </h3> <h3 class="card-title no-print"> Поаудиторно </h3>
<table class="table" id="datatable" col-md-10>
<td >Номер в Инв. вед</td>
<td >Инв. номер</td>
<td >Название</td>
<td class="no-print">Аудитория</td>
<td >Расположение</td>
<table class="table " id="datatable">
{% for item in res: %}
<th>Номер в Инв. вед</th>
<td> <input type="hidden" name="invnomer" value="{{ item[0] }}"> {{ item[0] }} </td> <th>Инв. номер</th>
<td> {{ item[1] }} </td> <th>Название</th>
<td class="no-print"> {{item[2]}} </td> <th class="no-print">Аудитория</th>
<td id="proverka"> Проверено </td> <th>Расположение</th>
{% endfor %}
</table> {% for item in res %}
</div>
<td><input type="hidden" name="invnomer" value="{{ item[0] }}"> {{ item[0] }} </td>
<td> {{ item[1] }} </td>
<td class="no-print"> {{ item[2] }} </td>
<td id="proverka"> Проверено</td>
{% endfor %}
</table>
</div> </div>
</div> </div>
</div> </div>
</div>
{%endblock%} {% endblock %}