自己编制的sifee小程序,这是py主程序代码。
代码没有瘦身,仍有很多练习、测试用的废码。
代码仅作为自己学习、记录之用。
# -*- coding: utf-8 -*-
"""
Module implementing SIFT.
"""
import sqlite3
from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem
from Ui_sifee import Ui_SIFT
import datetime
import csv
listx, listy, listya, listyb, listyc, listyd=[],[],[],[],[],[]#绘图x轴、y轴数组数据
class SIFT(QDialog, Ui_SIFT):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(SIFT, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pBtn_calculate_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
#--------------------表头列名
self.tableWidget_detail.clear()
self.tableWidget_detail.setRowCount(0)
self.tableWidget_detail.setColumnCount(6)
date_header=QTableWidgetItem("补缴日期")
self.tableWidget_detail.setHorizontalHeaderItem(0, date_header)
date_header=QTableWidgetItem("缴费基数")
self.tableWidget_detail.setHorizontalHeaderItem(1, date_header)
date_header=QTableWidgetItem("滞纳金比例")
self.tableWidget_detail.setHorizontalHeaderItem(2, date_header)
date_header=QTableWidgetItem("单位缴费本金")
self.tableWidget_detail.setHorizontalHeaderItem(3, date_header)
date_header=QTableWidgetItem("单位缴费滞纳金")
self.tableWidget_detail.setHorizontalHeaderItem(4, date_header)
date_header=QTableWidgetItem("单位缴费总计")
self.tableWidget_detail.setHorizontalHeaderItem(5, date_header)
print("点击按钮")
siwage_scale=int(self.lineEdit_scale.text())/100
p_end=self.dateEdit_end.date()#补缴结束月
p_start=self.dateEdit_start.date()#补缴开始月
vday_start=p_start.day()
date_overduefee=(p_start.addMonths(1)).addDays(-vday_start+1)#隔月1日开始计算滞纳期开始
print("滞纳金开始日期:", date_overduefee)
date_now=p_start.currentDate()#获取当前系统时间
vmonth_end=p_end.month()
vmonth_start=p_start.month()
db_cnn=sqlite3.connect("db_ave_wage.db")#连接SQLite数据库
cur=db_cnn.cursor()
resu=cur.execute("select * from t_avewage")
csvfile_aa=open("数据库历年省平工资.csv", "w", newline="")
write_aa=csv.writer(csvfile_aa)
write_aa.writerow(["ID", "日期", "省年平工资", "省月平工资"])
write_aa.writerows(resu)
csvfile_aa.close()
fee=0
vcapital=0
vbase=0
vcapital_em=0
fee_em=0
j=0
listx.clear()
listy.clear()
listya.clear()
listyb.clear()
listyc.clear()
listyd.clear()
csvfile=open("补缴费用明细表.csv", "w", newline='')#创建csv文件
writer_a = csv.writer(csvfile)
writer_a.writerow(['补缴月份', '缴费基数', '滞纳比例', '单位缴费本金', '单位滞纳金', '单位缴费合计', '个人缴费本金', '个人滞息(不准)', '费用总计'])
#-------------------------------------------while循环
while date_overduefee<=p_end:
print("while语句开始")
#------------------------滞纳费率
#从开始补缴月的隔月1月开始计算滞纳金,每天万分之五
if date_overduefee.year()<1995:vscale=0.0008
if date_overduefee.year()>=1996 and date_overduefee.year()<=2000:
vscale=0.0006
if date_overduefee.year()>2000:vscale=0.0005
#---------------------补缴月缴费基数参考选定省平工资年度(上年或上上年度)
print("系统日期月份:", date_now.month(), "补缴年度:", p_start.addMonths(j).year())#验证变量
#每年7月统计数据出上一年度平均工资,当前月>=8月则使用上一年度社平工资,否则使用上上年度社平工资
if date_now.month()<=8 and (p_start.addMonths(j)).year()==date_now.year():
i=2
else: i=1
if self.checkBox_2.isChecked():
i=1
year_new=(p_start.addMonths(j)).year()-i
print("i:", i, "year_new:", year_new)
#----------------------------------
sql="select wage_month from t_avewage where year=%d" %(year_new)
# squ="CREATE TABLE t_avewage1 ( id INT PRIMARY KEY UNIQUE NOT NULL, year INT,wage_year DOUBLE, wage_month DOUBLE)";
cur.execute(sql)
result=cur.fetchall()
vbase=result[0][0]#河北省职工月均工资
vdays=date_overduefee.daysTo(date_now)#距今天的天数
print("滞纳期开始:", date_overduefee, "天数:", vdays, "基数:", vbase)
fee+=int(vbase*siwage_scale*0.2*vscale*vdays)#滞纳金累加值
fee_single=int(vbase*siwage_scale*0.2*vscale*vdays)#滞纳金不累加值
vcapital+=int(vbase*siwage_scale*0.2)#单位缴费本金累加
vcapital_single=int(vbase*siwage_scale*0.2)#单位缴费本金不累加值
vcapital_em+=int(vbase*siwage_scale*0.08)#个人承担费用累加值
vcapital_em_single=int(vbase*siwage_scale*0.08)#个人承担费用不累加值
fee_em+=int(vbase*siwage_scale*0.08*vscale*vdays)
fee_em_single=int(vbase*siwage_scale*0.08*vscale*vdays)
date_overduefee=date_overduefee.addMonths(1)
print("fee:", fee)
#此北京社保滞纳金计算多计算1个月的滞纳金。如计算2016年4月补缴滞纳金,当前时间2018年4月4日。
#此系统补缴时间填2018年4月4日,补缴结束时间是2016年5月1日,北京社保补缴时间填2018年5月4日。计算滞纳金同样是245元。
#-----------------------填表
self.tableWidget_detail.setRowCount(j+1)#插行
date_t=QTableWidgetItem(str(p_start.addMonths(j).toString("yyyy年MM月")))
wage_t=QTableWidgetItem(str(int(vbase*siwage_scale)))
scale_t=QTableWidgetItem(str(vscale))
vcapital_t=QTableWidgetItem(str(vcapital_single))
fee_t=QTableWidgetItem(str(fee_single))
sum_t=QTableWidgetItem(str(vcapital_single+fee_single))
self.tableWidget_detail.setItem(j, 0, date_t)
self.tableWidget_detail.setItem(j, 1, wage_t)
self.tableWidget_detail.setItem(j, 2, scale_t)
self.tableWidget_detail.setItem(j, 3, vcapital_t)
self.tableWidget_detail.setItem(j, 4, fee_t)
self.tableWidget_detail.setItem(j, 5, sum_t)
#--------------write csv file
lista=[]
lista.append(str(p_start.addMonths(j).toString("yyyy年MM月")))
lista.append(str(int(vbase*siwage_scale)))
lista.append(str(vscale))
lista.append(str(vcapital_single))
lista.append(str(fee_single))
lista.append(str(vcapital_single+fee_single))
lista.append(str(vcapital_em_single))
lista.append(str(fee_em_single))
lista.append(str(vcapital_single+fee_single+vcapital_em_single+fee_em_single))
print(lista)
listx.append(lista[0])
listy.append(lista[1])
listya.append(lista[2])
listyb.append(float(lista[3]))
listyc.append(float(lista[4]))
listyd.append(lista[5])
writer_a.writerow(lista)#如果使用writerows多行写入,则将每一个字符串分割成单个字符。
#如果writer_a.writerow(str(lista)),则可能是行列转置的效果
j+=1
csvfile.close()
#---------------------关数据库
cur.close()
db_cnn.commit()
db_cnn.close()
print(fee)
#---------------------写单行文本框值
self.lineEdit_capital.setText(str(vcapital))
self.lineEdit_overduefee.setText(str(fee))
self.lineEdit_feetotal.setText(str(fee+vcapital))
self.lineEdit_capital_em.setText(str(vcapital_em))
self.lineEdit_interest_total.setText(str(fee_em))
self.lineEdit_feetotal_all.setText(str(fee+vcapital+vcapital_em+fee_em))
self.lineEdit_person_total.setText(str(vcapital_em+fee_em))
@pyqtSlot()
def on_pushBtn_writelib_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
@pyqtSlot()
def on_pBtn_plot_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# from pylab import *
# from matplotlib.ticker import MultipleLocator, FormatStrFormatter
# xmajorLocator = MultipleLocator(20) #将x主刻度标签设置为20的倍数
# xmajorFormatter = FormatStrFormatter('%1.1f') #设置x轴标签文本的格式
# ax = subplot(111) #注意:一般都在ax中设置,不再plot中设置
# #设置主刻度标签的位置,标签文本的格式
#
#
mpl.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.xlabel(u"日期")
plt.ylabel(u"金额")
plt.title(u"月度缴费趋势图")
#plt.grid(True)
a=tuple(listx)
a1=np.arange(len(listx))
yb=tuple(listyb)
yc=tuple(listyc)
print(a, yb, yc, type(a))
plt.xticks(rotation=90)#x轴的tick_label标志旋转90度(x轴文字)
# dd=np.array([1, 2])#纯属练习,numpy的数组可以相加
# ss=np.array([2, 7])
# print(dd+ss)#[3,9]
# plt.figure(figsize=(10,6))#重开纪绘图窗口
plt.bar(x= a,height = yb,width = 0.35, align="center", color="red", label = '公司本金金额')
plt.bar(x= a,height = yc,width = 0.35, bottom=yb, align="center", tick_label=a, color="blue", label = '滞纳金')
for i in range(len(listx)):
plt.text(listx[i], listyb[i]/2, listyb[i], ha="center", va="center", rotation=90)
plt.text(listx[i], listyc[i]*2/3+listyb[i], listyc[i], ha="center", rotation=90)
plt.legend()
plt.show()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
#ui = QDialog()
ui=SIFT()
ui.show()
sys.exit(app.exec_())
![](https://i-blog.csdnimg.cn/blog_migrate/7a6a3e121f5add3eb4ab2cd24fdb6690.png)