Simonstyle's TODO:
  1. HP allinone电脑制作的安装程序不能启动,目前只有dell能制作安装了,怀疑是打包进安装zip的jdk不对?
  2. BarFrame顶部的bill #总是显示1有点傻,应该让它显示“bill number-分单number”
  3. 现在最最重要的是抓紧一切时间,确保跟海底捞还有个多伦多软件的整合。
    1. printBill方法的问题
      1. 返回值是null
    2. 其他的
    3. 所有的饭店和饺子单都作为双税处理,所以没有必要记住那些菜名和菜价了吧。
    4. 如果通过税务局测excel测试
    5. 其他的功能的自测
    6. 手册编纂
  4. close batch之后的单子不可以再return。
  5. 那个末尾的F到底是怎么回事?是mev规格还是我自己加上去的,mev的ref用的是什么格式,会带F吗?
  6. discountDlg,changeDlg还有dicItem对话盒上的规则按钮有时(初始时)没有显示。
  7. makesure menu eixts没有起作用。
  8. depanure的1.0版本。
  9. 现在有更多的PAYMENT OPTION:  CASH, DEBIT, CREDIT, GIFT CARD, UBER, SKIP, DOORDASH, FANTUAN. 在点菜和付款的主界面, 能否加多一个PAYMENT 的BUTTON, 点了这个BUTTON, 可以有这些PAYMENT的选择?·(最后只添加了一个platform支付方法,点击后立即支付,追查时可以根据桌子的名字知道是哪种平台)
  10. invoice编号的开头字符要从服务器下载,每激活一次加一。
  11. 能不能所有的支付都可以支持定制(有个饭店想要把Uber,skip放在首页菜单上,couter模式)
  12. 添加删除菜的功能:
    1. refund一个bill时,弹出带所选bill上所有菜的对话盒,默认所有菜都不选中,用户可以选择需要refund的某些菜,也可以点击全选按钮,然后确定进行退单。
    2. sails 界面上选中菜后,点refund,不再显示错误警告,而是显示选择对话框,问要用bill based方式还是item based方式refund?
  13. 用word写一个带图片或者视频的用户手册类文档,用来让拿到程序的人知道如何安装、设置和使用。
  14. 写一个简单的ReadMe文章,用来让维护程序的人知道如何设置环境、开发、测试、打包。
  15. 客户屏幕上应该增加logo
  16. 桌号只留井号
  17. 启动时的屏幕闪动
  18. 单据的导入导出
  19. 默认安装路径
  20. server project的没有界面的程序的图标问题.what does it mean?
  21. 严重问题:怀疑当有coupon存在时,当执行某种行为(或许是查询?因为我在dbeaver里执行sql时也遇到过)时会遇到系统发疯,效果包括提示连接断掉,重新连接并刷新发现hardware表中有无数条同样id的记录,有时突然发现记录消失了,有时好像又重新出现了,目前我是通过删除硬盘上所有数据库文件的办法临时掩盖住了问题,不知什么情况下回重新触发。
  22. If there are 3 bills, all printed bills, then combined all of them into one bill(or we move the item between the bills, then print again, what will happen in the mev machine?
    1. all the invoice need a ref part. to indicate a bill, and it self, will use the same number with "F" at the end.(not all need ref, only on there's doc, otherwise how can we set a ref? and when bill printed, we set ref to it self. this will be used by the invoice doc which will be same number just added a "F" at the end)
    2. when move items/combine all/un combin all/ need to check if the affected bill are printed, if printed, then need to dump it and generate a new bill copy every thing in the old bill. the new created bill is original status.
  23. if a bill printed check already, then did a void operation, what shall we do? we should print a invoice with 0 as sub total or reprint  a check with 0 as subtotal? (print a final invoice with subtotal 0)
  24. if a bill printed invoice already, then we need to refund to the customer all the money of part of the money. what shall we do? print an other invoice with reprint and negative money as sub total? (yes, but not reprint, just a ref and a negative moneys.)
  25. If a bill or many bills are already printed(bills), then we print the invoice,the msg will calculate two times of money? ,both have displayed same bill number. -----(no problem if the invoice not printed, gov will use the check to calculate the tax.
  26. combine all时,不要动output的billId属性,好用来做undo用。
  27. 下载新订单时,如果遇到新菜自动加入到Pos功能缺陷:没有设上打印机属性。
    1. 下载新订单时,如果新菜的属性有变化,应该自动更新到pos系统。
    2. 在pos上更新菜的属性后,判断如果有hostserver属性的话,要在确定时更新到server。或者至少提醒用户“应该在server上修改“。--------目前先要求有用server的话,尽量或尽快在server上改。万一哪天本地电脑或系统坏了,菜单不会丢。
    3. 下载时只下载MainOrder,如果有新的item,再发请求,下载相关的内容(可能是全套内容)-----暂时没有实现,以后访问量大了再看
  28. add a settings: allow waiter to give discount and change price.
  29. 翻页按钮在菜单满了时,没能正确显示(第二个category显示时,不应该显示翻页,结果却显示了。可能是应该setfalse却没有set的缘故。)
  30. 菜单下载后应该及时发消息给服务器,表示这个order正在打印,把其状态改成n(10),待打印成功后改成M(50),这样避免出现20秒后再次下载订单
  31. 如果打印失败,需要发送消息给服务器,把订单状态从n改为0吗?好像不用,因为没有打印成功则不会从map中删除菜,待打印机修复后还会继续打印的。(测试事先关打印机,pos报错,然后就不再报错了,待开机后老单子+新单子自动打印出来了)
  32. 增加分屏显示功能。
  33. 应该在打印bill之前就保存bill,得到ID。
  34. 如果付钱时选卡,然后exact,然后会被认为是现金支付
  35. 用卡支付时,tip数值有错。
  36. 一个打印机坏了,不应该影响其他打印机的打印。(加了finally for socket print case)
  37. 新建的桌子,bill显示为0,生成第一个单后,billid为2.(应该是1)(因为忘了加时间条件,导致搜索结果发现已经有该桌的bill存在)
  38. on site admin需要有个图形界面,用来操纵各个机器的状态。
  39. 解决安装后,pos不能自动运行的问题。(通过izpack 的short cut Panel解决了,但是开机启动容易启动失败,导致双击图标启动不了,所以又取消了自动启动。)
  40. 制作安装程序
    1. 修改配置文件(原来是GB2312编码,现在需要改成UTF-8编码才能装载如hash并运行。)
      1. 但是目前启动成功后,最后写入PIMConfig时,没有采用UTF-8,而是用了默认编码。
    2. 改成maven项目(为了能够整合进入security的框架,便于将来的升级维护)
    3. 修改bat文件,使能够包括lib并运行(或者不用修改bat也未必)
    4. 修改config文件位置,使能够顺利启动
    5. 发现用console mode,simonStyle可以被启动,但是用startService,却没有启动。
      1. 在Wee的家里的电脑,没有成功启动,在店里的电脑,却成功启动了。
    6. 研究如何能在桌面添加快捷方式,以及/(或者)如何开机启动.
  41. 能在销售那边安装运行
    1. 估计要发送一个link给销售。
    2. 销售下载测试
  42. 商量修改数量
  43. 确定修改方案
  44. 修改。
SanjiPos Tasks left:
  1. ------------sale page-----------
  2. send message to kitchen when remove a save dish, - a saved dish and void order.
  3. print bill funciton in sales page and print all in bill page.
  4. add pay related function.
  5. what is disc?
  6. function in more
  7. -------------bill page------------------
  8. add empty bill in bill page.
  9. add pageleft and pageright button
  10. improve layout function to allow customization of row number and column number.
  11. support Mix layout.(第二步再说,因为混合布局对于翻页太麻烦了)
  12. -------------table page------------------
  13. change mode funcion
  14. add table function
  15. order management
  16. server report
  17. report
  18. reservation
  19. sign out
  20. -------------setting page----------------
  21. bill page layout
  22. single user/multi user
  23. user authentication
  24. print format setting
    1. 居中布局的打印
    2. 如何添加店家信息,应该允许修改信息。
-- Sam 12:17 21/04/2024

 政府认证:
  1. 001.001 程序启动时,自动注册,设根据对于什么的检查知道要自动注册的?----base on the
  2. 001.002 失败,说是La valeur reçue ne correspond pas à la valeur attendue : IDAPPRL=4873-5649-6493.","codRetour":"93"
    1. 感觉就是说这个IDAppRL值不是它预期的呗。
    2. 可是如果是在开发环境,好像就没有问题,确认下,
      1. 说明开发环境下预期的IDAppRl就上次证书申请时获得的?我是从来不输入一直appRL的。
      2. 而且昨晚是通过了一次的。就是说昨晚用的IDAppRl是对的?
        1. 为什么IDAppRL会变?难道是昨晚因为重启动了程序,所以再取IDapprl时,取得是新值,那么以前的是就的值?旧的值是啥?0000-0000-0000?还是之前留下的?
        2. 难道昨晚因为有一个进程没有关,导致了所用的值的变化?
-- Sam 16:01 25/04/2024
 web-srm
  1. 店主要能够把数据导出来,导出来的数据必须是xls格式/json/xml或者pdf格式,不能是没有常用软件能打开的格式。
  2. 店主要能在导出数据后选择清空srs中的数据。
  3. 不能允许删除没有结单的单子,不能允许删除发送到web-srm失败的单子。
  4. 发送到web-srm for "certificates"时必须只能管用店主的账号,员工的账号不能用
  5. 登录时要openSession,登出或者程序关闭要close session(这个跟web srm的连接看来是“长连接”)
  6. -----------------------------------------
  7. 现在是强迫所有饭店都联网了,那是不是说没有必要推出桌面版程序了呢?
    1. 桌面版程序界面还是更灵活些吧
    2. 最好还是提供三个版本吧,桌面,网页还有ipad, pad有没有必要呢?感觉还是网页版最最靠谱。
    3. 可是目前来说,因为饭店要求0卡顿,要求链接IP非云打印机的话,还是必须要桌面版程序
    4. 将来5G普及的话,可以用云pos+云打印机替代桌面Pos。云Pos部署容易一些,但是这个网页响应速度目前太慢,如果javascript本地运算的话,同步又会是个问题。
    5. 总之,目前还是Aikapos,下一个版本会是Taostyle
----TODO:-----------------------------------------
  1. 什么情况,一个修改了price的bill,点debit +exact 支付,发现报PRINTER Error? 没有能重现啊?是不是要多停一会儿?

-- Sam 22:53 16/04/2024
难道是因为:
  1. tablebutton数据库记录上只能记一个时间,那么假设这个时间是open time,那么点这个table时,就会把这个时间带到主界面上。
  2. 而在countermode下,当用户点一个table时,我们不想要显示opentime在界面上,(因为openTime已经没有意义了,这时的table其实是在当bill用了)。我们想要把create time放上去。
    1. 这样用户加菜时保存时,会用这个时间当做output的时间。
    2. 而这个时间会变得话,会导致output的时间会不一样。所以这种做法是有问题的。
  3. 正确做法是仍然显示openTime,但是countermode下不可见。
  4. createtime属性只用于显示等待时间,和记录付款时间。不被其他记录引用。
-- Sam 23:43 18/02/2023
 问题出现了,因为pay的时候没有更新createTime,而这个时间是用来在报告时搜索记录的。
所以,如果很早就产生了bill,很晚才pay.....
解决:
  1. 这个create时间,不能停留在保存的时间,保存的时间可以用来计算显示的分钟数,这个很好,但是一旦支付了,就是结单翻台了,就不再需要等待分钟数了,那这个create时间可以开始作为别的用途了。
  2. 为啥再send时要保存一波create time?而不是再print bill时更新createTime?-------因为send时有生成output的动作,我们需要确保bill的createtime和output始终保持一致,用来找到output
    1. 为啥不让ouput和opentime保持一致?----------因为在有些时候,比如check list对话盒中,目前只有一个时间列,用来显示Opentime和create time中的一个,
    2. 这个时间在记录被选中时,要跑到BarFrame的healder的最右上角去,然后BillPane会根据这个时间去找相应的output 显示到SalesPanel的list中去。
    3. .。。。。。。。。。。。。no 应该不是这个原因
    4. 那table button中只有一个时间属性,这个属性记录了create time就不能放opentime了。
    5. 所以在countermode时,table button记录了created time
    6. 所以点这个桌时,BarFrame就显示了Create time。
    7. 所以output产生时,就拿到的是createTime(这个其实没有关系)因为这个carete time是上次保存的时间,后来再增加的output的time会在下一次保存时更新,同时之前的菜的time也都会更新到新保存的时间。。。。。。。。。
    8. 如果原理时这样的话,那么下一次要做的就是把output的时间改成opentime,不要跟Create time
    9. create time仅仅用来显示等待分钟数,还有结单的时间。
    10. create time其实时last modified time。
  3. 别的用途就包括报告统计的用途!create时间应该在结单时再更新一次,(同时更新所有的output的时间,否则重新打开bill是,找不到相关的output了,因为counter模式下,output和bill是靠create相关的。
  4. 目前临时在结单时再更新下create time吧。
  5. --------------------------------------------------
  6. wait, 我们目前怎么知道output要跟随那张bill?-------这个显然是靠桌号,openTime,还有billIndexId了 output里面没有存bill号,不知道是为什么, 难道装在一张单到salesPane的panelList中时,只比较一个billId不香吗?至少要比目前这种比较桌号,比较openTime,比较billIndex号三个字段要快吧?-----------------是不是当时可能还没有bill id?比如快速的split 合并,再split,再合并,这时侯会产生很多的bill id,然后造成billId不连续。
---------------------------------------------
试试这样理解,因为opentime这个时间有时候会不准确,比如counter模式下,桌子早早的就open了.....而且这个时间只有一个....所以如果需要记录一些其他的时间的话,我们就需要一个另外的时间字段,也就是create time字段。
举个栗子:
  1. 桌子上显示的分钟数....
  2. 结账时间?用来决定这个单子显示在那个report中。



  1. 那为什么生成out|put时用的是create time而不是openTime呢? openTime比较麻烦获得?
  2. 不管了,第一步先解决pay时更新的问题,总是没有错,等下一步再解决让output跟opentime关联的问题,或者可能的话,能找到当初为什么不跟opentime关联的理由。
-- Sam 00:06 14/02/2023
 from checkBillDialog, when click record, not display in sales pane.
  1. it's because the opentime was used to fetch output
  2. and the open time doesn't match the time on output
  3. open time come from the display on Barframe
  4. it normally come from the start time of table button.(which is create time of bill?) and output should sync with the create time when table mode, and open time in table mode.
  5. while.........for open from an checkbillDialog, what is the open time come from?
and becareful that if there's split bills, each bill might have different create time or open time? not sure. anyway, the output time field should be sync with his bill's create time or open time.....
-- Sam 10:55 11/02/2023
 counter mode, table is used to indicate bill number
for following use case, we need to display the waiting time on bill:
  1. input into pos first, when deliver or customer come to pick up, print bill.
  2. mix mode, there's some one is sitting there didn't pay yet, owner need to display their bill on side bar to know how long they've been there.
problem now:
  1. have added logic that when printed bill, will update the created time of bill. 
  2. and for counter mode, we will use created time to calculate the minutes on table.
  3. but
  4. bill become 0 min 0$ after change
    1. how come this? when I just clicked save/send button, it displayed still correct
    2. I noticed that when clicked save, I modified the startTime in the table button's property, while in database, the Dinner table record, there's a time (I am not sure it's what............guess it must be open time.(because there's only one time....so it's correct that that time is not changed.
    3. while why when I click the button, it display 0min/0$?----------what happend at that time?
-- Sam 23:14 10/02/2023
 几个问题:
  1. 不使用service的原因--------我们的打印机必须要驱动一下才能开始打单工作,所以一定要登录,(登录后发出个空的报告打印命令,用来好像是把打印机唤醒)之后通过接口收到的打印命令,或本地的打单命令才能工作,不知什么道理。
  2. 目前仍然只有以service模式运行才能连接调试,(可以从别的电脑远程调试,也可以从本地电脑远程连接调试)
  3. 远程调试同时只能有一个连接,不能两台电脑同时远程调试一个service
  4. 目前本地调试mule server,可以运行,感觉也是再369端口运行,但是aikapos resource中断点不停。
  5. 目前点图标运行程序仍然不能远程连接调试。
  6. 如果3、4能解决就提高好多效率了。
-- Sam 23:02 31/01/2023
关于mev所连的串口打印机不能打印法语字符的问题
  1. 我觉得这是不合理的,因为打印机明显是可以打印法语的(底部的mev加的部分法语字符显示正常的)
  2. 底部条码不是用图形模式打印的,因为有些情况下,如果打印机编码方式改变后,底部的法语字符显示就错了。如果是用的图像模式,不应该受打印机编码设置的影响。
  3. 那么mev能让printer打印法语的话,一定是因为打印机支持西欧字符集,而且mev加入字符串时,用的也是相同的编码。
  4. 最后看到哪里写了个857 437...就瞎试用857作为code名字,居然work了。所以目前只能理解成mev用了这个神奇的857对文字编码,而这个神奇的打印机用的也是857来解码????-------------虽然不理解,但是work。感谢上帝的帮助。
-- Sam 01:35 16/01/2023
 那现在的问题就是要从根本上把这个日期给重视起来,
  1. 每个账单为了被引用的账单区别开来,必须拥有不同的日期。不能沿用开台的日期
  2. 引用多个账单时,除了要有每个被引用账单的编号,金额,还要分别有记录被引用账单的日期。
  3. 各个账单的日期,如果不存在,就从BarFrame上找,比如在分单时,每个单子上没有日期的,所有的单子都是相同的日期,这时
    1. 如果有移动菜项操作,那么两给bill是不是都需要update?
      1. 是的,两个bill的subTotal都要update。
      2. 如果打印过的单子,update后的日期必须更新到当前日期
      3. 没有打印过的单子,update后的日期保持不变
    2. 如果有并单操作,新单子沿用其中一个单子的单号,另外一个单子void掉,这是新单子的日子就必须时新的了。那如果还有其他没有被合并的单子的话,那么这个桌子的所有的单子就不是在同一个日期了。
      1. 这样的话就不能把日期显示在顶部了,而是必须显示在每个billPanel上了。
    3. 结论就是可定会有一个桌子的不同单子的日期不同的情况的,因为同时都打印,然后有其中两个单子错了,需要调整一下菜,并且重打的可能性时存在的。
  4. BillPanel下,让BarFrame上的日期永远时开台的日期好了。如果打开某个Bill了,日期则显示这个bill的日期。
  5. 为什么打印完了bill要加一个refer to到它自己呢?
    1. 用来表示它打印过了?不是有status吗?
    2. 估计时用来给再次打印bill时用的?因为是打印完了才加#ref to的,所以重打印bill时,会根据这里的信息加上ref part,就能生成revise?
    3. 为什么只用了个@refTo,没有用date和money呢?
-- Sam 23:24 27/12/2022
 目前关于mev内容生成的流程图
  1. 在生成mev内容之前,主题内容已经生成好了,mev需要首先在主体内容之前加一段简单陈述,用来说明这个单子时算不算数的(是不是要入库的,是不是要打印出来?是不是内部培训用的?是不内部管理用的?
    首段模板<reqMEV><trans noVersionTrans="v0%s.00" etatDoc="%s" modeTrans="%s" duplicata="%s"><doc><texte><![CDATA[
    1. etatDoc---------是 A (absent);        I(Present and Print);      or N(Present but not to be printed),默认时I,如果设置了“省纸“标志,而且已经打印过了一张单子的original,那么就是N。。。。。永远不会是A。
      1. isOriginalInvoiceAndBillPrinted---------这个怎么判断的?ref必须有,因为bill已经打出了(根据注释所说,当bill被打印时,bill记录的comment里面就会加入“ref”,用来表示这个bill已经被打印了,如果再打印的话,记得加ref哦)。comment里面的ref会进入sndMsg的最后一个元素,换句话说,bill被打了,那就BillPrinted成立了,至于是不是Original,要根据numeroRefAry的最后一个元素必须跟当前sndMsg的第0个元素相同,就是Original了。

    2. modeTrans----是在loginDlg上控制的一个标志。用来表示当前是不是在搞内部training (F)或者正式使用 (O)....如果是用内部账号登陆了的话,就是training,正常都是O。另外 setting界面也有专门的标志可以在非内部员工登录以后,强制设置成training mode。
    3. duplicate----------表示是不是重复打印(也就是供餐馆内部记账)的单据。默认为N,表示不是内部使用的的单据,是给客人用的。只有当末尾不带ref,而且endmsg里面的最后一行专门包含了”*internal use reprint*\n“时,才会被设成O。
    4. needReference------声明时用sndMsg的第四个元素值来判断,只要时以RFER结尾就表示时receipt/void/refund的一种,就给设成true,后来的语句又给覆盖了,改成了完全根据sndMsg最后一个元素是否以 "#ref to:"开头来作为是否组要ref的唯一依据,也就是说之前的根据类别是否以RFER结尾,完全就不管用了。-------------我觉得吧:
      1. 首先以RFER结尾的判断肯定时不对了,因为不光只有receipt/void/refund需要ref,revise的bill因该也需要ref。
      2. 如果是receipt/void/refund或者是revise的bill,但是末尾忘记写"#ref to:"了怎么办?就不要ref了吗?
      3. 所以,目前我改成了追加式判断,就是说继承三大类型的判断,然后追加检查,只要末尾显示的写了“#ref",那不管类型是啥,都需要ref。这样revise bill有可能就被包含进来了。

  2. 之后加的第二段的内容就是主体内容了,包括Header,dishes,total,comments..........

  3. 之后加的第三段的内容才是精华所在:
    1. 在第一轮代码中,除了初始化了第一段代码需要用到的三个值,etatDoc、modeTrans、duplicata,还初始化了一些第三段会需要用到的变量
      1. reimpression--默认是N,只有当最后一行包含*reprinted*\n时才会被设成O,意思应该时重新给客人再打印一个receipt。
      2. isRefund-----默认是N,只有当需要ref,而且经过检查,发现类别是refund时,才设成O
      3. isVoided------同样逻辑
      4. oldMondyAry-----这个是干嘛的?是前一个单子的各种价钱?
      5. paymentTrans="SOB"---------记录是哪种支付方式,信用卡,现金.....
      6. transType是个从参数传进来的变量,可是不知道为什么,感觉传入时,它是有多种形态的,因为判断时,用的是transType.endsWith("RFER")...可是如果needRef成立(不管是因为transType以“RFER”结尾了,还是因为sndMsg的最后一个元素是以#ref to开头了),目前的代码都是吧transType设成了RFER,这个到底是为啥?目前结果是对的吗?
        1. 而且无论是Refund情况还是Void情况,还都是先把transType设成RFER,然后才设置相应的标记(该isVoid or is Refund。。。),看起来不是无意的错误...
        2. 另一个要注意的是,当isRefund时,立马检查了第三个元素是否还有“mehtod”字符串,含有的话,解析出refund value,还有paymnet Trans(不知道是支付方式,还是支付金额)
        3. 而当isVoid时,立马把numeroTrans给揪了出来。
      7. 还有个隐藏很深的逻辑呢------如果判定需要ref的话,首先做的事情其实是给numeroRefAry赋值。(说是一些old money,不知道具体是些啥),然后呢,如果是需要ref,又不是refund,也不是void(那不就只可能是普通receipt了吗?还可能是打印过了的bill吗?),这时,再检验,如果oldMoneysAry还没有被赋过值了,而且numeroRefAry的最后一位元素是以当前billId结尾(当前billId就是sndMsg的第0位元素(不含前缀的纯id),这时,把isOriginalInvoiceAndBillPrinted标志给打上去。
    2. 第一轮代码中,还在不需要ref的情况下,还讨论了reprinted 和 reprinted Internal use的情况
      1. 设置了reimpression标志或者duplicate标志为O
      2. 像需要ref时的isvoid case 那样,给numeroTrans赋值。
    3. 第三轮代码开始后,又集中设置了一批变量:
      1. comptoir----couner模式还是table模式
      2. autreCompte----------是不是group event(G),package deal(F), 如果没有其他的系统记录这笔交易,那么就设S
      3. table Trans
      4. ServeurTrans
      5. DateTrans
      6. DateRef---------------这个变量目前没有用。
      7. mtTransAvTaxes
      8. mtRefAvTaxes
      9. TPSTrans
      10. TVQTrans
      11. mtTransApTaxes --------------后面这三个感觉就是税务局要的钱了。
    4. 那么来,开始愉快的赋值吧。
  4. 第四段内容,是本轮工作的重中之重了吧,关于ref的设置问题
    1. 看看我们的numeroRefAry中有多少个元素,便利走起
    2. numberoRefAry中有多少个元素,那么oldMoneyAry中也应该有多少个元素,哦,看来每个被引用到的bill都对应于一套old价格
    3. 取出oldmoney中的mtRefAvTaxes
    4. 取出numeroRef的元素内容
    5. 构建一条MEV_REF加到printContent上去。
-- Sam 02:00 26/12/2022
 invioceID的设计
  1. 问题是每次删除了数据库,invoiceid就要从00001开始了,这个会导致跟以往的invoice id的重复。时间长了,难保会出现宕机,删库重启的情况,不能跟mev报告两次,而里面的invoice号码是相同的吧。
  2. 所以我的最初设计是每次不从001开始,而是从一个日期开始。比如上次reset的日期。所以invoice是2201220001
    1. 如果上次reset日期不存在,也就是删库了,那么新的invoice就会是从当日开始。这样就不太可能重复
    2. 日期如果是年月日的话,还是可能重复,也就是在一天之内两次删库的话,还是会重复,比如两次2212120001
      1. 还有种可能2212110001开始,一直不坏,每天买超过1000份的话,会在12号道道221212001,那么12号如果删库就会出现mev收到两张221212001了。
      2. 如果改成日期倒装111222001,能解决上面的问题,但是如果一天之内两次删库的话,还是会出现重票。
  3. 所以用日期开始不靠谱,那用啥开始,能保证随着数字增长,不重复呢?
    1. 不收删库影响的,每次不一样的内容------好像也只有时间了。
    2. 或者把编号写入注册表,或者两外一个文件,开机读入,这样不怕删库。
  4. 结论,那就每次删库时不要删配置文件不就完了,invoiceid已经配置文件里面了,不会丢的。(要告诉wei永远不要删库,always备份,这样还能把配置文件拷贝过去)
-- Sam 23:03 24/12/2022
About automatic batch generating
We want to generate a batch automatically at the end of day if we find their are some bill after the closed batch.....in another word, the waiter supposed to close the batch at the end of the day, but they could forgot to do that, or we can do it for waiter automatically.
Why we have to generate a batch everyday by the end of the day? it will solve what problem?---------normally, the second mornining, it will be another waiter who continue the work, when he leave at noon, we don't want his batch contains the bill records whoever has left in last night. 
Questions
  1. Some restaurant allow multi waiter share same code, so can not use the existing funciton that login with different usercode to see only this waiter's transaction. the only clud can depends on is the batch no.
  2. 为啥要close batch?为了记得每笔交易都是谁做的,也是够奇葩的,为啥不让employee使用各自的密码,非要共享密码,那还好密码干啥用呢?

Other:
  1.  ofcause, the system can be customized to close the aotomatica batch generating function.
  2. when boss check a report of a day, he want to see how many batches are included in this day. so we need to generate a relationship between day and batchnumber. so, maybe the batch can be something like #000120220921 or #202209210001
  3. the end of day can be customized
  4. the employee can not close batch, but they can check their own tranctions by setting the time. only manager can see everyone's transaction, so only manager can close batch.-------------but shouldn't we allow employee to close his own batch?
总结:
  1. 我理解第一,batch的意思是一段时间内所有的销售记录,原则是,batch中的现金总额必须始终和钱箱中的现金总额保持一致,batch中的各种刷卡记录必须跟对应时间内实际的刷卡记录匹配....第二,.在现实情景中,饭店经常是一天有两班甚至更多,所以就要求每个人到班交接时,要打印一个batch,同时跟下一个班的人当面点清钱箱里的现金并校对刷卡机记录
  2. 所以有一个问题,就是会发生员工在晚上交班时会清点所有现金和刷卡记录,同时打印batch。但是之后会发生紧急交易的情况,这种交易之后往往是收了钱往钱箱里一丢就走的,来不及打印batch的...作为后果,这个紧急交易的记录和钱会体现到第二天第一个当班的人的batch里面。
  3. 这一两笔交易体现在下一个人的batch里面会导致两个不好的现象:第一,如果交易有错,比如少收了钱,追究责任时不方便。第二,如果当晚员工走后,老板到店里拿走了钱箱里的钱,那第二天上班的人会发现钱和帐对不上(昨天最后的没有进batch的交易的钱已经被老板拿走了)
-- Sam 22:11 28/09/2022
 关于invoice是否要打印的问题
  1. 如果说做一个最最小的功能集合的话,就只打印bill就可以了。打印receipt的话比较麻烦,还要多个付款字段,和referTo字段。
  2. 另外还有几个是必须打印的单子,包括refund和void,以及reprint。
  3. 我得要看下打印receipt时都发生了什么事情,referTo是如何处理的,payment Info
  4. now my question is tha
    1. t when I print a receipt, which field is for the bill ref? 
    2. what condition can result in multi ref?
    3. what is the "#" come from?
    4. when where the bill have multi refs?
  5. What I already knows:
    1. in the first line of mev document contains a field called <etatDoc>, if it's "I" means print out, if it's "N", means save paper.
    2. the second part contains a field call numeroTrans which is hte id of the transaction.
    3. the thrid part is like "<ref numeroRef=\"%s\" dateRef=\"%s\" mtRefAvTaxes=\"%s\"/>";//»AAAAMMJJhhmmss»//»+/-999999.99» there's a numeroRef indicating that which one this bill is referring to.

-- Sam 22:06 18/09/2022
 有个关于域名解析的奇怪的问题:
  1. 从家里一台电脑(dell)不能通过httpClient,用www.sharethegoodones.com连接到hp上的Taostyle,只能用ip才能连接。
  2. 然而postman和浏览器却能通过www.sharehtegoodones.com连接。
  3. 还有一个现象,同样改成使用ip了,用httpClient类的prepareConnection方法准备的connection不能建立连接,而用DataSyncService类的prepareConnection方法准备的连接却能连接到成功。
  4. 目前代码没有动,仅仅是是吧www.sharethegoodones.com改成了用A2Hosting的IP,代码就临时都好了。
  5. 目前要先解决的问题是,(可能是因为之前的代码改动没有提交?因为HP上显示本地的改动没有提交,不过我记得我是在dell上改动的呀....)构建mev内容的代码有误,需要重新调。(目前是app直接打印成功,但是通过插件方式打印出错。)
-- Sam 14:05 03/08/2022
 JDK的版本问题
目前必须使用c:\dropbox\jdk-64作为eclipse中的jdk,否则在对得到的信息进行加密时,会出现异常:
Caused by: java.lang.SecurityException: Can't read cryptographic policy directory: unlimited
    at java.base/javax.crypto.JceSecurity.setupJurisdictionPolicies(JceSecurity.java:326)
    at java.base/javax.crypto.JceSecurity$1.run(JceSecurity.java:111)
    at java.base/javax.crypto.JceSecurity$1.run(JceSecurity.java:108)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
-- Sam 17:12 29/07/2022
 postMan发送的请求SanniPos的api接不到了,有哪些可能原因?
  1. url写错了*不知道为啥,我吧SanjiPos写成了security.
  2. 啥也没有干,换了一个wifi网络而已,就接不上号了,重启动机器就好了。(重启动前,先关掉了IPv6,不知道这个影响不?----应该不影响的,重启后正常了,然后我吧IPv6重新开启,仍然正常)
    1. 多半是有影响的,因为回家后又不能连接了,我重启动了机器,仍然不能连接。
    2. 我去掉了IPv6选项(选中Network Connections-> wifi中的Virgin603点属性wifi Properties 对话盒)仍然不能连接。
    3. 再次重启机器,连接成功,断点处停下来了。(感谢上帝)
    4. 应该是找到真正原因了,是系统启动时,服务自动启动,因为太早,ip还是127.0.0.1 (这个在启动log中可以看到),导致后面的连接失败。目前加了延时30秒,ip被正确解析了,log中显示192.168.2.27,连接也正常了。但是安装时会特别慢,于是又增加了个判断:如果windows/system32/...config/.../.sotrm07111/qiji.data没有存在,则认为是安装过程中的启动,不等30秒。
  3. 另外遇到了一个remoteDebug连接失败的情况
    1. 原因是在Eclipse远程调试设置界面写了主机名,而主机名可能被解析为ipv6了,改为直接写ipv4的地址,连接成功。
  4. 还遇到了远程操作Mysql被拒绝的情况
    1. 安装时明明设置了允许remote使用root访问了
    2. 后来停掉了双屏一体机的防火墙后,可以连接了。
----------------------------------------------------------------------
TODO
  1. 不同情况下,应该返回200/400/500状态码,不能一律返回200. 
    1. (目前是一律返回200,里面的状态码返回400或者500)
    2. 还有必要返回500给第三方的,因为需要他们再发一次事件,否则发票打印不出来要骂我们了。
  2. 200状态码的内容应该带有计算出来的总价,便于调用方核实是否和其系统中的一致。
  3. 需要支持每个菜的是否免税和半税的定制。(饭店全都是双税,depannuer可能会需要)
-- Sam 01:41 22/07/2022
 运气背时,会遇到突然编译不通过了的现象!
  1. 这周二,6月21号。我被Mindgeek layOff了,当时公司电脑就自动被reset了,里面毛都没剩。
  2. 当晚我编译家里两台机器上的项目时,发现Acer上代码都不见了,需要从新从bigbucket下载。HP上的编译不通过
  3. 报错内容是一些jar无法从远程库中成功下载,包括kenai, natukie(那个service wrapper)然后呢我是各种从备份中拷贝都不管用
  4. 今晚网上搜到说只要吧本地.m2下相应的下载好的库的目录下的 _remote.repositories文件删掉即可.----------一试果然管用。真奇怪那么多年了那个文件一直都在的,砸就赶我运气不好的时候开始作妖了呢?
  5. 目前acer机器上的security项目能编译了,尽管需要注释掉那个set java_home 到etc下得jkd_64的命令,不知道咋滴了那个jdk64也不管用了。------------非常怀疑那个jdk必须用本机安装的jdk才行,否则移植到或者别的机器通过git下载下来后就会水土不服。
-- Sam 01:34 24/06/2022
 安装后ConfigPath没有被替换,导致服务启动失败问题
  1. 首先,公司电脑上的现有已安装好的额程序是可以启动成功的.(就是说选择按照以服务形式安装以后,服务是显示在任务管理器了,但是不能启动,打开log )远程调试的日志看,发现是疑问config么有贝蒂换掉导致.,或许会有其他原因,目前未知.
  2. 不知道公司电脑上的安装程序还有没有,有的话比较一下.----找不到,过期了.
  3. 从日志上看, 是在refreshing org.mule.config.spring.MuleArtifactContext之后,初始化context时,遇到了springframework.beans.factory.BeanInitializationException. (原因即是CONF_PATH没能正确解析.
  4. 现有的安装之后的文件可以相互对比一下-----对比后发现,dell机器上的serviceproperty文件里的CONF_PATH被成功替换了,HP的没有被替换
    1. 为什么呢?
      1. 谁负责替换这个变量?-----这个变量应该是在安装过程中被替换的,肯定跟安装地址的选择有关系的.安装到哪里,那个路径信息采集倒了之后,
      2. 那个server.properties文件中还有没有别的变量没有被成功替换的?---应该没有了,因为版本比较没有看到别的不同.
      3. 那个server.properties文件中海油没有别的变量呢?-----木有,那个CONF_PATH就是唯一的一个变量.
        1. 但是,同样在etc/mule/security目录下我看到service.properties文件中也有一些(3个)占位符${blah}没有被替换掉.(这个应该没有关系,因为dell机器上的也没有被替换掉)
        2. 值得注意的是有一个被替换掉了,就是security.service.server.ensemble=后面的值被换掉了.
        3. dell和hp的都换掉了.
      4. 安装过程中那一步是负责扫描和替换变量的来着?
      5. 为什么properties中的占位符号被替换掉了?(那个security.service.server.ensemble=后面在src里应该是有占位符的)------难道说.propertis文件被扫描替换,.xml文件没有被扫描替换?
      6. 另外可以看到的是etc/mule/security目录下面的所有xml文件中占位符都没有被替换掉,只有那个.properties文件中一个占位有被替换....
    2. 怎么办呢? 
      1. install.xml中增加了一行,指示解析service-properties.xml文件
        1. <pack id="SanjiPosServiceConfig" name="SanjiPosService Configurations" required="yes" preselected="yes">
        2. <description>SanjiPos Service configuration files.</description>
        3. <file src="staging/etc" targetdir="$INSTALL_PATH" override="update" />
        4. <parsable targetfile="$INSTALL_PATH/etc/mule/security/service.properties" type="javaprop" />
        5. <parsable targetfile="$INSTALL_PATH/etc/mule/security/service-properties.xml" type="javaprop" />
        6. </pack>
      2. 同时,把service-properties.xml文件中的CONF_PATH改成了INSTALL_PATH.
  5. 注意!!!!! etc目录下的statistics.wrapper.conf文件中的第40行:wrapper.java.additional.8=-agentlib:jdwp=transport=dt_socket,server=y,address=41214,suspend=n是用来决定是否接受远程调试的......既然是wrapper config文件了,想必是service运行时才会用到这个设置, 不以service形式运行就不会是接受远程调试了吧.
  6. 不知道怎么回事,重新安装了新制作的安装文件,运行,远程调试,但是感觉还是在执行老的代码, 难道没有重新编译吗?
-- Sam 01:50 19/06/2022
 这个security的项目调试注意:
  1. 将程序安装到硬盘,以service模式安装,然后以远程debug模式连接,可以调试 
  2. 不要用localhost:369, 要用机器名,如http://MTL-W-0012726:369/SanjiPos/printBill
  3. post, body 用raw格式,例如:( type 值可以为 bill/receipt/refund/void/duplicate/reprint  )
    1. {
    2. "table":"1", 
    3. "billIndex":"123", 
    4. "openTime":"2022-06-17 14:39:01",
    5. "waiter":"Maria",
    6. "dishes":"羊肚x2 $10.00, beafx3 $20.00, marshroom $5.00, beerx2 $5.00", 
    7. "comment":""
    8. "type":"bill",
    9. "referTo":""
    10. }
  4. 问题:
    1. 首先在其他机器上,用service模式安装,也能远程调试吗?
    2. 必须要启动service才行吗?不用service模式安装的话,直接启动程序的方式,能远程调试吗?
    3. 为什么用debug OTMultServer的方式不能接受到postman发来的请求呢?
    4. 其他机器nen
-- Sam 03:40 18/06/2022
上周,大概6月6号前后,海底捞的合作项目定下来了,
  1. 海底捞门店9月开业,我计划是尽早完成项目,反正早完早了,还能预防意外发生
  2. 我这边的工作计划:
    1. 这周给个文档,告诉对方程序如何修改:
      1. 插件工作原理
      2. 哪几个地方需要给插件发送命令
      3. 如何发送命令综述
      4. 具体例子
    2. 我这边抓紧实现功能
    3. Becky那边尽早拿到他们的程序版本并开始测试
  3. 所以关键是文档最关键,必须保证正确,不要对方实现了之后再说有问题之类。
  4. 他们那边的代码修改需要时间,所以我方的代码实现也有的是时间,不用急着做,而是要抓紧看文档,保证正确要紧
    1. 现在的那个例子是如何做的?
      1. SanjiPosResource类里面增加了接口,合作方可以通过localhost:369/SanjiPos/printBill路径发送Json格式的BillInfo过来
        1. /printBill
        2. /printInvoice
        3. /printVoid
        4. /printRefund
        5. 不知道是不是需要有其他的了
      2. 我方本来所有的动作都封装在cmd命令下的,所以只是在相应的cmd类中增加新的processJson方法即可。
        1. 确认下是不是真的都有cmd了
        2. 除了PayDlg以外都有的,cmd_printBill/cmd_VoidOrder/cmd_Refund. 
        3. 如果付钱完成,因为是通过payDlg操作的,payDlg直接用的是自身当做ActionListener了,从自身的actionPerformed方法中直接调用了PrintServiced的exeprintInvoice方法
        4. 既然cmd里面的处理都一样,就不需要走各个cmd了,直接在resource中构建出content(包括dishes,和各项打印需要的字段)然后调用printService方法即可。
      3. 凡是进入SanjiPosResource类的请求,首先验证BarFrame初始化了,
        1. 然后把jsonInfo,构建成content 实例,里面包括billIndex, tableId, opentime, waiter 还有 dishes,
        2. 调用PrintService的相应的方法
        3. PrintService里面的方法感觉就是根据用途的不同,编排成不同的格式,然后打印时自然会根据格式的不同来分辨是退货还是销售.....
        4. 注意目前好像税率用的是1,然后billIndex和invoiceIndex两者用了同一个id。
        5. 明天再看各个方法的实现,然后看是不是可行,需要找到那个文档....,然后写文档发过去。
      4. 第一版本,要求对方提供标准的格式的内容,以后考虑要求提供他们格式的内容,我方进行mapping,
        1. 用来防止税务局需求更改时,每次都要求合作方修改(我们要求合作方一开始就提供尽可能多的信息,这样如果税务局需求更改,我们可能已经有相关信息了)
        2. 另外可以对外隐藏我方真正需要的字段信息,更好的实现与税务局之间的保密协议。
  5. 税务局的认证需要抓紧时间通过,因为海底捞是个大公司,税务局指定会查他用的是哪家公司的软件,是否通过了认证。所以我们需要抓紧时间通过认证。
-- Sam 01:59 13/06/2022
 增加了發送郵件功能
  1. 目前只有在打印batch時,檢查如果有設置batReportEmail的話,則發送郵件。將來其他情況也可能發送郵件。
  2. 目前使用的是gmail的[email protected] 發送郵件。
    1. bigbang用[email protected]發送郵件
    2. taostyle用[email protected]發送郵件
    3. simonStyle用[email protected]發送郵件
  3. 重要!!!需要用這個賬戶登錄gmail,并設置成“允許安全性低的程序發送郵件才能發送出去,否則會報Authentication fail異常。
Gmail不让用了,换了个更稳定而且免费的
-- Sam 01:04 11/06/2022
 這幾天發現在thinkpad上不能運行SanjiPos,研究發現是數據庫不能啓動,
  1. 首先調試程序,發現數據庫程序啓動了,但建立連接得到了null,導致後面的問題。
  2. 然後就在db程序啓動后,嘗試用dbeaver去連,也連不上,報同樣錯誤,說outofmemory.
  3. 網上搜,都説去調大xmm什麽的。不靠譜。因爲我其他電腦都是可以的。所以應該跟這臺電腦有關。
  4. 新下載了hsql數據庫,用自帶的server.bat運行,發現運行不了,報錯說jvm binding occupy。
  5. 網上查了一下,説是因爲端口被占用導致這種報錯。hsql默認用9001端口,
  6. 用netstat -aon | findstr :9001一查,果然有個叫system的進程在用。查了一下netstat -aon | findstr :9002,沒有人在用。
  7. 臨時改成9002端口,程序啓動成功
  8. 在程序中增加一個設置,如果發現9001端口被占用,可以通過在配置文件中增加dbport=9002;來改變程序所使用的端口。
將來可能會在正式產品中使用嵌入式數據庫,而不是服務器模式,用來讓速度更快。
-- Sam 12:35 24/06/2020
 What is "HDFUX"?---if table name starts with one of these character, then it's a special order:
  1. H---Hi City
  2. D---Deliever
  3. F---Fan Tuan
  4. U--Uber deliever
  5. X--Small Red Car
-- Sam 09:41 21/06/2020
 疫情期間,忘的差不多了 :(
  1. 是如何實現桌面無邊界的?好像是配置文件實現的,HP All in one還是帶邊界的。
  2. 爲什麽status = 6 丟掉了?是周哥的機器沒有更新嗎?
  3. 爲什麽think pad的Simon style已啓動就内存溢出?
  4. 爲什麽會出現重複類別的問題?

-- Sam 09:20 21/06/2020
關於套餐按鈕計劃:
  1. 要有套餐類別的按鈕,點這個按鈕就會自動選中若干道菜,並可能彈出列表讓用戶多選1,比如前餐食湯還是沙拉。。。。


-- Sam 23:47 24/06/2020
当一个台子被打开,然后没有任何操作的情况下,是否应该有单号的问题
  1. 目前是有单号的,而且有显示从开台到现在有多少分钟。
    1. 这个时间是不对的,应该是从订单被保存到现在的时间。
    2. NONONO,还是应该显示从开台到现在的时间。因为waiter可以知道是不是该去服务了。、
    3. 或者最好的做法,是先显示从开台到现在的时间,然后,如果有了第二个时间,创建时间,也是保存的时间, 这时时间清0,重新计算的时间是从下单开始的时间,不再是开台开始的时间。因为这时桌子已经显示不同的颜色了。
  2. 问题是,客人不想看到记录里面一堆没有意义的记录,
  3. 那么能不能说,如果两个桌子开台了,但是木有任何记录,这时第二个桌子点了菜(发送了),它应该用第一个bill?因为如果第一个bill取消了的话,那么要么会出现一个为0的没有意义的记录,要么会出现后面的bill的号码比前面的号码数字小的情况。
    1. 这就是说,每个开台的桌子会建立一个bill,但是这个bill不是关联到这个桌子的,而是进入到一个池子中。桌子再真正点餐并保存时,才会从池子中拿到一个bill?
    2. 这里或许会有个一个问题,就是说我开台了一张桌子,我就是不想点餐,我就是想点return,而且这个桌子应该是保持开台的状态的(目前就是这样,因为这样的话,waiter才能知道哪个桌子是已经有人了。)
    3. 问题是,如果最终都没有点餐,那么怎么说?这个单子最终如果取消了,那么就会有一个total为0的单子出现了.....这种情况是很少的。
-- Sam 21:00 28/12/2019
关于Delievery的单子的用法,
  1. 基本上就是输入时自动匹配电话,如果没有匹配到,就会尝试匹配名字。
  2. 下方显示根据当前的输入所能匹配到底Customers。选中其中一个点勾号,或者双击其中的一个,表示选中这个Customer。
  3. 如果没有选中任何一个就点勾号,就会建一个新的Customer。
  4. 而如果选中其中一个,点底部的Editbutton,就表示修改这个customer的信息。

-- Sam 14:07 07/12/2019
The reason why output not related to bill:
  1. currently the output is not related to Bill Id, because the multi bill might need to connected to same abounch of outputs. so which bill id should these output keep in their records?
  2. why multibill refer to same bunch of outputs?
    1. bill will be set as expired when do a refund on a bill.
    2. is there other reasons?
  3. Bill find out their relevant bill not by bill ID, but by table open time and bill disIdx.
-- Sam 12:43 27/11/2019
 How to synchronize the menu and configuration.
  1. configuration is a must, because 
    1. I need to have the configuration on server side, so I will know what functions seller have sold to customers. so I know how much the seller should return to me.
    2. I need to be able to open the function for customer from remote. the only thing user need to do is just go to back end and click download configration.
  2. menu is also a must because
    1. when system goes wrong, user need to menually open the user folder to clean the .storm folder. (the db can not be under the installation folder because the installation might be uninstalled.
    2. when user start from clean, user don't want to creat menu from beginning. so all they need to do should be only a download menu.
  3. how to do it?
    1. how did JPdid it?
      1. JP uploaded the whole db file. but SanjiPos can not do that, because there could be too much output records, and SanjiPos need to upload the menu onto website. and modify from website.
      2. JP just replace the downloaded file into location. SanjiPos can not. SanjiPos will download from website.
        1. how did SanjiPos did the job?
          1. when system start up, check if the serverHost is set? if set, then every a few second, check the new orders, if there's new orders,  make sure related menu and category exist.
          2. NEW ADDED:when clicking upload menu, send all products onto www.shareTheGoodOnes. when clicking download menu, sending request on to  www.shareTheGoodOnes.
    2. how to back up configurations
      1. added a new customizatin in db, the key is:SanjiPosCus, value is "," seperated string with "=" inside.

-- Sam 16:07 10/11/2019
 counter模式的思考:
  1. 到底是用table好还是用bill#+default table好?
    1. 用table的好处是可以分单,万一客人一开始不要分单,突然又要分单了怎么办?
    2. 用D table外加不同的bill号的好处是,可以和table模式混用。
      1. table模式下,可以起一个桌子专门教外卖,或者专门叫Uber。
      2. 外卖的桌子的订单号要求能自动增加。
      3. Uber的订单需要有一个不连续的随机的Uber号。
    3. 所以用Dtable是有点奇怪的,因为用户完全可以定义一个或者一些临时的桌子用来作为外卖专用。
      1. 这些外卖桌子的类型是0型,即没哟座位。
      2. 这些外卖的桌号会有多个bill在上面,推荐是一个桌子一个地址,一个桌子一个单。
  2. 目前看来是用table好,因为更灵活,不但可以跟table模式混用,还可以分单,以及同时支持多种外卖。
  3. 可是是否允许桌号为空?
    1. 允许的坏处是导致订单没有开桌时间,很不方便。
    2. 允许的好处是啥?好像不知道,那就不允许了!!!可是如何做到不允许呢?
      1. 首先,Counter模式下,如果没有table时,应该显示什么界面?
        1. 还是应该显示Sales界面,否则太丑了。那么应该显示几号呢?
        2. 可能得显示空白的号吧,等有新单子来的时候,就显示新单子的号。
        3. 应该显示本机生成的最后一个没有关闭的单号,或者如果有来自客户端的没有关闭的单号,则比本机生成的最后的单号优先!如果都没有,则本机自动生成一个新的单号。
      2. 但是这种空白的号,在有任何操作的时候怎么办?
        1. 必须有个桌号,counter模式下,桌号就是bill序列号。table模式下,每个桌号里面有个bill idx号。
        2. counter模式下,addbill应该增加一个桌号,像收到new order时操作一样。
        3. 那么当最后一个桌子被关闭了(counter模式下,桌子结单时就会被删除了)时,要不要自动新建一个桌子呢?
          1. NO,because we don't know if we should wait for client app to tell the next bill idx? Yes! because the new billIdx should always generate by the centerPos application, shouldn't generated by the client application, in case there's many Posclient....
          2. then, we have to if user click the Add Bill Button? what if we know there will be no client, just a solo pos application? then the pos need to generate it's own billIdx, or table name in this case, so when one bill closed, we need to generate a new Bill automatically!
          3. So there's should never be an empty table on the interface, because when one table closed, a new table will be generated automatically.
-- Sam 09:12 28/10/2019
 TODO
  1. waiter添加的临时桌子为什么不能拖动了?
  2. 主机从机的实现
  3. 允许设置成不显示bill的简单模式, waiter可以从checkList中调出未完成的单子。(改成了,如果不接辅机,无论是pad还是pos,就不会出现bill条。因为不会新建一个table出来。只要删掉所有的table,那么bill条就不会出现,这时系统打单是没有table信息的,只有bill号)
  4. 允许实时调整按钮位置顺序,(小移删除,大移换位,上移删除,下移换行)方便布局定制。(上移和下移没有实现,因为太难培训)
  5. 客户屏幕的图片问题
  6. new environment, createa a admin user c with passwrod 333, while use 333 can not log into Setting Panel.
  7. popModification好像弹出的是mofifyPrice的对话盒。(看错了吧)
  8. 在category对话和增加四个选项,早中晚夜,如果某个补选中,则表示这个类别该阶段不显示。
  9. 要想个办法catch到任何异常,用来杜绝系统没有能够system.exit()。很可能是窗口关闭后出的异常,导致syste。exit没有运行到。
  10. 桌面的文件夹问题
  11. should try save resource file into db, so third part companies can modify it. in case we will have other languages....
  12. how to make it stay on task bar?
  13. menu还是应该跟category的id,否则修改了category的名字的话,就麻烦了。
  14. uploading menu and configurations.
  15. 提示已付金额。
  16. website for it.
  17. vedio for it.
  18. 连接收银刷卡器
-- Sam 18:17 25/11/2019
关于Modify对话盒的设计
  1. 每个tab的tab背景采用不同的颜色。
  2. default页面采用新的render
  3. 每个render采用不同的背景色,其中无色的放在最上面,是表示不属于任何类别。
  4. render中的按钮采用flow layout
  5. 按钮点击后,在底部进行价格预览,
  6. 并允许在底部增加、减少数量。(改成及时生效,多次点击增加数量,滑动减少数量)
  7. 顶部显示目前所有的选中的mark的效果预览。
  8. 使用状态下,mark只显示对应的语言。
  9. 编辑状态下,允许不输入“;”,因为有些用户只需要一种语言。语言多了反而麻烦。
-- Sam 15:43 25/10/2019
 关于rule的设计
  1. 添加可以在discount对话盒中添加,也可以在servicefee对话盒中添加。
  2. 添加的办法:
    1. 在对话盒中输入完价格后,不点确定,而是点击顶部的标签区域,则弹出提示框,询问是否要将内容输入规则。
    2. 提示如此这般的一个 rule将要被加入到系统中,你是否确定?
      1. 应该显示逗号分割的菜名,包括x N的信息。
      2. 应该显示编号。
    3. 如果用户选择确定,则存入数据库中。
      1. 数据库至少要有三个字段:首先是字符串类型,用户存放逗号分割的菜的编号。其次是价格信息。再次是优先级信息。
      2. 如果价格是小于1的,则表示“减少百分之多少”,如果大于1表示减少多少钱。
      3. 另外还需要的辅助字段包括一个类型(表示规则依然有效,还是临时被禁止了),另外还需要几个字符串类型的备用字串作将来扩展。
  3. 使用的方法:
    1. 程序启动时,将所有的规则提取出来,并加载到内存中备用。
    2. 每当有添加菜时,和减少菜时,这时候的flow为:
      1. 复制当前的selection,
      2. 便利所有的dishes,取消所有的“comboFlag”(rule id is the flag),同时把相应的discount取消。
      3. 和规则列表。并开始遍历所有的规则。
      4. 当遍历每一个规则时,如果发现每个要求的菜都存在,那么discout增加一个规则中的值。并且这些菜给标上Combo标记,并从拷贝的列表中拿走。
      5. 如果不满足该rule,则本次拿掉的项目放回列表,继续下一个记录。同时这一个rule从rule列表中拿掉。
      6. 如果某个组合同时满足两种组合,则优先满足第一个组合
      7. 组合用光则flow结束。
  4. 如果想要修改、review这些rule怎么办?
    1. 必须增加一个button。并增加相应的action。
    2. action被触发之时,必须显示一个对话盒,对话盒上显示一个列表。(类似checkListDialog)
      1. 列表中的项目被选中时,对应的菜和discount在SalesPanel上显示出来。同时,当前selected table必须是空的。(暂不实现,因为如果修改的话,需要点出discount对话盒才能保存更新,这个很不顺)
      2. 对话盒中要有向上和向下的调整按钮,用来调整rule的优先级别。
    3. 这时,用户可以进行修改菜单项,可以修改discount的值,可以修改serviceFee的值。
      1. 相应的三个action的行为都要修改:Send/discount and service fee的确定按钮的action时间都要增加判断。如果说当前ruleList对话盒处于显示状态,那么行为改成更新规则。(这个行为不太直观)
    4. 注意ruleList对话盒中不要显示菜单的编号,要显示对应语言的文字版本。(算了,下一版本再说吧)
-- Sam 22:21 06/10/2019
 关于service的启动的改造:
  1. 现在改成不用service,而是vbs调用bat(用来不显示黑色窗口),然后调用OTMuleServer的main,赋予-config 配置文件参数 来直接启动muleServer。
  2. 在启动muleServer的同时,启动BarFrame.main.
  3. -----------------------------------------------------------------------------
  4. 遇到一个神奇的问题,搞了一天:启动muleServer时,file.exist()方法返回false导致启动失败,但是从eclipse外面运行时是好的,而且同样的配置,在acerTouch电脑上是好的,只是在HP电脑上是坏的。---------------后来发现在HP电脑上必须把eclipse的运行配置的argument写成config C:\\Users\\caspr\\OneDrive\\Documents\\SanjiPos\\etc\\mule\\security就好了(在acertouch上是只需要一个斜杠的!!!!)
  5. 还有一个要注意的:HP一体机的document是在OneDive上的!!!这一点有可能造成和某些路径相关的配置不一致。
-- Sam 22:22 06/10/2019
 来不及改按钮定制,所以临时增加个GameBox版本(按钮定制完成了)
如何在本地增加GameBox版本的分支(或者说让远程的GameBox branch在本地的git GUI中显示出来):
git checkout -b GameBox
TODO Next:
  1. 面板尤其是桌子,需要定制背景功能。
  2. 设置面板中,增加一个label,list中的lable不带分号, 不知道是不是问题。 但是点中这个label时,txaContent中显示一个“null”,肯定是个问题。
  3. 当给新添加的lable(也可能是给列表的最后一个元素,或者非首个元素?)添加价格时, 没有被保存。切换一下的话,价格消失了。
  4. 下载其他类别的菜的时候不能够自动打印。
-- Sam 15:44 25/10/2019
 关于自定义command按钮的设计
  1. 所有页面的command按钮要增加几个属性
    1. 每个按钮要把action加在自己身上(暂时先不动,即加在view类上,如果需要显示在多个view上的话,就在多个view上都加action)
    2. 有需要显示在哪些页面上,以及在改页上的位置(r+c)(command按钮增加一个二维数组属性,列数恒为4)
    3. 所有的command按钮都可从BarFrame上拿到。
    4. 每个页面初始化时,负责:
      1. 初始化按钮。每个按钮获得自己的dspIndex(第二步将会是在BarFrame负责初始化按钮,并根据pimconfig内容为每个按钮设置三维矩阵)
      2. relayout时,要根据每个按钮的三维矩阵来
    5. setting面板要增加一个command,叫command buttons,
      1. 点击显示按钮面板,顶部显示所有按钮,下面分别为各个view,可以通过拖放和复制来设计每个页面上要显示的按钮
      2. 允许用户设置每个Command在哪些View上的显示,及其显示行列位置。
    6. 如何存放各个按钮的位置信息呢?还是按每个页一个字符串比较好吧?
-- Sam 22:23 06/10/2019
多引用问题(终于确定了多引用是,税务局想要的是多个ref element,而不是一个element中有多个ref value)
  1. 什么时候会有多个引用?
    1. 合并多个printed的bill
    2. 从一个打印过的bill中移动item到另一个打印过的bill
  2. 这些信息必然要存入comment中,然后要进入end message中。
  3. 当有多个ref元素时,每个ref元素后必然要跟着一个*Old Subtotal值。
  4. 什么时候我们增加ref element?---根据是print service的临时变量 needRef
  5. 看来要根据endmessage中的信息来组织多少个ref元素,每个*Ref To意味着要增加一个ref元素,
    1. 需要把Old subtotal 变成ArrayList。
    2. 需要把refTo变成ArrayList
-- Sam 09:16 22/03/2019
 税务局的算法漏洞
怎么办呢?
  1. 在calculatetotal时,如果是completed单子status > completed,采用不同的算法进行计算。
    1. 这时应该已经regenerated了,所有单子的status==0了。只能从comment中是否包含全套oldmoney来判断是否是收过钱的bill。
    2. 变化的项目的收集可能会比较麻烦,基本是未打印的newDish和设成dumped的output?那如果多次对款怎么办?是不是说退完钱时要把dumped的output改成deleted?
    3. 首先要确认一下一个item被remove掉时,发生了什么?
  2. 关于differnce的值和显示给用户的值不再是用原值和现在的值相减,而是用变化了的item进行加总
    1. 首先找出哪些item是属于变化了的item
    2. 把他们当成新的item(注意有的价格为负数)进行加总
-- Sam 10:33 18/03/2019
 Know Issues
  1. 目前bill再打印之前,数据库里的记录是没有更新到界面状态的。所以这时候如果把这些to pay和bill printed状态的记录显示在check bill dialog中的话,将会非常难看,所以我目前是默认不显示“尚未关闭”的记录的,默认只显示void,paid,refund状态的记录(admin级别用户还能看到expired状态的记录)。将来第二版以后再看是否把这些记录整理好(会影响一点点性能,不过估计察觉不到)
-- Sam 15:55 16/03/2019
 关于coupon
  1. coupon和discount不同,不能当成discount。因为discount时,饭店没有收到钱。而coupon时,可能饭店是赚到钱的(coupon可能是用户用钱买到的,说到这里我很不理解麦当劳常年发coupon的行为,原来那些coupon是上税的)
  2. 所以coupon的钱,必须放在Other received里面,那么问题来了:
    1. service fee该往哪里放呢?(专门增加了serviceFee字段)
    2. other Received该往哪里放呢?(coupon改名叫gift card,内容放入这个字段)
================================================================================================
关于refund 怀疑可能是refund时,旧的收入没有清空,造成再次付钱时,单一的付钱模式成了混合付款模式。具体例子:
  • 结单
  • refund   (目前这个refund之后的单子标记了付了多少钱以及退了多少钱,我觉得还是必要的,否则下次再refund就没法知道还有多少可以refund了)
  • 打开,并且重新付款 (这时我们可以看到这个记录是refund的,那么我们有机会做手脚吧?比如:
    1. 这是一个新的bill对吧,ref to了一个refund的bill对吧,那么这个bill的本身应该是清白的对吧,也就是说
    2. 如果打开一个status小于0的bill,那么应该把已付款和refund款相抵消,而不是等到显示pay对话盒的时候才进行抵消。
    3. 也就是说,我们放弃记录关于总共付过多少钱和退过多少钱的历史,这个没有用,因为ref可以帮我们找到历史记录。
  • 发现received显示了两次付款之和,而且两种付款方式。造成了mev format中付款方式的错误。(多数情况下,如果重新为一个refund的bill建立新的bill的话,那么)
solution:退款时,我们按照固定规则退款,有现金先退现金(因为没有任何手续费问题),然后有debitcar优先退入debitcard,估计有手续费的话也会比信用卡低。最后如果还要退,就进入信用卡)
-- Sam 14:06 18/03/2019
about ref
  1. 当bill被打印时,表头为本表#,在comment增加一个对自己的引用(表示本表表已经打印过了),mev中无ref元素。
  2. 当invoice被打印时,表头为本表#+F, comment内容不变(之前如果有bill有引用别的bill,就是说如果comment中有ref,那么invoice应该继承这些ref,同时应注意到,如果bill被打印过了,那么打印时必然已经将对自己的引用加入了comment,所以此时invoice不需要再增加引用进comment。mev中有无ref元素取决于comment中是否为空,为空则无ref元素,不为空则用comment中的最后一个ref,作为mev的ref元素。(如果打印过,那么mev 的ref指向元素本身,如果没有打印过,则comment要么为空,要么指向其他已经expired的元素,这时invoice则指向那个expired的元素)
    1. 举个例子,一个打印了的bill,需要增加或者减少几个菜,那么原单expired,新单的comment有指向原单的ref,如果新单不打印bill,直接打印invoice,那么mev的ref就是指向原单的。如果新单打印了bill,那么mev的ref就是指向新单的。
    2. mev的invoice可以不打印(如果设置了省纸模式),但是一定要有,而且如果comment中有ref的话,mev一定要有ref元素
  3. 哪些时候comment中的ref元素被添加
    1. 一个打印过收据了的bill(包括账单打印或者收据打印)被reopen的时候:
      1. 打开一个paid的bill,然后点击refund。
      2. 打开一个paid的bill,然后通过more less button 或者menupanel 的button试图修改菜单并进行退款。
    2. 一个打印过账单的bill,被修改的时候:
      1. 对一个billPrinted的bill进行more or less(包括鼠标拖放删除) 或者menuPanel上的按钮操作。
      2. 对多个billPrinted的bill进行move item操作
      3. 通过拖放,在bill之间进行moveitem操作
        1. 减少item的bill,如果已经print过了,那么这个bill要reopen,这时comment增加指向老bill的ref。
        2. 增加item的bill,如果已经print过了,那么这个bill要reopen,这时comment增加的是指向laobill和源bill的ref。
        3. 如果这些bill打印bill,那么会增加一个ref在末尾,指向自己。
        4. 如果这些bill打印bill,那么会照搬comment中的ref。
      4. split bill
        1. 分单时,老单expired,新单全部ref向老单。
        2. 合并时,老单expired,新单中含所有的老单。
-- Sam 09:17 22/03/2019
 关于mev的打印流程:
  1. 首先,我们的信息都是现格式化好,然后放入一个hashmap缓存,然后另外一个线程(现在好像是同一个线程?)不停的检查map中是否为空,不空的话,拿信息出来打印。
    1. 格式化时
  2. 在打印的时候,我们看打印机的类型,如果是mev类型的话则进行mev打印。
  3. mev打印时,首先检查消息的类型,是报告还是单据(包括bill和check),
    1. 如果是报告的话,那么是不进入系统的,估计就简单包装个xml标签就送mev机器了。
    2. 如果不是报告的话,那么要进行复杂的mev格式化。
      1. 首先根据message的endmessage元素判断
        1. 是不是duplicate print(发生在需要内部打印出来一个bill,不是给客人对的时候, 在checkListDlg点打印按钮,不选to customer,则会打印出这种单子的)
        2. 是不是reprint,当用户从checklist中点打印按钮,或者打开一个关闭了的单子,点击print bill时(?),或者打开一个关闭了的单子,点击退款时,这些时候会重新打印一个给客人的receipt。
        3. 如果是reprint的话那么第五元素会是“*re-printed invoice”开头,这时候,bill编号不变。ref是bill编号加上一个F。如果是refund的话,可能需要一个新的bill编号了,比如可以在头前价格“Refund”表示退款?
        4. 如果第五元素是*ref to:"开头的话,那么说明这个是bill。而且是有过修改的bill,而且修改前的bill已经打印过了。
          1. 如果第五元素是“*ref to”开头的话,那么该元素还可能包含old subtotal内容。
          2. 第一次打印bill时和第一次打印invoice时,comment字段中是没有“*ref to”可用的。区别在于:第一次打印bill不需要给ref字段,但当打印完成时,往comment里面加入了一个ref,指向自身,用来知道已经打印过bill了。第一次打印invoice,虽然comment中没有ref字段可用,但需要打印ref字段,就用bill号即可(即使bill没有打印也没有关系,反正只是辅助作用)。
          3. 当合并bill时,如果bill已经被打印。需要一个新bill号(可以用第一个bill号前加上cbn),并在comment字段写入老的所有的bill的id号,然后把所有的老的bill进行dumpt设置。(这时,如果其中部分被打印,部分尚未被打印,尚未打印的bill号忽略,系统认为新增加的item,而不care是从哪个尚未打印的单子转过过来的item?)
          4. 如果打印过了的bill要进行分单,那么返单后再打印时必须是新的单子,而不能是旧的单号,因为旧的单号已经被dump了。新的单号可以是rdv开头。comment中写入combin的单号。
          5. 当在bill之间移动菜时,
            1. 如果源bill已经打印过了,那么目标bill的comment比如加入源bill的号,并把源bill给dump掉。同时新建立一个bill复制源bill当前的信息。新的bill的comment中为源bill的id
            2. 如果目标bill已经打印过了,那么目标bill要复制一个新的,comment中写老的id,和源的id,并把老的bill dump掉。(不用担心源的bill尚未打印,它终究会被第一次打印的。而且估计不用担心没有反应出来它的一个item被拽走了,因为这些记录只是追踪用,只有最后的invoice的数据才被计算。)
          6. 结账时,如果设置了省纸模式,那么直接按照最后的bill上的信息来,应该就可以了。(问题是,如果bill没有打印的话,那么receipt也要ref元素吗? 我觉得应该不要,可是好像哪里看到说invoice都必须要有个ref)(不需要一定有bill和ref的。)
    3. 我们的bill是必须要打印的吗?counter模式下也要打印吗?如果不打印的话,invoice的ref怎么写呢?(首先确认下是不是真的都要有ref再说吧。)(no, 不必须打印的, invoice可以没有ref的)
  4. 关于什么时候需要重新生成bill
    1. 如果没有打印之前,comment部分是空的,任何改动也不会导致新生成bill,或者生成comment。
    2. 打印Bill的时候,status会被调整成bill printed,同时#ref to :billID会被写入comment(用真正的数据库里的id即可),因为被打印bill了,那么打印invoice时,一定会需要一个ref,而ref号就是这个billID。
    3. 打印invoice时,不会修改comment字段,因为在打印bill时,comment字段已经被设好了。如果comment为空,那么不加ref元素,打印foot message,如果comment不为空,则增加ref元素,并用ref内容替代foot message。
    4. 但是如果一个invoice被reopen了,那么新生成的bill的comment中的billnumber则是包含结尾的F的,原则是他实际用到的单号。
      1. 这里值得探讨,print时,status已经调整了,有必要增加billID到comment吗?为什么不定义规则为“只有根据旧bill生成新bill时才加comment”,同时dump掉旧bill?
      2. -----好像原因是支持省纸模式:如果在打印receipt,那么想要知道这个bill是不是billPrinted。
      3. 真正原因是:对于从ip-contentMap中取出的打印内容来说,已经没法知道bill的状态是否是bill printed了。所以要么生成content时,如果已经打印过bill,要对foot message做替换处理,换成ref to:billID。
      4. 这时候虽然暂时还没有发生真正的引用关系,因为毕竟如果bill printed,那么等invoice打印时,引用一定会发生,到时这个re就不再是“虚设”的了,而且起到了标识“该invoice打印前已有bill被打印”的作用。
    5. reprint时和duplicate时,因为没有item的变化,所以不用生成新的bill,但是要有ref信息。
    6. void时和refund如何处理?是要重新生成bill吗?
      1. 感觉refund是要重新生成bill的,应为从法律上讲,应该是可以追踪的两个bill,
        1. 那么refund和reopen+modify其实是一个功能了。我们有没有必要加一个refund按钮,用来输入任意数字呢?
        2. 感觉还是先留着,只是自动进行处理而已。毕竟饭店如果要全单退款的话,不用点reopen,然后一个一个菜拿掉,然后再进行退款了。快捷了n多。
      2. 而void是不需要的,因为没有生成invoice,税务上本来就没有算钱,只是通知一下mev某个bill的状态发生了改变。
    7. reopen并修改item的性质跟部分refund相同,应该是两个不同的bill。便于法律上追踪。
      1. 首先进行创建新bill和dump旧bill处理。
      2. 新bill的comeent加上对就的bill号的引用,bill号要包括最后的“F“。”
      3. 然后打印bill和invoice时照旧。
    8. 且慢,先搞清楚avenue关于refund和modify invoice到底怎么说再行动吧。
    9. 最后搞那些已经打印了的bill的ref元素问题。
-- Sam 22:46 07/03/2019
 if the bills are not completed, then user can change the table:
  1. click the table on top
  2. input a new number (select might be better, only unopened table should be selectable)
  3. when action completed, change the table of relavent bills.

-- Sam 13:12 25/02/2019
URL:
to set activation code and modify the headInfo:http://www.sharethegoodones.com/AikaPos/Customized
to set the menus:http://www.sharethegoodones.com/<product name>/menu_3_2
to check the error log:http://team.sharethegoodones.com/????
-- Sam 22:54 14/01/2019
 大招来了,我终于要开始把simonStyle和taostyle连起来了! 目标:
  1. pos发送请求给web。
    1. 发送下载订单请求
      1. 现有的请求订单的姿势是啥样的?
      2. 有没有线程的发送代码?有的,数据库同步代码可用。
    2. 下载菜单请求
    3. 打印成功,发送更新主订单状态请求。
    4. 上传本地更新
      1. 如果pos本地进行了菜单增加,可以发送到服务器。(menu with no picture will be created.)
      2. 服务器上的今日推荐的编辑,不会对pos产生影响。因为那是纯给食客看的。
      3. 如果pos本地进行了分单操作,会修改一些output的归属,甚至会删除,产生新的的分开的output。这个不必要通知服务器。因为服务器只要知道谁点了啥,没有必要知道最后谁付的钱。

  2. pos接受web返回的内容。
    1. 本地吸收打印机
    2. 本地吸收(创建)桌子
    3. 本地吸收类别和菜品
    4. 本地send到厨房(包括创建output记录
    5. 本地创建bill
-- Sam 12:31 17/12/2018
 关于何时创建bill:
  1. 本来send的时候是之创建output,不创建bill的,因为,这时候还没有做,没有吃,所以订单可能取消,没有必要建立bill。
  2. 但是现在市场说即使单子取消了,也要创建bill,因为:
    1. 老板需要知道雇员一天取消了多少个单。损失有多大。
    2. 防止雇员给熟人免单(目前是打印bill,设置disc时创建bill记录,这太晚,因为雇员可以不打印bill,不分单,不disc,直接void)
============================
方案:
  1. 发送即产生bill:
    1. 那么以后就再也不用产生bill了,只存在updatebill的必要。那么现有的checkbill方法改成updateBill好了。
  2. 有没有必要开桌就产生bill,---这个,好像没有必要,因为啥都没有吃。但有时开桌是付费的,那么久必须有了。那么既然会有就一步到位喽。 (已经改成这种方案!)
  3. 有没有什么问题?
    1. check方法不用改,毕竟如果有bill了,不会有影响。但是要真发现bill居然还咩有建,应该log个警告。
-- Sam 08:54 13/12/2018
 About CimbineAll function:
  1. 用户有时候选择equal bill,然后发现输错了数字,本来应该分7单,结果分了8单。这时候需要合并全部,然后重新分单。
    1. 如果不考虑其他情况存在,可以考虑简单处理,就是说合并后不可能存在除数,也就是说所有的PS,PK可以去除。
    2. 如果存在追加的菜,就可能造成某个菜存在两个以上的记录,那么分单时存在16个1/8的情况,需要考虑。
    3. 算法:
      1. 如果发现num是带有PS或者PK的,记录下PK和PS.和Num。总单的discount,和totalPrice(total price应该是已经扣除了本菜的discount的)
      2. 如果发现map中没有这个key,那么用"pk":+pk+"pS"+ps+name+"discount:”+discount+totalPrice创建一个key存入map。PK为value,如果PK不存在,或者为1,或者为0,那么用PS为value。
      3. 如果发现map中已经有这个key了,那么删掉这个output,并把map中的value减少1.一直到value值为1时,map中去掉这个key。同时更新原始的(那个key相同但是没有被删除的)的output记录到数据库,把discount*value,totalPrice也*valuev,num中的pK位去掉,如果已经去掉了,那么把PS位去掉。(继续遍历时,如果发现还有这个key的,将会新建一个key存入map)
      4. 一轮遍历过之后,可以确定消灭了二次分单的存在。但是一次分单的情况仍然存在。所以有必要再进行一遍,用来把pS也去掉。
      5. 两遍目前是足够的。但程序上应该写成说只要发现“pkOrPsFoundFlag”没有被打上,就表示合并结束(没分单过的是否合并是个问题,因为有的菜点了多次,但每个菜可能给了不同的折扣)
  2. 较少情况下,用户选中一个bill,然后进行了equal bill 进行AA制分单,然后突然有人跳出来要给所有人付钱,(这种情况应用上述的算法应该也能解决)
  3. 如果分单后有的bill已经付过钱了,这时候如果combine All,则弹出提示,确认后合并所有没有完成的单子。
  4. 合并后存在一个撤销合并的问题。
    1. 用户可能合并后改主意,要求不再合并。
    2. 做法是合并的是后修改output的objectID(tableIdx),不修改output的Category?(billId)属性.
    3. 只有每次分单时修改output的billId属性。
    4. 这样使合并的后悔成为可能。(而且不用一个一个的进行调整)。
    5. 另外Combine All按钮需要改为toggle状态。
      1. 进入billList界面后,Combine All should has status: if not all combined, then the button is not selected, if there are bill combined (out puts have same billIdx but not billId), then the combine all button should be selected.
      2. if the combine all button is already selected, then it should be displaying unCombine.
      3. when the button is selected, use click it, will trigger the output's billIdx property will be changed to bill Idx of the hided bill
  5. 扩展的话,可以在option中增加选项,是否合并未分单的菜单。
    1. 如果选中,那么只有没有重复的key出现才停止合并。
    2. 如果选中,那么必须确保item discount的值要存入key。

-- Sam 13:34 13/02/2019
 convert the database to use MySQL.(for easier installation, hsql is still a better choice, just we now use server mode. and start the db when application start up----check if it's already started of course, and close the db when system close.)
  1. find the db configuration.
-- Sam 09:02 26/11/2018
 about the service fee  and discount propertiy in billPanel.
  1. why we have these two property?----it's a property of bill. when user added these property and there no bill yet, we need a place to put the property.  actually we can also save it in bean. but when displaying, it's float format string.
  2. when do we generate a bill?-----currently we create when check bill status, (if bill not created, then insert a bill record.) if the bill id is already exist, then we update the bill record,(in case user added discount or service fee. !!!in both case, we will need to call billPane.initContent() to ensure the dish has same "total" price info .
  3. to ensure the stability, I have added code to set the total price when we add content to list.
  4. ============================================================================
  5. 有点奇怪,我们目前好像是吧实际收到的钱加到cash了,但是没有把找的零钱保存进bill。我们应该计入bill,这样才知道客人实际上付了多少钱,然后多出的钱可以算作tip。
-- Sam 16:12 30/08/2018
About Sign in Sign out
  1. when single user log in, or when multi user open table or add a temperal table, will do checkSignIn().
  2. in checkSignIn method, will check
    1. fist if there's no sign in record for current user, current day and endtime is null yet, then insert a new record.
    2. secondly, if there's already such a record, then just do nothing
  3. when user click check out button, will update the end time for existing user,.which current day, which end time is null.
-- Sam 23:39 19/07/2018
关于操作员的名字问题:
  1. 名字不是每次login之后设置上去的。为什么不可以每次login成功都改一下名字呢?
  2. 目前是每次swithmode时设置名字,原因是:
    1. 当多用户时,切换到桌面(0)时,应该把当前的用户从界面拿掉。之后的任何操作都是要登录的。
    2. 当但用户时,切换到桌面时不用动。之后sign out时,要把用户从界面拿掉。
  3. 所以感觉正确流程应该是:
    1. 每次login成功时,该名
    2. swith到0界面时,检查是否多用户,如果 是,那么清空名字
    3. sign out时,清空名字。

-- Sam 13:15 12/07/2018
 About Font:
  1. we support setting different font for different printer: e.g. 192.168.1.88font:27,33,48
  2. if font is not defined for a specific printer, then this printer will use general defination of font. e.g.font:27,33,48
  3. For a specific printer, if it's font is set, then it's width property should also be set, e.g. 192.168.1.88width:28
  4. if not set, we's also use general width property, by default, general width is 30.
-- Sam 21:48 11/07/2018
  关于网络版本:
  1. 是用STGO服务器还是用内部网机器当服务器
    1. 显然应该用内部机器当服务器,因为有的饭店信号不好,或者根本没有外部网。(至少目前是这样)
    2. 是不是可以在内部网部署test.sharethegoodones.com服务器呢?
      1. 安装有点复杂,必须有人去安装,不利于网上销售。
      2. 代码有泄露风险:
        1. 代码不可以简单的通过比较.ini文件来知道是否已经active了。
        2. 最好也不能通过复制黏贴ini文件和数据库来破解。
  2. 是用MySql还是沿用HSQL,但是开一个ServerSocket?
  3. 注册和版权保护:
    1. (在不连网的情况下),再用户目录下创建一个临时文件,这个文件用来存放用户的注册信息。
    2. 同时再ini文件中也放一个变量,用来存放是否已经注册了的信息。
    3. 然后数据库也要放一个变量,用来存放是否已经注册了的信息。
    4. ...security中也要放一个变量,用来存放注册信息
    5. 如果以上任何一个地方被破坏,系统不能启动,并要求联网进行注册。
-- Sam 13:20 23/06/2018
 About Registration:
  1. use same mechanism with JustPrint.
    1. first time use must connect to internet and regist.
    2. support upload and downloading menu from test.sharethegoodones.com (same website with security function)
  2. sub node also need to regist the first time use, but it regist to the local server, not the test.sharethegoodones.com
  3. sub node can download menu from local server
-- Sam 10:27 17/06/2018
 About print:
  1. when send text, need to:
    1. 得到所有的新记录
    2. 发送到打印机
    3. 查看打印结果
    4. 如果成功保存所有新纪录到数据库。

-- Sam 16:42 29/05/2018
 About payment dialog:
  1. calculate received of different type of payment.
  2. every time when switched pay type, should display due:$x.xx received:$y.yy inputted:)), money left:
    1. cash received:
    2. debit card received:
    3. visa received:
    4. master received.
  3. the steps:
    1. if the paydlg is already displaying, check if the tfdReceived is empty, if not, show confirm dlg to ask user clear or finish.
      1. maybe we should update it automatically into db bill?
      2. if the dlg is not showing, then the status must be cleared already, if not, just ignore it. so be sure to make the paydlg properly reset every time.
    2. call initContent of payDlg base on a bill, so the dialog will have correct receiveds  and correct left.
    3. show the paydlg with right title.
    4. when finished input, user must click OK, to update the new received into db bill. user can also click exact to update db bill.
-- Sam 16:35 21/05/2018
 关于item diacount对total的算法
  1. dist item是打印bill前设上去的
  2. 是对所有的减去,因为如果是对单个减价的话,就成改变价格了。所以应该是乘以num以后再减少
  3. 减少后要参与分单的计算。
  4. 如果不是税前减价,那么表示税是不用做任何改变的,那么只要把分单后的discount加总,然后加到subtotal中即可。
  5. 如果是税前减少,那么用全价计算出来的税金就不对了,也就是说,税前算多了,那么就应该把多算的减掉。那么多算了多少呢?减掉的乘以税率本来就是多算的税钱了。燃鹅:::
  6. 不要忘记分单了
  7. 所以多算的gst和多算的qst应该分别减到各自的项目上。

-- Sam 20:07 17/05/2018
 About split bill:
  1. I've got all bill listed in billListPanel,
    1. if I click a button on any of the bill, will go into the sales page of the bill.
    2. if I click a record of any bill, will set the bill as selected, and the dish as curDish.
      1. while if there's already selected curDish in different bill, then do move, and clean curDish.
    3. if clicked empty area, will set the bill as selected.
      1. while if there's already selected curDish in different bill, then do move, and clean curDish.
-- Sam 22:53 08/05/2018
 about deleted:
  1. it's actually can be used as status
  2. by default it's 0.
  3. if it's set to be bigger than 100, means it's not visible anymore.
    1. 100 = canclled by cancelled all.
  4. if it's 
-- Sam 23:29 29/04/2018
 table 界面的设计-----跑不掉的功能:
  1. 开桌功能(如果本来没有bill,直接进入sales界面。如果本来已经有bill,那么应该允许用户选择,是打开还是新建?)
    1. 最简的界面设计:点table时,弹出一个bill 列表,上面每个bill一个button, text 为发送给用户的bill纸条上的号码(如:b1-3)。,最后一个button是新建bill。然后是横线,下面是三个按钮:打印全部、全部完成、关闭对话盒。
    2. 更高级的设计:tablebutton附件出现很多小的button,
      1. 用户直接点某个小button,
      2. 显示一个tablee,上面有该bill的详情和总价。
      3. 下面有三个按钮:打印、完成、关闭。
    3. 无论哪种方案,都需要有桌子按钮被点时的界面,因为需要一个 全部打印的功能的------这个功能要么出现在对话框里,要么显示在table界面下方的按钮群中。
      1. 个人感觉显示在对话框中更清楚。但是点击桌子每次都弹出对话框的话,会不会导致其他的命令没法玩呢?
      2. 需要先知道其他都还有些什么应用再说吧。


-- Sam 10:27 26/04/2018
 几个主要界面:
  1. login界面
  2. table界面
  3. sales界面
  4. setting界面
关系:
  1. 第一界面是login界面或table界面其中一个。需要能设置.
    1. 如果是小店,一个人用。那么应该login在先。因为他不想每次开桌都输入一次密码,也不会希望自动登出。
    2. 如果是大店,多人同时用的话,那么应该是table在先。
  2. table界面有模式命令按钮,包括:
    1. 堂吃--------- 一张桌子上有多个人
      1. 先吃饭,后付钱,有小费
      2. 可以加椅子一个桌子的人数不能限制,因为可能加椅子,如果是圆桌子。

    2. 快餐(先付钱,后吃饭,无小费)----------直接进入sale界面,
    3. 送餐(先订饭,后付钱,可能有送餐费)-------显示联系人界面,要求电话号码,姓名,地址信息。要求有自动保存功能。
  3. sales界面上的几个按钮会导致回到table界面
    1. send按钮,订单被保存或者修改的话,只打印新加的记录。
    2. return按钮,订单表中有新记录,提示打印还是丢弃?
    3. 外卖,dinning 是回到table界面,fastfood的话,send后仍然呆在sales界面。只有点return才回table界面。
    4. fast food和外卖的table界面显示的桌子上显示外卖1、外卖2...
  4. 太大的店,可能会有如果多台pos机同时使用的情况,这时需要把一台pos当成服务器来使用。另一台当成备份服务器。
    1. 那么最好用server模式来连接数据库了?
-- Sam 09:40 26/04/2018
 when simonstyle is working with justPrint or taostyle:
  1. order is made in justprint or taostyle, and saved into cloud db or mobile db. (currently 
  2. order is printed in back kitchen, and in front counter.(when simon style is used, then don't print in front counter).
  3. simonstyle synchronize db from cloud db or JustPrint synchronize db to Simonstyle
  4. simonstyle print bill
  5. simonstyle print acception.
  6. simonstyle modify local db and synchronize the db onto cloud and/or just print.
    1. taostyle and just print can still work if not synchronizing db when bill is paid. because they are used to make order.
    2. other area where no need to connect tax controller, can use only taostyle or only pos. to print both kitchen list and bill. no need to synchronized db.
  7. -------------------------------------------------------------------
  8. pos should be always able to connect to printer, because:
    1. when use only, no one else will try to connect to printer.
    2. when use with order maker tool(taostyle or justprint), pos connect only to bill printer, nevder connect to kitchen printer (use order maker to connect kitchen printer).
    3. while if it failed to connect to a printer, it still need to report fail.
-- Sam 08:33 24/04/2018
 关于订单保存的设计。
  1. 订单应该保存再数据库中还是内存中?----当然是数据库中,因为用户不会害怕订单被保存了,毕竟税务局都知道了。
  2. 订单是凑合再output表中还是另起一个表?----尽量是output表,因为dish都凑合再产品表中了。字段对应表:


-- Sam 17:24 21/04/2018
 QTY按钮的用法(用户修改QTY的做法有点不同,不是先点一个记录,然后点QTY,而是先点QTY,后点记录):
  1. 先点QTY按钮,这时,QTY对话盒visible=true.
  2. QTY对话盒中的信息反应当前记录的QTY(通常是1,且为全选状态)
  3. 这时,用户点击某个记录(如果当前的记录不是想要修改的记录的话)
  4. 用户输入新的QTY,(或者将来旁边再放些checkBox用来修改“加糖”、加盐等、size等)
  5. 用户点击“Apply”button,新的QTY应用到table中。
  6. 重复回到3
  7. 用户点击“OK” button, 新的QTY应用到table,并关闭对话盒
  8. 用户点击“cancle”或者“close”,关闭对话盒
-----------------------------------------------------------------------------------------------------
  1. 鉴于,如果用户同时选择qty和modify的话,就无法知道modify是哪一份的了,所以这两个还是不要在一起的好。
  2. 既然分开是一定的,加上wei的意见(不要apply功能),那么我们就用login的数字面板布局。而且确定时关闭对话盒。
  3. 对话盒为非模态,允许修改非当前记录的qty。
-- Sam 16:12 21/04/2018
how to deal with multi size dish? (will be done in the second step, now just write down the solution.)
  1. when creating a new dish, if the size is not 1, then do not check the duplication of 3 names. while check the following:
    1. language1 still must not be empty
    2. there must be an existing record with same language1, and same category, and same language1.
    3. in those other records with same language1 and category, must not be with same size
    4. price still need to be checked.
    5. no need to check dspIndex, will be displayed in a popup dlg, and ordered in size.
    6. the language1 which have more than one size must be added into MustiSizeDishAry----a "," seperated sting and save to disk.
  2. when displaying the menus
    1. must add unique in sql, to get out only one record with same language1(which is a must-have name)
    2. the when creating the buttons, if the dish.getLanguage1() is contained in the  MustiSizeDishAry string, then this button must be a MutliSizeMenuBtn, which is extends from menuBtn.
  3. when the multiSizeMenuBtn clicked
    1. pompup a new Dialog SizeSelect Dlg, with barFrame as constructor parameter.
    2. do a sql to fetch out all record with same lang1 and category.
    3. create menubuttons base on each dish. while text display size1/size2/size3/size4或者大/中/小/
-- Sam 09:22 19/04/2018
 发现当dishDlg显示试,visible(true)的下面一行被执行到了。明明dishDlg被设置成模态了啊???
categoryDlg显示时,setvisible(true)下面一行却没有被执行到,难道是因为类别对话盒小吗?
-- Sam 23:45 17/04/2018
dish <--> product table map:
     ID INTEGER IDENTITY PRIMARY KEY
   DELETED BIT DEFAULT false
language1 CODE    VARCHAR(255)
language2 MNEMONIC  VARCHAR(255)
language3 SUBJECT  VARCHAR(255)
price          PRICE    INTEGER
gst                  FOLDERID  INTEGER
qst      STORE    INTEGER
size      COST    INTEGER
printer  BRAND    VARCHAR(255)
CATEGORY CATEGORY  VARCHAR(255)
promp price CONTENT  VARCHAR(255)
promp menu UNIT    VARCHAR(255)
promp mofify PRODUCAREA  VARCHAR(255)
-- Sam 13:53 17/04/2018
 why I don't give bar app a new table for saving the dish?
  • May be it's a good idea to give a new table for dish, because it's so different than product.
  • Currently I didn't give a new table because I am learning the code. don't want to think too much, 
  • and an other thing is that I don't want to have too many table in db, and I want it to display in controller. and give it only a new view defination.
-- Sam 13:49 17/04/2018
目前的状态:
  1. security是独立运行,和simonStyle是两个jvm,用来不互相干扰,security可以升级simonStyle,但用户可以关闭simonStyle不会影响security。
    1. 这样做的唯一理由就是使用户不感觉奇怪。
    2. 如果有老板不希望售货员有打开关闭的权限的话,那么可能采用自动开启的方式更好。
  2. netUtil没半分钟检查一次系统安全状态,其中如果有managedApp的话,会让managedApp保持启动。所有没有被managed app需要另外通过bat来启动。
  3. 下一步:
    1. 先做manager按钮,点击输入密码,通过后进入编辑状态,即,用户可以直接点某个类别按钮,增加文字。或点一个菜单按钮,来增加菜单。
      1. 不设置manager身份(即用户登录后都先显示employee页面,需要点击Setting按钮,输入”高级权限密码“来进入编辑状态(或者界面)
    2. 再做logout按钮,切换回使用状态
    3. 实现类别、菜单等的翻页动作
    4. 实现菜单制作功能
    5. 实现点菜动作(点中的菜加入table)
    6. 实现table中的翻页、选中、保存、选中、撤销

  4. 送检查前先只实现一种语言,之后再增加多语言功能
-- Sam 10:12 19/04/2018
how to change the db to user derby?
  1. we alreay have derby datasource bean ready. how can simonstyle use it?
    1. it's available in frame work.
    2. have simonstyle extends from an frame project?
    3. have simonstyle have dependency on the the model project?
      1. currently the model already know simon style, because it need to manager the simon style( to stop and to start it)
      2. the app can have an interface, like must have a mainclass name like XXXMainFrame.java and must accept a datasource : public void setDB(DataSource ds) so securityModel can communicate with them.
  2. How will barMainFrame be started up?
    1. it will be started up from inside the framework?
      1. might be a little too complex, because it use jetty, it uses spring to manage the db.
      2. and it could be a little wired. unless it's stopped, then it can be started normally?
      3. good thing is that it can update automatically (if I can make sure the start up not crash).

    2. it will be started up by it self?
      1. izpack must be able to add shortcut.(it is said yes)
      2. izpack must be able to make the app auto start up.(it is said yes)
      3. if it's start up by it self, it must use it's own db.
-- Sam 14:44 19/03/2018
how to check the hsql db?
  1. go to the lib folder under the installation folder.
  2. run java -cp hsqldb-1.0.jar org.hsqldb.util.DatabaseManager, this will show up a configuration dialog.
  3. in the url inputfield, input "jdbc:hsqldb:C:\workspace\security\simonstyle\.Storm070111\database\pim
  4. click ok! this will show up the db content.
-------------------------------------------------------------
use dbeaver is more convenient!
-- Sam 11:11 16/02/2018
目前问题:
  1. 打包后不能运行(ide中能运行)
    1. cas的打包方法提示是说PIMDBModal init出错
    2. simonstyle的打包方式提示是说loadapp出错(DefaultConfigInfoLoader.java)---我已经把素有的ini文件改成UTF-8编码了。
      1. 问题可以重新描述成同一个文件,从IDE中运行,读取是正常,从jar中运行,读取却出错?
      2. 原来是因为编码的问题,改成GB2312,就能正确识别了。这是为什么呢?难道说jar文件运行时会用系统的编码去读取?----非常的可能。估计就是那么回事。这么说只要价格“UTF-8在参数就行了”
      3. 不知道为何cas.jar能够自动建立或恢复.Store下的PIMconfig.ini,可是maven project产生的jar却不能呢?
  2. 如果从NetUtil中启动一个程序,比如barMainFrame,那么如果barMainFrame启动过程中出现了异常,肿么办?
    1. 以前的一个机制是,如果数据库有问题,则启动失败,需要再次启动,才能启动程序。这种机制再security框架中有问题:
      1. 再次启动时,会因为,两次启动中间,jvm没有关闭,所以链接没有断开,导致再次启动失败。
      2. 用户需要关闭功能的话,如何满足,告诉他只能最小化,不能关闭。这样会让人觉得有点怪的。
        1. 如果提供一个关闭按钮的话,那么一定需要一个重新启动的方式。
          1. bat的方式不专业,即使bar关闭时做到了关闭数据库链接。bat能够成功启动程序。可是bat启动会多出一个后台终端,黑乎乎的,招用户奇怪。
          2. izpack据说有添加快捷方式的功能,但尚未实验成功。
  3. hsql数据库本身有个奇怪的问题,(也有可能是我用的不对)就是如果程序退出,然后再次启动,DriverManager.getConnection(url, user, pwd)可能会返回null。非常奇怪。
    1. 内部其实是aDriver.driver.connect(url, info)返回了null。hsql实现的,看不到源码。
      1. 要不要升级下驱动看看?
      2. 还是干脆专用derby?毕竟是apach下面的?(还是转derby吧,毕竟有licence issue)
-- Sam 14:09 19/03/2018
 new package command:
  1. go to the folder which contains com, client, org, and Config.ini.
  2. run "C:\Program Files\Java\jdk1.8.0_101\bin\jar" cvfm c:\workspace\security\simonstyle\target\cas.jar c:\workspace\security\simonstyle\m.txt org client com config.ini
    1. be careful the "" must contains the whole path!!!!
-- Sam 19:00 02/12/2017

Please click here to login and add comments! || automatically refresh content every seconds