Beispiel #1
0
 def __init__(self):
     self.SC = StuffController()
     self.SLC = SaleController()
     self.SP = SupplyerController()
     self.WM = WarehouseModel()
     self.WC = WorkshopController()
     self.PC = ProductController()
Beispiel #2
0
    def __init__(self, autoid=None, snid=None, parent=None):
        super(EditSaleProdMudule, self).__init__(parent)
        self.setupUi(self)
        if '53' not in user.powers:
            self.close()
        if user.powers['53'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['53'])
        if self.power[1] == '0':
            self.pushButton_accept.setVisible(False)
            self.pushButton_cancel.setVisible(False)

        self.autoid = autoid
        self.snid = snid
        self.SC = SaleController()
        self.PC = ProductController()
        self.ori_detail = dict()
        self.new_detail = dict()
        row = ('autoid', 'prodid', 'prodname', 'spec', 'package')
        key = ('prodid', 'prodname', 'commonname', 'inputcode')
        row_name = ("id", "产品编号", "产品名称", "含量规格", "包装规格")
        self.lineEdit_product.setup('Productdictionary', row, key, row_name,
                                    None, 620, 190)
        self.set_validator()
        if self.autoid is not None:
            self.get_detail()
 def __init__(self, autoid=None, parent=None):
     super(EditSaleOrderMudule, self).__init__(parent)
     self.setupUi(self)
     if '53' not in user.powers:
         self.close()
     if user.powers['53'] == 0:
         self.close()
     self.power = '{:03b}'.format(user.powers['53'])
     if self.power[1] == '0':
         self.pushButton_accept.setVisible(False)
         self.pushButton_cancel.setVisible(False)
     self.autoid=autoid
     self.SC = SaleController()
     self.ori_detail = dict()
     self.new_detail = dict()
     row = ('autoid', 'clientid', 'clientname', 'address')
     key = ('clientid', 'clientname', 'inputcode')
     row_name = ("id", "客户编号", "客户名称", "客户地址")
     self.lineEdit_client.setup('Client', row, key, row_name, None, 550, 290)
     if self.autoid is None:
         self.set_paperno()
         self.dateEdit_saledate.setDate(user.now_date)
         self.dateEdit_deliverydate.setDate(user.now_date)
     else:
         self.get_detail()
     self.set_conveyance_list()
     self.set_paymethod_list()
Beispiel #4
0
class SaleOrderModule(QDialog, Ui_Dialog):
    def __init__(self, autoid, parent=None):
        super(SaleOrderModule, self).__init__(parent)
        self.setupUi(self)
        self.SC = SaleController()
        self.WC = WarehouseController()
        self.WSC = WorkshopController()
        self.autoid = autoid
        self.get_order_list()
        self.get_product_list()

    def get_order_list(self):
        key_dict = {'autoid': self.autoid}
        order_list = self.SC.get_salenotes(False, *VALUES_TUPLE_ORDER,
                                           **key_dict)
        if not len(order_list):
            return
        order = order_list[0]
        self.label_paperno.setText(order['paperno'])
        self.label_client.setText(order['clientid'] + ' ' +
                                  order['clientname'])
        self.label_linkman.setText(order['linkman'])
        self.label_telno.setText(order['telno'])
        self.label_saler.setText(order['salerid'] + ' ' + order['salername'])
        self.label_saledate.setText(str(order['saledate']))
        self.label_deliveryplace.setText(order['deliveryplace'])
        self.label_deliverydate.setText(str(order['deliverydate']))
        self.label_consignment.setText(order['consignmentid'] + ' ' +
                                       order['consignmentname'])
        self.label_remark.setText(order['remark'])

    def get_product_list(self):

        self.treeWidget_prodlist.clear()
        self.treeWidget_prodlist.hideColumn(0)
        key_dict = {'snid': self.autoid}
        prod_list = self.SC.get_salenotegoods(False, *VALUES_TUPLE_PROD,
                                              **key_dict)
        if not len(prod_list):
            return
        for item in prod_list:
            qtreeitem = QTreeWidgetItem(self.treeWidget_prodlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, item['prodid'] + ' ' + item['prodname'])
            qtreeitem.setText(2, item['spec'])
            qtreeitem.setText(3, item['package'])
            qtreeitem.setText(4, to_str(item['saleamount']))
            qtreeitem.setText(5, item['spunit'])
            prodid = item['prodid']
            key_dict_rep = {'prodid': prodid, 'stockamount__gt': 0}
            product_rep_list = self.WC.get_productrepository(
                False, *VALUES_TUPLE_REP,
                **key_dict_rep).annotate(amount=Sum('stockamount'))
            if len(product_rep_list):
                qtreeitem.setText(6, to_str(product_rep_list[0]['amount']))
            else:
                qtreeitem.setText(6, '0')
        for i in range(1, 7):
            self.treeWidget_prodlist.resizeColumnToContents(i)
Beispiel #5
0
 def __init__(self, autoid, parent=None):
     super(SaleOrderModule, self).__init__(parent)
     self.setupUi(self)
     self.SC = SaleController()
     self.WC = WarehouseController()
     self.WSC = WorkshopController()
     self.autoid = autoid
     self.get_order_list()
     self.get_product_list()
Beispiel #6
0
 def __init__(self, parent=None):
     super(SaleOrderListModule, self).__init__(parent)
     self.setupUi(self)
     if '53' not in user.powers:
         self.close()
     if user.powers['53'] == 0:
         self.close()
     self.power = '{:03b}'.format(user.powers['53'])
     self.SC = SaleController()
     self.WC = WarehouseController()
     self.WSC = WorkshopController()
     self.groupBox.setVisible(False)
     self.snid = 0
     self.get_order_list()
    def __init__(self, parent=None):
        super(QrcodeoutputModule, self).__init__(parent)
        self.setupUi(self)
        if '59' not in user.powers:
            self.close()
        if user.powers['59'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['59'])

        self.WC = WarehouseController()
        self.PC = ProductController()
        self.SC = SystemController()
        self.SLC = SaleController()
        self.orderlist = dict()
        # 获取二维码信息
        self.get_order_list()
 def __init__(self, parent=None):
     super(ClientListModule, self).__init__(parent)
     self.setupUi(self)
     if '54' not in user.powers:
         self.close()
     if user.powers['54'] == 0:
         self.close()
     self.power = '{:03b}'.format(user.powers['54'])
     self.SC = SaleController()
     self.IC = ImageController()
     self.kind_list = []
     self.curremt_kind = 0
     self.treeWidget_kind.hideColumn(1)
     self.treeWidget_detail.hideColumn(0)
     self.get_kind_list()
     self.get_client_list()
Beispiel #9
0
 def __init__(self, autoid=None, parent=None):
     super(EditClientDetailModule, self).__init__(parent)
     self.setupUi(self)
     if '54' not in user.powers:
         self.close()
     if user.powers['54'] == 0:
         self.close()
     self.power = '{:03b}'.format(user.powers['54'])
     if self.power[1] == '0':
         self.pushButton_accept.setVisible(False)
         self.pushButton_cancel.setVisible(False)
     self.autoid = autoid
     self.ori_detail = dict()
     self.new_detail = dict()
     self.current_img = object
     self.current_page = object
     self.province_list = []
     self.city_list = []
     self.county_list = []
     self.province_id = ''
     self.city_id = ''
     self.county_id = ''
     self.qyname = ''
     self.SC = SaleController()
     self.IC = ImageController()
     self.treeWidget_imagenamelist.hideColumn(0)
     self.treeWidget_imagenamelist.hideColumn(1)
     # 自动缩放
     self.label_image.setScaledContents(True)
     return_row = ('parentid', 'autoid', 'kindname')
     condition_key = {'autoid', 'kindname', 'inputcode'}
     treeheader_name = ['parentid', '编号', '名称']
     condition = {'kind': 4}
     self.lineEdit_tstkind.setup('Treestructure',
                                 return_row,
                                 condition_key,
                                 treeheader_name,
                                 condition,
                                 treewidth=300)
     self.get_detail()
     self.get_province()
     if len(self.ori_detail):
         self.get_city(self.ori_detail['province'])
         self.get_county(self.ori_detail['city'])
class QrcodeoutputModule(QWidget, Ui_Form):
    """ 二维码出库文件模块,可以查看到所有订单的二维码记录。
    提供了右键下载二维码。
    """
    def __init__(self, parent=None):
        super(QrcodeoutputModule, self).__init__(parent)
        self.setupUi(self)
        if '59' not in user.powers:
            self.close()
        if user.powers['59'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['59'])

        self.WC = WarehouseController()
        self.PC = ProductController()
        self.SC = SystemController()
        self.SLC = SaleController()
        self.orderlist = dict()
        # 获取二维码信息
        self.get_order_list()

    def get_order_list(self):
        self.treeWidget_orderlist.clear()
        self.treeWidget_orderlist.hideColumn(0)
        key_dict = dict()
        index = self.tabWidget.currentIndex()
        if index in (0, 1):
            key_dict['status'] = index + 1
        else:
            key_dict['status__gte'] = 1
        self.orderlist = self.WC.get_productputoutpaper(
            False, *VALUES_LIST, **key_dict)
        if not len(self.orderlist):
            return
        for item in self.orderlist:
            qtreeitem = QTreeWidgetItem(self.treeWidget_orderlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, str(item['putoutdate']))
            qtreeitem.setText(2, item['pokind'])
            qtreeitem.setText(3, item['clientid'] + ' ' + item['clientname'])
            qtreeitem.setText(4, item['auditorid'] + ' ' + item['auditorname'])
            qtreeitem.setText(5, str(item['remark']))
        for i in range(1, 6):
            self.treeWidget_orderlist.resizeColumnToContents(i)

    @pyqtSlot(QPoint)
    def on_treeWidget_orderlist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        qtreeitem = self.treeWidget_orderlist.selectedItems()
        if not len(qtreeitem):
            return
        select_id = int(qtreeitem[0].text(0))
        menu = QMenu()
        button1 = menu.addAction("生成出库数据文件")
        # button2 = menu.addAction("导入入库二维码数据")
        # button3 = menu.addAction("覆盖入库二维码数据")
        g_pos = self.treeWidget_orderlist.mapToGlobal(pos)
        action = menu.exec(g_pos)
        if action == button1:
            clipboard = QApplication.clipboard()
            dir = clipboard.property("qrcodeoutputurl")
            filename = "出库数据" + str(user.now_date).replace("-", "") + ".xml"
            if not dir:
                dir = "C:\\"
            file_route, ext = QFileDialog.getSaveFileName(
                self, "请选择出库文件输出路径", dir + filename, "*.xml;;All Files(*)")

            if not file_route:
                return
            selected_dir = re.findall(r'^(.+/|.+\\)', file_route)[0]
            clipboard.setProperty("qrcodeoutputurl", selected_dir)

            self.makeqrcodeoutputfile(select_id, file_route)
            self.WC.update_productputoutpaper(select_id, status=2)
            self.get_order_list()

    @pyqtSlot(int)
    def on_tabWidget_currentChanged(self, index):
        getattr(self, 'tab_' + str(index)).setLayout(self.gridLayout_2)
        self.get_order_list()

    def makeqrcodeoutputfile(self, id, file_route):
        for item in self.orderlist:
            if item['autoid'] == id:
                proddetail = item
                break
        clientid = proddetail['clientid']
        key_dict_client = {'clientid': clientid}
        clients_detail = self.SLC.get_client(False, *VALUES_LIST_CLIENT,
                                             **key_dict_client)
        if len(clients_detail) != 1:
            return
        client = clients_detail[0]

        key_dict = {'ppopid': id}
        res = self.WC.get_ppopqrcode(False, *VALUES_LIST_QRCODE, **key_dict)
        if not len(res):
            return
        # 把二维码按比例分组
        q_list, ppid_list, batchno_list = self.sort_qrcode(
            res.order_by('batchno'))

        xml = QXmlStreamWriter()
        qfile = QFile(file_route)
        if qfile.open(QIODevice.WriteOnly):
            xml.setDevice(qfile)
        else:
            return
        xml.setAutoFormatting(True)
        xml.writeStartDocument()
        # 添加头文件信息
        self.addxmlheader(xml, client['kind'])
        self.addxmlproddetail(xml, proddetail)
        temp_ppid = ''
        for i in range(0, len(ppid_list)):
            if temp_ppid != ppid_list[i]:
                if temp_ppid != '':
                    # 把上一个Batch结束了
                    xml.writeEndElement()
                temp_ppid = ppid_list[i]
                xml.writeStartElement("Batch")
                xml.writeAttribute('batchNo', batchno_list[i])
                xml.writeAttribute('operator', proddetail['auditorname'])
                xml.writeAttribute('oprDate', str(proddetail['putoutdate']))

                xml.writeAttribute(' toUnit', client['clientname'])
                xml.writeAttribute('toProvince', client['province'])
                xml.writeAttribute('toCity', client['city'])
                xml.writeAttribute('toCounty', client['county'])
                xml.writeAttribute('toUnitcode', client['unitcode'])

            xml.writeStartElement("Data")
            xml.writeAttribute('code', q_list[i])
            xml.writeEndElement()

        xml.writeEndElement()
        xml.writeEndElement()
        xml.writeEndDocument()

    def sort_qrcode(self, qrcode_list):
        q_list = []
        ppid_list = []
        batchno_list = []
        try:
            for item in qrcode_list:
                q_list.append(item['qr0'])
                ppid_list.append(item['ppid'])
                batchno_list.append(item['batchno'])
        except KeyError:
            pass
        return q_list, ppid_list, batchno_list

    def addxmlheader(self, xml, toUnitType):
        company = "智普飞扬"
        mancode = "19060310"
        key_dict_sys = {'varname__in': ("company", "mancode")}
        res = self.SC.get_syssetting(False, *VALUES_LIST_SYS, **key_dict_sys)
        if len(res):
            for item in res:
                if item['varname'] == "company":
                    company = item['varvalue']
                elif item['varname'] == "mancode":
                    mancode = item['varvalue']
        xml.writeStartElement("DataList")
        xml.writeAttribute("corpName", company)
        xml.writeAttribute("toUnitType", str(toUnitType))
        xml.writeAttribute("manCode", mancode)
        xml.writeAttribute("dataType", "wareHouseOut")
        xml.writeAttribute("version", "1.1")
        xml.writeAttribute("xmlns: xsi",
                           "http://www.w3.org/2001/XMLSchema-instance")
        xml.writeAttribute("xsi: noNamespaceSchemaLocation", "兽药产品出库数据1.1.xsd")

    def addxmlproddetail(self, xml, proddetail):
        xml.writeStartElement("Product")
Beispiel #11
0
class EditSaleProdMudule(QDialog, Ui_Dialog):
    def __init__(self, autoid=None, snid=None, parent=None):
        super(EditSaleProdMudule, self).__init__(parent)
        self.setupUi(self)
        if '53' not in user.powers:
            self.close()
        if user.powers['53'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['53'])
        if self.power[1] == '0':
            self.pushButton_accept.setVisible(False)
            self.pushButton_cancel.setVisible(False)

        self.autoid = autoid
        self.snid = snid
        self.SC = SaleController()
        self.PC = ProductController()
        self.ori_detail = dict()
        self.new_detail = dict()
        row = ('autoid', 'prodid', 'prodname', 'spec', 'package')
        key = ('prodid', 'prodname', 'commonname', 'inputcode')
        row_name = ("id", "产品编号", "产品名称", "含量规格", "包装规格")
        self.lineEdit_product.setup('Productdictionary', row, key, row_name,
                                    None, 620, 190)
        self.set_validator()
        if self.autoid is not None:
            self.get_detail()

    def get_detail(self):
        key_dict = {'autoid': self.autoid}
        detail_list = self.SC.get_salenotegoods(False, *VALUES_TUPLE_PROD,
                                                **key_dict)
        if not len(detail_list):
            return
        self.ori_detail = detail_list[0]
        self.lineEdit_product.setText(self.ori_detail['prodid'] + ' ' +
                                      self.ori_detail['prodname'])
        self.label_spec.setText(self.ori_detail['spec'])
        self.label_package.setText(self.ori_detail['package'])
        self.lineEdit_amount.setText(to_str(self.ori_detail['saleamount']))
        self.label_unit.setText(self.ori_detail['spunit'])

    def set_validator(self):
        doubleValitor = QDoubleValidator()
        doubleValitor.setBottom(0)
        self.lineEdit_amount.setValidator(doubleValitor)

    @pyqtSlot(str)
    def on_lineEdit_product_textChanged(self, p_str):
        if len(p_str.split(' ')) != 2 and p_str != '':
            return
        id, name = p_str.split(' ') if p_str != '' else ('', '')
        key_dict = {'prodid': id, 'prodname': name}
        res = self.PC.get_product_or_stuff_dictionary(0, False,
                                                      *VALUES_TUPLE_PRODDICT,
                                                      **key_dict)
        if len(res):
            prod_detail = res[0]
            self.label_spec.setText(prod_detail['spec'])
            self.label_package.setText(prod_detail['package'])
            self.label_unit.setText(prod_detail['spunit'])
            try:
                if id != self.ori_detail['prodid'] or name != self.ori_detail[
                        'prodname']:
                    self.new_detail['prodid'] = id
                    self.new_detail['prodname'] = name
                    self.new_detail['spec'] = prod_detail['spec']
                    self.new_detail['package'] = prod_detail['package']
                    self.new_detail['spunit'] = prod_detail['spunit']
                else:
                    try:
                        del self.new_detail['prodid']
                        del self.new_detail['prodname']
                        del self.new_detail['spec']
                        del self.new_detail['package']
                        del self.new_detail['spunit']
                    except KeyError:
                        pass
            except KeyError:
                self.new_detail['prodid'] = id
                self.new_detail['prodname'] = name
                self.new_detail['spec'] = prod_detail['spec']
                self.new_detail['package'] = prod_detail['package']
                self.new_detail['spunit'] = prod_detail['spunit']

    @pyqtSlot(str)
    def on_lineEdit_amount_textChanged(self, p_str):

        try:
            p_num = decimal.Decimal(p_str)
            if p_num != self.ori_detail['saleamount']:
                self.new_detail['saleamount'] = p_num
            else:
                try:
                    del self.new_detail['saleamount']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['saleamount'] = p_num
        except decimal.InvalidOperation:
            pass

    @pyqtSlot()
    def on_pushButton_accept_clicked(self):
        if not len(self.new_detail):
            return
        saleamount = self.lineEdit_amount.text()
        if saleamount in ('0', ''):
            msg = MessageBox(self, text="销售数量不能为空")
            msg.show()
            return
        if self.autoid is None and self.snid is not None:
            self.new_detail['snid'] = self.snid

        self.SC.update_salenotegoods(self.autoid, **self.new_detail)
        self.accept()

    @pyqtSlot()
    def on_pushButton_cancel_clicked(self):
        self.close()
class ClientListModule(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(ClientListModule, self).__init__(parent)
        self.setupUi(self)
        if '54' not in user.powers:
            self.close()
        if user.powers['54'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['54'])
        self.SC = SaleController()
        self.IC = ImageController()
        self.kind_list = []
        self.curremt_kind = 0
        self.treeWidget_kind.hideColumn(1)
        self.treeWidget_detail.hideColumn(0)
        self.get_kind_list()
        self.get_client_list()

    def get_kind_list(self):
        self.treeWidget_kind.clear()
        key_dict = {'kind': 4}
        self.kind_list = self.SC.get_data(4, False, *VALUES_TUPLE_KIND,
                                          **key_dict)
        # if not len(self.kind_list):
        #     return
        self.set_kind_list(self.kind_list)
        # self.treeWidget_kind.resizeColumnToContents(0)
        self.treeWidget_kind.expandAll()

    def set_kind_list(self, items):
        qtreeitem_all = QTreeWidgetItem(self.treeWidget_kind)
        qtreeitem_all.setText(0, "全部")
        qtreeitem_all.setText(1, "0")
        for item in items:
            res = self.treeWidget_kind.findItems(str(item['autoid']),
                                                 Qt.MatchRecursive, 1)
            if len(res):
                continue
            if item['parentid'] != 0:
                parent_item = self.find_kind_item(item['parentid'])
                qtreeitem = QTreeWidgetItem(parent_item)
            else:
                qtreeitem = QTreeWidgetItem(qtreeitem_all)
            qtreeitem.setText(0, item['kindname'])
            qtreeitem.setText(1, str(item['autoid']))

    def find_kind_item(self, parentid, i=0):
        res = self.treeWidget_kind.findItems(str(parentid), Qt.MatchRecursive,
                                             1)
        if len(res):
            return res[0]
        else:
            parent = self.treeWidget_kind.topLevelItem(0)
            try:
                if i > 10:
                    # 手动设置最大循环深度位10
                    raise RecursionError
                for item in self.kind_list:
                    if item['autoid'] == parentid:
                        parent_id = item['parentid']
                        if parent_id == 0:
                            parent = QTreeWidgetItem(
                                self.treeWidget_kind.topLevelItem(0))
                            parent.setText(0, item['kindname'])
                            parent.setText(1, str(item['autoid']))
                            break
                        else:
                            i += 1
                            parent = self.find_kind_item(parent_id, i)
                            break
                return parent
            except RecursionError:
                return parent

    def get_client_list(self):
        self.treeWidget_detail.clear()
        key_dict = dict()
        if self.curremt_kind != 0:
            key_dict['tstkind'] = self.curremt_kind
        res = self.SC.get_data(0, False, *VALUES_TUPLE_SP, **key_dict)
        if not len(res):
            return
        for item in res:
            qtreeitem = QTreeWidgetItem(self.treeWidget_detail)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, item['clientid'])
            qtreeitem.setText(2, item['clientname'])
            qtreeitem.setText(3, item['address'])
            qtreeitem.setText(4, item['charger'])
            qtreeitem.setText(5, item['telno'])
            qtreeitem.setText(6, item['taxno'])
        for i in range(1, 7):
            self.treeWidget_detail.resizeColumnToContents(i)

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_kind_itemClicked(self, qtreeitem, p_int):
        self.curremt_kind = int(qtreeitem.text(1))
        self.get_client_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_detail_itemDoubleClicked(self, qtreeitem, p_int):
        # if self.power[1] == '0':
        #     return
        id = int(qtreeitem.text(0))
        detail = EditClientDetailModule(id, self)
        detail.accepted.connect(self.get_client_list)
        detail.show()

    @pyqtSlot(QPoint)
    def on_treeWidget_kind_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        menu = QMenu()
        button1 = menu.addAction("增加分类")
        button2 = menu.addAction("修改分类")
        button3 = menu.addAction("删除分类")
        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)
        if action == button1:
            if current_item is None:
                parent_item = self.treeWidget_kind.topLevelItem(0)
            else:
                parent_item = current_item
            parent_id = int(parent_item.text(1))
            kwargs = {
                'kind': 4,
                'kindname': "新建分类",
                'parentid': parent_id,
                'inputcode': Inputcode.make_inputcode("新建分类")
            }
            kind_object = self.SC.update_data(4, **kwargs)
            qtreeitem = QTreeWidgetItem(parent_item)
            qtreeitem.setText(0, "新建分类")
            qtreeitem.setText(1, str(kind_object.autoid))

            self.treeWidget_kind.openPersistentEditor(qtreeitem, 0)
            self.treeWidget_kind.setCurrentItem(qtreeitem)
        elif action == button2:
            if current_item is None:
                return
            self.treeWidget_kind.setCurrentItem(None)
            self.treeWidget_kind.openPersistentEditor(current_item, 0)
            self.treeWidget_kind.setCurrentItem(current_item, 0)

        elif action == button3:
            if current_item is None:
                return
            id = int(current_item.text(1))
            condition = {'autoid': id}
            self.SC.delete_data(4, condition)
            self.get_kind_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_kind_itemChanged(self, qtreeitem, p_int):
        if self.treeWidget_kind.isPersistentEditorOpen(qtreeitem, p_int):
            self.treeWidget_kind.closePersistentEditor(qtreeitem, p_int)
            id = int(qtreeitem.text(1))
            new_kindname = qtreeitem.text(0)
            condition = {'autoid': id}
            kwargs = {'kindname': new_kindname}
            self.SC.update_data(4, condition, **kwargs)

    @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
    def on_treeWidget_kind_currentItemChanged(self, qtreeitem, qtreeitem_1):
        if self.treeWidget_kind.isPersistentEditorOpen(qtreeitem_1, 0):
            self.treeWidget_kind.closePersistentEditor(qtreeitem_1, 0)
            id = int(qtreeitem_1.text(1))
            new_kindname = qtreeitem_1.text(0)
            condition = {'autoid': id}
            kwargs = {'kindname': new_kindname}
            self.SC.update_data(4, condition, **kwargs)

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_kind_itemDoubleClicked(self, qtreeitem, p_int):
        self.treeWidget_kind.openPersistentEditor(qtreeitem, p_int)

    @pyqtSlot(QPoint)
    def on_treeWidget_detail_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        menu = QMenu()
        button1 = menu.addAction("增加记录")
        button2 = menu.addAction("修改记录")
        button3 = menu.addAction("删除记录")
        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)
        if action == button1:
            detail = EditClientDetailModule(parent=self)
            detail.accepted.connect(self.get_client_list)
            detail.show()
        elif action == button2:
            if current_item is None:
                return
            id = int(current_item.text(0))
            detail = EditClientDetailModule(id, self)
            detail.accepted.connect(self.get_client_list)
            detail.show()
        elif action == button3:
            if current_item is None:
                return
            id = int(current_item.text(0))
            condition = {'autoid': id}
            condition_3 = {'scid': id, 'kind': 1}
            self.SC.delete_data(0, condition)
            img_id_list = self.IC.get_data(0, True, *VALUES_TUPLE_IM,
                                           **condition_3)
            condition_4 = {'autoid__in': img_id_list}
            self.IC.delete_data(1, condition_4)
            self.IC.delete_data(0, condition_3)
            self.get_client_list()
Beispiel #13
0
class WarehouseController(object):
    def __init__(self):
        self.SC = StuffController()
        self.SLC = SaleController()
        self.SP = SupplyerController()
        self.WM = WarehouseModel()
        self.WC = WorkshopController()
        self.PC = ProductController()

    def get_stuffdrawpaper(self, *args, **kwargs):
        return self.SC.get_stuffdrawpaper(*args, **kwargs)
        """if len(res):
            ppid_list = list()
            for item in res:
                ppid_list.append(item.ppid)
            value_tuple = (
                'autoid', 'prodid', 'prodname', 'spec', 'package', 'batchno')
            prod_info_tuple = self.WM.get_producingplan(*value_tuple,
                                                        autoid__in=set(
                                                            ppid_list))
            for item in res:
                for it in prod_info_tuple:
                    if item.ppid == it[0]:
                        item.prod = it[1] + ' ' + it[2]
                        item.spec = it[3]
                        item.package = it[4]
                        item.batchno = it[5]
            return res
        else:
            return []"""

    def get_stuffrepository(self, display_flag=False, *args, **kwargs):
        return self.WM.get_stuffrepository(display_flag, *args, **kwargs)
        """res = self.WM.get_stuffrepository(flag, *args, **kwargs)
        supid_list = []
        if len(res):
            for item in res:
                supid_list.append(item['supid'])
            supplyers = self.SP.get_supply(('supid', 'supname'), supid__in=set(supid_list))
            for item in res:
                item['supname'] = ''
                for supplyer in supplyers:
                    if item['supid'] == supplyer[0]:
                        item['supname'] = supplyer[1]
                        break
        return res
        """

    def update_stuffrepository(self, autoid=None, *args, **kwargs):
        return WarehouseModel.update_stuffrepository(autoid, *args, **kwargs)

    def update_stuffrepository_amount(self, ppid, *args, **kwargs):
        return WarehouseModel.update_stuffrepository_amount(
            ppid, *args, **kwargs)

    def get_productputoutpaper(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_productputoutpaper(display_flag, *args,
                                                     **kwargs)

    def update_productputoutpaper(self, autoid=None, *args, **kwargs):
        return WarehouseModel.update_productputoutpaper(
            autoid, *args, **kwargs)

    def delete_productputoutpaper(self, autoid=None, *args, **kwargs):
        return WarehouseModel.delete_productputoutpaper(
            autoid, *args, **kwargs)

    def get_prodwithdrawnote(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_prodwithdrawnote(display_flag, *args,
                                                   **kwargs)

    def update_prodwithdrawnote(self, autoid, *args, **kwargs):
        return WarehouseModel.update_prodwithdrawnote(autoid, *args, **kwargs)

    def delete_prodwithdrawnote(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_prodwithdrawnote(autoid, *args, **kwargs)

    def get_ppopqrcode(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_ppopqrcode(display_flag, *args, **kwargs)

    def update_ppopqrcode(self, autoid, *args, **kwargs):
        return WarehouseModel.update_ppopqrcode(autoid, *args, **kwargs)

    def delete_ppopqrcode(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_ppopqrcode(autoid, *args, **kwargs)

    def get_pwqrcode(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_pwqrcode(display_flag, *args, **kwargs)

    def update_pwqrcode(self, autoid, *args, **kwargs):
        return WarehouseModel.update_pwqrcode(autoid, *args, **kwargs)

    def delete_pwqrcode(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_pwqrcode(autoid, *args, **kwargs)

    def get_stuffcheckin(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_stuffcheckin(display_flag, *args, **kwargs)

    def update_stuffcheckin(self, autoid, *args, **kwargs):
        return WarehouseModel.update_stuffcheckin(autoid, *args, **kwargs)

    def new_stuffcheckin(self, ppid, *args, **kwargs):
        detail = dict()
        key_dict = {'ppid': ppid}
        stuff_query = self.SP.get_purchstuff(False, *VALUES_TUPLE_PPLIST,
                                             **key_dict)
        if not len(stuff_query):
            return
        stuff_list = list(stuff_query)

        with transaction.atomic():
            p1 = transaction.savepoint()
            res = WarehouseModel.update_stuffcheckin(None, *args, **kwargs)

            for item in stuff_list:
                if item['amount'] - item['arrivedamount'] <= 0:
                    continue
                detail['paperno'] = res.paperno
                detail['papertype'] = 0
                detail['makedate'] = user.now_date
                detail['expireddate'] = user.now_date + datetime.timedelta(
                    days=item['expireddays'])
                detail['checkindate'] = user.now_date
                detail['amount'] = item['amount'] - item['arrivedamount']
                detail['piamount'] = item['amount'] - item['arrivedamount']
                detail['supid'] = kwargs['supid']
                detail['supname'] = kwargs['supname']
                del item['amount']
                del item['arrivedamount']
                del item['expireddays']
                detail.update(item)
                WarehouseModel.update_stuffcheckinlist(None, **detail)

    def delete_stuffcheckin(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_stuffcheckin(autoid, *args, **kwargs)

    def get_stuffcheckinlist(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_stuffcheckinlist(display_flag, *args,
                                                   **kwargs)

    def update_stuffcheckinlist(self, autoid, *args, **kwargs):
        return WarehouseModel.update_stuffcheckinlist(autoid, *args, **kwargs)

    def delete_stuffcheckinlist(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_stuffcheckinlist(autoid, *args, **kwargs)

    def get_productrepository(self, display_flag=False, *args, **kwargs):
        return WarehouseModel.get_productrepository(display_flag, *args,
                                                    **kwargs)

    def update_productrepository(self, autoid, *args, **kwargs):
        return WarehouseModel.update_productrepository(autoid, *args, **kwargs)

    def delete_productrepository(self, autoid, *args, **kwargs):
        return WarehouseModel.delete_productrepository(autoid, *args, **kwargs)

    def find_prodqrcode(self, qrcode):
        """ 产品二维码中是否找到输入的二维码(qrcode)
        返回4个参数
        第一个参数
            0: 找到二维码且(全部)未使用
            1: 找到二维码但(全部)已被使用
            2: 找到二维码但(部分)已被使用
            3: 找不到二维码
        第二个参数
            二维码级别
        第三个参数
            二维码对应的数量
        第四个参数
            二维码所在的ppid,选择结果集中的第一个ppid
        第五个二维码
            二维码所在的batchno,选择结果集的第一个batchno
        """
        key_dict_0 = {'qrcode0': qrcode}
        key_dict_1 = {'qrcode1': qrcode}
        key_dict_2 = {'qrcode2': qrcode}
        key_dict_3 = {'qrcode3': qrcode}
        res = None
        i = 0
        for i in range(0, 4):
            res = self.WC.get_prodqrcode(False, *VALUES_TUPLE_PRODQRCODE,
                                         **locals()['key_dict_' + str(i)])
            if len(res):
                break
        if not len(res):
            return 3, i, 0, 0, ''
        res_dist = res.distinct()
        sum = len(res)
        amount = self.sum_to_amount(sum, i, res_dist[0]['ppid'])

        if len(res_dist) == 2:

            return 2, i, amount, res_dist[0]['ppid'], res_dist[0]['batchno']
        elif len(res_dist) == 1:
            item = res_dist[0]
            if item['used'] == 0:
                return 0, i, amount, item['ppid'], item['batchno']
            else:
                return 1, i, amount, item['ppid'], item['batchno']
        else:
            return False

    def sum_to_amount(self, sum, i, ppid):
        """把二维码次数转位数量
        :parameter
            sum:二维码的数量
            i:第几级二维码
            ppid: 对应的批生产记录
        :return
            amount: 转换后的数量
        首先要获取ppid对应记录的扫码比例
        如果是0则 则amount=sum,否则amount=sum*没有扫码的级别数量
        """
        key_dict_pp = {'autoid': ppid}
        res = self.PC.get_producingplan(False, *VALUES_TUPLE_PP, **key_dict_pp)
        if not len(res):
            return 1
        qrtype = res[0]['qrtype']
        amount_list = (res[0]['bpamount'], res[0]['mpamount'],
                       res[0]['spamount'])
        if qrtype == 1:
            return sum
        for key, value in enumerate('{:04b}'.format(qrtype)[::-1]):
            if value == '1':
                break
            elif value == '0':
                sum *= amount_list[2 - key]
        return sum

    def add_ppopqrocde(self, flag, qrcode, detail):
        with transaction.atomic():
            p1 = transaction.savepoint()

            WarehouseModel.update_ppopqrcode(**detail)
            key_dict = {globals()['QRCODE_KIND'][flag]: qrcode}
            values = {'used': 1}
            self.WC.update_prodqrcode(key_dict, **values)

    def drop_ppopqrocde(self, flag, qrcode, autoid=None, **kwargs):
        with transaction.atomic():
            p1 = transaction.savepoint()

            WarehouseModel.delete_ppopqrcode(autoid, **kwargs)
            key_dict = {globals()['QRCODE_KIND'][flag]: qrcode}
            values = {'used': 0}
            self.WC.update_prodqrcode(key_dict, **values)

    def apply_productputoutpaper(self, autoid, snid=None, *args, **kwargs):
        with transaction.atomic():
            p1 = transaction.savepoint()
            WarehouseModel.update_productputoutpaper(autoid, *args, **kwargs)
            if snid is not None:
                key_dict_sn = {
                    'status': 3,
                    'deliverid': user.user_id,
                    'delivername': user.user_name
                }
                self.SLC.update_salenotes(snid, **key_dict_sn)
            key_dict = {'ppopid': autoid}
            qrcode_list = WarehouseModel.get_ppopqrcode(
                False, *VALUES_TUPLE_PPOPRCODE, **key_dict).order_by('ppid')
            no_enough_list = []
            # 大中小包装得数量
            for item in qrcode_list:
                kind = item['kind']
                amount = item['amount']
                ppid = item['ppid']

                if kind == 0:
                    key_dict_rep = {'pisource': 0, 'ppid': ppid}
                    rep_list = WarehouseModel.get_productrepository(
                        **key_dict_rep)
                    for rep_item in rep_list:
                        if rep_item.stockamount - amount >= 0:
                            rep_item.stockamount -= amount
                            amount = 0
                            rep_item.save()
                            break
                        else:
                            amount -= rep_item.stockamount
                            rep_item.stockamount = 0
                            rep_item.save()
                    if amount > 0:
                        no_enough_list.append((0, ppid))

                elif kind == 1:
                    key_dict_rep = {'pisource': 1, 'ppid': ppid}
                    # 优先比较零头的数量
                    rep_list = WarehouseModel.get_productrepository(
                        **key_dict_rep)
                    for rep_item in rep_list:
                        if rep_item.stockamount - amount >= 0:
                            rep_item.stockamount -= amount
                            amount = 0
                            rep_item.save()
                            break
                        else:
                            amount -= rep_item.stockamount
                            rep_item.stockamount = 0
                            rep_item.save()
                    if amount > 0:
                        key_dict_rep = {'pisource': 2, 'hxid': ppid}
                        # 优先比较零头的数量
                        rep_list = WarehouseModel.get_productrepository(
                            **key_dict_rep)
                        for rep_item in rep_list:
                            # 剩余数量和合箱剩余数量都是足够
                            if rep_item.stockamount - amount >= 0 and \
                                    rep_item.hxstockamount - amount >= 0:

                                rep_item.stockamount -= amount
                                rep_item.hxstockamount -= amount
                                amount = 0
                                rep_item.save()
                                break
                            else:
                                amount -= rep_item.hxstockamount
                                rep_item.hxstockamount = 0
                                rep_item.save()
                        if amount > 0:
                            no_enough_list.append((1, ppid))
                elif kind == 2:
                    key_dict_rep = {'pisource': 2, 'ppid': ppid}
                    rep_list = WarehouseModel.get_productrepository(
                        **key_dict_rep)
                    for rep_item in rep_list:
                        # 剩余总数-合箱数量=本批的数量
                        if rep_item.stockamount - rep_item.hxstockamount - \
                                amount >= 0:
                            rep_item.stockamount -= amount
                            amount = 0
                            rep_item.save()
                            break
                        else:
                            amount -= (rep_item.stockamount - \
                                      rep_item.hxstockamount)
                            rep_item.stockamount = rep_item.hxstockamount
                            rep_item.save()
                    if amount > 0:
                        no_enough_list.append((2, ppid))

            if len(no_enough_list):
                transaction.savepoint_rollback(p1)
                return "no enough", no_enough_list
            else:
                return 'OK'

    def stuffreturn(self, autoid=0, backamount_list=[], *args, **kwargs):
        key_dict = {'autoid': 0}
        with transaction.atomic():
            p1 = transaction.savepoint()
            self.SC.update_stuffdrawpaper(autoid, *args, **kwargs)
            for item in backamount_list:
                id = item[0]
                backamount = item[1]
                key_dict['autoid'] = id
                sr_list = WarehouseModel.get_stuffrepository(False, **key_dict)
                if not len(sr_list):
                    continue
                sr_item = sr_list[0]
                sr_item.amount += backamount
                sr_item.save()

    def get_data(self, table_num: int, display_flag=False, *args, **kwargs):
        table_str = TABLE_SET[table_num][0]
        err_msg = "查询" + TABLE_SET[table_num][1]
        return WarehouseModel.get_data(table_str, err_msg, display_flag, *args,
                                       **kwargs)

    def update_data(self, table_num: int, condition={}, *args, **kwargs):
        table_str = TABLE_SET[table_num][0]
        err_msg = "更新" + TABLE_SET[table_num][1]
        return WarehouseModel.update_data(table_str, err_msg, condition, *args,
                                          **kwargs)

    def delete_data(self, table_num: int, condition={}, *args, **kwargs):
        table_str = TABLE_SET[table_num][0]
        err_msg = "删除" + TABLE_SET[table_num][1]
        return WarehouseModel.delete_data(table_str, err_msg, condition, *args,
                                          **kwargs)
Beispiel #14
0
class SaleOrderListModule(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(SaleOrderListModule, self).__init__(parent)
        self.setupUi(self)
        if '53' not in user.powers:
            self.close()
        if user.powers['53'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['53'])
        self.SC = SaleController()
        self.WC = WarehouseController()
        self.WSC = WorkshopController()
        self.groupBox.setVisible(False)
        self.snid = 0
        self.get_order_list()

    def get_order_list(self):
        self.treeWidget_orderlist.clear()
        self.treeWidget_orderlist.hideColumn(0)
        index = self.tabWidget.currentIndex()
        key_dict = {'status': index}
        order_list = self.SC.get_salenotes(False, *VALUES_TUPLE_ORDER,
                                           **key_dict)
        if not len(order_list):
            return
        for item in order_list:
            qtreeitem = QTreeWidgetItem(self.treeWidget_orderlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, item['paperno'])
            qtreeitem.setText(2, item['clientid'] + ' ' + item['clientname'])
            qtreeitem.setText(3, item['linkman'])
            qtreeitem.setText(4, item['telno'])
            qtreeitem.setText(5, str(item['saledate']))
            qtreeitem.setText(6, str(item['deliverydate']))
            qtreeitem.setText(7, item['deliveryplace'])
            qtreeitem.setText(8, item['salerid'] + ' ' + item['salername'])
            qtreeitem.setText(9, item['conveyance'])
            qtreeitem.setText(10, item['paymethod'])
            qtreeitem.setText(
                11, item['consignmentid'] + ' ' + item['consignmentname'])
            qtreeitem.setText(12,
                              item['deliverid'] + ' ' + item['delivername'])
            qtreeitem.setText(13, item['remark'])
        for i in range(1, 14):
            self.treeWidget_orderlist.resizeColumnToContents(i)

    def get_product_list(self):

        self.treeWidget_prodlist.clear()
        self.treeWidget_prodlist.hideColumn(0)
        key_dict = {'snid': self.snid}
        prod_list = self.SC.get_salenotegoods(False, *VALUES_TUPLE_PROD,
                                              **key_dict)
        if not len(prod_list):
            return
        for item in prod_list:
            qtreeitem = QTreeWidgetItem(self.treeWidget_prodlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, item['prodid'] + ' ' + item['prodname'])
            qtreeitem.setText(2, item['spec'])
            qtreeitem.setText(3, item['package'])
            qtreeitem.setText(4, to_str(item['saleamount']))
            qtreeitem.setText(5, item['spunit'])
            prodid = item['prodid']
            key_dict_rep = {'prodid': prodid, 'stockamount__gt': 0}
            product_rep_list = self.WC.get_productrepository(
                False, *VALUES_TUPLE_REP,
                **key_dict_rep).annotate(amount=Sum('stockamount'))
            if len(product_rep_list):
                qtreeitem.setText(6, to_str(product_rep_list[0]['amount']))
            else:
                qtreeitem.setText(6, '0')
        for i in range(1, 7):
            self.treeWidget_prodlist.resizeColumnToContents(i)

    @pyqtSlot(int)
    def on_tabWidget_currentChanged(self, p_int):
        tab = getattr(self, 'tab_' + str(p_int))
        tab.setLayout(self.gridLayout_2)
        self.groupBox.setVisible(False)
        self.get_order_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_orderlist_itemClicked(self, qtreeitem, p_int):
        self.groupBox.setVisible(True)

        self.snid = int(qtreeitem.text(0))
        self.get_product_list()

    @pyqtSlot(QPoint)
    def on_treeWidget_orderlist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        id = 0
        index = self.tabWidget.currentIndex()
        # 返回调用者的对象
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        if current_item is not None:
            id = int(current_item.text(0))

        menu = QMenu()
        if index == 0:
            button1 = menu.addAction("新增销售单")
            button2 = menu.addAction("修改销售单")
            button3 = menu.addAction("删除销售单")
            button4 = menu.addAction("提交审核")
        elif index == 1:
            button5 = menu.addAction("审核签名")
            button6 = menu.addAction("取消提交")
        elif index == 2:
            button7 = menu.addAction("取消发货")
        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)
        if index == 0:
            if action == button1:
                detail = EditSaleOrderMudule(parent=self)
                detail.accepted.connect(self.get_order_list)
                detail.show()
            elif action == button2:
                if id is None:
                    return
                detail = EditSaleOrderMudule(id, self)
                detail.accepted.connect(self.get_order_list)
                detail.show()
            elif action == button3:
                if id is None:
                    return

                key_dict_output = {'snid': id}
                res = self.WC.get_productputoutpaper(True,
                                                     *VALUES_TUPLE_OUTPUT,
                                                     **key_dict_output)
                if len(res):
                    key_dict_qrcode = {'ppopid': res[0]}
                    qrcodelist = self.WC.get_ppopqrcode(
                        True, *VALUES_TUPLE_OUTPUTDATE, **key_dict_qrcode)
                    if len(qrcodelist):
                        msg = MessageBox(self, text="已有出库记录,无法取消发货!")
                        msg.show()
                key_dict = {'snid': id}
                self.SC.delete_salenotes(id)
                self.SC.delete_salenotegoods(**key_dict)
                self.WC.delete_productputoutpaper(**key_dict)
                self.get_order_list()
            elif action == button4:
                if id is None:
                    return
                key_dict = {'status': 1}
                self.SC.update_salenotes(id, **key_dict)
                self.get_order_list()
        elif index == 1:
            if action == button5:
                if id is None:
                    return
                key_dict = {
                    'consignmentid': user.user_id,
                    'consignmentname': user.user_name,
                    'status': 2
                }
                self.SC.update_salenotes(id, **key_dict)
                key_dict_output = {'snid': id}
                res = self.WC.get_productputoutpaper(False,
                                                     *VALUES_TUPLE_OUTPUT,
                                                     **key_dict_output)
                if not len(res):
                    output_detail = {
                        'snid': id,
                        'snpaperno': current_item.text(1),
                        'pokind': "销售出库",
                        'clientid': current_item.text(2).split(' ')[0],
                        'clientname': current_item.text(2).split(' ')[1],
                        'remark': current_item.text(13)
                    }
                    res = self.WC.update_productputoutpaper(**output_detail)
                self.get_order_list()
            elif action == button6:
                if id is None:
                    return
                key_dict = {
                    'consignmentid': '',
                    'consignmentname': '',
                    'status': 0
                }
                self.SC.update_salenotes(id, **key_dict)
                self.get_order_list()
        elif index == 2:
            if action == button7:
                if id is None:
                    return
                key_dict = {
                    'consignmentid': '',
                    'consignmentname': '',
                    'status': 1
                }
                self.SC.update_salenotes(id, **key_dict)
                self.get_order_list()

    @pyqtSlot(QPoint)
    def on_treeWidget_prodlist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        id = 0
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
            # 返回调用者的对象
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        if current_item is not None:
            id = int(current_item.text(0))

        menu = QMenu()
        button1 = menu.addAction("增加")
        button2 = menu.addAction("修改")
        button3 = menu.addAction("删除")

        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)

        if action == button1:
            detail = EditSaleProdMudule(snid=self.snid, parent=self)
            detail.accepted.connect(self.get_product_list)
            detail.show()

        elif action == button2:
            if not id:
                return
            detail = EditSaleProdMudule(autoid=id, parent=self)
            detail.accepted.connect(self.get_product_list)
            detail.show()
        elif action == button3:
            if not id:
                return
            key_dict_prod = {'autoid': id}
            lab_list = self.SC.delete_salenotegoods(**key_dict_prod)
            self.get_product_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_orderlist_itemDoubleClicked(self, qtreeitem, p_int):
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
        id = int(qtreeitem.text(0))
        detail = EditSaleOrderMudule(autoid=id, parent=self)
        detail.accepted.connect(self.get_order_list)
        detail.show()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_prodlist_itemDoubleClicked(self, qtreeitem, p_int):
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
        id = int(qtreeitem.text(0))
        detail = EditSaleProdMudule(autoid=id, parent=self)
        detail.accepted.connect(self.get_product_list)
        detail.show()
Beispiel #15
0
class EditClientDetailModule(QDialog, Ui_Dialog):
    def __init__(self, autoid=None, parent=None):
        super(EditClientDetailModule, self).__init__(parent)
        self.setupUi(self)
        if '54' not in user.powers:
            self.close()
        if user.powers['54'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['54'])
        if self.power[1] == '0':
            self.pushButton_accept.setVisible(False)
            self.pushButton_cancel.setVisible(False)
        self.autoid = autoid
        self.ori_detail = dict()
        self.new_detail = dict()
        self.current_img = object
        self.current_page = object
        self.province_list = []
        self.city_list = []
        self.county_list = []
        self.province_id = ''
        self.city_id = ''
        self.county_id = ''
        self.qyname = ''
        self.SC = SaleController()
        self.IC = ImageController()
        self.treeWidget_imagenamelist.hideColumn(0)
        self.treeWidget_imagenamelist.hideColumn(1)
        # 自动缩放
        self.label_image.setScaledContents(True)
        return_row = ('parentid', 'autoid', 'kindname')
        condition_key = {'autoid', 'kindname', 'inputcode'}
        treeheader_name = ['parentid', '编号', '名称']
        condition = {'kind': 4}
        self.lineEdit_tstkind.setup('Treestructure',
                                    return_row,
                                    condition_key,
                                    treeheader_name,
                                    condition,
                                    treewidth=300)
        self.get_detail()
        self.get_province()
        if len(self.ori_detail):
            self.get_city(self.ori_detail['province'])
            self.get_county(self.ori_detail['city'])

    def get_detail(self):
        if self.autoid is None:
            return
        key_dict = {'autoid': self.autoid}
        res = self.SC.get_data(0, False, *VALUE_TUPLE_SUP, **key_dict)
        if not len(res):
            return
        self.ori_detail = res[0]
        self.lineEdit_clientid.setText(self.ori_detail['clientid'])
        self.lineEdit_clientname.setText(self.ori_detail['clientname'])
        self.lineEdit_inputcode.setText(self.ori_detail['inputcode'])
        self.lineEdit_tstkind.setText(
            str(self.ori_detail['tstkind']) + ' ' + self.ori_detail['tstname'])
        self.lineEdit_address.setText(self.ori_detail['address'])
        self.lineEdit_postzip.setText(self.ori_detail['postzip'])
        self.lineEdit_charger.setText(self.ori_detail['charger'])
        self.lineEdit_telno.setText(self.ori_detail['telno'])
        self.lineEdit_chargertitle.setText(self.ori_detail['chargertitle'])
        self.lineEdit_email.setText(self.ori_detail['email'])
        self.lineEdit_bankname.setText(self.ori_detail['bankname'])
        self.lineEdit_bankaccount.setText(self.ori_detail['bankaccount'])
        self.lineEdit_taxno.setText(self.ori_detail['taxno'])
        self.plainTextEdit_remark.setPlainText(self.ori_detail['remark'])
        self.comboBox_kind.setCurrentIndex(self.ori_detail['kind'])
        self.lineEdit_unitcode.setText(self.ori_detail['unitcode'])

    def get_province(self):
        condition = {'itemtype': 1}
        self.province_list = self.SC.get_data(5, False, *VALUE_TUPLE_RI,
                                              **condition)
        self.comboBox_province.addItems(
            self.province_list.values_list('itemname', flat=True))
        if not len(self.ori_detail) or self.ori_detail['province'] == '':
            return
        self.comboBox_province.setCurrentText(self.ori_detail['province'])

    def get_city(self, province_name=''):
        self.comboBox_city.clear()
        condition = {'itemtype': 1, 'itemname': province_name}
        res = self.SC.get_data(5, True, *VALUE_TUPLE_II, **condition)
        if not len(res):
            return
        condition_city = {'itemtype': 2, 'parentitemid': res[0]}
        self.city_list = self.SC.get_data(5, False, *VALUE_TUPLE_RI,
                                          **condition_city)
        self.comboBox_city.addItems(
            self.city_list.values_list('itemname', flat=True))
        if not len(self.ori_detail) or self.ori_detail['city'] == '':
            return
        if self.comboBox_city.findText(self.ori_detail['city'],
                                       Qt.MatchExactly):
            self.comboBox_city.setCurrentText(self.ori_detail['city'])

    def get_county(self, county_name=''):
        self.comboBox_county.clear()
        condition = {'itemtype': 2, 'itemname': county_name}
        res = self.SC.get_data(5, True, *VALUE_TUPLE_II, **condition)
        if not len(res):
            return
        condition_city = {'itemtype': 3, 'parentitemid': res[0]}
        self.county_list = self.SC.get_data(5, False, *VALUE_TUPLE_RI,
                                            **condition_city)
        self.comboBox_county.addItems(
            self.county_list.values_list('itemname', flat=True))
        if not len(self.ori_detail) or self.ori_detail['county'] == '':
            return
        if self.comboBox_county.findText(self.ori_detail['county'],
                                         Qt.MatchExactly):
            self.comboBox_county.setCurrentText(self.ori_detail['county'])

    def get_image(self):
        self.treeWidget_imagenamelist.clear()
        if self.autoid is None:
            return
        key_dict = {'scid': self.autoid, 'kind': 0}
        res = self.IC.get_data(0, False, *VALUE_TUPLE_IMRELA, **key_dict)
        for item in res:
            qtreeitem = QTreeWidgetItem(self.treeWidget_imagenamelist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, str(item['imageid']))
            qtreeitem.setText(2, item['title'])
            qtreeitem.setText(3, item['creatorid'] + item['creatorname'])
            qtreeitem.setText(4, str(item['createdate']))

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_imagenamelist_itemDoubleClicked(self, qtreeitem, p_int):

        img_id = int(qtreeitem.text(1))
        key_dict = {'autoid': img_id}
        res = self.IC.get_data(1, False, *VALUE_TUPLE_IM, **key_dict)
        if not len(res):
            return
        ext = res[0]['ext']
        image = res[0]['img']

        if ext.lower() == 'pdf':
            self.comboBox_jumpto.setVisible(True)
            self.pushButton_prepage.setVisible(True)
            self.pushButton_nextpage.setVisible(True)
            self.current_img = fitz.Document(stream=image, filetype='pdf')
            page_count = self.current_img.pageCount
            page_list = []
            self.comboBox_jumpto.clear()
            for i in range(1, page_count + 1):
                page_list.append('第' + str(i) + '页')
            self.comboBox_jumpto.addItems(page_list)
            self.current_page = self.current_img.loadPage(0)

        else:
            self.comboBox_jumpto.setVisible(False)
            self.pushButton_prepage.setVisible(False)
            self.pushButton_nextpage.setVisible(False)
            img = QImage.fromData(image)
            self.current_img = QPixmap.fromImage(img)
            self.label_image.setPixmap(self.current_img)

        # 默认放大为3被,同时自动调用on_horizontalSlider_zoom_valueChanged
        self.horizontalSlider_zoom.setValue(30)

    @pyqtSlot(int)
    def on_horizontalSlider_zoom_valueChanged(self, p_int):

        try:
            self.label_zoom.setText(str(p_int * 10) + '%')
            # 把当前页面转为QPixmap,并缩放为p_int/10
            cover = render_pdf_page(self.current_page, p_int / 10, p_int / 10)
            self.label_image.setPixmap(cover)
        except (ValueError, AttributeError):
            size = self.current_img.size()
            new_pixmap = self.current_img.scaled(size.width() * p_int / 10,
                                                 size.height() * p_int / 10)
            self.label_image.setPixmap(new_pixmap)

    @pyqtSlot(int)
    def on_comboBox_jumpto_currentIndexChanged(self, p_int):
        try:
            self.current_page = self.current_img.loadPage(p_int)
            self.on_horizontalSlider_zoom_valueChanged(
                self.horizontalSlider_zoom.value())
        except (AttributeError, ValueError):
            pass

    @pyqtSlot()
    def on_pushButton_prepage_clicked(self):
        index = self.comboBox_jumpto.currentIndex()
        if index - 1 >= 0:
            try:
                self.current_page = self.current_img.loadPage(index - 1)
                self.comboBox_jumpto.setCurrentIndex(index - 1)
            except (AttributeError, ValueError):
                pass

    @pyqtSlot()
    def on_pushButton_nextpage_clicked(self):
        index = self.comboBox_jumpto.currentIndex()
        if index + 1 < self.comboBox_jumpto.count():
            try:
                self.current_page = self.current_img.loadPage(index + 1)
                self.comboBox_jumpto.setCurrentIndex(index + 1)
            except (AttributeError, ValueError):
                pass

    @pyqtSlot(QPoint)
    def on_treeWidget_imagenamelist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        # 返回调用者的对象
        sender_widget = self.sender()
        menu = QMenu()
        button1 = menu.addAction("新增图片")
        button2 = menu.addAction("修改图片")
        button3 = menu.addAction("删除图片")
        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)
        res = "rollback"
        # 增加
        if action == button1:
            img_names, img_type = QFileDialog.getOpenFileNames(
                self, "打开图片",
                os.path.expanduser("~") + "\Desktop",
                "*.jpg;;*.png;;*.bmp;;*.gif;;*.pdf;;All Files(*)")
            for item in img_names:
                imagename_no_ext = item.split("/")[-1]
                image_ext = item.split(".")[1]
                if image_ext.lower() not in ("jpg", "png", "bmp", "gif",
                                             "pdf"):
                    continue
                fp = open(item, 'rb')
                with fp:
                    image_byte = fp.read()
                    fp.close()
                imagedetail = {'img': image_byte, 'ext': image_ext}
                reladetail = {
                    'kind': 1,
                    'scid': self.autoid,
                    'title': imagename_no_ext,
                    'creatorid': user.user_id,
                    'creatorname': user.user_name,
                    'createdate': user.now_date
                }

                res = self.IC.update_images(reladetail, imagedetail)

        # 修改
        elif action == button2:
            rela_id = self.treeWidget_imagenamelist.currentItem().text(0)
            img_id = self.treeWidget_imagenamelist.currentItem().text(1)
            img_name, img_type = QFileDialog.getOpenFileName(
                self, "打开图片",
                os.path.expanduser("~") + "\Desktop",
                "*.jpg;;*.png;;*.bmp;;*.gif;;*.pdf;;All Files(*)")
            imagename_no_ext = img_name.split("/")[-1]
            image_ext = img_name.split(".")[1]
            if image_ext.lower() in ("jpg", "png", "bmp", "gif", "pdf"):
                fp = open(img_name, 'rb')
                with fp:
                    image_byte = fp.read()
                    fp.close()
                imagedetail = {'img': image_byte, 'ext': image_ext}
                reladetail = {
                    'title': imagename_no_ext,
                    'creatorid': user.user_id,
                    'creatorname': user.user_name,
                    'createdate': user.now_date
                }

                res = self.IC.update_images(reladetail, imagedetail, rela_id,
                                            img_id)

        # 删除
        elif action == button3:
            select_item = sender_widget.selectedItems()
            rela_id = []
            img_id = []
            for item in select_item:
                rela_id.append(item.text(0))
                img_id.append(item.text(1))
            res = self.IC.delete_images(rela_id, img_id)

        if res == "accept":
            self.get_image()

    @pyqtSlot(str)
    def on_lineEdit_clientid_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['clientid']:
                self.new_detail['clientid'] = p_str
            else:
                try:
                    del self.new_detail['clientid']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['clientid'] = p_str

        @pyqtSlot(bool, str)
        def on_pushButton_warrantor_signChanged(self, p_bool, p_str):
            id, name = p_str.split(' ') if p_bool else ('', '')
            try:
                if id != self.ori_detail['warrantorid'] or name != \
                        self.ori_detail[
                            'warrantorname']:
                    self.new_detail['warrantorid'] = id
                    self.new_detail['warrantorname'] = name
                else:
                    try:
                        del self.new_detail['warrantorid']
                        del self.new_detail['warrantorname']
                    except KeyError:
                        pass
            except KeyError:
                self.new_detail['warrantorid'] = id
                self.new_detail['warrantorname'] = name

    @pyqtSlot(str)
    def on_lineEdit_clientname_textChanged(self, p_str):
        self.qyname = p_str
        self.lineEdit_inputcode.setText(Inputcode.make_inputcode(p_str))
        try:
            if p_str != self.ori_detail['clientname']:
                self.new_detail['clientname'] = p_str
            else:
                try:
                    del self.new_detail['clientname']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['clientname'] = p_str

    @pyqtSlot(int)
    def on_comboBox_kind_currentIndexChanged(self, p_int):
        try:
            if p_int != self.ori_detail['kind']:
                self.new_detail['kind'] = p_int
            else:
                try:
                    del self.new_detail['kind']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['kind'] = p_int

    @pyqtSlot(str)
    def on_comboBox_province_currentTextChanged(self, p_str):
        for item in self.province_list:
            if item['itemname'] == p_str:
                self.province_id = item['itemid']
                break
        try:
            if p_str != self.ori_detail['province']:
                self.get_city(p_str)
                self.new_detail['province'] = p_str
            else:
                try:
                    del self.new_detail['province']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['province'] = p_str

    @pyqtSlot(str)
    def on_comboBox_city_currentTextChanged(self, p_str):
        for item in self.city_list:
            if item['itemname'] == p_str:
                self.city_id = item['itemid']
                break
        try:
            if p_str != self.ori_detail['city']:
                self.new_detail['city'] = p_str
                self.get_county(p_str)
            else:
                try:
                    del self.new_detail['city']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['city'] = p_str

    @pyqtSlot(str)
    def on_comboBox_county_currentTextChanged(self, p_str):
        for item in self.county_list:
            if item['itemname'] == p_str:
                self.county_id = item['itemid']
                break
        try:
            if p_str != self.ori_detail['county']:
                self.new_detail['county'] = p_str
            else:
                try:
                    del self.new_detail['county']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['county'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_unitcode_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['unitcode']:
                self.new_detail['unitcode'] = p_str
            else:
                try:
                    del self.new_detail['unitcode']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['unitcode'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_tstkind_textChanged(self, p_str):
        if len(p_str.split(' ')) != 2 and p_str != '':
            return
        id, name = p_str.split(' ') if p_str != '' else ('', '')
        try:
            if id != self.ori_detail['tstkind'] or name != \
                    self.ori_detail['tstname']:
                self.new_detail['tstkind'] = id
                self.new_detail['tstname'] = name
            else:
                try:
                    del self.new_detail['tstkind']
                    del self.new_detail['tstname']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['tstkind'] = id
            self.new_detail['tstname'] = name

    @pyqtSlot(str)
    def on_lineEdit_inputcode_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['inputcode']:
                self.new_detail['inputcode'] = p_str
            else:
                try:
                    del self.new_detail['inputcode']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['inputcode'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_address_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['address']:
                self.new_detail['address'] = p_str
            else:
                try:
                    del self.new_detail['address']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['address'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_postzip_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['postzip']:
                self.new_detail['postzip'] = p_str
            else:
                try:
                    del self.new_detail['postzip']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['postzip'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_charger_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['charger']:
                self.new_detail['charger'] = p_str
            else:
                try:
                    del self.new_detail['charger']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['charger'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_telno_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['telno']:
                self.new_detail['telno'] = p_str
            else:
                try:
                    del self.new_detail['telno']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['telno'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_chargertitle_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['chargertitle']:
                self.new_detail['chargertitle'] = p_str
            else:
                try:
                    del self.new_detail['chargertitle']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['chargertitle'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_email_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['email']:
                self.new_detail['email'] = p_str
            else:
                try:
                    del self.new_detail['email']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['email'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_bankname_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['bankname']:
                self.new_detail['bankname'] = p_str
            else:
                try:
                    del self.new_detail['bankname']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['bankname'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_bankaccount_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['bankaccount']:
                self.new_detail['bankaccount'] = p_str
            else:
                try:
                    del self.new_detail['bankaccount']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['bankaccount'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_taxno_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['taxno']:
                self.new_detail['taxno'] = p_str
            else:
                try:
                    del self.new_detail['taxno']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['taxno'] = p_str

    @pyqtSlot()
    def on_plainTextEdit_remark_textChanged(self):
        p_str = self.plainTextEdit_remark.toPlainText()
        try:
            if p_str != self.ori_detail['remark']:
                self.new_detail['remark'] = p_str
            else:
                try:
                    del self.new_detail['remark']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['remark'] = p_str

    @pyqtSlot()
    def on_pushButton_get_unitcode_clicked(self):
        detail = SelectClientCodeModule(self.province_id, self.city_id,
                                        self.county_id, self.qyname, self)
        detail.selected.connect(self.set_clientname_and_unitcode)
        detail.show()

    def set_clientname_and_unitcode(self, p_str_1, p_str_2):
        self.lineEdit_clientname.setText(p_str_1)
        self.lineEdit_unitcode.setText(p_str_2)

    @pyqtSlot()
    def on_pushButton_accept_clicked(self):
        if not len(self.new_detail):
            return
        condition = dict()
        if self.autoid is not None:
            condition['autoid'] = self.autoid
        self.SC.update_data(0, condition, **self.new_detail)
        self.accept()

    @pyqtSlot()
    def on_pushButton_cancel_clicked(self):
        self.close()

    @pyqtSlot(int)
    def on_tabWidget_currentChanged(self, p_int):
        if p_int == 0:
            self.get_detail()
        elif p_int == 1:
            self.get_image()
        else:
            pass
class ProductPutOutPaperListModule(QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(ProductPutOutPaperListModule, self).__init__(parent)
        self.setupUi(self)
        if '35' not in user.powers:
            self.close()
        if user.powers['35'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['35'])

        self.SC = SaleController()
        self.WC = WarehouseController()
        self.WSC = WorkshopController()
        self.groupBox.setVisible(False)
        self.ppopid = 0
        self.prod_list = {}
        self.get_order_list()

    def get_order_list(self):
        self.treeWidget_orderlist.clear()
        # self.treeWidget_orderlist.hideColumn(0)
        # self.treeWidget_orderlist.hideColumn(1)
        index = self.tabWidget.currentIndex()
        key_dict = {'status': index}
        order_list = self.WC.get_productputoutpaper(False, *VALUES_TUPLE_ORDER,
                                                    **key_dict)
        if not len(order_list):
            return
        for item in order_list:
            qtreeitem = QTreeWidgetItem(self.treeWidget_orderlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, str(item['snid']))
            qtreeitem.setText(2, item['snpaperno'])
            qtreeitem.setText(3, item['pokind'])
            qtreeitem.setText(
                4,
                str(item['putoutdate'])
                if type(item['putoutdate']) is datetime.date else '')
            qtreeitem.setText(5, item['clientid'] + ' ' + item['clientname'])
            qtreeitem.setText(6, item['auditorid'] + ' ' + item['auditorname'])
            qtreeitem.setText(7, str(item['remark']))

        for i in range(2, 8):
            self.treeWidget_orderlist.resizeColumnToContents(i)

    def get_qrcode_list(self):

        self.treeWidget_itemlist.clear()
        self.treeWidget_itemlist.hideColumn(0)
        key_dict = {'ppopid': self.ppopid}
        self.prod_list = self.WC.get_ppopqrcode(False, **key_dict).extra(
            select={
                'prodid': 'prodid',
                'prodname': 'prodname',
                'spec': 'spec',
                'package': 'package',
                'lpunit': 'lpunit',
                'bpunit': 'bpunit',
                'mpunit': 'mpunit',
                'spunit': 'spunit'
            },
            tables=['producingplan'],
            where=['ppid=producingplan.autoid']).values(*VALUES_TUPLE_PROD)
        if not len(self.prod_list):
            return
        for item in self.prod_list:
            package_unit = [
                item['spunit'], item['mpunit'], item['bpunit'], item['lpunit']
            ]
            qtreeitem = QTreeWidgetItem(self.treeWidget_itemlist)
            qtreeitem.setText(0, str(item['autoid']))
            qtreeitem.setText(1, KIND[item['kind']])
            qtreeitem.setText(2, item['prodid'] + ' ' + item['prodname'])
            qtreeitem.setText(3, item['batchno'])
            qtreeitem.setText(4, str(item['amount']) + item['spunit'])
            qtreeitem.setText(5, item['spec'])
            qtreeitem.setText(6, item['package'])
            qtreeitem.setText(7, item['qr0'])
            qtreeitem.setText(8, package_unit[item['flag']] + '码')

        for i in range(1, 9):
            self.treeWidget_itemlist.resizeColumnToContents(i)

    @pyqtSlot(int)
    def on_tabWidget_currentChanged(self, p_int):
        tab = getattr(self, 'tab_' + str(p_int))
        tab.setLayout(self.gridLayout_2)
        self.groupBox.setVisible(False)
        self.get_order_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_orderlist_itemClicked(self, qtreeitem, p_int):
        self.groupBox.setVisible(True)

        self.ppopid = int(qtreeitem.text(0))
        self.get_qrcode_list()

    @pyqtSlot(QPoint)
    def on_treeWidget_orderlist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        id = 0
        snid = 0
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
        # 返回调用者的对象
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        if current_item is not None:
            id = int(current_item.text(0))
            snid = int(current_item.text(1))

        menu = QMenu()

        button1 = menu.addAction("新增出库单")
        button2 = menu.addAction("修改出库单")
        button3 = menu.addAction("删除出库单")
        menu.addSeparator()
        button4 = menu.addAction("提交出库")
        menu.addSeparator()
        button5 = menu.addAction("查看销售订单")

        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)

        if action == button1:
            detail = EditProductPutOutPaperModule(parent=self)
            detail.accepted.connect(self.get_order_list)
            detail.show()
        elif action == button2:
            if id is None:
                return
            detail = EditProductPutOutPaperModule(id, self)
            detail.accepted.connect(self.get_order_list)
            detail.show()
        elif action == button3:
            if id is None:
                return

            key_dict_output = {'ppopid': id}
            res = self.WC.get_ppopqrcode(True, *VALUES_TUPLE_OUTPUT,
                                         **key_dict_output)
            if len(res):
                msg = MessageBox(self, text="已有出库记录,无法删除出库单!")
                msg.show()
                return

            key_dict = {'autoid': id}
            self.WC.delete_productputoutpaper(**key_dict)
            self.get_order_list()
        elif action == button4:
            if id is None:
                return
            key_dict = {
                'status': 1,
                'auditorid': user.user_id,
                'auditorname': user.user_name,
                'putoutdate': user.now_date
            }
            res = self.WC.apply_productputoutpaper(id, snid, **key_dict)
            if res == "OK":
                if snid != 0:
                    key_dict_salenote = {
                        'status': 3,
                        'deliverid': user.user_id,
                        'delivername': user.user_name
                    }
                    self.SC.update_salenotes(snid, **key_dict_salenote)
                self.get_order_list()
            else:
                REP_KIND = ("整箱", "零头", "合箱")
                if not len(self.prod_list):
                    self.ppopid = id
                    self.get_qrcode_list()
                informative = ''
                prodname = ''
                batchno = ''
                for item in res[1]:
                    for it in self.prod_list:
                        if it['ppid'] == item[1]:
                            prodname = it['prodname']
                            batchno = it['batchno']
                kind = REP_KIND[item[0]]
                informative += prodname + '(' + kind + '),批号:' + batchno + '\n'
                msg = MessageBox(self,
                                 text="以下产品库存不足",
                                 informative=informative)
                msg.exec()
                return
        elif action == button5:
            if snid == 0:
                msg = MessageBox(self, text="没有找到关联的销售订单")
                msg.show()
                return
            detail = SaleOrderModule(snid, self)
            detail.show()

    @pyqtSlot(QPoint)
    def on_treeWidget_itemlist_customContextMenuRequested(self, pos):
        if self.power[1] == '0':
            return
        id = 0
        flag = 0
        qrcode = ''
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
            # 返回调用者的对象
        sender_widget = self.sender()
        current_item = sender_widget.currentItem()
        if current_item is not None:
            id = int(current_item.text(0))
            flag = KIND.index(current_item.text(1))
            qrcode = current_item.text(8)

        menu = QMenu()
        button1 = menu.addAction("增加")
        button2 = menu.addAction("删除")

        global_pos = sender_widget.mapToGlobal(pos)
        action = menu.exec(global_pos)

        if action == button1:
            detail = ScanPpopQrcodeMudule(self.ppopid, self)
            detail.qrcodeAdded.connect(self.get_qrcode_list)
            detail.show()

        elif action == button2:
            if not id:
                return
            self.WC.drop_ppopqrocde(flag, qrcode, id)
            self.get_qrcode_list()

    @pyqtSlot(QTreeWidgetItem, int)
    def on_treeWidget_orderlist_itemDoubleClicked(self, qtreeitem, p_int):
        index = self.tabWidget.currentIndex()
        if index != 0:
            return
        id = int(qtreeitem.text(0))
        detail = EditProductPutOutPaperModule(autoid=id, parent=self)
        detail.accepted.connect(self.get_order_list)
        detail.show()
class EditSaleOrderMudule(QDialog, Ui_Dialog):
    def __init__(self, autoid=None, parent=None):
        super(EditSaleOrderMudule, self).__init__(parent)
        self.setupUi(self)
        if '53' not in user.powers:
            self.close()
        if user.powers['53'] == 0:
            self.close()
        self.power = '{:03b}'.format(user.powers['53'])
        if self.power[1] == '0':
            self.pushButton_accept.setVisible(False)
            self.pushButton_cancel.setVisible(False)
        self.autoid=autoid
        self.SC = SaleController()
        self.ori_detail = dict()
        self.new_detail = dict()
        row = ('autoid', 'clientid', 'clientname', 'address')
        key = ('clientid', 'clientname', 'inputcode')
        row_name = ("id", "客户编号", "客户名称", "客户地址")
        self.lineEdit_client.setup('Client', row, key, row_name, None, 550, 290)
        if self.autoid is None:
            self.set_paperno()
            self.dateEdit_saledate.setDate(user.now_date)
            self.dateEdit_deliverydate.setDate(user.now_date)
        else:
            self.get_detail()
        self.set_conveyance_list()
        self.set_paymethod_list()

    def get_detail(self):
        key_dict = {'autoid': self.autoid}
        detail_list = self.SC.get_salenotes(
            False, *VALUES_TUPLE_ORDER, **key_dict
        )
        if not len(detail_list):
            return
        self.ori_detail = detail_list[0]
        self.lineEdit_paperno.setText(self.ori_detail['paperno'])
        self.lineEdit_client.setText(
            self.ori_detail['clientid'] + ' ' + self.ori_detail['clientname']
        )
        self.lineEdit_deliveryplace.setText(self.ori_detail['deliveryplace'])
        self.lineEdit_linkman.setText(self.ori_detail['linkman'])
        self.lineEdit_telno.setText(self.ori_detail['telno'])
        self.dateEdit_saledate.setDate(self.ori_detail['saledate'])
        self.dateEdit_deliverydate.setDate(self.ori_detail['deliverydate'])
        self.lineEdit_remark.setText(self.ori_detail['remark'])

    def set_paperno(self):
        res = self.SC.get_salenotes(True, *VALUES_TUPLE_PAPERNO)
        if not len(res):
            return ''
        max_paperno = res.order_by('-paperno')[0]
        num = re.findall('\d+', max_paperno)[-1]
        new_num = str(int(num) + 1)
        i = len(new_num)
        while i < len(num):
            new_num = '0' + new_num
            i += 1

        max_paperno = max_paperno.replace(num, new_num)
        self.lineEdit_paperno.setText(max_paperno)

    def set_conveyance_list(self):
        items = self.SC.get_salenotes(True, *VALUES_TUPLE_CONVEYANCE)\
            .distinct()
        if len(items):
            self.comboBox_conveyance.addItems(items)
        if len(self.ori_detail):
            self.comboBox_conveyance.setCurrentText(
                self.ori_detail['conveyance']
            )
        else:
            self.comboBox_conveyance.setCurrentText('')

    def set_paymethod_list(self):
        items = self.SC.get_salenotes(True, *VALUES_TUPLE_PAYMETHOD)\
            .distinct()
        if len(items):
            self.comboBox_paymethod.addItems(items)
        if len(self.ori_detail):
            self.comboBox_paymethod.setCurrentText(
                self.ori_detail['paymethod']
            )
        else:
            self.comboBox_paymethod.setCurrentText('')

    @pyqtSlot(str)
    def on_lineEdit_client_textChanged(self, p_str):
        if len(p_str.split(' ')) != 2 and p_str != '':
            return
        id, name = p_str.split(' ') if p_str != '' else ('', '')
        key_dict = {'clientid': id, 'clientname': name}
        res = self.SC.get_client(False, *VALUES_TUPLE_CLIENT, **key_dict)

        if len(res):
            client_detail = res[0]
            self.lineEdit_deliveryplace.setText(client_detail['address'])
            self.lineEdit_linkman.setText(client_detail['linkman'])
            self.lineEdit_telno.setText(client_detail['telno'])
            # self.new_detail['deliveryplace'] = client_detail['address']
            # self.new_detail['linkman'] = client_detail['linkman']
            # self.new_detail['telno'] = client_detail['telno']
            self.new_detail['salerid'] = client_detail['salerid']
            self.new_detail['salername'] = client_detail['salername']
        try:
            if id != self.ori_detail['clientid'] or name != self.ori_detail[
                'clientname']:
                self.new_detail['clientid'] = id
                self.new_detail['clientname'] = name
            else:
                try:
                    del self.new_detail['clientid']
                    del self.new_detail['clientname']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['clientid'] = id
            self.new_detail['clientname'] = name

    @pyqtSlot(QDate)
    def on_dateEdit_saledate_dateChanged(self, q_date):
        try:
            if type(self.ori_detail['saledate']) is str:
                self.new_detail['saledate'] = q_date.toPyDate()
                return
            if q_date != QDate(self.ori_detail['saledate']):
                self.new_detail['saledate'] = q_date.toPyDate()
            else:
                try:
                    del self.new_detail['saledate']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['saledate'] = q_date.toPyDate()

    @pyqtSlot(QDate)
    def on_dateEdit_deliverydate_dateChanged(self, q_date):
        try:
            if type(self.ori_detail['deliverydate']) is str:
                self.new_detail['deliverydate'] = q_date.toPyDate()
                return
            if q_date != QDate(self.ori_detail['bpdate']):
                self.new_detail['deliverydate'] = q_date.toPyDate()
            else:
                try:
                    del self.new_detail['bpdate']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['deliverydate'] = q_date.toPyDate()

    @pyqtSlot(str)
    def on_lineEdit_paperno_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['paperno']:
                self.new_detail['paperno'] = p_str
            else:
                try:
                    del self.new_detail['paperno']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['paperno'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_deliveryplace_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['deliveryplace']:
                self.new_detail['deliveryplace'] = p_str
            else:
                try:
                    del self.new_detail['deliveryplace']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['deliveryplace'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_linkman_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['linkman']:
                self.new_detail['linkman'] = p_str
            else:
                try:
                    del self.new_detail['linkman']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['linkman'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_telno_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['telno']:
                self.new_detail['telno'] = p_str
            else:
                try:
                    del self.new_detail['telno']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['telno'] = p_str

    @pyqtSlot(str)
    def on_comboBox_conveyance_currentTextChanged(self, p_str):
        try:
            if p_str != self.ori_detail['conveyance']:
                self.new_detail['conveyance'] = p_str
            else:
                try:
                    del self.new_detail['conveyance']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['conveyance'] = p_str

    @pyqtSlot(str)
    def on_comboBox_paymethod_currentTextChanged(self, p_str):
        try:
            if p_str != self.ori_detail['paymethod']:
                self.new_detail['paymethod'] = p_str
            else:
                try:
                    del self.new_detail['paymethod']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['paymethod'] = p_str

    @pyqtSlot(str)
    def on_lineEdit_remark_textChanged(self, p_str):
        try:
            if p_str != self.ori_detail['remark']:
                self.new_detail['remark'] = p_str
            else:
                try:
                    del self.new_detail['remark']
                except KeyError:
                    pass
        except KeyError:
            self.new_detail['remark'] = p_str

    @pyqtSlot()
    def on_pushButton_accept_clicked(self):
        if not len(self.new_detail):
            return
        if 'paperno' in self.new_detail:
            key_dict = {'paperno': self.new_detail['paperno']}
            res = self.SC.get_salenotes(True, *VALUES_TUPLE_PAPERNO, **key_dict)
            if len(res):
                msg = MessageBox(
                    self, text="单号重复,请修改后重新提交",
                    informative="已经存在单号为" + self.new_detail['paperno'] +
                                "的记录了!"
                )
                msg.show()
                self.lineEdit_paperno.setFocus()
                return
        self.new_detail['creatorid'] = user.user_id
        self.new_detail['creatorname'] = user.user_name
        self.SC.update_salenotes(self.autoid, **self.new_detail)
        self.accept()

    @pyqtSlot()
    def on_pushButton_cancel_clicked(self):
        self.close()