Compare commits

...

810 Commits

Author SHA1 Message Date
lijuncheng b6692a8325 修改补料任务测试数据 1 month ago
zhang_li 24fe84795c HL-5339无计划完工,超过报工数还可以在扫描,应到报工数自动提交;超过报工数提交后,返回可再次扫描,应返回主页面不能在扫扫描 1 month ago
lijuncheng 4482bffe6b 修改版本号 1 month ago
lijuncheng 513e2da8a9 修改补料任务标签 1 month ago
lijuncheng c43c338668 修改发料、补料任务,扫父子包装限制与直接相同 1 month ago
lijuncheng c633d46ed9 修改样式 1 month ago
lijuncheng 50d3e76522 修改查询提示 1 month ago
lijuncheng 1df4f61591 修改直接发料和直接补料扫父子包装问题 1 month ago
lijuncheng f5e31ee1e5 修改直接发料扫描父子包装问题 1 month ago
lijuncheng 7b9c272f20 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 87aa66567e 修改直接发料0816 1 month ago
wangyufei e08a8ae336 HL-5055 按计划完工,每次提交后要判断一下计划的状态,如果计划已完成提示:计划已完成,返回开工阶段 1 month ago
lijuncheng 8b45890360 直接发料,直接补料添加库存余额查询 1 month ago
lijuncheng 994d1ca168 修改直接采购上架推荐库位校验 1 month ago
lijuncheng eb63ed4f5e 修改发料补料提交校验 1 month ago
lijuncheng b1ef7583bb 修改发料扫描校验 1 month ago
lijuncheng 4495ad99bf Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng d8bb622a72 修改发料查询库存,上架修改库位 1 month ago
niexiting 6172e62b33 增加组件 1 month ago
niexiting 22e34028d2 增加组件 1 month ago
wangyufei 1c11e4ea0b HL-5388 装配收货任务,扫完箱码后,点复制库位、扫库位不弹输入库位框,点扫描是扫箱码的框,应加个扫库位的框 1 month ago
wangyufei 93508acd61 在开关表中增加开关:semiProductReceipCommitValidate,在预生产完工收货任务提交时根据开关校验是否要扫描目标库位,如果不扫描目标库位取任务中的目标库位,参考装配任务中的fgProductReceipCommitValidate开关 1 month ago
zhang_li d656c643eb 盘点返回之前版本 1 month ago
niexiting 895bf6c855 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 36fe6cb120 直接发料增加预计出的判断 1 month ago
zhang_li 0f194e6870 HL-5366盘点任务,明盘,任务明细是相同包装、相同物料、相同库位、不同状态,盘点之后,产生记录变成相同物料、相同库位、相同状态,也都生成盘点调整 1 month ago
lijuncheng 53a5156037 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng df6cf1ff23 修改发料错误 1 month ago
wangyufei ca3dc72b15 物料隔离任务,PDA增加物料号查询功能 1 month ago
niexiting 330128d328 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 2f5d6c0e84 增加组件、修改直接发料功能 1 month ago
wangyufei fdcf2ab346 HL-5426 PDA发料接收任务中筛选中点击重置没有清空只看当天和只看待处理结果 1 month ago
wangyufei d097282c73 HL-5359在开关表中增加开关:semiProductReceipCommitValidate,在预生产完工收货任务提交时根据开关校验是否要扫描目标库位,如果不扫描目标库位取任务中的目标库位,参考装配任务中的fgProductReceipCommitValidate开关 1 month ago
lijuncheng 658da25bcb Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 9e6e5b799d 发料接收提交和自动扫描一致 1 month ago
wangyufei 1c1628290c HL-5369物料隔离任务,PDA增加物料号查询功能 1 month ago
lijuncheng 7b5f7f91d4 预生产、装配上架校验提示 1 month ago
lijuncheng c8727798e2 添加灯码扫描校验 1 month ago
lijuncheng 8b7c4acc0f 修改发料提示 1 month ago
niexiting a13c98f018 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting d88bdff7c5 修改发料0816 1 month ago
wangyufei 6bbef5511c HL-5420发料任务、物料任务-筛选点击“重置”按钮时,没有清空只看当天和只看待处理按钮的状态 1 month ago
niexiting 7ac7b1b8a3 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
wangyufei ff475dc920 HL-5376 聂喜婷 08-16:@王宇飞 没选择生产线时给出提示:请选择生产线 1 month ago
niexiting e3659c8500 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting a219065216 修改赋值 1 month ago
陈薪名 0838194993 Merge branch 'hella_online_20240816' into hella_online_20240803 1 month ago
niexiting 6936ef7611 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 3aef9849c9 增加directIssue0816 1 month ago
zhang_li 1a1c9874a2 检验打印单提示变添加没有检验方案和检验阶段不存在 1 month ago
lijuncheng b3cc6cf0e8 修改库移 1 month ago
lijuncheng 340f99514c 修改库移校验 1 month ago
陈薪名 b75a0bb9a8 Merge branch 'hella_online_20240816' into hella_online_20240803 1 month ago
lijuncheng 42e5dc42ea 发布版本 1 month ago
lijuncheng cb15c0cf5d 修改库存转移提示 1 month ago
lijuncheng a3c4e52f0d 修改预生产上架扫描 1 month ago
lijuncheng 31710c05bc 添加页面 1 month ago
lijuncheng 1e82452cf9 修改库移 1 month ago
lijuncheng 23c50409f4 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 61d96a6582 修改预生产上架扫描问题 1 month ago
wangyufei 110767de2a HL-4766 在WMS的登录页面和PDA的登录页面取消验证码功能 1 month ago
wangyufei 908af99949 HL-5359 在开关表中增加开关:semiProductReceipCommitValidate,在预生产完工收货任务提交时根据开关校验是否要扫描目标库位,如果不扫描目标库位取任务中的目标库位,参考装配任务中的fgProductReceipCommitValidate开关 1 month ago
wangyufei 7113fa4c29 HL-5275 直接移库扫描第一个箱签后,在扫描第二个时没有光标显示,需要点击扫描框才能继续扫描 1 month ago
lijuncheng 06bc901945 修改直接发料扫描焦点 1 month ago
lijuncheng 59f793ebc0 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 22d90fa4c1 目标库位和状态都一致时不可以提交 1 month ago
zhang_li 14061c3dc9 检验打印恢复最新版本 1 month ago
lijuncheng 2fb8148b9f 修改发料提示 1 month ago
zhang_li 9eb9161274 检验单文字重复 1 month ago
zhang_li b21fbc2f76 检验单回退到没有提示的版本 1 month ago
zhang_li 6e1ba14992 检验单提示 1 month ago
lijuncheng 6c59175d87 修改盘点弹框错误 1 month ago
zhang_li 87538b9e03 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
zhang_li 6e36f0d4c1 检验申请单提示检验申请问题 1 month ago
lijuncheng be34c04d36 添加版本 1 month ago
lijuncheng 72c471f366 修改发料任务和发料接收 1 month ago
lijuncheng a6c5e6eff5 修改点击处理 1 month ago
lijuncheng e18ff3f478 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng ba7690e089 直接发料查询功能 1 month ago
wangyufei b74b62c827 可编辑数量 1 month ago
wangyufei 686a10f682 编辑数量组件封装 1 month ago
zhang_li 776ffd16b1 版本 1 month ago
lijuncheng 12f8e803a5 添加筛选 1 month ago
lijuncheng eae8993265 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng c23b7e763d t status 1 month ago
niexiting 33752bccdf Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 75599d2de2 修改直接补料 1 month ago
zhang_li aa5e7822b5 采购收货打印批次改成供应商批次 1 month ago
lijuncheng 1395fb7523 优化扫描 1 month ago
lijuncheng dda8f76fd5 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 898276b3c3 修改发料接收 1 month ago
wangyufei e9ed633dd0 封装防止重复点击 1 month ago
zhaoyiran 68ebff7d5a HL-4896 1 month ago
lijuncheng 069cad56cc 修改网络异常 1 month ago
lijuncheng efa494646a 修改提示 1 month ago
lijuncheng 354132d81a 修改提示框样式 1 month ago
lijuncheng ac9da76b5b 修改报完 1 month ago
lijuncheng c078fb5ca1 修改计划外出入库 1 month ago
lijuncheng 2cb797443d Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 85dff3ceb5 修改生产收料自动提交 1 month ago
lijuncheng 8b10e9feab 修改网络提示 1 month ago
lijuncheng 95ccec7137 修改库存转移提示 1 month ago
lijuncheng 659fcccfa6 优化扫描组件 1 month ago
wangyufei 9fa8cef3f7 喜婷-承接人为空时隐藏.所有任务 1 month ago
zhang_li 7544da2ee9 翻包打印二维码串了问题 1 month ago
lijuncheng 52ab0f3c8c Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 082cd2658a 网络请求报错修改 1 month ago
wangyufei 06f67bc481 库位查询 1 month ago
wangyufei ab395f1498 发料任务添加来源库区和到库区筛选功能 1 month ago
lijuncheng 16fa4a2516 修改库存转移包装号为空 1 month ago
lijuncheng c1952deaf1 版本号 1 month ago
lijuncheng a0b86df6ac Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng edd078a40f 修改没网络请求提示 1 month ago
lijuncheng bf836b13f5 发料接收添加物料代码查询 1 month ago
zhang_li 89d63b84aa 版本 1 month ago
zhang_li 01063ee217 补料任务添加onUnLoad 1 month ago
zhang_li 77ffbfaa87 版本问题 1 month ago
lijuncheng 64035597b5 修改翻包任务跳转到详情,自动扫描 1 month ago
lijuncheng 045e7dbed6 修改扫描自动扫描赋值问题 1 month ago
lijuncheng 66bf11b1ad 修改库存转移 1 month ago
lijuncheng fdd13cfb7f 修改发料任务只看当天无效 1 month ago
lijuncheng da277ea4e3 修改库存转移 1 month ago
lijuncheng 5f7d5c99cf Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng e53f0f2305 发料任务、补料任务、翻包任务、装配上架、预生产上架、预生产收货、成品入库 任务承接处理 1 month ago
zhang_li aa24a51d04 修改密码问题 1 month ago
lijuncheng 249c4f86e8 修改发料显示错误 1 month ago
lijuncheng 0bf35b1c5b 修改已经在列表中为重复扫描 1 month ago
lijuncheng be5db4daa2 修改提示框,\n 1 month ago
zhang_li 2b7189011c 提示bug 1 month ago
zhang_li 2adcb664b0 提示bug 1 month ago
lijuncheng a08835663f 添加版本号 1 month ago
lijuncheng f0f1ae3784 测试 1 month ago
lijuncheng 6a3ce8cbeb 修改发料任务查询已经有库存 1 month ago
lijuncheng 2ea7adafb1 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 07e193f3e2 修改翻包焦点消失 1 month ago
zhang_li cc1840e913 PDA部分任务增加扫描数量与任务数量不一致的提醒 1 month ago
lijuncheng 281c52e21a 修改补料已经有库存余额提示 1 month ago
lijuncheng 54c16fcd37 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 0aa7c71af5 优化显示 1 month ago
lijuncheng 4ee3560350 修改补料任务筛选没有记住 1 month ago
zhang_li 9815f5fea1 采购收货打印添加字段,修改页面样式 1 month ago
lijuncheng 03c18d18d5 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng cd78dae974 关闭弹窗的时候失去焦点,隐藏软件盘 1 month ago
lijuncheng 89e4ee684a 修改发货扫描标签 1 month ago
lijuncheng 6d36ca4061 翻包任务没有扫描,数量为0时校验 1 month ago
zhang_li a564a0d7a8 直接翻包打印bug 1 month ago
lijuncheng e48b95f16e 修改翻包,拆包库存查询 1 month ago
lijuncheng 508588531f 修改制品回收提示 1 month ago
lijuncheng fa4db3face 修改任务列表下拉不刷新和返回列表不刷新 1 month ago
wangyufei be5c719210 上拉加载更多 1 month ago
lijuncheng 8682596e8d 修改直接补料查询条件 1 month ago
lijuncheng 0d746ef993 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
lijuncheng 455ef36364 直接发料不扫描来源库位 1 month ago
wangyufei 5fb50d500f 剩余未满箱自动提交+返回首页 1 month ago
niexiting 1def4a9f0a Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting fd44a8f5ae 修改直接发料和直接补料 1 month ago
wangyufei ac40331586 扫描数量 1 month ago
wangyufei 10a9374db3 重新计算数量 1 month ago
wangyufei f46c669c99 按计划完工 1 month ago
zhang_li dce1cbea29 拆包打印标签和二维码不一致问题 1 month ago
wangyufei 90599b48a0 开关问题 1 month ago
wangyufei ff3a0a854d 按计划完工打印标签后不清空列表 1 month ago
wangyufei 214ee581a9 库位 1 month ago
niexiting 807f478822 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting c5f600bdb6 修改发料和补料 1 month ago
wangyufei c51559a5a7 装配收货任务-默认库位 1 month ago
zhang_li 282ffac8ff 打印 1 month ago
wangyufei 51dfc46bd4 装配收货任务提交校验,关闭提交报错 1 month ago
zhang_li 164325490a 补料任务代码提交bug 1 month ago
zhang_li f1e08fae23 拆包打印 1 month ago
niexiting 4c656ca31a 修改发料任务的扫描 1 month ago
niexiting aaf46bd33d Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
wangyufei b2e89e01b4 代码维护 1 month ago
zhang_li c60d94dccb 采购上架任务bug 1 month ago
niexiting a1f3fee1fe Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 4679fc2ec2 修改补料任务的推荐 1 month ago
zhang_li c534b06d4c 检验单打印页面不显示问题 1 month ago
wangyufei dcc474f523 成品发货 1 month ago
niexiting 5faae71e92 提交代码 1 month ago
niexiting e5e6fccc49 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting 0207d68575 修改按包装号过滤功能 1 month ago
wangyufei 15420552bd that报错 1 month ago
wangyufei 79c34eec7a 添加备注 1 month ago
wangyufei babf49cebf 成品发货任务--同一物料,可以扫描提交不在任务中的库位 1 month ago
wangyufei 9671661e04 发料,补料任务,查询,重置功能 1 month ago
niexiting c2f5c47a1b 修改发料筛选 1 month ago
niexiting 099cbf2c5e Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 1 month ago
niexiting fedf07772c 修改采购退货的校验 1 month ago
wangyufei 37f0fa259c 上拉加载更多数据 1 month ago
niexiting b929adb42e 修改生产线查询条件 1 month ago
niexiting f845bd9c8a 修改查询框 1 month ago
niexiting 472ce7a8d5 增加补料任务模糊查询功能 1 month ago
niexiting 6e9e4c67c1 修改发料任务筛选 1 month ago
niexiting 623bc18fae 修改提交 1 month ago
niexiting 04ff62bd8e 修改发料任务 1 month ago
niexiting c5a2c30498 修改发料明细的赋值 2 months ago
niexiting 53a6c55676 Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 2 months ago
niexiting 3e058c3aa1 修改发料任务执行功能 2 months ago
wangyufei f025ee1d49 是否继续 2 months ago
wangyufei d1dbad5380 先进先出发料加提示 2 months ago
wangyufei 8efe269405 判断物料代码 2 months ago
niexiting 34a71dc87f 隐藏掉包装名称 2 months ago
niexiting 2bcdac813c Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 2 months ago
niexiting b47b4dc384 修改发料任务的扫描 2 months ago
zhang_li 932b27d238 检验指引单显示问题 2 months ago
zhang_li 14952117a8 检验指引单按钮显示问题 2 months ago
wangyufei e0b42908d5 容错 2 months ago
niexiting d0f3957afb 修改版本 2 months ago
niexiting 35074a7896 修改赋值 2 months ago
niexiting 4bc8223f6e Merge branch 'hella_online_20240803' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into hella_online_20240803 2 months ago
niexiting 03a1108523 增加CreateProductputawayRequestAfterProductreceiptRecordCreated开关校验 2 months ago
wangyufei 55434c535c title问题 2 months ago
wangyufei 34dcffe6f6 显示ui问题 2 months ago
niexiting 07ae61e8e5 修改库存转移批量提交 2 months ago
niexiting dca73faa4c 修改补料任务 2 months ago
wangyufei e5dc3c7e07 引入 2 months ago
wangyufei bb339f4a04 喜婷--关:不用扫描目标库位 2 months ago
wangyufei 00c7142435 现场数量只展示20 2 months ago
zhang_li d119803e64 数据为空去掉打印按钮 2 months ago
wangyufei 86c0d3a6d4 邱晨提:现场的人不懂这个啥意思,并且这个也没啥影响。 2 months ago
wangyufei ddb9e59c40 扫描样式 2 months ago
wangyufei 852687bece 现场bug:长春海拉PDA线边发料任务筛选功能有问题,最多能显示10条数据 2 months ago
niexiting a53ea32abc 修改打印的跳转方式 2 months ago
wangyufei 11d164628a PC打印 2 months ago
lijuncheng 1f5b93e8df Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 4853bc97c7 修改装配收货明细样式 2 months ago
lijuncheng e2a212e442 添加包名 2 months ago
niexiting 52ac426659 修改版本号 2 months ago
zhang_li 91aa7c9eec bug 2 months ago
zhang_li 1b8105506f 打印 2 months ago
zhang_li ac00e4b979 装配bug 2 months ago
niexiting 346ff7dadd Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 428c493a25 修改直接上架 2 months ago
zhang_li ce637b31fe 打印采购收货 2 months ago
wangyufei f3f9c2207c UI样式 2 months ago
niexiting 9d76e00b8a 修改无计划完工 2 months ago
niexiting 8ec07d581c 修改样式 2 months ago
niexiting fea084033a 修改按计划完工 2 months ago
niexiting 6671b9a75b 修改样式 2 months ago
niexiting 8a53754329 修改直接上架 2 months ago
niexiting 922bb7898b 区分制品直接上架和装配直接上架 2 months ago
niexiting 90f3569ec2 修改直接上架 2 months ago
niexiting 0c579789f3 修改制品直接上架 2 months ago
niexiting 9861e328fe Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 3c8f4bf5f8 修改预生产上架 2 months ago
wangyufei 57e3bfcd0b 样式 2 months ago
niexiting 9aa14a8bee 修改批次的赋值 2 months ago
niexiting 9a8a293424 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 2eb864f2fc Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
wangyufei 1f3ce1388e 样式 2 months ago
niexiting 290e97ccdb 修改无计划完工 2 months ago
wangyufei 0b42c5eb4d 样式 2 months ago
wangyufei 4088c602ed 样式+默认选择物料 2 months ago
niexiting 5cbf9f019e 默认选择物料 2 months ago
niexiting dd565c0380 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 085868a42b 整理预生产上架功能 2 months ago
wangyufei 25583aabeb 生产线没传值 2 months ago
wangyufei 15e3754fbd 物料变更 2 months ago
niexiting 7b47169780 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 0995886427 修改制品直接上架功能 2 months ago
zhang_li 720ccb7be8 PDA线边发料任务详情中进行中状态压到了原料库位,且原料库位不应该为空 2 months ago
zhang_li f196c2c4e8 PDA预生产报工和装配报工扫描箱码编辑页面包装个数不正确 2 months ago
zhang_li 13daee251d 打印还原 2 months ago
niexiting 9df39f73b2 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting bee9f31488 修改制品直接上架及物料变更 2 months ago
zhang_li e9d797c27a PDA预生产报工和装配报工任务列表中,扫描箱码跳转到任务详情弹错,未直接变成扫描状态 2 months ago
zhang_li c32137458e 打印 2 months ago
niexiting dd36693b2d 修改按计划报工 2 months ago
niexiting f82bdf95ed Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 51f7882f62 增加参数的赋值 2 months ago
zhang_li 855bda3c75 长春海拉测试环境PDA创建发料申请页面不应该有从仓库代码项 2 months ago
zhang_li 76b0811241 bug 2 months ago
niexiting aabb5b1df3 整理样式 2 months ago
niexiting e118fa142e 增加样式 2 months ago
niexiting bb06d9c95c 修改样式 2 months ago
niexiting 2c7a88ee40 完善物料变更功能及按计划完工 2 months ago
zhang_li d696ee447b 打印 2 months ago
zhang_li c77aa345cf 打印接口 2 months ago
zhang_li 11d21d4b13 PDA隔离退料任务数量显示重叠 2 months ago
niexiting 7ed4ff1de0 增加物料变更功能 2 months ago
zhang_li 452761d2b8 打印 2 months ago
niexiting 685921703b 修改查询条件 2 months ago
niexiting 44db15d865 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 2e1b4bb68f 修改无计划完工 2 months ago
zhang_li d95b0fc036 长春海拉测试环境PDA制品回收任务扫描箱码弹错 2 months ago
lijuncheng 5a42a54da9 修改翻包打印功能 2 months ago
lijuncheng 44868c10d6 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
zhang_li 36a20a84e0 PDA隔离报工任务提交后,页面返回应该刷新,已完成的任务应该消失,目前没消失BUG 2 months ago
lijuncheng 2614e0bb49 修改盘点库位赋值 2 months ago
zhang_li 513ec5a63a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting d3d6259971 扫描后将扫描信息置顶 2 months ago
niexiting bb35c27145 修改扫描后的排序 2 months ago
niexiting df70ee395f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting f8cbd6cfad 提交成功后清除推荐信息 2 months ago
lijuncheng d3d7a4db9b 完工组件 2 months ago
lijuncheng c22abb2f8d 添加无计划报工 2 months ago
niexiting bb845c1493 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 2948094bbe 修改配置文件 2 months ago
lijuncheng a1c0a8f9de 添加组件 2 months ago
niexiting 0543304083 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 19ad1242fa 采购收货申请增加移除功能 2 months ago
lijuncheng 72b487b66e Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng db6d9ffcd4 修改发料先进先出 2 months ago
zhang_li b73c058e7f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
zhang_li 8819121a61 补料任务、发料任务,需要增加关闭任务功能,只有待处理的任务可以关闭 2 months ago
zhang_li ed8ce17a22 优先级显示问题 2 months ago
lijuncheng e42e1a825d Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng f552b6b67a 修改翻包任务扫描 2 months ago
zhang_li d577fd4469 PDA端处理多次触发事件,防止重复点击文件已添加,直接调用就行 2 months ago
niexiting d65b7cfdc4 增加先进先出发料功能 2 months ago
niexiting 1f01056843 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 2e8244cde7 增加先进先出直接补料 2 months ago
zhang_li ec4b1771a8 发料申请添加优先级 2 months ago
zhang_li 3ed8961d9c 发料任务优先级 2 months ago
lijuncheng cb06a3ef47 修改名字 2 months ago
lijuncheng 0f4ba9cb62 扫描叫料提交 2 months ago
lijuncheng a30a16f320 修改翻包 2 months ago
lijuncheng 6d33f3722f 发料接收添加生产线 2 months ago
lijuncheng 0f33a08905 扫描叫料添加优先级 2 months ago
lijuncheng cd29b1bc4d 修改盘点显示 2 months ago
lijuncheng b87b91a85e 修改翻包提示 2 months ago
lijuncheng 5b7c9b365d 修改翻包任务支持扫子扣父 2 months ago
lijuncheng d3ecd8699a 修改按计划报工 2 months ago
lijuncheng f95dd9aec1 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 0a7efcc351 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting c6c7a03dfa 修改明盘的查询条件 2 months ago
lijuncheng 8d7072a3d9 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng f80e546e98 修改发料和发料接收任务筛选 2 months ago
lijuncheng eb362df030 修改发料和发料接收任务筛选 2 months ago
lijuncheng 8f4abc38f9 修改翻包支持扫子扣父 2 months ago
lijuncheng e041b06fc3 修改显示单位 2 months ago
lijuncheng 3a3f01d6a8 修改提示 2 months ago
lijuncheng 8f350d3462 修改报工提示,修改上架任务查询提示 2 months ago
lijuncheng ad21ba9d38 修改计划完工 2 months ago
lijuncheng 5f0de76cb8 添加按包装号查询库存 2 months ago
niexiting 08a08b6975 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 0676d819e4 取消条件 2 months ago
lijuncheng 0eee8c8c60 修改盘点 2 months ago
lijuncheng 0e906a58a3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting ae70a4e6d5 增加校验 2 months ago
lijuncheng f5ed14a53a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting f2efcae5a8 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 60f6f7e2f8 修改打印 2 months ago
陈薪名 d4a2cc2d8b 直接翻包打印 优化 未完善 2 months ago
niexiting 7319b88fe9 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting caccc47374 修改盘点功能 2 months ago
lijuncheng 5b655d55cc Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 8ab3e67121 修改扫描 2 months ago
niexiting e9c98c38f8 增加总数量显示 2 months ago
niexiting 23570aa57f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 1ef7f2e8fc 修改盘点功能 2 months ago
lijuncheng 994ec5ca2c 修改扫描 2 months ago
niexiting 95c5a5f947 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 264d65868a 修改盲盘功能 2 months ago
lijuncheng 2ca84a5ac3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng c14f45f9b6 修改跳转任务自动扫描 2 months ago
Niext 577165bb0e 增加盲盘时的校验 2 months ago
niexiting 03d58da87b 修改明细组件 2 months ago
niexiting fe797443b0 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 6702628fc3 增加盘点相关组件 2 months ago
lijuncheng 21231e4b42 修改发料补料、备货 2 months ago
lijuncheng acf7a8e8ab 修改按计划完工 2 months ago
niexiting b321a9efb7 修改直接完工功能 2 months ago
niexiting 26d2988f6a 修改PDAd端的样式 2 months ago
niexiting 1ba0c24325 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 9d0fcc427d 修改显示样式 2 months ago
lijuncheng 6151d9c306 修改标题显示 2 months ago
lijuncheng 887cff4304 修改标题 2 months ago
lijuncheng d22ce86ad7 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
niexiting 10c5feb381 采购退货记录增加订单号和订单行的赋值 2 months ago
lijuncheng 59c1a0ac5f 按计划报工 2 months ago
niexiting 022a534a72 增加采购退货申请的赋值 2 months ago
niexiting ea7ce795b2 增加长春的完工功能 2 months ago
lijuncheng f6dc8ac567 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 444a22a154 修改采购上架显示错误 2 months ago
zhang_li 8951bc8caf 打印单位 2 months ago
lijuncheng baf9d49195 修改任务筛选查询 2 months ago
lijuncheng 522867af63 修改版本 2 months ago
lijuncheng e7b25bc2d6 修改计划外入库任务 2 months ago
lijuncheng 8263d01dc6 修改任务提示和任务筛选添加承接人 2 months ago
lijuncheng 16d6fc1ca7 直接发料清除物料 2 months ago
lijuncheng 6eded3ab5a 修改拆包数量 2 months ago
lijuncheng c480c1bef1 修改装配收货扫描 2 months ago
lijuncheng 5f8bdab46a 添加不合格转隔离 2 months ago
lijuncheng 2fbc89521a 修改拆包 2 months ago
lijuncheng 8e96b49fb1 修改重复扫描没有提示 2 months ago
lijuncheng 87b1180925 修改编译 2 months ago
lijuncheng 6505203cc2 修改采购退货 2 months ago
lijuncheng 3130e4fc75 直接补料扫描数量 2 months ago
lijuncheng 00682722b5 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 8bccf2e22b 修改装配上架扫描 2 months ago
wangyufei 81140cd3b6 器具管理标题 2 months ago
wangyufei c8550b8800 库存管理--标题 2 months ago
wangyufei 25338b2896 生产管理标题 2 months ago
wangyufei 8d62fb8c4e 发料管理动态标题 2 months ago
wangyufei 50321fdac4 原料管理--标题 2 months ago
wangyufei 66b46dbd00 采购拒绝 2 months ago
wangyufei 56f4edc128 单据查询模块--标题动态取 2 months ago
lijuncheng a57e217762 修改样式 2 months ago
lijuncheng 98374b342e 修改直接补料查询库存 2 months ago
lijuncheng 3e1400bc96 修改盘点任务扫描 2 months ago
lijuncheng 1c61e37949 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng 7974dd05f6 修改生产线显示中文 2 months ago
lijuncheng 3e8b80466c 修改翻包可以连续扫描 2 months ago
lijuncheng 1ff926df13 修改查询物料号添加库位和状态,修改扫描后清空 2 months ago
niexiting 64371643ef 修改拆包组件的显示 2 months ago
niexiting 12986c21e3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 2 months ago
lijuncheng f4979f1562 发料,补料按物料号查找最先的任务 2 months ago
wangyufei b6eeb59f2d 打印loading 2 months ago
lijuncheng 03843e32a6 优化扫描框 2 months ago
lijuncheng 20a01f95ac 修改盘点 2 months ago
lijuncheng e46529b30f 采购上架弹出扫描页面 2 months ago
lijuncheng 5ecf40301f 直接翻包不跳转到首页 2 months ago
lijuncheng ff0fae1d0e 修改库位字体变大 2 months ago
lijuncheng ef8d37726f 采购收货校验库位添加开关 2 months ago
lijuncheng ef13c07590 登录页面加版本号 2 months ago
wangyufei 703bae6cb7 业务类型 3 months ago
lijuncheng 22bdd6088f 修改样式 3 months ago
lijuncheng 0f6fbdf8bd 修改按库位查询库存 3 months ago
lijuncheng 190cb66f12 修改直接发料和发料任务扫描小包装 3 months ago
lijuncheng 07f811dcd2 补料包装 3 months ago
lijuncheng 2ba850365a 添加接口 3 months ago
lijuncheng a462aa4553 直接翻包 不扫描库位 3 months ago
lijuncheng 2ff626ac13 修改备货任务扫描其他批次选不中 3 months ago
lijuncheng 17453d538a 修改补料 3 months ago
niexiting 8bf9529dee Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
niexiting d8d9a98fcc 增加组件 3 months ago
lijuncheng dcfc2de656 恢复上架推荐库位 3 months ago
lijuncheng bd6edb3bb2 修改上架推荐库位 3 months ago
lijuncheng d33c18bbec 修改直接补料 3 months ago
lijuncheng 984fc9d606 修改扫描叫料 3 months ago
lijuncheng 1aa078bafe Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng bce4898c20 不可以输入负数 3 months ago
niexiting bbcf70e004 新增页面 3 months ago
niexiting 65ad620eea Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
niexiting 27e2899161 重新封装一个扫描组件 3 months ago
lijuncheng 5dbb1b4588 修改盘点任务顺序倒序 3 months ago
lijuncheng a3bc8abbe2 修改配置文件 3 months ago
lijuncheng bfe4bd2201 修改盘点 3 months ago
lijuncheng 1079e8d646 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 7cfa9ba78e 修改盘点 3 months ago
wangyufei 030b04b451 打印:制造件标签 3 months ago
lijuncheng f33b772dbe 修改直接补料箱码重复扫描校验 3 months ago
wangyufei ba23442990 盘点库位 3 months ago
lijuncheng c779e95e98 修改发料自动提交 3 months ago
lijuncheng 80b3042b18 修改盘点扫描任务排序 3 months ago
lijuncheng 3b49f5be9d Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 25b50d5638 修改盘点扫描 3 months ago
wangyufei 6323e895c3 目标库位 3 months ago
wangyufei 64a920de56 VITE_TENANT 3 months ago
wangyufei 1d598e816c 字体加粗,放大两个字号 3 months ago
wangyufei ba09ec2028 长春pda盘点任务,页面多个“个”字 3 months ago
wangyufei d9ce8c6848 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei 4806229c2d 租户环境 3 months ago
niexiting af7fa46e7f 修改productDate的赋值 3 months ago
niexiting c2eddadbdf 取消Mes标签中的生产日期和批次 3 months ago
niexiting 60818e9066 完善Mes标签解析的提示 3 months ago
niexiting 87f1d216a3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei f2e9b156e0 字段 3 months ago
wangyufei 442eec9995 字段 3 months ago
lijuncheng f30ee6d70f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 2f89f1a25c 修改库位必须校验大小写 3 months ago
wangyufei debe4a8915 itemcode 3 months ago
wangyufei afd099e004 fromlocationcode 3 months ago
wangyufei 4c3966c183 toLocationCode 3 months ago
wangyufei 2f4fa85a58 新加字段 3 months ago
wangyufei 4e0dd695fb 去掉数量 3 months ago
wangyufei e05444bba7 盘点任务去掉数量 3 months ago
wangyufei 78fa700cf1 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei 7e533122f7 成品发货任务 3 months ago
lijuncheng 101aa144e5 修改拒收功能 3 months ago
lijuncheng d72a0e1b9b Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 9507f591f0 修改计划外出库记录 3 months ago
wangyufei cd9a8a2f81 成品发货 3 months ago
lijuncheng 0d39c46f7e 优化消息提示 3 months ago
lijuncheng d73d3170a8 修改查询库存状态 3 months ago
wangyufei 0dfcd38f6f 盘点任务过滤去掉 3 months ago
wangyufei 1591a96398 盘点任务bug 3 months ago
wangyufei 423915014f PDA所有任务都加承接人校验 3 months ago
wangyufei b57c42b20d 成品入库--上拉加载 3 months ago
陈薪名 ce41be1f6b 增加头部信息 后端添加过滤承接人条件 3 months ago
wangyufei 7aa011367c 调拨入库申请--点击库位没反应 3 months ago
lijuncheng 73a29a9139 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng db5cc9e986 修改扫描叫料光标和版本号显示 3 months ago
wangyufei b1a00236ba 和俊诚保持一致,返回直接到任务 3 months ago
lijuncheng 2247f1ce48 修改直接补料和补料任务库存匹配 3 months ago
lijuncheng 872f18bcbb Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng d3dc9d1f72 修改补料数量显示不对 3 months ago
zhaoxuebing b9b4703ac7 修改数量 3 months ago
wangyufei e8afa08675 回车事件 3 months ago
wangyufei 0abf867a0d 筛选 3 months ago
lijuncheng baeb8fe44b Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng bd869f9bd7 修改补料任务提交 3 months ago
wangyufei 8ca3d13e3c 采购收货任务-扫描ASN 3 months ago
lijuncheng a144a2485a 修改直接补料 3 months ago
wangyufei c178901d52 生产线--下拉框 3 months ago
wangyufei 60c07403e4 采购收货任务--扫描ASN 3 months ago
wangyufei e5db860c41 bug 修复 3 months ago
lijuncheng 67d891f59a 修改装配收货打印返回到任务列表 3 months ago
lijuncheng 0eb6365958 生产收料去除查询管理模式,在后端查询 3 months ago
lijuncheng c9417c7149 修改发料跳转 3 months ago
lijuncheng ab8e5fe15e Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng ac927c3d60 修改发料扫描任务 3 months ago
wangyufei 5202489224 打印 3 months ago
lijuncheng 4b0d6857e9 修改发料任务 3 months ago
lijuncheng bd90f6eb94 发料任务跳转到详情 3 months ago
lijuncheng fc1127b0c4 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 1905bc71ae 修改发料不使用在途库 3 months ago
wangyufei 37c5ed0c10 任务列表加筛选状态 3 months ago
zhang_li 6f0c491740 打印样式修改 3 months ago
wangyufei 5ae6174b2a 直接翻包--缓存库位功能 3 months ago
wangyufei 1976767453 PDA采购收货任务执行,是否打印的开关 3 months ago
wangyufei 953349cddf 扫描功能 3 months ago
lijuncheng 92942ea474 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 06eebdd125 修改装配上架任务为成品入库任务 3 months ago
陈薪名 025261565f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
陈薪名 333427db6b 采购收货 打印 数量修改 3 months ago
wangyufei 54189f6128 任务列表直接扫描 3 months ago
陈薪名 a0afbf3966 采购收货执行 打印修改 数量问题 3 months ago
lijuncheng c52f9a1426 修改发料提交不是任务批次失败 3 months ago
lijuncheng 0592a6dd50 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei db43a52425 模拟扫描 3 months ago
wangyufei 2cd14de25b 模拟扫描功能 3 months ago
zhang_li ce63c3983d 打印数据bug 3 months ago
zhang_li 4617ffbe33 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
zhang_li 831f84fd40 打印时间显示和接口问题 3 months ago
wangyufei 7d2eec95d2 模拟扫描功能 3 months ago
niexiting 7fac613bd9 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng b01fa16f2e Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei 07d7918708 this.showErrorMessage("请选择目标包装规格") 3 months ago
lijuncheng 3b0dbda1da Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng a1e6ec03c1 修改警告 3 months ago
wangyufei 2e13528e16 扫描提示 3 months ago
lijuncheng ca78bd093b Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 5baab70e77 修改补料移除 3 months ago
wangyufei 02048a8413 toBatch 3 months ago
wangyufei 80788b560d 打印时间自己算 3 months ago
wangyufei 7fc04491da 添加type条件 3 months ago
niexiting 8a30cc7cd3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
wangyufei abae5057c3 直接翻包 3 months ago
lijuncheng 46da16cd4f 添加app图标 3 months ago
wangyufei 40ae9cf066 解决bug:成都 成品发货任务,不扫箱码直接提交,能提交成功 3 months ago
wangyufei 7a7b0f5bff 扫描叫料isCallMaterialsLabel = "TRUE"; 3 months ago
wangyufei c3407bfabf 打印bug 3 months ago
wangyufei 834bf0a12e 翻包打印 3 months ago
lijuncheng 442e877896 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 91a2fd0c1b 修改装配上架任务提交 3 months ago
wangyufei 9e74f3242e 装配收货任务打印 3 months ago
wangyufei 9baefe421a 上架模块fromInventoryStatus 3 months ago
lijuncheng 607284e703 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 66c38efc42 修改预生产收货任务 提交报错 3 months ago
wangyufei 1aadce221f 上架隐藏状态 3 months ago
lijuncheng 739c621c33 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng ea668e5b30 修改发料 3 months ago
wangyufei 200950c993 查询库存余额--大哥让去掉 fromInventoryStatuses 3 months ago
niexiting b3526cd99f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 5d283a233d Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 93e7e4a6a6 修改收货库位大小 3 months ago
wangyufei 556dbfbbe6 补料详情--编辑--计算数量 3 months ago
zhang_li 825343562e 采购收货打印功能 3 months ago
niexiting 6235e2ce3f Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
niexiting 8b8ad96dce 修改制品上架任务 3 months ago
lijuncheng 6b8a304b40 预生产收货库位提示 3 months ago
lijuncheng 40e5655fc6 修改查询库存状态和制品发货参数 3 months ago
lijuncheng 571c86f95c 修改查询库存状态 3 months ago
lijuncheng dd09967678 修改直接补料 3 months ago
yufei0306 03aa0559e4 +1 3 months ago
yufei0306 e16b0aa9b8 去掉从仓库代码W1 3 months ago
yufei0306 8c799e4069 报错代码 3 months ago
yufei0306 93d746f45f 现场需求:点击遮罩不关闭弹窗 3 months ago
yufei0306 308a854728 包装规格 3 months ago
zhang_li 8241cb8888 首页 3 months ago
yufei0306 6b89f51a0b 上拉加载更多 3 months ago
lijuncheng b9c4169441 修改装配完工收货校验 3 months ago
lijuncheng 75c5eb1746 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 3 months ago
lijuncheng 41ebac85d9 修改装配收货任务提交 3 months ago
yufei0306 4974de75e4 制品直接上架 3 months ago
yufei0306 181b82e30c 预生产任务type传值 3 months ago
yufei0306 b2d7ed436e 装配直接上架 3 months ago
yufei0306 2b3d3407db 预生产收货任务列表--上拉加载 3 months ago
lijuncheng 4a8d7cd833 弹出软键盘 4 months ago
lijuncheng 858cf07e72 修改装配收货 4 months ago
lijuncheng 8992042d50 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
lijuncheng c9df467047 补料记录 装配收货添加配置 4 months ago
yufei0306 eb7e212674 1、修复--退货任务详情页面--编辑无反应报错问题 4 months ago
lijuncheng e2f56a429a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
lijuncheng 65984a7747 修改直接采购上架记录 4 months ago
yufei0306 f48c13b295 客户要求显示复制按钮 4 months ago
yufei0306 8f11fe53e1 修复bug:PDA采购退货任务中数字显示串行 4 months ago
yufei0306 74d4fbc256 去断点 4 months ago
Niext 3267c9dd4f 修改采购退货申请 4 months ago
lijuncheng 529ed07161 修改主页面滚动 4 months ago
lijuncheng 15fffc3938 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
lijuncheng 85a8549322 修改制品回收和采购上架 4 months ago
yufei0306 74911a88cb bug修复 4 months ago
lijuncheng 1c491af3f3 修改滑动组件初始化 4 months ago
yufei0306 121712ab8e 计算数量 4 months ago
yufei0306 78a741f1d3 发货类型 4 months ago
yufei0306 41460ca259 库位扫描bug 4 months ago
yufei0306 d6605482bc 修改提示 4 months ago
yufei0306 95007ee992 制品回收记录 4 months ago
yufei0306 0de8d970a7 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
yufei0306 5ef9045127 修复项目中只看今天报错的bug 4 months ago
niexiting 3a2044f7ed Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting 17e043e30c 修改补料任务的执行 4 months ago
yufei0306 6fd95dfac8 bug修复 4 months ago
niexiting 000872176b Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting bd2e8b49fa 发料任务自动提交 4 months ago
yufei0306 3eb6e4ff0f 装配收货H5端打印功能 4 months ago
yufei0306 fe5fdede4e 包装号变量 4 months ago
yufei0306 51f8d7c6e7 打印接口 4 months ago
yufei0306 c41602a2b5 装配收货--打印功能 4 months ago
yufei0306 a925e1827c 修改配置环境 4 months ago
niexiting 42a45d5abf 修改上架任务 4 months ago
yufei0306 c9106101cd 补料任务,来源库位 4 months ago
songguoqiang d127d63f6d fix: 发料任务 补料任务分页查询根据来源库位正序排列 4 months ago
yufei0306 5c7cba5b60 预生产收货任务 4 months ago
yufei0306 a03bbbf86a 箱标签/ASN 4 months ago
yufei0306 62328a3123 采购收货任务--1. 再扫描时最好可以兼容扫描ASN编号和箱标签,扫描任务编号的按钮隐藏掉 4 months ago
yufei0306 abe0e8da16 发料任务筛选中增加:生产线、来源库位 4 months ago
yufei0306 5e1f2820ee 测试环境 4 months ago
yufei0306 69e6a564cb 任务添加判断,修改扫描查询条件 4 months ago
niexiting 749aaf547c Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting 8985ed091a 修改扫描组件 4 months ago
yufei0306 7d6fa392bc 发料任务-编辑修改 4 months ago
yufei0306 57adc01844 解决WMS设置不可编辑,PDA可以修改的问题 4 months ago
yufei0306 6265b5f694 PDA WMS 允许修改库位设置为否,装配收货任务不应该可以修改库位 4 months ago
yufei0306 895f07961d # 是否是测试环境 4 months ago
yufei0306 b132c5f890 发料任务bug+新需求 4 months ago
yufei0306 09366286f2 新需求 4 months ago
yufei0306 59bdee3ab7 发料未扫描不能上传 4 months ago
yufei0306 15e435e691 需求:PDA制品发货时,厂内标签与客户标签的校验 4 months ago
yufei0306 59c9aecf11 生产退料 4 months ago
yufei0306 27092c9dff 打包报错 4 months ago
yufei0306 271d6e0c39 提交 4 months ago
yufei0306 a4fc2697b1 筛选当天 4 months ago
yufei0306 3a779bb9ca 采购上架 4 months ago
yufei0306 598b24f495 拒收接口 4 months ago
yufei0306 e6e606ca0e 任务扫描Go列表超出滚动+去重 4 months ago
niexiting f25f4a54b3 增加成本标签校验 4 months ago
niexiting e4b4632a29 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting db25fa87fa 修改配置 4 months ago
lijuncheng 1ccdeabc43 修改配置 4 months ago
lijuncheng 721b2e5023 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
lijuncheng 74ee9afb34 修改翻包 4 months ago
niexiting 9417b21505 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting 89f14bc889 修改复制 4 months ago
yufei0306 1b54ab0043 去掉复制 4 months ago
lijuncheng 593221f9d4 修改发料 4 months ago
yufei0306 483f132025 PDA 采购收货任务 我只扫描了一个,另一个没扫描,提交成功,不提示还有未扫描的货物 4 months ago
yufei0306 98b9d50e65 发布 4 months ago
yufei0306 782bc9338c 租户环境 4 months ago
yufei0306 530e081112 直接发料功能 4 months ago
yufei0306 d56f7d350a PDA 装配收货任务扫满箱后应该自动提交 4 months ago
yufei0306 e8285275f1 更换提示语 4 months ago
yufei0306 81ba95f72f 包装规格不一致 4 months ago
yufei0306 821a00b0f9 采购收货任务中筛选功能不好使 4 months ago
yufei0306 774673db69 未扫码不能上传 4 months ago
niexiting 14eb1ea494 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
yufei0306 ad1f917aae 任务列表添加扫描功能 4 months ago
niexiting 6d0ff67faa Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 4 months ago
niexiting e70999633d 修改直接发料功能 4 months ago
yufei0306 220ba45e18 PDA打印功能 4 months ago
niexiting 9d6f0981ec 修改直接库存转移 5 months ago
niexiting 80646d47c8 修改样式 5 months ago
niexiting e91a0f5909 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting a557f5be70 修改库存转移赋值 5 months ago
zhang_li 61084b90ca 多条打印 5 months ago
Niext 2f61b30b4b 修改成品发货 5 months ago
niexiting 6cb5b7840a 修改地址 5 months ago
niexiting 143e95c540 修改上加任务问题 5 months ago
niexiting fbe96a097b 修改制品上架任务 5 months ago
niexiting 95de5ee2b3 修改装配收货任务的提交 5 months ago
Niext 11a0986d6b Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
Niext 965f7e81cc 修改样式 5 months ago
lijuncheng b023fad1f0 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
lijuncheng dfd3742667 修改配置 5 months ago
zhang_li f6f44c02bb 打印 5 months ago
zhang_li e19c63b2d3 app判断 5 months ago
lijuncheng 2fcc173aad Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
lijuncheng 25eb91a677 添加打印功能 5 months ago
zhang_li 813738ef39 翻包任务,发货单,采购收货,采购拒绝 5 months ago
zhang_li 191a9ca271 采购收货管理合格转隔离,隔离转合格,隔离转报废,合格转报废,报废转隔离,库存移动 主子合并 5 months ago
liuchen864 0dbb038e57 修改bug 5 months ago
zhang_li 11609288fb 调拨出库 计划外出库 计划外入库 报废出库 主子合并 5 months ago
zhang_li 9b0818564b 成品发货申请 成品发货任务 客户退货申请 客户退货任务 5 months ago
niexiting c7ef460c8a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting aac9333bc9 修改合格转隔离功能 5 months ago
zhang_li becd39f135 预生产收货 装配收回 制品回收 报废收货 制品上架主子合并 5 months ago
niexiting 9725bd4a7a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting ab46faec0a 上架增加库存状态的显示 5 months ago
zhang_li 0ba1a3439d 生产退料 生产合格退料申请 生产隔离退料申请 主子合并 5 months ago
zhang_li e092299817 采购上架任务主子合并,删掉注释 5 months ago
zhang_li 4109a37d70 采购退货申请,采购退货任务主子合并,补料申请 5 months ago
zhang_li 3945e8c62c 采购退货申请主子合并 5 months ago
niexiting 0459a9b101 修改样式 5 months ago
niexiting 501062b03b 修改翻包样式 5 months ago
niexiting 06c418c66c 整理PDA样式 5 months ago
niexiting 96978e396a Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting 832778a318 修改发货记录查询 5 months ago
lijuncheng 77d6dc77d6 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
lijuncheng ddb00b8e8c 配置开关 5 months ago
niexiting 3100ee0625 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting f3ad067992 修改样式 5 months ago
zhang_li 00e5d71199 打印功能 5 months ago
niexiting 2d2b0928a2 修改供应商发货记录扫码功能 5 months ago
niexiting 0ad4051cbc 修改菜单样式 5 months ago
niexiting 2a61a76747 增加拒收功能 5 months ago
niexiting b2996bc205 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting a16bdb3639 修改样式及翻包功能 5 months ago
lijuncheng 1f35ccc894 修改库位校验 5 months ago
zhang_li 6f09def9de 判断修改 5 months ago
zhang_li 11598d0fe9 采购上架任务详情组件 5 months ago
niexiting 4f628eef9f 修改状态 5 months ago
niexiting 7eb925f20d Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting de241ef8f6 修改上架任务请求 5 months ago
liuchen864 26981d77e1 修改端口和命令 5 months ago
zhang_li 64831c1f73 分环境 5 months ago
zhang_li 19a677fcc1 地址分环境 5 months ago
liuchen864 4da7dcc15f 统一文件名 5 months ago
liuchen864 e209873949 修改海拉环境 5 months ago
liuchen864 2981c09a62 更改nginx配置 5 months ago
niexiting 97fb039d25 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting ebe3e03872 修改上架任务卡片 5 months ago
lijuncheng 77d44406e0 修改更新 5 months ago
niexiting 033dbb39d0 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
lijuncheng 29284fb824 修改升级 5 months ago
lijuncheng 13039715d5 修改库位扫描标签 5 months ago
lijuncheng a197bf484f 修改采购上架 5 months ago
lijuncheng 725adb6a5c 修改采购收货显示 5 months ago
niexiting 558b3b400e Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 5 months ago
niexiting a8d2d7e890 修改发货 5 months ago
lijuncheng fff686d287 修改计划外出库校验 6 months ago
lijuncheng 9525533074 修改默认库位提示。预生产收货任务提示 6 months ago
lijuncheng 1ec30743b1 装配收货任务 6 months ago
lijuncheng dfb9194b13 修改补料参数赋值 6 months ago
lijuncheng 5c9165bc75 装配任务扫码校验 6 months ago
niexiting 49959e3862 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
niexiting 9bda5815a0 修改组件的显示 6 months ago
lijuncheng b2bb54b6c7 修改提示 6 months ago
lijuncheng 0ba5894242 报废收货任务 6 months ago
lijuncheng e07512faf6 删除无用文件 6 months ago
lijuncheng 2a2509e2d4 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
niexiting 0a1235c223 修改功能 6 months ago
lijuncheng 677a9f7d10 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
lijuncheng d9fb5fecc5 修改提示 6 months ago
niexiting 837339efb0 修改备货申请 6 months ago
niexiting 44a8f369d5 修改备货任务 6 months ago
niexiting e2f9b05134 修改备货任务 6 months ago
lijuncheng 9582c1d183 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
lijuncheng 95c6594fa3 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
niexiting 4fc1029961 修改库存转移功能 6 months ago
niexiting e50e73f3e0 修改制品收货 6 months ago
niexiting 6241e913ae 修改补料功能 6 months ago
lijuncheng 8d354069eb 制品回收 6 months ago
niexiting 244c2042c9 修改补料任务 6 months ago
niexiting 07082655da 修改发料功能 6 months ago
niexiting 351ae12524 增加组件 6 months ago
niexiting 9a7677546f 移除组件 6 months ago
niexiting f5d1e37384 增加组件 6 months ago
niexiting 3462f73287 移除文件 6 months ago
niexiting ab69394079 修改装配收货 6 months ago
niexiting 7cd4df004d 修改制品完工收货 6 months ago
niexiting cf3e1311fd Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 6 months ago
niexiting c0c637388a 增加新页面 6 months ago
lijuncheng 4f173f179d 修改推荐库位 6 months ago
lijuncheng e83e6a4512 修改采购收货 6 months ago
lijuncheng d27bcf2313 添加备货任务,修改标题更新 6 months ago
lijuncheng e31d10e346 修改数据权限错误 6 months ago
lijuncheng f796ccac69 直接备货任务 6 months ago
lijuncheng b8ff5958ad 修改来源库区校验 6 months ago
lijuncheng c4450633fb 修改翻包记录 6 months ago
lijuncheng 8c54221efa 翻包任务 6 months ago
lijuncheng eb44fa07b8 翻包任务 6 months ago
lijuncheng 04997d2d1e 修改注释 6 months ago
lijuncheng ac9d1b0458 修改采购收货扫描数量 6 months ago
lijuncheng 086fc126d9 采购上架编辑修改 6 months ago
lijuncheng 061f57a2f5 采购上架任务 6 months ago
lijuncheng 3b1fcc747d 修改采购收货编辑 6 months ago
lijuncheng db2b76947e 修改单位名称 6 months ago
lijuncheng 3cffde3b2f 采购收货,提交没收货的赋值为0 6 months ago
lijuncheng 98f6a409bd 修改配置文件 6 months ago
niexiting 8e4ce6de11 修改列表样式 7 months ago
niexiting f6b5639e6d 修改复制按钮样式 7 months ago
lijuncheng f5d2e2ace1 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 7 months ago
lijuncheng fe91a3f283 采购收货扫描数据逻辑验证 7 months ago
liuchen864 5ca1cc49e7 修改nginx版本 7 months ago
niexiting 3167e9e482 增加包装组件 7 months ago
陈薪名 32c46f219c 修改大小 7 months ago
陈薪名 3c19692f8e 修改大小 7 months ago
陈薪名 c8519dfc3d 修改大小 7 months ago
陈薪名 2fd174658e 修改大小写 7 months ago
陈薪名 1fa968c4ae 修改大小写 7 months ago
陈薪名 a8353597d4 修改大小写 7 months ago
陈薪名 cae517392c 修改文件 7 months ago
lijuncheng 4467f0a6b1 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 7 months ago
lijuncheng 67a30941d2 修改文件 7 months ago
陈薪名 927b162255 配置文件修改 7 months ago
lijuncheng 3851d362da Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 7 months ago
lijuncheng c342722ca9 修改打包命令 7 months ago
niexiting c1bb7601b0 Merge branch 'master_hella' of http://dev.ccwin-in.com:3000/sfms3.0/sfms3.0-uniapp into master_hella 7 months ago
niexiting 29c71637f5 修改采购收货任务列表 7 months ago
lijuncheng 6b63aaf4d4 修改编译大小写问题 7 months ago
lijuncheng 9610965086 添加主页面搜索菜单功能 7 months ago
niexiting 6d3fdb8c57 修改样式 7 months ago
niexiting 1df31bb8bc 修改推荐数量和实际数量的对比 7 months ago
niexiting bd9e6a0afb 修改采购收货、修改包装规格 7 months ago
lijuncheng 068bd7c003 隐藏软件盘 7 months ago
lijuncheng da4c5c11e2 修改任务库位,推荐库位,采购收货整单收货按钮 7 months ago
lijuncheng be9985d925 删除无用代码 7 months ago
  1. 11
      .env.development
  2. 11
      .env.hella13
  3. 11
      .env.hella14
  4. 11
      .env.hella15
  5. 11
      .env.hella16
  6. 12
      .env.hella8
  7. 11
      .env.hella9
  8. 12
      .env.production
  9. 12
      .env.test
  10. 4
      .hbuilderx/launch.json
  11. 7
      Dockerfile
  12. 7
      Dockerfile_prod
  13. BIN
      nativeplugins/TestModule/android/TestModule.aar
  14. BIN
      nativeplugins/TestModule/libs/itextpdf-5.5.8.jar
  15. 35
      nativeplugins/TestModule/package.json
  16. 53
      nginx.conf
  17. 57
      nginx_prod.conf
  18. 11747
      package-lock.json
  19. 23
      package.json
  20. 11
      src/App.vue
  21. 149
      src/api/httpRequest3.js
  22. 196
      src/api/img-to-base64.js
  23. 1023
      src/api/request2.js
  24. 117
      src/common/appUpdate.js
  25. 41
      src/common/array.js
  26. 119
      src/common/balance.js
  27. 202
      src/common/basic.js
  28. 4
      src/common/config.js
  29. 202
      src/common/detail.js
  30. 132
      src/common/directory.js
  31. 84
      src/common/label.js
  32. 44
      src/common/noclick.js
  33. 90
      src/common/record.js
  34. 120
      src/common/style/new_style.css
  35. 28
      src/common/style/pdabasic.css
  36. 17
      src/common/utils/storage.js
  37. BIN
      src/components/kk-printer/empty-icon.png
  38. 416
      src/components/kk-printer/index.vue
  39. 402
      src/components/kk-printer/utils/barcode.js
  40. 723
      src/components/kk-printer/utils/bluetoolth.js
  41. 23
      src/components/kk-printer/utils/index.js
  42. 14633
      src/components/kk-printer/utils/mqtt.js
  43. 1
      src/components/kk-printer/utils/mqtt.min.js
  44. 285
      src/components/kk-printer/utils/printUtil-GBK.js
  45. 778
      src/components/kk-printer/utils/qrcode.js
  46. 171
      src/components/kk-printer/utils/util.js
  47. 7
      src/components/show-modal/show-modal.vue
  48. 84
      src/hybrid/html/point.html
  49. 131
      src/hybrid/html/pointPutawayJob.html
  50. 78
      src/hybrid/html/purchaseReceiptJob.html
  51. 7
      src/main.js
  52. 51
      src/manifest.json
  53. 39
      src/mycomponents/balance/balance.vue
  54. 2
      src/mycomponents/balance/balanceDetailPopup.vue
  55. 2
      src/mycomponents/balance/balanceMove.vue
  56. 24
      src/mycomponents/balance/balanceSelect.vue
  57. 2
      src/mycomponents/balance/batch.vue
  58. 10
      src/mycomponents/balance/bussinessType.vue
  59. 15
      src/mycomponents/balance/handleBalance.vue
  60. 37
      src/mycomponents/balance/level.vue
  61. 39
      src/mycomponents/balance/light.vue
  62. 4
      src/mycomponents/balance/location.vue
  63. 7
      src/mycomponents/balance/pack.vue
  64. 4
      src/mycomponents/balance/toLocation.vue
  65. 0
      src/mycomponents/batch/batch.vue
  66. 11
      src/mycomponents/common/comBlankView.vue
  67. 4
      src/mycomponents/common/comListHint.vue
  68. 8
      src/mycomponents/common/comListItem.vue
  69. 102
      src/mycomponents/common/comMessage.vue
  70. 36
      src/mycomponents/detail/comDetailCard.vue
  71. 163
      src/mycomponents/detail/comJobDetailCard.vue
  72. 1
      src/mycomponents/detail/comRequestDetailCard.vue
  73. 10
      src/mycomponents/detail/detailBalanceInfo.vue
  74. 8
      src/mycomponents/detail/detailCommonInfo.vue
  75. 2
      src/mycomponents/detail/detailHandleInfo.vue
  76. 8
      src/mycomponents/detail/detailItemInfo.vue
  77. 146
      src/mycomponents/detail/detailList.vue
  78. 10
      src/mycomponents/detail/detailPackageInfo.vue
  79. 10
      src/mycomponents/detail/detailRecommendInfo.vue
  80. 6
      src/mycomponents/detail/jobDetailPopup.vue
  81. 4
      src/mycomponents/detail/recordDetailCommonInfo.vue
  82. 6
      src/mycomponents/detail/recordDetailPopup.vue
  83. 4
      src/mycomponents/detail/requestDetailBasicInfo.vue
  84. 4
      src/mycomponents/detail/requestDetailCommonInfo.vue
  85. 4
      src/mycomponents/item/item.vue
  86. 21
      src/mycomponents/item/itemCompareQty.vue
  87. 149
      src/mycomponents/item/itemFilter.vue
  88. 4
      src/mycomponents/item/itemInfoPopup.vue
  89. 12
      src/mycomponents/item/itemQty.vue
  90. 2
      src/mycomponents/item/itemRecommendQty.vue
  91. 47
      src/mycomponents/job/jobAccept.vue
  92. 4
      src/mycomponents/job/jobBottom.vue
  93. 2
      src/mycomponents/job/jobCard.vue
  94. 12
      src/mycomponents/job/jobComMainCard.vue
  95. 41
      src/mycomponents/job/jobComMainCardAsn.vue
  96. 88
      src/mycomponents/job/jobComMainDetailCard.vue
  97. 6
      src/mycomponents/job/jobCommonInfo.vue
  98. 6
      src/mycomponents/job/jobDetailPopup.vue
  99. 195
      src/mycomponents/job/jobFilter.vue
  100. 4
      src/mycomponents/job/jobInfoPopup.vue

11
.env.development

@ -0,0 +1,11 @@
VITE_BASE_URL=http://172.22.32.9:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.22.32.9:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.22.32.9:90'

11
.env.hella13

@ -0,0 +1,11 @@
VITE_BASE_URL=http://172.21.32.13:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.21.32.13:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"长春1379","value":1}]'
# 是否是测试环境
VITE_isDevelopment=false
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.21.32.13:90'

11
.env.hella14

@ -0,0 +1,11 @@
VITE_BASE_URL=http://172.21.32.14:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.21.32.14:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"长春1379","value":1}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.21.32.14:90'

11
.env.hella15

@ -0,0 +1,11 @@
VITE_BASE_URL=https://scp.faway-hella.com:81/api/admin-api
VITE_BASE_URL_IMAGE=https://scp.faway-hella.com:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"长春1379","value":1}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='https://scp.faway-hella.com'

11
.env.hella16

@ -0,0 +1,11 @@
VITE_BASE_URL=https://scptest.faway-hella.com:81/api/admin-api
VITE_BASE_URL_IMAGE=https://scptest.faway-hella.com:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"长春1379","value":1},{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='https://scptest.faway-hella.com'

12
.env.hella8

@ -0,0 +1,12 @@
VITE_BASE_URL=http://172.22.32.8:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.22.32.8:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=false
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.22.32.8:90'

11
.env.hella9

@ -0,0 +1,11 @@
VITE_BASE_URL=http://172.22.32.9:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.22.32.9:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.22.32.9:90'

12
.env.production

@ -0,0 +1,12 @@
VITE_BASE_URL=http://172.22.32.8:81/api/admin-api
VITE_BASE_URL_IMAGE=http://172.22.32.8:81/admin-api
# 租户配置
VITE_TENANT='[{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=false
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://172.22.32.8:90'

12
.env.test

@ -0,0 +1,12 @@
VITE_BASE_URL=http://dev.ccwin-in.com:25300/api/admin-api
VITE_BASE_URL_IMAGE=http://dev.ccwin-in.com:25300/admin-api
# 租户配置
VITE_TENANT='[{"text":"长春1379","value":1},{"text":"成都1397","value":2},{"text":"长春2379","value":3}]'
# 是否是测试环境
VITE_isDevelopment=true
# 积木报表请求路径
VITE_JMREPORT_BASE_URL='http://dev.ccwin-in.com:25310'

4
.hbuilderx/launch.json

@ -15,6 +15,10 @@
{
"openVueDevtools" : true,
"type" : "uni-app:h5"
},
{
"playground" : "standard",
"type" : "uni-app:app-android"
}
]
}

7
Dockerfile

@ -0,0 +1,7 @@
# 设置基础镜像
FROM win-nginx
WORKDIR /opt/sfms3.0-uniapp
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
# 将dist/build/h5/文件中的内容复制到 /opt/sfms3.0-uniapp 这个目录下面
COPY dist/build/h5/ /opt/sfms3.0-uniapp

7
Dockerfile_prod

@ -0,0 +1,7 @@
# 设置基础镜像
FROM win-nginx
WORKDIR /opt/sfms3.0-uniapp
COPY nginx_prod.conf /usr/local/nginx/conf/nginx.conf
# 将dist/build/h5/文件中的内容复制到 /opt/sfms3.0-uniapp 这个目录下面
COPY dist/build/h5/ /opt/sfms3.0-uniapp

BIN
nativeplugins/TestModule/android/TestModule.aar

Binary file not shown.

BIN
nativeplugins/TestModule/libs/itextpdf-5.5.8.jar

Binary file not shown.

35
nativeplugins/TestModule/package.json

@ -0,0 +1,35 @@
{
"name": "TestModule",
"id": "TestModule",
"version": "1.0.0",
"description": "打印",
"_dp_type": "nativeplugin",
"_dp_nativeplugin": {
"android": {
"integrateType": "aar",
"plugins": [
{
"type": "module",
"name": "TestModule",
"class": "io.dcloud.uniplugin.TestModule"
}
]
}
}
}

53
nginx.conf

@ -0,0 +1,53 @@
user root;
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
charset utf-8,gbk;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time $upstream_response_time"';
proxy_cache_path /opt/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 600s;
client_max_body_size 200m;
gzip on;
gzip_min_length 10k;
gzip_comp_level 9;
gzip_buffers 4 16k;
gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
upstream sfms3.0 {
server localhost:25310 weight=10 max_fails=3 fail_timeout=10s;
}
server {
listen 25302;
server_name_in_redirect off;
server_name _;
location /api/ {
proxy_pass http://sfms3.0/;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
}
location / {
proxy_cache my_zone;
proxy_cache_valid 200 304 12h;
proxy_cache_key $host$uri$is_args$args;
try_files $uri $uri/ /index.html;
root /opt/sfms3.0-uniapp;
index index.html index.htm;
}
}
}

57
nginx_prod.conf

@ -0,0 +1,57 @@
user root;
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
charset utf-8,gbk;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time $upstream_response_time"';
proxy_cache_path /opt/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 600s;
client_max_body_size 200m;
gzip on;
gzip_min_length 10k;
gzip_comp_level 9;
gzip_buffers 4 16k;
gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
upstream sfms3.0 {
server localhost:90 weight=10 max_fails=3 fail_timeout=10s;
}
server {
listen 81;
server_name_in_redirect off;
server_name _;
location /api/ {
proxy_pass http://sfms3.0/;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
}
location /profile/ {
alias /opt/profile/;
index index.html index.htm;
}
location / {
proxy_cache my_zone;
proxy_cache_valid 200 304 12h;
proxy_cache_key $host$uri$is_args$args;
try_files $uri $uri/ /index.html;
root /opt/sfms3.0-uniapp;
index index.html index.htm;
}
}
}

11747
package-lock.json

File diff suppressed because it is too large

23
package.json

@ -5,17 +5,22 @@
"dev:app": "uni -p app",
"dev:app-android": "uni -p app-android",
"dev:app-ios": "uni -p app-ios",
"dev:custom": "uni -p",
"dev:h5": "uni",
"dev": "uni",
"dev:h5:ssr": "uni --ssr",
"dev:mp-weixin": "uni -p mp-weixin",
"build:app": "uni build -p app",
"build:app-android": "uni build -p app-android",
"build:app-ios": "uni build -p app-ios",
"build:custom": "uni build -p",
"build:h5": "uni build",
"build:h5:ssr": "uni build --ssr",
"build:mp-weixin": "uni build -p mp-weixin"
"hella8:app": "uni build -p app --mode hella8",
"hella8:app-android": "uni build -p app-android --mode hella8",
"hella8:app-ios": "uni build -p app-ios --mode hella8",
"hella8:h5:ssr": "uni build --ssr --mode hella8",
"hella8:mp-weixin": "uni build -p mp-weixin --mode hella8",
"prod": "uni build --mode production",
"test": "uni build --mode test",
"hella8": "uni build --mode hella8",
"hella9": "uni build --mode hella9",
"hella13": "uni build --mode hella13",
"hella14": "uni build --mode hella14",
"hella15": "uni build --mode hella15",
"hella16": "uni build --mode hella16"
},
"dependencies": {
"@dcloudio/uni-app": "3.0.0-3090920231225001",

11
src/App.vue

@ -8,7 +8,6 @@
export default {
onLaunch: function() {
console.log('App Launch')
// ,
// #ifdef APP-PLUS
// ,
@ -18,15 +17,19 @@
// plus.screen.lockOrientation('landscape-primary');
// // app
// plus.screen.lockOrientation('portrait-primary');
appUpdate();
appUpdate(false);
// #endif
},
data() {
return {
//
modalShowing: true
};
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
},
}

149
src/api/httpRequest3.js

@ -1,10 +1,12 @@
import storage from '../common/utils/storage'
import config from '../static/config.js'
import {
removeToken
} from '@/common/utils/auth'
function service(options = {}) {
var token = storage.getStorage(storage.constant.token)
var tenantId = 1
var tenantId = storage.getStorage('tenantId')
// if(getApp()!=undefined){
// tenantId = getApp().globalData.tenantId
// }
@ -13,55 +15,112 @@ function service(options = {}) {
// requestUrl = getApp().globalData.request_url
// }
var requestUrl = ""
requestUrl =config.request_url
requestUrl = import.meta.env.VITE_BASE_URL
options.header = {
"content-type": "application/json",
"Authorization": "Bearer "+token,
"dataType":"json",
"tenant-id":tenantId
"Authorization": "Bearer " + token,
"dataType": "json",
"dataSource": "PDA",
"tenant-id": tenantId
};
options.timeout = 10000
options.url = requestUrl+options.url
options.timeout = 300000
options.url = requestUrl + options.url
return new Promise((resolve, reject) => {
options.success = (res) => {
if (res ) {
if(res.statusCode == 200){
if(res.data.code==0){
resolve(res.data);
}else {
reject("系统异常:"+res.data.msg)
console.log("系统异常",res.data.msg)
options.success = (res) => {
if (res) {
if (res.statusCode == 200) {
if (res.data.code == 0) {
resolve(res.data);
} else {
if (res.data.code == 401) {
uni.clearStorageSync()
uni.removeStorageSync('overPackageRecord') // 删除直接翻包中缓存的来源库位
removeToken();
uni.reLaunch({
url: '/pages/login/index'
})
}
if (res.data.msg) {
if (res.data.msg.includes('get lock')) {
reject("系统异常:状态码["+res.statusCode +"]\n"+"数据库死锁")
} else {
reject("系统异常:状态码["+res.statusCode +"]\n"+res.data.msg)
}
}else {
reject("系统异常:"+ res.data.msg)
console.log("系统异常",res.data.msg)
} else {
reject("系统异常:状态码["+res.statusCode+"]")
}
}
} else {
if (res.data.msg) {
if (res.data.msg.includes('get lock')) {
reject("系统异常:状态码[" +res.statusCode+"]\n"+ "数据库死锁")
} else {
reject("系统异常:状态码[" +res.statusCode+"]\n"+ res.data.msg)
}
} else {
reject("系统异常:"+res.data.msg)
console.log("系统异常",res.data.msg)
reject("系统异常:状态码["+res.statusCode+"]")
}
};
options.fail = (error) => {
var message = error.errMsg
if (message === 'Network Error') {
message = '接口连接异常'
} else if (message.includes('timeout')) {
message = '接口请求超时'
} else if (message.includes('Request failed with status code')) {
message = '接口' + message.substr(message.length - 3) + '异常'
}
} else {
if (res.data.msg) {
if (res.data.msg.includes('get lock')) {
reject("系统异常:状态码["+res.statusCode +"]\n"+ "数据库死锁")
} else {
reject("系统异常:状态码["+res.statusCode +"]\n"+ res.data.msg)
}
reject("系统异常:"+message);
console.log("系统异常",message)
};
uni.request(options);
});
}
} else {
reject("系统异常:状态码["+res.statusCode+"]")
}
}
};
options.fail = (error) => {
var message = error.errMsg
if (message === 'Network Error') {
message = '接口连接异常'
} else if (message.includes('timeout')) {
message = '接口请求超时'
} else if (message.includes('Request failed with status code')) {
message = '接口' + message.substr(message.length - 3) + '异常'
} else if (message.includes('get lock')) {
message = '接口' + "数据库死锁"
}else if(message.includes('statusCode:-1')){
message = "当前设备无网络,请检查网络后重试"
}
reject("系统异常:" + message);
console.log("系统异常", message)
};
// #ifdef APP
uni.getNetworkType({
success: function(res) {
const networkType = res.networkType;
console.log("网络类型", networkType)
if (networkType == "none") {
reject("当前设备无网络,请检查网络后重试");
} else {
uni.request(options);
}
}
})
// #endif
// #ifdef H5
console.log("网s络H5", navigator.onLine)
if (navigator.onLine) {
uni.request(options);
} else {
reject("当前无网络");
}
// #endif
});
}
export default service;
export default service;

196
src/api/img-to-base64.js

@ -0,0 +1,196 @@
function getLocalFilePath(path) {
if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
return path
}
if (path.indexOf('file://') === 0) {
return path
}
if (path.indexOf('/storage/emulated/0/') === 0) {
return path
}
if (path.indexOf('/') === 0) {
var localFilePath = plus.io.convertAbsoluteFileSystem(path)
if (localFilePath !== path) {
return localFilePath
} else {
path = path.substr(1)
}
}
return '_www/' + path
}
function dataUrlToBase64(str) {
var array = str.split(',')
return array[array.length - 1]
}
var index = 0
function getNewFileId() {
return Date.now() + String(index++)
}
function biggerThan(v1, v2) {
var v1Array = v1.split('.')
var v2Array = v2.split('.')
var update = false
for (var index = 0; index < v2Array.length; index++) {
var diff = v1Array[index] - v2Array[index]
if (diff !== 0) {
update = diff > 0
break
}
}
return update
}
export async function pathToBase64(path) {
return await new Promise(async function(resolve, reject) {
if (typeof window === 'object' && 'document' in window) {
if (typeof FileReader === 'function') {
var xhr =await new XMLHttpRequest()
xhr.open('GET', path, true)
xhr.responseType = 'blob'
xhr.onload = function() {
if (this.status === 200) {
let fileReader = new FileReader()
fileReader.onload = function(e) {
resolve(e.target.result)
}
fileReader.onerror = reject
fileReader.readAsDataURL(this.response)
}
}
xhr.onerror = reject
xhr.send()
return
}
var canvas = document.createElement('canvas')
var c2x = canvas.getContext('2d')
var img = new Image
img.onload = function() {
canvas.width = img.width
canvas.height = img.height
c2x.drawImage(img, 0, 0)
resolve(canvas.toDataURL())
canvas.height = canvas.width = 0
}
img.onerror = reject
img.src = path
return
}
if (typeof plus === 'object') {
plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
entry.file(function(file) {
var fileReader = new plus.io.FileReader()
fileReader.onload = function(data) {
resolve(data.target.result)
}
fileReader.onerror = function(error) {
reject(error)
}
fileReader.readAsDataURL(file)
}, function(error) {
reject(error)
})
}, function(error) {
reject(error)
})
return
}
if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
wx.getFileSystemManager().readFile({
filePath: path,
encoding: 'base64',
success: function(res) {
resolve('data:image/png;base64,' + res.data)
},
fail: function(error) {
reject(error)
}
})
return
}
reject(new Error('not support'))
})
}
export function base64ToPath(base64) {
return new Promise(function(resolve, reject) {
if (typeof window === 'object' && 'document' in window) {
base64 = base64.split(',')
var type = base64[0].match(/:(.*?);/)[1]
var str = atob(base64[1])
var n = str.length
var array = new Uint8Array(n)
while (n--) {
array[n] = str.charCodeAt(n)
}
return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type })))
}
var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
if (extName) {
extName = extName[1]
} else {
reject(new Error('base64 error'))
}
var fileName = getNewFileId() + '.' + extName
if (typeof plus === 'object') {
var basePath = '_doc'
var dirPath = 'uniapp_temp'
var filePath = basePath + '/' + dirPath + '/' + fileName
if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
plus.io.resolveLocalFileSystemURL(basePath, function(entry) {
entry.getDirectory(dirPath, {
create: true,
exclusive: false,
}, function(entry) {
entry.getFile(fileName, {
create: true,
exclusive: false,
}, function(entry) {
entry.createWriter(function(writer) {
writer.onwrite = function() {
resolve(filePath)
}
writer.onerror = reject
writer.seek(0)
writer.writeAsBinary(dataUrlToBase64(base64))
}, reject)
}, reject)
}, reject)
}, reject)
return
}
var bitmap = new plus.nativeObj.Bitmap(fileName)
bitmap.loadBase64Data(base64, function() {
bitmap.save(filePath, {}, function() {
bitmap.clear()
resolve(filePath)
}, function(error) {
bitmap.clear()
reject(error)
})
}, function(error) {
bitmap.clear()
reject(error)
})
return
}
if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
var filePath = wx.env.USER_DATA_PATH + '/' + fileName
wx.getFileSystemManager().writeFile({
filePath: filePath,
data: dataUrlToBase64(base64),
encoding: 'base64',
success: function() {
resolve(filePath)
},
fail: function(error) {
reject(error)
}
})
return
}
reject(new Error('not support'))
})
}

1023
src/api/request2.js

File diff suppressed because it is too large

117
src/common/appUpdate.js

@ -1,7 +1,7 @@
import {
appCheckUpdate
} from '../api/request2.js';
export function appUpdate() {
export function appUpdate(isShowHint) {
let curversion = 0;
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
const data = {
@ -11,44 +11,77 @@ export function appUpdate() {
wgtVersion: widgetInfo.version,
versionCode: widgetInfo.versionCode
}
curversion=data.versionCode
appCheckUpdate().then(res => {
console.log("当前版本提示",curversion)
if (res.data) {
if (res.data.versionCode > Number(curversion)) {
var downUrl = res.data.downUrl;
var content = res.data.content;
var version =res.data.version
console.log("新版本提示")
uni.showModal({
title: "发现新版本:("+version+")",
content: content,
confirmText: "更新",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
confirm(downUrl);
console.log('comfirm') //点击确定之后执行的代码
} else {
console.log('cancel') //点击取消之后执行的代码
}
curversion = data.versionCode
appCheckUpdate().then(res => {
console.log("当前版本提示", curversion)
var json = JSON.stringify(res)
console.log("获取更新数据", json)
if (res.data) {
if (res.data.installPackageVersion > Number(curversion)) {
var downUrl = res.data.installPackageUrl;
var content = res.data.updateContent;
var version = res.data.installPackageVersion;
var isForcedUpdate = res.data.isForcedUpdate
var versionName = res.data.installPackageName
console.log("新版本提示")
showDialog(versionName, content, isForcedUpdate, downUrl)
// uni.showModal({
// title: "发现新版本:(" + version + ")",
// content: content,
// confirmText: "更新",
// showCancel: isForcedUpdate == "TRUE" ? false : true,
// cancelText: "取消",
// success: (res) => {
// if (res.confirm) {
// confirm(downUrl);
// console.log('comfirm') //点击确定之后执行的代码
// } else {
// console.log('cancel') //点击取消之后执行的代码
// if (isForcedUpdate == "TRUE") {
// }
// }
// }
// })
} else {
if (isShowHint) {
uni.showToast({
title: "当前是最新版本"
})
}
})
console.log("没有新版本")
}
}
}).catch(error => {
console.log("版本错误", error)
})
})
}
export function showDialog(versionName, content, isForcedUpdate, downUrl) {
uni.showModal({
title: "发现新版本:(" + versionName + ")",
content: content,
confirmText: "更新",
showCancel: isForcedUpdate == "TRUE" ? false : true,
cancelText: "取消",
success: (res) => {
if (res.confirm) {
confirm(downUrl);
console.log(
'comfirm') //点击确定之后执行的代码
} else {
uni.showToast({
title:"当前是最新版本"
})
console.log("没有新版本")
console.log(
'cancel') //点击取消之后执行的代码
if (isForcedUpdate == "TRUE") {
showDialog(versionName, content, isForcedUpdate, downUrl)
}
}
}
}).catch(error => {
console.log("版本错误", error)
})
})
}
export function confirm(downUrl) {
@ -91,12 +124,16 @@ export function confirm(downUrl) {
showLoading.setTitle("已连接到服务器");
break;
case 3:
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
showLoading.setTitle(" 正在下载" + prg + "% ");
if (task.totalSize && task.totalSize > 0) {
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
showLoading.setTitle("正在下载" + prg + "% ");
}else {
showLoading.setTitle("正在下载");
}
break;
case 4:
plus.nativeUI.closeWaiting();

41
src/common/array.js

@ -223,7 +223,7 @@ export function getDetailEditRemoveOption() {
}
//详情编辑放弃
//详情编辑关闭
export function getDetailGiveupOption() {
let option_detail_giveup = [{
text: '详情',
@ -241,7 +241,23 @@ export function getDetailGiveupOption() {
return option_detail_giveup;
}
//详情放弃
export function getDetailCloseOption() {
let option_detail_giveup = [{
text: '详情',
style: {
backgroundColor: '#3C9CFF'
}
},
{
text: '关闭',
style: {
backgroundColor: '#F56C6C'
}
}
];
return option_detail_giveup;
}
//详情编辑移除
export function getEditRemoveOption() {
@ -262,6 +278,25 @@ export function getEditRemoveOption() {
}
//详情编辑移除
export function getEditLocationRemoveOption() {
let option_edit_remove = [{
text: '修改\n库位',
style: {
backgroundColor: '#F1A532'
}
},
{
text: '移除',
style: {
backgroundColor: '#F56C6C'
}
}
];
return option_edit_remove;
}
// 库存状态字典项
export function getInventoryStatusArray() {
let array = [{
@ -317,4 +352,4 @@ export function getLocationTypeArray(data) {
}
return list
}
}

119
src/common/balance.js

@ -131,8 +131,58 @@ export function getManagementPrecisions(itemCodes, locationCode, callback) {
callback(result);
})
}
//通过父包装查询
export function getBalanceByManagementPrecisionByPacking(label, packageInfo,locationCode, fromInventoryStatuses, callback) {
let result = {
list: [],
success: true,
message: ''
};
let params = {
itemCodes: [label.itemCode],
locationCode: locationCode
};
// let jsonParem = JSON.stringify(param)
getManagementPrecision(params).then(res => {
let managementPrecision = res.data[0].ManagementPrecision;
switch (managementPrecision) {
case 'BY_PACKAGING':
byPacking(label, packageInfo,locationCode, fromInventoryStatuses, res => {
res.managementPrecision = managementPrecision;
callback(res);
});
break;
case 'BY_BATCH':
byBatch(label, locationCode, fromInventoryStatuses, res => {
res.managementPrecision = managementPrecision;
callback(res);
});
break;
case 'BY_QUANTITY':
byQuantity(label, locationCode, fromInventoryStatuses, res => {
res.managementPrecision = managementPrecision;
callback(res);
});
break;
case 'BY_UNIQUEID':
byUniqueId(label, fromInventoryStatuses, res => {
res.managementPrecision = managementPrecision;
callback(res);
});
break;
}
}).catch(error => {
let result = {
success: false,
message: error
};
callback(result);
})
}
export function getBalanceByManagementPrecision(label, locationCode, fromInventoryStatuses, callback) {
export function getBalanceByManagementPrecision(label,locationCode, fromInventoryStatuses, callback) {
let result = {
list: [],
success: true,
@ -147,7 +197,7 @@ export function getBalanceByManagementPrecision(label, locationCode, fromInvento
let managementPrecision = res.data[0].ManagementPrecision;
switch (managementPrecision) {
case 'BY_PACKAGING':
byPacking(label, locationCode, fromInventoryStatuses, res => {
byPacking(label, "",locationCode, fromInventoryStatuses, res => {
res.managementPrecision = managementPrecision;
callback(res);
});
@ -184,18 +234,30 @@ export function getBalanceByManagementPrecision(label, locationCode, fromInvento
* @param {Object} locationCode
* @param {Object} callback
*/
export function byPacking(label, locationCode, fromInventoryStatuses, callback) {
export function byPacking(label, packageInfo,locationCode, fromInventoryStatuses, callback) {
let result = {
success: true,
message: '',
data: {}
};
var filters = []
filters.push({
column: "packingNumber",
action: "==",
value: label.packingNumber
})
if (packageInfo&&packageInfo.parentNumber) {
var packingNumber = packageInfo.parentNumber + "," + label.packingNumber;
filters.push({
column: "packingNumber",
action: "in",
value: packingNumber
})
} else {
filters.push({
column: "packingNumber",
action: "==",
value: label.packingNumber
})
}
filters.push({
column: "itemCode",
action: "==",
@ -211,15 +273,17 @@ export function byPacking(label, locationCode, fromInventoryStatuses, callback)
action: "==",
value: locationCode
})
if (fromInventoryStatuses != null && fromInventoryStatuses != "") {
if (fromInventoryStatuses) {
var status = fromInventoryStatuses.join(',');
filters.push({
column: "inventoryStatus",
action: "in",
value: fromInventoryStatuses
value: status
})
}
var params = {
filters: filters,
pageNo: 1,
@ -274,11 +338,18 @@ export function byBatch(label, locationCode, fromInventoryStatuses, callback) {
value: locationCode
})
if (fromInventoryStatuses != null && fromInventoryStatuses != "") {
if (fromInventoryStatuses) {
var status = fromInventoryStatuses.join(',');
filters.push({
column: "inventoryStatus",
action: "in",
value: fromInventoryStatuses
value: status
})
filters.push({
column: "inventoryStatus",
action: "in",
value: status
})
}
@ -346,11 +417,18 @@ export function byQuantity(label, locationCode, fromInventoryStatuses, callback)
value: locationCode
})
if (fromInventoryStatuses != null && fromInventoryStatuses != "") {
if (fromInventoryStatuses) {
var status = fromInventoryStatuses.join(',');
filters.push({
column: "inventoryStatus",
action: "in",
value: fromInventoryStatuses
value: status
})
filters.push({
column: "inventoryStatus",
action: "in",
value: status
})
}
@ -400,11 +478,18 @@ export function byUniqueId(label, locationCode, fromInventoryStatuses, callback)
value: label.packingNumber
})
if (fromInventoryStatuses != null && fromInventoryStatuses != "") {
if (fromInventoryStatuses) {
var status = fromInventoryStatuses.join(',');
filters.push({
column: "inventoryStatus",
action: "in",
value: status
})
filters.push({
column: "inventoryStatus",
action: "in",
value: fromInventoryStatuses
value: status
})
}
@ -474,4 +559,4 @@ export function balanceByLocation(locationCode, callback) {
result.message = err.message;
callback(result)
})
}
}

202
src/common/basic.js

@ -3,11 +3,13 @@ export {
maxPageSize
}
import { calc } from '@/common/calc'
import {
calc
} from '@/common/calc'
let jobStatusList = [];
let itemStatusList = [];
let locationTypeList = [];
let locationAreaTypeList = [];
let uomList = [];
let inventoryStatusList = [];
let containerTypeList = [];
@ -17,14 +19,15 @@ let unplannedReceiptReasonList = [];
let unplannedIissueReason = [];
let scrapReasonList = [];
let inspectFailedReasonList = [];
let switchList = []
let businessList = []
//获取字典信息
export function clearCacheData() {
jobStatusList = [];
itemStatusList = [];
locationTypeList = [];
locationAreaTypeList = [];
uomList = [];
inventoryStatusList = [];
containerTypeList = [];
@ -34,6 +37,8 @@ export function clearCacheData() {
unplannedIissueReason = [];
scrapReasonList = [];
inspectFailedReasonList = [];
switchList = []
businessList = []
}
@ -152,11 +157,11 @@ export function getItemStateInfo(value) {
//获取库位类型
export function getLocationTypeInfo(value) {
var resultInfo = "";
if (locationTypeList.length == 0) {
locationTypeList = getDirectoryInfo("location_type")
if (locationAreaTypeList.length == 0) {
locationAreaTypeList = getDirectoryInfo("location_type")
}
if (locationTypeList.length > 0) {
for (let item of locationTypeList) {
if (locationAreaTypeList.length > 0) {
for (let item of locationAreaTypeList) {
if (item.value == value) {
resultInfo = item
break;
@ -174,7 +179,7 @@ export function getLocationTypeName(value) {
}
//获取计量单位
export function getUnitInfo(value) {
export function getUomInfo(value) {
var resultInfo = "";
if (uomList.length == 0) {
uomList = getDirectoryInfo("uom")
@ -191,7 +196,7 @@ export function getUnitInfo(value) {
}
//获取包装单位
export function getStdPackUnitInfo(value) {
export function getPackUnitInfo(value) {
var resultInfo = "";
if (packUnitList.length == 0) {
packUnitList = getDirectoryInfo("pack_unit")
@ -335,6 +340,44 @@ export function getInspectReasonList(value) {
return inspectFailedReasonList
}
//获取单据开关
export function getSwitchInfoByCode(code) {
var isCheck = false
var resultInfo = ""
switchList = uni.getStorageSync("switch")
for (let item of switchList) {
if (item.code == code) {
resultInfo = item
break;
}
}
isCheck = resultInfo.effectiveSetValue == "TRUE" ? true : false
return isCheck;
}
//获取业务类型名称
export function getBusinessTypeName(code) {
var resultInfo = null
if (businessList.length == 0) {
businessList = uni.getStorageSync("businessType")
}
for (let item of businessList) {
if (item.code == code) {
resultInfo = item
break;
}
}
return resultInfo.name;
}
// //数量状态
// export function getCoutJobStatuStyle(val) {
@ -689,22 +732,29 @@ export function getPackingNumberAndBatch(managementList, itemCode, packingNumber
}
// //提示是否消息
// export function showConfirmMsg(content, callback) {
// uni.showModal({
// title: '提示',
// cancelText: '否',
// confirmText: '是',
// content: content,
// success: function(res) {
// if (res.confirm) {
// callback(true);
// } else {
// callback(false);
// }
// },
// })
// scanErrorAudio();
// }
export function showConfirmMsg(content, callback) {
uni.showModal({
title: '提示',
cancelText: '否',
confirmText: '是',
content: content,
success: function(res) {
if (res.confirm) {
callback(true);
} else {
callback(false);
}
},
})
}
export function compare(key) {
return function(a, b) {
var val1 = a[key];
var val2 = b[key];
return val2 - val1;
}
}
export function compareTime() {
return function(a, b) {
@ -804,7 +854,7 @@ export function getCurrDateTimes() {
var time = (new Date()).getTime();
return time;
}
//2024717
export function getBatch() {
var date = new Date();
var year = date.getFullYear(); //年
@ -813,6 +863,80 @@ export function getBatch() {
var batch = year.toString() + month.toString() + day.toString()
return batch;
}
//20270717
export function getBatch8() {
var date = new Date();
//获取日期部分
var year = date.getFullYear(); //年
var month = date.getMonth() + 1; //月
var day = date.getDate(); //日
month = month < 10 ? "0" + month : month;
day = day < 10 ? "0" + day : day;
return year + month + day;
}
/**
* 获取前几天和后几天的日期 2024-07-07
*/
export function lastThreeDays(grapDay) {
let dates = [];
for (let i = grapDay; i >= 0; i--) {
// 创建新的Date对象,并减去i天
let date = new Date();
date.setDate(date.getDate() - i);
// 将格式化的日期字符串添加到数组中
dates.push(formatDate(date));
}
for (let i = 0; i <grapDay; i++) {
// 创建新的Date对象,并减去i天
let date = new Date();
date.setDate(date.getDate() + (i+1));
// 将格式化的日期字符串添加到数组中
dates.push(formatDate(date));
}
return dates;
}
//20240702
export function formatDate(date) {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
}
export function getBeforeDayDate(grapDay) {
const today = new Date();
var resultList = []
//获取前几天
var beforeList = []
var afterList = []
for (var i = 0; i < grapDay; i++) {
beforeList.push(today.getDate() - (i + 1))
}
//获取后几天
var afterList = []
for (var i = 0; i < grapDay; i++) {
afterList.push(today.getDate() + (i + 1))
}
resultList.concat(beforeList)
resultList.push(today)
resultList.concat(afterList)
return resultList;
}
export function getCurrDate() {
var date = new Date();
@ -839,6 +963,16 @@ export function dateFormat(time) {
return result;
}
//2024-07-19
export function dateFormatData(time) {
var result = ""
if (time != null) {
let date = new Date(time);
result = getDate(date);
}
return result;
}
//获取日期部分
export function getDate(date) {
@ -945,7 +1079,7 @@ export function getDataSource(subList) {
item.subList.push(newDetail);
items.push(item)
} else {
item.qty = calc.add(item.qty,detail.qty)
item.qty = calc.add(item.qty, detail.qty)
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
}
@ -957,8 +1091,8 @@ export function createItemInfo(res) {
let item = {
itemCode: res.itemCode,
itemName: res.itemName,
stdPackQty: Number(res.stdPackQty),
stdPackUnit: res.stdPackUnit,
packQty: Number(res.packQty),
packUnit: res.packUnit,
qty: Number(res.qty),
handleQty: 0,
uom: res.uom,
@ -998,12 +1132,12 @@ export function navigateBack(backIndex) {
* 深度克隆对象
* @param {*} target
*/
export function deepCopyData(target) {
export function deepCopyData(target) {
// 克隆原始类型和null
if (!(target !== null && (typeof target === 'object' || typeof target === 'function'))) {
return target;
}
let cloneTarget = Array.isArray(target) ? [] : {};
// 克隆对象和数组
for (const key in target) {
@ -1012,3 +1146,7 @@ export function deepCopyData(target) {
return cloneTarget;
}
//数组去重重复数据
export function uniqueArray(arr) {
return arr.filter((item, index, self) => self.indexOf(item) === index);
}

4
src/common/config.js

@ -0,0 +1,4 @@
export const overPagePrint="overPage_print"
export const overPageTemplate="overPage_Template"
//3分钟刷新
export const planRefreshTime=3*60*1000

202
src/common/detail.js

@ -1,83 +1,151 @@
import {
calc
} from '@/common/calc'
import { Decimal } from 'decimal.js';//引入
export function getDataSource(subList) {
let items = [];
subList.forEach(detail => {
var item = items.find(r =>
r.itemCode == detail.itemCode)
if (item == undefined) {
item = createItemInfo(detail);
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
items.push(item)
} else {
item.qty = calc.add(item.qty, detail.qty)
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
}
})
return items;
}
calc
} from '@/common/calc'
import {
Decimal
} from 'decimal.js'; //引入
export function createItemInfo(detail) {
let item = {
itemCode: detail.itemCode,
itemName: detail.itemName,
stdPackQty: Number(detail.stdPackQty) || undefined,
stdPackUnit: detail.stdPackUnit,
qty: Number(detail.qty),
handleQty: 0,
uom: detail.uom,
subList: []
export function getTreeDataSource(dataList) {
let items = [];
let parentList = dataList.filter(r => r.parentPackingNumber == null || r
.parentPackingNumber == '');
let childList = dataList.filter(r => r.parentPackingNumber != '' && r.parentPackingNumber != null);
parentList.forEach(detail => {
var item = items.find(r =>
r.itemCode == detail.itemCode)
if (item == undefined) {
item = createItemInfo(detail);
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
items.push(item)
} else {
item.qty = calc.add(item.qty, detail.qty)
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
}
return item;
}
})
export function createDetailInfo(data) {
data.scaned = false;
// data.record = {};
let detail = data;
return detail;
if (childList.length > 0) {
items.forEach(r =>
r.subList.forEach(s => {
s.packList = childList.filter(c => c.parentPackingNumber == s.packingNumber)
s.packList.forEach(pac => {
pac.scaned = false;
pac.scanDate = new Date();
})
})
)
}
//根据明细创建记录
export function createRecordInfo(detail, balance) {
var record = {}
// let record = JSON.parse(JSON.stringify(detail));
//克隆对象,深度克隆,防止双向绑定同一个变量
Object.assign(record, detail)
detail.scaned = true;
detail.balance = balance;
detail.recommendInventoryStatus = detail.inventoryStatus;
detail.inventoryStatus = balance.inventoryStatus;
record.qty = Number(balance.qty);
return record;
return items;
}
export function getDataSource(subList) {
let items = [];
subList.forEach(detail => {
var item = items.find(r =>
r.itemCode == detail.itemCode)
if (item == undefined) {
item = createItemInfo(detail);
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
items.push(item)
} else {
item.qty = calc.add(item.qty, detail.qty)
let newDetail = createDetailInfo(detail); //
item.subList.push(newDetail);
}
})
return items;
}
export function createItemInfo(detail) {
let item = {
itemCode: detail.itemCode,
itemName: detail.itemName,
packQty: Number(detail.packQty) || undefined,
packUnit: detail.packUnit,
qty: Number(detail.qty),
handleQty: 0,
uom: detail.uom,
subList: []
}
return item;
}
export function createDetailInfo(data) {
data.scaned = false;
data.scanDate = new Date();
let detail = data;
detail.packList = [];
return detail;
}
//根据明细创建记录
export function createRecordInfo(detail, balance) {
var record = {}
// let record = JSON.parse(JSON.stringify(detail));
//克隆对象,深度克隆,防止双向绑定同一个变量
Object.assign(record, detail)
detail.scaned = true;
detail.balance = balance;
detail.recommendInventoryStatus = detail.inventoryStatus;
detail.inventoryStatus = balance.inventoryStatus;
record.qty = Number(balance.qty);
return record;
}
//计算实际数量
export function calcHandleQty(detailSource) {
for (let item of detailSource) {
item.handleQty = new Decimal(0).toNumber();
item.qty = new Decimal(0).toNumber();
for (let detail of item.subList) {
if (detail != undefined && detail.scaned) {
item.handleQty = calc.add(item.handleQty,detail.handleQty);
item.qty = calc.add(item.qty,detail.qty);
//计算实际数量
export function calcHandleQty(detailSource) {
for (let item of detailSource) {
item.handleQty = new Decimal(0).toNumber();
item.qty = new Decimal(0).toNumber();
for (let detail of item.subList) {
if (detail != undefined) {
if (detail.scaned) {
item.handleQty = calc.add(item.handleQty, detail.handleQty);
}
item.qty = calc.add(item.qty, detail.qty);
}
}
}
}
export function calcTreeHandleQty(detailSource) {
for (let item of detailSource) {
item.handleQty = new Decimal(0).toNumber();
export function getScanCount(subList) {
let items = subList.filter(r => {
if (r.scaned) {
return r;
for (let detail of item.subList) {
if (detail != undefined && detail.scaned) {
if (detail.packList.length > 0) {
detail.handleQty = new Decimal(0).toNumber();
for (let pack of detail.packList) {
if (pack != undefined && pack.scaned) {
detail.handleQty = calc.add(detail.handleQty, pack.handleQty);
}
}
}
item.handleQty = calc.add(item.handleQty, detail.handleQty);
}
})
let scanCount = items != null ? items.length : 0;
return scanCount;
}
}
}
export function getScanCount(subList) {
let items = subList.filter(r => {
if (r.scaned) {
return r;
}
})
let scanCount = items != null ? items.length : 0;
return scanCount;
}

132
src/common/directory.js

@ -1,11 +1,12 @@
let jobStatusList = [];
let itemStatusList = [];
let itemTypeList =[];
let itemTypeList = [];
let locationTypeList = [];
let uomList = [];
let inventoryStatusList = [];
let containerTypeList = [];
let packUnitList = [];
let packUnitInfoList = [];
let requestStatusList = [];
let unplannedReceiptReasonList = [];
let unplannedIssueReasonList = [];
@ -18,8 +19,10 @@ let inspectTypeList = [];
let sampleMethodList = [];
let transferModeList = [];
let countStageList = [];
let locationAreaTypeList = [];
let businessList = [];
let countScopeTypeList = [];
let priorityList = []
@ -40,12 +43,13 @@ export function getBusinessTypeDesc(type) {
export function clearCacheData() {
jobStatusList = [];
itemStatusList = [];
itemTypeList =[];
itemTypeList = [];
locationTypeList = [];
uomList = [];
inventoryStatusList = [];
containerTypeList = [];
packUnitList = [];
packUnitInfoList = [];
requestStatusList = [];
unplannedReceiptReasonList = [];
unplannedIssueReasonList = [];
@ -58,6 +62,10 @@ export function clearCacheData() {
sampleMethodList = [];
transferModeList = [];
countStageList = [];
locationAreaTypeList = []
businessList = []
countScopeTypeList = []
priorityList = []
}
//获取字典信息
@ -73,7 +81,6 @@ export function getDirectoryInfo(type) {
}
}
}
return result
}
@ -145,6 +152,16 @@ export function getJobStateStyle(value) {
}
}
//获取库区描述(多个库区)
export function getListLocationAreaTypeDesc(list) {
let desc = '';
list.forEach(res => {
desc += getLocationAreaTypeInfo(res).label + ","
})
desc = desc.slice(0, -1);
return desc;
}
//获取库位描述(多个库位)
export function getListLocationTypeDesc(list) {
let desc = '';
@ -213,6 +230,39 @@ export function getItemStateInfo(value) {
return resultInfo
}
//获取业务类型名称
export function getBusinessTypeName(code) {
var resultInfo = null
if (businessList.length == 0) {
businessList = uni.getStorageSync("businessType")
}
for (let item of businessList) {
if (item.code == code) {
resultInfo = item
break;
}
}
return resultInfo.name;
}
//获取库区类型
export function getLocationAreaTypeInfo(value) {
var resultInfo = "";
if (locationAreaTypeList.length == 0) {
locationAreaTypeList = getDirectoryInfo("area_type")
}
if (locationAreaTypeList.length > 0) {
for (let item of locationAreaTypeList) {
if (item.value == value) {
resultInfo = item
break;
}
}
}
return resultInfo
}
//获取库位类型
export function getLocationTypeInfo(value) {
var resultInfo = "";
@ -229,6 +279,13 @@ export function getLocationTypeInfo(value) {
}
return resultInfo
}
//获取库区类型名称
export function getLocationAreaTypeName(value) {
let location = getLocationAreaTypeInfo(value);
return location == '' ? value : location.label;
}
//获取库位类型名称
export function getLocationTypeName(value) {
@ -249,7 +306,7 @@ export function getLocationTypeNameList(lst) {
}
//获取计量单位
export function getUnitInfo(value) {
export function getUomInfo(value) {
var resultInfo = "";
if (uomList.length == 0) {
uomList = getDirectoryInfo("uom")
@ -265,8 +322,26 @@ export function getUnitInfo(value) {
return resultInfo
}
//获取盘点范围类型
export function getCountScopeType(value) {
var resultInfo = "";
if (countStageList.length == 0) {
countStageList = getDirectoryInfo("count_scope_type")
}
if (countStageList.length > 0) {
for (let item of countStageList) {
if (item.value == value) {
resultInfo = item
break;
}
}
}
return resultInfo
}
//获取包装单位
export function getStdPackUnitInfo(value) {
export function getPackUnitInfo(value) {
var resultInfo = "";
if (packUnitList.length == 0) {
packUnitList = getDirectoryInfo("pack_unit")
@ -299,6 +374,14 @@ export function getRequestStateInfo(value) {
return resultInfo
}
//获取库存状态集合
export function getInventoryStatusList() {
if (inventoryStatusList.length == 0) {
inventoryStatusList = getDirectoryInfo("inventory_status")
}
return inventoryStatusList
}
//获取库存状态
export function getInventoryStatusInfo(value) {
@ -514,3 +597,38 @@ export function getCountStageName(value) {
}
return resultInfo
}
//获取包装规格
export function getPackUnitName(value) {
var resultInfo = "";
if (packUnitInfoList.length == 0) {
packUnitInfoList = uni.getStorageSync('packunit');
}
if (packUnitInfoList.length > 0) {
for (let item of packUnitInfoList) {
if (item.code == value) {
resultInfo = item.name
break;
}
}
}
return resultInfo
}
//获取优先级
export function getPriorityName(value) {
var resultInfo = "";
if (priorityList.length == 0) {
priorityList = getDirectoryInfo("priority")
}
if (priorityList.length > 0) {
for (let item of priorityList) {
if (item.value == value) {
resultInfo = item.label
break;
}
}
}
return resultInfo
}
locationAreaTypeList

84
src/common/label.js

@ -2,7 +2,7 @@ let labelDic = [];
import {
getLabelByHeader,
getPackageByNumber
getPackageListByNumber
} from '../api/request2.js';
import {
@ -12,54 +12,57 @@ import {
export function getLabelInfo(scanMsg,headerType, callBack) {
console.log('扫描信息:', scanMsg);
export function getLabelInfo(scanMsg, headerType, callBack) {
console.log('扫描信息:', scanMsg);
if (scanMsg.length == 0) {
return null
}
let items = scanMsg.split(';');
let header = items[0];
let version = items[1];
if ((header != undefined) && (version!=undefined)) {
var hearList =getDirectoryItemArray(headerType)
if(!checkDirectoryItemExist(hearList,header)){
if ((header != undefined) && (version != undefined)) {
var hearList = getDirectoryItemArray(headerType)
if (!checkDirectoryItemExist(hearList, header)) {
let labelResult = {
label: {
labelType: "",
barType: '',
code:""
code: ""
},
package: null,
success: false,
message: '请输入'+headerType+"开始的标签",
message: '请输入' + headerType + "开始的标签",
}
callBack(labelResult);
return;
}
//解析扫描的是一维码还是二维码
let type = header.substring(header.length - 1, header.length);
if (type == 'Q') //qrcode
{
getQRCodeInfo(header, version, scanMsg, callBack);
} else if (type == 'B') //barcode
{
getBarCodeInfo(header, version, items[2], callBack);
} else { //直接输入文本
getBarCodeInfo('text', 'V1.0', scanMsg, callBack);
}
}else {
let labelResult = {
label: {
labelType: "",
barType: '',
code:""
},
package: null,
success: false,
message: '标签格式不正确',
// else if (type == 'B') //barcode
// {
// getBarCodeInfo(header, version, items[2], callBack);
// }
else { //直接输入文本
getBarCodeInfo('text', 'V1.0', scanMsg, callBack);
}
callBack(labelResult);
} else {
getBarCodeInfo('text', 'V1.0', scanMsg, callBack);
// let labelResult = {
// label: {
// labelType: "",
// barType: '',
// code:""
// },
// package: null,
// success: false,
// message: '标签格式不正确',
// }
// callBack(labelResult);
}
}
@ -76,7 +79,7 @@ export function getQRCodeInfo(header, version, scanMsg, callBack) {
message: ''
}
getLabelByHeader(header, version).then(res => {
if (res.data==null) {
if (res.data == null) {
labelResult.success = false;
labelResult.message = '未查找到标签头为[' + header + ']的标签类型';
callBack(labelResult);
@ -86,7 +89,7 @@ export function getQRCodeInfo(header, version, scanMsg, callBack) {
version: version,
label: res.data,
};
labelDic.push(newItem);
getLabelItems(newItem, scanMsg, callBack);
}
@ -105,14 +108,16 @@ export function getLabelItems(labelItem, scanMsg, callBack) {
if (labelResult.label.labelType == 'PurchaseLabel' || labelResult.label.labelType == 'MakeLabel') {
//查询包装信息
let packingNumber = labelResult.label.packingNumber
if (packingNumber != undefined) {
getPackageByNumber(packingNumber).then(pack => {
if (pack.data.list.length == 0) {
if (packingNumber != undefined && packingNumber != '') {
getPackageListByNumber(packingNumber).then(pack => {
if (pack.data.reqPackage) {
labelResult.package = pack.data.reqPackage;
labelResult.package.subList = pack.data.subList;
console.log('包装信息', JSON.stringify(labelResult.package))
} else {
labelResult.success = false;
labelResult.message = '包装号[' + packingNumber + ']没有包装信息';
} else {
labelResult.package = pack.data.list[0];
console.log('包装信息', JSON.stringify(labelResult.package))
}
callBack(labelResult);
}).catch(err => {
@ -121,9 +126,12 @@ export function getLabelItems(labelItem, scanMsg, callBack) {
callBack(labelResult);
})
} else {
labelResult.success = false;
labelResult.message = '在条码中未解析到箱码';
//线边的物料可能没有箱码
labelResult.package = labelResult.label;
callBack(labelResult);
// labelResult.success = false;
// labelResult.message = '在条码中未解析到箱码';
// callBack(labelResult);
}
} else {
callBack(labelResult);
@ -140,7 +148,7 @@ export function analysisQRCodeLabel(labelItem, scanMsg) {
success: true,
message: ''
}
let separators = labelItem.label.separators;
if (separators == undefined || separators == null) {
labelResult.message = "未读取到分隔符";
@ -184,11 +192,11 @@ export function getBarCodeInfo(header, version, value, callBack) {
label: {
labelType: header,
barType: 'BarCode',
code:value
code: value
},
package: null,
success: true,
message: '',
}
callBack(labelResult);
}
}

44
src/common/noclick.js

@ -0,0 +1,44 @@
// 防止处理多次点击
function noMultipleClicks(methods, info) {
// methods是需要点击后需要执行的函数, info是点击需要传的参数
let that = this;
if (that.noClick) {
// 第一次点击
that.noClick= false;
if(info && info !== '') {
// info是执行函数需要传的参数
methods(info);
} else {
methods();
}
let timer = setTimeout(()=> {
that.noClick= true;
clearTimeout(timer)
}, 2000)
} else {
// 这里是重复点击的判断
}
}
// 节流函数
const throttle = (fn, t,_this) => {
console.log('throttle')
return ()=> {
if (!_this.timer) {
_this.timer = setTimeout(()=>{
console.log('fn')
//·清空定时器
_this.timer = null
}, t)
fn()
}
}
}
//导出
export default {
noMultipleClicks,//禁止多次点击
throttle
}

90
src/common/record.js

@ -5,23 +5,30 @@ import {
import {
getDirectoryItemArray,
} from '@/common/directory.js';
import { calc } from '@/common/calc'
import { Decimal } from 'decimal.js';//引入
import {
deepCopyData
} from '@/common/basic.js';
import {
calc
} from '@/common/calc'
import {
Decimal
} from 'decimal.js'; //引入
import {
deepCopyData
} from '@/common/basic.js';
export function createItemInfo(balance, pack) {
let item = {
itemCode: pack.itemCode,
itemName: pack.itemName,
stdPackQty: pack.stdPackQty,
stdPackUnit: pack.stdPackUnit,
packQty: pack.packQty,
packUnit: pack.packUnit,
qty: new Decimal(balance.qty).toNumber(),
handleQty:new Decimal(0).toNumber(),
handleQty: new Decimal(0).toNumber(),
uom: pack.uom,
subList: []
subList: [],
// packingNumber: pack.number,
// parentPackingNumber: pack.parentNumber,
}
item.containerNumber = pack.parentNumber ? pack.parentNumber : pack.number;
return item;
}
@ -32,11 +39,28 @@ export function createDetailInfo(balance, pack) {
let detail = deepCopyData(balance);
detail.balanceQty = new Decimal(detail.qty).toNumber()
detail.qty = new Decimal(detail.qty).toNumber();
detail.stdPackQty = new Decimal(pack.stdPackQty).toNumber()
detail.stdPackUnit = pack.stdPackUnit
detail.handleQty = new Decimal(detail.qty).toNumber() ;
detail.packQty = pack.packQty ? new Decimal(pack.packQty).toNumber() : 0
detail.packUnit = pack.packUnit
detail.handleQty = new Decimal(detail.qty).toNumber();
detail.package = pack;
detail.productionlineCode = pack.productionLineCode; // 制品回收记录需要加的
detail.toInventoryStatus = balance.inventoryStatus; // 制品回收记录需要加的
return detail;
}
export function createDetailByPackInfo(pack) {
// data.toInventoryStatus = this.toInventoryStatus == "" ? data.inventoryStatus : this.toInventoryStatus;
// data.inventoryStatus = data.inventoryStatus;
let detail = deepCopyData(pack); detail.scaned = true;
detail.balanceQty = new Decimal(detail.qty).toNumber()
detail.qty = new Decimal(detail.qty).toNumber();
detail.packQty = pack.packQty ? new Decimal(pack.packQty).toNumber() : 0
detail.packUnit = pack.packUnit
detail.handleQty = new Decimal(detail.qty).toNumber();
detail.package = pack;
return detail;
}
@ -46,11 +70,29 @@ export function calcHandleQty(detailSource) {
item.handleQty = new Decimal(0).toNumber();
item.qty = new Decimal(0).toNumber();
for (let detail of item.subList) {
if(detail!=undefined){
if(detail.scaned){
item.handleQty = calc.add(item.handleQty,detail.handleQty);
if (detail != undefined) {
if (detail.scaned) {
item.handleQty = calc.add(item.handleQty, detail.handleQty);
}
item.qty = calc.add(item.qty, detail.qty);
}
}
}
}
export function calcTreeHandleQty(detailSource) {
for (let item of detailSource) {
item.handleQty = new Decimal(0).toNumber();
for (let detail of item.subList) {
if (detail != undefined && detail.scaned) {
detail.handleQty = new Decimal(0).toNumber();
for (let pack of detail.packList) {
if (pack != undefined && pack.scaned) {
detail.handleQty = calc.add(detail.handleQty, pack.handleQty);
}
}
item.qty = calc.add(item.qty,detail.qty);
item.handleQty = calc.add(item.handleQty, detail.handleQty);
}
}
}
@ -60,10 +102,10 @@ export function getBusinessType(typeCode, callback) {
let result = {
success: true,
businessType: '',
fromlocationTypeList: '',
tolocationTypeList: '',
itemCodeTypeList:"",
useOnTheWay:"FALSE",
fromLocationAreaTypeList: '',
toLocationAreaTypeList: '',
itemCodeTypeList: "",
useOnTheWay: "FALSE",
fromInventoryStatuses: '',
toInventoryStatuses: '',
message: ''
@ -71,12 +113,12 @@ export function getBusinessType(typeCode, callback) {
getBusinesstypeByCode(typeCode).then(res => {
if (res.data.total > 0) {
result.businessType = res.data.list[0];
result.fromlocationTypeList = getDirectoryItemArray(res.data.list[0].outLocationTypes)
result.tolocationTypeList = getDirectoryItemArray(res.data.list[0].inLocationTypes)
result.fromLocationAreaTypeList = getDirectoryItemArray(res.data.list[0].outAreaTypes);
result.toLocationAreaTypeList = getDirectoryItemArray(res.data.list[0].inAreaTypes);
result.itemCodeTypeList = getDirectoryItemArray(res.data.list[0].itemTypes)
result.fromInventoryStatuses = res.data.list[0].outInventoryStatuses;
result.toInventoryStatuses = res.data.list[0].inInventoryStatuses;
result.useOnTheWay =res.data.list[0].useOnTheWay
result.useOnTheWay = res.data.list[0].useOnTheWay
callback(result)
} else {
result.success = false;
@ -88,4 +130,4 @@ export function getBusinessType(typeCode, callback) {
result.message = error;
callback(result)
})
}
}

120
src/common/style/new_style.css

@ -62,6 +62,10 @@ uni-page-head .uni-page-head__title {
font-size: 1.125rem;
}
.font_default {
font-size: 1rem;
}
.margin_top {
margin-top: 20rpx;
}
@ -2027,15 +2031,21 @@ button::after {
}
.card_itemCode {
font-size: 36rpx;
/* font-weight: 500; */
padding: 5rpx 10rpx;
font-size: 40rpx;
font-weight: bold;
/* padding: 5rpx 10rpx; */
/* width: 210rpx; */
word-wrap: break-word;
word-break: break-all;
}
.card_itemName {
color: #909399;
font-size: 30rpx;
padding: 5rpx 20rpx;
/* padding: 5rpx 10rpx; */
/* width: 210rpx; */
word-wrap: break-word;
word-break: break-all;
}
.card_ProdLine {
@ -2058,7 +2068,14 @@ button::after {
.card_content {
font-size: 32rpx;
font-size: 35rpx;
font-weight: bold;
/* padding: 5px; */
}
.card_big_content {
font-size: 40rpx;
font-weight: bold;
padding: 5px;
}
@ -2068,41 +2085,46 @@ button::after {
vertical-align: middle
}
.card_packing_code {
color: #3315EB;
.card_item_code {
color: #329362;
padding: 5px;
font-size: 30rpx;
}
.card_packing_code_content {
font-size: 32rpx;
.card_packing_code {
color: #3315EB;
padding: 5px;
font-size: 30rpx;
}
.card_batch {
color: #9747FF;
padding: 5px;
font-size: 30rpx;
}
.card_batch_content {
font-size: 32rpx;
.card_container {
color: #0076F6;
padding: 5px;
font-size: 30rpx;
}
.card_container {
.card_light {
color: #0076F6;
padding: 5px;
font-size: 30rpx;
}
.card_container_content {
font-size: 32rpx;
padding: 5px;
font-size: 35rpx;
}
.card_business {
color: #F1A532;
padding: 5px;
font-size: 35rpx;
}
.card_business_content {
@ -2113,11 +2135,13 @@ button::after {
.card_location {
color: #DA8910;
padding: 5px;
font-size: 30rpx;
}
.card_to_location {
color: #329362;
padding: 5px;
font-size: 30rpx;
}
.card_location_content {
@ -2125,14 +2149,36 @@ button::after {
padding: 5px;
}
.card_level {
color: #0689da;
padding: 5px;
font-size: 30rpx;
}
.card_supportCode {
color: #DA8910;
padding: 5px;
}
.card_supportCode_content {
font-size: 32rpx;
}
/* .card_item_code {
color: #F1A532;
padding: 5px;
} */
.card_product_date {
color: #329362;
padding: 5px;
}
.card_order {
color: #0076F6;
padding: 5px;
}
.scan_view {
/* #0CC2B6 20% */
background: linear-gradient(90deg, rgba(12, 194, 182, 0.2) 0%, rgba(12, 194, 182, 0) 100%)
@ -2183,10 +2229,12 @@ button::after {
.task_top {
margin: 0rpx 10rpx;
background-color: #fff;
vertical-align: middle;
}
.task_item {
margin: 0rpx 10rpx;
/* margin-top: 10rpx; */
background-color: #fff;
}
@ -2432,6 +2480,24 @@ button[disabled] {
width: 180rpx;
}
.btn_single_clear {
background-color: #EBEEF0;
font-size: 30rpx;
color: #000;
text-align: center;
width: 180rpx;
}
.btn_single_reject {
background-color: #F56C6C;
font-size: 30rpx;
color: #fff;
text-align: center;
width: 180rpx;
}
.center {
display: flex;
flex-direction: row;
@ -2447,9 +2513,17 @@ button[disabled] {
.text_recommend {
color: #0A84FF;
font-size: 38rpx;
font-size: 34rpx;
font-weight: bold;
}
.text_packQty {
color: #3315EB;
font-size: 40rpx;
font-weight: bold;
}
.text_balance {
font-size: 36rpx;
}
@ -2588,6 +2662,16 @@ button[disabled] {
padding: 5rpx;
}
.desc_input {
height: 100rpx;
font-size: 10rpx;
color: #000000;
text-align: left;
border: 1px solid rgb(220, 211, 211);
padding: 5rpx;
}
.qty_inspect_input {
width: 150rpx;
height: 60rpx;
@ -2747,3 +2831,9 @@ button[disabled] {
padding: 10rpx 20rpx 10rpx 20rpx;
border-radius: 10rpx;
}
.split_line {
background-color: #e0e0e0;
height: 1px;
margin: 10rpx;
}

28
src/common/style/pdabasic.css

@ -480,7 +480,7 @@ export function getItemTypeStyle(val) {
.detail-list {
background-color: #fff;
padding:5rpx 10rpx;
padding: 5rpx 10rpx;
/* margin: 20rpx; */
/* border-radius: 16rpx; */
/* overflow: hidden; */
@ -725,20 +725,30 @@ page {
}
.page-header {
background-color: #3c9cff;
font-size: 35rpx;
padding: 10rpx 20rpx;
}
.page-header .header-view {
display: flex;
flex-direction: column;
background-color: #fff;
font-size: 35rpx;
padding: 10rpx 20rpx;
border-radius: 4px;
}
.page-header .header_item {
.page-header .header-view .header_item {
/* padding-left: 10rpx; */
padding: 5rpx 10rpx;
font-size:32rpx ;
font-size: 32rpx;
}
.page-header .header_job_top {
padding:5rpx 0rpx;
.page-header .header-view .header_job_top {
padding: 5rpx 0rpx;
}
.page-main {
flex: 1;
position: relative;
@ -760,3 +770,11 @@ page {
background: #e0e0e0;
}
.page-footer {
/* color: #fff; */
/* line-height: 100rpx; */
/* 不放大不缩小固定100rpx */
flex: 0 0 100rpx;
/* background-color: #00AAFF; */
}

17
src/common/utils/storage.js

@ -10,7 +10,22 @@ const setStorage = (key,value)=>{
// 清除全部本地存储
const clearStorage = ()=>{
uni.clearStorageSync();
const overPackageRecordPointParams = ''
if( uni.getStorageSync('overPackageRecordPointParams')){
overPackageRecordPointParams = uni.getStorageSync('overPackageRecordPointParams')
}
const overPackageJobDetailPointParams = ''
if( uni.getStorageSync('overPackageJobDetailPointParams')){
overPackageJobDetailPointParams = uni.getStorageSync('overPackageJobDetailPointParams')
}
uni.clearStorageSync();
if(overPackageRecordPointParams){
uni.setStorageSync('overPackageRecordPointParams',overPackageRecordPointParams)
}
if(overPackageJobDetailPointParams){
uni.setStorageSync('overPackageJobDetailPointParams',overPackageJobDetailPointParams)
}
}
// 清除指定key本地存储

BIN
src/components/kk-printer/empty-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

416
src/components/kk-printer/index.vue

@ -0,0 +1,416 @@
<template>
<view class="kk-printer">
<view class="kk-printer-btn" @tap="handlePrintTap">
{{isPrinting?printingText:defaultText}}
</view>
<view class="kk-shadow" :class="isShowSearch?'show':''" @tap="handleSearchClose">
<view class="kk-modal" @tap.stop="doNothing">
<view class="kk-search-device">
<view class="kk-filter-wrap">
<view class="filter-title">根据SRRI过滤设备</view>
<slider @change="handleSRRIChange" max='-20' min='-100' value="-95" show-value/>
</view>
<view class="kk-filter-wrap">
<view class="filter-title">根据蓝牙名过滤</view>
<input type="text" placeholder-class="kk-placeholder-class" placeholder="请输入蓝牙名字或设备ID搜索" v-model="filterName" />
</view>
<view class="kk-btn-wrap">
<view class="kk-btn-item confirm-btn" @tap="searchBtnTap" v-if="!isSearching">
搜索设备
</view>
<view class="kk-btn-item confirm-btn" v-else>
搜索中...
</view>
<view class="kk-btn-item" @tap="stopSearchBtnTap">
停止搜索
</view>
</view>
<view class="kk-devices-wrap">
<view class="empty-wrap" v-if="filterDeviceList.length <= 0">
<view class="empty-icon"></view>
<view class="empty-text">~ 无可搜索到的设备 ~</view>
</view>
<view class="" v-else>
<view class="kk-devices-item" v-for="(item,index) in filterDeviceList" :key="index" @tap="handleConnectDevice(item)">
<view class="name">
<text>设备名称</text>
<text>{{item.name?item.name:'未命名'}}</text>
</view>
<view class="rssi">
<text>信号强度</text>
<text>({{Math.max(0, item.RSSI + 100)}}%)</text>
</view>
<view class="deviceid">
<text>设备ID</text>
<text>{{item.deviceId}}</text>
</view>
<view class="advmac" v-if="item.advMac">
<text>advMac</text>
<text>{{item.advMac}}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as gbk from '@/components/kk-printer/utils/printUtil-GBK.js';
import * as blesdk from './utils/bluetoolth';
import * as util from './utils/util.js';
export default {
data(){
return{
//
isPrinting:false,
//
isSearching:false,
//
isShowSearch:false,
//
filterName:'',
//
filterRSSI:-95,
//
devicesList:[],
//ID
deviceId:'',
//ID
services:'',
//
serviceId: '',
writeId: '',
readId: ''
}
},
props:{
//
defaultText:{
type:String,
default:'打印'
},
//
printingText:{
type:String,
default:'打印中...'
},
bufferData:{
type:String,
require:true
}
},
computed:{
mapFilterRSSI(){
return (0 - this.filterRSSI)
},
filterDeviceList(){
let devices = this.devicesList;
let name = this.filterName;
let rssi = this.filterRSSI;
console.log(devices,name,rssi)
//RSSI
let filterDevices1 = devices.filter((item)=>{
return item.RSSI > rssi
})
console.log(filterDevices1)
//
let filterDevices2
if(name!=''){
filterDevices2 = filterDevices1.filter((item)=>{
return (item.name.indexOf(name) >= 0 || item.deviceId.indexOf(name) >= 0)
})
}else{
filterDevices2 = filterDevices1
}
// 广MAC
for (let i = 0; i < filterDevices2.length;i++) {
if (filterDevices2[i].hasOwnProperty('advertisData')){
if (filterDevices2[i].advertisData.byteLength == 8) {
filterDevices2[i].advMac = util.buf2hex(filterDevices2[i].advertisData.slice(2, 7));
}
}
}
return filterDevices2
}
},
mounted() {
},
beforeDestroy(){
this.stopSearchBtnTap();
},
methods:{
doNothing(){
return;
},
//
handlePrintTap(){
console.log(11)
//
blesdk.openBlue().then((res)=>{
console.log(99,res)
//
blesdk.getConnectedBluetoothDevices().then((res)=>{
//
console.log(66,res,this.deviceId,this.serviceId,this.writeId,this.bufferData,this.onPrintSuccess)
if(res.devices.length == 0){
this.isShowSearch = true
}else{
let datalen=20;
if (plus.os.name != 'Android')
{
datalen=180;
}
this.isPrinting = true;
this.$emit('onPrint');
this.$nextTick(()=>{
console.log(1,this.bufferData)
if(this.bufferData!=''){
let buffer = gbk.strToGBKByte(this.bufferData)
console.log(2,buffer)
let opt = {
deviceId: this.deviceId,
serviceId: this.serviceId,
characteristicId: this.writeId,
value:buffer,
lasterSuccess: this.onPrintSuccess,
onceLength:datalen
}
console.log(3,opt)
blesdk.sendDataToDevice(opt);
this.isPrinting = false;
}
})
}
}).catch((err)=>{
console.log(88,err)
blesdk.catchToast(err);
})
}).catch((err)=>{
console.log(77,err)
blesdk.catchToast(err);
})
},
onGetDevice(res){
this.devicesList = res;
},
handleSearchClose(){
this.isShowSearch = false
},
handleSRRIChange(e){
this.filterRSSI = e.detail.value
},
//
searchBtnTap(){
blesdk.startBluetoothDevicesDiscovery();
this.isSearching = true;
blesdk.onfindBlueDevices(this.onGetDevice)
},
//
stopSearchBtnTap(){
blesdk.stopBlueDevicesDiscovery();
this.isSearching = false;
},
//
handleConnectDevice(device){
let deviceId = device.deviceId;
let name = device.name;
this.deviceId = deviceId;
console.log('deviceId',this.deviceId)
// uni.setStorageSync('k_curDeviceID',deviceId);
// uni.setStorageSync('k_curDeviceName',name);
uni.onBLEConnectionStateChange((res)=>{
console.log('连接',res)
if(res.connected){
plus.nativeUI.toast('设备'+ res.deviceId + '已连接',{
verticalAlign:'center'
})
}else{
plus.nativeUI.toast('设备'+ res.deviceId + '已断开连接',{
verticalAlign:'center'
})
}
})
blesdk.createBLEConnection(deviceId, this.onConnectSuccess, this.onConnectFail);
},
onConnectSuccess(res){
this.stopSearchBtnTap()
blesdk.getBLEDeviceServices(this.deviceId, this.onGetServicesSuccess, this.onGetServicesFail);
},
onConnectFail(err){
console.log('链接失败',err)
},
onGetServicesSuccess(res){
console.log('获取服务',res)
this.services = res.serviceId;
blesdk.getDeviceCharacteristics(this.deviceId, this.services, this.onGetCharacterSuccess, this.onGetCharacterFail);
},
onGetServicesFail(err){
console.log('获取服务失败')
},
onGetCharacterSuccess(res){
console.log('获取特征值成功',res)
this.serviceId = res.serviceId;
this.writeId = res.writeId;
this.readId = res.readId;
this.isShowSearch = false;
},
onGetCharacterFail(err){
console.log('特征值获取失败')
},
onPrintSuccess(){
this.isPrinting = false;
console.log('打印成功')
this.$emit('onPrintSuccess')
},
onPrintFail(){
console.log('打印失败')
this.isPrinting = false;
}
}
}
</script>
<style lang="scss" scoped>
.kk-printer{
width:100%;
height:100%;
&-btn{
width:100%;
height:100%;
text-align: center;
line-height: 50px;
}
.kk-shadow{
display: none;
&.show{
display: block;
width:100vw;
height:100vh;
background: rgba(0,0,0,0.4);
position: fixed;
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
.kk-modal{
width:680upx;
height: 80%;
padding:24upx;
box-sizing: border-box;
overflow-y: auto;
border-radius: 20upx;
background: #ffffff;
display: flex;
justify-content: center;
align-items: center;
.kk-search-device{
width:100%;
height: 100%;
.kk-filter-wrap{
width:100%;
height: 160upx;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
.filter-title{
line-height: 70upx;
font-size: 30upx;
color: #999999;
}
&>slider{
width:90%;
height: 90upx;
}
&>input{
padding:0 20upx;
box-sizing: border-box;
border-radius: 10upx;
height: 90upx;
width:100%;
border: 1upx solid #ebebeb;
}
}
.kk-btn-wrap{
width:100%;
height: 140upx;
display: flex;
justify-content: space-between;
align-items: center;
&>view{
flex:1 1 auto;
height: 100upx;
line-height: 100upx;
border-radius: 16upx;
text-align: center;
color:#ffffff;
&.confirm-btn{
background: #007AFF;
margin-right:30upx;
}
&:nth-last-child(1){
background: #DD524D;
}
}
}
.kk-devices-wrap{
height: calc(100% - 460upx);
overflow-y:auto;
padding:10upx 20upx;
box-sizing: border-box;
border: 1upx solid #ebebeb;
box-sizing: border-box;
border-radius: 20upx;
.empty-wrap{
width:100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.empty-icon{
width:268upx;
height: 240upx;
background: url('./empty-icon.png') no-repeat;
background-size:100% 100%;
margin-bottom: 26upx;
}
.empty-text{
width: 100%;
line-height: 50upx;
font-size: 30upx;
text-align: center;
color: #999999;
}
}
.kk-devices-item{
width:100%;
border-bottom: 1upx solid #ebebeb;
padding:10upx 0;
box-sizing: border-box;
&:nth-last-child(1){
border-bottom: none;
}
&>view{
width:100%;
font-size: 30upx;
}
}
}
}
}
}
}
}
.kk-placeholder-class{
font-size: 30upx;
color:#999999;
}
</style>

402
src/components/kk-printer/utils/barcode.js

@ -0,0 +1,402 @@
var CHAR_TILDE = 126;
var CODE_FNC1 = 102;
var SET_STARTA = 103;
var SET_STARTB = 104;
var SET_STARTC = 105;
var SET_SHIFT = 98;
var SET_CODEA = 101;
var SET_CODEB = 100;
var SET_STOP = 106;
var REPLACE_CODES = {
CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard
}
var CODESET = {
ANY: 1,
AB: 2,
A: 3,
B: 4,
C: 5
};
function getBytes(str) {
var bytes = [];
for (var i = 0; i < str.length; i++) {
bytes.push(str.charCodeAt(i));
}
return bytes;
}
exports.code128 = function (ctx, text, width, height) {
width = parseInt(width);
height = parseInt(height);
var codes = stringToCode128(text);
var g = new Graphics(ctx, width, height);
var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);
var x = g.area.left;
var y = g.area.top;
for (var i = 0; i < codes.length; i++) {
var c = codes[i];
//two bars at a time: 1 black and 1 white
for (var bar = 0; bar < 8; bar += 2) {
var barW = PATTERNS[c][bar] * barWeight;
// var barH = height - y - this.border;
var barH = height - y;
var spcW = PATTERNS[c][bar + 1] * barWeight;
//no need to draw if 0 width
if (barW > 0) {
g.fillFgRect(x, y, barW, barH);
}
x += barW + spcW;
}
}
ctx.draw();
}
function stringToCode128(text) {
var barc = {
currcs: CODESET.C
};
var bytes = getBytes(text);
//decide starting codeset
var index = bytes[0] == CHAR_TILDE ? 1 : 0;
var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
barc.currcs = getBestStartSet(csa1, csa2);
barc.currcs = perhapsCodeC(bytes, barc.currcs);
//if no codeset changes this will end up with bytes.length+3
//start, checksum and stop
var codes = new Array();
switch (barc.currcs) {
case CODESET.A:
codes.push(SET_STARTA);
break;
case CODESET.B:
codes.push(SET_STARTB);
break;
default:
codes.push(SET_STARTC);
break;
}
for (var i = 0; i < bytes.length; i++) {
var b1 = bytes[i]; //get the first of a pair
//should we translate/replace
if (b1 in REPLACE_CODES) {
codes.push(REPLACE_CODES[b1]);
i++ //jump to next
b1 = bytes[i];
}
//get the next in the pair if possible
var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
codes = codes.concat(codesForChar(b1, b2, barc.currcs));
//code C takes 2 chars each time
if (barc.currcs == CODESET.C) i++;
}
//calculate checksum according to Code 128 standards
var checksum = codes[0];
for (var weight = 1; weight < codes.length; weight++) {
checksum += (weight * codes[weight]);
}
codes.push(checksum % 103);
codes.push(SET_STOP);
//encoding should now be complete
return codes;
function getBestStartSet(csa1, csa2) {
//tries to figure out the best codeset
//to start with to get the most compact code
var vote = 0;
vote += csa1 == CODESET.A ? 1 : 0;
vote += csa1 == CODESET.B ? -1 : 0;
vote += csa2 == CODESET.A ? 1 : 0;
vote += csa2 == CODESET.B ? -1 : 0;
//tie goes to B due to my own predudices
return vote > 0 ? CODESET.A : CODESET.B;
}
function perhapsCodeC(bytes, codeset) {
for (var i = 0; i < bytes.length; i++) {
var b = bytes[i]
if ((b < 48 || b > 57) && b != CHAR_TILDE)
return codeset;
}
return CODESET.C;
}
//chr1 is current byte
//chr2 is the next byte to process. looks ahead.
function codesForChar(chr1, chr2, currcs) {
var result = [];
var shifter = -1;
if (charCompatible(chr1, currcs)) {
if (currcs == CODESET.C) {
if (chr2 == -1) {
shifter = SET_CODEB;
currcs = CODESET.B;
}
else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
//need to check ahead as well
if (charCompatible(chr2, CODESET.A)) {
shifter = SET_CODEA;
currcs = CODESET.A;
}
else {
shifter = SET_CODEB;
currcs = CODESET.B;
}
}
}
}
else {
//if there is a next char AND that next char is also not compatible
if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
//need to switch code sets
switch (currcs) {
case CODESET.A:
shifter = SET_CODEB;
currcs = CODESET.B;
break;
case CODESET.B:
shifter = SET_CODEA;
currcs = CODESET.A;
break;
}
}
else {
//no need to shift code sets, a temporary SHIFT will suffice
shifter = SET_SHIFT;
}
}
//ok some type of shift is nessecary
if (shifter != -1) {
result.push(shifter);
result.push(codeValue(chr2));
}
else {
if (currcs == CODESET.C) {
//include next as well
result.push(codeValue(chr1, chr2));
}
else {
result.push(codeValue(chr1));
}
}
barc.currcs = currcs;
return result;
}
}
//reduce the ascii code to fit into the Code128 char table
function codeValue(chr1, chr2) {
if (typeof chr2 == "undefined") {
return chr1 >= 32 ? chr1 - 32 : chr1 + 64;
}
else {
return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));
}
}
function charCompatible(chr, codeset) {
var csa = codeSetAllowedFor(chr);
if (csa == CODESET.ANY) return true;
//if we need to change from current
if (csa == CODESET.AB) return true;
if (csa == CODESET.A && codeset == CODESET.A) return true;
if (csa == CODESET.B && codeset == CODESET.B) return true;
return false;
}
function codeSetAllowedFor(chr) {
if (chr >= 48 && chr <= 57) {
//0-9
return CODESET.ANY;
}
else if (chr >= 32 && chr <= 95) {
//0-9 A-Z
return CODESET.AB;
}
else {
//if non printable
return chr < 32 ? CODESET.A : CODESET.B;
}
}
var Graphics = function(ctx, width, height) {
this.width = width;
this.height = height;
this.quiet = Math.round(this.width / 40);
this.border_size = 0;
this.padding_width = 0;
this.area = {
width : width - this.padding_width * 2 - this.quiet * 2,
height: height - this.border_size * 2,
top : this.border_size - 4,
left : this.padding_width + this.quiet
};
this.ctx = ctx;
this.fg = "#000000";
this.bg = "#ffffff";
// fill background
this.fillBgRect(0,0, width, height);
// fill center to create border
this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
}
//use native color
Graphics.prototype._fillRect = function(x, y, width, height, color) {
this.ctx.setFillStyle(color)
this.ctx.fillRect(x, y, width, height)
}
Graphics.prototype.fillFgRect = function(x,y, width, height) {
this._fillRect(x, y, width, height, this.fg);
}
Graphics.prototype.fillBgRect = function(x,y, width, height) {
this._fillRect(x, y, width, height, this.bg);
}
var PATTERNS = [
[2, 1, 2, 2, 2, 2, 0, 0], // 0
[2, 2, 2, 1, 2, 2, 0, 0], // 1
[2, 2, 2, 2, 2, 1, 0, 0], // 2
[1, 2, 1, 2, 2, 3, 0, 0], // 3
[1, 2, 1, 3, 2, 2, 0, 0], // 4
[1, 3, 1, 2, 2, 2, 0, 0], // 5
[1, 2, 2, 2, 1, 3, 0, 0], // 6
[1, 2, 2, 3, 1, 2, 0, 0], // 7
[1, 3, 2, 2, 1, 2, 0, 0], // 8
[2, 2, 1, 2, 1, 3, 0, 0], // 9
[2, 2, 1, 3, 1, 2, 0, 0], // 10
[2, 3, 1, 2, 1, 2, 0, 0], // 11
[1, 1, 2, 2, 3, 2, 0, 0], // 12
[1, 2, 2, 1, 3, 2, 0, 0], // 13
[1, 2, 2, 2, 3, 1, 0, 0], // 14
[1, 1, 3, 2, 2, 2, 0, 0], // 15
[1, 2, 3, 1, 2, 2, 0, 0], // 16
[1, 2, 3, 2, 2, 1, 0, 0], // 17
[2, 2, 3, 2, 1, 1, 0, 0], // 18
[2, 2, 1, 1, 3, 2, 0, 0], // 19
[2, 2, 1, 2, 3, 1, 0, 0], // 20
[2, 1, 3, 2, 1, 2, 0, 0], // 21
[2, 2, 3, 1, 1, 2, 0, 0], // 22
[3, 1, 2, 1, 3, 1, 0, 0], // 23
[3, 1, 1, 2, 2, 2, 0, 0], // 24
[3, 2, 1, 1, 2, 2, 0, 0], // 25
[3, 2, 1, 2, 2, 1, 0, 0], // 26
[3, 1, 2, 2, 1, 2, 0, 0], // 27
[3, 2, 2, 1, 1, 2, 0, 0], // 28
[3, 2, 2, 2, 1, 1, 0, 0], // 29
[2, 1, 2, 1, 2, 3, 0, 0], // 30
[2, 1, 2, 3, 2, 1, 0, 0], // 31
[2, 3, 2, 1, 2, 1, 0, 0], // 32
[1, 1, 1, 3, 2, 3, 0, 0], // 33
[1, 3, 1, 1, 2, 3, 0, 0], // 34
[1, 3, 1, 3, 2, 1, 0, 0], // 35
[1, 1, 2, 3, 1, 3, 0, 0], // 36
[1, 3, 2, 1, 1, 3, 0, 0], // 37
[1, 3, 2, 3, 1, 1, 0, 0], // 38
[2, 1, 1, 3, 1, 3, 0, 0], // 39
[2, 3, 1, 1, 1, 3, 0, 0], // 40
[2, 3, 1, 3, 1, 1, 0, 0], // 41
[1, 1, 2, 1, 3, 3, 0, 0], // 42
[1, 1, 2, 3, 3, 1, 0, 0], // 43
[1, 3, 2, 1, 3, 1, 0, 0], // 44
[1, 1, 3, 1, 2, 3, 0, 0], // 45
[1, 1, 3, 3, 2, 1, 0, 0], // 46
[1, 3, 3, 1, 2, 1, 0, 0], // 47
[3, 1, 3, 1, 2, 1, 0, 0], // 48
[2, 1, 1, 3, 3, 1, 0, 0], // 49
[2, 3, 1, 1, 3, 1, 0, 0], // 50
[2, 1, 3, 1, 1, 3, 0, 0], // 51
[2, 1, 3, 3, 1, 1, 0, 0], // 52
[2, 1, 3, 1, 3, 1, 0, 0], // 53
[3, 1, 1, 1, 2, 3, 0, 0], // 54
[3, 1, 1, 3, 2, 1, 0, 0], // 55
[3, 3, 1, 1, 2, 1, 0, 0], // 56
[3, 1, 2, 1, 1, 3, 0, 0], // 57
[3, 1, 2, 3, 1, 1, 0, 0], // 58
[3, 3, 2, 1, 1, 1, 0, 0], // 59
[3, 1, 4, 1, 1, 1, 0, 0], // 60
[2, 2, 1, 4, 1, 1, 0, 0], // 61
[4, 3, 1, 1, 1, 1, 0, 0], // 62
[1, 1, 1, 2, 2, 4, 0, 0], // 63
[1, 1, 1, 4, 2, 2, 0, 0], // 64
[1, 2, 1, 1, 2, 4, 0, 0], // 65
[1, 2, 1, 4, 2, 1, 0, 0], // 66
[1, 4, 1, 1, 2, 2, 0, 0], // 67
[1, 4, 1, 2, 2, 1, 0, 0], // 68
[1, 1, 2, 2, 1, 4, 0, 0], // 69
[1, 1, 2, 4, 1, 2, 0, 0], // 70
[1, 2, 2, 1, 1, 4, 0, 0], // 71
[1, 2, 2, 4, 1, 1, 0, 0], // 72
[1, 4, 2, 1, 1, 2, 0, 0], // 73
[1, 4, 2, 2, 1, 1, 0, 0], // 74
[2, 4, 1, 2, 1, 1, 0, 0], // 75
[2, 2, 1, 1, 1, 4, 0, 0], // 76
[4, 1, 3, 1, 1, 1, 0, 0], // 77
[2, 4, 1, 1, 1, 2, 0, 0], // 78
[1, 3, 4, 1, 1, 1, 0, 0], // 79
[1, 1, 1, 2, 4, 2, 0, 0], // 80
[1, 2, 1, 1, 4, 2, 0, 0], // 81
[1, 2, 1, 2, 4, 1, 0, 0], // 82
[1, 1, 4, 2, 1, 2, 0, 0], // 83
[1, 2, 4, 1, 1, 2, 0, 0], // 84
[1, 2, 4, 2, 1, 1, 0, 0], // 85
[4, 1, 1, 2, 1, 2, 0, 0], // 86
[4, 2, 1, 1, 1, 2, 0, 0], // 87
[4, 2, 1, 2, 1, 1, 0, 0], // 88
[2, 1, 2, 1, 4, 1, 0, 0], // 89
[2, 1, 4, 1, 2, 1, 0, 0], // 90
[4, 1, 2, 1, 2, 1, 0, 0], // 91
[1, 1, 1, 1, 4, 3, 0, 0], // 92
[1, 1, 1, 3, 4, 1, 0, 0], // 93
[1, 3, 1, 1, 4, 1, 0, 0], // 94
[1, 1, 4, 1, 1, 3, 0, 0], // 95
[1, 1, 4, 3, 1, 1, 0, 0], // 96
[4, 1, 1, 1, 1, 3, 0, 0], // 97
[4, 1, 1, 3, 1, 1, 0, 0], // 98
[1, 1, 3, 1, 4, 1, 0, 0], // 99
[1, 1, 4, 1, 3, 1, 0, 0], // 100
[3, 1, 1, 1, 4, 1, 0, 0], // 101
[4, 1, 1, 1, 3, 1, 0, 0], // 102
[2, 1, 1, 4, 1, 2, 0, 0], // 103
[2, 1, 1, 2, 1, 4, 0, 0], // 104
[2, 1, 1, 2, 3, 2, 0, 0], // 105
[2, 3, 3, 1, 1, 1, 2, 0] // 106
]

723
src/components/kk-printer/utils/bluetoolth.js

@ -0,0 +1,723 @@
/**
* @export
* @param {string} name 微信api的名称 uniAsyncPromise("getSystemInfo",options)
* @param {object} options 除了success fail 的其他参数
* @returns
*/
export function uniAsyncPromise(name, options) {
return new Promise((resolve, reject) => {
uni[name]({
...(options || {}),
// ...options,
success: (res) => {
resolve(res);
},
fail: (err) => {
reject(err);
}
});
});
}
//微信小程序向蓝牙打印机发送数据进行打印的坑:
//小程序api向蓝牙打印机发送数据打印,发送的任何内容都应该要转成二进制数据,而且蓝牙打印的文本编码是GBK的,发送中文需转成GBK编码再转成二进制数据发送
//发送打印机指令也要转成二进制数据发送
//蓝牙打印机一次接收的二级制数据有限制,不同的系统不同的蓝牙设备限制可能不同,微信建议一次20个字节,需做递归分包发送
//发送完要打印的内容后,一定要发送一个打印的指令才能顺利打印 (有些指令就不需要)
//一、初始化蓝牙、开始检索蓝牙设备
// { allowDuplicatesKey: true, interval: 500}
export function openBlue() {
return uniAsyncPromise('openBluetoothAdapter')
}
export function startBluetoothDevicesDiscovery(option) {
console.log('开始蓝牙扫描');
uniAsyncPromise('startBluetoothDevicesDiscovery', option).then((res) => {
console.log('正在搜寻蓝牙设备', res);
});
}
export function getConnectedBluetoothDevices(option) {
console.log('开始获取已连接设备');
return uniAsyncPromise('getConnectedBluetoothDevices', option)
}
//二、
/**
*
*
* @export
* @param {function} getDevices uni.getBluetoothDevices的监听回调函数
*/
export function onfindBlueDevices(getDevices) {
//监听寻找到新设备的事件
uni.onBluetoothDeviceFound((devices)=>{
//获取在蓝牙模块生效期间所有已发现的蓝牙设备
uniAsyncPromise('getBluetoothDevices').then((res) => {
getDevices && getDevices(res.devices);
});
});
}
/**
* @export
* @param {function} stopBlueDevicesDiscovery 关闭蓝牙扫描
*/
export function stopBlueDevicesDiscovery() {
//监听寻找到新设备的事件
console.log('停止蓝牙扫描');
return uniAsyncPromise('stopBluetoothDevicesDiscovery').then((res) => {
console.log('停止搜寻蓝牙设备', res);
});
}
//三、连接蓝牙设备
/**
* @export
* @param {function} createBLEConnection
* @param {number} deviceId 蓝牙设备id
*/
export function createBLEConnection(deviceId, sucess, fail) {
//连接蓝牙设备
console.log('连接蓝牙设备', deviceId);
uniAsyncPromise("createBLEConnection", {
deviceId
})
.then(res => {
//连接成功可选择停止搜索蓝牙
//stopBlueDevicesDiscovery();
console.log('连接成功');
sucess && sucess({
res: res,
});
})
.catch(res => {
console.log('连接设备异常' + res);
fail && fail({
res: res,
});
})
/*.finally(res=>{
console.log('连接成功');
sucess && sucess({
res: res,
});
});*/
}
export function closeBLEConnection(deviceId) {
console.log('断开蓝牙设备', deviceId);
uniAsyncPromise("closeBLEConnection", {
deviceId
})
.then(res => {
console.log('BLEDisconnect complete', res);
})
.catch(res => {
console.log('断开设备异常' + res);
})
/*.finally(res=>{
console.log('BLEDisconnect complete', res);
}); */
}
//四、连接成功后, 获取蓝牙设备的service服务
// uniAsyncPromise("getBLEDeviceServices",{deviceId:""}).then(res=>{})
export function getBLEDeviceServices(deviceId, success, fail) {
console.log('获取ServiceId', deviceId);
//加延迟避免取不到service
setTimeout(()=>{
uniAsyncPromise("getBLEDeviceServices", {
deviceId:deviceId
})
.then(res => {
console.log('服务', res);
success && success({
serviceId: res.services,
});
})
.catch((res) => {
//getBLEDeviceServices(deviceId, success, fail);
console.log('获取ServiceId异常' + res);
fail && fail({
res: res,
});
});
},1000)
}
//五、获取的service服务可能有多个,递归获取特征值(最后要用的是能读,能写,能监听的那个值的uuid作为特征值id)
/**
*
*
* @export
* @param {number} deviceId 蓝牙设备id
* @param {array} services uniAsyncPromise("getBLEDeviceServices",{deviceId:""}).then(res=>{})获取的res.services
* @param {function} success 成功取得有用特征值uuid的回调函数
*/
export function getDeviceCharacteristics(deviceId, services, success, fail) {
//services = services.slice(0);
console.log('获取Characteristics', deviceId, services);
if (services.length) {
const serviceId = services.shift().uuid;
console.log('ServceID ', serviceId);
uniAsyncPromise('getBLEDeviceCharacteristics', {
deviceId,
serviceId,
})
.then((res) => {
console.log('getBLEDeviceCharacteristics', deviceId, serviceId, res);
let finished = false;
let write = false;
let notify = false;
let indicate = false;
var readId;
var writeId;
//有斑马品牌的一款打印机中res.characteristics的所有uuid都是相同的,找所有的properties存在(notify || indicate) && write这种情况就说明这个uuid是可用的(不确保所有的打印机都能用这种方式取得uuid,在主要测试得凯盛诺打印机res.characteristic只有一个uuid,所以也能用这个方式)
for (var i = 0; i < res.characteristics.length; i++) {
if (!notify) {
notify = res.characteristics[i].properties.notify;
if (notify) readId = res.characteristics[i].uuid;
}
if (!indicate) {
indicate = res.characteristics[i].properties.indicate;
if (indicate) readId = res.characteristics[i].uuid;
}
if (!write) {
write = res.characteristics[i].properties.write;
writeId = res.characteristics[i].uuid;
}
if ((notify || indicate) && write) {
/* 获取蓝牙特征值uuid */
success &&
success({
serviceId,
writeId: writeId,
readId: readId,
});
finished = true;
break;
}
}
if (!finished) {
getDeviceCharacteristics(deviceId, services, success, fail);
}
})
.catch((res) => {
getDeviceCharacteristics(deviceId, services, success, fail);
});
} else {
fail && fail();
}
}
//六、启动notify 蓝牙监听功能 然后使用 uni.onBLECharacteristicValueChange用来监听蓝牙设备传递数据
/**
* @export
* @param {object} options
* {
deviceId,//蓝牙设备id
serviceId,//服务id
characteristicId,//可用特征值uuid
}
* @param {function} onChange 监听蓝牙设备传递数据回调函数
*/
export function onGetBLECharacteristicValueChange(options, onChange = function() {}) {
console.log('deviceId ', options.deviceId);
console.log('serviceId ', options.serviceId);
console.log('characteristicId ', options.characteristicId);
uniAsyncPromise('notifyBLECharacteristicValueChange', {
state: true,
...options,
}).then((res) => {
console.log('onBLECharacteristicValueChange ');
uni.onBLECharacteristicValueChange(onChange);
});
}
//七、发送数据(递归分包发送)
/**
* @export
* @param {object} options
* {
deviceId,
serviceId,
characteristicId,
value [ArrayBuffer],
lasterSuccess,
onceLength
}
*/
export function sendDataToDevice(options) {
let byteLength = options.value.byteLength;
//这里默认一次20个字节发送
const speed = options.onceLength; //20;
console.log("send data 20");
console.log(options);
if (byteLength > 0) {
uniAsyncPromise('writeBLECharacteristicValue', {
...options,
value: options.value.slice(0, byteLength > speed ? speed : byteLength),
})
.then((res) => {
if (byteLength > speed) {
sendDataToDevice({
...options,
value: options.value.slice(speed, byteLength),
});
} else {
options.lasterSuccess && options.lasterSuccess();
}
})
.catch((res) => {
console.log(res);
});
}
}
export function charToArrayBuffer(str) {
var out = new ArrayBuffer(str.length);
var uint8 = new Uint8Array(out);
var strs = str.split('');
for (var i = 0; i < strs.length; i++) {
uint8[i] = strs[i].charCodeAt();
}
return uint8;
}
export function charToArray(str) {
var arr = [];
var strs = str.split('');
for (var i = 0; i < strs.length; i++) {
arr[i] = strs[i].charCodeAt();
}
return arr;
}
//打印二维码
/**
* @export
* @param {object} options
* {
deviceId,
serviceId,
characteristicId,
value,//ArrayBuffer:二维码的数据
}
*/
export function printQR(options) {
//打印二维码的十进制指令data:
let data = [29, 107, 97, 7, 4, options.value.byteLength, 0];
sendDataToDevice({
...options,
value: new Uint8Array(data).buffer,
lasterSuccess: () => {
//指令发送成功后,发送二维码的数据
sendDataToDevice(options);
},
});
}
function grayPixle(pix) {
return pix[0] * 0.299 + pix[1] * 0.587 + pix[2] * 0.114;
}
export function overwriteImageData(data) {
let sendWidth = data.width,
sendHeight = data.height;
const threshold = data.threshold || 180;
let sendImageData = new ArrayBuffer((sendWidth * sendHeight) / 8);
sendImageData = new Uint8Array(sendImageData);
let pix = data.imageData;
const part = [];
let index = 0;
for (let i = 0; i < pix.length; i += 32) {
//横向每8个像素点组成一个字节(8位二进制数)。
for (let k = 0; k < 8; k++) {
const grayPixle1 = grayPixle(pix.slice(i + k * 4, i + k * 4 + (4 - 1)));
//阈值调整
if (grayPixle1 > threshold) {
//灰度值大于threshold位 白色 为第k位0不打印
part[k] = 0;
} else {
part[k] = 1;
}
}
let temp = 0;
for (let a = 0; a < part.length; a++) {
temp += part[a] * Math.pow(2, part.length - 1 - a);
}
//开始不明白以下算法什么意思,了解了字节才知道,一个字节是8位的二进制数,part这个数组存的0和1就是二进制的0和1,传输到打印的位图数据的一个字节是0-255之间的十进制数,以下是用权相加法转十进制数,理解了这个就用上面的for循环替代了
// const temp =
// part[0] * 128 +
// part[1] * 64 +
// part[2] * 32 +
// part[3] * 16 +
// part[4] * 8 +
// part[5] * 4 +
// part[6] * 2 +
// part[7] * 1;
sendImageData[index++] = temp;
}
return {
array: Array.from(sendImageData),
width: sendWidth / 8,
height: sendHeight,
};
}
/**
* printImage
* @param {object} opt
* {
deviceId,//蓝牙设备id
serviceId,//服务id
characteristicId,//可用特征值uuid
lasterSuccess , //最后完成的回调
}
*/
export function printImage(opt = {}, imageInfo = {}) {
let arr = imageInfo.array,
width = imageInfo.width;
const writeArray = [];
const xl = width % 256;
const xh = width / 256;
//分行发送图片数据,用的十进制指令
const command = [29, 118, 48, 0, xl, xh, 1, 0]; //1D 76 30 00 w h
const enter = [13, 10];
for (let i = 0; i < arr.length / width; i++) {
const subArr = arr.slice(i * width, i * width + width);
const tempArr = command.concat(subArr);
writeArray.push(new Uint8Array(tempArr));
}
writeArray.push(new Uint8Array(enter));
//console.log(writeArray);
const print = (options, writeArray) => {
if (writeArray.length) {
console.log("send");
sendDataToDevice({
...options,
value: writeArray.shift().buffer,
lasterSuccess: () => {
if (writeArray.length) {
print(options, writeArray);
} else {
options.lasterSuccess && options.lasterSuccess();
}
},
});
}
};
console.log("start print");
print(opt, writeArray);
}
/* 16hex insert 0 */
function Hex2Str(num) {
if (num.toString(16).length < 2) return "0" + num.toString(16);
else
return num.toString(16);
}
/*****CPCL指令接口****/
/**
* 配置项如下
*
* width: 标签纸的宽度单位像素點
* height: 标签纸的高度单位像素點
* 8像素=1mm
* printNum: 打印张数默认为1
* rotation页面整体旋转 1-90 2-180 3-270 其他-不旋转
*/
export function CreatCPCLPage(width, height, printNum, rotation = 0, offset = 0) {
var strCmd = '! ' + offset + ' 200 200 ' + height + ' ' + printNum + '\n';
strCmd += "PAGE-WIDTH " + width + '\n';
if (rotation == 1)
strCmd += "ZPROTATE90\n";
else if (rotation == 2)
strCmd += "ZPROTATE180\n";
else if (rotation == 3)
strCmd += "ZPROTATE270\n";
else
strCmd += "ZPROTATE0\n";
return strCmd;
}
/**
* 打印文字
* x: 文字方块左上角X座标单位dot
* y: 文字方块左上角Y座标单位dot
* fontName,fontSize: 字体取值 參考文檔
* rotation: 旋转 1-90 2-180 3-270 其他-不旋转
* content: 文字内容
*/
export function addCPCLText(x, y, fontName, fontSize, rotation, content) {
//console.log(fontName,fontSize,rotation, content);
var strCmd = '';
if (rotation == 1) {
strCmd += 'T90 ';
}
if (rotation == 2) {
strCmd += 'T180 ';
}
if (rotation == 3) {
strCmd += 'T270 ';
} else {
strCmd += 'T ';
}
strCmd += fontName + ' ' + fontSize + ' ' + x + ' ' + y + ' ' + content + '\n';
return strCmd;
};
/**
* 打印一维码
*
* x: 文字方块左上角X座标单位dot
* y: 文字方块左上角Y座标单位dot
* codeType: 条码类型取值为128UPCAUPCA2UPCA5UPCEUPCE2UPC5EAN13EAN13+2EAN13+5
* EAN8EAN8+2EAN8+53939CF39F39C93CODABARCODABAR16ITFI2OF5
* h: 条码高度单位dot
* rotation: 顺时针旋转角度取值如下
* - 0 不旋转
* - 1 顺时针旋转90度
*
* narrow: 窄条码比例因子(dot) 取值 參考文檔
* wide: 宽条码比例因子(dot) 取值 參考文檔
* content: 文字内容
*
*/
export function addCPCLBarCode(x, y, codeType, h, rotation, narrow, wide, content) {
var strCmd = '';
if (rotation == 0)
strCmd += 'B ';
else
strCmd += 'VB ';
strCmd += codeType + ' ' + narrow + ' ' + wide + ' ' + h + ' ' + x + ' ' + y + ' ' + content + '\n'
return strCmd;
};
/**
* 打印二维码
*
* x: 文字方块左上角X座标单位dot
* y: 文字方块左上角Y座标单位dot
* level: 错误纠正能力等级取值为L(7%)M(15%)Q(25%)H(30%)
* ver: 1-10 版本根据内容调整以获取合适容量
* scale: 1-10 放大倍数
* content: 文字内容
*
*/
export function addCPCLQRCode(x, y, level, ver, scale, content) {
var strCmd = 'B QR ' + x + ' ' + y + ' M ' + ver + ' U ' + scale + '\n' + level + 'A,' + content + '\n';
strCmd += 'ENDQR\n';
return strCmd;
};
/**
* 放大指令
* scaleX: 横向放大倍数 123等整数
* scaleY: 纵向放大倍数 123等整数
*/
export function addCPCLSETMAG(scaleX, scaleY) {
var strCmd = 'SETMAG ' + scaleX + ' ' + scaleY + '\n';
return strCmd;
};
/**
* 对齐指令 0-左对齐 1-右对齐 2-居中
*/
export function addCPCLLocation(set) {
var strCmd = '';
if (set == 1) {
strCmd += 'RIGHT\n';
} else if (set == 2) {
strCmd += 'CENTER\n';
} else {
strCmd += 'LEFT\n';
}
return strCmd;
};
/**
* 反白线 x0,y0,x1,y1,width
*/
export function addCPCLInverseLine(x0, y0, x1, y1, width) {
var strCmd = 'IL ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
return strCmd;
};
/**
* 画线 x0,y0,x1,y1,width
*/
export function addCPCLLine(x0, y0, x1, y1, width) {
var strCmd = 'L ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
return strCmd;
};
/**
* 画框 x0,y0,x1,y1,width
*/
export function addCPCLBox(x0, y0, x1, y1, width) {
var strCmd = 'BOX ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
return strCmd;
};
/**
* 字体加粗
*/
export function addCPCLSETBOLD(bold) {
var strCmd = 'SETBOLD ' + bold + '\n';
return strCmd;
};
/**
* 字体下划线
*/
export function addCPCLUNDERLINE(c) {
var strCmd = 'UNDERLINE ';
if (c) strCmd += 'ON\n';
else if (c) strCmd += 'OFF\n';
return strCmd;
};
/**
* 水印打印灰度等级 0-255
*/
export function addCPCLBACKGROUND(level) {
var strCmd = 'BACKGROUND ';
if (level > 255 || level < 0) level = 255;
strCmd += level + '\n';
return strCmd;
};
/**
* 打印水印文字
* x: 文字方块左上角X座标单位dot
* y: 文字方块左上角Y座标单位dot
* fontName,fontSize: 字体取值 參考文檔
* rotation: 旋转 1-90 2-180 3-270 其他-不旋转
* content: 文字内容
*/
export function addCPCLBKVText(x, y, fontName, fontSize, rotation, content) {
//console.log(fontName,fontSize,rotation, content);
var strCmd = '';
if (rotation == 1) {
strCmd += 'BKT90 ';
}
if (rotation == 2) {
strCmd += 'BKT180 ';
}
if (rotation == 3) {
strCmd += 'BKT270 ';
} else {
strCmd += 'BKT ';
}
strCmd += fontName + ' ' + fontSize + ' ' + x + ' ' + y + ' ' + content + '\n';
return strCmd;
};
/**
* 标签缝隙定位指令
*/
export function addCPCLGAP() {
var strCmd = 'GAP-SENSE\nFORM\n';
return strCmd;
};
/**
* 标签右黑标检测指令
*/
export function addCPCLSENSE() {
var strCmd = 'BAR-SENSE\nFORM\n';
return strCmd;
};
/**
* 标签左黑标检测指令
*/
export function addCPCLSENSELEFT() {
var strCmd = 'BAR-SENSE LEFT\nFORM\n';
return strCmd;
};
/**
* 打印指令
*/
export function addCPCLPrint() {
var strCmd = 'PRINT\n';
return strCmd;
};
/**
* 图片打印指令
* x: 文字方块左上角X座标单位dot
* y: 文字方块左上角Y座标单位dot
* data{
threshold,//0/1提取的灰度级
width,//图像宽度
height,//图像高度
imageData , //图像数据
}
*/
export function addCPCLImageCmd(x, y, data) {
var strImgCmd = '';
const threshold = data.threshold || 180;
let myBitmapWidth = data.width,
myBitmapHeight = data.height;
let len = parseInt((myBitmapWidth + 7) / 8); //一行的数据长度
//console.log('len=',len);
//console.log('myBitmapWidth=',myBitmapWidth);
//console.log('myBitmapHeight=',myBitmapHeight);
let ndata = 0;
let i = 0;
let j = 0;
let sendImageData = new ArrayBuffer(len * myBitmapHeight);
sendImageData = new Uint8Array(sendImageData);
let pix = data.imageData;
console.log('pix=', pix);
for (i = 0; i < myBitmapHeight; i++) {
for (j = 0; j < len; j++) {
sendImageData[ndata + j] = 0;
}
for (j = 0; j < myBitmapWidth; j++) {
const grayPixle1 = grayPixle(pix.slice((i * myBitmapWidth + j) * 4, (i * myBitmapWidth + j) * 4 + 3));
if (grayPixle1 < threshold)
sendImageData[ndata + parseInt(j / 8)] |= (0x80 >> (j % 8));
}
ndata += len;
}
//console.log('sendImageData=',sendImageData);
//CPCL指令图片数据
strImgCmd += 'EG ' + len + ' ' + myBitmapHeight + ' ' + x + ' ' + y + ' ';
for (i = 0; i < sendImageData.length; i++) {
strImgCmd += Hex2Str(sendImageData[i]);
}
strImgCmd += '\n';
//console.log(strImgCmd);
return strImgCmd;
}
/**
* toast显示捕获的蓝牙异常
*/
export function catchToast(err) {
const errMsg = {
10000: '未初始化蓝牙模块',
10001: '蓝牙未打开',
10002: '没有找到指定设备',
10003: '连接失败',
10004: '没有找到指定服务',
10005: '没有找到指定特征值',
10006: '当前连接已断开',
10007: '当前特征值不支持此操作',
10008: '系统上报异常',
10009: '系统版本低于 4.3 不支持BLE'
};
let coode = err.errCode ? err.errCode.toString() : '';
let msg = errMsg[coode];
plus.nativeUI.toast(msg || coode, {
align: 'center',
verticalAlign: 'center'
});
}

23
src/components/kk-printer/utils/index.js

@ -0,0 +1,23 @@
var barcode = require('./barcode');
var qrcode = require('./qrcode');
function convert_length(length) {
return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);
}
function barc(id, code, width, height) {
barcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))
}
function qrc(id, code, width, height) {
qrcode.api.draw(code, {
ctx: wx.createCanvasContext(id),
width: convert_length(width),
height: convert_length(height)
})
}
module.exports = {
barcode: barc,
qrcode: qrc
}

14633
src/components/kk-printer/utils/mqtt.js

File diff suppressed because it is too large

1
src/components/kk-printer/utils/mqtt.min.js

File diff suppressed because one or more lines are too long

285
src/components/kk-printer/utils/printUtil-GBK.js

File diff suppressed because one or more lines are too long

778
src/components/kk-printer/utils/qrcode.js

@ -0,0 +1,778 @@
var QR = (function () {
// alignment pattern
var adelta = [
0, 11, 15, 19, 23, 27, 31, // force 1 pat
16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
];
// version block
var vpat = [
0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
0x541, 0xc69
];
// final format bits with mask: level << 3 | mask
var fmtword = [
0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, //L
0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, //M
0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, //Q
0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b //H
];
// 4 per version: number of blocks 1,2; data width; ecc width
var eccblocks = [
1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
];
// Galois field log table
var glog = [
0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
];
// Galios field exponent table
var gexp = [
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
];
// Working buffers:
// data input and ecc append, image working buffer, fixed part of image, run lengths for badness
var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[];
// Control values - width is based on version, last 4 are from table.
var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
var ecclevel = 2;
// set bit to indicate cell in qrframe is immutable. symmetric around diagonal
function setmask(x, y)
{
var bt;
if (x > y) {
bt = x;
x = y;
y = bt;
}
// y*y = 1+3+5...
bt = y;
bt *= y;
bt += y;
bt >>= 1;
bt += x;
framask[bt] = 1;
}
// enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
function putalign(x, y)
{
var j;
qrframe[x + width * y] = 1;
for (j = -2; j < 2; j++) {
qrframe[(x + j) + width * (y - 2)] = 1;
qrframe[(x - 2) + width * (y + j + 1)] = 1;
qrframe[(x + 2) + width * (y + j)] = 1;
qrframe[(x + j + 1) + width * (y + 2)] = 1;
}
for (j = 0; j < 2; j++) {
setmask(x - 1, y + j);
setmask(x + 1, y - j);
setmask(x - j, y - 1);
setmask(x + j, y + 1);
}
}
//========================================================================
// Reed Solomon error correction
// exponentiation mod N
function modnn(x)
{
while (x >= 255) {
x -= 255;
x = (x >> 8) + (x & 255);
}
return x;
}
var genpoly = [];
// Calculate and append ECC data to data block. Block is in strinbuf, indexes to buffers given.
function appendrs(data, dlen, ecbuf, eclen)
{
var i, j, fb;
for (i = 0; i < eclen; i++)
strinbuf[ecbuf + i] = 0;
for (i = 0; i < dlen; i++) {
fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
if (fb != 255) /* fb term is non-zero */
for (j = 1; j < eclen; j++)
strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
else
for( j = ecbuf ; j < ecbuf + eclen; j++ )
strinbuf[j] = strinbuf[j + 1];
strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
}
}
//========================================================================
// Frame data insert following the path rules
// check mask - since symmetrical use half.
function ismasked(x, y)
{
var bt;
if (x > y) {
bt = x;
x = y;
y = bt;
}
bt = y;
bt += y * y;
bt >>= 1;
bt += x;
return framask[bt];
}
//========================================================================
// Apply the selected mask out of the 8.
function applymask(m)
{
var x, y, r3x, r3y;
switch (m) {
case 0:
for (y = 0; y < width; y++)
for (x = 0; x < width; x++)
if (!((x + y) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
break;
case 1:
for (y = 0; y < width; y++)
for (x = 0; x < width; x++)
if (!(y & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
break;
case 2:
for (y = 0; y < width; y++)
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!r3x && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
break;
case 3:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = r3y, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!r3x && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 4:
for (y = 0; y < width; y++)
for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {
if (r3x == 3) {
r3x = 0;
r3y = !r3y;
}
if (!r3y && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
break;
case 5:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 6:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
case 7:
for (r3y = 0, y = 0; y < width; y++, r3y++) {
if (r3y == 3)
r3y = 0;
for (r3x = 0, x = 0; x < width; x++, r3x++) {
if (r3x == 3)
r3x = 0;
if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
qrframe[x + y * width] ^= 1;
}
}
break;
}
return;
}
// Badness coefficients.
var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
// Using the table of the length of each run, calculate the amount of bad image
// - long runs or those that look like finders; called twice, once each for X and Y
function badruns(length)
{
var i;
var runsbad = 0;
for (i = 0; i <= length; i++)
if (rlens[i] >= 5)
runsbad += N1 + rlens[i] - 5;
// BwBBBwB as in finder
for (i = 3; i < length - 1; i += 2)
if (rlens[i - 2] == rlens[i + 2]
&& rlens[i + 2] == rlens[i - 1]
&& rlens[i - 1] == rlens[i + 1]
&& rlens[i - 1] * 3 == rlens[i]
// white around the black pattern? Not part of spec
&& (rlens[i - 3] == 0 // beginning
|| i + 3 > length // end
|| rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
)
runsbad += N3;
return runsbad;
}
// Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
function badcheck()
{
var x, y, h, b, b1;
var thisbad = 0;
var bw = 0;
// blocks of same color.
for (y = 0; y < width - 1; y++)
for (x = 0; x < width - 1; x++)
if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
&& qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
|| !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
|| qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
thisbad += N2;
// X runs
for (y = 0; y < width; y++) {
rlens[0] = 0;
for (h = b = x = 0; x < width; x++) {
if ((b1 = qrframe[x + width * y]) == b)
rlens[h]++;
else
rlens[++h] = 1;
b = b1;
bw += b ? 1 : -1;
}
thisbad += badruns(h);
}
// black/white imbalance
if (bw < 0)
bw = -bw;
var big = bw;
var count = 0;
big += big << 2;
big <<= 1;
while (big > width * width)
big -= width * width, count++;
thisbad += count * N4;
// Y runs
for (x = 0; x < width; x++) {
rlens[0] = 0;
for (h = b = y = 0; y < width; y++) {
if ((b1 = qrframe[x + width * y]) == b)
rlens[h]++;
else
rlens[++h] = 1;
b = b1;
}
thisbad += badruns(h);
}
return thisbad;
}
function genframe(instring)
{
var x, y, k, t, v, i, j, m;
// find the smallest version that fits the string
t = instring.length;
version = 0;
do {
version++;
k = (ecclevel - 1) * 4 + (version - 1) * 16;
neccblk1 = eccblocks[k++];
neccblk2 = eccblocks[k++];
datablkw = eccblocks[k++];
eccblkwid = eccblocks[k];
k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
if (t <= k)
break;
} while (version < 40);
// FIXME - insure that it fits insted of being truncated
width = 17 + 4 * version;
// allocate, clear and setup data structures
v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
for( t = 0; t < v; t++ )
eccbuf[t] = 0;
strinbuf = instring.slice(0);
for( t = 0; t < width * width; t++ )
qrframe[t] = 0;
for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)
framask[t] = 0;
// insert finders - black to frame, white to mask
for (t = 0; t < 3; t++) {
k = 0;
y = 0;
if (t == 1)
k = (width - 7);
if (t == 2)
y = (width - 7);
qrframe[(y + 3) + width * (k + 3)] = 1;
for (x = 0; x < 6; x++) {
qrframe[(y + x) + width * k] = 1;
qrframe[y + width * (k + x + 1)] = 1;
qrframe[(y + 6) + width * (k + x)] = 1;
qrframe[(y + x + 1) + width * (k + 6)] = 1;
}
for (x = 1; x < 5; x++) {
setmask(y + x, k + 1);
setmask(y + 1, k + x + 1);
setmask(y + 5, k + x);
setmask(y + x + 1, k + 5);
}
for (x = 2; x < 4; x++) {
qrframe[(y + x) + width * (k + 2)] = 1;
qrframe[(y + 2) + width * (k + x + 1)] = 1;
qrframe[(y + 4) + width * (k + x)] = 1;
qrframe[(y + x + 1) + width * (k + 4)] = 1;
}
}
// alignment blocks
if (version > 1) {
t = adelta[version];
y = width - 7;
for (;;) {
x = width - 7;
while (x > t - 3) {
putalign(x, y);
if (x < t)
break;
x -= t;
}
if (y <= t + 9)
break;
y -= t;
putalign(6, y);
putalign(y, 6);
}
}
// single black
qrframe[8 + width * (width - 8)] = 1;
// timing gap - mask only
for (y = 0; y < 7; y++) {
setmask(7, y);
setmask(width - 8, y);
setmask(7, y + width - 7);
}
for (x = 0; x < 8; x++) {
setmask(x, 7);
setmask(x + width - 8, 7);
setmask(x, width - 8);
}
// reserve mask-format area
for (x = 0; x < 9; x++)
setmask(x, 8);
for (x = 0; x < 8; x++) {
setmask(x + width - 8, 8);
setmask(8, x);
}
for (y = 0; y < 7; y++)
setmask(8, y + width - 7);
// timing row/col
for (x = 0; x < width - 14; x++)
if (x & 1) {
setmask(8 + x, 6);
setmask(6, 8 + x);
}
else {
qrframe[(8 + x) + width * 6] = 1;
qrframe[6 + width * (8 + x)] = 1;
}
// version block
if (version > 6) {
t = vpat[version - 7];
k = 17;
for (x = 0; x < 6; x++)
for (y = 0; y < 3; y++, k--)
if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
}
else {
setmask(5 - x, 2 - y + width - 11);
setmask(2 - y + width - 11, 5 - x);
}
}
// sync mask bits - only set above for white spaces, so add in black bits
for (y = 0; y < width; y++)
for (x = 0; x <= y; x++)
if (qrframe[x + width * y])
setmask(x, y);
// convert string to bitstream
// 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
v = strinbuf.length;
// string to array
for( i = 0 ; i < v; i++ )
eccbuf[i] = strinbuf.charCodeAt(i);
strinbuf = eccbuf.slice(0);
// calculate max string length
x = datablkw * (neccblk1 + neccblk2) + neccblk2;
if (v >= x - 2) {
v = x - 2;
if (version > 9)
v--;
}
// shift and repack to insert length prefix
i = v;
if (version > 9) {
strinbuf[i + 2] = 0;
strinbuf[i + 3] = 0;
while (i--) {
t = strinbuf[i];
strinbuf[i + 3] |= 255 & (t << 4);
strinbuf[i + 2] = t >> 4;
}
strinbuf[2] |= 255 & (v << 4);
strinbuf[1] = v >> 4;
strinbuf[0] = 0x40 | (v >> 12);
}
else {
strinbuf[i + 1] = 0;
strinbuf[i + 2] = 0;
while (i--) {
t = strinbuf[i];
strinbuf[i + 2] |= 255 & (t << 4);
strinbuf[i + 1] = t >> 4;
}
strinbuf[1] |= 255 & (v << 4);
strinbuf[0] = 0x40 | (v >> 4);
}
// fill to end with pad pattern
i = v + 3 - (version < 10);
while (i < x) {
strinbuf[i++] = 0xec;
// buffer has room if (i == x) break;
strinbuf[i++] = 0x11;
}
// calculate and append ECC
// calculate generator polynomial
genpoly[0] = 1;
for (i = 0; i < eccblkwid; i++) {
genpoly[i + 1] = 1;
for (j = i; j > 0; j--)
genpoly[j] = genpoly[j]
? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
}
for (i = 0; i <= eccblkwid; i++)
genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
// append ecc to data buffer
k = x;
y = 0;
for (i = 0; i < neccblk1; i++) {
appendrs(y, datablkw, k, eccblkwid);
y += datablkw;
k += eccblkwid;
}
for (i = 0; i < neccblk2; i++) {
appendrs(y, datablkw + 1, k, eccblkwid);
y += datablkw + 1;
k += eccblkwid;
}
// interleave blocks
y = 0;
for (i = 0; i < datablkw; i++) {
for (j = 0; j < neccblk1; j++)
eccbuf[y++] = strinbuf[i + j * datablkw];
for (j = 0; j < neccblk2; j++)
eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
}
for (j = 0; j < neccblk2; j++)
eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
for (i = 0; i < eccblkwid; i++)
for (j = 0; j < neccblk1 + neccblk2; j++)
eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
strinbuf = eccbuf;
// pack bits into frame avoiding masked area.
x = y = width - 1;
k = v = 1; // up, minus
/* inteleaved data and ecc codes */
m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
for (i = 0; i < m; i++) {
t = strinbuf[i];
for (j = 0; j < 8; j++, t <<= 1) {
if (0x80 & t)
qrframe[x + width * y] = 1;
do { // find next fill position
if (v)
x--;
else {
x++;
if (k) {
if (y != 0)
y--;
else {
x -= 2;
k = !k;
if (x == 6) {
x--;
y = 9;
}
}
}
else {
if (y != width - 1)
y++;
else {
x -= 2;
k = !k;
if (x == 6) {
x--;
y -= 8;
}
}
}
}
v = !v;
} while (ismasked(x, y));
}
}
// save pre-mask copy of frame
strinbuf = qrframe.slice(0);
t = 0; // best
y = 30000; // demerit
// for instead of while since in original arduino code
// if an early mask was "good enough" it wouldn't try for a better one
// since they get more complex and take longer.
for (k = 0; k < 8; k++) {
applymask(k); // returns black-white imbalance
x = badcheck();
if (x < y) { // current mask better than previous best?
y = x;
t = k;
}
if (t == 7)
break; // don't increment i to a void redoing mask
qrframe = strinbuf.slice(0); // reset for next pass
}
if (t != k) // redo best mask - none good enough, last wasn't t
applymask(t);
// add in final mask/ecclevel bytes
y = fmtword[t + ((ecclevel - 1) << 3)];
// low byte
for (k = 0; k < 8; k++, y >>= 1)
if (y & 1) {
qrframe[(width - 1 - k) + width * 8] = 1;
if (k < 6)
qrframe[8 + width * k] = 1;
else
qrframe[8 + width * (k + 1)] = 1;
}
// high byte
for (k = 0; k < 7; k++, y >>= 1)
if (y & 1) {
qrframe[8 + width * (width - 7 + k)] = 1;
if (k)
qrframe[(6 - k) + width * 8] = 1;
else
qrframe[7 + width * 8] = 1;
}
// return image
return qrframe;
}
var _canvas = null,
_size = null;
var api = {
get ecclevel () {
return ecclevel;
},
set ecclevel (val) {
ecclevel = val;
},
get size () {
return _size;
},
set size (val) {
_size = val
},
get canvas () {
return _canvas;
},
set canvas (el) {
_canvas = el;
},
getFrame: function (string) {
return genframe(string);
},
draw: function (string, canvas, size, ecc) {
ecclevel = ecc || ecclevel;
canvas = canvas || _canvas;
if (!canvas) {
console.warn('No canvas provided to draw QR code in!')
return;
}
size = size || _size || Math.min(canvas.width, canvas.height);
var frame = genframe(string),
ctx = canvas.ctx,
px = Math.round(size / (width + 8));
var roundedSize = px * (width + 8),
offset = Math.floor((size - roundedSize) / 2);
size = roundedSize;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.setFillStyle('#000000');
for (var i = 0; i < width; i++) {
for (var j = 0; j < width; j++) {
if (frame[j * width + i]) {
ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
}
}
}
ctx.draw();
}
}
module.exports = {
api: api
}
})()

171
src/components/kk-printer/utils/util.js

@ -0,0 +1,171 @@
//const gbk = require('./gbk.js');
//console.log("sasas" + gbk);
const formatTime = date => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
/*
const hexStringToBuff = str => { //str='中国:WXHSH'
const buffer = new ArrayBuffer((sumStrLength(str)) * 4)
const dataView = new DataView(buffer)
var data = str.toString();
var p = 0; //ArrayBuffer 偏移量
for (var i = 0; i < data.length; i++) {
if (isCN(data[i])) { //是中文
//调用GBK 转码
var t = gbk.encode(data[i]);
for (var j = 0; j < 2; j++) {
//var code = t[j * 2] + t[j * 2 + 1];
var code = t[j * 3 + 1] + t[j * 3 + 2];
var temp = parseInt(code, 16)
//var temp = strToHexCharCode(code);
dataView.setUint8(p++, temp)
}
} else {
var temp = data.charCodeAt(i);
dataView.setUint8(p++, temp)
}
}
return buffer;
}
*/
function toUnicode(s) {
var str = "";
for (var i = 0; i < s.length; i++) {
str += "\\u" + s.charCodeAt(i).toString(16) + "\t";
}
return str;
}
function strToHexCharCode(str) {
if (str === "")
return "";
var hexCharCode = [];
hexCharCode.push("0x");
for (var i = 0; i < str.length; i++) {
hexCharCode.push((str.charCodeAt(i)).toString(16));
}
return hexCharCode.join("");
}
function sumStrLength(str) {
var length = 0;
var data = str.toString();
for (var i = 0; i < data.length; i++) {
if (isCN(data[i])) { //是中文
length += 2;
} else {
length += 1;
}
}
return length;
}
function isCN(str) {
if (/^[\u3220-\uFA29]+$/.test(str)) {
return true;
} else {
return false;
}
}
//汉字转码
export function hexStringToArrayBuffer(str) {
const buffer = new ArrayBuffer((str.length / 2) + 1)
const dataView = new DataView(buffer)
for (var i = 0; i < str.length / 2; i++) {
var temp = parseInt(str[i * 2] + str[i * 2 + 1], 16)
dataView.setUint8(i, temp)
}
dataView.setUint8((str.length / 2), 0x0a)
return buffer;
}
//返回八位数组
function subString(str) {
var arr = [];
if (str.length > 8) { //大于8
for (var i = 0;
(i * 8) < str.length; i++) {
var temp = str.substring(i * 8, 8 * i + 8);
arr.push(temp)
}
return arr;
} else {
return str
}
}
//不带有汉字
function hexStringToArrayBufferstr(str) {
let val = ""
for (let i = 0; i < str.length; i++) {
if (val === '') {
val = str.charCodeAt(i).toString(16)
} else {
val += ',' + str.charCodeAt(i).toString(16)
}
}
val += "," + "0x0a";
console.log(val)
// 将16进制转化为ArrayBuffer
return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
})).buffer
}
export function ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
})
return hexArr.join('');
}
// ArrayBuffer转为字符串,参数为ArrayBuffer对象
export function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
// 字符串转为ArrayBuffer对象,参数为字符串
export function str2ab(str) {
var buf = new ArrayBuffer(str.length+1); // 补充/0
var bufView = new Uint8Array(buf);
for (var i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
export function send0X0A() {
const buffer = new ArrayBuffer(1)
const dataView = new DataView(buffer)
dataView.setUint8(0, 0x0a)
return buffer;
}
export function buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
// module.exports = {
// hexStringToArrayBuffer: hexStringToArrayBuffer,
// send0X0A: send0X0A,
// ab2hex: ab2hex,
// str2ab: str2ab,
// ab2str: ab2str,
// buf2hex: buf2hex
// }

7
src/components/show-modal/show-modal.vue

@ -13,7 +13,7 @@
</scroll-view>
<u-line></u-line>
<view class='split_line'></view>
<slot name="button">
<view class="uni-flex uni-row u-col-center space-between" style="width: 100%;height: 48px;">
<view v-if="showCancelButton" class="cance_button" @tap="$u.throttle(cancelClose, 500)">
@ -73,7 +73,6 @@
if (this.show) {
this.show = false;
clearInterval(this.timer) //timer
this.$.refs.modal.popupClose();
this.success({
// cancel: false,
confirm: true,
@ -83,7 +82,9 @@
cancelClose() {
clearInterval(this.timer) //timer
this.$.refs.modal.popupClose();
if(this.$refs.modal){
this.$refs.modal.popupClose();
}
this.success({
// cancel: true,
confirm: false,

84
src/hybrid/html/point.html

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title></title>
<script src="../../api/img-to-base64.js"></script>
<script type="text/javascript">
document.addEventListener('plusready', function() {
//console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。")
});
</script>
<style>
.box {
font-size: 14px;
display: flex;
margin-top: 60px;
}
.left {
border-top: 1px solid #b1b1b1;
border-left: 1px solid #b1b1b1;
flex: 1;
}
.left-item {
display: flex;
}
.bold-font{
font-weight: bold;
font-size: 28rpx;
}
.label {
border-bottom: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
width: 60px;
padding: 0px 5px;
height: 58px;
line-height: 58px;
}
.value {
border-bottom: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
padding: 0px 5px;
height: 58px;
flex: 1;
width: 0px;
display: flex;
align-items: center;
word-break: break-all;
}
.right {
width: 300px;
}
.image {
width: calc(100% - 1px);
height: 176px;
border-bottom: 1px solid #b1b1b1;
border-top: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
}
.image img {
width: 172px;
height: 172px;
border: 1px solid #b1b1b1;
/* width: calc(100% - 4px);
height: calc(100% - 4px); */
margin: 1px;
}
</style>
</head>
<body>
mainBody
</body>
</html>

131
src/hybrid/html/pointPutawayJob.html

@ -0,0 +1,131 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title></title>
<script src="../../api/img-to-base64.js"></script>
<script type="text/javascript">
document.addEventListener('plusready', function() {
//console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。")
});
</script>
<style>
.box {
font-size: 13px;
/* padding: 10px; */
border: 1px solid #dedede;
}
.left {
border-top: 1px solid #b1b1b1;
border-left: 1px solid #b1b1b1;
flex: 1;
}
.left-item {
display: flex;
}
.label {
border-bottom: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
width: 60px;
padding: 0px 5px;
height: 30px;
line-height: 30px;
}
.value {
border-bottom: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
padding: 0px 5px;
height: 30px;
flex: 1;
width: 0px;
display: flex;
align-items: center;
word-wrap: break-word;
}
.right {
width: 200px;
}
.image {
width: 100%;
height: 202px;
border-bottom: 1px solid #b1b1b1;
border-top: 1px solid #b1b1b1;
border-right: 1px solid #b1b1b1;
}
.image img {
width: calc(100% - 4px);
height: calc(100% - 4px);
margin: 2px;
}
.mb-kw {
border-bottom: 1px solid #dedede;
padding: 10px;
font-size: 15px;
}
.mb-kw div {
font-weight: bold;
font-size: 23px;
text-align: center;
}
.mb-bo {
display: flex;
}
.mb-bo .mb-left {
flex: 1
}
.mb-bo .mb-left .mb-text {
padding: 10px;
}
.mb-bo .mb-left .mb-text:nth-child(1) {
border-bottom: 1px solid #dedede;
}
.mb-bo .mb-left .mb-text div {
font-weight: bold;
font-size: 16px;
text-align: center;
}
.mb-bo .mb-right {
padding: 10px;
width: 230px;
border-left: 1px solid #dedede;
display: flex;
align-items: center;
}
.mb-bo .mb-right .mb-text {
width: 100%;
}
.mb-bo .mb-right .mb-text div {
font-weight: bold;
font-size: 20px;
text-align: center;
width: 100%;
}
</style>
</head>
<body>
mainBody
</body>
</html>

78
src/hybrid/html/purchaseReceiptJob.html

@ -0,0 +1,78 @@
<!-- 采购收货打印指引单 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title></title>
<script src="../../api/img-to-base64.js"></script>
<script type="text/javascript">
document.addEventListener('plusready', function() {
//console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。")
});
</script>
<style>
.box {
font-size: 13px;
/* padding: 10px; */
}
.mb-kw {
border-top: 1px solid #dedede;
border-left: 1px solid #dedede;
border-right: 1px solid #dedede;
font-size: 15px;
display: flex;
align-items: center
}
.top1 th {
font-weight: bold;
font-size: 13px;
padding: 10px;
text-align: left;
}
table {
border-collapse: collapse;
border: 1px solid #dedede;
/* 设置表格的边框 */
width: 100%
}
th{
font-weight: bold;
font-size: 13px;
padding: 10px;
}
td{
padding: 10px;
}
td:nth-child(2n){
width:calc(50% - 100px);
}
td:nth-child(2n+1){
width:80px;
}
.relative{
margin-bottom: 10px;
position: relative;
}
.q{
position: absolute;
left: 50%;
top:50%;
font-size: 160px;
transform: translate(-50% ,-50%);
color: rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body>
mainBody
</body>
</html>

7
src/main.js

@ -4,10 +4,12 @@ import './router/my_router.js'; //引入拦截
import VueClipboard from 'vue-clipboard2' //复制粘贴
import uView from './uni_modules/vk-uview-ui';// 引入 uView UI
import comMessage from './mycomponents/common/comMessage.vue'
import noclick from './common/noclick.js'
// #ifndef VUE3
import Vue from 'vue'
console.log("Vuew2222");
console.log("Vuew2222");//配置公共方法 防治多次点击
Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.prototype.$adpid = "1111111111"
@ -33,7 +35,8 @@ export function createApp() {
app.use(VueClipboard)
app.use(uView)
app.component('comMessage', comMessage)
console.log("网络22请求")
app.config.globalProperties.$noMultipleClicks = noclick.noMultipleClicks;
app.config.globalProperties.$throttle = noclick.throttle;
// startApp(app);
return {
app,

51
src/manifest.json

@ -1,9 +1,10 @@
{
"name" : "wms",
"appid" : "__UNI__43932FE",
"package" : "uni.UNI43932FE",
"appid" : "__UNI__C9CF4BF",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : 1,
"versionName" : "1.0.65",
"versionCode" : 65,
"transformPx" : false,
/* 5+App */
"app-plus" : {
@ -44,7 +45,9 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>",
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"minSdkVersion" : 23
@ -56,6 +59,46 @@
/* SDK */
"sdkConfigs" : {
"ad" : {}
},
"nativePlugins" : {
"TestModule" : {
"__plugin_info__" : {
"name" : "TestModule",
"description" : "打印",
"platforms" : "Android",
"url" : "",
"android_package_name" : "",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {}
}
}
},
"icons" : {
"android" : {
"hdpi" : "src/static/logo/72x72.png",
"xhdpi" : "src/static/logo/96x96.png",
"xxhdpi" : "src/static/logo/144x144.png",
"xxxhdpi" : "src/static/logo/196x196.png"
}
}
},
"nativePlugins" : {
"TestModule" : {
"__plugin_info__" : {
"name" : "TestModule",
"description" : "打印",
"platforms" : "Android",
"url" : "",
"android_package_name" : "",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {}
}
}
}
},

39
src/mycomponents/balance/balance.vue

@ -2,24 +2,33 @@
<view :class="dataContent.scaned?'scan_view':''" style="background-color: #ffffff;margin-bottom: 1px; ">
<view class="uni-flex uni-row space-between" style="align-items: center">
<view>
<pack v-if="isShowParentPack &&dataContent.parentNumber" title="父包装"
:packingCode="dataContent.parentNumber"></pack>
<pack v-if="isShowPack && dataContent.packingNumber" :packingCode="dataContent.packingNumber"></pack>
<batch v-if="isShowBatch && dataContent.batch" :batch="dataContent.batch"></batch>
<location title="来源库位" v-if="isShowFromLocation" :locationCode="dataContent.locationCode"></location>
<to-location title="目标库位" v-if="isShowToLocation" :locationCode="dataContent.toLocationCode">
</to-location>
</view>
<view>
<!-- <qty v-if="dataContent.record==null ||dataContent.record==undefined " :dataContent="dataContent"
:isShowStdPack="isShowStdPack" :isShowStatus="isShowStatus"></qty> -->
<qty v-if="dataContent.handleQty==0 || dataContent.handleQty==undefined" :dataContent="dataContent"
:isShowStdPack="isShowStdPack" :isShowStatus="isShowStatus"></qty>
<compare-qty v-else :dataContent="dataContent" :recommendQty="Number( dataContent.qty)"
:handleQty="Number (dataContent.handleQty)" :isShowStdPack="isShowStdPack">
</compare-qty>
<view class="uni-flex uni-row" style="vertical-align:center" v-if="isDevlement()">
<text style="font-size: 30rpx;color: #2979ff; " @click="copy">复制采购</text>
<text style="font-size: 30rpx;color: #2979ff;" @click="copyPro">|制品</text>
<view class="uni-flex" style="flex-direction: column;">
<view class="uni-flex uni-row center">
<!-- <qty v-if="dataContent.record==null ||dataContent.record==undefined " :dataContent="dataContent"
:isShowStdPack="isShowStdPack" :isShowStatus="isShowStatus"></qty> -->
<qty v-if="dataContent.handleQty==0 || dataContent.handleQty==undefined" :dataContent="dataContent"
:isShowStdPack="isShowStdPack" :isShowStatus="isShowStatus"></qty>
<compare-qty v-else :dataContent="dataContent" :recommendQty="Number( dataContent.qty)"
:handleQty="Number (dataContent.handleQty)" :isShowStdPack="isShowStdPack"
:isShowStatus='isShowStatus'>
</compare-qty>
<!-- <view class="uni-flex uni-row" style="vertical-align:center" v-if="isDevlement()">
<text style="font-size: 30rpx;color: #2979ff; width: 20px;" @click="copy">复制</text>
</view> -->
</view>
<!-- <view class="" v-if="isShowStatus && dataContent.inventoryStatus">
<move-status :fromInventoryStatus="dataContent.inventoryStatus">
</move-status>
</view> -->
</view>
</view>
<!-- <u-line></u-line> -->
@ -35,6 +44,7 @@
import recommendQty from '@/mycomponents/qty/recommendQty.vue'
import compareQty from '@/mycomponents/qty/compareQty.vue'
import config from '@/static/config.js'
import moveStatus from '@/mycomponents/balance/moveStatus.vue'
export default {
components: {
@ -45,6 +55,7 @@
qty,
recommendQty,
compareQty,
moveStatus
},
data() {
@ -81,6 +92,10 @@
type: Boolean,
default: false
},
isShowParentPack: {
type: Boolean,
default: true
},
},
watch: {
@ -144,4 +159,4 @@
</script>
<style>
</style>
</style>

2
src/mycomponents/balance/balanceDetailPopup.vue

@ -4,7 +4,7 @@
<!-- <com-item :dataContent="dataContent.package"></com-item>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:320px ">
<view v-for="(item, index) in dataList" style="width: 100%;">
<view class="item">

2
src/mycomponents/balance/balanceMove.vue

@ -18,7 +18,7 @@
</view>
</view>
<u-line></u-line>
<view class='split_line'></view>
</view>
</template>

24
src/mycomponents/balance/balanceSelect.vue

@ -3,10 +3,17 @@
<!-- <page-meta root-font-size="18px"></page-meta> -->
<uni-popup ref="popupItems" type="center">
<scroll-view scroll-y="true" style="background-color: #EEEEEE;height: 90vh;">
<item :dataContent="balanceItems[0]"></item>
<item style="margin: 10rpx;" :dataContent="balanceItems[0]"></item>
<view class="popinpop count_shadow" style="width: 90vw;margin: 20rpx 20rpx 30rpx 20rpx;"
v-for="(item, index) in balanceItems" :key="item.id" @click="callback(item)">
<balance :dataContent="item"></balance>
<balance :dataContent="item" :isShowStatus="false"></balance>
</view>
<view class="page-footer">
<view class="uni-flex space-between" style=" width: 100%; ">
<!-- <view class=" uni-flex uni-row"> -->
<button class="btn_single_reject" hover-class="btn_commit_after" @click="close">关闭</button>
<!-- </view> -->
</view>
</view>
</scroll-view>
</uni-popup>
@ -37,7 +44,13 @@
},
methods: {
openPopup(items) {
this.balanceItems = items;
if (Array.isArray(items)) {
this.balanceItems = items;
} else {
this.balanceItems = [items];
}
this.$refs['popupItems'].open("center");
},
@ -46,9 +59,12 @@
this.$refs['popupItems'].close();
},
close() {
this.$refs['popupItems'].close();
}
}
}
</script>
<style scoped lang="scss">
</style>
</style>

2
src/mycomponents/balance/batch.vue

@ -1,6 +1,6 @@
<template>
<view class="card_view ">
<text class="card_batch card_content ">批次</text>
<text class="card_batch ">批次</text>
<text class="card_content ">{{batch}}</text>
</view>
</template>

10
src/mycomponents/balance/bussinessType.vue

@ -1,13 +1,14 @@
<template>
<view class="business_view">
<text class="card_business">{{businessTypeDesc(bussinessType)}}</text>
<text class="card_business_content">{{number}}</text>
<text class="card_business">业务类型</text>
<text class="card_business_content">{{businessTypeDesc(bussinessType)}}</text>
</view>
</template>
<script>
import {
getBusinessTypeDesc
getBusinessTypeName,
} from '@/common/directory.js';
export default {
data() {
@ -25,7 +26,8 @@
},
methods:{
businessTypeDesc(type){
return getBusinessTypeDesc(type)
// return"1"
return getBusinessTypeName(type)
}
}

15
src/mycomponents/balance/handleBalance.vue

@ -1,17 +1,19 @@
<template>
<view :class="detail.scaned?'scan_view':''" style="background-color: #ffffff;">
<view class="space_between center" >
<view class="space_between center">
<view style="word-break: break-all;width: 60%;">
<pack title='外包装' v-if="detail.parentPackingNumber"
:packingCode="detail.parentPackingNumber"></pack>
<pack v-if="isShowPack" :packingCode="detail.packingNumber"></pack>
<batch v-if="isShowBatch" :batch="detail.batch"></batch>
<location v-if="isShowLocation" :locationCode="detail.fromLocationCode"></location>
</view>
<view style="word-break: break-all;">
<recommend-qty v-if="detail.record==null || detail.record==undefined" :dataContent="detail"
:isShowStdPack="false"></recommend-qty>
:isShowStatus='isShowStatus' :isShowStdPack="true"></recommend-qty>
<compare-qty v-else :dataContent="detail" :recommendQty="detail.qty" :handleQty="detail.record.qty"
:isShowStdPack="false">
:isShowStatus='isShowStatus' :isShowStdPack="true">
</compare-qty>
</view>
</view>
@ -56,7 +58,10 @@
type: Boolean,
default: true
},
isShowStatus: {
type: Boolean,
default: true
},
},
watch: {
@ -77,4 +82,4 @@
opacity: 1;
}
</style>
</style>

37
src/mycomponents/balance/level.vue

@ -0,0 +1,37 @@
<template>
<view class="card_view ">
<text class="card_level">{{title}}</text>
<text class="card_big_content" style="font-size: 40rpx;">{{getPriorityName1()}}</text>
</view>
</template>
<script>
import {getPriorityName} from '@/common/directory.js';
export default {
components: {
},
data() {
return {}
},
props: {
priority: {
type: Number,
default:2
},
title: {
type: String,
default: '优先级'
},
},
methods:{
getPriorityName1(){
return getPriorityName(this.priority)
}
},
}
</script>
<style>
</style>

39
src/mycomponents/balance/light.vue

@ -0,0 +1,39 @@
<template>
<view class="card_view">
<text class="card_light ">{{title}}</text>
<text class="card_content ">{{lightCode}}</text>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
}
},
props: {
lightCode: {
type: String,
default: ''
},
title:
{
type:String,
default: '灯码'
}
},
watch: {
},
methods: {
}
}
</script>
<style>
</style>

4
src/mycomponents/balance/location.vue

@ -1,7 +1,7 @@
<template>
<view class="card_view ">
<text class="card_location card_content ">{{title}}</text>
<text class="card_content ">{{locationCode}}</text>
<text class="card_location">{{title}}</text>
<text class="card_big_content" style="font-size: 40rpx;">{{locationCode}}</text>
</view>
</template>

7
src/mycomponents/balance/pack.vue

@ -1,6 +1,6 @@
<template>
<view class="card_view">
<text class="card_packing_code card_content ">箱码</text>
<text class="card_packing_code ">{{title}}</text>
<text class="card_content ">{{packingCode}}</text>
</view>
</template>
@ -20,6 +20,11 @@
type: String,
default: ''
},
title:
{
type:String,
default: '包装'
}
},
watch: {

4
src/mycomponents/balance/toLocation.vue

@ -1,7 +1,7 @@
<template>
<view class="card_view ">
<text class="card_to_location card_content ">{{title}}</text>
<text class="card_content ">{{locationCode}}</text>
<text class="card_to_location ">{{title}}</text>
<text class="card_big_content ">{{locationCode}}</text>
</view>
</template>

0
src/mycomponents/Batch/Batch.vue → src/mycomponents/batch/batch.vue

11
src/mycomponents/common/comBlankView.vue

@ -3,7 +3,7 @@
<image class="img_goscan" src="@/static/icons_ui/default_blank.png"></image>
<button @click="goScan">
<image src="@/static/icons_ui/icon_add.svg"></image>
去扫描
{{title}}
</button>
</view>
</template>
@ -14,6 +14,13 @@
return {
}
},
props: {
title: {
type: String,
default: '去扫描'
}
},
created() {
@ -28,4 +35,4 @@
<style>
</style>
</style>

4
src/mycomponents/common/comListHint.vue

@ -39,14 +39,14 @@
</view> -->
</view>
<u-line></u-line>
<view class='split_line'></view>
<view class="" v-for="(item, index) in dataList">
<view class="item" v-if="(item.title!='worker')" v-show="(item.title!='date')">
<text class="item_title">{{item.title}} : </text>
<text class="text_wrap">{{item.content}} </text>
</view>
</view>
<u-line></u-line>
<view class='split_line'></view>
<view v-if="isShowbottom" style="margin-top: 10rpx;margin-bottom: 10rpx;width: 100%;display: flex;"
class="uni-flex uni-row space-between u-col-center">
<view class="uni-flex uni-row u-col-center " style="flex: 1; overflow: hidden;">

8
src/mycomponents/common/comListItem.vue

@ -8,7 +8,7 @@
<text v-else-if="item.type=='boolean'" class="text_wrap">{{boolean(item.content)}} </text>
<text v-else-if="item.type=='transferMode'" class="text_wrap">{{getTransferModeName(item.content)}} </text>
<text v-else-if="item.type=='locationType'" class="text_wrap">{{getLocationTypeNameList(getDirectoryItemArray(item.content))}} </text>
<text v-else-if="item.type=='uom'" class="text_wrap">{{getUnitInfo(item.content)}} </text>
<text v-else-if="item.type=='uom'" class="text_wrap">{{getUomInfo(item.content)}} </text>
<text v-else-if="item.type=='inspectType'" class="text_wrap">{{getInspectType(item.content)}} </text>
<text v-else-if="item.type=='sampleMethod'" class="text_wrap">{{getSampleMethod(item.content)}} </text>
<text v-else-if="item.type=='requestState'" class="text_wrap">{{getRequestStateInfo(item.content)}} </text>
@ -30,7 +30,7 @@
getTransferModeName,
getLocationTypeNameList,
getDirectoryItemArray,
getUnitInfo,
getUomInfo,
getInspectType,
getSampleMethod,
getRequestStateInfo,
@ -81,8 +81,8 @@
getDirectoryItemArray(value){
return getDirectoryItemArray(value)
},
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
},
getInspectType(value){
return getInspectType(value)

102
src/mycomponents/common/comMessage.vue

@ -2,18 +2,32 @@
<view>
<u-modal v-model="show" :title-style="{color: 'red'}" :title="title" :showTitle="false"
:showConfirmButton="false" ref="modal">
<view class="" style="width: 100%;display: flex; align-items: center; justify-content: center;margin-top: 10rpx; " >
<view class="" style="">
版本号 : {{version}}
</view>
</view>
<view class="slot-content">
<slot name="icon">
<image class="icon" :src="icon" />
</slot>
<slot name="content">
<rich-text class="content" :nodes="content">
</rich-text>
</slot>
<u-line></u-line>
<scroll-view style="max-height: 400rpx; " scroll-y="true">
<slot name="content">
<view class="" style="display: flex;align-items: center;justify-content: center;">
<text class="text_content" :style="{'color': textColor?textColor:'#000'}" >
{{content}}
</text>
</view>
<!-- <rich-text class="content" :nodes="content" v-else></rich-text> -->
</slot>
</scroll-view>
<view class='split_line'></view>
<slot name="button">
<view class="uni-flex uni-row u-col-center space-between" style="width: 100%;height: 48px;">
<view class="uni-flex uni-row u-col-center space-between" style="width: 100%;height: 50rpx;">
<view v-if="showCancelButton" class="cance_button" @tap="cancelClose">
<text :style="{'color':cancelColor}">{{ cancelText }}</text>
</view>
@ -56,13 +70,42 @@
cancel: false, // true
isDisabled: true, // true
seconds: 0,
success: () => {} //
success: () => {} ,//
version:"",
textColor:'',
count:0
}
},
mounted() {
// const systemInfo = uni.getSystemInfoSync();
// // #ifdef H5
// this.version = systemInfo.appVersion;
// console.log(systemInfo.appVersion, '');
// // #endif
// // #ifdef APP
// this.version = systemInfo.appWgtVersion;
// // #endif
},
methods: {
getVersionCode(){
const systemInfo = uni.getSystemInfoSync();
// #ifdef H5
this.version = systemInfo.appVersion;
console.log(systemInfo.appVersion, '版本号');
// #endif
// #ifdef APP
this.version = systemInfo.appWgtVersion;
// #endif
},
open() {
this.getVersionCode()
this.show = true;
this.isDisabled = true;
},
@ -77,7 +120,9 @@
if (this.show) {
this.show = false;
clearInterval(this.timer) //timer
this.$.refs.modal.popupClose();
if(this.$refs.modal){
this.$refs.modal.popupClose();
}
this.success({
// cancel: false,
confirm: true,
@ -120,7 +165,11 @@
showQuestionMessage(mContent, callback) {
this.showSelectModal("疑问", mContent, callback);
},
// (+
showQuestionMessage1(mContent,textColor, callback) {
console.log(textColor)
this.showSelectModal1("疑问", mContent, callback,textColor);
},
// (+)
showWarningMessage(mContent, callback) {
this.showConfirmCountdownModal("警告", mContent, callback);
@ -230,6 +279,26 @@
}
});
},
// (+
showSelectModal1(mIconType, mContent, callback,textColor) {
this.showModal({
iconType: mIconType,
content: mContent,
textColor:textColor,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
console.log('用户点击确定')
} else {
callback(false);
console.log('用户点击取消')
}
}
}
});
},
// (+)
showConfirmCountdownQuestionModal(mContent, callback) {
@ -362,6 +431,11 @@
this.cancelColor = '#666F83'
}
if (data.textColor) {
this.textColor = data.textColor
} else {
this.textColor = ''
}
if (data.showConfirmButton === false || data.showConfirmButton === true) {
this.showConfirmButton = data.showConfirmButton
} else {
@ -425,6 +499,7 @@
display: flex; //
flex-direction: column; //
align-items: center; //
margin: 8rpx;
// background-image: url()
}
@ -476,4 +551,11 @@
.def_text {
color: $uni-color-primary;
}
.text_content{
padding: 10rpx;
font-size: 32rpx;
text-align: center;
word-break: break-all;
white-space: normal;
}
</style>

36
src/mycomponents/detail/comDetailCard.vue

@ -3,25 +3,26 @@
<uni-collapse ref="collapse1" @change="">
<uni-collapse-item :open="true">
<template v-slot:title>
<item-compare-qty :dataContent="dataContent" :handleQty="dataContent.handleQty" :isShowStdPack="false">
<item-compare-qty :dataContent="dataContent" :handleQty="dataContent.handleQty"
:isShowStdPack="false">
</item-compare-qty>
</template>
<u-line></u-line>
<view class="" v-for="(item,index) in dataContent.subList">
<view class="" v-for="(item,index) in dataContent.subList" :key="index">
<uni-swipe-action ref="swipeAction">
<uni-swipe-action-item @click="swipeClick($event,item)"
:right-options="item.scaned?scanOptions:detailOptions"
style='padding:0px 0px 5px 0px;align-items: center;'>
<recommend :detail="item" :isShowToLocation="false">
<recommend :detail="item" :isShowStatus="isShowStatus" :isShowToLocation="false">
</recommend>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
</uni-collapse-item>
</uni-collapse>
<balance-qty-edit ref="qtyEdit" :settingParam="settingParam" @confirm="confirm"></balance-qty-edit>
<balance-qty-edit ref="qtyEdit" :settingParam="settingParam" :queryBalance="queryBalance" @confirm="confirm"></balance-qty-edit>
<win-scan-location ref="scanLocationCode" title="目标库位" @getLocation='getLocation'
:locationTypeList="locationTypeList"></win-scan-location>
:locationAreaTypeList="locationAreaTypeList"></win-scan-location>
<comMessage ref="message"></comMessage>
</view>
</template>
@ -47,11 +48,11 @@
props: {
dataContent: {
type: Object,
default: {}
default: null
},
settingParam: {
type: Object,
default: {}
default: null
},
isShowPack: {
type: Boolean,
@ -65,9 +66,17 @@
type: Boolean,
default: true
},
locationTypeList: {
locationAreaTypeList: {
type: Array,
default: []
default: null
},
queryBalance: {
type: Boolean,
default: true
},
isShowStatus: {
type: Boolean,
default: true
},
},
watch: {
@ -102,9 +111,10 @@
this.detailOptions = getDetailOption();
}
if (this.scanOptions.length == 0) {
this.scanOptions = getPurchaseReceiptOption(this.settingParam.allowModifyQty, this.settingParam
.allowModifyLocation)
this.scanOptions = getPurchaseReceiptOption(this.settingParam.allowModifyQty, false)
}
// this.showLocation();
},
methods: {
@ -159,4 +169,4 @@
</script>
<style>
</style>
</style>

163
src/mycomponents/detail/comJobDetailCard.vue

@ -0,0 +1,163 @@
<template>
<view class="" style="background-color: #fff;">
<uni-collapse ref="collapse">
<uni-collapse-item :open="true">
<template v-slot:title>
<itemCompareQty :dataContent="dataContent" :handleQty="dataContent.handleQty"
:isShowPackUnit="true"></itemCompareQty>
</template>
<package-list :dataContent="dataContent.subList"
:isEdit="settingParam.allowModifyQty=='TRUE'"
:settingParam="settingParam"
@collapseChange="collapseChange"
@updateData="updateData" :isShowStatus="isShowStatus"
></package-list>
</uni-collapse-item>
</uni-collapse>
<recommend-qty-edit ref=" receiptEdit" :dataContent="editItem" :settingParam="settingParam" @confirm="confirm">
</recommend-qty-edit>
<comMessage ref="message"></comMessage>
</view>
</template>
<script>
import itemCompareQty from '@/mycomponents/item/itemCompareQty.vue'
import recommend from '@/mycomponents/recommend/recommend.vue'
import recommendQtyEdit from '@/mycomponents/qty/recommendQtyEdit.vue'
import jobDetailPopup from '@/mycomponents/detail/jobDetailPopup.vue'
import receiptDetailInfoPopup from '@/pages/purchaseReceipt/coms/receiptDetailInfoPopup.vue'
import pack from '@/mycomponents/balance/pack.vue'
import detailList from '@/mycomponents/detail/detailList.vue'
import packageList from '@/mycomponents/package/packageList.vue'
import {
getDetailOption,
getPurchaseReceiptOption
} from '@/common/array.js';
export default {
emits: ["updateData"],
components: {
itemCompareQty,
recommend,
recommendQtyEdit,
jobDetailPopup,
receiptDetailInfoPopup,
detailList,
packageList
},
props: {
dataContent: {
type: Object,
default: null
},
settingParam: {
type: Object,
default: null
},
locationAreaTypeList: {
type: Object,
default: null
},
isShowStatus: {
type: Boolean,
default: true
},
},
watch: {
},
data() {
return {
showItem: {},
editItem: {
record: {
}
},
locatonItem: {},
detailOptions: [],
scanOptions: []
}
},
mounted() {
if (this.detailOptions.length == 0) {
this.detailOptions = getDetailOption();
}
if (this.scanOptions.length == 0) {
this.scanOptions = getPurchaseReceiptOption(this.settingParam.allowModifyQty, this.settingParam
.allowModifyLocation)
}
},
updated() {
console.log('updated')
},
methods: {
collapseChange(){
setTimeout(() => {
this.resizeCollapse();
}, 500)
},
resizeCollapse() {
this.$nextTick(r => {
this.$refs.collapse.resize()
});
this.$forceUpdate();
},
refreshCollapse() {
this.$nextTick(r => {
this.$refs.collapse.forEach(r => {
r.childrens.forEach(i => {
i.init();
})
r.resize();
})
});
this.$forceUpdate();
},
swipeClick(e, item) {
if (e.content.text == "编辑") {
this.edit(item)
} else if (e.content.text == "移除") {
this.remove(item)
}
},
edit(item) {
this.editItem = item;
this.$refs.receiptEdit.openTaskEditPopup(item.qty, item.handleQty, item.labelQty);
},
remove(item) {
this.$refs.message.showQuestionMessage("确定移除扫描信息?",
res => {
if (res) {
item.scaned = false
item.handleQty = null
this.$forceUpdate()
this.$emit('remove', item)
}
});
},
confirm(qty) {
this.editItem.handleQty = qty;
this.$emit('updateData')
},
updateData(){
this.$emit('updateData')
}
}
}
</script>
<style>
</style>

1
src/mycomponents/detail/comRequestDetailCard.vue

@ -11,7 +11,6 @@
:isShowStdPack="false">
</item-compare-qty>
</template>
<u-line />
<view class="" v-for="(item,index) in dataContent.subList">
<uni-swipe-action ref="swipeAction">
<uni-swipe-action-item @click="swipeClick($event,item)"

10
src/mycomponents/detail/detailBalanceInfo.vue

@ -15,7 +15,7 @@
<text class="item_title">数量 : </text>
<view class="text_wrap">
<text class="text_wrap">{{Number(dataContent.qty)}}</text>
<text class="text_wrap">{{getUnitInfo(dataContent.uom)}}</text>
<text class="text_wrap">{{getUomInfo(dataContent.uom)}}</text>
</view>
</view>
<view class="item">
@ -32,8 +32,8 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo,
getUnitInfo
getPackUnitInfo,
getUomInfo
} from '@/common/directory.js';
export default {
components: {},
@ -55,8 +55,8 @@
getInventoryStatusInfo(value) {
return getInventoryStatusName(value)
},
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
}
}
}

8
src/mycomponents/detail/detailCommonInfo.vue

@ -1,16 +1,16 @@
<template>
<view class="pop_detail" style="height:80%">
<com-item :dataContent="dataContent"></com-item>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:320px ">
<detail-item-info :dataContent="dataContent"></detail-item-info>
<u-line></u-line>
<view class='split_line'></view>
<detail-recommend-info :dataContent="dataContent"></detail-recommend-info>
<u-line></u-line>
<view class='split_line'></view>
<view v-if="dataContent.record!=undefined">
<detail-handle-info :dataContent="dataContent">
</detail-handle-info>
<u-line></u-line>
<view class='split_line'></view>
</view>
<slot>
<!-- 每个任务的详情 -->

2
src/mycomponents/detail/detailHandleInfo.vue

@ -32,7 +32,7 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo
getPackUnitInfo
} from '@/common/directory.js';
export default {
components: {},

8
src/mycomponents/detail/detailItemInfo.vue

@ -10,13 +10,13 @@
</view>
<view class="item">
<text class="item_title">数量 : </text>
<text class="text_wrap">{{dataContent.qty}}{{getUnitInfo(dataContent.uom)}} </text>
<text class="text_wrap">{{dataContent.qty}}{{getUomInfo(dataContent.uom)}} </text>
</view>
</view>
</template>
<script>
import{getUnitInfo} from "@/common/directory.js"
import{getUomInfo} from "@/common/directory.js"
export default {
components: {},
data() {
@ -34,8 +34,8 @@
},
methods: {
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
}
}
}

146
src/mycomponents/detail/detailList.vue

@ -0,0 +1,146 @@
<template>
<view class="" v-for="(item,index) in dataContent" :key="item.id">
<uni-collapse ref="collapse" @change="">
<uni-collapse-item :open="true">
<template v-slot:title>
<recommend :detail="item" :isShowLocation="false" :isShowFromLocation="false"></recommend>
</template>
<view v-for="(pack,index) in item.packList" :key="pack.id" style="margin-left: 20px;">
<recommend :detail="pack" :isShowLocation="false" :isShowFromLocation="false"
:isShowToLocation="false" :isShowBatch="false"></recommend>
</view>
</uni-collapse-item>
</uni-collapse>
</view>
</template>
<script>
import container from '@/mycomponents/container/container.vue'
import pack from '@/mycomponents/balance/pack.vue'
import location from '@/mycomponents/balance/location.vue'
import toLocation from '@/mycomponents/balance/toLocation.vue'
import batch from '@/mycomponents/balance/batch.vue'
import recommendQty from '@/mycomponents/qty/recommendQty.vue'
import compareQty from '@/mycomponents/qty/compareQty.vue'
import config from '@/static/config.js'
import recommend from '@/mycomponents/recommend/recommend.vue'
export default {
components: {
container,
pack,
location,
toLocation,
batch,
recommendQty,
compareQty,
recommend
},
data() {
return {
}
},
props: {
dataContent: {
type: Object,
default: {}
},
isShowContainer: {
type: Boolean,
default: true
},
isShowPack: {
type: Boolean,
default: true
},
isShowBatch: {
type: Boolean,
default: true
},
isShowFromLocation: {
type: Boolean,
default: true
},
isShowToLocation: {
type: Boolean,
default: false
},
isShowStatus: {
type: Boolean,
default: true
},
locationTitle: {
type: String,
default: '库位'
},
},
watch: {
},
methods: {
copy() {
// HPQ;V1.0;ICE115F11161AG;PP20230427000026;B20230427002;Q100
var content = "HPQ;V1.0;I" + this.detail.itemCode + ";P" + this.detail.packingNumber + ";B" + this.detail
.batch + ";Q" + this.detail.qty
// #ifdef H5
this.$copyText(content).then(
res => {
uni.showToast({
title: '复制采购标签成功',
icon: 'none'
})
}
)
// #endif
// #ifndef H5
uni.setClipboardData({
data: content,
success: () => {
uni.showToast({
title: '复制采购标签成功'
})
}
})
// #endif
},
copyPro() {
// HPQ;V1.0;ICE115F11161AG;PP20230427000026;B20230427002;Q100
var content = "HMQ;V1.0;I" + this.detail.itemCode + ";P" + this.detail.packingNumber + ";B" + this.detail
.batch + ";Q" + this.detail.qty
// #ifdef H5
this.$copyText(content).then(
res => {
uni.showToast({
title: '复制制品标签成功',
icon: 'none'
})
}
)
// #endif
// #ifndef H5
uni.setClipboardData({
data: content,
success: () => {
uni.showToast({
title: '复制制品标签成功'
})
}
})
// #endif
},
isDevlement() {
return config.isDevelopment;
}
}
}
</script>
<style>
</style>

10
src/mycomponents/detail/detailPackageInfo.vue

@ -21,7 +21,7 @@
<view class="item">
<text class="item_title">标包 : </text>
<view class="text_wrap">
<text class="text_wrap">{{dataContent.stdPackQty}}{{dataContent.stdPackUnit}}</text>
<text class="text_wrap">{{dataContent.packQty}}{{dataContent.packUnit}}</text>
</view>
</view>
</view>
@ -30,8 +30,8 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo,
getUnitInfo
getPackUnitInfo,
getUomInfo
} from '@/common/directory.js';
export default {
components: {},
@ -53,8 +53,8 @@
getInventoryStatusInfo(value) {
return getInventoryStatusName(value)
},
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
}
}
}

10
src/mycomponents/detail/detailRecommendInfo.vue

@ -15,7 +15,7 @@
<text class="item_title">明细数量 : </text>
<view class="text_wrap">
<text class="text_wrap">{{Number(dataContent.qty)}}</text>
<text class="text_wrap">{{getUnitInfo(dataContent.uom)}}</text>
<text class="text_wrap">{{getUomInfo(dataContent.uom)}}</text>
</view>
</view>
<view class="item">
@ -36,8 +36,8 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo,
getUnitInfo
getPackUnitInfo,
getUomInfo
} from '@/common/directory.js';
export default {
components: {},
@ -59,8 +59,8 @@
getInventoryStatusInfo(value) {
return getInventoryStatusName(value)
},
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
}
}
}

6
src/mycomponents/detail/jobDetailPopup.vue

@ -9,7 +9,7 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo
getPackUnitInfo
} from '@/common/directory.js';
import detailCommonInfo from '@/mycomponents/detail/detailCommonInfo.vue'
@ -42,8 +42,8 @@
getInventoryStatusInfo(value) {
return getInventoryStatusName(value).label
},
getStdPackUnit(uom) {
let item = getStdPackUnitInfo(uom);
getPackUnit(uom) {
let item = getPackUnitInfo(uom);
if (item == '') {
return uom;
} else {

4
src/mycomponents/detail/recordDetailCommonInfo.vue

@ -1,12 +1,12 @@
<template>
<view class="pop_detail" style="height:80%">
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:320px ">
<scroll-view style="height:320px ">
<!-- 物品 -->
<detail-item-info :dataContent="dataContent"></detail-item-info>
<!-- <request-detail-basic-info :dataContent="dataContent"></request-detail-basic-info> -->
<u-line></u-line>
<view class='split_line'></view>
<!-- 库存余额 -->
<detail-balance-info :dataContent="dataContent"></detail-balance-info>
<!-- 包装 -->

6
src/mycomponents/detail/recordDetailPopup.vue

@ -2,14 +2,14 @@
<uni-popup ref="popup">
<view class="pop_detail" style="height:80%">
<com-item :dataContent="dataContent"></com-item>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:320px ">
<!-- 物品 -->
<detail-item-info :dataContent="dataContent"></detail-item-info>
<u-line></u-line>
<view class='split_line'></view>
<!-- 库存余额 -->
<detail-balance-info :dataContent="dataContent"></detail-balance-info>
<u-line></u-line>
<view class='split_line'></view>
<!-- 包装 -->
<detail-package-info :dataContent="dataContent.package"></detail-package-info>
</scroll-view>

4
src/mycomponents/detail/requestDetailBasicInfo.vue

@ -31,8 +31,8 @@
},
methods: {
getUnitInfo(value){
return getUnitInfo(value).label
getUomInfo(value){
return getUomInfo(value).label
}
}
}

4
src/mycomponents/detail/requestDetailCommonInfo.vue

@ -1,12 +1,12 @@
<template>
<view class="pop_detail" style="height:80%">
<com-item :dataContent="dataContent"></com-item>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:320px ">
<!-- 物品 -->
<detail-item-info :dataContent="dataContent"></detail-item-info>
<!-- <request-detail-basic-info :dataContent="dataContent"></request-detail-basic-info> -->
<u-line></u-line>
<view class='split_line'></view>
<!-- 包装 -->
<!-- 库存余额 -->

4
src/mycomponents/item/item.vue

@ -1,8 +1,6 @@
<template>
<view>
<view class="uni-flex u-col-center space-between" style="
background-color:#fff;
margin-left: 10rpx;">
<view class="uni-flex u-col-center space-between">
<view >
<view class="card_itemCode" :class="openPopup(dataContent)">
{{dataContent.itemCode}}

21
src/mycomponents/item/itemCompareQty.vue

@ -1,13 +1,14 @@
<template>
<view class="uni-flex uni-row space-between uni-inline-item" style="background-color:#fff;">
<view style="word-break: break-all;width: 50%;">
<view class="uni-flex uni-row space-between uni-inline-item" style="background-color:#fff; margin-left: 10px;">
<view style="flex: 1;">
<item :dataContent="dataContent"></item>
</view>
<view style="word-break: break-all;width: 50%;display: flex;justify-content:flex-end;margin-right: 10rpx;">
<recommend-qty v-if="handleQty==0" :dataContent="dataContent" :isShowStatus="false" :isShowStdPack ="isShowStdPack"></recommend-qty>
<view style="width: 40%;display: flex;justify-content:flex-end;margin-right: 10rpx;word-break:break-word">
<recommend-qty v-if="handleQty==0" :dataContent="dataContent" :isShowStatus="false" :isShowStdPack="true"
></recommend-qty>
<!-- :objTextStyle='objTextStyle' -->
<compare-qty v-else :dataContent="dataContent" :recommendQty="Number(dataContent.qty)"
:handleQty="Number(handleQty)" :isShowStatus="false"
:isShowStdPack ="isShowStdPack">
:handleQty="Number(handleQty)" :isShowStatus="false" :isShowPackUnit="isShowPackUnit">
</compare-qty>
</view>
</view>
@ -45,9 +46,13 @@
type: Number,
default: 0
},
isShowStdPack:{
isShowPackUnit: {
type: Boolean,
default: true
},
objTextStyle: {
type: Object,
default: null
}
},
watch: {
@ -60,4 +65,4 @@
</script>
<style>
</style>
</style>

149
src/mycomponents/item/itemFilter.vue

@ -0,0 +1,149 @@
<template>
<uni-popup ref="popup">
<view class="maskbox" @tap="maskClick"></view>
<view class="uni-flex uni-column "
style="background-color: white;width: 100%; height:auto;padding: 20rpx;z-index: 99;position: relative; border-radius: 10rpx;">
<view class="uni-flex" style="justify-content: center; font-size: 35rpx; font-weight: bold;" >
筛选条件
</view>
<view class="uni-flex " style=" flex-direction: column; width: 100%;margin-top: 10rpx;">
<view class="" style="font-size: 35rpx; margin-bottom: 10rpx;">
库位
</view>
<u-input style="margin-left: 0rpx;" confirmType="search" v-model="locationCode" :border="true"
placeholder="请输入库位" :focus="true"/>
</view>
<view class="" style="font-size: 35rpx; margin-top: 10rpx; margin-bottom: 10rpx;">
库存状态 :
<uni-data-checkbox mode="tag" multiple v-model="state" :localdata="stateList"></uni-data-checkbox>
</view>
<view class="" style="margin-top: 30rpx; margin-left: 30rpx; margin-right: 30rpx;">
<button type="primary" size="default" @click="confirm">确认</button>
</view>
</view>
</uni-popup>
</template>
<script>
import {
getTodayDate
} from '@/common/basic.js';
import {
getInventoryStatusList
} from '@/common/directory.js';
import winScanJobNumber from "@/mycomponents/scan/winScanJobNumber.vue"
import winScanAsnNumber from "@/mycomponents/scan/winScanAsnNumber.vue"
export default {
emits: [
"onConfirmClick"
],
components: {
winScanJobNumber,
winScanAsnNumber
},
props: {
checkedToday: {
type: Boolean,
default: false
},
checkedWaitTask: {
type: Boolean,
default: false
},
otherTitle: {
type: String,
default: ""
},
isShowAsn: {
type: Boolean,
default: false
},
isShowJob: {
type: Boolean,
default: true
},
isShowFromLocationCode: {
type: Boolean,
default: false
},
isShowProductionLineCode: {
type: Boolean,
default: false
},
productionline: {
type: Array,
default: []
}
},
data() {
return {
dataContent: {},
checkedTodayModel: false,
checkedWaitModel: false,
stateList: [],
state:[],
locationCode:""
}
},
watch: {
},
mounted() {},
methods: {
//
maskClick() {
//
this.closeScanPopup();
},
openFilter() {
this.stateList =getInventoryStatusList()
this.stateList.forEach(res=>{
res.text =res.label
})
this.$refs['popup'].open("right");
},
closeScanPopup() {
this.$refs.popup.close()
},
switchChangeToday(isOn) {
let creationTime = '';
if (isOn) {
creationTime = getTodayDate();
}
this.$emit("switchChangeToday", isOn, creationTime)
this.closeScanPopup()
},
scanNumberClick() {
this.$refs.scanNumber.openScanPopup();
},
scanOtherClick() {
this.$refs.scanAsnNumber.openScanPopup();
},
confirm() {
this.$emit("onConfirmClick", this.locationCode,this.state)
this.closeScanPopup();
},
}
}
</script>
<style lang="scss">
.maskbox {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 0;
}
</style>

4
src/mycomponents/item/itemInfoPopup.vue

@ -39,14 +39,14 @@
</view> -->
</view>
<u-line></u-line>
<view class='split_line'></view>
<view class="" v-for="(item, index) in dataList">
<view class="item" v-if="(item.title!='worker')" v-show="(item.title!='date')">
<text class="item_title">{{item.title}} : </text>
<text class="text_wrap">{{item.content}} </text>
</view>
</view>
<u-line></u-line>
<view class='split_line'></view>
<view v-if="isShowbottom" style="margin-top: 10rpx;margin-bottom: 10rpx;width: 100%;display: flex;"
class="uni-flex uni-row space-between u-col-center">
<view class="uni-flex uni-row u-col-center " style="flex: 1; overflow: hidden;">

12
src/mycomponents/item/itemQty.vue

@ -1,22 +1,14 @@
<template>
<view class="uni-flex uni-row space-between center" style="background-color:#fff;">
<view class="uni-flex uni-row space-between center" style="background-color:#fff; margin-left: 15px;">
<view>
<item :dataContent="dataContent"></item>
</view>
<view>
<!-- showBalanceQty -->
<balanceQty v-if="isShowBalanceQty" :dataContent="dataContent"></balanceQty>
<balance-qty v-if="isShowBalanceQty" :dataContent="dataContent"></balance-qty>
<compare-qty v-else :dataContent="dataContent" :recommendQty="Number(dataContent.qty)"
:handleQty="dataContent.handleQty" :isShowStatus="false" :isShowStdPack="showStdPack">
</compare-qty>
</view>
<!-- <view v-else>
<recommend-qty v-if="handleQty==0" :dataContent="dataContent" :isShowStatus="false"></recommend-qty>
<compare-qty v-else :dataContent="dataContent" :recommendQty="Number(dataContent.qty)"
:handleQty="Number(handleQty)" :isShowStatus="false">
</compare-qty>
</view> -->
</view>
</template>
<script>

2
src/mycomponents/item/itemRecommendQty.vue

@ -1,5 +1,5 @@
<template>
<view class="uni-flex uni-row space-between uni-inline-item" style="background-color:#fff;">
<view class="uni-flex uni-row space-between uni-inline-item" style="background-color:#fff; margin-left: 10px;">
<view>
<item :dataContent="dataContent"></item>
</view>

47
src/mycomponents/job/jobAccept.vue

@ -0,0 +1,47 @@
<template>
<!-- style="margin-top: 10rpx;margin-bottom: 10rpx;" class="uni-flex uni-row space-between u-col-center" -->
<view class="task_item" style="margin-left: 15rpx; margin-right: 15rpx;">
<view class="uni-flex u-col" style="flex-direction: column;">
<view class="uni-flex uni-row u-col-center">
<text style="font-size: 32rpx;" >承接人: {{dataContent.acceptUserName}}</text>
</view>
<view class="uni-flex uni-row u-col-center">
<text style="font-size: 32rpx;" class="center">承接时间 : {{formatDate(dataContent.acceptTime)}}</text>
</view>
</view>
</view>
</template>
<script>
import {
dateFormat
} from '@/common/basic.js';
export default {
components: {
},
data() {
return {
};
},
watch: {},
props: {
dataContent: {
type: Object,
default: {}
}
},
methods: {
formatDate: function(val) {
return dateFormat(val)
}
}
}
</script>
<style lang="scss">
</style>

4
src/mycomponents/job/jobBottom.vue

@ -4,11 +4,11 @@
<view class="uni-flex space-between u-col-center">
<view class="uni-flex uni-row u-col-center">
<image class="card_icon_normal" src="/static/icons/icon_customer.svg" alt="" />
<text>{{dataContent.creator}}</text>
<text style="font-size: 32rpx;" >{{dataContent.creator}}</text>
</view>
<view class="uni-flex uni-row u-col-center">
<image class="card_icon_normal" src="/static/icons/icon_date.svg" alt="" />
<text class="center">{{formatDate(dataContent.createTime)}}</text>
<text style="font-size: 32rpx;" class="center">{{formatDate(dataContent.createTime)}}</text>
</view>
</view>
</view>

2
src/mycomponents/job/jobCard.vue

@ -3,7 +3,7 @@
<view class="task_card" @click="openDetail">
<job-top :dataContent="dataContent"></job-top>
<job-property :propertyList="propertyList"></job-property>
<u-line color="#909399" />
<view class='split_line'></view>
<job-bottom :dataContent="dataContent"></job-bottom>
</view>
</view>

12
src/mycomponents/job/jobComMainCard.vue

@ -2,8 +2,9 @@
<view>
<view class="task_card">
<job-top :dataContent="dataContent"></job-top>
<!-- <view class="split_line"></view> -->
<slot></slot>
<u-line color="#909399" />
<view class="split_line"></view>
<job-bottom :dataContent="dataContent"></job-bottom>
</view>
</view>
@ -19,10 +20,9 @@
jobBottom,
},
data() {
return {
};
return {};
},
props: {
dataContent: {
type: Object,
@ -31,11 +31,11 @@
},
methods: {
}
}
</script>
<style lang="scss">
</style>
</style>

41
src/mycomponents/job/jobComMainCardAsn.vue

@ -0,0 +1,41 @@
<template>
<view>
<view class="task_card">
<jobTopAsn :dataContent="dataContent"></jobTopAsn>
<slot></slot>
<view class='split_line'></view>
<job-bottom :dataContent="dataContent"></job-bottom>
</view>
</view>
</template>
<script>
import jobTopAsn from '@/mycomponents/job/jobTopAsn.vue'
import jobBottom from '@/mycomponents/job/jobBottom.vue'
export default {
components: {
jobTopAsn,
jobBottom,
},
data() {
return {
};
},
props: {
dataContent: {
type: Object,
default: {}
},
},
methods: {
}
}
</script>
<style lang="scss">
</style>

88
src/mycomponents/job/jobComMainDetailCard.vue

@ -0,0 +1,88 @@
<template>
<view class="task_item">
<view class="task_text" style="border-top: 1px solid #dedede;padding-top: 20rpx;margin-top: 20rpx;">
<!-- 主子表拆分没有数量了 -->
<itemCompareQty :dataContent="dataContent" :handleQty="dataContent.handleQty" :isShowPackUnit="false"
></itemCompareQty>
<!-- :objTextStyle="{'fontWeight':'bold','fontSize':'40rpx'}" -->
<div class="u-p-l-10">
<pack v-if="isShowPack && dataContent.packingNumber!=null" :packingCode="dataContent.packingNumber">
</pack>
<batch v-if="isShowBatch && dataContent.batch!=null" :batch="dataContent.batch"></batch>
<view class="u-flex u-row-between">
<location v-if="isShowFromLocation&&dataContent.fromLocationCode" title="来源库位" :locationCode="dataContent.fromLocationCode">
</location>
<level title="优先级" :priority="dataContent.priority" v-if="dataContent.priority !== '' && dataContent.priority !== undefined && dataContent.priority !== null ">
</level>
</view>
<to-location v-if="isShowToLocation" title="目标库位" :locationCode="dataContent.toLocationCode||dataContent.locationCode">
</to-location>
</div>
</view>
</view>
</template>
<script>
import pack from '@/mycomponents/balance/pack.vue'
import location from '@/mycomponents/balance/location.vue'
import toLocation from '@/mycomponents/balance/toLocation.vue'
import batch from '@/mycomponents/balance/batch.vue'
import itemCompareQty from '@/mycomponents/item/itemCompareQty.vue'
import level from '@/mycomponents/balance/level.vue'
export default {
components: {
pack,
location,
toLocation,
batch,
itemCompareQty,
level
},
data() {
return {};
},
props: {
dataContent: {
type: Object,
default: {}
},
isShowContainer: {
type: Boolean,
default: true
},
isShowPack: {
type: Boolean,
default: true
},
isShowBatch: {
type: Boolean,
default: true
},
isShowFromLocation: {
type: Boolean,
default: true
},
isShowToLocation: {
type: Boolean,
default: true
},
isShowDeliverType: {
type: Boolean,
default: false
},
},
methods: {
}
}
</script>
<style lang="scss">
</style>

6
src/mycomponents/job/jobCommonInfo.vue

@ -1,15 +1,15 @@
<template>
<view class="pop_detail" style="height:80%">
<job-top :dataContent="dataContent"></job-top>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:400px ">
<slot>
<!-- 每个任务的详情 -->
</slot>
<job-request-info :dataContent="dataContent"></job-request-info>
<u-line></u-line>
<view class='split_line'></view>
<job-person-info :dataContent="dataContent"></job-person-info>
<u-line></u-line>
<view class='split_line'></view>
<job-setting-info :dataContent="dataContent"></job-setting-info>
</scroll-view>

6
src/mycomponents/job/jobDetailPopup.vue

@ -9,7 +9,7 @@
<script>
import {
getInventoryStatusName,
getStdPackUnitInfo
getPackUnitInfo
} from '@/common/directory.js';
import detailCommonInfo from '@/mycomponents/detail/detailCommonInfo.vue'
@ -42,8 +42,8 @@
getInventoryStatusInfo(value) {
return getInventoryStatusName(value).label
},
getStdPackUnit(uom) {
let item = getStdPackUnitInfo(uom);
getPackUnit(uom) {
let item = getPackUnitInfo(uom);
if (item == '') {
return uom;
} else {

195
src/mycomponents/job/jobFilter.vue

@ -2,32 +2,83 @@
<uni-popup ref="popup">
<view class="maskbox" @tap="maskClick"></view>
<view class="uni-flex uni-column center"
style="background-color: white;width: 200px; height:auto;padding: 20rpx;z-index: 99;position: relative;">
style="background-color: white;width: 100%; height:auto;padding: 20rpx;z-index: 99;position: relative; border-radius: 10rpx;">
<view class="uni-flex space-between u-col-center" style="width: 100%;">
<view class="" style="font-size: 32rpx;">
只看当天
</view>
<u-switch v-model="checkedTodayModel" active-color="#4DD865" inactive-color="#eee" size="35" @change="switchChangeToday"></u-switch>
<view class="" style="font-size: 32rpx;">
只看当天
</view>
<u-switch v-model="checkedTodayModel" active-color="#4DD865" inactive-color="#eee" size="35"
@change="switchChangeToday"></u-switch>
</view>
<view class="uni-flex space-between u-col-center" style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
只看待处理
</view>
<u-switch v-model="checkedWaitModel" active-color="#4DD865" inactive-color="#eee" size="35" @change="switchChangeWait"></u-switch>
<u-switch v-model="checkedWaitModel" active-color="#4DD865" inactive-color="#eee" size="35"
@change="switchChangeWait"></u-switch>
</view>
<view v-if="isShowProductionLineCode" class="uni-flex space-between u-col-center"
style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
生产线
</view>
<!-- <u-input style="margin-left: 20rpx;" v-model="productionLineCode" :border="true"
placeholder="请输入生产线" @confirm="productionLineCodeConfirm" /> -->
<uni-data-select class="uni-data-select" style="margin-left: 50rpx;" placeholder="请输入生产线"
v-model="productionLineCode" :clear="false" :localdata="productionline"
@change="productionLineCodeConfirm"></uni-data-select>
</view>
<view v-if="isShowItemCode" class="uni-flex space-between u-col-center"
style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
物料代码
</view>
<u-input style="margin-left: 20rpx;" confirmType="search" v-model="itemCode" :border="true"
placeholder="请输入物料代码" @confirm="itemCodeConfirm" />
</view>
<view v-if="isShowFromLocationCode" class="uni-flex space-between u-col-center"
style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
来源库位
</view>
<u-input style="margin-left: 20rpx;" confirmType="search" v-model="fromLocationCode" :border="true"
placeholder="请输入来源库位" @confirm="fromLocationCodeConfirm" />
</view>
<view v-if="isShowFromAreaCode" class="uni-flex space-between u-col-center"
style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
来源库区
</view>
<u-input style="margin-left: 20rpx;" confirmType="search" v-model="fromAreaCode" :border="true"
placeholder="请输入来源库区" />
</view>
<view class="">
<view v-if="isShowToAreaCode" class="uni-flex space-between u-col-center"
style="width: 100%;margin-top: 30rpx;">
<view class="" style="font-size: 32rpx;">
到库区
</view>
<u-input style="margin-left: 50rpx;" confirmType="search" v-model="toAreaCode" :border="true"
placeholder="请输入到库区" />
</view>
<!-- <view class="">
<view class="uni-flex u-row-center" style="margin-top: 30rpx;" v-if="isShowAsn">
<button class="filter_button" hover-class="filter_button_after"
@click="scanOtherClick">扫描ASN单号</button>
</view>
<view class="uni-flex u-row-center" style="margin-top: 30rpx;">
<view class="uni-flex u-row-center" style="margin-top: 30rpx;" v-if="isShowJob">
<button class="filter_button" hover-class="filter_button_after"
@click="scanNumberClick">扫描任务编号</button>
</view>
</view> -->
<view class=" uni-flex uni-row" style="margin-top: 5px;" v-if="isShowQurery">
<button class="btn_single_clear" hover-class="btn_commit_after" @click="reset()">重置</button>
<button class="btn_single_commit" hover-class="btn_commit_after" style="margin-left: 20rpx;" @click="query()">查询</button>
</view>
</view>
</uni-popup>
<win-scan-job-number ref="scanNumber" title="任务编号" @getScanCode='getScanNumber'></win-scan-job-number>
<win-scan-asn-number ref="scanAsnNumber" :title="otherTitle" @getScanCode='getScanAsNumber'></win-scan-asn-number>
@ -42,12 +93,14 @@
import winScanAsnNumber from "@/mycomponents/scan/winScanAsnNumber.vue"
export default {
emits: ["switchChangeToday", "switchChangeWait", "onScanNumber", "onScanAsnNumber"],
emits: ["switchChangeToday", "switchChangeWait", "onScanNumber", "onScanAsnNumber", "productionLineCode",
"fromLocationCode", "fromLocationCodeConfirm", "itemCodeConfirm", "onQuery"
],
components: {
winScanJobNumber,
winScanAsnNumber
},
props: {
checkedToday: {
type: Boolean,
@ -61,7 +114,41 @@
type: String,
default: ""
},
isShowAsn:{
isShowAsn: {
type: Boolean,
default: false
},
isShowJob: {
type: Boolean,
default: true
},
isShowFromLocationCode: {
type: Boolean,
default: false
},
isShowProductionLineCode: {
type: Boolean,
default: false
},
productionline: {
type: Array,
default: []
},
isShowItemCode: {
type: Boolean,
default: false
},
isShowQurery: {
type: Boolean,
default: false
},
//
isShowFromAreaCode: {
type: Boolean,
default: false
},
//
isShowToAreaCode: {
type: Boolean,
default: false
}
@ -69,8 +156,15 @@
data() {
return {
dataContent: {},
checkedTodayModel:false,
checkedWaitModel:false,
checkedTodayModel: false,
checkedWaitModel: false,
productionLineCode: '', // 线
fromLocationCode: '', //
fromAreaCode: '', //
toAreaCode: '', //
itemCode: '', //
creationTime: '',
status: ''
}
},
watch: {
@ -89,45 +183,96 @@
deep: true
}
},
mounted() {
},
mounted() {},
methods: {
getQueryCondition() {
let params = {
productionLineCode: this.productionLineCode,
fromLocationCode: this.fromLocationCode,
fromAreaCode: this.fromAreaCode, //
toAreaCode: this.toAreaCode, //
itemCode: this.itemCode,
creationTime: this.creationTime,
status: this.status
}
return params;
},
reset(){
this.checkedTodayModel = false
this.checkedWaitModel = false
this.productionLineCode = ''
this.fromLocationCode = ''
this.fromAreaCode = ''//
this.toAreaCode = ''//
this.itemCode = ''
this.creationTime = ''
this.status = ''
this.query()
},
query() {
let params = this.getQueryCondition();
this.$emit("onQuery", params)
this.closeScanPopup();
},
// 线
productionLineCodeConfirm(e) {
var lineCode = e
this.productionLineCode = e;
// this.$emit("productionLineCode", lineCode)
},
//
fromLocationCodeConfirm() {
// this.$emit("fromLocationCode", this.fromLocationCode)
},
itemCodeConfirm() {
},
//
maskClick() {
//
this.closeScanPopup();
},
openFilter() {
this.$refs['popup'].open("right");
this.$refs['popup'].open("top");
},
closeScanPopup() {
this.$refs.popup.close()
},
switchChangeToday(isOn) {
let creationTime = '';
if (isOn) {
creationTime = getTodayDate();
}
this.creationTime = creationTime;
this.$emit("switchChangeToday", isOn, creationTime)
this.closeScanPopup()
if (!this.isShowQurery) {
this.closeScanPopup()
}
},
switchChangeWait(isOn) {
let status = "1,2";
if(isOn){
status="1"
if (isOn) {
status = "1"
}
this.status = status;
this.$emit("switchChangeWait", isOn, status)
this.closeScanPopup()
if (!this.isShowQurery) {
this.closeScanPopup()
}
},
scanNumberClick() {
this.$refs.scanNumber.openScanPopup();
this.closeScanPopup();
},
scanOtherClick() {
this.$refs.scanAsnNumber.openScanPopup();
this.closeScanPopup();
},
getScanAsNumber(val) {
@ -152,4 +297,4 @@
height: 100vh;
z-index: 0;
}
</style>
</style>

4
src/mycomponents/job/jobInfoPopup.vue

@ -3,13 +3,13 @@
<uni-popup ref="popup">
<view class="pop_detail" style="height:500px">
<job-top :dataContent="dataContent"></job-top>
<u-line></u-line>
<view class='split_line'></view>
<scroll-view style="height:400px ">
<slot>
<!-- 每个任务的详情 -->
</slot>
<job-person-info :dataContent="dataContent"></job-person-info>
<u-line></u-line>
<view class='split_line'></view>
<job-setting-info :dataContent="dataContent"></job-setting-info>
</scroll-view>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save