def __init__(self): super(Desktop, self).__init__() self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.initDB() login = LoginPage() if login.exec_(): self.user = env.User(str(login.username.text())) self.initFromDB() self.log = LogPanel() self.logstream = LogStream() self.logstream.message.connect(self.log.on_stream_update) sys.stdout = self.logstream self.sysdate = QtGui.QDateEdit(datetime.date.today()) self.sysdate.setCalendarPopup(True) self.sysdate.setFixedWidth(120) self.sysdate.dateChanged.connect(self.on_sysdate_change) self.sysdate.setToolTip(u'系统日期') self.createAction() self.createMenu() self.createSystemTray() layout = QtGui.QGridLayout() self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.treecontrol = TreeControl() self.treecontrol.clickSignal.connect(self.switchLayout) self.createPages() self.topLayout = QtGui.QHBoxLayout() self.topLayout.addWidget(self.sysdate, alignment=QtCore.Qt.AlignLeft) layout.addLayout(self.topLayout, 0, 0, 1, 7) layout.addWidget(self.treecontrol, 1, 0, 20, 1) layout.addLayout(self.stackedLayout, 1, 1, 20, 6) self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.resize(800, 600) self.setWindowTitle(u'固定收益部交易管理平台 - {0}'.format(self.user.name)) self.setWindowIcon(QtGui.QIcon(env.sysIcon)) self.show() self.statusBar().showMessage(u'启动万得链接...') self.wst = WindStartThread() self.wst.finished.connect(self.windlaunched) self.wst.start() else: login.close() self.close() QtGui.qApp.quit()
class Desktop(QtGui.QMainWindow): def __init__(self): super(Desktop, self).__init__() self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.initDB() login = LoginPage() if login.exec_(): self.user = env.User(str(login.username.text())) self.initFromDB() self.log = LogPanel() self.logstream = LogStream() self.logstream.message.connect(self.log.on_stream_update) sys.stdout = self.logstream self.sysdate = QtGui.QDateEdit(datetime.date.today()) self.sysdate.setCalendarPopup(True) self.sysdate.setFixedWidth(120) self.sysdate.dateChanged.connect(self.on_sysdate_change) self.sysdate.setToolTip(u'系统日期') self.createAction() self.createMenu() self.createSystemTray() layout = QtGui.QGridLayout() self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.treecontrol = TreeControl() self.treecontrol.clickSignal.connect(self.switchLayout) self.createPages() self.topLayout = QtGui.QHBoxLayout() self.topLayout.addWidget(self.sysdate, alignment=QtCore.Qt.AlignLeft) layout.addLayout(self.topLayout, 0, 0, 1, 7) layout.addWidget(self.treecontrol, 1, 0, 20, 1) layout.addLayout(self.stackedLayout, 1, 1, 20, 6) self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.resize(800, 600) self.setWindowTitle(u'固定收益部交易管理平台 - {0}'.format(self.user.name)) self.setWindowIcon(QtGui.QIcon(env.sysIcon)) self.show() self.statusBar().showMessage(u'启动万得链接...') self.wst = WindStartThread() self.wst.finished.connect(self.windlaunched) self.wst.start() else: login.close() self.close() QtGui.qApp.quit() def windlaunched(self): if self.wst.result.ErrorCode == 0: self.statusBar().showMessage(u'万得连接成功') else: print self.wst.result.ErrorCode self.statusBar().showMessage(u'万得连接失败,部分功能无法正常使用') def on_sysdate_change(self): cd = self.sysdate.date().toPyDate() td = datetime.date.today() p = QtGui.QPalette() p.setColor(p.Base, cd==td and ColorWhite or ColorHighlightText) self.sysdate.setPalette(p) self.avs.vb.date_update(cd) self.tvs.vb.date_update(cd) self.bvs.vb.date_update(cd) self.lvs.vb.date_update(cd) def createPages(self): self.stackedLayout = QtGui.QStackedLayout() # acct overview self.acctview = QtGui.QWidget() layout_acctview = QtGui.QGridLayout() self.avs =PositionViewSet(self.sysdate.date().toPyDate()) gbTrade = QtGui.QGroupBox(u'交易') tradeLayout = QtGui.QHBoxLayout() self.btnTrade = QtGui.QPushButton(u'债券/股票/货基/回购') self.btnTrade.clicked.connect(self.showNewTrade) self.btnTradeCash = QtGui.QPushButton(u'现金流调整') self.btnTradeCash.clicked.connect(self.showNewCashTrade) self.btnTradeIBEX = QtGui.QPushButton(u'银证转账') self.btnTradeIBEX.clicked.connect(self.showNewIB2EX) self.btnTradeDepo = QtGui.QPushButton(u'同业存款') self.btnTradeDepo.clicked.connect(self.showNewDepoTrade) self.btnCollateralBond = QtGui.QPushButton(u'押券') tradeLayout.addWidget(self.btnTrade) tradeLayout.addWidget(self.btnTradeCash) tradeLayout.addWidget(self.btnTradeIBEX) tradeLayout.addWidget(self.btnTradeDepo) tradeLayout.addWidget(self.btnCollateralBond) gbTrade.setLayout(tradeLayout) layout_acctview.addWidget(gbTrade, 0, 0, 1, 6) layout_acctview.addWidget(self.avs.btnRefresh, 1, 0, 1, 1) layout_acctview.addWidget(self.avs.btnExportToExcel, 1, 1, 1, 1) layout_acctview.addWidget(QtGui.QLabel(u'筛选列'), 1, 2, 1, 1) layout_acctview.addWidget(self.avs.sortCol, 1, 3, 1, 1) layout_acctview.addWidget(QtGui.QLabel(u'列包含'), 1, 4, 1, 1) layout_acctview.addWidget(self.avs.sortContent, 1, 5, 1, 1) layout_acctview.addWidget(self.avs.vb, 2, 0, 1, 6) self.acctview.setLayout(layout_acctview) self.stackedLayout.addWidget(self.acctview) # trade details self.tradedetails = QtGui.QWidget() layout_tradedetails = QtGui.QGridLayout() self.tvs = TradeViewSet(self.sysdate.date().toPyDate(), self.user, self.oss) layout_tradedetails.addWidget(self.tvs.btnRefresh,0,0,1,1) layout_tradedetails.addWidget(self.tvs.btnExportToExcel,0,1,1,1) layout_tradedetails.addWidget(QtGui.QLabel(u'筛选列'),0,2,1,1) layout_tradedetails.addWidget(self.tvs.sortCol,0,3,1,1) layout_tradedetails.addWidget(QtGui.QLabel(u'列包含'),0,4,1,1) layout_tradedetails.addWidget(self.tvs.sortContent,0,5,1,1) layout_tradedetails.addWidget(self.tvs.vb,1,0,1,6) self.tradedetails.setLayout(layout_tradedetails) self.stackedLayout.addWidget(self.tradedetails) # book details self.bookdetails = QtGui.QWidget() layout_bookdetails = QtGui.QGridLayout() self.bvs = BookViewSet(self.sysdate.date().toPyDate()) layout_bookdetails.addWidget(self.bvs.btnRefresh,0,0,1,1) self.newbook = QtGui.QPushButton(u'添加账簿') self.newbook.clicked.connect(self.showNewBook) layout_bookdetails.addWidget(self.newbook,0,1,1,1) layout_bookdetails.addWidget(self.bvs.vb,1,0,1,6) self.bookdetails.setLayout(layout_bookdetails) self.stackedLayout.addWidget(self.bookdetails) # subscription overview self.suboverview = QtGui.QWidget() layout_suboverview = self.createSubOverviewPage() self.suboverview.setLayout(layout_suboverview) self.stackedLayout.addWidget(self.suboverview) # subscription details self.subdetails = QtGui.QWidget() layout_subdetails = QtGui.QGridLayout() self.newsub = QtGui.QPushButton(u'添加认购信息') self.newsub.clicked.connect(self.showNewSub) self.lvs = LiabilityViewSet(self.sysdate.date().toPyDate(), self.user) layout_subdetails.addWidget(self.newsub, 0, 0, 1, 1) layout_subdetails.addWidget(self.lvs.btnExportToExcel, 0, 1, 1, 1) layout_subdetails.addWidget(self.lvs.cbShowLiveOnly, 0, 2, 1, 1) layout_subdetails.addWidget(self.lvs.btnRefresh, 0, 3, 1, 1) layout_subdetails.addWidget(QtGui.QLabel(u'筛选列'), 0, 4, 1, 1) layout_subdetails.addWidget(self.lvs.sortCol, 0, 5, 1, 1) layout_subdetails.addWidget(QtGui.QLabel(u'列包含'), 0, 6, 1, 1) layout_subdetails.addWidget(self.lvs.sortContent, 0, 7, 1, 1) layout_subdetails.addWidget(self.lvs.vb, 1, 0, 1, 8) self.subdetails.setLayout(layout_subdetails) self.stackedLayout.addWidget(self.subdetails) # credit research self.bondpool = QtGui.QLabel(u'债券池') self.stackedLayout.addWidget(self.bondpool) # risk control self.risk = QtGui.QLabel(u'待开发') self.stackedLayout.addWidget(self.risk) def createSubOverviewPage(self): layout = QtGui.QGridLayout() w = QtGui.QWidget() sns.set(style="whitegrid") f, ax = plt.subplots(figsize=(20, 12)) canvas = figureCanvas(f) canvas.setParent(w) sns.set(style="whitegrid") q = QtSql.QSqlQuery("""SELECT EXP_DATE, SUM(AMOUNT), SUM(AMOUNT*(1+EXP_RETURN*(datediff(EXP_DATE, SETTLE_DATE)+1)/36500.0)) FROM LIABILITY WHERE EXP_DATE>='%s' GROUP BY EXP_DATE ORDER BY EXP_DATE"""%self.sysdate.date().toPyDate()) dates, vals = [], [] x_amt = range(0,1000000000,100000000) while q.next(): dates.append(q.value(0).toDate().toPyDate().isoformat()) vals.append((q.value(1).toDouble()[0], q.value(2).toDouble()[0])) data = pd.DataFrame(vals, index=dates, columns=['Amount', 'Total Return']) # Plot the total crashes sns.set_color_codes("pastel") sns.barplot(x='Total Return', y=dates, data=data, label='Interest', color="b") # Plot the crashes where alcohol was involved sns.set_color_codes("muted") sns.barplot(x='Amount', y=dates, data=data, label="Principal", color="b") # Add a legend and informative axis label ax.legend(ncol=2, loc="upper right", frameon=True) ax.set(ylabel="Maturity Date", title='Liability Overview') sns.despine(left=True, bottom=True) layout.addWidget(w, 0, 0, 1, 1) return layout def showNewTrade(self): from guis.panel.panel_newtrd import NewTrade nt = NewTrade(self.user.id, self.sysdate.date().toPyDate(), self.secinfo, self.datecalc) if nt.exec_(): self.avs.vb.refresh() def showNewCashTrade(self): from guis.panel.panel_newcash import NewCash nc = NewCash(self.user.id) if nc.exec_(): self.avs.vb.refresh() def showNewDepoTrade(self): from guis.panel.panel_newdepo import NewDepo nd = NewDepo(self.user.id) if nd.exec_(): self.avs.vb.refresh() def showNewIB2EX(self): from guis.panel.panel_newib2ex import NewIB2EX nie = NewIB2EX(self.sysdate, self.user.id) if nie.exec_(): self.avs.vb.refresh() def showNewSub(self): from guis.panel.panel_newsub import NewSubscription ns = NewSubscription() if ns.exec_(): self.lvs.vb.refresh() def showNewBook(self): from guis.panel.panel_newbook import NewBook nb = NewBook() if nb.exec_(): self.bvs.vb.refresh() def switchLayout(self, itemName): if itemName == Qt.QString(u'持仓'): self.stackedLayout.setCurrentWidget(self.acctview) elif itemName == Qt.QString(u'交易明细'): self.stackedLayout.setCurrentWidget(self.tradedetails) elif itemName == Qt.QString(u'账簿信息'): self.stackedLayout.setCurrentWidget(self.bookdetails) elif itemName == Qt.QString(u'负债总览'): self.stackedLayout.setCurrentWidget(self.suboverview) elif itemName == Qt.QString(u'申购明细'): self.stackedLayout.setCurrentWidget(self.subdetails) elif itemName == Qt.QString(u'债券池'): self.stackedLayout.setCurrentWidget(self.bondpool) def initDB(self, host='caitcfid.mysql.rds.aliyuncs.com', port=3306, dbname='secs'): self.db = QtSql.QSqlDatabase.addDatabase('QMYSQL') self.db.setHostName(host) self.db.setPort(port) self.db.setDatabaseName(dbname) self.db.setUserName('hewei') self.db.setPassword('wehea1984') if not self.db.open(): raise Exception(u'无法连接数据库') QtSql.QSqlDatabase().setConnectOptions('MYSQL_OPT_RECONNECT=1') self.oss = OSS() def initFromDB(self): self.loadBooks() self.loadDeals() self.loadHolidays() self.loadSecInfo() def loadSecInfo(self): self.secinfo = {} q = QtSql.QSqlQuery('SELECT SEC_CODE, SEC_NAME, SEC_TYPE, EXCHANGE FROM SECINFO') while q.next(): self.secinfo[q.value(0).toString()] = (q.value(1).toString(), q.value(2).toString(), q.value(3).toString()) def loadBooks(self): self.books = [] q = QtSql.QSqlQuery() q.exec_('SELECT * FROM BOOKS') while q.next(): self.books.append(Book(q.value(0).toString(), q.value(1).toString(), q.value(2).toDate().toPyDate(), q.value(3).toString(), q.value(4).toString())) def loadDeals(self): q = QtSql.QSqlQuery() self.deals = [] q.exec_('SELECT * FROM DEALS') while q.next(): d = str(q.value(0).toString()) b = q.value(1).toInt()[0] self.deals.append(Deal(d, b)) def loadHolidays(self): q = QtSql.QSqlQuery() self.hols = [] q.exec_(u"'SELECT HOLDATE FROM HOLIDAYS WHERE HOLSTATUS<>'工作'") while q.next(): self.hols.append(q.value(0).toDate().toPyDate()) self.workdays=[] q.exec_(u"'SELECT HOLDATE FROM HOLIDAYS WHERE HOLSTATUS='工作'") while q.next(): self.workdays.append(q.value(0).toDate().toPyDate()) self.datecalc = DateCalculator(self.workdays, self.hols) def createMenu(self): self.mb = self.menuBar() m1 = self.mb.addMenu(u'&系统') m1.addAction(self.showLogAction) m1.addAction(self.holAction) m1.addAction(self.refreshAction) m1.addAction(self.exitAction) m2 = self.mb.addMenu(u'&报告') m2.addAction(self.rptCashFlow) m2.addAction(self.rptValuation) m3 = self.mb.addMenu(u'&帮助') m3.addAction(self.aboutAction) def createAction(self): self.showLogAction = QtGui.QAction(QtGui.QIcon('guis/icons/info.png'), u'显示日志', self, triggered=self.log.show) self.exitAction = QtGui.QAction(QtGui.QIcon('guis/icons/exit.png'), u'退出', self, triggered=QtGui.qApp.quit) self.refreshAction = QtGui.QAction(QtGui.QIcon('guis/icons/refresh.png'), u'刷新', self, triggered=self.refresh, shortcut='F5') self.holAction = QtGui.QAction(QtGui.QIcon('guis/icons/settings.png'), u'假期设置', self, shortcut='Ctrl+H', triggered=self.showHolidayPanel) self.rptCashFlow = QtGui.QAction(u'现金流报告', self, triggered=self.runrptCashFlow) self.rptValuation = QtGui.QAction(u'估值报告', self, triggered=self.runrptValuation) self.aboutAction = QtGui.QAction(u"关于CAMP", self, triggered=self.about) self.minimize = QtGui.QAction(u'最小化', self, triggered=self.hide) self.maximize = QtGui.QAction(u'最大化',self, triggered=self.showMaximized) self.restore = QtGui.QAction(u'还原', self, triggered=self.showNormal) def runrptCashFlow(self): pass def runrptValuation(self): pass def showDepoPanel(self): import tradepanel depo = tradepanel.DepoPanel(self.user, self.books) if depo.exec_(): pass def showBondPanel(self): import tradepanel bond = tradepanel.BondPanel(self.books) if bond.exec_(): pass def showMmfPanel(self): import tradepanel mmf = tradepanel.MmfPanel(self.books) if mmf.exec_(): pass def showHolidayPanel(self): import tradepanel hol = tradepanel.HolidayPanel() if hol.exec_(): pass def refresh(self): self.sysdate.setDate(datetime.date.today()) self.on_sysdate_change() def createSystemTray(self): self.trayIconMenu = QtGui.QMenu(self) self.trayIconMenu.addAction(self.minimize) self.trayIconMenu.addAction(self.maximize) self.trayIconMenu.addAction(self.restore) self.trayIconMenu.addSeparator() self.trayIconMenu.addAction(self.exitAction) self.trayIcon = QtGui.QSystemTrayIcon(self) self.trayIcon.setContextMenu(self.trayIconMenu) self.trayIcon.setIcon(QtGui.QIcon(env.sysIcon)) self.trayIcon.activated.connect(self.iconActivated) self.trayIcon.show() def setupLayout(self): self.setCentralWidget(self.centralWidget) self.layout = QtGui.QVBoxLayout() self.mainLayout = QtGui.QHBoxLayout() self.mainLayout.addWidget(self.toolBox) self.mainLayout.addWidget(self.mainPanel) self.mainPanel.setLayout(self.bookLayout) self.layout.addLayout(self.mainLayout) self.layout.addWidget(self.infoWidget) self.centralWidget.setLayout(self.layout) def iconActivated(self, reason): if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick): self.showNormal() def closeEvent(self, event): q = QtGui.QMessageBox(QtGui.QMessageBox.Question, u'关闭退出', u'确认关闭退出') q.setWindowIcon(QtGui.QIcon('guis/icons/tent.png')) q.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) q.setButtonText(QtGui.QMessageBox.Yes, u'确定') q.setButtonText(QtGui.QMessageBox.No, u'取消') answer = q.exec_() if answer == QtGui.QMessageBox.Yes: self.close() else: event.ignore() # if self.trayIcon.isVisible(): # # QtGui.QMessageBox.information(self, u"最小化", # # u"系统将最小化至系统托盘,如果退出请选择“系统->退出”") # self.hide() # event.ignore() def about(self): QtGui.QMessageBox.about(self, u"关于CAMP", u"长安信托固定收益部交易管理平台")
class Desktop(QtGui.QMainWindow): def __init__(self): super(Desktop, self).__init__() self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.initDB() login = LoginPage() if login.exec_(): self.user = env.User(str(login.username.text())) self.initFromDB() self.log = LogPanel() self.logstream = LogStream() self.logstream.message.connect(self.log.on_stream_update) sys.stdout = self.logstream self.sysdate = QtGui.QDateEdit(datetime.date.today()) self.sysdate.setCalendarPopup(True) self.sysdate.setFixedWidth(120) self.sysdate.dateChanged.connect(self.on_sysdate_change) self.sysdate.setToolTip(u'系统日期') self.createAction() self.createMenu() self.createSystemTray() layout = QtGui.QGridLayout() self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.treecontrol = TreeControl() self.treecontrol.clickSignal.connect(self.switchLayout) self.createPages() self.topLayout = QtGui.QHBoxLayout() self.topLayout.addWidget(self.sysdate, alignment=QtCore.Qt.AlignLeft) layout.addLayout(self.topLayout, 0, 0, 1, 7) layout.addWidget(self.treecontrol, 1, 0, 20, 1) layout.addLayout(self.stackedLayout, 1, 1, 20, 6) self.centralWidget = QtGui.QWidget() self.centralWidget.setLayout(layout) self.setCentralWidget(self.centralWidget) self.resize(800, 600) self.setWindowTitle(u'固定收益部交易管理平台 - {0}'.format(self.user.name)) self.setWindowIcon(QtGui.QIcon(env.sysIcon)) self.show() self.statusBar().showMessage(u'启动万得链接...') self.wst = WindStartThread() self.wst.finished.connect(self.windlaunched) self.wst.start() else: login.close() self.close() QtGui.qApp.quit() def windlaunched(self): if self.wst.result.ErrorCode == 0: self.statusBar().showMessage(u'万得连接成功') else: print self.wst.result.ErrorCode self.statusBar().showMessage(u'万得连接失败,部分功能无法正常使用') def on_sysdate_change(self): cd = self.sysdate.date().toPyDate() td = datetime.date.today() p = QtGui.QPalette() p.setColor(p.Base, cd == td and ColorWhite or ColorHighlightText) self.sysdate.setPalette(p) self.avs.vb.date_update(cd) self.tvs.vb.date_update(cd) self.bvs.vb.date_update(cd) self.lvs.vb.date_update(cd) def createPages(self): self.stackedLayout = QtGui.QStackedLayout() # acct overview self.acctview = QtGui.QWidget() layout_acctview = QtGui.QGridLayout() self.avs = PositionViewSet(self.sysdate.date().toPyDate()) gbTrade = QtGui.QGroupBox(u'交易') tradeLayout = QtGui.QHBoxLayout() self.btnTrade = QtGui.QPushButton(u'债券/股票/货基/回购') self.btnTrade.clicked.connect(self.showNewTrade) self.btnTradeCash = QtGui.QPushButton(u'现金流调整') self.btnTradeCash.clicked.connect(self.showNewCashTrade) self.btnTradeIBEX = QtGui.QPushButton(u'银证转账') self.btnTradeIBEX.clicked.connect(self.showNewIB2EX) self.btnTradeDepo = QtGui.QPushButton(u'同业存款') self.btnTradeDepo.clicked.connect(self.showNewDepoTrade) self.btnCollateralBond = QtGui.QPushButton(u'押券') tradeLayout.addWidget(self.btnTrade) tradeLayout.addWidget(self.btnTradeCash) tradeLayout.addWidget(self.btnTradeIBEX) tradeLayout.addWidget(self.btnTradeDepo) tradeLayout.addWidget(self.btnCollateralBond) gbTrade.setLayout(tradeLayout) layout_acctview.addWidget(gbTrade, 0, 0, 1, 6) layout_acctview.addWidget(self.avs.btnRefresh, 1, 0, 1, 1) layout_acctview.addWidget(self.avs.btnExportToExcel, 1, 1, 1, 1) layout_acctview.addWidget(QtGui.QLabel(u'筛选列'), 1, 2, 1, 1) layout_acctview.addWidget(self.avs.sortCol, 1, 3, 1, 1) layout_acctview.addWidget(QtGui.QLabel(u'列包含'), 1, 4, 1, 1) layout_acctview.addWidget(self.avs.sortContent, 1, 5, 1, 1) layout_acctview.addWidget(self.avs.vb, 2, 0, 1, 6) self.acctview.setLayout(layout_acctview) self.stackedLayout.addWidget(self.acctview) # trade details self.tradedetails = QtGui.QWidget() layout_tradedetails = QtGui.QGridLayout() self.tvs = TradeViewSet(self.sysdate.date().toPyDate(), self.user, self.oss) layout_tradedetails.addWidget(self.tvs.btnRefresh, 0, 0, 1, 1) layout_tradedetails.addWidget(self.tvs.btnExportToExcel, 0, 1, 1, 1) layout_tradedetails.addWidget(QtGui.QLabel(u'筛选列'), 0, 2, 1, 1) layout_tradedetails.addWidget(self.tvs.sortCol, 0, 3, 1, 1) layout_tradedetails.addWidget(QtGui.QLabel(u'列包含'), 0, 4, 1, 1) layout_tradedetails.addWidget(self.tvs.sortContent, 0, 5, 1, 1) layout_tradedetails.addWidget(self.tvs.vb, 1, 0, 1, 6) self.tradedetails.setLayout(layout_tradedetails) self.stackedLayout.addWidget(self.tradedetails) # book details self.bookdetails = QtGui.QWidget() layout_bookdetails = QtGui.QGridLayout() self.bvs = BookViewSet(self.sysdate.date().toPyDate()) layout_bookdetails.addWidget(self.bvs.btnRefresh, 0, 0, 1, 1) self.newbook = QtGui.QPushButton(u'添加账簿') self.newbook.clicked.connect(self.showNewBook) layout_bookdetails.addWidget(self.newbook, 0, 1, 1, 1) layout_bookdetails.addWidget(self.bvs.vb, 1, 0, 1, 6) self.bookdetails.setLayout(layout_bookdetails) self.stackedLayout.addWidget(self.bookdetails) # subscription overview self.suboverview = QtGui.QWidget() layout_suboverview = self.createSubOverviewPage() self.suboverview.setLayout(layout_suboverview) self.stackedLayout.addWidget(self.suboverview) # subscription details self.subdetails = QtGui.QWidget() layout_subdetails = QtGui.QGridLayout() self.newsub = QtGui.QPushButton(u'添加认购信息') self.newsub.clicked.connect(self.showNewSub) self.lvs = LiabilityViewSet(self.sysdate.date().toPyDate(), self.user) layout_subdetails.addWidget(self.newsub, 0, 0, 1, 1) layout_subdetails.addWidget(self.lvs.btnExportToExcel, 0, 1, 1, 1) layout_subdetails.addWidget(self.lvs.cbShowLiveOnly, 0, 2, 1, 1) layout_subdetails.addWidget(self.lvs.btnRefresh, 0, 3, 1, 1) layout_subdetails.addWidget(QtGui.QLabel(u'筛选列'), 0, 4, 1, 1) layout_subdetails.addWidget(self.lvs.sortCol, 0, 5, 1, 1) layout_subdetails.addWidget(QtGui.QLabel(u'列包含'), 0, 6, 1, 1) layout_subdetails.addWidget(self.lvs.sortContent, 0, 7, 1, 1) layout_subdetails.addWidget(self.lvs.vb, 1, 0, 1, 8) self.subdetails.setLayout(layout_subdetails) self.stackedLayout.addWidget(self.subdetails) # credit research self.bondpool = QtGui.QLabel(u'债券池') self.stackedLayout.addWidget(self.bondpool) # risk control self.risk = QtGui.QLabel(u'待开发') self.stackedLayout.addWidget(self.risk) def createSubOverviewPage(self): layout = QtGui.QGridLayout() w = QtGui.QWidget() sns.set(style="whitegrid") f, ax = plt.subplots(figsize=(20, 12)) canvas = figureCanvas(f) canvas.setParent(w) sns.set(style="whitegrid") q = QtSql.QSqlQuery( """SELECT EXP_DATE, SUM(AMOUNT), SUM(AMOUNT*(1+EXP_RETURN*(datediff(EXP_DATE, SETTLE_DATE)+1)/36500.0)) FROM LIABILITY WHERE EXP_DATE>='%s' GROUP BY EXP_DATE ORDER BY EXP_DATE""" % self.sysdate.date().toPyDate()) dates, vals = [], [] x_amt = range(0, 1000000000, 100000000) while q.next(): dates.append(q.value(0).toDate().toPyDate().isoformat()) vals.append((q.value(1).toDouble()[0], q.value(2).toDouble()[0])) data = pd.DataFrame(vals, index=dates, columns=['Amount', 'Total Return']) # Plot the total crashes sns.set_color_codes("pastel") sns.barplot(x='Total Return', y=dates, data=data, label='Interest', color="b") # Plot the crashes where alcohol was involved sns.set_color_codes("muted") sns.barplot(x='Amount', y=dates, data=data, label="Principal", color="b") # Add a legend and informative axis label ax.legend(ncol=2, loc="upper right", frameon=True) ax.set(ylabel="Maturity Date", title='Liability Overview') sns.despine(left=True, bottom=True) layout.addWidget(w, 0, 0, 1, 1) return layout def showNewTrade(self): from guis.panel.panel_newtrd import NewTrade nt = NewTrade(self.user.id, self.sysdate.date().toPyDate(), self.secinfo, self.datecalc) if nt.exec_(): self.avs.vb.refresh() def showNewCashTrade(self): from guis.panel.panel_newcash import NewCash nc = NewCash(self.user.id) if nc.exec_(): self.avs.vb.refresh() def showNewDepoTrade(self): from guis.panel.panel_newdepo import NewDepo nd = NewDepo(self.user.id) if nd.exec_(): self.avs.vb.refresh() def showNewIB2EX(self): from guis.panel.panel_newib2ex import NewIB2EX nie = NewIB2EX(self.sysdate, self.user.id) if nie.exec_(): self.avs.vb.refresh() def showNewSub(self): from guis.panel.panel_newsub import NewSubscription ns = NewSubscription() if ns.exec_(): self.lvs.vb.refresh() def showNewBook(self): from guis.panel.panel_newbook import NewBook nb = NewBook() if nb.exec_(): self.bvs.vb.refresh() def switchLayout(self, itemName): if itemName == Qt.QString(u'持仓'): self.stackedLayout.setCurrentWidget(self.acctview) elif itemName == Qt.QString(u'交易明细'): self.stackedLayout.setCurrentWidget(self.tradedetails) elif itemName == Qt.QString(u'账簿信息'): self.stackedLayout.setCurrentWidget(self.bookdetails) elif itemName == Qt.QString(u'负债总览'): self.stackedLayout.setCurrentWidget(self.suboverview) elif itemName == Qt.QString(u'申购明细'): self.stackedLayout.setCurrentWidget(self.subdetails) elif itemName == Qt.QString(u'债券池'): self.stackedLayout.setCurrentWidget(self.bondpool) def initDB(self, host='caitcfid.mysql.rds.aliyuncs.com', port=3306, dbname='secs'): self.db = QtSql.QSqlDatabase.addDatabase('QMYSQL') self.db.setHostName(host) self.db.setPort(port) self.db.setDatabaseName(dbname) self.db.setUserName('hewei') self.db.setPassword('wehea1984') if not self.db.open(): raise Exception(u'无法连接数据库') QtSql.QSqlDatabase().setConnectOptions('MYSQL_OPT_RECONNECT=1') self.oss = OSS() def initFromDB(self): self.loadBooks() self.loadDeals() self.loadHolidays() self.loadSecInfo() def loadSecInfo(self): self.secinfo = {} q = QtSql.QSqlQuery( 'SELECT SEC_CODE, SEC_NAME, SEC_TYPE, EXCHANGE FROM SECINFO') while q.next(): self.secinfo[q.value(0).toString()] = (q.value(1).toString(), q.value(2).toString(), q.value(3).toString()) def loadBooks(self): self.books = [] q = QtSql.QSqlQuery() q.exec_('SELECT * FROM BOOKS') while q.next(): self.books.append( Book( q.value(0).toString(), q.value(1).toString(), q.value(2).toDate().toPyDate(), q.value(3).toString(), q.value(4).toString())) def loadDeals(self): q = QtSql.QSqlQuery() self.deals = [] q.exec_('SELECT * FROM DEALS') while q.next(): d = str(q.value(0).toString()) b = q.value(1).toInt()[0] self.deals.append(Deal(d, b)) def loadHolidays(self): q = QtSql.QSqlQuery() self.hols = [] q.exec_(u"'SELECT HOLDATE FROM HOLIDAYS WHERE HOLSTATUS<>'工作'") while q.next(): self.hols.append(q.value(0).toDate().toPyDate()) self.workdays = [] q.exec_(u"'SELECT HOLDATE FROM HOLIDAYS WHERE HOLSTATUS='工作'") while q.next(): self.workdays.append(q.value(0).toDate().toPyDate()) self.datecalc = DateCalculator(self.workdays, self.hols) def createMenu(self): self.mb = self.menuBar() m1 = self.mb.addMenu(u'&系统') m1.addAction(self.showLogAction) m1.addAction(self.holAction) m1.addAction(self.refreshAction) m1.addAction(self.exitAction) m2 = self.mb.addMenu(u'&报告') m2.addAction(self.rptCashFlow) m2.addAction(self.rptValuation) m3 = self.mb.addMenu(u'&帮助') m3.addAction(self.aboutAction) def createAction(self): self.showLogAction = QtGui.QAction(QtGui.QIcon('guis/icons/info.png'), u'显示日志', self, triggered=self.log.show) self.exitAction = QtGui.QAction(QtGui.QIcon('guis/icons/exit.png'), u'退出', self, triggered=QtGui.qApp.quit) self.refreshAction = QtGui.QAction( QtGui.QIcon('guis/icons/refresh.png'), u'刷新', self, triggered=self.refresh, shortcut='F5') self.holAction = QtGui.QAction(QtGui.QIcon('guis/icons/settings.png'), u'假期设置', self, shortcut='Ctrl+H', triggered=self.showHolidayPanel) self.rptCashFlow = QtGui.QAction(u'现金流报告', self, triggered=self.runrptCashFlow) self.rptValuation = QtGui.QAction(u'估值报告', self, triggered=self.runrptValuation) self.aboutAction = QtGui.QAction(u"关于CAMP", self, triggered=self.about) self.minimize = QtGui.QAction(u'最小化', self, triggered=self.hide) self.maximize = QtGui.QAction(u'最大化', self, triggered=self.showMaximized) self.restore = QtGui.QAction(u'还原', self, triggered=self.showNormal) def runrptCashFlow(self): pass def runrptValuation(self): pass def showDepoPanel(self): import tradepanel depo = tradepanel.DepoPanel(self.user, self.books) if depo.exec_(): pass def showBondPanel(self): import tradepanel bond = tradepanel.BondPanel(self.books) if bond.exec_(): pass def showMmfPanel(self): import tradepanel mmf = tradepanel.MmfPanel(self.books) if mmf.exec_(): pass def showHolidayPanel(self): import tradepanel hol = tradepanel.HolidayPanel() if hol.exec_(): pass def refresh(self): self.sysdate.setDate(datetime.date.today()) self.on_sysdate_change() def createSystemTray(self): self.trayIconMenu = QtGui.QMenu(self) self.trayIconMenu.addAction(self.minimize) self.trayIconMenu.addAction(self.maximize) self.trayIconMenu.addAction(self.restore) self.trayIconMenu.addSeparator() self.trayIconMenu.addAction(self.exitAction) self.trayIcon = QtGui.QSystemTrayIcon(self) self.trayIcon.setContextMenu(self.trayIconMenu) self.trayIcon.setIcon(QtGui.QIcon(env.sysIcon)) self.trayIcon.activated.connect(self.iconActivated) self.trayIcon.show() def setupLayout(self): self.setCentralWidget(self.centralWidget) self.layout = QtGui.QVBoxLayout() self.mainLayout = QtGui.QHBoxLayout() self.mainLayout.addWidget(self.toolBox) self.mainLayout.addWidget(self.mainPanel) self.mainPanel.setLayout(self.bookLayout) self.layout.addLayout(self.mainLayout) self.layout.addWidget(self.infoWidget) self.centralWidget.setLayout(self.layout) def iconActivated(self, reason): if reason in (QtGui.QSystemTrayIcon.Trigger, QtGui.QSystemTrayIcon.DoubleClick): self.showNormal() def closeEvent(self, event): q = QtGui.QMessageBox(QtGui.QMessageBox.Question, u'关闭退出', u'确认关闭退出') q.setWindowIcon(QtGui.QIcon('guis/icons/tent.png')) q.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) q.setButtonText(QtGui.QMessageBox.Yes, u'确定') q.setButtonText(QtGui.QMessageBox.No, u'取消') answer = q.exec_() if answer == QtGui.QMessageBox.Yes: self.close() else: event.ignore() # if self.trayIcon.isVisible(): # # QtGui.QMessageBox.information(self, u"最小化", # # u"系统将最小化至系统托盘,如果退出请选择“系统->退出”") # self.hide() # event.ignore() def about(self): QtGui.QMessageBox.about(self, u"关于CAMP", u"长安信托固定收益部交易管理平台")