BuffMain.py 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736
  1. import sys
  2. from stringprep import in_table_c11
  3. from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QTabWidget, QLabel, QLineEdit, QTextEdit, QFormLayout, QMessageBox, QTreeWidget, QTreeWidgetItem, QDialog, QVBoxLayout as QDialogVBoxLayout, QLineEdit as QDialogLineEdit, QDialogButtonBox, QCheckBox, QComboBox
  4. from PyQt6.QtCore import Qt
  5. import requests as req
  6. import time,random,numpy as np
  7. import threading
  8. import asyncio
  9. import json
  10. from PyQt6.QtWidgets import QFileDialog
  11. from PyQt6.QtCore import pyqtSignal, QObject,pyqtSlot
  12. class MainWindow(QMainWindow):
  13. # 定义一个信号,用于传递日志信息
  14. log_added = pyqtSignal(str, str, str, str, str, str, str, str)
  15. def __init__(self):
  16. super().__init__()
  17. # 设置一个选品停止的flag
  18. self.stop_selecting_flag = False
  19. # 设置一个扫货停止的flag
  20. self.stop_shopping_flag = False
  21. # 向BUFF选品日志列表中写内容的槽函数
  22. self.log_added.connect(self._add_select_log) # 连接信号到槽函数
  23. self.goodsurl = 'https://buff.163.com/api/market/goods'
  24. self.getPaintwearChoicesUrl = 'https://buff.163.com/api/market/goods/info?goods_id='
  25. self.getPriceUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&page_num=1&sort_by=price.asc&goods_id='
  26. self.my_headers = {
  27. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
  28. "Host": "buff.163.com",
  29. "Referer": "https://buff.163.com/market/?game=csgo",
  30. "X-Requested-With": "XMLHttpRequest"
  31. }
  32. # 初始化 phone_edit_map
  33. self.setup_phone_edit_map()
  34. # 设置窗口标题和大小
  35. self.setWindowTitle("垂直布局示例")
  36. self.setGeometry(100, 100, 1500, 800)
  37. # 创建一个垂直布局
  38. layout = QVBoxLayout()
  39. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保垂直布局内容靠左对齐
  40. # 创建一个水平布局来放置按钮
  41. button_layout = QHBoxLayout()
  42. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保水平布局内容靠左对齐
  43. # 创建两个按钮
  44. button1 = QPushButton("选品")
  45. # button2 = QPushButton("扫货")
  46. # 增加停止选品和停止扫货按钮
  47. stop_select_button = QPushButton("停止选品")
  48. # stop_shopping_button = QPushButton("停止扫货")
  49. button_layout.addWidget(button1)
  50. # button_layout.addWidget(button2)
  51. button_layout.addWidget(stop_select_button)
  52. # button_layout.addWidget(stop_shopping_button)
  53. # 连接按钮的点击事件
  54. button1.clicked.connect(self.show_selected_phone_number)
  55. # button2.clicked.connect(self.show_shopping_phone_number)
  56. stop_select_button.clicked.connect(self.stop_selecting) # 新增连接停止选品按钮的点击事件
  57. # stop_shopping_button.clicked.connect(self.stop_shopping) # 新增连接停止扫货按钮的点击事件
  58. # 将水平布局添加到垂直布局中
  59. layout.addLayout(button_layout)
  60. # 创建一个Tab容器
  61. self.tab_widget = QTabWidget()
  62. # 向Tab容器中添加10个标签页
  63. for i in range(1, 12): # 修改循环范围以添加第11个标签页
  64. tab = QWidget()
  65. tab_layout = QVBoxLayout()
  66. tab_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保标签页布局内容靠左对齐
  67. if i == 1:
  68. form_layout = self.create_account_info_form("选品")
  69. tab_layout.addLayout(form_layout)
  70. # elif i == 2:
  71. # form_layout = self.create_account_info_form("扫货")
  72. # tab_layout.addLayout(form_layout)
  73. elif i == 2:
  74. tree_layout = self.create_category_info_form()
  75. tab_layout.addLayout(tree_layout)
  76. elif i == 3:
  77. quality_layout = self.create_quality_info_form()
  78. tab_layout.addLayout(quality_layout)
  79. elif i == 4:
  80. type_layout = self.create_type_info_form()
  81. tab_layout.addLayout(type_layout)
  82. elif i == 5:
  83. appearance_layout = self.create_appearance_info_form()
  84. tab_layout.addLayout(appearance_layout)
  85. elif i == 6:
  86. collectible_layout = self.create_collectible_info_form()
  87. tab_layout.addLayout(collectible_layout)
  88. elif i == 7:
  89. config_layout = self.create_config_info_form("选品")
  90. tab_layout.addLayout(config_layout)
  91. # elif i == 9:
  92. # self.tab_widget.addTab(tab, "BUFF扫货配置")
  93. elif i == 8:
  94. select_log_layout = self.create_select_log_info_form() # 添加BUFF选品日志标签页
  95. tab_layout.addLayout(select_log_layout)
  96. else:
  97. label = QLabel(f"这是标签页 {i}")
  98. tab_layout.addWidget(label)
  99. tab.setLayout(tab_layout)
  100. if i == 1:
  101. self.tab_widget.addTab(tab, "选品账号信息")
  102. # elif i == 2:
  103. # self.tab_widget.addTab(tab, "扫货账号信息")
  104. elif i == 2:
  105. self.tab_widget.addTab(tab, "BUFF品类信息")
  106. elif i == 3:
  107. self.tab_widget.addTab(tab, "BUFF品质信息")
  108. elif i == 4:
  109. self.tab_widget.addTab(tab, "BUFFTYPE信息")
  110. elif i == 5:
  111. self.tab_widget.addTab(tab, "BUFF外观信息")
  112. elif i == 6:
  113. self.tab_widget.addTab(tab, "BUFF收藏品信息")
  114. elif i == 7:
  115. self.tab_widget.addTab(tab, "BUFF选品配置")
  116. # elif i == 9:
  117. # self.tab_widget.addTab(tab, "BUFF扫货配置")
  118. elif i == 8:
  119. self.tab_widget.addTab(tab, "BUFF选品日志")
  120. # else:
  121. # self.tab_widget.addTab(tab, "BUFF扫货日志")
  122. # 将Tab容器添加到布局中
  123. layout.addWidget(self.tab_widget)
  124. # 创建一个中心部件,并将布局设置为中心部件的布局
  125. container = QWidget()
  126. container.setLayout(layout)
  127. # 将中心部件设置为主窗口的中心部件
  128. self.setCentralWidget(container)
  129. def create_account_info_form(self, prefix):
  130. form_layout = QFormLayout()
  131. form_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保表单布局内容靠左对齐
  132. # 创建输入框及其标签
  133. phone_label = QLabel(f"{prefix}手机号码")
  134. phone_edit = QLineEdit()
  135. phone_edit.setFixedWidth(500) # 设置固定宽度为500像素
  136. if prefix == "选品":
  137. phone_edit.setText("17756576757") # 设置选品手机号码默认值
  138. form_layout.addRow(phone_label, phone_edit)
  139. email_label = QLabel(f"{prefix}邮箱号")
  140. email_edit = QLineEdit()
  141. email_edit.setFixedWidth(500) # 设置固定宽度为500像素
  142. if prefix == "选品":
  143. email_edit.setText("704541015@qq.com") # 设置选品邮箱号默认值
  144. form_layout.addRow(email_label, email_edit)
  145. email_alias_label = QLabel(f"{prefix}邮箱特殊代码")
  146. email_alias_edit = QLineEdit()
  147. email_alias_edit.setFixedWidth(500) # 设置固定宽度为500像素
  148. if prefix == "选品":
  149. email_alias_edit.setText("100023") # 设置选品邮箱特殊代码默认值
  150. form_layout.addRow(email_alias_label, email_alias_edit)
  151. cookie_label = QLabel(f"{prefix}cookie")
  152. cookie_edit = QTextEdit() # 使用QTextEdit代替QLineEdit
  153. cookie_edit.setFixedWidth(500) # 设置固定宽度为500像素
  154. if prefix == "选品":
  155. cookie_edit.setText("_ntes_nnid=db955d39ec6952987ea31591e7a7f51e,1735042169953; _ntes_nuid=db955d39ec6952987ea31591e7a7f51e; _ga=GA1.1.1303944876.1735384064; _ga_EPDQHDTJH5=GS1.1.1735384063.1.1.1735384225.0.0.0; Device-Id=qX7ZJINOsL1UQiaTIf95; Locale-Supported=zh-Hans; game=csgo; NTES_YD_SESS=mxI7509dQOFnTUQL4erKAStVmmtgMVa2fLeArKiEwwfjhziQhoRng7jY76Fxt8Vx7Ug.rpFx_vgIUTnBU8WITvvsRbBJWpCgP5XKqRqj4dnxzwAXY7EB0k3RQSJVP6qBxmRQ3.4Dwg3N3zdbohGyDXYod7SqWwPf_ojsRYWGRA9juuEQBV5olV2BachLQOUPo_aaFTxdYDE4u.csB3dEd3FIOlk7iMX0Fo876uDHXUIju; S_INFO=1739607355|0|0&60##|17756576737; P_INFO=17756576737|1739607355|1|netease_buff|00&99|null&null&null#anh&341500#10#0|&0||17756576737; remember_me=U1084290368|NMXKtwDtRU9WpyahhliKCdNpCvsNz7Fm; session=1-MexohkheMA8hyDbqWC6qqjqXI51BN9AlucXjGPC00KgG2020502040; csrf_token=Ijk3MzdhYTQ1ZGZiNzVlODJiODRlMDgyY2FjNDZhYjFiOWM0ZTMyZjci.Z7Bd6w.WgVS2vOGY-azeRlsnOboVc2nuUE") # 设置选品cookie默认值
  156. form_layout.addRow(cookie_label, cookie_edit)
  157. # 保存输入框的引用以便后续访问
  158. self.phone_edit_map[prefix] = phone_edit
  159. return form_layout
  160. def create_category_info_form(self):
  161. layout = QVBoxLayout()
  162. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  163. # 创建树形控件
  164. self.tree_widget = QTreeWidget()
  165. self.tree_widget.setHeaderLabels(["选择", "品类名称", "品类编码"])
  166. self.tree_widget.setColumnCount(3)
  167. self.tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  168. self.tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  169. self.tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  170. self.tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  171. # 启用复选框
  172. self.tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  173. self.tree_widget.setColumnWidth(1, 300) # 设置品类名称列的宽度
  174. self.tree_widget.setColumnWidth(2, 150) # 设置品类编码列的宽度
  175. self.tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "品类名称", "品类编码"])) # 设置表头
  176. self.tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  177. # 添加默认的品类信息
  178. default_categories = [
  179. {"name": "蝴蝶刀", "code": "weapon_knife_butterfly"},
  180. {"name": "M9 刺刀", "code": "weapon_knife_m9_bayonet"},
  181. {"name": "爪子刀", "code": "weapon_knife_karambit"},
  182. {"name": "廓尔喀刀", "code": "weapon_knife_kke"}
  183. ]
  184. for category in default_categories:
  185. item = QTreeWidgetItem(self.tree_widget)
  186. item.setText(1, category["name"])
  187. item.setText(2, category["code"])
  188. checkbox = QCheckBox()
  189. checkbox.setChecked(False)
  190. self.tree_widget.setItemWidget(item, 0, checkbox)
  191. layout.addWidget(self.tree_widget)
  192. # 创建按钮布局
  193. button_layout = QHBoxLayout()
  194. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  195. # 创建添加按钮
  196. add_button = QPushButton("添加")
  197. add_button.clicked.connect(self.add_category)
  198. button_layout.addWidget(add_button)
  199. # 创建删除按钮
  200. delete_button = QPushButton("删除")
  201. delete_button.clicked.connect(self.delete_category)
  202. button_layout.addWidget(delete_button)
  203. # 创建编辑按钮
  204. edit_button = QPushButton("编辑")
  205. edit_button.clicked.connect(self.edit_category)
  206. button_layout.addWidget(edit_button)
  207. layout.addLayout(button_layout)
  208. return layout
  209. def create_quality_info_form(self):
  210. layout = QVBoxLayout()
  211. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  212. # 创建树形控件
  213. self.quality_tree_widget = QTreeWidget()
  214. self.quality_tree_widget.setHeaderLabels(["选择", "品质编码", "品质名称"])
  215. self.quality_tree_widget.setColumnCount(3)
  216. self.quality_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  217. self.quality_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  218. self.quality_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  219. self.quality_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  220. # 启用复选框
  221. self.quality_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  222. self.quality_tree_widget.setColumnWidth(1, 150) # 设置品质编码列的宽度
  223. self.quality_tree_widget.setColumnWidth(2, 300) # 设置品质名称列的宽度
  224. self.quality_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "品质编码", "品质名称"])) # 设置表头
  225. self.quality_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  226. # 添加默认的品质信息
  227. default_qualities = [
  228. {"code": "contraband", "name": "违禁"},
  229. {"code": "ancient_weapon", "name": "隐秘"}
  230. ]
  231. for quality in default_qualities:
  232. item = QTreeWidgetItem(self.quality_tree_widget)
  233. item.setText(1, quality["code"])
  234. item.setText(2, quality["name"])
  235. checkbox = QCheckBox()
  236. checkbox.setChecked(False)
  237. self.quality_tree_widget.setItemWidget(item, 0, checkbox)
  238. layout.addWidget(self.quality_tree_widget)
  239. # 创建按钮布局
  240. button_layout = QHBoxLayout()
  241. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  242. # 创建添加按钮
  243. add_button = QPushButton("添加")
  244. add_button.clicked.connect(self.add_quality)
  245. button_layout.addWidget(add_button)
  246. # 创建删除按钮
  247. delete_button = QPushButton("删除")
  248. delete_button.clicked.connect(self.delete_quality)
  249. button_layout.addWidget(delete_button)
  250. # 创建编辑按钮
  251. edit_button = QPushButton("编辑")
  252. edit_button.clicked.connect(self.edit_quality)
  253. button_layout.addWidget(edit_button)
  254. layout.addLayout(button_layout)
  255. return layout
  256. def create_type_info_form(self):
  257. layout = QVBoxLayout()
  258. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  259. # 创建树形控件
  260. self.type_tree_widget = QTreeWidget()
  261. self.type_tree_widget.setHeaderLabels(["选择", "type编码", "type名称"])
  262. self.type_tree_widget.setColumnCount(3)
  263. self.type_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  264. self.type_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  265. self.type_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  266. self.type_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  267. # 启用复选框
  268. self.type_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  269. self.type_tree_widget.setColumnWidth(1, 150) # 设置type编码列的宽度
  270. self.type_tree_widget.setColumnWidth(2, 300) # 设置type名称列的宽度
  271. self.type_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "type编码", "type名称"])) # 设置表头
  272. self.type_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  273. # 添加默认的type信息
  274. default_types = [
  275. {"code": "normal", "name": "普通"},
  276. {"code": "tournament", "name": "纪念品"}
  277. ]
  278. for type_info in default_types:
  279. item = QTreeWidgetItem(self.type_tree_widget)
  280. item.setText(1, type_info["code"])
  281. item.setText(2, type_info["name"])
  282. checkbox = QCheckBox()
  283. checkbox.setChecked(False)
  284. self.type_tree_widget.setItemWidget(item, 0, checkbox)
  285. layout.addWidget(self.type_tree_widget)
  286. # 创建按钮布局
  287. button_layout = QHBoxLayout()
  288. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  289. # 创建添加按钮
  290. add_button = QPushButton("添加")
  291. add_button.clicked.connect(self.add_type)
  292. button_layout.addWidget(add_button)
  293. # 创建删除按钮
  294. delete_button = QPushButton("删除")
  295. delete_button.clicked.connect(self.delete_type)
  296. button_layout.addWidget(delete_button)
  297. # 创建编辑按钮
  298. edit_button = QPushButton("编辑")
  299. edit_button.clicked.connect(self.edit_type)
  300. button_layout.addWidget(edit_button)
  301. layout.addLayout(button_layout)
  302. return layout
  303. def create_appearance_info_form(self):
  304. layout = QVBoxLayout()
  305. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  306. # 创建树形控件
  307. self.appearance_tree_widget = QTreeWidget()
  308. self.appearance_tree_widget.setHeaderLabels(["选择", "外观编码", "外观名称"])
  309. self.appearance_tree_widget.setColumnCount(3)
  310. self.appearance_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  311. self.appearance_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  312. self.appearance_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  313. self.appearance_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  314. # 启用复选框
  315. self.appearance_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  316. self.appearance_tree_widget.setColumnWidth(1, 150) # 设置外观编码列的宽度
  317. self.appearance_tree_widget.setColumnWidth(2, 300) # 设置外观名称列的宽度
  318. self.appearance_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "外观编码", "外观名称"])) # 设置表头
  319. self.appearance_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  320. # 添加默认的外观信息
  321. default_appearances = [
  322. {"code": "wearcategory0", "name": "崭新出厂"},
  323. {"code": "wearcategory1", "name": "略有磨损"}
  324. ]
  325. for appearance in default_appearances:
  326. item = QTreeWidgetItem(self.appearance_tree_widget)
  327. item.setText(1, appearance["code"])
  328. item.setText(2, appearance["name"])
  329. checkbox = QCheckBox()
  330. checkbox.setChecked(False)
  331. self.appearance_tree_widget.setItemWidget(item, 0, checkbox)
  332. layout.addWidget(self.appearance_tree_widget)
  333. # 创建按钮布局
  334. button_layout = QHBoxLayout()
  335. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  336. # 创建添加按钮
  337. add_button = QPushButton("添加")
  338. add_button.clicked.connect(self.add_appearance)
  339. button_layout.addWidget(add_button)
  340. # 创建删除按钮
  341. delete_button = QPushButton("删除")
  342. delete_button.clicked.connect(self.delete_appearance)
  343. button_layout.addWidget(delete_button)
  344. # 创建编辑按钮
  345. edit_button = QPushButton("编辑")
  346. edit_button.clicked.connect(self.edit_appearance)
  347. button_layout.addWidget(edit_button)
  348. layout.addLayout(button_layout)
  349. return layout
  350. def create_collectible_info_form(self):
  351. layout = QVBoxLayout()
  352. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  353. # 创建树形控件
  354. self.collectible_tree_widget = QTreeWidget()
  355. self.collectible_tree_widget.setHeaderLabels(["选择", "收藏品编码", "收藏品名称"])
  356. self.collectible_tree_widget.setColumnCount(3)
  357. self.collectible_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  358. self.collectible_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  359. self.collectible_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  360. self.collectible_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  361. # 启用复选框
  362. self.collectible_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  363. self.collectible_tree_widget.setColumnWidth(1, 150) # 设置收藏品编码列的宽度
  364. self.collectible_tree_widget.setColumnWidth(2, 300) # 设置收藏品名称列的宽度
  365. self.collectible_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "收藏品编码", "收藏品名称"])) # 设置表头
  366. self.collectible_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  367. # 添加默认的收藏品信息
  368. default_collectibles = [
  369. {"code": "C001", "name": "默认收藏品1"},
  370. {"code": "C002", "name": "默认收藏品2"}
  371. ]
  372. for collectible in default_collectibles:
  373. item = QTreeWidgetItem(self.collectible_tree_widget)
  374. item.setText(1, collectible["code"])
  375. item.setText(2, collectible["name"])
  376. checkbox = QCheckBox()
  377. checkbox.setChecked(False)
  378. self.collectible_tree_widget.setItemWidget(item, 0, checkbox)
  379. layout.addWidget(self.collectible_tree_widget)
  380. # 创建按钮布局
  381. button_layout = QHBoxLayout()
  382. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  383. # 创建添加按钮
  384. add_button = QPushButton("添加")
  385. add_button.clicked.connect(self.add_collectible)
  386. button_layout.addWidget(add_button)
  387. # 创建删除按钮
  388. delete_button = QPushButton("删除")
  389. delete_button.clicked.connect(self.delete_collectible)
  390. button_layout.addWidget(delete_button)
  391. # 创建编辑按钮
  392. edit_button = QPushButton("编辑")
  393. edit_button.clicked.connect(self.edit_collectible)
  394. button_layout.addWidget(edit_button)
  395. layout.addLayout(button_layout)
  396. return layout
  397. def create_config_info_form(self, prefix):
  398. form_layout = QFormLayout()
  399. form_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保表单布局内容靠左对齐
  400. # 创建选品最低价输入框及其标签
  401. min_price_label = QLabel(f"{prefix}最低价")
  402. self.min_price_edit = QLineEdit()
  403. self.min_price_edit.setFixedWidth(500) # 设置固定宽度为500像素
  404. form_layout.addRow(min_price_label, self.min_price_edit)
  405. # 创建选品最高价输入框及其标签
  406. max_price_label = QLabel(f"{prefix}最高价")
  407. self.max_price_edit = QLineEdit()
  408. self.max_price_edit.setFixedWidth(500) # 设置固定宽度为500像素
  409. form_layout.addRow(max_price_label, self.max_price_edit)
  410. # 创建选品排序模式下拉选择框及其标签
  411. sort_mode_label = QLabel(f"{prefix}排序模式")
  412. self.sort_mode_combo = QComboBox()
  413. self.sort_mode_combo.addItems(["默认", "价格升序", "价格降序", "在售数量升序"])
  414. self.sort_mode_combo.setFixedWidth(500) # 设置固定宽度为500像素
  415. form_layout.addRow(sort_mode_label, self.sort_mode_combo)
  416. # 创建选品停止条件下拉选择框及其标签
  417. stop_condition_label = QLabel(f"{prefix}停止条件")
  418. self.stop_condition_combo = QComboBox()
  419. self.stop_condition_combo.addItems(["按照成功数量", "按照扫描数量"])
  420. self.stop_condition_combo.setFixedWidth(500) # 设置固定宽度为500像素
  421. form_layout.addRow(stop_condition_label, self.stop_condition_combo)
  422. # 创建成功数量配置输入框及其标签
  423. success_count_label = QLabel(f"{prefix}成功数量配置")
  424. self.success_count_edit = QLineEdit()
  425. self.success_count_edit.setFixedWidth(500) # 设置固定宽度为500像素
  426. self.success_count_edit.setText("100") # 设置默认值为100
  427. form_layout.addRow(success_count_label, self.success_count_edit)
  428. # 创建扫描商品数量配置输入框及其标签
  429. scan_count_label = QLabel(f"{prefix}扫描商品数量")
  430. self.scan_count_edit = QLineEdit()
  431. self.scan_count_edit.setFixedWidth(500) # 设置固定宽度为500像素
  432. self.scan_count_edit.setText("10000") # 设置默认值为10000
  433. form_layout.addRow(scan_count_label, self.scan_count_edit)
  434. # 创建选品接口每页请求数量配置输入框及其标签
  435. page_size_label = QLabel(f"{prefix}接口每页请求数量")
  436. self.page_size_edit = QLineEdit()
  437. self.page_size_edit.setFixedWidth(500) # 设置固定宽度为500像素
  438. self.page_size_edit.setText("80") # 设置默认值为80
  439. form_layout.addRow(page_size_label, self.page_size_edit)
  440. # 创建每次调用BUFF接口暂停时间配置输入框及其标签
  441. pause_time_label = QLabel(f"{prefix}接口暂停时间(秒)")
  442. self.pause_time_edit = QLineEdit()
  443. self.pause_time_edit.setFixedWidth(500) # 设置固定宽度为500像素
  444. self.pause_time_edit.setText("10") # 设置默认值为10
  445. form_layout.addRow(pause_time_label, self.pause_time_edit)
  446. # 创建选品接口最大请求多少页配置输入框及其标签
  447. max_pages_label = QLabel(f"{prefix}接口最大请求多少页")
  448. self.max_pages_edit = QLineEdit()
  449. self.max_pages_edit.setFixedWidth(500) # 设置固定宽度为500像素
  450. self.max_pages_edit.setText("100") # 设置默认值为100
  451. form_layout.addRow(max_pages_label, self.max_pages_edit)
  452. # 创建商品参考价调整系数输入框及其标签
  453. ref_price_adjust_label = QLabel(f"{prefix}商品参考价调整系数%")
  454. self.ref_price_adjust_edit = QLineEdit()
  455. self.ref_price_adjust_edit.setFixedWidth(500) # 设置固定宽度为500像素
  456. self.ref_price_adjust_edit.setText("10") # 设置默认值为10
  457. form_layout.addRow(ref_price_adjust_label, self.ref_price_adjust_edit)
  458. # 创建商品扫货价调整系数输入框及其标签
  459. sweep_price_adjust_label = QLabel(f"{prefix}商品扫货价调整系数%")
  460. self.sweep_price_adjust_edit = QLineEdit()
  461. self.sweep_price_adjust_edit.setFixedWidth(500) # 设置固定宽度为500像素
  462. self.sweep_price_adjust_edit.setText("2") # 设置默认值为2
  463. form_layout.addRow(sweep_price_adjust_label, self.sweep_price_adjust_edit)
  464. return form_layout
  465. def create_select_log_info_form(self):
  466. layout = QVBoxLayout()
  467. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  468. # 创建树形控件
  469. self.select_log_tree_widget = QTreeWidget()
  470. self.select_log_tree_widget.setHeaderLabels(["选择", "商品ID", "商品名称", "磨损最低值", "磨损最高值", "全磨损区间最低价", "扫货价", "判断价", "时间"])
  471. self.select_log_tree_widget.setColumnCount(9)
  472. self.select_log_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  473. self.select_log_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  474. self.select_log_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  475. self.select_log_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  476. # 启用复选框
  477. self.select_log_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  478. self.select_log_tree_widget.setColumnWidth(1, 100) # 设置商品ID列的宽度
  479. self.select_log_tree_widget.setColumnWidth(2, 200) # 设置商品名称列的宽度
  480. self.select_log_tree_widget.setColumnWidth(3, 100) # 设置磨损最低值列的宽度
  481. self.select_log_tree_widget.setColumnWidth(4, 100) # 设置磨损最高值列的宽度
  482. self.select_log_tree_widget.setColumnWidth(5, 150) # 设置全磨损区间最低价列的宽度
  483. self.select_log_tree_widget.setColumnWidth(6, 100) # 设置扫货价列的宽度
  484. self.select_log_tree_widget.setColumnWidth(7, 100) # 设置判断价列的宽度
  485. self.select_log_tree_widget.setColumnWidth(8, 150) # 设置时间列的宽度
  486. self.select_log_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "商品ID", "商品名称", "磨损最低值", "磨损最高值", "全磨损区间最低价", "扫货价", "判断价", "时间"])) # 设置表头
  487. self.select_log_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  488. layout.addWidget(self.select_log_tree_widget)
  489. # 创建按钮布局
  490. button_layout = QHBoxLayout()
  491. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  492. # 创建添加按钮
  493. add_button = QPushButton("添加")
  494. add_button.clicked.connect(self.show_add_select_log_dialog)
  495. button_layout.addWidget(add_button)
  496. # 创建删除按钮
  497. delete_button = QPushButton("删除")
  498. delete_button.clicked.connect(self.delete_select_log)
  499. button_layout.addWidget(delete_button)
  500. # 创建编辑按钮
  501. edit_button = QPushButton("编辑")
  502. edit_button.clicked.connect(self.edit_select_log)
  503. button_layout.addWidget(edit_button)
  504. # 创建导出按钮
  505. export_button = QPushButton("导出")
  506. export_button.clicked.connect(self.export_selected_logs)
  507. button_layout.addWidget(export_button)
  508. layout.addLayout(button_layout)
  509. return layout
  510. def show_selected_phone_number(self):
  511. # 设置选品停止标志为False
  512. self.stop_selecting_flag = False
  513. # 必填条件,没有则跳出
  514. self.phone_number = self.phone_edit_map["选品"].text()
  515. QMessageBox.information(self, "选品手机号码", f"选品手机号码: {self.phone_number}")
  516. # 判断phone_number是否为空,为空则跳出方法
  517. if not self.phone_number:
  518. QMessageBox.information(self, "选品手机号码", "选品手机号码不能为空")
  519. return
  520. # 判断选品cookie是否为空,为空则退出方法
  521. self.cookie_text = self.phone_edit_map["选品"].parent().findChild(QTextEdit).toPlainText()
  522. if not self.cookie_text:
  523. QMessageBox.information(self, "选品Cookie", "选品Cookie不能为空")
  524. return
  525. # 获取勾选中的品类编码信息
  526. self.selected_categories = []
  527. # 获取勾选中的品类信息
  528. self.selected_categories_items = []
  529. for i in range(self.tree_widget.topLevelItemCount()):
  530. item = self.tree_widget.topLevelItem(i)
  531. checkbox = self.tree_widget.itemWidget(item, 0)
  532. if checkbox.isChecked():
  533. category_code = item.text(2)
  534. category_name = item.text(1)
  535. self.selected_categories.append(category_code)
  536. self.selected_categories_items.append(f"{category_code}({category_name})")
  537. if self.selected_categories:
  538. QMessageBox.information(self, "勾选的品类信息", f"勾选的品类信息: {', '.join(self.selected_categories_items)}")
  539. else:
  540. QMessageBox.information(self, "勾选的品类信息", "没有勾选任何品类信息")
  541. # 获取勾选中的品质编码信息
  542. self.selected_qualities = []
  543. # 获取勾选中的品质信息
  544. self.selected_qualities_items = []
  545. for i in range(self.quality_tree_widget.topLevelItemCount()):
  546. item = self.quality_tree_widget.topLevelItem(i)
  547. checkbox = self.quality_tree_widget.itemWidget(item, 0)
  548. if checkbox.isChecked():
  549. quality_code = item.text(1)
  550. quality_name = item.text(2)
  551. self.selected_qualities.append(quality_code)
  552. self.selected_qualities_items.append(f"{quality_code}({quality_name})")
  553. if self.selected_qualities:
  554. QMessageBox.information(self, "勾选的品质信息", f"勾选的品质信息: {', '.join(self.selected_qualities_items)}")
  555. else:
  556. QMessageBox.information(self, "勾选的品质信息", "没有勾选任何品质信息")
  557. # 获取勾选中的type编码信息
  558. self.selected_types = []
  559. # 获取勾选中的type信息
  560. self.selected_types_items = []
  561. for i in range(self.type_tree_widget.topLevelItemCount()):
  562. item = self.type_tree_widget.topLevelItem(i)
  563. checkbox = self.type_tree_widget.itemWidget(item, 0)
  564. if checkbox.isChecked():
  565. type_code = item.text(1)
  566. type_name = item.text(2)
  567. self.selected_types.append(type_code)
  568. self.selected_types_items.append(f"{type_code}({type_name})")
  569. if self.selected_types:
  570. QMessageBox.information(self, "勾选的类别信息", f"勾选的类别信息: {', '.join(self.selected_types_items)}")
  571. else:
  572. QMessageBox.information(self, "勾选的类别信息", "没有勾选任何类别信息")
  573. # 获取勾选中的外观编码信息
  574. self.selected_appearances = []
  575. # 获取勾选中的外观信息
  576. self.selected_appearances_items = []
  577. for i in range(self.appearance_tree_widget.topLevelItemCount()):
  578. item = self.appearance_tree_widget.topLevelItem(i)
  579. checkbox = self.appearance_tree_widget.itemWidget(item, 0)
  580. if checkbox.isChecked():
  581. appearance_code = item.text(1)
  582. appearance_name = item.text(2)
  583. self.selected_appearances.append(appearance_code)
  584. self.selected_appearances_items.append(f"{appearance_code}({appearance_name})")
  585. if self.selected_appearances:
  586. QMessageBox.information(self, "勾选的外观信息", f"勾选的外观信息: {', '.join(self.selected_appearances_items)}")
  587. else:
  588. QMessageBox.information(self, "勾选的外观信息", "没有勾选任何外观信息")
  589. # 获取勾选中的收藏品编码信息
  590. self.selected_collectibles = []
  591. # 获取勾选中的收藏品信息
  592. self.selected_collectibles_items = []
  593. for i in range(self.collectible_tree_widget.topLevelItemCount()):
  594. item = self.collectible_tree_widget.topLevelItem(i)
  595. checkbox = self.collectible_tree_widget.itemWidget(item, 0)
  596. if checkbox.isChecked():
  597. collectible_code = item.text(1)
  598. collectible_name = item.text(2)
  599. self.selected_collectibles.append(collectible_code)
  600. self.selected_collectibles_items.append(f"{collectible_code}({collectible_name})")
  601. if self.selected_collectibles:
  602. QMessageBox.information(self, "勾选的收藏品信息", f"勾选的收藏品信息: {', '.join(self.selected_collectibles_items)}")
  603. else:
  604. QMessageBox.information(self, "勾选的收藏品信息", "没有勾选任何收藏品信息")
  605. # 获取选品配置信息
  606. self.min_price = self.min_price_edit.text()
  607. self.max_price = self.max_price_edit.text()
  608. self.sort_mode = self.sort_mode_combo.currentText()
  609. self.stop_condition = self.stop_condition_combo.currentText()
  610. self.success_count = self.success_count_edit.text()
  611. self.scan_count = self.scan_count_edit.text()
  612. self.page_size = self.page_size_edit.text()
  613. self.pause_time = self.pause_time_edit.text()
  614. #获取选品配置信息选品接口最大请求多少页
  615. self.max_page = self.max_pages_edit.text()
  616. #获取选品商品参考价调整系数
  617. self.ref_price_adjust = int(self.ref_price_adjust_edit.text())
  618. #获取选品商品扫货价调整系数
  619. self.sweep_price_adjust = int(self.sweep_price_adjust_edit.text())
  620. QMessageBox.information(self, "选品配置信息",
  621. f"选品最低价: {self.min_price}\n"
  622. f"选品最高价: {self.max_price}\n"
  623. f"选品排序模式: {self.sort_mode}\n"
  624. f"选品停止条件: {self.stop_condition}\n"
  625. f"选品成功数量配置: {self.success_count}\n"
  626. f"选品扫描商品数量: {self.scan_count}\n"
  627. f"选品接口每页请求数量: {self.page_size}\n"
  628. f"选品接口暂停时间(秒): {self.pause_time}\n"
  629. f"选品接口最大请求多少页: {self.max_page}\n"
  630. f"选品商品参考价调整系数%: {self.ref_price_adjust}\n"
  631. f"选品商品扫货价调整系数%: {self.sweep_price_adjust}\n")
  632. try:
  633. thread_searchGoods = threading.Thread(target=self.firstSelectGoods)
  634. thread_searchGoods.start()
  635. except Exception as e:
  636. print(f"Error: {e}")
  637. def firstSelectGoods(self):
  638. # 组装商品选取API的入参list
  639. search_goods_param_list = []
  640. # 已经选品的数量
  641. self.searchedGoodsNum = 0
  642. # 已经选品成功的数量
  643. self.search_success_count = 0
  644. non_empty_lists = {
  645. 'category': self.selected_categories,
  646. 'rarity': self.selected_qualities,
  647. 'quality': self.selected_types,
  648. 'exterior': self.selected_appearances,
  649. 'itemset': self.selected_collectibles
  650. }
  651. # 只保留非空的列表
  652. filtered_lists = {k: v for k, v in non_empty_lists.items() if v}
  653. # 如果所有列表都为空,返回空列表
  654. if not filtered_lists:
  655. print('品类、品质、类别、外观、收藏品的筛选条件都为空')
  656. search_goods_param_list = [{}]
  657. else:
  658. # 生成所有可能的组合
  659. # 使用itertools.product来生成所有可能的组合
  660. from itertools import product
  661. # 获取所有非空列表的值
  662. values = list(filtered_lists.values())
  663. # 获取所有非空列表的键
  664. keys = list(filtered_lists.keys())
  665. for combination in product(*values):
  666. combination_dict = {keys[i]: combination[i] for i in range(len(keys))}
  667. search_goods_param_list.append(combination_dict)
  668. for i in range(len(search_goods_param_list)):
  669. search_goods_param_list[i]['category_group'] = search_goods_param_list[i]['category']
  670. # 遍历search_goods_param_list
  671. for i in range(len(search_goods_param_list)):
  672. search_goods_param_list[i].update({ 'game': 'csgo'})
  673. # 判断min_price是否为空
  674. if self.min_price:
  675. search_goods_param_list[i]['min_price'] = self.min_price
  676. # 判断max_price是否为空
  677. if self.max_price:
  678. search_goods_param_list[i]['max_price'] = self.max_price
  679. # 判断sort_mode是否为空
  680. if self.sort_mode:
  681. if self.sort_mode == '默认':
  682. pass
  683. elif self.sort_mode == '价格升序':
  684. search_goods_param_list[i]['sort_by'] = 'price.asc'
  685. elif self.sort_mode == '价格降序':
  686. search_goods_param_list[i]['sort_by'] = 'price.desc'
  687. elif self.sort_mode == '在售数量升序':
  688. search_goods_param_list[i]['sort_by'] = 'sell_num.desc'
  689. # 判断选品接口每页请求数量是否为空
  690. if self.page_size:
  691. search_goods_param_list[i]['page_size'] = self.page_size
  692. # 选品接口每次的page_num 默认100
  693. if self.max_page:
  694. search_goods_param_list[i]['page_num'] = self.max_page
  695. print(f"请求网易BUFF商品的接口的入参为:{search_goods_param_list}")
  696. self.my_headers.update({
  697. 'Cookie': self.cookie_text
  698. })
  699. try:
  700. print('选品接口请求参数列表 search_goods_param_list 长度:',len(search_goods_param_list))
  701. #遍历search_goods_param_list
  702. for i in range(len(search_goods_param_list)):
  703. try:
  704. pagenum = self.max_page
  705. j = pagenum
  706. first_flag = True
  707. while int(j) <= int(pagenum):
  708. datalist=[]
  709. if not first_flag:
  710. print(f"第{j}/{pagenum}页,API请求参数为:{search_goods_param_list[i]}")
  711. else:
  712. print(f"新查询条件第一次预请求,API请求参数为:{search_goods_param_list[i]}")
  713. try:
  714. # 开始时间为当前时间
  715. start_time = time.time()
  716. if not first_flag:
  717. search_goods_param_list[i]['page_num'] = j
  718. # print('search_goods_param_list[i]12:',search_goods_param_list[i])
  719. api1_res = req.get(url=self.goodsurl, headers=self.my_headers, params=search_goods_param_list[i])
  720. print('选品接口请求返回报文:', api1_res.text.strip())
  721. data = api1_res.json()['data']
  722. print('选品接口请求返回报文中的CODE:', api1_res.json()['code'] )
  723. #如果data中的code不等于OK,则跳出循环
  724. if api1_res.json()['code'] != 'OK':
  725. print('选品接口请求返回报文:', api1_res.text.strip())
  726. print('选品接口请求返回报文code不等于OK,跳出循环')
  727. continue
  728. datalist.extend(data['items'])
  729. # 遍历datalist
  730. for k in range(len(datalist)):
  731. print('k:',k)
  732. # 做终止判断是否点击了停止选品按钮
  733. if self.stop_selecting_flag:
  734. print('停止选品')
  735. return
  736. # 判断选品停止条件来判断是否需要终止
  737. if self.stop_condition == '按照成功数量':
  738. print(f'按照成功数量,设定的成功数量为:{self.success_count},当前检索已成功的数量为:{self.search_success_count}')
  739. if int(self.success_count) < int(self.search_success_count):
  740. return
  741. else:
  742. #按照选品数量来判断是否要停止
  743. print(f'按照选品数量,设定的选品数量为:{self.scan_count},当前检索的选品数量为:{self.searchedGoodsNum}')
  744. if int(self.scan_count) < int(self.searchedGoodsNum):
  745. return
  746. print('执行选品------------商品id:',str(datalist[k]["id"]))
  747. # 选品的数量+1
  748. self.searchedGoodsNum += 1
  749. # 1、获取磨损
  750. self.getPaintwearChoices(datalist[k]["id"])
  751. if len(self.paintwear_choices) <= 0:
  752. print(f'获取商品id:{datalist[k]["id"]}磨损信息失败')
  753. continue
  754. # 1、先获取全磨损的最低价 170
  755. min_price = float(self.getPaintwearChoicesMinPrice(datalist[k]["id"],'',''))
  756. #每个磨损区间的最低价
  757. min_price_list = []
  758. #2、获取每个磨损区间的最低价 270 260 230 240 170
  759. for i3 in range(len(self.paintwear_choices)):
  760. min_price_list.append(
  761. {
  762. 'min_wear': self.paintwear_choices[i3][0],
  763. 'max_wear': self.paintwear_choices[i3][1],
  764. 'min_price':float(self.getPaintwearChoicesMinPrice(datalist[k]["id"],self.paintwear_choices[i3][0],self.paintwear_choices[i3][1]))
  765. }
  766. )
  767. print('min_price_list:',min_price_list)
  768. #3、全区间的最低价 170 * (1+10%),10%是设定的 = 187元
  769. pd_price = round(min_price * (100 + self.ref_price_adjust) / 100 ,4)
  770. #4、将5个磨损区间的最低价跟187比对,只留高于这个187价格的区间
  771. # 遍历 min_price_list
  772. for i1 in range(len(min_price_list)):
  773. if min_price_list[i1]['min_price'] < pd_price:
  774. # min_price_list 删除i1及以后的元素
  775. min_price_list = min_price_list[:i1]
  776. break
  777. #5、根据阶梯来确定磨损区间
  778. # 遍历 min_price_list,判断元素中的min_price是否小于上一个元素的min_price,
  779. for i2 in range(len(min_price_list)-1):
  780. if min_price_list[i2]['min_price'] < min_price_list[i2+1]['min_price']:
  781. # min_price_list 删除i2及以后的元素
  782. min_price_list = min_price_list[:i2+1]
  783. break
  784. #6、170*(1+0.02)= 173.4 购买溢价
  785. gm_price = round(min_price * (100 + self.sweep_price_adjust) / 100,4)
  786. # 向BUFF选品日志标签页中添加一条数据
  787. timestamp = time.time()
  788. local_time = time.localtime(timestamp)
  789. formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', local_time)
  790. print(f'商品id:{datalist[k]["id"]} 筛选成功, 磨损及价格区间min_price_list:',min_price_list)
  791. # min_price_list 为空则继续下次循环
  792. if len(min_price_list) <= 0:
  793. continue
  794. # 向BUFF选品日志标签页中增加记录 发出信号而不是直接调用 add_select_log
  795. self.log_added.emit(str(datalist[k]["id"]), str(datalist[k]["name"]),str(min_price_list[0]['min_wear']), str(min_price_list[-1]['max_wear']), str(min_price), str(gm_price), str(pd_price), str(formatted_time))
  796. #检索成功数量+1
  797. self.search_success_count += 1
  798. if not first_flag:
  799. j += 1
  800. if first_flag:
  801. if int(data['total_page']) < int(self.max_page) :
  802. pagenum = data['total_page']
  803. j = 1
  804. first_flag= False
  805. except Exception as e:
  806. print('选品接口1请求--失败',e)
  807. finally:
  808. # 结束时间为当前时间
  809. end_time = time.time()
  810. #从start_time到end_time 必须修改pause_time秒
  811. if float(end_time - start_time) < float(self.pause_time):
  812. time.sleep(float(self.pause_time) - (end_time - start_time) + random.randint(0, 5))
  813. except Exception as e:
  814. print('选品接口2请求--失败',e)
  815. except Exception as e:
  816. print('选品接口3请求--失败',e)
  817. # 获取商品磨损信息
  818. def getPaintwearChoices(self,goods_id):
  819. print(f"获取商品id:{goods_id}的磨损信息" )
  820. self.paintwear_choices = []
  821. # 开始时间为当前时间
  822. start_time = time.time()
  823. self.my_headers.update({
  824. 'Cookie': self.cookie_text
  825. })
  826. try:
  827. api2_res = req.get(url=self.getPaintwearChoicesUrl+str(goods_id), headers=self.my_headers)
  828. print(f'获取商品id:{goods_id}磨损信息请求的返回报文: {api2_res.text.strip()}')
  829. data = api2_res.json()['data']
  830. #如果data中的code不等于OK,则跳出循环
  831. if api2_res.json()['code'] != 'OK':
  832. print(f'获取商品id:{goods_id}磨损信息接口请求返回报文: {api2_res.text.strip()}')
  833. print(f'获取商品id:{goods_id}磨损信息接口请求返回报文code不等于OK,跳出循环')
  834. return
  835. self.paintwear_choices = data['paintwear_choices']
  836. print(f"获取商品id:{goods_id}的磨损信息:",self.paintwear_choices)
  837. except Exception as e:
  838. print(f'获取商品id:{goods_id}的磨损信息接口请求--失败',e)
  839. finally:
  840. # 结束时间为当前时间
  841. end_time = time.time()
  842. #从start_time到end_time 必须修改pause_time秒
  843. if float(end_time - start_time) < float(self.pause_time):
  844. time.sleep(float(self.pause_time) - (end_time - start_time) + random.randint(0, 5))
  845. # 获取磨损区间最低价格信息
  846. def getPaintwearChoicesMinPrice(self,goods_id,min_paint_wear,max_paint_wear):
  847. # min_paint_wear 为空 打印语句写成不限区间
  848. if min_paint_wear == '' and max_paint_wear == '':
  849. print(f"获取商品id:{goods_id}的磨损不限区间的最低价格" )
  850. else:
  851. print(f"获取商品id:{goods_id}的磨损区间{min_paint_wear}--{max_paint_wear}的最低价格" )
  852. # 开始时间为当前时间
  853. min_price = 0
  854. start_time = time.time()
  855. self.my_headers.update({
  856. 'Cookie': self.cookie_text
  857. })
  858. url = self.getPriceUrl+str(goods_id)
  859. # min_paint_wear 不为空
  860. if min_paint_wear != '':
  861. print('min_paint_wear 最低磨损值 不为空')
  862. url += '&min_paintwear='+str(min_paint_wear)
  863. # max_paint_wear 不为空
  864. if max_paint_wear != '':
  865. print('max_paint_wear 最高磨损值 不为空')
  866. url += '&max_paintwear='+str(max_paint_wear)
  867. try:
  868. api2_res = req.get(url=url, headers=self.my_headers)
  869. print(f'获取商品id:{goods_id}磨损区间{min_paint_wear}--{max_paint_wear}最低价格请求的返回报文: {api2_res.text.strip()}')
  870. data = api2_res.json()['data']
  871. #如果data中的code不等于OK,则跳出循环
  872. if api2_res.json()['code'] != 'OK':
  873. print(f'获取商品id:{goods_id}磨损区间{min_paint_wear}--{max_paint_wear}最低价格请求返回报文: {api2_res.text.strip()}')
  874. print(f'获取商品id:{goods_id}磨损区间{min_paint_wear}--{max_paint_wear}最低价格返回报文code不等于OK,跳出循环')
  875. return
  876. min_price = data['items'][0]['price']
  877. print(f"商品id:{goods_id}的磨损区间{min_paint_wear}-{max_paint_wear}的最低价格:",min_price)
  878. except Exception as e:
  879. print(f'获取商品id:{goods_id}的磨损区间{min_paint_wear}-{max_paint_wear}的最低价格请求--失败,{e}')
  880. finally:
  881. # 结束时间为当前时间
  882. end_time = time.time()
  883. #从start_time到end_time 必须修改pause_time秒
  884. if float(end_time - start_time) < float(self.pause_time):
  885. time.sleep(float(self.pause_time) - (end_time - start_time) + random.randint(0, 5))
  886. return min_price
  887. def show_shopping_phone_number(self):
  888. phone_number = self.phone_edit_map["扫货"].text()
  889. QMessageBox.information(self, "扫货手机号码", f"扫货手机号码: {phone_number}")
  890. # 获取勾选中的品类编码信息
  891. selected_categories = []
  892. for i in range(self.tree_widget.topLevelItemCount()):
  893. item = self.tree_widget.topLevelItem(i)
  894. checkbox = self.tree_widget.itemWidget(item, 0)
  895. if checkbox.isChecked():
  896. category_code = item.text(2)
  897. selected_categories.append(category_code)
  898. if selected_categories:
  899. QMessageBox.information(self, "勾选的品类编码", f"勾选的品类编码: {', '.join(selected_categories)}")
  900. else:
  901. QMessageBox.information(self, "勾选的品类编码", "没有勾选任何品类编码")
  902. # 获取勾选中的品质编码信息
  903. selected_qualities = []
  904. for i in range(self.quality_tree_widget.topLevelItemCount()):
  905. item = self.quality_tree_widget.topLevelItem(i)
  906. checkbox = self.quality_tree_widget.itemWidget(item, 0)
  907. if checkbox.isChecked():
  908. quality_code = item.text(1)
  909. selected_qualities.append(quality_code)
  910. if selected_qualities:
  911. QMessageBox.information(self, "勾选的品质编码", f"勾选的品质编码: {', '.join(selected_qualities)}")
  912. else:
  913. QMessageBox.information(self, "勾选的品质编码", "没有勾选任何品质编码")
  914. # 获取勾选中的type编码信息
  915. selected_types = []
  916. for i in range(self.type_tree_widget.topLevelItemCount()):
  917. item = self.type_tree_widget.topLevelItem(i)
  918. checkbox = self.type_tree_widget.itemWidget(item, 0)
  919. if checkbox.isChecked():
  920. type_code = item.text(1)
  921. selected_types.append(type_code)
  922. if selected_types:
  923. QMessageBox.information(self, "勾选的type编码", f"勾选的type编码: {', '.join(selected_types)}")
  924. else:
  925. QMessageBox.information(self, "勾选的type编码", "没有勾选任何type编码")
  926. # 获取勾选中的外观编码信息
  927. selected_appearances = []
  928. for i in range(self.appearance_tree_widget.topLevelItemCount()):
  929. item = self.appearance_tree_widget.topLevelItem(i)
  930. checkbox = self.appearance_tree_widget.itemWidget(item, 0)
  931. if checkbox.isChecked():
  932. appearance_code = item.text(1)
  933. selected_appearances.append(appearance_code)
  934. if selected_appearances:
  935. QMessageBox.information(self, "勾选的外观编码", f"勾选的外观编码: {', '.join(selected_appearances)}")
  936. else:
  937. QMessageBox.information(self, "勾选的外观编码", "没有勾选任何外观编码")
  938. # 获取勾选中的收藏品编码信息
  939. selected_collectibles = []
  940. for i in range(self.collectible_tree_widget.topLevelItemCount()):
  941. item = self.collectible_tree_widget.topLevelItem(i)
  942. checkbox = self.collectible_tree_widget.itemWidget(item, 0)
  943. if checkbox.isChecked():
  944. collectible_code = item.text(1)
  945. selected_collectibles.append(collectible_code)
  946. if selected_collectibles:
  947. QMessageBox.information(self, "勾选的收藏品编码", f"勾选的收藏品编码: {', '.join(selected_collectibles)}")
  948. else:
  949. QMessageBox.information(self, "勾选的收藏品编码", "没有勾选任何收藏品编码")
  950. def stop_selecting(self):
  951. # 在这里添加停止选品的逻辑
  952. # 设置选品停止标志为True
  953. self.stop_selecting_flag = True
  954. QMessageBox.information(self, "停止选品", "选品操作已终止")
  955. def stop_shopping(self):
  956. # 在这里添加停止扫货的逻辑
  957. QMessageBox.information(self, "停止扫货", "扫货操作已终止")
  958. def add_category(self):
  959. dialog = CategoryDialog(self, "添加品类")
  960. if dialog.exec():
  961. category_name = dialog.category_edit.text()
  962. category_code = dialog.category_code_edit.text()
  963. if category_name and category_code:
  964. item = QTreeWidgetItem(self.tree_widget)
  965. item.setText(1, category_name)
  966. item.setText(2, category_code)
  967. checkbox = QCheckBox()
  968. checkbox.setChecked(False)
  969. self.tree_widget.setItemWidget(item, 0, checkbox)
  970. def delete_category(self):
  971. selected_items = self.tree_widget.selectedItems()
  972. for item in selected_items:
  973. (item.parent() or self.tree_widget).takeTopLevelItem(self.tree_widget.indexOfTopLevelItem(item))
  974. def edit_category(self):
  975. selected_items = self.tree_widget.selectedItems()
  976. if len(selected_items) != 1:
  977. QMessageBox.warning(self, "编辑品类", "请选择一个品类进行编辑")
  978. return
  979. item = selected_items[0]
  980. dialog = CategoryDialog(self, "编辑品类", item.text(1), item.text(2))
  981. if dialog.exec():
  982. new_category_name = dialog.category_edit.text()
  983. new_category_code = dialog.category_code_edit.text()
  984. if new_category_name and new_category_code:
  985. item.setText(1, new_category_name)
  986. item.setText(2, new_category_code)
  987. def add_quality(self):
  988. dialog = QualityDialog(self, "添加品质")
  989. if dialog.exec():
  990. quality_code = dialog.quality_code_edit.text()
  991. quality_name = dialog.quality_name_edit.text()
  992. if quality_code and quality_name:
  993. item = QTreeWidgetItem(self.quality_tree_widget)
  994. item.setText(1, quality_code)
  995. item.setText(2, quality_name)
  996. checkbox = QCheckBox()
  997. checkbox.setChecked(False)
  998. self.quality_tree_widget.setItemWidget(item, 0, checkbox)
  999. def delete_quality(self):
  1000. selected_items = self.quality_tree_widget.selectedItems()
  1001. for item in selected_items:
  1002. (item.parent() or self.quality_tree_widget).takeTopLevelItem(self.quality_tree_widget.indexOfTopLevelItem(item))
  1003. def edit_quality(self):
  1004. selected_items = self.quality_tree_widget.selectedItems()
  1005. if len(selected_items) != 1:
  1006. QMessageBox.warning(self, "编辑品质", "请选择一个品质进行编辑")
  1007. return
  1008. item = selected_items[0]
  1009. dialog = QualityDialog(self, "编辑品质", item.text(1), item.text(2))
  1010. if dialog.exec():
  1011. new_quality_code = dialog.quality_code_edit.text()
  1012. new_quality_name = dialog.quality_name_edit.text()
  1013. if new_quality_code and new_quality_name:
  1014. item.setText(1, new_quality_code)
  1015. item.setText(2, new_quality_name)
  1016. def add_type(self):
  1017. dialog = TypeDialog(self, "添加type")
  1018. if dialog.exec():
  1019. type_code = dialog.type_code_edit.text()
  1020. type_name = dialog.type_name_edit.text()
  1021. if type_code and type_name:
  1022. item = QTreeWidgetItem(self.type_tree_widget)
  1023. item.setText(1, type_code)
  1024. item.setText(2, type_name)
  1025. checkbox = QCheckBox()
  1026. checkbox.setChecked(False)
  1027. self.type_tree_widget.setItemWidget(item, 0, checkbox)
  1028. def delete_type(self):
  1029. selected_items = self.type_tree_widget.selectedItems()
  1030. for item in selected_items:
  1031. (item.parent() or self.type_tree_widget).takeTopLevelItem(self.type_tree_widget.indexOfTopLevelItem(item))
  1032. def edit_type(self):
  1033. selected_items = self.type_tree_widget.selectedItems()
  1034. if len(selected_items) != 1:
  1035. QMessageBox.warning(self, "编辑type", "请选择一个type进行编辑")
  1036. return
  1037. item = selected_items[0]
  1038. dialog = TypeDialog(self, "编辑type", item.text(1), item.text(2))
  1039. if dialog.exec():
  1040. new_type_code = dialog.type_code_edit.text()
  1041. new_type_name = dialog.type_name_edit.text()
  1042. if new_type_code and new_type_name:
  1043. item.setText(1, new_type_code)
  1044. item.setText(2, new_type_name)
  1045. def add_appearance(self):
  1046. dialog = AppearanceDialog(self, "添加外观")
  1047. if dialog.exec():
  1048. appearance_code = dialog.appearance_code_edit.text()
  1049. appearance_name = dialog.appearance_name_edit.text()
  1050. if appearance_code and appearance_name:
  1051. item = QTreeWidgetItem(self.appearance_tree_widget)
  1052. item.setText(1, appearance_code)
  1053. item.setText(2, appearance_name)
  1054. checkbox = QCheckBox()
  1055. checkbox.setChecked(False)
  1056. self.appearance_tree_widget.setItemWidget(item, 0, checkbox)
  1057. def delete_appearance(self):
  1058. selected_items = self.appearance_tree_widget.selectedItems()
  1059. for item in selected_items:
  1060. (item.parent() or self.appearance_tree_widget).takeTopLevelItem(self.appearance_tree_widget.indexOfTopLevelItem(item))
  1061. def edit_appearance(self):
  1062. selected_items = self.appearance_tree_widget.selectedItems()
  1063. if len(selected_items) != 1:
  1064. QMessageBox.warning(self, "编辑外观", "请选择一个外观进行编辑")
  1065. return
  1066. item = selected_items[0]
  1067. dialog = AppearanceDialog(self, "编辑外观", item.text(1), item.text(2))
  1068. if dialog.exec():
  1069. new_appearance_code = dialog.appearance_code_edit.text()
  1070. new_appearance_name = dialog.appearance_name_edit.text()
  1071. if new_appearance_code and new_appearance_name:
  1072. item.setText(1, new_appearance_code)
  1073. item.setText(2, new_appearance_name)
  1074. def add_collectible(self):
  1075. dialog = CollectibleDialog(self, "添加收藏品")
  1076. if dialog.exec():
  1077. collectible_code = dialog.collectible_code_edit.text()
  1078. collectible_name = dialog.collectible_name_edit.text()
  1079. if collectible_code and collectible_name:
  1080. item = QTreeWidgetItem(self.collectible_tree_widget)
  1081. item.setText(1, collectible_code)
  1082. item.setText(2, collectible_name)
  1083. checkbox = QCheckBox()
  1084. checkbox.setChecked(False)
  1085. self.collectible_tree_widget.setItemWidget(item, 0, checkbox)
  1086. def delete_collectible(self):
  1087. selected_items = self.collectible_tree_widget.selectedItems()
  1088. for item in selected_items:
  1089. (item.parent() or self.collectible_tree_widget).takeTopLevelItem(self.collectible_tree_widget.indexOfTopLevelItem(item))
  1090. def edit_collectible(self):
  1091. selected_items = self.collectible_tree_widget.selectedItems()
  1092. if len(selected_items) != 1:
  1093. QMessageBox.warning(self, "编辑收藏品", "请选择一个收藏品进行编辑")
  1094. return
  1095. item = selected_items[0]
  1096. dialog = CollectibleDialog(self, "编辑收藏品", item.text(1), item.text(2))
  1097. if dialog.exec():
  1098. new_collectible_code = dialog.collectible_code_edit.text()
  1099. new_collectible_name = dialog.collectible_name_edit.text()
  1100. if new_collectible_code and new_collectible_name:
  1101. item.setText(1, new_collectible_code)
  1102. item.setText(2, new_collectible_name)
  1103. def setup_phone_edit_map(self):
  1104. self.phone_edit_map = {}
  1105. def show_add_select_log_dialog(self):
  1106. dialog = SelectLogDialog(self, "添加选品日志")
  1107. if dialog.exec():
  1108. item_id = dialog.item_id_edit.text()
  1109. item_name = dialog.item_name_edit.text()
  1110. min_wear = dialog.min_wear_edit.text()
  1111. max_wear = dialog.max_wear_edit.text()
  1112. min_full_wear_price = dialog.min_full_wear_price_edit.text()
  1113. sweep_price = dialog.sweep_price_edit.text()
  1114. judge_price = dialog.judge_price_edit.text()
  1115. timestamp = dialog.timestamp_edit.text()
  1116. self.add_select_log(item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price, timestamp)
  1117. def add_select_log(self, item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price, timestamp):
  1118. # 创建一个字典来存储记录的详细信息
  1119. record = {
  1120. '商品ID': item_id,
  1121. '商品名称': item_name,
  1122. '磨损最低值': min_wear,
  1123. '磨损最高值': max_wear,
  1124. '全磨损区间最低价': min_full_wear_price,
  1125. '扫货价': sweep_price,
  1126. '判断价': judge_price,
  1127. '时间': timestamp
  1128. }
  1129. # 将新记录添加到树形控件中
  1130. item = QTreeWidgetItem(self.select_log_tree_widget)
  1131. item.setText(0, "") # 选择列为空
  1132. item.setText(1, record['商品ID'])
  1133. item.setText(2, record['商品名称'])
  1134. item.setText(3, str(record['磨损最低值']))
  1135. item.setText(4, str(record['磨损最高值']))
  1136. item.setText(5, str(record['全磨损区间最低价']))
  1137. item.setText(6, str(record['扫货价']))
  1138. item.setText(7, str(record['判断价']))
  1139. item.setText(8, record['时间'])
  1140. # 创建复选框
  1141. checkbox = QCheckBox()
  1142. checkbox.setChecked(False)
  1143. self.select_log_tree_widget.setItemWidget(item, 0, checkbox)
  1144. # 向BUFF选品日志标签页的列表中写数据的槽函数
  1145. @pyqtSlot(str, str, str, str, str, str, str, str)
  1146. def _add_select_log(self, item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price, timestamp):
  1147. # 创建一个字典来存储记录的详细信息
  1148. record = {
  1149. '商品ID': item_id,
  1150. '商品名称': item_name,
  1151. '磨损最低值': min_wear,
  1152. '磨损最高值': max_wear,
  1153. '全磨损区间最低价': min_full_wear_price,
  1154. '扫货价': sweep_price,
  1155. '判断价': judge_price,
  1156. '时间': timestamp
  1157. }
  1158. # 将新记录添加到树形控件中
  1159. item = QTreeWidgetItem(self.select_log_tree_widget)
  1160. item.setText(0, "") # 选择列为空
  1161. item.setText(1, record['商品ID'])
  1162. item.setText(2, record['商品名称'])
  1163. item.setText(3, str(record['磨损最低值']))
  1164. item.setText(4, str(record['磨损最高值']))
  1165. item.setText(5, str(record['全磨损区间最低价']))
  1166. item.setText(6, str(record['扫货价']))
  1167. item.setText(7, str(record['判断价']))
  1168. item.setText(8, record['时间'])
  1169. # 创建复选框
  1170. checkbox = QCheckBox()
  1171. checkbox.setChecked(False)
  1172. self.select_log_tree_widget.setItemWidget(item, 0, checkbox)
  1173. def delete_select_log(self):
  1174. # 获取选中的日志项
  1175. selected_items = self.select_log_tree_widget.selectedItems()
  1176. for item in selected_items:
  1177. (item.parent() or self.select_log_tree_widget).takeTopLevelItem(self.select_log_tree_widget.indexOfTopLevelItem(item))
  1178. def edit_select_log(self):
  1179. # 获取选中的日志项
  1180. selected_items = self.select_log_tree_widget.selectedItems()
  1181. if len(selected_items) != 1:
  1182. QMessageBox.warning(self, "编辑选品日志", "请选择一个选品日志进行编辑")
  1183. return
  1184. item = selected_items[0]
  1185. # 获取当前选中的日志项的数据
  1186. current_data = {
  1187. '商品ID': item.text(1),
  1188. '商品名称': item.text(2),
  1189. '磨损最低值': item.text(3),
  1190. '磨损最高值': item.text(4),
  1191. '全磨损区间最低价': item.text(5),
  1192. '扫货价': item.text(6),
  1193. '判断价': item.text(7),
  1194. '时间': item.text(8)
  1195. }
  1196. # 弹出编辑对话框
  1197. dialog = EditSelectLogDialog(self, "编辑选品日志", current_data)
  1198. if dialog.exec():
  1199. # 获取编辑后的数据
  1200. new_item_id = dialog.item_id_edit.text()
  1201. new_item_name = dialog.item_name_edit.text()
  1202. new_min_wear = dialog.min_wear_edit.text()
  1203. new_max_wear = dialog.max_wear_edit.text()
  1204. new_min_full_wear_price = dialog.min_full_wear_price_edit.text()
  1205. new_sweep_price = dialog.sweep_price_edit.text()
  1206. new_judge_price = dialog.judge_price_edit.text()
  1207. new_timestamp = dialog.timestamp_edit.text()
  1208. # 更新日志项的数据
  1209. item.setText(1, new_item_id)
  1210. item.setText(2, new_item_name)
  1211. item.setText(3, new_min_wear)
  1212. item.setText(4, new_max_wear)
  1213. item.setText(5, new_min_full_wear_price)
  1214. item.setText(6, new_sweep_price)
  1215. item.setText(7, new_judge_price)
  1216. item.setText(8, new_timestamp)
  1217. def export_selected_logs(self):
  1218. # 获取选中的日志项
  1219. selected_items = self.select_log_tree_widget.selectedItems()
  1220. if not selected_items:
  1221. QMessageBox.warning(self, "导出选品日志", "请选择要导出的日志项")
  1222. return
  1223. # 将选中的日志项转换为字典列表
  1224. logs = {}
  1225. for item in selected_items:
  1226. # log = {
  1227. # item.text(1):{
  1228. # "price":item.text(6),
  1229. # "min_paintwear":item.text(3),
  1230. # "max_paintwear" :item.text(4),
  1231. # "name":item.text(2),
  1232. # '商品ID': item.text(1),
  1233. # '商品名称': item.text(2),
  1234. # '磨损最低值': item.text(3),
  1235. # '磨损最高值': item.text(4),
  1236. # '全磨损区间最低价': item.text(5),
  1237. # '扫货价': item.text(6),
  1238. # '判断价': item.text(7),
  1239. # '时间': item.text(8)
  1240. # }
  1241. # }
  1242. logs[item.text(1)] = {
  1243. "price":item.text(6),
  1244. "min_paintwear":item.text(3),
  1245. "max_paintwear" :item.text(4),
  1246. "name":item.text(2),
  1247. '商品ID': item.text(1),
  1248. '商品名称': item.text(2),
  1249. '磨损最低值': item.text(3),
  1250. '磨损最高值': item.text(4),
  1251. '全磨损区间最低价': item.text(5),
  1252. '扫货价': item.text(6),
  1253. '判断价': item.text(7),
  1254. '时间': item.text(8)
  1255. }
  1256. # logs.append(log)
  1257. # 选择保存文件的路径
  1258. file_path, _ = QFileDialog.getSaveFileName(self, "导出选品日志", "", "JSON Files (*.json)")
  1259. if file_path:
  1260. try:
  1261. with open(file_path, 'w', encoding='utf-8') as f:
  1262. json.dump(logs, f, ensure_ascii=False, indent=4)
  1263. QMessageBox.information(self, "导出选品日志", f"日志已成功导出到 {file_path}")
  1264. except Exception as e:
  1265. QMessageBox.critical(self, "导出选品日志", f"导出日志时发生错误: {e}")
  1266. class EditSelectLogDialog(QDialog):
  1267. def __init__(self, parent=None, title="编辑选品日志", initial_data=None):
  1268. super().__init__(parent)
  1269. self.setWindowTitle(title)
  1270. self.setGeometry(100, 100, 600, 400)
  1271. layout = QDialogVBoxLayout()
  1272. # 商品ID输入框
  1273. item_id_label = QLabel("商品ID")
  1274. self.item_id_edit = QDialogLineEdit()
  1275. self.item_id_edit.setText(initial_data['商品ID'])
  1276. layout.addWidget(item_id_label)
  1277. layout.addWidget(self.item_id_edit)
  1278. # 商品名称输入框
  1279. item_name_label = QLabel("商品名称")
  1280. self.item_name_edit = QDialogLineEdit()
  1281. self.item_name_edit.setText(initial_data['商品名称'])
  1282. layout.addWidget(item_name_label)
  1283. layout.addWidget(self.item_name_edit)
  1284. # 磨损最低值输入框
  1285. min_wear_label = QLabel("磨损最低值")
  1286. self.min_wear_edit = QDialogLineEdit()
  1287. self.min_wear_edit.setText(str(initial_data['磨损最低值']))
  1288. layout.addWidget(min_wear_label)
  1289. layout.addWidget(self.min_wear_edit)
  1290. # 磨损最高值输入框
  1291. max_wear_label = QLabel("磨损最高值")
  1292. self.max_wear_edit = QDialogLineEdit()
  1293. self.max_wear_edit.setText(str(initial_data['磨损最高值']))
  1294. layout.addWidget(max_wear_label)
  1295. layout.addWidget(self.max_wear_edit)
  1296. # 全磨损区间最低价输入框
  1297. min_full_wear_price_label = QLabel("全磨损区间最低价")
  1298. self.min_full_wear_price_edit = QDialogLineEdit()
  1299. self.min_full_wear_price_edit.setText(str(initial_data['全磨损区间最低价']))
  1300. layout.addWidget(min_full_wear_price_label)
  1301. layout.addWidget(self.min_full_wear_price_edit)
  1302. # 扫货价输入框
  1303. sweep_price_label = QLabel("扫货价")
  1304. self.sweep_price_edit = QDialogLineEdit()
  1305. self.sweep_price_edit.setText(str(initial_data['扫货价']))
  1306. layout.addWidget(sweep_price_label)
  1307. layout.addWidget(self.sweep_price_edit)
  1308. # 判断价输入框
  1309. judge_price_label = QLabel("判断价")
  1310. self.judge_price_edit = QDialogLineEdit()
  1311. self.judge_price_edit.setText(str(initial_data['判断价']))
  1312. layout.addWidget(judge_price_label)
  1313. layout.addWidget(self.judge_price_edit)
  1314. # 时间输入框
  1315. timestamp_label = QLabel("时间")
  1316. self.timestamp_edit = QDialogLineEdit()
  1317. self.timestamp_edit.setText(initial_data['时间'])
  1318. layout.addWidget(timestamp_label)
  1319. layout.addWidget(self.timestamp_edit)
  1320. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1321. button_box.accepted.connect(self.accept)
  1322. button_box.rejected.connect(self.reject)
  1323. layout.addWidget(button_box)
  1324. self.setLayout(layout)
  1325. class SelectLogDialog(QDialog):
  1326. def __init__(self, parent=None, title="添加选品日志"):
  1327. super().__init__(parent)
  1328. self.setWindowTitle(title)
  1329. self.setGeometry(100, 100, 600, 400)
  1330. layout = QDialogVBoxLayout()
  1331. # 商品ID输入框
  1332. item_id_label = QLabel("商品ID")
  1333. self.item_id_edit = QDialogLineEdit()
  1334. layout.addWidget(item_id_label)
  1335. layout.addWidget(self.item_id_edit)
  1336. # 商品名称输入框
  1337. item_name_label = QLabel("商品名称")
  1338. self.item_name_edit = QDialogLineEdit()
  1339. layout.addWidget(item_name_label)
  1340. layout.addWidget(self.item_name_edit)
  1341. # 磨损最低值输入框
  1342. min_wear_label = QLabel("磨损最低值")
  1343. self.min_wear_edit = QDialogLineEdit()
  1344. layout.addWidget(min_wear_label)
  1345. layout.addWidget(self.min_wear_edit)
  1346. # 磨损最高值输入框
  1347. max_wear_label = QLabel("磨损最高值")
  1348. self.max_wear_edit = QDialogLineEdit()
  1349. layout.addWidget(max_wear_label)
  1350. layout.addWidget(self.max_wear_edit)
  1351. # 全磨损区间最低价输入框
  1352. min_full_wear_price_label = QLabel("全磨损区间最低价")
  1353. self.min_full_wear_price_edit = QDialogLineEdit()
  1354. layout.addWidget(min_full_wear_price_label)
  1355. layout.addWidget(self.min_full_wear_price_edit)
  1356. # 扫货价输入框
  1357. sweep_price_label = QLabel("扫货价")
  1358. self.sweep_price_edit = QDialogLineEdit()
  1359. layout.addWidget(sweep_price_label)
  1360. layout.addWidget(self.sweep_price_edit)
  1361. # 判断价输入框
  1362. judge_price_label = QLabel("判断价")
  1363. self.judge_price_edit = QDialogLineEdit()
  1364. layout.addWidget(judge_price_label)
  1365. layout.addWidget(self.judge_price_edit)
  1366. # 时间输入框
  1367. timestamp_label = QLabel("时间")
  1368. self.timestamp_edit = QDialogLineEdit()
  1369. layout.addWidget(timestamp_label)
  1370. layout.addWidget(self.timestamp_edit)
  1371. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1372. button_box.accepted.connect(self.accept)
  1373. button_box.rejected.connect(self.reject)
  1374. layout.addWidget(button_box)
  1375. self.setLayout(layout)
  1376. class CategoryDialog(QDialog):
  1377. def __init__(self, parent=None, title="添加品类", initial_name="", initial_code=""):
  1378. super().__init__(parent)
  1379. self.setWindowTitle(title)
  1380. self.setGeometry(100, 100, 400, 150)
  1381. layout = QDialogVBoxLayout()
  1382. # 品类名称输入框
  1383. name_label = QLabel("品类名称")
  1384. self.category_edit = QDialogLineEdit()
  1385. self.category_edit.setText(initial_name)
  1386. layout.addWidget(name_label)
  1387. layout.addWidget(self.category_edit)
  1388. # 品类编码输入框
  1389. code_label = QLabel("品类编码")
  1390. self.category_code_edit = QDialogLineEdit()
  1391. self.category_code_edit.setText(initial_code)
  1392. layout.addWidget(code_label)
  1393. layout.addWidget(self.category_code_edit)
  1394. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1395. button_box.accepted.connect(self.accept)
  1396. button_box.rejected.connect(self.reject)
  1397. layout.addWidget(button_box)
  1398. self.setLayout(layout)
  1399. class QualityDialog(QDialog):
  1400. def __init__(self, parent=None, title="添加品质", initial_code="", initial_name=""):
  1401. super().__init__(parent)
  1402. self.setWindowTitle(title)
  1403. self.setGeometry(100, 100, 400, 150)
  1404. layout = QDialogVBoxLayout()
  1405. # 品质编码输入框
  1406. code_label = QLabel("品质编码")
  1407. self.quality_code_edit = QDialogLineEdit()
  1408. self.quality_code_edit.setText(initial_code)
  1409. layout.addWidget(code_label)
  1410. layout.addWidget(self.quality_code_edit)
  1411. # 品质名称输入框
  1412. name_label = QLabel("品质名称")
  1413. self.quality_name_edit = QDialogLineEdit()
  1414. self.quality_name_edit.setText(initial_name)
  1415. layout.addWidget(name_label)
  1416. layout.addWidget(self.quality_name_edit)
  1417. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1418. button_box.accepted.connect(self.accept)
  1419. button_box.rejected.connect(self.reject)
  1420. layout.addWidget(button_box)
  1421. self.setLayout(layout)
  1422. class TypeDialog(QDialog):
  1423. def __init__(self, parent=None, title="添加type", initial_code="", initial_name=""):
  1424. super().__init__(parent)
  1425. self.setWindowTitle(title)
  1426. self.setGeometry(100, 100, 400, 150)
  1427. layout = QDialogVBoxLayout()
  1428. # type编码输入框
  1429. code_label = QLabel("type编码")
  1430. self.type_code_edit = QDialogLineEdit()
  1431. self.type_code_edit.setText(initial_code)
  1432. layout.addWidget(code_label)
  1433. layout.addWidget(self.type_code_edit)
  1434. # type名称输入框
  1435. name_label = QLabel("type名称")
  1436. self.type_name_edit = QDialogLineEdit()
  1437. self.type_name_edit.setText(initial_name)
  1438. layout.addWidget(name_label)
  1439. layout.addWidget(self.type_name_edit)
  1440. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1441. button_box.accepted.connect(self.accept)
  1442. button_box.rejected.connect(self.reject)
  1443. layout.addWidget(button_box)
  1444. self.setLayout(layout)
  1445. class AppearanceDialog(QDialog):
  1446. def __init__(self, parent=None, title="添加外观", initial_code="", initial_name=""):
  1447. super().__init__(parent)
  1448. self.setWindowTitle(title)
  1449. self.setGeometry(100, 100, 400, 150)
  1450. layout = QDialogVBoxLayout()
  1451. # 外观编码输入框
  1452. code_label = QLabel("外观编码")
  1453. self.appearance_code_edit = QDialogLineEdit()
  1454. self.appearance_code_edit.setText(initial_code)
  1455. layout.addWidget(code_label)
  1456. layout.addWidget(self.appearance_code_edit)
  1457. # 外观名称输入框
  1458. name_label = QLabel("外观名称")
  1459. self.appearance_name_edit = QDialogLineEdit()
  1460. self.appearance_name_edit.setText(initial_name)
  1461. layout.addWidget(name_label)
  1462. layout.addWidget(self.appearance_name_edit)
  1463. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1464. button_box.accepted.connect(self.accept)
  1465. button_box.rejected.connect(self.reject)
  1466. layout.addWidget(button_box)
  1467. self.setLayout(layout)
  1468. class CollectibleDialog(QDialog):
  1469. def __init__(self, parent=None, title="添加收藏品", initial_code="", initial_name=""):
  1470. super().__init__(parent)
  1471. self.setWindowTitle(title)
  1472. self.setGeometry(100, 100, 400, 150)
  1473. layout = QDialogVBoxLayout()
  1474. # 收藏品编码输入框
  1475. code_label = QLabel("收藏品编码")
  1476. self.collectible_code_edit = QDialogLineEdit()
  1477. self.collectible_code_edit.setText(initial_code)
  1478. layout.addWidget(code_label)
  1479. layout.addWidget(self.collectible_code_edit)
  1480. # 收藏品名称输入框
  1481. name_label = QLabel("收藏品名称")
  1482. self.collectible_name_edit = QDialogLineEdit()
  1483. self.collectible_name_edit.setText(initial_name)
  1484. layout.addWidget(name_label)
  1485. layout.addWidget(self.collectible_name_edit)
  1486. button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
  1487. button_box.accepted.connect(self.accept)
  1488. button_box.rejected.connect(self.reject)
  1489. layout.addWidget(button_box)
  1490. self.setLayout(layout)
  1491. if __name__ == "__main__":
  1492. app = QApplication(sys.argv)
  1493. window = MainWindow()
  1494. window.show()
  1495. sys.exit(app.exec())