Что нового

Написать программу тренировки кассира. Алгоритм прилагаю

lemonia

Чайник
Сообщения
114
Репутация
0
Версия AutoIt: 3.3.12.0

Описание:
Эта программа нужна мне для того, чтобы не ошибаться после устройства на работу по сумме денег, подсчитанной в конце смены кассовым аппаратом с суммой денег в денежном ящике, для тренировки автоматизма расчётов с покупателями на большой скорости.
На экране должно быть окошко с размерами цифр, которые хорошо видно. Вводим сумму (по мере ввода она отображается в окошке, для отделения копеек можно использовать запятую или точку). нажимаем F2, Это заносит сумму в память и на табло что то должно произойти, что подтвердит занесение в память, например снизу цифр высветится надпись "Единица товара оформлена". Или число подсветится другим цветом. Или и то и то или что то другое или ничего не надо такого, если это долго реализовывать.
Набираем другое число по такому же принципу (или ограничиваемся одним товаром) и так далее. Число стоимости предыдущего товара исчезает с экрана и появляется следующее. Снова нажимаем F2. Как вариант можно снизу этого большого окошка вести лог добавленных сумм и произведенных расчётов с покупателем.
Далее возможно два варианта:
1 вариант. Покупатель закончил выбор товаров с витрины. Жмём Cntrl. Сумма всех товаров складывается и высвечивается вместо числа стоимости последнего товара. Покупатель даёт деньги. Набираем сколько дал он денег. При начале набора предыдущее число суммы стоимости всех товаров исчезает с экрана. Жмём пробел. Программа вычитает из количества данных денег стоимость покупки и высвечивает на экране сдачу и пишет "Сдача". Если денег внесено ровно, то сдача высвечивается 00.00. Если по ошибке денег покупатель дал мало и мы набрали эту сумму, то высветится "Ошибка. Внесена меньшая стоимость".
2 вариант. Если покупатель внес ровную сумму, равную стоимости покупки. Сразу жмём пробел.
--------------
Нужна возможность редактировать число, введённое по ошибке или сбрасывать его всё клавишей DEL. А также отменять всю покупку, как имитация того, что покупатель отказался от покупки всех товаров.
При нажатии на F7 Программа складывает все покупки (всех покупателей за смену) и высвечивает сумму. Начинаем считать деньги (возможно нарежу предварительно бумажки и обозначу на них, какая это может быть купюра) и сравниваем с этим числом.
Нажатие на F11 обнуляет всё. Начинаем тренировку по новой.
Можно добавить конфиг с возможностью прописать другие горячие клавиши.
Примечания: работаю в Windows XP.
 

joiner

Модератор
Локальный модератор
Сообщения
2 990
Репутация
501
[off title=OffTopic]такую программу за просто так пишут для развлечения. если она очень нужна, то лучше в раздел "покупка\продажа". за вознаграждение будет другой подход к написанию. иначе претензии никто не примет. программа связана с коммерцией. тут "абы как" не подходит[/off]
 

ra4o

Скриптер
Сообщения
978
Репутация
180
Как Вы видите переход к следующей продаже, когда выводится значение сдачи ?
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Раз нажат пробел, то это означает, что товар человеку отпущен и сейчас будет следующий клиент. Набирается число стоимости товара. При нажатии на цифру число сдачи исчезает с экрана.


Добавлено:
Сообщение автоматически объединено:

2 вариант. Если покупатель внес ровную сумму, равную стоимости покупки. Сразу жмём пробел.
Вот это для случая, когда товар один и за него внесена точная сумма. Однако для упрощения программы это можно не делать.


Добавлено:
Сообщение автоматически объединено:

Ещё можно добавить такой функционал, а можно и не добавлять. Что если нажать повторно на F2 или несколько раз, то введённое число отобьётся при каждом нажатии. Это будет означать, что добавлено несколько единиц одинакового товара. Это для тренировки вдвоём, когда один говорит, какие товары хочет купить, а кассир не должен ошибиться.



 

ra4o

Скриптер
Сообщения
978
Репутация
180
Я набросал , просто, как пример. есть в принципе всё, кроме логов (это тоже не проблема), возможности изменять HotKey (в основном из - за "Ctrl", так как эту клавишу нельзя назначать на HotKey - реализовал иначе), ну и красрту не наводил :smile: посмотрите ...
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

HotKeySet('{F2}', '_EnterSum')
HotKeySet('{SPACE}', '_Change')
HotKeySet('{Del}', '_Del')
HotKeySet('{F7}', '_TotalShift')
HotKeySet('{F11}', '_NewShift')


$hDLL = DllOpen("user32.dll")
Global $Total = 0, $TotalShift = 0

$hGui = GUICreate('Тренировка кассира', 620, 440)
$Label1 = GUICtrlCreateLabel('Сумма', 20, 40, 200, 45)
GUICtrlSetFont(-1, 30, 600)
$Summa = GUICtrlCreateInput('00.00', 250, 20, 350, 90, $ES_RIGHT)
GUICtrlSetFont(-1, 60, 600)
$LabelMessage = GUICtrlCreateLabel('', 20, 120, 580, 40)
GUICtrlSetFont(-1, 20, 600)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch

	If _IsPressed("11", $hDLL) Then
		While _IsPressed("11", $hDLL)
			Sleep(250)
		WEnd
		_SetValue()
	EndIf

WEnd

Func _NewShift()
	$TotalShift = 0
	$Total = 0
	GUICtrlSetData($Summa, '00.00')
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'Сумма')
EndFunc   ;==>_NewShift


Func _TotalShift()
	GUICtrlSetData($Summa, StringFormat('%.2f', $TotalShift))
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'За смену')
EndFunc   ;==>_TotalShift


Func _Del()

	GUICtrlSetData($Summa, '00.00')
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)

EndFunc   ;==>_Del


Func _Change()
	Local $Change
	If GUICtrlRead($Label1) = 'Итог' Then
		$Change = GUICtrlRead($Summa) - $Total

		If $Change < 0 Then
			GUICtrlSetData($Summa, StringFormat('%.2f', $Total))
			GUICtrlSetState($Summa, $GUI_FOCUS)
			GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
			GUICtrlSetData($LabelMessage, 'Ошибка! Внесена меньшая стоимость')

		Else
			GUICtrlSetData($Summa, StringFormat('%.2f', $Change))
			GUICtrlSetData($Label1, 'Сдача')
			GUICtrlSetData($LabelMessage, '')
			$TotalShift += $Total
			$Total = 0
			GUICtrlSetState($Summa, $GUI_FOCUS)
			GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
		EndIf

	Else


	EndIf
EndFunc   ;==>_Change


Func _SetValue()
	GUICtrlSetData($Summa, StringFormat('%.2f', $Total))
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'Итог')
EndFunc   ;==>_SetValue


Func _EnterSum()
	Local $Price
	GUICtrlSetData($Label1, 'Сумма')
	$Price = GUICtrlRead($Summa)
	$Total += $Price
	GUICtrlSetData($Summa, StringFormat('%.2f', $Price))
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)

EndFunc   ;==>_EnterSum


Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID, $sText
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $hGui
			Switch $nID
				Case $Summa
					Switch $nNotifyCode
						Case $EN_CHANGE
							If GUICtrlRead($Label1) = 'Сдача' Or GUICtrlRead($Label1) = 'За смену' Then GUICtrlSetData($Label1, 'Сумма')
							$sText = StringRegExp(GUICtrlRead($Summa), '(\d+(\.(\d{1,2})?)?)', 2)
							If @error Then
								GUICtrlSetData($Summa, '00.00')
							Else
								GUICtrlSetData($Summa, $sText[0])
							EndIf
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Не запустилось
 

Вложения

Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Версия AutoIt: 3.3.12.0


Добавлено:
Сообщение автоматически объединено:

Установил 3.3.14.0. Программа запустилась.


Добавлено:
Сообщение автоматически объединено:

Не мог разобраться, как вводить число, чтобы была точка перед копейками. Несколько раз закрывал и запускал программу и уже не запускается.



 

Вложения

ra4o

Скриптер
Сообщения
978
Репутация
180
Не мог разобраться, как вводить число, чтобы была точка перед копейками
Через точку и вводить
и уже не запускается.
похоже, что опять с библиотеками что-то , переустановите AutoIt...
Или прикрепил библиотеку , которую открыть не можете, замените её у себя
 

Вложения

Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Замена файла не помогла. У меня изменения от установленных старой и новой версий Аутоит исчезнут после перезагрузки (устанавливал под виртуализацией операционной системы). Потом можно будет заново установить и потестить. Сейчас не из дома занимаюсь на ноутбуке, а на стационарном ПК установлена 3.3.12.0, поэтому на ноут такую же поставил (то что она прописала - исчезнет после перезагрузки).
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Заработало после перезагрузки, благодарю. Модератора прошу не закрывать тему, чтобы, если кто то захочет дополнить полезностями программу, то смог здесь разместить результат. Из полезностей можно добавить лог ниже основного окна, например такого вида:
Товар на 200|внесено 250|Сдача 50
----------------------------------
Товар на 200|внесено 200|Сдача 0
----------------------------------
Товар на 200|внесено 150|Продавец ошибся и пробил
----------------------------------
Товар на 200
Товар на 150
Товар на 250
Итого 600|Внесено 1000|Сдача 400
----------------------------------
За смену столько то (цифра)


Добавлено:
Сообщение автоматически объединено:

Ещё снизу (в интерфейсе, не в логе) можно добавить строчку с обозначениями горячих клавиш.
Ещё Вы написали:
возможности изменять HotKey (в основном из - за "Ctrl", так как эту клавишу нельзя назначать на HotKey - реализовал иначе)
Не совсем понял, как иначе реализовано.

 

ra4o

Скриптер
Сообщения
978
Репутация
180
Не совсем понял, как иначе реализовано
Одну только клавишу "Ctrl" невозможно назначить , как "Hot Key" по-этому в скрипте это реализовано иначе (просто ожидание нажатия этой клавиши).
Добавил лог
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <ListboxConstants.au3>

HotKeySet('{F2}', '_EnterSum')
HotKeySet('{SPACE}', '_Change')
HotKeySet('{Del}', '_Del')
HotKeySet('{F7}', '_TotalShift')
HotKeySet('{F11}', '_NewShift')


$hDLL = DllOpen("user32.dll")
Global $Total = 0, $TotalShift = 0

$hGui = GUICreate('Тренировка кассира', 620, 500)
$Label1 = GUICtrlCreateLabel('Сумма', 20, 40, 200, 45)
GUICtrlSetFont(-1, 30, 600)
$Summa = GUICtrlCreateInput('00.00', 250, 20, 350, 90, $ES_RIGHT)
GUICtrlSetFont(-1, 60, 600)
$LabelMessage = GUICtrlCreateLabel('', 20, 120, 580, 40)
GUICtrlSetFont(-1, 20, 600)

$Log = GUICtrlCreateList('', 20, 180, 580, 240, BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOSEL))

GUICtrlCreateLabel('Горячие клавиши:' & @CR & _
		'"F2" - Продажа товара , "Пробел" - Закрыть чек продажи , "Del" - очистить окно сумма , "Ctrl" - Сумма по чеку' & @CR & _
		'"F7" - Сумма всего за смену , "F11" - Новая смена', 20, 440, 580, 60)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch

	If _IsPressed("11", $hDLL) Then
		While _IsPressed("11", $hDLL)
			Sleep(250)
		WEnd
		_SetValue()
	EndIf

WEnd

Func _NewShift()
	GUICtrlSetData($Log, '---------------------------------------------------------------------------|')
	GUICtrlSetData($Log, 'Смена закрыта  |')
	GUICtrlSetData($Log, '---------------------------------------------------------------------------|')
	$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
	GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)
	$TotalShift = 0
	$Total = 0
	GUICtrlSetData($Summa, '00.00')
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'Сумма')
EndFunc   ;==>_NewShift


Func _TotalShift()
	GUICtrlSetData($Log, '---------------------------------------------------------------------------|')
	GUICtrlSetData($Log, 'Всего за смену  ' & StringFormat('%.2f', $TotalShift) & '|')
	GUICtrlSetData($Log, '---------------------------------------------------------------------------|')
	$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
	GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)
	GUICtrlSetData($Summa, StringFormat('%.2f', $TotalShift))
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'За смену')
EndFunc   ;==>_TotalShift


Func _Del()

	GUICtrlSetData($Summa, '00.00')
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)

EndFunc   ;==>_Del


Func _Change()
	Local $Change
	If GUICtrlRead($Label1) = 'Итог' Then
		$Change = GUICtrlRead($Summa) - $Total

		If $Change < 0 Then
			GUICtrlSetData($Log, 'Итого ' & StringFormat('%.2f', $Total) & ' Внесено ' & StringFormat('%.2f', GUICtrlRead($Summa)) & ' Продавец ошибся и пробил' & '|')
			$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
			GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)
			GUICtrlSetData($Summa, StringFormat('%.2f', $Total))
			GUICtrlSetState($Summa, $GUI_FOCUS)
			GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
			GUICtrlSetData($LabelMessage, 'Ошибка! Внесена меньшая стоимость')

		Else
			GUICtrlSetData($Log, 'Итого ' & StringFormat('%.2f', $Total) & ' Внесено ' & StringFormat('%.2f', GUICtrlRead($Summa)) & ' Сдача ' & StringFormat('%.2f', $Change) & '|')
			GUICtrlSetData($Log, '---------------------------------------------------------------------------|')
			$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
			GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)
			GUICtrlSetData($Summa, StringFormat('%.2f', $Change))
			GUICtrlSetData($Label1, 'Сдача')
			GUICtrlSetData($LabelMessage, '')
			$TotalShift += $Total
			$Total = 0
			GUICtrlSetState($Summa, $GUI_FOCUS)
			GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
		EndIf

	Else


	EndIf
EndFunc   ;==>_Change


Func _SetValue()
	GUICtrlSetData($Summa, StringFormat('%.2f', $Total))
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Label1, 'Итог')
	GUICtrlSetData($Log, 'Итого ' & StringFormat('%.2f', $Total) & '|')
	$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
	GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)
EndFunc   ;==>_SetValue


Func _EnterSum()
	Local $Price
	GUICtrlSetData($Label1, 'Сумма')
	$Price = StringFormat('%.2f', GUICtrlRead($Summa))
	$Total += $Price
	GUICtrlSetData($Summa, $Price)
	GUICtrlSetState($Summa, $GUI_FOCUS)
	GUICtrlSendMsg($Summa, $EM_SETSEL, 0, -1)
	GUICtrlSetData($Log, 'Товар на ' & $Price & '|')
	$LastItem = GUICtrlSendMsg($Log, $LB_GETCOUNT, 0, 0)
	GUICtrlSendMsg($Log, $LB_SETCARETINDEX, $LastItem - 1, False)

EndFunc   ;==>_EnterSum


Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
	Local $nNotifyCode, $nID, $sText
	$nNotifyCode = BitShift($iwParam, 16)
	$nID = BitAND($iwParam, 0xFFFF)
	Switch $hWnd
		Case $hGui
			Switch $nID
				Case $Summa
					Switch $nNotifyCode
						Case $EN_CHANGE
							If GUICtrlRead($Label1) = 'Сдача' Or GUICtrlRead($Label1) = 'За смену' Then GUICtrlSetData($Label1, 'Сумма')
							$sText = StringRegExp(GUICtrlRead($Summa), '(\d+(\.(\d{1,2})?)?)', 2)
							If @error Then
								GUICtrlSetData($Summa, '00.00')
							Else
								GUICtrlSetData($Summa, $sText[0])
							EndIf
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Благодарю. А можно ли сделать, чтобы когда у лога появляется полоса прокрутки, то чтобы то, что печатается в логе в данный момент, было не в скрытой части окна, а отображалось на экране?
 

ra4o

Скриптер
Сообщения
978
Репутация
180
lemonia сказал(а):
Благодарю. А можно ли сделать, чтобы когда у лога появляется полоса прокрутки, то чтобы то, что печатается в логе в данный момент, было не в скрытой части окна, а отображалось на экране?
Можно, исправил в предыдущем сообщении. Я этот скрипт набросал на скорую руку и , как я вижу в нём косяков масса, желательно потестируйте, набросайте все хотелки , что бы исправить единожды. Например есть возможность каких либо действий (проверка суммы за день, закрыть смену) при открытом "чеке" продаж, нет возврата товара, отказа от покуупки , возможно нужно сделать сохранение текущих данных при закрытии скрипта, что бы при повторном запуске всё начиналось не с начала , а с теми данными, что были на момент закрытия итп
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Благодарю. Те пункты, которые Вы указали, хорошо бы, чтобы появились в программе. Другие полезные возможности мне не приходят на ум.
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Ещё, если посадить на горячую клавишу знак умножения (какую то из F), то можно быстрее оформлять сразу по несколько позиций товара.
 

ra4o

Скриптер
Сообщения
978
Репутация
180
посадить на горячую клавишу знак умножения
Опишите алгоритм действий при умножении , например для горячей клавиши F3 , например:
Цена товара F2 Количество F3
или
Количество F3 цена F2 ??? как рациональнее на ваш взгляд будет ?
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Цена товара>F3>Количество>F2
В логе или на табло чтобы синхронно отображалось, чтобы было видно перед нажатием на F2, какой результат перемножения.
Умножение лучше сделать не на F3, а на F5, чтобы случайно не нажать, когда нажимается какая нибудь зарезервированная клавиша F рядом. В логе чтобы была и цена единицы товара и на сколько умножено и сколько получилось.
 
Автор
L

lemonia

Чайник
Сообщения
114
Репутация
0
Пожалуйста дополните лог полезной функцией. Чтобы в строке разделения продаж по клиентам был порядковый номер, например
7-------------------------

Это даст возможность более удобно тренироваться на скорость. То есть можно будет засечь время, за сколько будет обслужено, например 10 клиентов.
 
Верх