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

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