Compare commits

...

156 Commits
master ... agv

Author SHA1 Message Date
李俊城 95ebe667dd 去掉工位 3 weeks ago
李俊城 4d96be6fc5 修改客户退货 3 months ago
李俊城 6970f449cb 修改获取焦点 4 months ago
李俊城 b93760a7ea 修改工位 4 months ago
李俊城 6a92979ea6 添加拆箱合箱 4 months ago
李俊城 5ae892cfa1 修改盘点取消 4 months ago
李俊城 7cafa3cde7 发料任务添加Agv待库移 4 months ago
李俊城 1fd32c0baf 添加回库 4 months ago
李俊城 47163bceda 添加工位列表 4 months ago
李俊城 832b4a7957 修改显示 5 months ago
李俊城 15ddca54ba 修改盘点显示 5 months ago
李俊城 713b695567 修改盘点任务提交数量校验和单位 5 months ago
李俊城 8b8c5e1684 修改推荐信息不能滑动 6 months ago
李俊城 8b72fc0976 修改发料显示 6 months ago
李俊城 271bd1efdb 修改盘点单件码扫描和盘点描述支持扫描 6 months ago
李俊城 7837a5158b 原料直发 6 months ago
李俊城 850378c9e8 非生产领退料添加筛选 6 months ago
李俊城 d85d90e7a4 修改非生产退料 6 months ago
李俊城 5f972da99f 修改非生产 6 months ago
李俊城 4f481fe597 修改非生产领料 6 months ago
李俊城 eaddb48660 非生产领料 6 months ago
李俊城 6a00b34729 修改非生产退料 6 months ago
李俊城 4c416a665f 非生产退料 7 months ago
李俊城 cfa40a5141 修改客户退货扫描单件码提示 7 months ago
李俊城 f25a3eb375 添加扫描提示,扫描成功和扫描失败 8 months ago
李俊城 a558576b0a 发料任务查找 8 months ago
李俊城 49f27a2a06 修改配置文件 8 months ago
李俊城 af9a037873 修改主页面 8 months ago
李俊城 d0245a2e5d 添加公司配置文件 10 months ago
李俊城 a0fe3df852 修改盘点查找任务 10 months ago
李俊城 0702474e76 非生产领料和退料线边 添加查询物料 10 months ago
李俊城 a57512a854 修改数量和配置文件 10 months ago
李俊城 bbaee459f1 修改提示 10 months ago
李俊城 c8504ca1a6 采购上架清除库位信息 10 months ago
李俊城 f149f349cd 修改库位赋值问题 10 months ago
李俊城 7d81c4a941 修改发料提示 10 months ago
李俊城 bd942a944e 客户退货去除来源库位 10 months ago
李俊城 5ac8b1a3b4 修改盘点 10 months ago
李俊城 51dff0cde3 修改配置文件 10 months ago
李俊城 b00ed60112 修改拆箱 10 months ago
李俊城 b9ba3596a4 修改待库移 10 months ago
李俊城 051474839e 修改提示 10 months ago
李俊城 508c8d9917 修改发料和非生产领料库位校验 10 months ago
李俊城 70b88dec79 三方库校验 10 months ago
李俊城 6c58bdfaa7 修改发料不扫描库位 10 months ago
李俊城 79ce07c863 修改三方库 10 months ago
李俊城 2d7bb5873e 修改三方库 10 months ago
李俊城 a1d93336d6 修改客户退货 10 months ago
李俊城 001d9b9500 修改采购上架 11 months ago
李俊城 3bc073a1d6 涂装上线计划申请 11 months ago
李俊城 5c5395cf0c 修改发料任务承接 11 months ago
李俊城 6fbea88d39 修改主页按钮无效 11 months ago
李俊城 c286acdd11 位置码类型校验 11 months ago
李俊城 b2d174e0c5 修改半成品退库数量和发料承接 11 months ago
李俊城 6e91fcff03 三方库申请取消 11 months ago
李俊城 956c72e8c8 修改拆箱 11 months ago
李俊城 63d264436e 修改申请执行 11 months ago
李俊城 cd817ad0e1 修改客户退货 11 months ago
李俊城 f66a56a8c4 修改拆箱数量校验 11 months ago
李俊城 12bf2c4ba2 修改消息提示 11 months ago
李俊城 48f784bbbe 修改完工转储 11 months ago
李俊城 f6d6a8c98a 修改发料查询库存 11 months ago
李俊城 18f1fb7790 修改任务状态 11 months ago
李俊城 2e4ad01568 修改采购上架 11 months ago
李俊城 4411c4f4db 修改三方库 11 months ago
李俊城 c4a5b00527 修改盘点 三方库收货显示数量 11 months ago
李俊城 4939310121 修改发料箱码扫描后关闭 12 months ago
李俊城 89b1d41d9a 添加备件发料 12 months ago
李俊城 07d42f801a 修改第三方库移除 12 months ago
李俊城 a0c9a5f03a 修改发料 12 months ago
李俊城 5b56f239b3 修改发料 12 months ago
李俊城 18c06fb1c3 非生产退料线边 12 months ago
李俊城 6c64f8445f 非生产领料 12 months ago
李俊城 fa09d58535 kitting 发料申请 12 months ago
李俊城 7dfc6cad79 添加kitting 12 months ago
李俊城 7265199dff 修改盘点 1 year ago
李俊城 ddba65569d 添加库移 1 year ago
李俊城 7b9f024519 完工转储 1 year ago
李俊城 0817c935cc 三方库发货和收货 1 year ago
李俊城 a1afc2def2 客户退货和三方库发货和收货 1 year ago
李俊城 29ce0dbca2 客户退货 1 year ago
李俊城 c8a2181ab8 修改器具 1 year ago
李俊城 7d30846621 空器具库移和空器具呼叫 1 year ago
李俊城 99a8b6f042 修改任务修改状态 1 year ago
李俊城 aea783cc80 添加git 1 year ago
李俊城 baac3101fc 修改发料拆箱 1 year ago
李俊城 cd51b20703 采购收货拆箱功能 1 year ago
李俊城 a751395376 修改拆箱参数 1 year ago
李俊城 ceeb3ebfe2 人工叫料申请 1 year ago
李俊城 7140d537fd 上架后退货申请 1 year ago
李俊城 eb01565661 添加新增页面 1 year ago
李俊城 94c5be44aa 人工叫料申请 1 year ago
李俊城 2ec0d6b694 上架后退货申请提交 1 year ago
李俊城 bb9507061e 上架后申请审批 1 year ago
李俊城 19d5a73376 1.直接退库,增加半成品库位类型2.非生产领料增加半成品库位类型 1 year ago
李俊城 2113f0ab07 生产退料增加成品库 1 year ago
李俊城 06c5d5606b 非生产领料刷新 1 year ago
李俊城 8e05072441 非生产领料和退料下拉加载 1 year ago
李俊城 90fa922ae3 非生产出库、非生产入库 1 year ago
李俊城 35471f201d 修改非生产领料、非生产退料 1 year ago
李俊城 b9d6c09fd6 修改采购收货时间赋值 1 year ago
李俊城 71438834a8 修改采购上架数据不对 1 year ago
李俊城 ebb4c19a05 修改盘点已经扫描提示 1 year ago
李俊城 bcc6792640 采购上架添加字段 2 years ago
李俊城 dca5f418dc 修改采购上架分页加载 2 years ago
李俊城 719e8f8610 修改配置文件更新 2 years ago
李俊城 e34c215530 修改盘点 2 years ago
李俊城 4dfc8ccec9 添加虚拟列表控件 2 years ago
李俊城 1204be4271 修改盘点数据量大加载卡顿 2 years ago
李俊城 e19e5b48e8 修改原料上架查询采购订单明细 2 years ago
李俊城 7bc799a181 修改采购上架只能上架同一个采购订单 2 years ago
李俊城 506b7821cc 修改时间赋值 2 years ago
李俊城 09251c39dd 任务提交添加完成id和name,date 2 years ago
李俊城 e383b6cc09 直接退库添加半成品库 2 years ago
李俊城 3da4f049bf 直接 退库 目标库位添加成品库 2 years ago
李俊城 a398fdbf89 修改盘点任务数量刷新 2 years ago
聂喜婷 0b3208e327 修改盘点 2 years ago
聂喜婷 2c0b29427a 修改刷新字体的大小 2 years ago
聂喜婷 d8f34bfb42 修改盘点明细加载功能 2 years ago
李俊城 2793c8f2c1 worker 赋值为中文登录名字 2 years ago
李俊城 e001141e66 add 页面刷新 2 years ago
李俊城 f152b00e92 添加打包配置 2 years ago
李俊城 201df55a1b 直接发料 检验同一个erp储位 2 years ago
李俊城 46cd8a9cae 直接发料 去掉校验同一个Erp储位 2 years ago
李俊城 6a91ce592c 直接退库 添加目标库位半成品库 2 years ago
李俊城 282cfef2ef 修改发料任务匹配规则 2 years ago
李俊城 502f67926e 发料修改匹配结果错误 2 years ago
李俊城 08a3a0ad4d 直接发料 来源库位与目标库位的erp储位必须相同才让发料 2 years ago
李俊城 54cfa5bc64 原料直发修改数量用num自定义组件 2 years ago
李俊城 5e03b8473c 原料直发客户修改发货数量 2 years ago
李俊城 e02bd0fe1c 直接发料修改为非生产调拨 2 years ago
李俊城 76ff242b63 原料直发 数量等于库存余额 2 years ago
李俊城 69a02eb854 添加采购收货,储位调拨 主页面快捷方式, 2 years ago
李俊城 9e01ab5c86 原料直发添加客户代码 2 years ago
李俊城 8c981e7a90 采购收货,不合格判断通过是否有不合格原因判断 2 years ago
李俊城 8bbe00da88 修改提交之后不显示扫描框 2 years ago
李俊城 30b4ab8bbc 修改样式 2 years ago
李俊城 db8be367bf 发料 可以修改发料数量, 直接发料点击取消修改关闭状态 2 years ago
李俊城 192b294ae5 修改访问请求地址 2 years ago
李俊城 9416024f7e 修改获取任务数量接口 2 years ago
李俊城 d065ea50c2 修改主页面返回菜单选中 2 years ago
李俊城 4ad3b37b3b 直接退库修改参数,盘点显示库存单位 2 years ago
李俊城 e05290311e 修改密码限制输入长度 2 years ago
李俊城 bf1f8c866e 修改消息详细,跳转到主页面 回收料收货 2 years ago
李俊城 783059eacd 半成品上架 2 years ago
李俊城 1dc505dc31 提交代码 2 years ago
李俊城 d2d9669986 采购上架修改上传字段 2 years ago
李俊城 c68231a498 上架后退货 2 years ago
李俊城 af7db6a417 采购收货 2 years ago
李俊城 9b5812aca1 直接发料 2 years ago
李俊城 498ef365ba 原料直发 2 years ago
李俊城 deb623fa3f 添加采购上架功能 2 years ago
李俊城 3aa416edd9 储位内移库,储位调拨 2 years ago
李俊城 385d869157 修改网络请求地址,修改获取主页面菜单 2 years ago
李俊城 b1cb070ce6 修改扫描框样式 2 years ago
李俊城 57db857418 修改网络访问地址 2 years ago
  1. 1
      fe/PDA/.gitignore
  2. 3
      fe/PDA/App.vue
  3. 121
      fe/PDA/README.md
  4. 1087
      fe/PDA/api/index.js
  5. 1
      fe/PDA/common/array.js
  6. 235
      fe/PDA/common/basic.js
  7. 17
      fe/PDA/common/calc.js
  8. 42
      fe/PDA/common/mock.js
  9. 4
      fe/PDA/common/modelConfig.js
  10. 51
      fe/PDA/common/new_style.css
  11. 100
      fe/PDA/common/pdabasic.css
  12. 1
      fe/PDA/common/promise.js
  13. 5
      fe/PDA/common/request.js
  14. 8
      fe/PDA/common/scan.js
  15. 5046
      fe/PDA/components/u-charts/u-charts.js
  16. 59
      fe/PDA/components/u-link/u-link.vue
  17. 8
      fe/PDA/components/uni-combox/uni-combox.vue
  18. 39
      fe/PDA/components/uni-data-select/changelog.md
  19. 562
      fe/PDA/components/uni-data-select/components/uni-data-select/uni-data-select.vue
  20. 86
      fe/PDA/components/uni-data-select/package.json
  21. 8
      fe/PDA/components/uni-data-select/readme.md
  22. 562
      fe/PDA/components/uni-data-select/uni-data-select.vue
  23. 1
      fe/PDA/components/uni-datetime-picker/uni-datetime-picker.vue
  24. 168
      fe/PDA/components/uni-fab/uni-fab.vue
  25. 185
      fe/PDA/components/uni-section/uni-section.vue
  26. 5
      fe/PDA/components/uni-tag/uni-tag.vue
  27. 249
      fe/PDA/components/virtual-list-test-cell/virtual-list-test-cell.vue
  28. 41
      fe/PDA/components/zp-public-virtual-cell/zp-public-virtual-cell.vue
  29. 146
      fe/PDA/main.js
  30. 6
      fe/PDA/mycomponents/comItem/comBalanceItem.vue
  31. 2
      fe/PDA/mycomponents/comItem/comBaseItem.vue
  32. 2
      fe/PDA/mycomponents/comItem/comBottomItem.vue
  33. 14
      fe/PDA/mycomponents/comItem/comItemBottom.vue
  34. 38
      fe/PDA/mycomponents/comItem/comItemCode.vue
  35. 40
      fe/PDA/mycomponents/comItem/comItemTop.vue
  36. 39
      fe/PDA/mycomponents/comItem/comJobScanDetail.vue
  37. 2
      fe/PDA/mycomponents/comItem/comTopItem.vue
  38. 107
      fe/PDA/mycomponents/comRequest/comKittingRequestItem.vue
  39. 41
      fe/PDA/mycomponents/comRequest/comRequestDetail.vue
  40. 54
      fe/PDA/mycomponents/comRequest/comRequestTopInfo.vue
  41. 100
      fe/PDA/mycomponents/comRequest/comThirdLocationRequestItem.vue
  42. 59
      fe/PDA/mycomponents/comjob/comJobScanDetail.vue
  43. 109
      fe/PDA/mycomponents/comjob/comJobUnScanDetail.vue
  44. 2
      fe/PDA/mycomponents/common/comDyItemInfo.vue
  45. 8
      fe/PDA/mycomponents/common/comEasyInput.vue
  46. 105
      fe/PDA/mycomponents/common/comEasyInputCount.vue
  47. 62
      fe/PDA/mycomponents/common/comList.vue
  48. 12
      fe/PDA/mycomponents/common/comMessage.vue
  49. 9
      fe/PDA/mycomponents/common/comNumberBox.vue
  50. 126
      fe/PDA/mycomponents/coms/comDeliverBoardDetail.vue
  51. 2
      fe/PDA/mycomponents/coms/comProductItem.vue
  52. 418
      fe/PDA/mycomponents/coms/comUnPacking.vue
  53. 276
      fe/PDA/mycomponents/coms/inventory/comSplit.vue
  54. 80
      fe/PDA/mycomponents/coms/request/comInjectIssue.vue
  55. 2
      fe/PDA/mycomponents/coms/return/comReturnDetail.vue
  56. 2
      fe/PDA/mycomponents/coms/task/comCount.vue
  57. 16
      fe/PDA/mycomponents/coms/task/comCountScanDetail.vue
  58. 84
      fe/PDA/mycomponents/coms/task/comDeliverBoard.vue
  59. 80
      fe/PDA/mycomponents/coms/task/comInjectIssue.vue
  60. 68
      fe/PDA/mycomponents/coms/task/comInventyMove.vue
  61. 97
      fe/PDA/mycomponents/coms/task/comKittingIssue.vue
  62. 97
      fe/PDA/mycomponents/coms/task/comProductCode.vue
  63. 2
      fe/PDA/mycomponents/coms/task/comReceipt.vue
  64. 6
      fe/PDA/mycomponents/coms/task/comScanPutaway.vue
  65. 102
      fe/PDA/mycomponents/coms/task/comThird.vue
  66. 121
      fe/PDA/mycomponents/coms/task/comUnProduce.vue
  67. 2
      fe/PDA/mycomponents/dycom/dyItemInfo.vue
  68. 128
      fe/PDA/mycomponents/popup/balanceList.vue
  69. 128
      fe/PDA/mycomponents/popup/recommendList.vue
  70. 123
      fe/PDA/mycomponents/popup/selectClickList.vue
  71. 24
      fe/PDA/mycomponents/return/comReturn.vue
  72. 2
      fe/PDA/mycomponents/return/comReturnDetail.vue
  73. 2
      fe/PDA/mycomponents/scan/comScanCreateTp.vue
  74. 2
      fe/PDA/mycomponents/scan/comScanDeliverFg.vue
  75. 2
      fe/PDA/mycomponents/scan/comScanDeliverTf.vue
  76. 2
      fe/PDA/mycomponents/scan/comScanHold.vue
  77. 2
      fe/PDA/mycomponents/scan/comScanPutaway.vue
  78. 10
      fe/PDA/mycomponents/scan/comScanReplen.vue
  79. 2
      fe/PDA/mycomponents/scan/comScanSemiPutaway.vue
  80. 2
      fe/PDA/mycomponents/scan/comScanUnpick.vue
  81. 2
      fe/PDA/mycomponents/wincom/winCollapseLocation.vue
  82. 4
      fe/PDA/mycomponents/wincom/winComScan.vue
  83. 11
      fe/PDA/mycomponents/wincom/winScanButton.vue
  84. 58
      fe/PDA/mycomponents/wincom/winScanButtonLeft.vue
  85. 58
      fe/PDA/mycomponents/wincom/winScanButtonTop.vue
  86. 58
      fe/PDA/mycomponents/wincom/winScanButtonbottom.vue
  87. 22
      fe/PDA/mycomponents/wincom/winScanByCode.vue
  88. 170
      fe/PDA/mycomponents/wincom/winScanByContainer.vue
  89. 17
      fe/PDA/mycomponents/wincom/winScanByPack.vue
  90. 192
      fe/PDA/mycomponents/wincom/winScanByPosition.vue
  91. 162
      fe/PDA/mycomponents/wincom/winScanByProductCode.vue
  92. 111
      fe/PDA/mycomponents/wincom/winScanContent.vue
  93. 72
      fe/PDA/mycomponents/wincom/winScanLocationCode.vue
  94. 58
      fe/PDA/package.json
  95. 574
      fe/PDA/pages.js
  96. 599
      fe/PDA/pages.json
  97. 433
      fe/PDA/pages/assemble/assembleTransfer.vue
  98. 262
      fe/PDA/pages/container/containerCall.vue
  99. 209
      fe/PDA/pages/container/containerMove.vue
  100. 413
      fe/PDA/pages/container/containerMoveDetail.vue

1
fe/PDA/.gitignore

@ -2898,3 +2898,4 @@ node_modules/webpack-sources/lib/helpers/streamChunksOfSourceMap.js
.idea/.gitignore
.idea/
/yarn.lock
/unpackage

3
fe/PDA/App.vue

@ -15,13 +15,14 @@
}
</script>
<style>
<style lang="scss">
/*每个页面公共css */
/* @import './common/PDA_style.css'; */
@import './common/new_style.css';
@import "@/static/icon/iconfont.css";
@import './common/uni.css';
@import './common/pdabasic.css';
@import "./uni_modules/uview-ui/index.scss";
body{
background-color: #EBEEF0;
}

121
fe/PDA/README.md

@ -1,39 +1,106 @@
# uniproject
<p align="center">
<img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
</p>
<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView</h3>
<h3 align="center">多平台快速开发的UI框架</h3>
#### 介绍
{**以下是 Gitee 平台说明,您可以替换此简介**
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
#### 软件架构
软件架构说明
## 说明
uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
#### 安装教程
## 特性
1. xxxx
2. xxxx
3. xxxx
- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序
- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用
- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨
- 众多的常用页面和布局,让您专注逻辑,事半功倍
- 详尽的文档支持,现代化的演示效果
- 按需引入,精简打包体积
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
## 安装
#### 参与贡献
```bash
# npm方式安装
npm i uview-ui
```
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
## 快速上手
1. `main.js`引入uView库
```js
// main.js
import uView from 'uview-ui';
Vue.use(uView);
```
#### 特技
2. `App.vue`引入基础样式(注意style标签需声明scss属性支持)
```css
/* App.vue */
<style lang="scss">
@import "uview-ui/index.scss";
</style>
```
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
3. `uni.scss`引入全局scss变量文件
```css
/* uni.scss */
@import "uview-ui/theme.scss";
```
4. `pages.json`配置easycom规则(按需引入)
```js
// pages.json
{
"easycom": {
// npm安装的方式不需要前面的"@/",下载安装的方式需要"@/"
// npm安装方式
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
// 下载安装方式
// "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
},
// 此为本身已有的内容
"pages": [
// ......
]
}
```
请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
## 使用方法
配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
```html
<template>
<u-button>按钮</u-button>
</template>
```
请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
## 链接
- [官方文档](https://uviewui.com/)
- [更新日志](https://uviewui.com/components/changelog.html)
- [升级指南](https://uviewui.com/components/changelog.html)
- [关于我们](https://uviewui.com/cooperation/about.html)
## 预览
您可以通过**微信**扫码,查看最佳的演示效果。
<br>
<br>
<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
<!-- ## 捐赠uView的研发
uView文档和源码全部开源免费,如果您认为uView帮到了您的开发工作,您可以捐赠uView的研发工作,捐赠无门槛,哪怕是一杯可乐也好(相信这比打赏主播更有意义)。
<img src="https://uviewui.com/common/wechat.png" width="220" >
<img style="margin-left: 100px;" src="https://uviewui.com/common/alipay.png" width="220" >
-->
## 版权信息
uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。

1087
fe/PDA/api/index.js

File diff suppressed because it is too large

1
fe/PDA/common/array.js

@ -132,3 +132,4 @@ export function getReturnReasonArray() {
}]
return array;
}

235
fe/PDA/common/basic.js

@ -6,7 +6,11 @@ export function getJobStatuStyle(val) {
else if (val == 1) return 'open'
else if (val == 2) return 'pending'
else if (val == 3) return 'completed'
else if (val == 4) return 'close'
else if (val == 4) return 'partial'
else if (val == 8) return 'close'
else if (val == 9) return 'cancelled '
else if (val == 30) return 'close'
else if (val == 31) return 'agvWait'
}
//任务状态
//open pending completed close
@ -15,7 +19,11 @@ export function getJobStatuDesc(val) {
else if (val == 1) return '待处理'
else if (val == 2) return '进行中'
else if (val == 3) return '完成'
else if (val == 4) return '关闭'
else if (val == 4) return '部分完成'
else if (val == 8) return '关闭'
else if (val == 9) return '作废'
else if (val == 30) return '待库移'
else if (val == 31) return '待AGV库移'
else return '其他'
}
@ -28,6 +36,38 @@ export function getInspectTypeStyle(val) {
else if (val == 4) return 'pick'
else return 'other'
}
//审批状态
export function getRequestStatusDesc(val) {
if (val == 1) return '新增'
else if (val == 2) return '待审批'
else if (val == 3) return '已驳回'
else if (val == 4) return '待执行'
else if (val == 5) return '执行中'
else if (val == 6) return '已完成'
else if (val == 7) return '已取消'
else if (val == 8) return '中止'
else if (val == 9) return '部分完成'
else return '其他'
}
//审批状态样式
export function getRequestStatusStyle(val) {
if (val == 1) return 'request_add'
else if (val == 2) return 'request_approve'
else if (val == 3) return 'request_return'
else if (val == 4) return 'request_wait'
else if (val == 5) return 'request_doing'
else if (val == 6) return 'request_complete'
else if (val == 7) return 'request_cancle'
else if (val == 8) return 'request_stop'
else if (val == 9) return 'request_part'
else return 'other'
}
//open pending completed close
export function getInspectTypeDesc(val) {
if (val == 0) return '未知'
@ -66,6 +106,20 @@ export function getInventoryStatusDesc(val) {
else return '其他'
}
export function getInventoryStatusList() {
var list=["待检","合格","不合格","隔离","报废","冻结"]
return list;
}
export function getInventoryStatusValueList(val) {
if (val == '待检') return 1
else if (val == '合格') return 2
else if (val == '不合格') return 3
else if (val == '隔离') return 4
else if (val == '报废') return 5
else if (val == '冻结') return 6
}
//零件状态
export function getItemTypeStyle(val) {
if (val == 0) return 'unk'
@ -138,7 +192,7 @@ export function getLocationType(val) {
else if (val == 8) return 'noc'
else if (val == 9) return 'overflow'
else if (val == 10) return 'customer'
else return 'other'
else return 'other'
}
//获取库位类型描述
@ -168,10 +222,68 @@ export function getJobType(val) {
else if (val == 6) return 'IssueJob' //发料任务
else if (val == 7) return 'DeliverJob' //发货任务
else if (val == 8) return 'CheckJob' //校验任务
else if (val == 9) return 'CountJob' //盘点任务
else if (val == 9) return 'ByPackingCode' //盘点任务有箱码
else if (val == 10) return 'ByErpItemCode' //盘点任务无箱码
else if (val == 16) return 'ContainerTransferJob' //器具转移
else if (val == 17) return 'ThirdLocationJob' //三方库
else if (val == 18) return 'InjectionIssueJob' //注塑发料
else if (val == 19) return 'InjectionPlanJob' //注塑计划
else if (val == 20) return 'CoatingIssueJob' //喷涂发料
else if (val == 21) return 'AssembleIssueJob' //装配发料
else if (val == 22) return 'KittingIssueJob' //kitting发料
else if (val == 23) return 'SparePartIssueJob' //备品发料
else if (val == 96) return 'unProducePick' //非生产领料 原料
else if (val == 97) return 'unProducePickWip' //非生产领料 线边
else if (val == 98) return 'unProduceReturnWip' //非生产退料 线边
else if (val == 99) return 'unProduceReturn' //非生产退料 原料
else return 'Other'
}
export function getContainerTypeArray() {
let array = [{
name: '内物流',
value: "InLogistics",
}, {
name: '外物流',
value: "OutLogistics",
}];
return array;
}
export function getContainerTypeName(val) {
let array = [{
name: '内物流',
value: "InLogistics",
}, {
name: '外物流',
value: "OutLogistics",
}];
let item = array.find(r => r.value == val);
return item.name;
}
//位置码类型
export function getPositionCodeName(type) {
let array = [{
name: '注塑区',
type: 1,
}, {
name: '喷涂区',
type: 2,
}, {
name: '装配区',
type: 3,
}, {
name: 'kitting区',
type: 4,
}];
let item = array.find(r => r.type == type);
return item.name;
}
//提示是否消息
export function showConfirmMsg(content, callback) {
uni.showModal({
@ -222,6 +334,11 @@ export function getCurrDateTime() {
return getDate(date) + " " + getTime(date);
}
export function getCurrDateTimeAndT() {
var date = new Date();
return getDate(date) + "T" + getTime(date);
}
export function getISODateTime() {
var date = new Date();
return getDate(date) + "T" + getTime(date) + "Z";
@ -232,6 +349,15 @@ export function dateFormat(time) {
let date = new Date(time);
return getDate(date) + " " + getTime(date);
}
//带T的时间转换为毫秒值
export function timeInMilliseconds(timeString) {
return new Date(timeString).getTime();
}
export function secondsToDateTime(time) {
let date = new Date(time);
return getDate(date) + "T" + getTime(date) + "Z";
}
//获取日期部分
export function getDate(date) {
@ -295,8 +421,32 @@ export function setRootFontSize(fontSize) {
export function scanErrorAudio() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src ="../../static/video/error.wav";
music.volume=1;
music.src = "../../static/video/error.wav";
music.volume = 1;
music.play(); //执行播放
music.onEnded(() => {
//播放结束
music = null;
});
}
export function scanSuccessAudio() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src = "../../static/video/scan_success.mp3";
music.volume = 1;
music.play(); //执行播放
music.onEnded(() => {
//播放结束
music = null;
});
}
export function scanFailedAudio() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src = "../../static/video/scan_failed.mp3";
music.volume = 1;
music.play(); //执行播放
music.onEnded(() => {
//播放结束
@ -308,8 +458,8 @@ export function scanErrorAudio() {
export function newMessageAudio() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src ="../../static/video/error.wav";
music.volume=1;
music.src = "../../static/video/error.wav";
music.volume = 1;
music.play(); //执行播放
music.onEnded(() => {
//播放结束
@ -320,8 +470,73 @@ export function newMessageAudio() {
export function vibrate() {
uni.vibrateLong({
success:function(){
success: function() {
}
})
}
export function navigateBack(backIndex) {
let canNavBack = getCurrentPages()
if (canNavBack && canNavBack.length - 1 > backIndex) {
uni.navigateBack({
delta: backIndex
})
} else {
history.back();
}
}
/**
* 深度克隆对象
* @param {*} 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) {
cloneTarget[key] = deepCopyData(target[key]);
}
return cloneTarget;
}
//发料任务列表状态
export function getIssueJobState(val) {
if (val == 0) return 'ALL'
else if (val == 1) return 'WaitAgv'
else if (val == 2) return 'Open'
else if (val == 3) return 'Wait'
}
// export function getIssueJobState(val) {
// if (val == 0) return 31
// else if (val == 1) return 1
// else if (val == 2) return 30
// }
const S4 = function() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
export function guid() {
return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4());
}
export function debounceSetting(fn, wait) {
let timeout = null;
wait = wait || 600;
return function() {
let that = this;
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(() => {
fn.apply(that);
}, wait);
}
}

17
fe/PDA/common/calc.js

@ -0,0 +1,17 @@
/* 解决js计算精度问题 */
import { Decimal } from 'decimal.js';//引入
class Calc {
add(num1,num2) {
return new Decimal(num1).add(new Decimal(num2)).toNumber()
}
sub(num1,num2) {
return new Decimal(num1).sub(new Decimal(num2)).toNumber()
}
mul(num1,num2) {
return new Decimal(num1).mul(new Decimal(num2)).toNumber()
}
div(num1,num2) {
return new Decimal(num1).div(new Decimal(num2)).toNumber()
}
}
export const calc = new Calc();

42
fe/PDA/common/mock.js

@ -0,0 +1,42 @@
const defaultData = {
pageIndex: 1,
pageSize: 20,
name: ''
}
/**模拟后端请求*/
export const simulationReqGetList = function(data = defaultData) {
return new Promise((resolve, reject) => {
let list = []
if (data.pageIndex > 3) {
return resolve(list)
}
const startIndex = data.pageIndex * data.pageSize - data.pageSize
for (let i = startIndex; i < data.pageIndex * data.pageSize; i++) {
if (data.name) {
list.push({
name: `${data.name}${i + 1}条数据`,
code: `${i}-${i + 1}`
})
} else {
list.push({
name: `${i + 1}条数据`,
code: `${i}-${i + 1}`
})
}
}
setTimeout(() => {
return resolve(list)
}, 1000)
})
}
export const getDataList = function() {
let list = []
for (let i = 0; i < 200; i++) {
list.push({
name: `${i + 1}条数据`,
code: `${i}-${i + 1}`
})
}
return list
}

4
fe/PDA/common/modelConfig.js

@ -1,5 +1,7 @@
let maxPageSize = 10;
let version ="1.0"
export default{
maxPageSize
maxPageSize,
version
}

51
fe/PDA/common/new_style.css

@ -63,7 +63,7 @@ uni-page-head .uni-page-head__title {
}
.margin_top {
margin-top: 20rpx;
margin-top: 10rpx;
}
.margin_bottom {
@ -135,7 +135,7 @@ uni-page-head .uni-page-head__title {
position: fixed;
z-index: 10;
right: 20rpx;
bottom: 20%;
bottom: 25%;
width: 110rpx;
height: 110rpx;
background-color: #5A7CF3;
@ -187,7 +187,7 @@ uni-page-head .uni-page-head__title {
position: relative;
/* width: 25%; */
padding: 0 20rpx;
margin: 0 0 20rpx;
/* margin: 0 0 20rpx; */
text-align: center;
}
@ -257,6 +257,9 @@ uni-page-head .uni-page-head__title {
font-size: 0.875rem;
padding: 8rpx 10rpx;
border-radius: 8rpx;
display: flex;
align-items: center;
}
.photo_btn text {
@ -279,7 +282,7 @@ uni-page-head .uni-page-head__title {
.bot_card_item {
width: 50%;
text-align: left;
text-align:left;
height: 60rpx;
overflow: hidden;
white-space: nowrap;
@ -405,16 +408,20 @@ uni-page-head .uni-page-head__title {
}
.popup_box .pop_title {
font-size: 1rem;
font-size: 0.9rem;
font-weight: bold;
color: #fff;
padding: 30rpx 20rpx;
padding: 20rpx 30rpx 15rpx 20rpx;
align-items: center;
/* position: absolute; */
/* transform: translateY(-50%); */
}
.popup_box .pop_title text {
font-size: .825rem;
font-weight: normal;
margin-top: 10rpx;
margin-top: 5rpx;
}
.popup_box .uni-steps {
@ -455,6 +462,7 @@ uni-page-head .uni-page-head__title {
position: relative;
margin-bottom: 20rpx;
background-color: #fff;
border-top-left-radius: 8rpx;
border-top-right-radius: 8rpx;
border-bottom-left-radius: 8rpx;
border-bottom-right-radius: 8rpx;
@ -505,7 +513,7 @@ uni-page-head .uni-page-head__title {
}
.popup_box .pop_tab .tab_info textarea {
padding-top: 20rpx;
padding-top: 10rpx;
}
.list_wrap {
@ -660,6 +668,17 @@ uni-page-head .uni-page-head__title {
z-index: 2;
}
.choose_marked_count {
position: absolute;
width: 100%;
/* height: 100%; */
top: 0;
left: 0;
border-top: 6rpx solid #5FCB94;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
}
.choose_marked {
position: absolute;
width: 100%;
@ -797,8 +816,8 @@ uni-page-head .uni-page-head__title {
.task_num {
border-bottom: 1px solid #eee;
padding-bottom: 10rpx;
margin-bottom: 10rpx;
padding-bottom: 5rpx;
margin-bottom: 5rpx;
overflow: hidden;
}
@ -1861,3 +1880,15 @@ uni-modal .uni-modal__hd {
right: 0;
top: -6rpx;
}
.btn_single {
background-color: #3C9CFF;
font-size: 32rpx;
color: #fff;
text-align: center;
width: 150rpx;
margin:0 10rpx 10rpx;
}
.btn_single_after {
opacity: 0.7;
}

100
fe/PDA/common/pdabasic.css

@ -167,7 +167,7 @@
.scroll-detail {
overflow: hidden;
padding-bottom: 60px;
height: 480px;
height: 100%;
/* 没有高度不可以回到顶部 */
/* background-color: #ffffff; */
}
@ -229,7 +229,7 @@
.uni-popup-view {
background-color: #fff;
border-radius: 10px;
border-radius: 15rpx;
}
.uni-popup-button-box {
@ -271,6 +271,23 @@
background-color: #F56C6C;
color: #FFFFFF;
}
/* 部分完成 */
.partial {
background-color: #21DF4B;
color: #FFFFFF;
}
/* 作废 */
.cancelled {
background-color: #EF5222;
color: #FFFFFF;
}
/* 等待 */
.close {
background-color: #D5D5AD;
color: #FFFFFF;
}
/* 关闭 */
@ -284,6 +301,11 @@
background-color: #ececec;
color: #666;
}
.agvWait {
background-color: #00B6FF ;
color: fff;
}
/* 检验任务状态 */
/* 免检 */
@ -600,7 +622,7 @@ export function getItemTypeStyle(val) {
} */
.conbox {
padding: 10rpx 0;
/* padding: 10rpx 0; */
}
.myinput {
@ -695,3 +717,75 @@ export function getItemTypeStyle(val) {
/deep/ .uni-input-input {
font-size: 18px;
}
.request_add{
background-color: #45B5F3;
color: #FFFFFF;
}
.request_approve{
background-color: #E49826;
color: #FFFFFF;
}
.request_return{
background-color: #C90000;
color: #FFFFFF;
}
.request_wait{
background-color: #F4CD00;
color: #FFFFFF;
}
.request_doing{
background-color: #5A7CF3;
color: #FFFFFF;
}
.request_complete{
background-color: #31BB99;
color: #FFFFFF;
}
.request_cancle{
background-color: #DADADA;
color: #FFFFFF;
}
.request_stop{
background-color: #870505;
color: #FFFFFF;
}
.request_part{
background-color: #21DF4B;
color: #FFFFFF;
}
page {
width: 100%;
height: 100%;
/* background-color: #fff; */
}
.page-wraper {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
/* background-color: #fff; */
}
.page-main {
flex: 1;
position: relative;
background: #fff;
}
.page-main-scroll {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.page-main-list {
/* height: 80rpx;
line-height: 80rpx; */
text-align: center;
background: #e0e0e0;
}

1
fe/PDA/common/promise.js

@ -13,6 +13,7 @@ promise.asyncRequest = (url, options = {}, power) => {
// 'Authorization': localStorage.token_type,
...options.header,
},
timeout:60000,
success: (res) => {
resolve(res.data);
},

5
fe/PDA/common/request.js

@ -36,7 +36,8 @@ request.globalRequest = (url, options = {}, power) => {
// 'Blade-Auth':'bearer '+store.state.token,
'token_type': localStorage.token_type,
...options.header,
}
},
timeout:60000,
})
.then(res => {
if (res != null && res[1] != null) {
@ -117,7 +118,7 @@ request.globalRequest = (url, options = {}, power) => {
}
})
.catch(params => {
throw new Error(params);
throw new Error("后台提示 : "+params);
})
}

8
fe/PDA/common/scan.js

@ -1,7 +1,7 @@
//解析扫描信息
//P2251076NAA;L220325;Q2000;N0205183222000006;SS0000066;V02051832;OPO1072;C15;
//解析规则
//P:itemCode 料号
//P:itemCode ERP料号
//L:lot批次
//Q:qty 数量
//N:asn 供应商商发货单 ASN
@ -55,7 +55,7 @@ export function analyseScanInfo(scanMsg) {
if (type != "") {
scanResult.data.scanType = 'qrcode';
switch (type) {
case "P": //料号
case "P": //ERP料号
case "p":
scanResult.data.itemCode = value;
break;
@ -126,7 +126,7 @@ export function analyseScanInfo(scanMsg) {
//P2250229RAA;L220408;Q100;N62840610;SB0000107;UEA;DU571LS;FA;E2022-4-8
//P零件号,L批次,Q数量,N生产计划号,S箱码,U计量单位,D生产线,F班次,E日期,M零件名称(待添加)
//解析规则
//P:itemCode 料号
//P:itemCode ERP料号
//L:lot批次
//Q:qty 数量
//N:pnumber productionPlanNumber生产计划号
@ -173,7 +173,7 @@ export function analyseProductLabelInfo(scanMsg) {
let value = item.substring(1, item.length);
if (type != "") {
switch (type) {
case "P": //料号
case "P": //ERP料号
case "p":
scanResult.data.itemCode = value;
break;

5046
fe/PDA/components/u-charts/u-charts.js

File diff suppressed because it is too large

59
fe/PDA/components/u-link/u-link.vue

@ -1,59 +0,0 @@
<template>
<text style="text-decoration:underline" :href="href" @click="openURL" :inWhiteList="inWhiteList">{{text}}</text>
</template>
<script>
/**
* @description u-link是一个外部网页超链接组件在小程序内打开内部web-view组件或复制url在app内打开外部浏览器在h5端打开新网页
* @property {String} href 点击后打开的外部网页url小程序中必须以https://
* @property {String} text 显示的文字
* @property {Boolean} inWhiteList 是否在小程序白名单中如果在的话在小程序端会直接打开内置web-view否则会只会复制url提示在外部打开
* @example * <u-link href="https://ext.dcloud.net.cn" text="https://ext.dcloud.net.cn" :inWhiteList="true"></u-link>
*/
export default {
name: 'u-link',
props: {
href: {
type: String,
default: ''
},
text: {
type: String,
default: ''
},
inWhiteList: {
type: Boolean,
default: false
}
},
methods: {
openURL() {
// #ifdef APP-PLUS
plus.runtime.openURL(this.href) //使web-view
// #endif
// #ifdef H5
window.open(this.href)
// #endif
// #ifdef MP
if (this.inWhiteList) { //webview
uni.navigateTo({
url: '/pages/component/web-view/web-view?url=' + this.href
});
} else {
uni.setClipboardData({
data: this.href
});
uni.showModal({
content: '本网址无法直接在小程序内打开。已自动复制网址,请在手机浏览器里粘贴该网址',
showCancel: false
});
}
// #endif
}
}
}
</script>
<style>
</style>

8
fe/PDA/components/uni-combox/uni-combox.vue

@ -87,9 +87,10 @@
}
},
filterCandidates() {
return this.candidates.filter((item) => {
return item.toString().indexOf(this.inputVal) > -1
})
return this.candidates;
// return this.candidates.filter((item) => {
// return item.toString().indexOf(this.inputVal) > -1
// })
},
filterCandidatesLength() {
return this.filterCandidates.length
@ -173,6 +174,7 @@
font-size: 16px;
height: 22px;
line-height: 22px;
padding-left: 20rpx;
}
.uni-combox__input-arrow {

39
fe/PDA/components/uni-data-select/changelog.md

@ -0,0 +1,39 @@
## 1.0.8(2024-03-28)
- 修复 在vue2下:style动态绑定导致编译失败的bug
## 1.0.7(2024-01-20)
- 修复 长文本回显超过容器的bug,超过容器部分显示省略号
## 1.0.6(2023-04-12)
- 修复 微信小程序点击时会改变背景颜色的 bug
## 1.0.5(2023-02-03)
- 修复 禁用时会显示清空按钮
## 1.0.4(2023-02-02)
- 优化 查询条件短期内多次变更只查询最后一次变更后的结果
- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue
## 1.0.3(2023-01-16)
- 修复 不关联服务空间报错的问题
## 1.0.2(2023-01-14)
- 新增 属性 `format` 可用于格式化显示选项内容
## 1.0.1(2022-12-06)
- 修复 当where变化时,数据不会自动更新的问题
## 0.1.9(2022-09-05)
- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
## 0.1.8(2022-08-29)
- 修复 点击的位置不准确
## 0.1.7(2022-08-12)
- 新增 支持 disabled 属性
## 0.1.6(2022-07-06)
- 修复 pc端宽度异常的bug
## 0.1.5
- 修复 pc端宽度异常的bug
## 0.1.4(2022-07-05)
- 优化 显示样式
## 0.1.3(2022-06-02)
- 修复 localdata 赋值不生效的 bug
- 新增 支持 uni.scss 修改颜色
- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用)
## 0.1.2(2022-05-08)
- 修复 当 value 为 0 时选择不生效的 bug
## 0.1.1(2022-05-07)
- 新增 记住上次的选项(仅 collection 存在时有效)
## 0.1.0(2022-04-22)
- 初始化

562
fe/PDA/components/uni-data-select/components/uni-data-select/uni-data-select.vue

@ -0,0 +1,562 @@
<template>
<view class="uni-stat__select">
<span v-if="label" class="uni-label-text hide-on-phone">{{label + ''}}</span>
<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
<view class="uni-select" :class="{'uni-select--disabled':disabled}">
<view class="uni-select__input-box" @click="toggleSelector">
<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
<view v-if="current && clear && !disabled" @click.stop="clearVal">
<uni-icons type="clear" color="#c0c4cc" size="24" />
</view>
<view v-else>
<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
</view>
</view>
<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
<view class="uni-select__selector" :style="getOffsetByPlacement" v-if="showSelector">
<view :class="placement=='bottom'?'uni-popper__arrow_bottom':'uni-popper__arrow_top'"></view>
<scroll-view scroll-y="true" class="uni-select__selector-scroll">
<view class="uni-select__selector-empty" v-if="mixinDatacomResData.length === 0">
<text>{{emptyTips}}</text>
</view>
<view v-else class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index"
@click="change(item)">
<text :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
</view>
</scroll-view>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* DataChecklist 数据选择器
* @description 通过数据渲染的下拉框组件
* @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
* @property {String} value 默认值
* @property {Array} localdata 本地数据 格式 [{text:'',value:''}]
* @property {Boolean} clear 是否可以清空已选项
* @property {Boolean} emptyText 没有数据时显示的文字 本地数据无效
* @property {String} label 左侧标题
* @property {String} placeholder 输入框的提示文字
* @property {Boolean} disabled 是否禁用
* @property {String} placement 弹出位置
* @value top 顶部弹出
* @value bottom 底部弹出default)
* @event {Function} change 选中发生变化触发
*/
export default {
name: "uni-data-select",
mixins: [uniCloud.mixinDatacom || {}],
props: {
localdata: {
type: Array,
default () {
return []
}
},
value: {
type: [String, Number],
default: ''
},
modelValue: {
type: [String, Number],
default: ''
},
label: {
type: String,
default: ''
},
placeholder: {
type: String,
default: '请选择'
},
emptyTips: {
type: String,
default: '无选项'
},
clear: {
type: Boolean,
default: true
},
defItem: {
type: Number,
default: 0
},
disabled: {
type: Boolean,
default: false
},
// field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
format: {
type: String,
default: ''
},
placement: {
type: String,
default: 'bottom'
}
},
data() {
return {
showSelector: false,
current: '',
mixinDatacomResData: [],
apps: [],
channels: [],
cacheKey: "uni-data-select-lastSelectedValue",
};
},
created() {
this.debounceGet = this.debounce(() => {
this.query();
}, 300);
if (this.collection && !this.localdata.length) {
this.debounceGet();
}
},
computed: {
typePlaceholder() {
const text = {
'opendb-stat-app-versions': '版本',
'opendb-app-channels': '渠道',
'opendb-app-list': '应用'
}
const common = this.placeholder
const placeholder = text[this.collection]
return placeholder ?
common + placeholder :
common
},
valueCom() {
// #ifdef VUE3
return this.modelValue;
// #endif
// #ifndef VUE3
return this.value;
// #endif
},
textShow() {
//
let text = this.current;
if (text.length > 10) {
return text.slice(0, 25) + '...';
}
return text;
},
getOffsetByPlacement() {
switch (this.placement) {
case 'top':
return "bottom:calc(100% + 12px);";
case 'bottom':
return "top:calc(100% + 12px);";
}
}
},
watch: {
localdata: {
immediate: true,
handler(val, old) {
if (Array.isArray(val) && old !== val) {
this.mixinDatacomResData = val
}
}
},
valueCom(val, old) {
this.initDefVal()
},
mixinDatacomResData: {
immediate: true,
handler(val) {
if (val.length) {
this.initDefVal()
}
}
},
},
methods: {
debounce(fn, time = 100) {
let timer = null
return function(...args) {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, args)
}, time)
}
},
//
query() {
this.mixinDatacomEasyGet();
},
//
onMixinDatacomPropsChange() {
if (this.collection) {
this.debounceGet();
}
},
initDefVal() {
let defValue = ''
if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
defValue = this.valueCom
} else {
let strogeValue
if (this.collection) {
strogeValue = this.getCache()
}
if (strogeValue || strogeValue === 0) {
defValue = strogeValue
} else {
let defItem = ''
if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
defItem = this.mixinDatacomResData[this.defItem - 1].value
}
defValue = defItem
}
if (defValue || defValue === 0) {
this.emit(defValue)
}
}
const def = this.mixinDatacomResData.find(item => item.value === defValue)
this.current = def ? this.formatItemName(def) : ''
},
/**
* @param {[String, Number]} value
* 判断用户给的 value 是否同时为禁用状态
*/
isDisabled(value) {
let isDisabled = false;
this.mixinDatacomResData.forEach(item => {
if (item.value === value) {
isDisabled = item.disable
}
})
return isDisabled;
},
clearVal() {
this.emit('')
if (this.collection) {
this.removeCache()
}
},
change(item) {
if (!item.disable) {
this.showSelector = false
this.current = this.formatItemName(item)
this.emit(item.value)
}
},
emit(val) {
this.$emit('input', val)
this.$emit('update:modelValue', val)
this.$emit('change', val)
if (this.collection) {
this.setCache(val);
}
},
toggleSelector() {
if (this.disabled) {
return
}
this.showSelector = !this.showSelector
},
formatItemName(item) {
let {
text,
value,
channel_code
} = item
channel_code = channel_code ? `(${channel_code})` : ''
if (this.format) {
//
let str = "";
str = this.format;
for (let key in item) {
str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
}
return str;
} else {
return this.collection.indexOf('app-list') > 0 ?
`${text}(${value})` :
(
text ?
text :
`未命名${channel_code}`
)
}
},
//
getLoadData() {
return this.mixinDatacomResData;
},
// key
getCurrentCacheKey() {
return this.collection;
},
//
getCache(name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
return cacheData[name];
},
//
setCache(value, name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
cacheData[name] = value;
uni.setStorageSync(this.cacheKey, cacheData);
},
//
removeCache(name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
delete cacheData[name];
uni.setStorageSync(this.cacheKey, cacheData);
},
}
}
</script>
<style lang="scss">
$uni-base-color: #6a6a6a !default;
$uni-main-color: #333 !default;
$uni-secondary-color: #909399 !default;
$uni-border-3: #e5e5e5;
/* #ifndef APP-NVUE */
@media screen and (max-width: 500px) {
.hide-on-phone {
display: none;
}
}
/* #endif */
.uni-stat__select {
display: flex;
align-items: center;
// padding: 15px;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
width: 100%;
flex: 1;
box-sizing: border-box;
}
.uni-stat-box {
width: 100%;
flex: 1;
}
.uni-stat__actived {
width: 100%;
flex: 1;
// outline: 1px solid #2979ff;
}
.uni-label-text {
font-size: 14px;
font-weight: bold;
color: $uni-base-color;
margin: auto 0;
margin-right: 5px;
}
.uni-select {
font-size: 14px;
border: 1px solid $uni-border-3;
box-sizing: border-box;
border-radius: 4px;
padding: 0 5px;
padding-left: 10px;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
user-select: none;
/* #endif */
flex-direction: row;
align-items: center;
border-bottom: solid 1px $uni-border-3;
width: 100%;
flex: 1;
height: 35px;
&--disabled {
background-color: #f5f7fa;
cursor: not-allowed;
}
}
.uni-select__label {
font-size: 16px;
// line-height: 22px;
height: 35px;
padding-right: 10px;
color: $uni-secondary-color;
}
.uni-select__input-box {
height: 35px;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
align-items: center;
}
.uni-select__input {
flex: 1;
font-size: 14px;
height: 22px;
line-height: 22px;
}
.uni-select__input-plac {
font-size: 14px;
color: $uni-secondary-color;
}
.uni-select__selector {
/* #ifndef APP-NVUE */
box-sizing: border-box;
/* #endif */
position: absolute;
left: 0;
width: 100%;
background-color: #FFFFFF;
border: 1px solid #EBEEF5;
border-radius: 6px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
z-index: 3;
padding: 4px 0;
}
.uni-select__selector-scroll {
/* #ifndef APP-NVUE */
max-height: 200px;
box-sizing: border-box;
/* #endif */
}
/* #ifdef H5 */
@media (min-width: 768px) {
.uni-select__selector-scroll {
max-height: 600px;
}
}
/* #endif */
.uni-select__selector-empty,
.uni-select__selector-item {
/* #ifndef APP-NVUE */
display: flex;
cursor: pointer;
/* #endif */
line-height: 35px;
font-size: 14px;
text-align: center;
/* border-bottom: solid 1px $uni-border-3; */
padding: 0px 10px;
}
.uni-select__selector-item:hover {
background-color: #f9f9f9;
}
.uni-select__selector-empty:last-child,
.uni-select__selector-item:last-child {
/* #ifndef APP-NVUE */
border-bottom: none;
/* #endif */
}
.uni-select__selector__disabled {
opacity: 0.4;
cursor: default;
}
/* picker 弹出层通用的指示小三角 */
.uni-popper__arrow_bottom,
.uni-popper__arrow_bottom::after,
.uni-popper__arrow_top,
.uni-popper__arrow_top::after,
{
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 6px;
}
.uni-popper__arrow_bottom {
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
top: -6px;
left: 10%;
margin-right: 3px;
border-top-width: 0;
border-bottom-color: #EBEEF5;
}
.uni-popper__arrow_bottom::after {
content: " ";
top: 1px;
margin-left: -6px;
border-top-width: 0;
border-bottom-color: #fff;
}
.uni-popper__arrow_top {
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
bottom: -6px;
left: 10%;
margin-right: 3px;
border-bottom-width: 0;
border-top-color: #EBEEF5;
}
.uni-popper__arrow_top::after {
content: " ";
bottom: 1px;
margin-left: -6px;
border-bottom-width: 0;
border-top-color: #fff;
}
.uni-select__input-text {
// width: 280px;
width: 100%;
color: $uni-main-color;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
overflow: hidden;
}
.uni-select__input-placeholder {
color: $uni-base-color;
font-size: 12px;
}
.uni-select--mask {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
z-index: 2;
}
</style>

86
fe/PDA/components/uni-data-select/package.json

@ -0,0 +1,86 @@
{
"id": "uni-data-select",
"displayName": "uni-data-select 下拉框选择器",
"version": "1.0.8",
"description": "通过数据驱动的下拉框选择器",
"keywords": [
"uni-ui",
"select",
"uni-data-select",
"下拉框",
"下拉选"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": "^3.1.1"
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
"type": "component-vue"
},
"uni_modules": {
"dependencies": ["uni-load-more"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y",
"alipay": "n"
},
"client": {
"App": {
"app-vue": "u",
"app-nvue": "n"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

8
fe/PDA/components/uni-data-select/readme.md

@ -0,0 +1,8 @@
## DataSelect 下拉框选择器
> **组件名:uni-data-select**
> 代码块: `uDataSelect`
当选项过多时,使用下拉菜单展示并选择内容
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

562
fe/PDA/components/uni-data-select/uni-data-select.vue

@ -0,0 +1,562 @@
<template>
<view class="uni-stat__select">
<span v-if="label" class="uni-label-text hide-on-phone">{{label + ''}}</span>
<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
<view class="uni-select" :class="{'uni-select--disabled':disabled}">
<view class="uni-select__input-box" @click="toggleSelector">
<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
<view v-if="current && clear && !disabled" @click.stop="clearVal">
<uni-icons type="clear" color="#c0c4cc" size="24" />
</view>
<view v-else>
<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
</view>
</view>
<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
<view class="uni-select__selector" :style="getOffsetByPlacement" v-if="showSelector">
<view :class="placement=='bottom'?'uni-popper__arrow_bottom':'uni-popper__arrow_top'"></view>
<scroll-view scroll-y="true" class="uni-select__selector-scroll">
<view class="uni-select__selector-empty" v-if="mixinDatacomResData.length === 0">
<text>{{emptyTips}}</text>
</view>
<view v-else class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index"
@click="change(item)">
<text :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
</view>
</scroll-view>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* DataChecklist 数据选择器
* @description 通过数据渲染的下拉框组件
* @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
* @property {String} value 默认值
* @property {Array} localdata 本地数据 格式 [{text:'',value:''}]
* @property {Boolean} clear 是否可以清空已选项
* @property {Boolean} emptyText 没有数据时显示的文字 本地数据无效
* @property {String} label 左侧标题
* @property {String} placeholder 输入框的提示文字
* @property {Boolean} disabled 是否禁用
* @property {String} placement 弹出位置
* @value top 顶部弹出
* @value bottom 底部弹出default)
* @event {Function} change 选中发生变化触发
*/
export default {
name: "uni-data-select",
mixins: [uniCloud.mixinDatacom || {}],
props: {
localdata: {
type: Array,
default () {
return []
}
},
value: {
type: [String, Number],
default: ''
},
modelValue: {
type: [String, Number],
default: ''
},
label: {
type: String,
default: ''
},
placeholder: {
type: String,
default: '请选择'
},
emptyTips: {
type: String,
default: '无选项'
},
clear: {
type: Boolean,
default: true
},
defItem: {
type: Number,
default: 0
},
disabled: {
type: Boolean,
default: false
},
// field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
format: {
type: String,
default: ''
},
placement: {
type: String,
default: 'bottom'
}
},
data() {
return {
showSelector: false,
current: '',
mixinDatacomResData: [],
apps: [],
channels: [],
cacheKey: "uni-data-select-lastSelectedValue",
};
},
created() {
this.debounceGet = this.debounce(() => {
this.query();
}, 300);
if (this.collection && !this.localdata.length) {
this.debounceGet();
}
},
computed: {
typePlaceholder() {
const text = {
'opendb-stat-app-versions': '版本',
'opendb-app-channels': '渠道',
'opendb-app-list': '应用'
}
const common = this.placeholder
const placeholder = text[this.collection]
return placeholder ?
common + placeholder :
common
},
valueCom() {
// #ifdef VUE3
return this.modelValue;
// #endif
// #ifndef VUE3
return this.value;
// #endif
},
textShow() {
//
let text = this.current;
if (text.length > 10) {
return text.slice(0, 25) + '...';
}
return text;
},
getOffsetByPlacement() {
switch (this.placement) {
case 'top':
return "bottom:calc(100% + 12px);";
case 'bottom':
return "top:calc(100% + 12px);";
}
}
},
watch: {
localdata: {
immediate: true,
handler(val, old) {
if (Array.isArray(val) && old !== val) {
this.mixinDatacomResData = val
}
}
},
valueCom(val, old) {
this.initDefVal()
},
mixinDatacomResData: {
immediate: true,
handler(val) {
if (val.length) {
this.initDefVal()
}
}
},
},
methods: {
debounce(fn, time = 100) {
let timer = null
return function(...args) {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, args)
}, time)
}
},
//
query() {
this.mixinDatacomEasyGet();
},
//
onMixinDatacomPropsChange() {
if (this.collection) {
this.debounceGet();
}
},
initDefVal() {
let defValue = ''
if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
defValue = this.valueCom
} else {
let strogeValue
if (this.collection) {
strogeValue = this.getCache()
}
if (strogeValue || strogeValue === 0) {
defValue = strogeValue
} else {
let defItem = ''
if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
defItem = this.mixinDatacomResData[this.defItem - 1].value
}
defValue = defItem
}
if (defValue || defValue === 0) {
this.emit(defValue)
}
}
const def = this.mixinDatacomResData.find(item => item.value === defValue)
this.current = def ? this.formatItemName(def) : ''
},
/**
* @param {[String, Number]} value
* 判断用户给的 value 是否同时为禁用状态
*/
isDisabled(value) {
let isDisabled = false;
this.mixinDatacomResData.forEach(item => {
if (item.value === value) {
isDisabled = item.disable
}
})
return isDisabled;
},
clearVal() {
this.emit('')
if (this.collection) {
this.removeCache()
}
},
change(item) {
if (!item.disable) {
this.showSelector = false
this.current = this.formatItemName(item)
this.emit(item.value)
}
},
emit(val) {
this.$emit('input', val)
this.$emit('update:modelValue', val)
this.$emit('change', val)
if (this.collection) {
this.setCache(val);
}
},
toggleSelector() {
if (this.disabled) {
return
}
this.showSelector = !this.showSelector
},
formatItemName(item) {
let {
text,
value,
channel_code
} = item
channel_code = channel_code ? `(${channel_code})` : ''
if (this.format) {
//
let str = "";
str = this.format;
for (let key in item) {
str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
}
return str;
} else {
return this.collection.indexOf('app-list') > 0 ?
`${text}(${value})` :
(
text ?
text :
`未命名${channel_code}`
)
}
},
//
getLoadData() {
return this.mixinDatacomResData;
},
// key
getCurrentCacheKey() {
return this.collection;
},
//
getCache(name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
return cacheData[name];
},
//
setCache(value, name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
cacheData[name] = value;
uni.setStorageSync(this.cacheKey, cacheData);
},
//
removeCache(name = this.getCurrentCacheKey()) {
let cacheData = uni.getStorageSync(this.cacheKey) || {};
delete cacheData[name];
uni.setStorageSync(this.cacheKey, cacheData);
},
}
}
</script>
<style lang="scss">
$uni-base-color: #6a6a6a !default;
$uni-main-color: #333 !default;
$uni-secondary-color: #909399 !default;
$uni-border-3: #e5e5e5;
/* #ifndef APP-NVUE */
@media screen and (max-width: 500px) {
.hide-on-phone {
display: none;
}
}
/* #endif */
.uni-stat__select {
display: flex;
align-items: center;
// padding: 15px;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
width: 100%;
flex: 1;
box-sizing: border-box;
}
.uni-stat-box {
width: 100%;
flex: 1;
}
.uni-stat__actived {
width: 100%;
flex: 1;
// outline: 1px solid #2979ff;
}
.uni-label-text {
font-size: 14px;
font-weight: bold;
color: $uni-base-color;
margin: auto 0;
margin-right: 5px;
}
.uni-select {
font-size: 14px;
border: 1px solid $uni-border-3;
box-sizing: border-box;
border-radius: 4px;
padding: 0 5px;
padding-left: 10px;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
user-select: none;
/* #endif */
flex-direction: row;
align-items: center;
border-bottom: solid 1px $uni-border-3;
width: 100%;
flex: 1;
height: 35px;
&--disabled {
background-color: #f5f7fa;
cursor: not-allowed;
}
}
.uni-select__label {
font-size: 16px;
// line-height: 22px;
height: 35px;
padding-right: 10px;
color: $uni-secondary-color;
}
.uni-select__input-box {
height: 35px;
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
align-items: center;
}
.uni-select__input {
flex: 1;
font-size: 14px;
height: 22px;
line-height: 22px;
}
.uni-select__input-plac {
font-size: 14px;
color: $uni-secondary-color;
}
.uni-select__selector {
/* #ifndef APP-NVUE */
box-sizing: border-box;
/* #endif */
position: absolute;
left: 0;
width: 100%;
background-color: #FFFFFF;
border: 1px solid #EBEEF5;
border-radius: 6px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
z-index: 3;
padding: 4px 0;
}
.uni-select__selector-scroll {
/* #ifndef APP-NVUE */
max-height: 200px;
box-sizing: border-box;
/* #endif */
}
/* #ifdef H5 */
@media (min-width: 768px) {
.uni-select__selector-scroll {
max-height: 600px;
}
}
/* #endif */
.uni-select__selector-empty,
.uni-select__selector-item {
/* #ifndef APP-NVUE */
display: flex;
cursor: pointer;
/* #endif */
line-height: 35px;
font-size: 14px;
text-align: center;
/* border-bottom: solid 1px $uni-border-3; */
padding: 0px 10px;
}
.uni-select__selector-item:hover {
background-color: #f9f9f9;
}
.uni-select__selector-empty:last-child,
.uni-select__selector-item:last-child {
/* #ifndef APP-NVUE */
border-bottom: none;
/* #endif */
}
.uni-select__selector__disabled {
opacity: 0.4;
cursor: default;
}
/* picker 弹出层通用的指示小三角 */
.uni-popper__arrow_bottom,
.uni-popper__arrow_bottom::after,
.uni-popper__arrow_top,
.uni-popper__arrow_top::after,
{
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 6px;
}
.uni-popper__arrow_bottom {
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
top: -6px;
left: 10%;
margin-right: 3px;
border-top-width: 0;
border-bottom-color: #EBEEF5;
}
.uni-popper__arrow_bottom::after {
content: " ";
top: 1px;
margin-left: -6px;
border-top-width: 0;
border-bottom-color: #fff;
}
.uni-popper__arrow_top {
filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
bottom: -6px;
left: 10%;
margin-right: 3px;
border-bottom-width: 0;
border-top-color: #EBEEF5;
}
.uni-popper__arrow_top::after {
content: " ";
bottom: 1px;
margin-left: -6px;
border-bottom-width: 0;
border-top-color: #fff;
}
.uni-select__input-text {
// width: 280px;
width: 100%;
color: $uni-main-color;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
overflow: hidden;
}
.uni-select__input-placeholder {
color: $uni-base-color;
font-size: 12px;
}
.uni-select--mask {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
z-index: 2;
}
</style>

1
fe/PDA/components/uni-datetime-picker/uni-datetime-picker.vue

@ -289,6 +289,7 @@
},
methods: {
initPicker(newVal) {
if(!newVal)return;
if (!newVal || Array.isArray(newVal) && !newVal.length) {
this.$nextTick(() => {
this.clear(false)

168
fe/PDA/components/uni-fab/uni-fab.vue

@ -5,7 +5,9 @@
'uni-fab--rightBottom': rightBottom,
'uni-fab--leftTop': leftTop,
'uni-fab--rightTop': rightTop
}" class="uni-fab">
}" class="uni-fab"
:style="nvueBottom"
>
<view :class="{
'uni-fab__content--left': horizontal === 'left',
'uni-fab__content--right': horizontal === 'right',
@ -13,11 +15,15 @@
'uni-fab__content--flexDirectionStart': flexDirectionStart,
'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
'uni-fab__content--other-platform': !isAndroidNvue
}" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }" class="uni-fab__content" elevation="5">
}" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }"
class="uni-fab__content" elevation="5">
<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item" @click="_onItemClick(index, item)">
<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }"
class="uni-fab__item" @click="_onItemClick(index, item)">
<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image"
mode="aspectFit" />
<text class="uni-fab__item-text"
:style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
</view>
<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
</view>
@ -28,9 +34,11 @@
'uni-fab__circle--leftTop': leftTop,
'uni-fab__circle--rightTop': rightTop,
'uni-fab__content--other-platform': !isAndroidNvue
}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">
<view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor, 'bottom': nvueBottom }" @click="_onClick">
<uni-icons class="fab-circle-icon" :type="styles.icon" :color="styles.iconColor" size="32"
:class="{'uni-fab__plus--active': isShow && content.length > 0}"></uni-icons>
<!-- <view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view> -->
</view>
</view>
</template>
@ -106,16 +114,18 @@
color: '#3c3e49',
selectedColor: '#007AFF',
backgroundColor: '#fff',
buttonColor: '#007AFF'
buttonColor: '#007AFF',
iconColor: '#fff',
icon: 'plusempty'
}
}
},
computed: {
contentWidth(e) {
return (this.content.length + 1) * 55 + 10 + 'px'
return (this.content.length + 1) * 55 + 15 + 'px'
},
contentWidthMin() {
return 55 + 'px'
return '55px'
},
//
boxWidth() {
@ -151,12 +161,24 @@
},
horizontalRight() {
return this.getPosition(2, 'horizontal', 'right')
},
// nvue bottom
nvueBottom() {
const safeBottom = uni.getSystemInfoSync().windowBottom;
// #ifdef APP-NVUE
return 30 + safeBottom
// #endif
// #ifndef APP-NVUE
return 30
// #endif
}
},
watch: {
pattern(newValue, oldValue) {
//console.log(JSON.stringify(newValue))
this.styles = Object.assign({}, this.styles, newValue)
pattern: {
handler(val, oldVal) {
this.styles = Object.assign({}, this.styles, val)
},
deep: true
}
},
created() {
@ -185,6 +207,9 @@
* 按钮点击事件
*/
_onItemClick(index, item) {
if (!this.isShow) {
return
}
this.$emit('trigger', {
index,
item
@ -208,7 +233,9 @@
}
</script>
<style scoped>
<style lang="scss" >
$uni-shadow-base:0 1px 5px 2px rgba($color: #000000, $alpha: 0.3) !default;
.uni-fab {
position: fixed;
/* #ifndef APP-NVUE */
@ -217,6 +244,8 @@
justify-content: center;
align-items: center;
z-index: 10;
border-radius: 45px;
box-shadow: $uni-shadow-base;
}
.uni-cursor-point {
@ -230,43 +259,43 @@
}
.uni-fab--leftBottom {
left: 5px;
bottom: 20px;
left: 15px;
bottom: 30px;
/* #ifdef H5 */
left: calc(5px + var(--window-left));
bottom: calc(20px + var(--window-bottom));
left: calc(15px + var(--window-left));
bottom: calc(30px + var(--window-bottom));
/* #endif */
padding: 10px;
// padding: 10px;
}
.uni-fab--leftTop {
left: 5px;
left: 15px;
top: 30px;
/* #ifdef H5 */
left: calc(5px + var(--window-left));
left: calc(15px + var(--window-left));
top: calc(30px + var(--window-top));
/* #endif */
padding: 10px;
// padding: 10px;
}
.uni-fab--rightBottom {
right: 5px;
bottom: 20px;
right: 15px;
bottom: 30px;
/* #ifdef H5 */
right: calc(5px + var(--window-right));
bottom: calc(20px + var(--window-bottom));
right: calc(15px + var(--window-right));
bottom: calc(120px + var(--window-bottom));
/* #endif */
padding: 10px;
// padding: 10px;
}
.uni-fab--rightTop {
right: 5px;
right: 15px;
top: 30px;
/* #ifdef H5 */
right: calc(5px + var(--window-right));
right: calc(15px + var(--window-right));
top: calc(30px + var(--window-top));
/* #endif */
padding: 10px;
// padding: 10px;
}
.uni-fab__circle {
@ -279,8 +308,9 @@
width: 55px;
height: 55px;
background-color: #3c3e49;
border-radius: 55px;
border-radius: 45px;
z-index: 11;
// box-shadow: $uni-shadow-base;
}
.uni-fab__circle--leftBottom {
@ -294,10 +324,10 @@
.uni-fab__circle--leftTop {
left: 15px;
top: 40px;
top: 30px;
/* #ifdef H5 */
left: calc(15px + var(--window-left));
top: calc(40px + var(--window-top));
top: calc(30px + var(--window-top));
/* #endif */
}
@ -306,16 +336,16 @@
bottom: 30px;
/* #ifdef H5 */
right: calc(15px + var(--window-right));
bottom: calc(30px + var(--window-bottom));
bottom: calc(120px + var(--window-bottom));
/* #endif */
}
.uni-fab__circle--rightTop {
right: 15px;
top: 40px;
top: 30px;
/* #ifdef H5 */
right: calc(15px + var(--window-right));
top: calc(40px + var(--window-top));
top: calc(30px + var(--window-top));
/* #endif */
}
@ -339,26 +369,42 @@
font-weight: bold;
}
.fab-circle-v {
position: absolute;
width: 3px;
height: 31px;
left: 26px;
top: 12px;
background-color: white;
transform: rotate(0deg);
transition: transform 0.3s;
}
.fab-circle-h {
position: absolute;
width: 31px;
height: 3px;
left: 12px;
top: 26px;
background-color: white;
// .fab-circle-v {
// position: absolute;
// width: 2px;
// height: 24px;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// /* #ifndef APP-NVUE */
// margin: auto;
// /* #endif */
// background-color: white;
// transform: rotate(0deg);
// transition: transform 0.3s;
// }
// .fab-circle-h {
// position: absolute;
// width: 24px;
// height: 2px;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// /* #ifndef APP-NVUE */
// margin: auto;
// /* #endif */
// background-color: white;
// transform: rotate(0deg);
// transition: transform 0.3s;
// }
.fab-circle-icon {
transform: rotate(0deg);
transition: transform 0.3s;
font-weight: 200;
}
.uni-fab__plus--active {
@ -383,7 +429,7 @@
.uni-fab__content--other-platform {
border-width: 0px;
box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.2);
box-shadow: $uni-shadow-base;
}
.uni-fab__content--left {
@ -427,17 +473,19 @@
}
.uni-fab__item-image {
width: 25px;
height: 25px;
margin-bottom: 3px;
width: 20px;
height: 20px;
margin-bottom: 4px;
}
.uni-fab__item-text {
color: #FFFFFF;
font-size: 12px;
line-height: 12px;
margin-top: 2px;
}
.uni-fab__item--first {
width: 55px;
}
</style>
</style>

185
fe/PDA/components/uni-section/uni-section.vue

@ -1,30 +1,46 @@
<template>
<view class="uni-section" nvue>
<view v-if="type" class="uni-section__head">
<view :class="type" class="uni-section__head-tag" />
<view class="uni-section">
<view class="uni-section-header" @click="onClick">
<view class="uni-section-header__decoration" v-if="type" :class="type" />
<slot v-else name="decoration"></slot>
<view class="uni-section-header__content">
<text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text>
<text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text>
</view>
<view class="uni-section-header__slot-right">
<slot name="right"></slot>
</view>
</view>
<view class="uni-section__content">
<text :class="{'distraction':!subTitle}" class="uni-section__content-title">{{ title }}</text>
<text v-if="subTitle" class="uni-section__content-sub">{{ subTitle }}</text>
<view class="uni-section-content" :style="{padding: _padding}">
<slot />
</view>
<slot />
</view>
</template>
<script>
/**
* Section 标题栏
* @description 标题栏
* @property {String} type = [line|circle] 标题装饰类型
* @property {String} type = [line|circle|square] 标题装饰类型
* @value line 竖线
* @value circle 圆形
* @value square 正方形
* @property {String} title 主标题
* @property {String} titleFontSize 主标题字体大小
* @property {String} titleColor 主标题字体颜色
* @property {String} subTitle 副标题
* @property {String} subTitleFontSize 副标题字体大小
* @property {String} subTitleColor 副标题字体颜色
* @property {String} padding 默认插槽 padding
*/
export default {
name: 'UniSection',
emits: ['click'],
emits:['click'],
props: {
type: {
type: String,
@ -32,16 +48,43 @@
},
title: {
type: String,
required: true,
default: ''
},
titleFontSize: {
type: String,
default: '14px'
},
titleColor:{
type: String,
default: '#333'
},
subTitle: {
type: String,
default: ''
},
subTitleFontSize: {
type: String,
default: '12px'
},
subTitleColor: {
type: String,
default: '#999'
},
padding: {
type: [Boolean, String],
default: false
}
},
data() {
return {}
},
computed:{
_padding(){
if(typeof this.padding === 'string'){
return this.padding
}
return this.padding?'1px':''
}
},
watch: {
title(newVal) {
if (uni.report && newVal !== '') {
@ -49,77 +92,77 @@
}
}
},
methods: {
methods: {
onClick() {
this.$emit('click')
}
}
}
</script>
<style scoped>
<style lang="scss" >
$uni-primary: #2979ff !default;
.uni-section {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
margin-top: 10px;
flex-direction: row;
align-items: center;
padding: 0 10px;
height: 50px;
background-color: #f8f8f8;
/* #ifdef APP-NVUE */
/* #endif */
font-weight: normal;
}
background-color: #fff;
// background-color: #2979ff;
.uni-section-header {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
padding: 2px 1px;
font-weight: normal;
/* #ifndef APP-NVUE */
/* #endif */
.uni-section__head {
flex-direction: row;
justify-content: center;
align-items: center;
margin-right: 10px;
}
&__decoration{
margin-right: 6px;
background-color: $uni-primary;
&.line {
width: 4px;
height: 12px;
border-radius: 10px;
}
.line {
height: 15px;
background-color: #c0c0c0;
border-radius: 5px;
width: 3px;
}
&.circle {
width: 8px;
height: 8px;
border-top-right-radius: 50px;
border-top-left-radius: 50px;
border-bottom-left-radius: 50px;
border-bottom-right-radius: 50px;
}
.circle {
width: 8px;
height: 8px;
border-top-right-radius: 50px;
border-top-left-radius: 50px;
border-bottom-left-radius: 50px;
border-bottom-right-radius: 50px;
background-color: #c0c0c0;
}
&.square {
width: 8px;
height: 8px;
}
}
.uni-section__content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
flex: 1;
color: #333;
}
&__content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
flex: 1;
color: #333;
.uni-section__content-title {
font-size: 14px;
color: #333;
}
.distraction {
flex-direction: row;
align-items: center;
}
&-sub {
margin-top: 2px;
}
}
.distraction {
flex-direction: row;
align-items: center;
}
&__slot-right{
font-size: 14px;
}
}
.uni-section__content-sub {
font-size: 12px;
color: #999;
.uni-section-content{
font-size: 14px;
}
}
</style>
</style>

5
fe/PDA/components/uni-tag/uni-tag.vue

@ -116,8 +116,9 @@
/* #ifdef APP-NVUE */
align-self: flex-start;
/* #endif */
padding: 0px 16px;
line-height: 30px;
/* padding: 0px 16px; */
padding: 10rpx;
/* line-height: 40rpx; */
color: #333;
border-radius: 3px;
background-color: #f8f8f8;

249
fe/PDA/components/virtual-list-test-cell/virtual-list-test-cell.vue

@ -0,0 +1,249 @@
<!-- 这个文件是虚拟列表中的实际cell -->
<template>
<view class="item">
<uni-swipe-action>
<uni-swipe-action-item :right-options="options" :auto-close="false" @click="swipeClick($event,item)">
<view class="detail-content common_card">
<view class="choose_main">
<view class="ljh_box">
<view class="ljh_info">
<view class="tit_ljh">{{index+1+'.'+item.itemCode }}</view>
<view class="label_xm font_sm fr">{{ item.packingCode }}</view>
</view>
<view class="desc_card uni-flex space-between">
<view class="desc_ljh">
<view class="font_xs text_lightblue"> {{ item.itemName }}</view>
<view class="font_xs text_lightblue">{{ item.itemDesc1 }}
</view>
</view>
</view>
</view>
<view class="list_form">
<view>
<uni-table style="overflow-x: hidden; ">
<uni-tr>
<uni-th width="100"></uni-th>
<uni-th width="100" align="center">库存</uni-th>
<uni-th width="100" align="center">盘点</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="100">数量({{item.uom}})</uni-th>
<uni-th width="100" align="center">
<text class="text_black">{{item.inventoryQty}}</text>
</uni-th>
<uni-th width="100" align="center">
<view class="flex" style="align-items: center;justify-content: center;"
v-if="item.scaned && item.packingCode">
<text class="text_black">{{item.countQty}} </text>
<view class="photo_btn fr" @click="openEditCount(item)">
<text class="fl font_xs">修改</text>
</view>
</view>
<view class="flex" style=" align-items: center;justify-content: center;"
v-if="item.packingCode==''">
<text class="text_black">{{item.countQty}} </text>
<view class="photo_btn fr" @click="openEditCount(item)">
<text class="fl font_xs">修改</text>
</view>
</view>
<view class="" v-else-if="!item.scaned">
<text class="text_black">{{item.countQty}}</text>
</view>
</uni-th>
</uni-tr>
</uni-table>
</view>
</view>
<view style="margin:0 20rpx 20rpx;">
<view class="uni-flex uni-row bot_card">
<view class="bot_card_item">
<label class="icon_bg icon_bg_kw" style="text-align: center;">
<text
style=" display: block; color: white;text-align: center;font-size: 28rpx;"></text>
</label>
<text>{{ item.locationCode }}</text>
</view>
<view class="bot_card_item">
<label class="icon_bg icon_bg_pc">
<text
style=" display: block; color: white;text-align: center;font-size: 28rpx;"></text>
</label>
<text>{{item.lot}}</text>
</view>
<view class="bot_card_item" style="width: 25%;">
<view class="uni-flex" v-if="item.isNew ">
<!-- picker的index默认是0 -->
<picker picker @change="bindPickerChange($event,item)" :value="item.status-1"
:range="statusArray">
<view class="uni-flex " style="padding:5px 0px;">
<text class="state_point"
:class="statusStyle(item.status)">{{statusArray[item.status-1]}}</text>
<image class="icon_normal" src="@/static/icons_ui/icon_down.svg">
</image>
</view>
</picker>
</view>
<text v-else class="state_point" :class=" statusStyle(item.status)">
{{ statusColor(item.status )}}
</text>
</view>
</view>
</view>
</view>
<view class="uni-flex space-between" style="margin:0 20rpx 20rpx;"
v-if="item.scaned || item.packingCode==''">
<text class="font_xs"
style="padding: 5px 2px; text-overflow: ellipsis; overflow: hidden;">{{item.countDescription}}</text>
<view class="photo_btn fr" @click="openEditCountDesc(item)">
<text class="fl font_xs" style="width:65px;">盘点描述</text>
</view>
</view>
<view v-if="item.scaned" class="choose_marked_count"
style="background-color: #5FCB94; opacity: 0.65">
<view class="" style="background-color: #5FCB94; width: 200rpx;height: 300rpx;">
</view>
</view>
</view>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
</template>
<script>
import {
getInventoryStatusDesc,
getInventoryTypeStyle
} from '@/common/basic.js';
import {
getInventoryStatusArray
} from '@/common/array.js'
export default {
name: "virtual-list-test-cell",
props: {
item: null,
index: 0,
extraData: null
},
data() {
return {
type: '',
id: '',
datacontent: {},
details: [],
allDetails: [], //
currentItem: {},
editDescItem: {},
editCountItem: {},
scrollTop: 0,
old: {
scrollTop: 0
},
scanResult: {},
allCount: 0,
newCount: 0,
scanCount: 0,
options: [{
text: '移除',
style: {
backgroundColor: '#F56C6C'
}
}],
location: null,
topItem: '',
isShowScanPopup: false,
statusArray: [],
allStatusArray: [],
ipage: 1,
iSize: 20,
testList: [],
};
},
methods: {
titleClick(title) {
//extraData
//props使uni.$emituni.$on
// if (this.extraData.titleClickedCallback) {
// this.extraData.titleClickedCallback(title);
// }
},
openEditCount(item) {
this.$emit("openEditCount")
},
openEditCountDesc(item) {
this.$emit("openEditCountDesc")
},
openEditCountDesc(item) {
this.$emit("bindPickerChange")
},
statusColor(val) {
return getInventoryStatusDesc(val);
},
statusStyle(val) {
return getInventoryTypeStyle(val);
},
}
}
</script>
<style scoped>
.item {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
}
.item-content {
flex: 1;
margin-left: 20rpx;
}
.header {
background-color: red;
font-size: 24rpx;
text-align: center;
padding: 20rpx 0rpx;
color: white;
}
.item-image {
height: 150rpx;
width: 150rpx;
background-color: #eeeeee;
border-radius: 10rpx;
}
.item-title {
background-color: red;
color: white;
font-size: 26rpx;
border-radius: 5rpx;
padding: 5rpx 10rpx;
}
.item-detail {
margin-top: 10rpx;
border-radius: 10rpx;
font-size: 28rpx;
color: #aaaaaa;
word-break: break-all;
}
.item-line {
position: absolute;
bottom: 0rpx;
left: 0rpx;
height: 1px;
width: 100%;
background-color: #eeeeee;
}
</style>

41
fe/PDA/components/zp-public-virtual-cell/zp-public-virtual-cell.vue

@ -0,0 +1,41 @@
<!-- 当虚拟列表兼容模式渲染的时候列表中实际上渲染的是这个组件并且会把当前的itemindex和extraData(附加数据)通过props传给这个组件 -->
<!-- 如果有多个不同的虚拟列表它们会共用这个组件这时候可以通过extraData来区分不同的页面 -->
<template>
<view>
<!-- 数组qwq{{index}} -->
<!-- 这里的extraData.id在virtual-list-compatibility-demo设置的是test1 -->
<virtual-list-test-cell :item="item" :index="index" :extraData="extraData" @openEditCount="openEditCount" @openEditCountDesc="<!-- #ifdef APP -->
<!-- #endif -->openEditCountDesc"/>
</view>
</template>
<script>
export default {
name: "zp-public-virtual-cell",
props: {
item: null,
index: 0,
// extraData:extraDataz-paging
extraData: null
},
data() {
return {
};
},
methods: {
openEditCount(item) {
this.$emit("openEditCount")
},
openEditCountDesc(item) {
this.$emit("openEditCountDesc")
},
},
}
</script>
<style>
</style>

146
fe/PDA/main.js

@ -5,15 +5,26 @@ import request from './common/request.js'
import url from './common/config.js'
import modelConfig from './common/modelConfig.js'
import utils from './common/utils.js'
import uView from "./uni_modules/uview-ui";
import VueAxios from 'vue-axios';
import './router/index'; //引入拦截
// import './router/router.js';
import barcode from 'vue-barcode';
import {
RouterMount
} from "uni-simple-router";
// import message from "@/common/message";
import axios from 'axios';
let startApp = function() {
console.log('startApp', 'startApp')
uni.request({
url: './static/config.json'
url: `./static/config.json?t=${new Date().getTime()}`
}).then(res => {
//在配置中读url,company等信息
Vue.prototype.$dev_url = res[1].data.params.dev;
console.log("请求地址", Vue.prototype.$dev_url)
Vue.prototype.$companyCode = res[1].data.params.companyCode;
Vue.prototype.$warehouseCode = res[1].data.params.warehouseCode;
Vue.prototype.$putawayLocationTypes = res[1].data.params.putawayLocationTypes; //创建上架任务的库存类型
@ -26,85 +37,84 @@ let startApp = function() {
Vue.prototype.$purchaseReturnReason = res[1].data.params.purchaseReturnReason; //采购退货原因字典项
Vue.prototype.$returnBeforPutawayReason = res[1].data.params.returnBeforPutawayReason; //上架前退货原因字典项
Vue.prototype.$receiptCheckReason = res[1].data.params.receiptCheckReason; //采购收货不合格原因字典项
Vue.prototype.$configList = res[1].data.configList;
Vue.prototype.$returnWareHouseUrl= res[1].data.params.returnWareHouseUrl; //采购收货不合格原因字典项
initData()
getApp().globalData.text = res[1].data.params.version_update_url;
})
}
startApp()
import VueAxios from 'vue-axios';
import './router/index'; //引入拦截
// import './router/router.js';
import barcode from 'vue-barcode';
import {
RouterMount
} from "uni-simple-router";
Vue.use(barcode)
Vue.use(VueAxios, axios)
function initData() {
Vue.use(barcode)
Vue.use(VueAxios, axios)
Vue.use(uView);
Vue.prototype.$request = request
Vue.prototype.$url = url.url_config
Vue.prototype.modelConfig = modelConfig.maxPageSize
Vue.prototype.utils = utils;
Vue.prototype.$request = request
Vue.prototype.$url = url.url_config
Vue.prototype.modelConfig = modelConfig.maxPageSize
Vue.prototype.versionCode = modelConfig.version
Vue.prototype.utils = utils;
Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.prototype.ScanErrorAudio = function() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src ="../../static/video/error.wav";
music.play(); //执行播放
music.onEnded(() => {
//播放结束
music = null;
});
}
Vue.prototype.ScanErrorAudio = function() {
var music = null;
music = uni.createInnerAudioContext(); //创建播放器对象
music.src = "../../static/video/error.wav";
music.play(); //执行播放
music.onEnded(() => {
//播放结束
music = null;
});
}
// // 添加全局v-focus指令
// Vue.directive("focus", {
// inserted: function(el, {
// modifiers: {
// noKeyboard
// }
// }) {
// try {
// const tagName = el.tagName;
// console.log('el',el)
// console.log('tagName',tagName)
// if (tagName === "INPUT") {
// let child = el.children[0];
// if (child && child.tagName === "INPUT") {
// el = child;
// }
// }
// el.focus();
// // 不弹起软键盘
// if (noKeyboard) {
// el.setAttribute("readonly", "readonly");
// var timer = null;
// timer = setTimeout(() => {
// el.removeAttribute("readonly");
// clearTimeout(timer);
// }, 100);
// }
// } catch (error) {
// throw new Error(error);
// }
// }
// });
// // 添加全局v-focus指令
// Vue.directive("focus", {
// inserted: function(el, {
// modifiers: {
// noKeyboard
// }
// }) {
// try {
// const tagName = el.tagName;
// console.log('el',el)
// console.log('tagName',tagName)
// if (tagName === "INPUT") {
// let child = el.children[0];
// if (child && child.tagName === "INPUT") {
// el = child;
// }
// }
// el.focus();
// // 不弹起软键盘
// if (noKeyboard) {
// el.setAttribute("readonly", "readonly");
// var timer = null;
// timer = setTimeout(() => {
// el.removeAttribute("readonly");
// clearTimeout(timer);
// }, 100);
// }
// } catch (error) {
// throw new Error(error);
// }
// }
// });
App.mpType = 'app'
App.mpType = 'app'
//#ifdef H5
RouterMount(app, "#app");
//#endif
//#ifdef H5
RouterMount(app, "#app");
//#endif
const app = new Vue({
store,
...App
})
app.$mount()
const app = new Vue({
store,
...App
})
app.$mount()
}

6
fe/PDA/mycomponents/comItem/comBalanceItem.vue

@ -1,6 +1,6 @@
<template>
<view class="choose_main common_card">
<com-item-top :dataContent="dataContent"></com-item-top>
<com-item-top :dataContent="dataContent" :isEditCount="isEditCount"></com-item-top>
<com-erp-location :erpLocationCode="dataContent.locationErpCode"></com-erp-location>
<com-item-bottom :dataContent="dataContent"></com-item-bottom>
</view>
@ -26,6 +26,10 @@
type: Object,
default: {}
},
isEditCount: {
type: Boolean,
default: false
}
},
data() {
return {

2
fe/PDA/mycomponents/comItem/comBaseItem.vue

@ -1,5 +1,5 @@
<!-- 零件基础信息卡片包括:
零件名称描述数量和单位
ERP料名称描述数量和单位
箱码批次库位状态
可以通过属性控制库位和状态是否显示 -->
<template>

2
fe/PDA/mycomponents/comItem/comBottomItem.vue

@ -1,5 +1,5 @@
<!-- 零件基础信息卡片包括:
零件名称描述数量和单位
ERP料名称描述数量和单位
箱码批次库位状态
可以通过属性控制库位和状态是否显示 -->
<template>

14
fe/PDA/mycomponents/comItem/comItemBottom.vue

@ -2,17 +2,23 @@
<view class="uni-flex uni-row bot_card">
<!-- 库位 -->
<view class="bot_card_item">
<label class="icon_bg icon_bg_kw">
<image class="icon_normal" src="@/static/icons_ui/icon_kw.svg">
<!-- <text class="icon_bg icon_bg_kw" style="color: white;font-size: 28rpx ;padding: 8rpx; "></text> -->
<label class="icon_bg icon_bg_kw" >
<!-- 库位 -->
<text style="display: block; color: white; text-align: center;font-size: 28rpx; "></text>
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_kw.svg">
</image>
-->
</label>
<text>{{ dataContent.locationCode }}</text>
</view>
<!-- 批次 -->
<view class="bot_card_item">
<label class="icon_bg icon_bg_pc">
<image class="icon_normal" src="@/static/icons_ui/icon_pc.svg">
</image>
<text style=" display: block; color: white;text-align: center;font-size: 28rpx;"></text>
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_pc.svg">
</image> -->
</label>
<text >{{dataContent.lot}}</text>
</view>

38
fe/PDA/mycomponents/comItem/comItemCode.vue

@ -0,0 +1,38 @@
<template>
<view class="ljh_box">
<view class="tit_ljh">{{ itemData.itemCode }}</view>
<view class="ljh_left desc_ljh">
<view class="font_xs text_lightblue">{{ itemData.itemName }}</view>
<view class="font_xs text_lightblue">{{ itemData.itemDesc1 }}</view>
</view>
</view>
</template>
<script>
export default {
name: 'comBaseItem',
components: {},
props: {
itemData: {
type: Object,
default: {}
},
},
data() {
return {}
},
filters: {
},
created() {
},
methods: {
}
}
</script>
<style>
</style>

40
fe/PDA/mycomponents/comItem/comItemTop.vue

@ -1,5 +1,5 @@
<!-- 零件基础信息卡片包括:
零件名称描述数量和单位
ERP料名称描述数量和单位
箱码批次库位状态
可以通过属性控制库位和状态是否显示 -->
<template>
@ -13,9 +13,14 @@
<view class="text_lightblue font_xs">{{dataContent.itemName }}</view>
<view class="text_lightblue font_xs">{{dataContent.itemDesc1}}</view>
</view>
<view class="ljh_right">
<text class="tnum">{{dataContent.qty}}</text>
<view class="ljh_right uni-row uni-flex u-col-center" style="
align-items: center;">
<text class="tnum" v-if="!isEditCount">{{dataContent.qty}}</text>
<com-number-box v-if="isEditCount" ref="comNumberBox" v-model="dataContent.qty" :max="99999" :min="0"
style='width: 100px;' @change="qtyChanged($event)">
</com-number-box>
<text class="tunit">{{dataContent.uom}}</text>
</view>
</view>
</view>
@ -26,18 +31,26 @@
getInventoryTypeStyle,
getInventoryStatusDesc,
} from '@/common/basic.js';
import comNumberBox from '@/mycomponents/common/comNumberBox.vue';
export default {
name: 'comItemTop',
components: {},
components: {comNumberBox},
props: {
dataContent: {
type: Object,
default: {}
},
isEditCount: {
type: Boolean,
default: false
}
},
data() {
return {}
return {
}
},
filters: {
statusStyle: function(val) {
@ -51,7 +64,22 @@
},
methods: {
qtyChanged(value) {
if (value <= 0) {
uni.showToast({
title: "输入数量不能小于或等于0"
})
this.dataContent.qty = this.dataContent.recommendQty
this.$refs.comNumberBox.setValue(this.dataContent.qty);
}else if(value>this.dataContent.recommendQty){
uni.showToast({
title: "输入数量不能大于库存数量"+this.dataContent.recommendQty
})
this.dataContent.qty = this.dataContent.recommendQty
this.$refs.comNumberBox.setValue(this.dataContent.qty);
}
},
}
}
</script>

39
fe/PDA/mycomponents/comItem/comJobScanDetail.vue

@ -110,7 +110,8 @@
getJobStatuDesc,
showConfirmMsg,
compare,
goHome
goHome,
navigateBack
} from '@/common/basic.js';
import comMessage from '@/mycomponents/common/comMessage.vue'
@ -139,11 +140,11 @@
inputQty: "",
listfocus: false,
finshed: false,
received: false,
allCount: 0,
scanCount: 0,
isCheckAll: false,
selectedItem: {}
selectedItem: {},
jobStatus:""
};
},
onLoad(option) {
@ -152,7 +153,6 @@
//
if (option.jobStatus == 1) {
this.receive((callback => {
this.received = true;
this.getDetail();
}));
} else {
@ -164,18 +164,25 @@
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome();
}else if(e.index === 1){
window.location.reload();
}
},
//
onBackPress(e) {
//
if (this.received) {
//
cancelTakeReceiptJob(this.id)
.then(res => {})
.catch(err => {
this.showMessage(err.message);
});
if (e.from == 'backbutton') {
if (this.jobStatus == 2) {
//
cancelTakeReceiptJob(this.id).then(res => {
uni.navigateBack();
}).catch(error => {
uni.navigateBack();
})
} else {
uni.navigateBack();
}
return true;
}
},
filters: {
@ -212,6 +219,7 @@
getDetail() {
let that = this;
that.getJoDetail(callBack => {
that.jobStatus =that.receiptJob.jobStatus;
that.ispending = that.receiptJob.jobStatus === 2;
if (that.receiptJob.details != null) {
that.allCount = that.receiptJob.details.length;
@ -431,13 +439,6 @@
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
upper: function(e) {
// console.log(e)
},
lower: function(e) {
// console.log(e)
},
scroll: function(e) {
// console.log(e)

2
fe/PDA/mycomponents/comItem/comTopItem.vue

@ -1,5 +1,5 @@
<!-- 零件基础信息卡片包括:
零件名称描述数量和单位
ERP料名称描述数量和单位
箱码批次库位状态
可以通过属性控制库位和状态是否显示 -->
<template>

107
fe/PDA/mycomponents/comRequest/comKittingRequestItem.vue

@ -0,0 +1,107 @@
<!-- 收货任务详情 -->
<template>
<view class="device-detail" style="padding-bottom: 0 !important;">
<comRequestTopInfo :requestContent="dataContent"></comRequestTopInfo>
<view class="margin_xs_bottom">
<!-- <view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.injectionIssueRequestNumber}}</text>
<text>申请单{{dataContent.deliverRequestNumber}}</text>
</view> -->
<view class="label_order" v-if="dataContent.details.length>0">
<text>ERP料号 {{dataContent.details[0].itemCode}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>料号描述 {{dataContent.details[0].itemDesc1}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>位置码 {{dataContent.details[0].positionCode}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>目标库位 {{dataContent.details[0].toLocationCode}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>叫料数量 {{dataContent.details[0].notFinishQty}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>单位 {{dataContent.details[0].uom}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>标包数 {{dataContent.details[0].stdPackQty}}</text>
</view>
<view class="label_order">
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text> -->
<text>操作人 {{dataContent.worker}}</text>
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
<view class="" style="display: flex; justify-content: space-between; margin-bottom: 15rpx;">
<view class="">
</view>
<view class="">
<button type="primary" style="width: 140rpx; font-size: 32rpx; float: right;"
@click.stop="complete()">执行</button>
</view>
</view>
</view>
</template>
<script>
import {
dateFormat,
showConfirmMsg
} from '@/common/basic.js';
import comRequestTopInfo from '@/mycomponents/comRequest/comRequestTopInfo.vue'
export default {
components: {
comRequestTopInfo
},
props: {
dataContent: {
type: Object,
default: {}
}
},
filters: {
formatDate: function(val) {
return dateFormat(val)
}
},
data() {
return {
};
},
mounted() {
},
methods: {
complete(){
showConfirmMsg("是否确认执行?", callback => {
if (callback) {
this.$emit("handle",this.dataContent)
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

41
fe/PDA/mycomponents/comRequest/comRequestDetail.vue

@ -0,0 +1,41 @@
<!-- 收货任务详情 -->
<template>
<view class="device-detail" style="padding-bottom: 0 !important;">
<comRequestTopInfo :requestContent="dataContent"></comRequestTopInfo>
<view class="" style="font-size: 32rpx;">
发货单号 : {{dataContent.asnNumber}}
</view>
<view class="" style="font-size: 32rpx;">
供应商代码 : {{dataContent.supplierCode}}
</view>
</view>
</template>
<script>
import comRequestTopInfo from '@/mycomponents/comRequest/comRequestTopInfo.vue'
export default {
components: {
comRequestTopInfo
},
props: {
dataContent: {
type: Object,
default: {}
}
},
data() {
return {
};
},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
</style>

54
fe/PDA/mycomponents/comRequest/comRequestTopInfo.vue

@ -0,0 +1,54 @@
<!-- 收货任务详情 -->
<template>
<view class="task_num">
<view class="ljh_box nopad">
<view class="tit_ljh">
<text class="state-style" :class="requestContent.requestStatus | requestStatusStyle">
{{requestContent.requestStatus | requestStatusColor}}
</text>
<text class="text_bold" style="padding:4rpx 2rpx;">{{requestContent.number}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getRequestStatusDesc,
getRequestStatusStyle
} from '@/common/basic.js';
export default {
name: 'comJobScanDetail',
components: {
},
props: {
requestContent: {
type: Object,
default: {}
}
},
data() {
return {
};
},
filters: {
requestStatusStyle: function(val) {
return getRequestStatusStyle(val);
},
requestStatusColor: function(val) {
return getRequestStatusDesc(val);
},
},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
</style>

100
fe/PDA/mycomponents/comRequest/comThirdLocationRequestItem.vue

@ -0,0 +1,100 @@
<!-- 收货任务详情 -->
<template>
<view class="device-detail" style="padding-bottom: 0 !important;">
<comRequestTopInfo :requestContent="dataContent"></comRequestTopInfo>
<view class="margin_xs_bottom">
<!-- <view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.injectionIssueRequestNumber}}</text>
<text>申请单{{dataContent.deliverRequestNumber}}</text>
</view> -->
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text>
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
<view class="" style="display: flex; justify-content: space-between; margin-bottom: 15rpx;">
<view class="">
</view>
<view class="" style="float: right;" >
<view class="uni-flex uni-row" v-if="dataContent.requestStatus==1||dataContent.requestStatus==5||dataContent.requestStatus==9" >
<!-- 新增执行中 -->
<button type="primary" style="width: 140rpx; font-size: 32rpx; margin-right: 20rpx;"
@click.stop="cancle()">取消</button>
<!-- 部分完成可以完成 -->
<button type="primary" style="width: 140rpx; font-size: 32rpx; margin-right: 20rpx;"
@click.stop="finish()">完成</button>
</view>
</view>
</view>
</view>
</template>
<script>
import {
dateFormat,
showConfirmMsg
} from '@/common/basic.js';
import comRequestTopInfo from '@/mycomponents/comRequest/comRequestTopInfo.vue'
export default {
components: {
comRequestTopInfo
},
props: {
dataContent: {
type: Object,
default: {}
}
},
filters: {
formatDate: function(val) {
return dateFormat(val)
}
},
data() {
return {
};
},
mounted() {
},
methods: {
finish() {
showConfirmMsg("是否确认完成?", callback => {
if (callback) {
this.$emit("finish", this.dataContent)
}
})
},
cancle() {
showConfirmMsg("是否确认取消?", callback => {
if (callback) {
this.$emit("cancle", this.dataContent)
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

59
fe/PDA/mycomponents/comjob/comJobScanDetail.vue

@ -8,15 +8,24 @@
</text>
<text class="tit_ljh">{{ jobContent.number }}</text>
</view> -->
<view class="cell_box uni-flex uni-row margin_top">
<view class="cell_info">
<view class="text_lightblue">总数量</view>
<view class="cell_box uni-flex uni-row margin_top" >
<view class="cell_info" v-if="isShowAllCountHint">
<view class="text_lightblue">{{allCountHint}}</view>
<view class="text_black text_bold">{{ allCount}}</view>
</view>
<view class="cell_info">
<view class="cell_info" v-if="isShowScanHint">
<view class="text_lightblue">{{scanHint}}</view>
<view class="text_black text_bold">{{ scanCount}}</view>
</view>
<view class="cell_info" v-if="isShowOther">
<view class="text_lightblue">{{showOther}}</view>
<view class="text_black text_bold">{{calcCount(allCount,scanCount)}}</view>
</view>
<view class="cell_info" v-if="isShowShouRong">
<view class="text_lightblue">收容数</view>
<view class="text_black text_bold">{{shouRongCount}}</view>
</view>
</view>
</view>
</template>
@ -26,6 +35,9 @@
getJobStatuStyle,
getJobStatuDesc,
} from '@/common/basic.js';
import {
calc
} from '@/common/calc.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
@ -38,6 +50,7 @@
type: Object,
default: {}
},
allCount: {
type: Number,
default: 0
@ -46,10 +59,40 @@
type: Number,
default: 0
},
shouRongCount: {
type: Number,
default: null
},
allCountHint: {
type: String,
default: "总数量"
},
scanHint: {
type: String,
default: "已扫描"
},
isShowScanHint:{
type: Boolean,
default: true
},
isShowAllCountHint:{
type: Boolean,
default: true
},
isShowOther:{
type: Boolean,
default: false
},
showOther:{
type: String,
default: "未发数量"
},
isShowShouRong:{
type: Boolean,
default: false
}
},
data() {
return {
@ -63,12 +106,16 @@
},
statusColor: function(val) {
return getJobStatuDesc(val);
},
}
},
mounted() {
},
methods: {}
methods: {
calcCount(a,b){
return calc.sub(a,b)
}
}
}
</script>

109
fe/PDA/mycomponents/comjob/comJobUnScanDetail.vue

@ -0,0 +1,109 @@
<!-- 收货任务详情 -->
<template>
<view class="device-detail" style="padding-bottom: 0 !important;">
<com-job-top-info :jobContent="jobContent"></com-job-top-info>
<!-- <view class="ljh_box nopad">
<text class="state-style fl margin_xs_top" :class="jobContent.jobStatus | statusStyle">
{{ jobContent.jobStatus | statusColor }}
</text>
<text class="tit_ljh">{{ jobContent.number }}</text>
</view> -->
<view class="label_order">
<text >OA单号</text>
<text style="font-weight: bold; color:black" >{{jobContent.oaNumber}}</text>
</view>
<view class="label_order">
<text >ERP储位</text>
<text style="font-weight: bold; color:black" >{{jobContent.fromErpLocationCode}}</text>
</view>
<view class="label_order">
<text >ERP料号</text>
<text style="font-weight: bold; color:black" >{{jobContent.itemCode}}</text>
</view>
<view class="label_order">
<text >料号名称</text>
<text style="font-weight: bold; color:black" >{{jobContent.itemName}}</text>
</view>
<view class="label_order">
<text >料号描述</text>
<text style="font-weight: bold; color:black" >{{jobContent.itemDesc1}}</text>
</view>
<view class="label_order">
<text >正厂编码</text>
<text style="font-weight: bold; color:black" >{{jobContent.itemDesc2}}</text>
</view>
<view class="label_order">
<text >需求数量</text>
<text style="font-weight: bold; color:black" >{{jobContent.qty}}</text>
</view>
<view class="label_order">
<text >扫描数量</text>
<text style="font-weight: bold; color:black" >{{scanCount}}</text>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
} from '@/common/basic.js';
import {
calc
} from '@/common/calc.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: 'comJobScanDetail',
components: {
comJobTopInfo
},
props: {
jobContent: {
type: Object,
default: {}
},
allCount: {
type: Number,
default: 0
},
scanCount: {
type: Number,
default: 0
},
},
data() {
return {
};
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);
},
statusColor: function(val) {
return getJobStatuDesc(val);
}
},
mounted() {
},
methods: {
calcCount(a,b){
return calc.sub(a,b)
}
}
}
</script>
<style scoped lang="scss">
</style>

2
fe/PDA/mycomponents/common/comDyItemInfo.vue

@ -2,7 +2,7 @@
<template>
<view class="device-detail">
<view class="list-style">
<view class="text-color">料号:{{dataContent.itemCode}}</view>
<view class="text-color">ERP料号:{{dataContent.itemCode}}</view>
<view>物料名称:{{dataContent.itemName }}</view>
<view class="uni-flex">
<view style="-webkit-flex: 1;flex: 1;">箱码: {{dataContent.packingCode}}</view>

8
fe/PDA/mycomponents/common/comEasyInput.vue

@ -10,7 +10,8 @@
<view class="tab_info">
<view class="conbox">
<textarea v-model="content" trim="all" style="margin-left: 5px;" :focus="true"></textarea>
<textarea v-model="content" trim="all" style="margin-left: 5px;" :focus="true"
@keydown.enter="confirm"></textarea>
<!-- <uni-easyinput v-model="content" type="textarea" ></uni-easyinput> -->
</view>
<view class="uni-flex">
@ -36,6 +37,11 @@
},
created() {
},
mounted() {
if (this.$el.querySelector('textarea') != null) {
this.$el.querySelector('textarea').setAttribute('inputmode', 'none')
}
},
methods: {
openPopup(content) {

105
fe/PDA/mycomponents/common/comEasyInputCount.vue

@ -0,0 +1,105 @@
<template>
<view>
<uni-popup ref="popup">
<view class="popup_box">
<view class="pop_title">
数量
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="tab_info">
<view class="conbox">
<textarea v-model="content" trim="all" style="margin-left: 5px;" :focus="true" type="number"></textarea>
<!-- <uni-easyinput v-model="content" type="number" ></uni-easyinput> -->
</view>
<view class="uni-flex">
<button class="clean_scan_btn" @click="clear()">清空</button>
<button class="scan_btn" @click="confirm()">确定</button>
</view>
</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
import {
showErrorMsg,
} from '@/common/basic.js';
export default {
data() {
return {
content: '',
}
},
created() {
},
methods: {
openPopup(content) {
this.content = content;
this.$refs['popup'].open("bottom");
},
closeScanPopup(content) {
this.$refs.popup.close();
},
cancel() {
this.$refs['popup'].close();
},
confirm() {
if(!/^[0-9]+.?[0-9]*$/.test(this.content)){
uni.showToast({
title:"请输入数字"
})
this.content=""
return
}
this.$emit("confirm", this.content);
this.$refs['popup'].close();
},
clear() {
this.content = '';
},
maskClick() {
this.$emit("confirm", true);
}
}
}
</script>
<!-- background-color: #fff; -->
<style scoped lang="scss">
.center {
flex: auto;
display: flex;
flex-direction: column;
justify-content: center;
// align-items: center;
}
.flex-item {
width: 50%;
text-align: center;
}
.messageButton {
border-color: #F8F8F8;
}
.messagePopup {
background-color: #fff;
border-radius: 5px;
}
/deep/ .uni-input-input {
font-size: 20px;
height: 46px;
}
</style>

62
fe/PDA/mycomponents/common/comList.vue

@ -0,0 +1,62 @@
<template>
<view class="">
<uni-popup ref="popupItems" >
<scroll-view scroll-y="true" class="scroll" style="">
<view class="uni-flex uni-column">
<view class=" uni-center" style="margin: 15rpx;">
采购订单: {{poNumber}}
</view>
<view class="" style=" margin: 10rpx;background-color:#EBEEF0;width: 100%;"
v-for="(item, index) in showList" :key="index">
<view class="text-wrap">
({{index+1}})箱码 : {{item}}
</view>
</view>
</view>
</scroll-view>
</uni-popup>
</view>
</template>
<script>
export default {
components: {},
data() {
return {
showList: [],
poNumber: ''
};
},
//
props: {},
filters: {},
methods: {
openPopup(data, poNumber) {
this.showList = data;
this.poNumber = poNumber
this.$refs.popupItems.open('center');
}
}
}
</script>
<style lang="scss">
.text-wrap {
word-wrap: break-word;
word-break: break-all;
white-space: pre-line;
}
.scroll {
border-radius: 20rpx;
background-color: #fff;
height: 80vh;
width:80vw;
}
</style>

12
fe/PDA/mycomponents/common/comMessage.vue

@ -4,7 +4,7 @@
<view class="messagePopup center" @touchmove.stop.prevent="clear">
<scroll-view style="" scroll-y="true" @touchmove.stop.prevent="clear">
<view class="center" @touchmove.stop.prevent="clear" style="width: 230px;min-height: 100px; ">
<view style="margin-left: 15px;margin-right: 15px; ">
<view style="margin-left: 15px;margin-right: 15px;font-size: 36rpx; ">
{{content}}
</view>
</view>
@ -68,7 +68,7 @@
//
showScanMessage(content) {
this.openMessage(content, 'scan');
scanErrorAudio(); //
// scanErrorAudio(); //
},
//
@ -98,13 +98,17 @@
openMessage(content, type) {
this.content = content;
this.type = type;
this.$refs['popupMessage'].open("center");
this.$refs.popupMessage.open("center");
},
closeMessage() {
this.confirmResult = false;
clearInterval(this.timer) //timer
this.$refs['popupMessage'].close();
if(this.$refs.popupMessage){
this.$refs.popupMessage.close();
}
this.afterClose();
},

9
fe/PDA/mycomponents/common/comNumberBox.vue

@ -3,7 +3,7 @@
<view @click="_calcValue('minus')" class="uni-numbox__minus uni-cursor-point">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }">-</text>
</view>
<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number"
<input :disabled="inPutDisabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number"
v-model="inputValue" />
<view @click="_calcValue('plus')" class="uni-numbox__plus uni-cursor-point">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }">+</text>
@ -50,6 +50,10 @@
disabled: {
type: Boolean,
default: false
},
inPutDisabled: {
type: Boolean,
default: false
}
},
data() {
@ -138,6 +142,9 @@
},
_onFocus(event) {
this.$emit('focus', event)
},
setValue(value){
this.inputValue =value;
}
}
};

126
fe/PDA/mycomponents/coms/comDeliverBoardDetail.vue

@ -0,0 +1,126 @@
<template>
<view class="">
<view class="detail-content">
<view class="choose_main">
<view class="ljh_box">
<view class="tit_ljh">{{ dataContent.itemCode }}</view>
<view class="ljh_left desc_ljh">
<view class="font_xs text_lightblue">{{ dataContent.itemName }}</view>
<view class="font_xs text_lightblue">{{ dataContent.itemDesc1 }}</view>
</view>
</view>
扫描{{dataContent.scaned}}
<view class="list_form">
<view class="uni-container">
<uni-table style="overflow-x: hidden;">
<uni-tr>
<!-- <uni-th width="90"></uni-th>
<uni-th width="100" align="center">推荐</uni-th>
<uni-th width="100" align="center">实际</uni-th> -->
<uni-th width="50"></uni-th>
<uni-th width="120" align="center">推荐</uni-th>
<uni-th width="120" align="center">实际</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">器具码</uni-th>
<uni-th width="120" align="center">
<view class="text_packingCode">
{{ dataContent.recommendContainerCode }}
</view>
</uni-th>
<uni-th width="120" align="center">
<view v-if="dataContent.scaned" class="text_packingCode">
{{ dataContent.containerCode }}
</view>
</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">数量</text></uni-th>
<uni-th width="120" align="center">
<text class="text_black">{{dataContent.recommendQty}}({{dataContent.uom}})</text>
</uni-th>
<uni-th width="120" align="center">
<view v-if="dataContent.scaned"
style="display: flex;flex-direction: row;justify-content:center;align-items: center;">
<com-number-box ref="comNumberBox" v-model="dataContent.handledQty"
:max="99999" :min="0" style='width: 100px;'
@change="qtyChanged($event,dataContent)">
</com-number-box>
<text class="text_black">({{dataContent.uom}})</text>
</view>
</uni-th>
</uni-tr>
</uni-table>
</view>
</view>
</view>
<view class="choose_marked" v-if="dataContent.scaned">
<image src="@/static/image_marked.svg"></image>
</view>
<view class="fr" v-if="isShowPacking">
<button class="btn_single" hover-class="btn_single_after" @click="unPacking(dataContent)">拆箱</button>
</view>
</view>
<comUnPacking ref='comUnPacking'
@getvalue="getUnPackingCount" title="拆箱" @update="update">
</comUnPacking>
<com-message ref="comMessage" @afterCloseCommitMessage='closeCommitMessage()'
@afterCloseScanMessage='closeScanMessage'></com-message>
</view>
</template>
<script>
import comNumberBox from '@/mycomponents/common/comNumberBox.vue';
import comUnPacking from '@/mycomponents/coms/comUnPacking.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
export default {
name: "",
components: {
comNumberBox,
comUnPacking,
comMessage
},
data() {
return {};
},
//
props: {
dataContent: {
type: Object,
value: {}
},
isShowPacking: {
type: Boolean,
value: false
},
},
methods: {
update(newCode){
this.showMessage("生成新的箱码【"+newCode+"】请到PC端打印标签");
},
unPacking(item) {
this.$refs.comUnPacking.openPopup3(item,item.handledQty,item.recommendQty,false);
},
qtyChanged(value, item) {
if (value <= 0) {
this.showMessage('数量不能小于或等于0')
item.handledQty = item.defaultHandleQty
this.$refs.comNumberBox.setValue(item.handledQty);
} else if (value > item.defaultHandleQty) {
item.handledQty = item.defaultHandleQty
this.showMessage('数量不能大于库存数量:' + item.handledQty)
this.$refs.comNumberBox.setValue(item.handledQty);
}
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
}
}
</script>
<style>
</style>

2
fe/PDA/mycomponents/coms/comProductItem.vue

@ -1,5 +1,5 @@
<!-- 产品信息卡片包括:
零件名称描述数量和单位
ERP料名称描述数量和单位
箱码批次库位状态
可以通过属性控制库位和状态是否显示 -->
<template>

418
fe/PDA/mycomponents/coms/comUnPacking.vue

@ -0,0 +1,418 @@
<template>
<view>
<uni-popup ref="popupqtyedit" type="center">
<view class="uni-popup-view" style="display: flex;flex-direction: column; width: 500rpx;">
<view
style="display: flex; justify-content: center; align-items: center; padding: 10rpx;flex-direction: column;">
<view style="padding: 10rpx; font-weight: bold; font-size: 35rpx;">{{title}}</view>
<view class="" style="width: 100%; background-color: black;height: 2rpx;">
</view>
</view>
<view style="padding: 6rpx;margin-left: 15rpx;font-size: 32rpx;">箱码 : {{dataContent.recommendPackingCode}}</view>
<view style="padding: 6rpx;margin-left: 15rpx;font-size: 32rpx;">ERP料号 : {{dataContent.itemCode}}</view>
<view style="padding: 6rpx;margin-left: 15rpx;font-size: 32rpx;">名称 : {{dataContent.itemName}}</view>
<view style="padding: 6rpx;margin-left: 15rpx;font-size: 32rpx;">描述 : {{dataContent.itemDesc1}}</view>
<view style="display: flex; justify-content: center;align-items: center; padding: 6rpx;margin-top: 10rpx;">
<com-number-box v-model="value" :max="99999999" :min="0" style='margin: 0px 5px' />
<view class="">
({{dataContent.uom}})
</view>
</view>
<view class="uni-popup-button-box">
<button @click="cancle" class="save-button" style="width: 220rpx;margin-top: 10rpx;margin-right: 10rpx; " type="default">取消</button>
<button @click="submit" class="save-button" style="width: 220rpx;margin-top: 10rpx;margin-left: 10rpx; " type="primary">确定</button>
</view>
</view>
<comMessage ref="refMessage" ></comMessage>
</uni-popup>
</view>
</template>
<script>
import {
showErrorMsg,
getCurrDateTime
} from '@/common/basic.js';
import {
generateNewPacking,
unPacking,
getInventoryLabel,
unPackingByPurchase,
unPackingByIssue
} from '@/api/index.js';
import comMessage from '@/mycomponents/common/comMessage.vue'
import comNumberBox from '@/mycomponents/common/comNumberBox.vue'
export default {
components: {
comMessage,
comNumberBox
},
props: {
title: {
type: String,
default: ""
}
},
data() {
return {
value: 0,
defaultValue: 0,
vaildMaxValue: {
type: Boolean,
default: true
},
//0
allowZero: {
type: Boolean,
default: true
},
dataContent: {},
jobContent:{},
jobType:""
}
},
created() {
},
methods: {
openPopup(qty) {
this.value = qty;
this.defaultValue = qty;
this.$refs['popupqtyedit'].open("center");
},
//vaild,
openPopup1(qty, vaild) {
this.value = qty;
this.defaultValue = qty;
this.vaildMaxValue = vaild;
this.$refs['popupqtyedit'].open("center");
},
//vaildqty,
openPopup2(qty, vaildqty) {
this.value = qty;
this.defaultValue = vaildqty;
this.vaildMaxValue = true;
this.$refs['popupqtyedit'].open("center");
},
//qtyvaildqty , isZero0
openPopup3(jobContent,item, qty, vaildqty, isZero) {
this.jobContent =jobContent
this.dataContent = item
this.jobType =jobContent.jobType
this.value = qty;
this.defaultValue = vaildqty;
this.vaildMaxValue = true;
this.allowZero = isZero;
this.$refs['popupqtyedit'].open("center");
},
//qty0
openPopup4(qty, vaildMaxValue, isZero) {
this.value = qty;
this.defaultValue = qty;
this.vaildMaxValue = vaildMaxValue;
this.allowZero = isZero;
this.$refs['popupqtyedit'].open("center");
},
cancle(){
this.$refs['popupqtyedit'].close();
},
//
submit() {
let that = this;
if (that.value === "") {
this.showMessage('数量不能为空');
that.value = that.defaultValue;
} else {
let qty = Number(that.value);
if (that.vaildMaxValue) {
if (qty >= that.defaultValue) {
that.value = that.defaultValue;
this.showMessage('数量不能大于等于' + that.defaultValue);
} else {
if (!that.allowZero) //0
{
if (qty == 0) {
this.showMessage('数量不能为0');
that.value = that.value;
} else if (qty < 0) {
this.showMessage('数量不能小于0');
that.value = that.value;
} else {
this.getDataInfo(qty)
}
} else {
this.getDataInfo(qty)
}
}
} else {
if (!that.allowZero) //0
{
if (qty == 0) {
this.showMessage('数量不能为0');
that.value = that.defaultValue;
} else if (qty < 0) {
this.showMessage('数量不能小于0');
that.value = that.defaultValue;
} else {
this.getDataInfo(qty)
}
} else {
this.getDataInfo(qty)
}
}
}
},
callBack(qty){
var data =this.dataContent;
var params = {
fullBarcodeString:data.handledPackingCode ,
itemCode: data.itemCode,
itemName: data.itemName,
itemDesc1:data.itemDesc1 ,
itemDesc2: data.itemDesc2,
lot: data.handledLot,
supplierBatch: data.handledSupplierBatch,
arriveDate: data.handledArriveDate,
produceDate: data.handledProduceDate,
expireDate:data.handledExpireDate ,
stdPackQty: data.stdPackQty,
uom: data.uom,
qty: data.handledQty,
labelStatus: 1,
recommendLocationCode:data.handledToLocationCode,
locationErpCode: data.handledToLocationErpCode,
containerCode:data.handledContainerCode ,
supplierCode:this.jobContent.supplierCode ,
poNumber:data.poNumber,
rpNumber:this.jobContent.rpNumber ,
asnNumber: this.jobContent.asnNumber,
qLevel: "",
qualityFile:"" ,
prodLine: "",
team: "",
shift: "",
specifications:"" ,
supplierName: this.jobContent.supplierName,
supplierSimpleName: "",
supplierItemCode:"",
supplierItemName: "",
labelType: 1,
planArriveDate: this.jobContent.planArriveDate,
remark: data.remark
}
generateNewPacking(qty,params).then(res=>{
if(res){
var unPackingParams =this.setUnPackingParams(qty)
unPacking(unPackingParams).then(res=>{
this.$emit("getvalue", qty);
this.$refs['popupqtyedit'].close();
}).catch(error=>{
this.showMessage(error.message)
})
}else {
this.showMessage("生成新箱码失败")
}
}).catch(error=>{
this.showMessage(error.message)
})
},
async getDataInfo(qty){
try{
uni.showLoading({
title:"正在加载中...",
mask:true
})
var labelData = await getInventoryLabel(this.dataContent.recommendPackingCode)
if(!labelData){
uni.hideLoading()
this.showMessage("箱码["+this.dataContent.recommendPackingCode+"]在标签表中不存在")
return;
}
var newPackingCodeParam = this.setNewPackingCodeParam(labelData,qty)
var newPackingCodeData = await generateNewPacking(1,newPackingCodeParam);
var unPackingParams;
if(this.jobType==6){
var unPackingParamsIssue= this.setUnPackingParamsByIssue(labelData,qty,newPackingCodeData[0].code)
var unPackingData = await unPackingByIssue(unPackingParamsIssue,this.dataContent.number,this.dataContent.recommendPackingCode,this.dataContent.recommendQty,newPackingCodeData[0].code,qty)
}else{
var unPackingParamsPur= this.setUnPackingParamsByReceipt(labelData,qty,newPackingCodeData[0].code)
var unPackingData = await unPackingByPurchase(unPackingParamsPur,this.dataContent.number,this.dataContent.recommendPackingCode,this.dataContent.recommendQty,newPackingCodeData[0].code,qty)
}
uni.hideLoading()
// this.showMessage(""+newPackingCodeData[0].code+"PC")
this.$emit("update",newPackingCodeData[0].code)
this.cancle();
}catch(error){
uni.hideLoading()
this.showMessage(error)
}
},
setNewPackingCodeParam(labelData,qty){
var params =labelData;
params.qty = qty;
return params;
},
showMessage(message) {
this.$refs.refMessage.showMessage(message);
},
setUnPackingParamsByReceipt(labelData,qty,newPackingCode){
var data = labelData;
var itemData =this.dataContent;
var param = {
tenantId: data.tenantId,
remark: "",
extraProperties: {},
worker: localStorage.userName_CN ==""?localStorage.userName:localStorage.userName_CN,
activeDate: data.arriveDate,
confirmed: true,
confirmTime: getCurrDateTime(),
requestNumber:"",
jobNumber: "",
type: "SplitPacking",
useOnTheWayLocation: false,
details: [
{
remark: itemData.remark,
itemCode: itemData.itemCode,
itemName:itemData.itemName,
itemDesc1: itemData.itemDesc1,
itemDesc2:itemData.itemDesc2,
uom: itemData.uom,
qty: qty,
stdPackQty: itemData.stdPackQty,
fromPackingCode: itemData.recommendPackingCode,
fromContainerCode: itemData.recommendContainerCode,
fromLocationCode: itemData.recommendToLocationCode,
fromLocationArea: itemData.recommendToLocationArea,
fromLocationGroup: itemData.recommendToLocationGroup,
fromLocationErpCode: itemData.recommendToLocationErpCode,
fromWarehouseCode: itemData.recommendToWarehouseCode,
fromLot: itemData.recommendLot,
fromStatus: 1,
toPackingCode: newPackingCode,
toContainerCode: itemData.recommendContainerCode,
toLocationCode: itemData.recommendToLocationCode,
toLocationArea: itemData.recommendToLocationArea,
toLocationGroup: itemData.recommendToLocationGroup,
toLocationErpCode: itemData.recommendToLocationErpCode,
toWarehouseCode: itemData.recommendToWarehouseCode,
toLot: itemData.recommendLot,
toStatus: 1,
supplierBatch: data.supplierBatch,
arriveDate: data.arriveDate,
produceDate: data.produceDate,
expireDate: data.expireDate,
onTheWayLocationCode: "",
reason: ""
}
]
}
return param;
},
setUnPackingParamsByIssue(labelData,qty,newPackingCode){
var data = labelData;
var itemData =this.dataContent;
var param = {
tenantId: data.tenantId,
remark: "",
extraProperties: {},
worker: localStorage.userName_CN ==""?localStorage.userName:localStorage.userName_CN,
activeDate: data.arriveDate,
confirmed: true,
confirmTime: data.arriveDate,
requestNumber:"",
jobNumber: "",
type: "SplitPacking",
useOnTheWayLocation: false,
details: [
{
remark: itemData.remark,
itemCode: itemData.itemCode,
itemName:itemData.itemName,
itemDesc1: itemData.itemDesc1,
itemDesc2:itemData.itemDesc2,
uom: itemData.uom,
qty: qty,
stdPackQty: itemData.stdPackQty,
fromPackingCode: itemData.recommendPackingCode,
fromContainerCode: itemData.recommendContainerCode,
fromLocationCode: itemData.recommendFromLocationCode,
fromLocationArea: itemData.recommendFromLocationArea,
fromLocationGroup: itemData.recommendFromLocationGroup,
fromLocationErpCode: itemData.recommendFromLocationErpCode,
fromWarehouseCode: itemData.recommendFromWarehouseCode,
fromLot: itemData.recommendLot,
fromStatus: 2,
toPackingCode: newPackingCode,
toContainerCode: itemData.recommendContainerCode,
toLocationCode: itemData.recommendFromLocationCode,
toLocationArea: itemData.recommendFromLocationArea,
toLocationGroup: itemData.recommendFromLocationGroup,
toLocationErpCode: itemData.recommendFromLocationErpCode,
toWarehouseCode: itemData.recommendFromWarehouseCode,
toLot: itemData.recommendLot,
toStatus: 2,
supplierBatch: itemData.recommendSupplierBatch,
arriveDate: itemData.recommendArriveDate,
produceDate: itemData.recommendProduceDate,
expireDate: itemData.recommendExpireDate,
onTheWayLocationCode: "",
reason: ""
}
]
}
return param;
},
}
}
</script>
<!-- background-color: #fff; -->
<style scoped lang="scss">
.center {
flex: auto;
display: flex;
flex-direction: column;
justify-content: center;
// align-items: center;
}
.flex-item {
width: 50%;
text-align: center;
}
.messageButton {
border-color: #F8F8F8;
}
.messagePopup {
background-color: #fff;
border-radius: 5px;
}
/deep/ .uni-input-input {
font-size: 20px;
height: 46px;
}
</style>

276
fe/PDA/mycomponents/coms/inventory/comSplit.vue

@ -0,0 +1,276 @@
<template>
<view class="">
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
ERP料号代码 :
</view>
<uni-easyinput type="text" v-model="dataContent.itemCode" placeholder="请输入ERP料号代码" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
ERP料号名称 :
</view>
<uni-easyinput type="text" v-model="dataContent.itemName" placeholder="请输入ERP料号名称" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
ERP料号描述1 :
</view>
<uni-easyinput type="text" v-model="dataContent.itemDesc1" placeholder="请输入ERP料号描述1" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
ERP料号描述2 :
</view>
<uni-easyinput type="text" v-model="dataContent.itemDesc2" placeholder="请输入ERP料号描述2" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
库位代码 :
</view>
<uni-easyinput type="text" v-model="dataContent.locationCode" placeholder="请输入库位代码" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
ERP库位代码 :
</view>
<uni-easyinput type="text" v-model="dataContent.locationErpCode" placeholder="请输入ERP库位代码" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
批次 :
</view>
<uni-easyinput type="text" v-model="dataContent.lot" placeholder="请输入批次" />
</view> -->
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
<text style="color: red; font-weight: bold;">*</text>
数量 :
</view>
<uni-easyinput type="number" v-model="dataContent.qty" placeholder="请输入数量" />
</view>
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
单位 :
</view>
<uni-easyinput type="text" v-model="dataContent.uom" placeholder="请输入单位" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
标包 :
</view>
<uni-easyinput type="text" v-model="dataContent.stdPackQty" placeholder="请输入标包" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
库存状态 :
</view>
<u-select v-model="showStatus" :list="statusList" ></u-select>
<uni-combox :candidates="statusList" placeholder="请选择库存状态" v-model="dataContent.statusName"></uni-combox>
<!-- <uni-easyinput type="text" v-model="dataContent.inventoryStatuses" placeholder="请输入库存状态" /> -->
<!-- </view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
要货计划单号 :
</view>
<uni-easyinput type="text" v-model="dataContent.rpNumber" placeholder="请输入要货计划单号" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商发货单 :
</view>
<uni-easyinput type="text" v-model="dataContent.purchaseInfo_AsnNumber" placeholder="请输入供应商发货单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
到货通知单 :
</view>
<uni-easyinput type="text" v-model="dataContent.arrivalNoticNumber" placeholder="请输入到货通知单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
收货记录单 :
</view>
<uni-easyinput type="text" v-model="dataContent.receiptRecNumber" placeholder="请输入收货记录单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
采购订单 :
</view>
<uni-easyinput type="text" v-model="dataContent.purchaseInfo_PoNumber" placeholder="请输入采购订单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
上架单 :
</view>
<uni-easyinput type="text" v-model="dataContent.putOnShelfNumber" placeholder="请输入上架单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
任务单 :
</view>
<uni-easyinput type="text" v-model="dataContent.taskOrderNumber" placeholder="请输入任务单" />
</view> -->
<!-- <view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商代码 :
</view>
<uni-easyinput type="text" v-model="dataContent.supplierCode" placeholder="请输入供应商代码" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商名称 :
</view>
<uni-easyinput type="text" v-model="dataContent.supplierName" placeholder="请输入供应商名称" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商简称 :
</view>
<uni-easyinput type="text" v-model="dataContent.supplierSimpleName" placeholder="请输入供应商简称" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商物品代码 :
</view>
<uni-easyinput type="text" v-model="dataContent.supplierItemCode" placeholder="请输入供应商物品代码" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
供应商物品名称 :
</view>
<uni-easyinput type="text" v-model="dataContent.supplierItemName" placeholder="请输入供应商物品名称" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
备注 :
</view>
<uni-easyinput type="text" v-model="dataContent.remark" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
生产日期 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.produceDate" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
要求到货日期 :
</view>
<uni-datetime-picker type="datetime" return-type="timestamp" v-model="dataContent.planArriveDate"
placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
到货日期 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.arriveDate" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
过期时间 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.expireDate" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
生效日期 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.activeDate" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
创建时间 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.creationTime" placeholder="请输入备注" />
</view>
<view class="uni-flex uni-row item" style="align-items: center; ">
<view class="" style="font-size: 35rpx;">
上次修改时间 :
</view>
<uni-datetime-picker type="datetime" v-model="dataContent.lastModificationTime" placeholder="请输入备注" />
</view> -->
</view>
</template>
<script>
import {
getCurrDateTime,
getInventoryStatusList,
getInventoryStatusDesc
} from '@/common/basic.js';
export default {
data() {
return {
showStatus:false,
statusList:[],
};
},
//
props: {
dataContent: {
type: Object,
value: null
},
},
filters: {},
mounted() {
this.dataContent.statusName =this.inventoryStatusDesc(this.dataContent.inventoryStatuses)
this.statusList=getInventoryStatusList()
},
methods: {
getDate(value) {
return getCurrDateTime(value)
},
clickShowStatus(){
this.showStatus=true
},
inventoryStatusDesc(value){
return getInventoryStatusDesc(value)
},
selectStatus(item){
// this.statusName=item[0].label
this.dataContent.inventoryStatuses=item[0].value
}
}
}
</script>
<style>
.item {
margin: 5rpx;
padding: 5rpx;
font-size: 35rpx;
}
</style>

80
fe/PDA/mycomponents/coms/request/comInjectIssue.vue

@ -0,0 +1,80 @@
<!--发料任务卡片-->
<template>
<view class="device-detail">
<view class="card_task nopad">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
</view>
<view class="margin_xs_bottom">
<!-- <view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.injectionIssueRequestNumber}}</text>
<text>申请单{{dataContent.deliverRequestNumber}}</text>
</view> -->
<view class="label_order" v-if="dataContent.details.length>0">
<text>ERP料号 {{dataContent.details[0].itemCode}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>料号描述 {{dataContent.details[0].itemDesc1}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>收容数 {{dataContent.details[0].requestQty}} ({{dataContent.details[0].uom}})</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>目标库位 {{dataContent.details[0].recommendToLocationCode}}</text>
</view>
<view class="label_order">
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text> -->
<text>操作人 {{dataContent.worker}}</text>
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
dateFormat
} from '@/common/basic.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comDeliver",
components: {
comJobTopInfo
},
data() {
return {};
},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);
},
statusColor: function(val) {
return getJobStatuDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

2
fe/PDA/mycomponents/coms/return/comReturnDetail.vue

@ -4,7 +4,7 @@
<view class="choose_main">
<view class="ljh_box">
<view class="uni-flex uni-row space-between">
<view class="text-itemcode">零件:{{ returnDetail.itemCode }}</view>
<view class="text-itemcode">ERP料:{{ returnDetail.itemCode }}</view>
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_asn.svg"></image>

2
fe/PDA/mycomponents/coms/task/comCount.vue

@ -6,7 +6,7 @@
</view>
<view class="margin_xs_bottom">
<view class="count_list">
<text>{{datacontent.countStage|countStageDesc}}</text> |
<!-- <text>{{datacontent.countStage|countStageDesc}}</text> | -->
<!-- <text>{{datacontent.type | checkTypeDesc}}</text> | -->
<text>{{datacontent.countMethod |countMethodDesc}}</text> |
<text>{{datacontent.locationCode }}</text>

16
fe/PDA/mycomponents/coms/task/comCountScanDetail.vue

@ -16,16 +16,20 @@
<view class="text_lightblue">库位组</view>
<view class="text_black text_bold">{{ location.areaCode}}</view>
</view> -->
<view class="cell_info">
<!-- <view class="cell_info">
<view class="text_lightblue">总数量</view>
<view class="text_black text_bold">{{ allCount}}</view>
</view>
<view class="cell_info">
</view> -->
<!-- <view class="cell_info">
<view class="text_lightblue">新增</view>
<view class="text_black text_bold">{{ newCount}}</view>
</view> -->
<view class="cell_info">
<view class="text_lightblue">盘点次数</view>
<view class="text_black text_bold">{{ countOrder}}</view>
</view>
<view class="cell_info">
<view class="text_lightblue">盘点</view>
<view class="text_lightblue">已经盘点</view>
<view class="text_black text_bold">{{ scanCount}}</view>
</view>
</view>
@ -61,6 +65,10 @@
type: Number,
default: 0
},
countOrder: {
type: Number,
default: 0
},
location: {
type: Object,
default: {}

84
fe/PDA/mycomponents/coms/task/comDeliverBoard.vue

@ -0,0 +1,84 @@
<!--发料任务卡片-->
<template>
<view class="device-detail issuelist">
<!-- <view class="card_task issuecard nopad uni-flex space-between"> -->
<view class="card_task nopad space-between">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
<image v-if="dataContent.useOnTheWayLocation" class="tag_icon" src="@/static/icons_ui/icon_kw_use.svg">
</image>
</view>
<view class="margin_xs_bottom" style="clear: both;">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.materialRequestNumber}}</text>
<!-- <text>申请单{{dataContent.materialRequestNumber}}</text> -->
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_prod_line.svg"></image>
<text>{{dataContent.prodLine}}</text>
<!-- <text>生产线{{dataContent.prodLine}}</text> -->
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
getInventoryTypeStyle,
getInventoryStatusDesc,
dateFormat
} from '@/common/basic.js';
import comItemTop from '@/mycomponents/comItem/comItemTop.vue'
import comItemBottom from '@/mycomponents/comItem/comItemBottom.vue'
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comissue",
components: {
comItemTop,
comItemBottom,
comJobTopInfo
},
data() {
return {};
},
computed: {},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
jobStatusStyle: function(val) {
return getJobStatuStyle(val);
},
jobStatusColor: function(val) {
return getJobStatuDesc(val);
},
statusStyle: function(val) {
return getInventoryTypeStyle(val);
},
statusColor: function(val) {
return getInventoryStatusDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

80
fe/PDA/mycomponents/coms/task/comInjectIssue.vue

@ -0,0 +1,80 @@
<!--发料任务卡片-->
<template>
<view class="device-detail">
<view class="card_task nopad">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
</view>
<view class="margin_xs_bottom">
<!-- <view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.injectionIssueRequestNumber}}</text>
<text>申请单{{dataContent.deliverRequestNumber}}</text>
</view> -->
<view class="label_order" v-if="dataContent.details.length>0">
<text>ERP料号 {{dataContent.details[0].itemCode}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>料号描述 {{dataContent.details[0].itemDesc1}}</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>收容数 {{dataContent.details[0].requestQty}} ({{dataContent.details[0].uom}})</text>
</view>
<view class="label_order" v-if="dataContent.details.length>0">
<text>目标库位 {{dataContent.details[0].recommendToLocationCode}}</text>
</view>
<view class="label_order">
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text> -->
<text>操作人 {{dataContent.worker}}</text>
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
dateFormat
} from '@/common/basic.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comDeliver",
components: {
comJobTopInfo
},
data() {
return {};
},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);
},
statusColor: function(val) {
return getJobStatuDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

68
fe/PDA/mycomponents/coms/task/comInventyMove.vue

@ -0,0 +1,68 @@
<!--发料任务卡片-->
<template>
<view class="device-detail">
<view class="card_task nopad">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
</view>
<view class="margin_xs_bottom">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.requestNumber}}</text>
<!-- <text>申请单{{dataContent.deliverRequestNumber}}</text> -->
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text>
<!-- <text>客户{{dataContent.customerCode}}</text> -->
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
dateFormat
} from '@/common/basic.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comDeliver",
components: {
comJobTopInfo
},
data() {
return {};
},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);
},
statusColor: function(val) {
return getJobStatuDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

97
fe/PDA/mycomponents/coms/task/comKittingIssue.vue

@ -0,0 +1,97 @@
<!--发料任务卡片-->
<template>
<view class="device-detail issuelist">
<!-- <view class="card_task issuecard nopad uni-flex space-between"> -->
<view class="card_task nopad space-between">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
<image v-if="dataContent.useOnTheWayLocation" class="tag_icon" src="@/static/icons_ui/icon_kw_use.svg">
</image>
</view>
<view class="margin_xs_bottom" style="clear: both;">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.requestNumber}}</text>
<!-- <text>申请单{{dataContent.materialRequestNumber}}</text> -->
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text>
<!-- <text>客户{{dataContent.customerCode}}</text> -->
</view>
<view class="label_order" v-if="dataContent.enumIssueSendType==1">
<text>类型 : 按数量发料</text>
<!-- <text>申请单{{dataContent.materialRequestNumber}}</text> -->
</view>
<view class="label_order" v-else>
<text>类型 : 按箱发料</text>
<!-- <text>申请单{{dataContent.materialRequestNumber}}</text> -->
</view>
<!-- <view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_prod_line.svg"></image>
<text>{{dataContent.prodLine}}</text>
</view> -->
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
getInventoryTypeStyle,
getInventoryStatusDesc,
dateFormat
} from '@/common/basic.js';
import comItemTop from '@/mycomponents/comItem/comItemTop.vue'
import comItemBottom from '@/mycomponents/comItem/comItemBottom.vue'
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comissue",
components: {
comItemTop,
comItemBottom,
comJobTopInfo
},
data() {
return {};
},
computed: {},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
jobStatusStyle: function(val) {
return getJobStatuStyle(val);
},
jobStatusColor: function(val) {
return getJobStatuDesc(val);
},
statusStyle: function(val) {
return getInventoryTypeStyle(val);
},
statusColor: function(val) {
return getInventoryStatusDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

97
fe/PDA/mycomponents/coms/task/comProductCode.vue

@ -0,0 +1,97 @@
<template>
<view>
<view class="detail-list margin_top" >
<!-- 单选卡片 -->
<view class="detail-content">
<view class="choose_main">
<view class="ljh_box">
<view class="tit_ljh">{{ dataContent.itemCode }}</view>
<view class="ljh_left">
<view class="font_xs text_lightblue">{{ dataContent.itemName }}</view>
<view class="font_xs text_lightblue">{{ dataContent.itemDesc1 }}</view>
</view>
</view>
<view class="list_form hold_form">
<view class="uni-container">
<uni-table style="overflow-x: hidden;">
<uni-tr>
<uni-th width="70"></uni-th>
<uni-th width="120" align="center">推荐</uni-th>
<uni-th width="120" align="center">实际</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="70">数量</uni-th>
<uni-th width="120" align="center">
<view class="text_black">{{dataContent.recommendQty}}({{dataContent.uom}})</text>
</view>
</uni-th>
<!-- -->
<uni-th width="120" align="center">
<view class="" v-if="dataContent.scaned">
<com-number-box :ref="'comNumberBox_'+index" v-model="dataContent.handledQty"
:max="99999" :min="0" @change="qtyChanged($event,dataContent,index)">
</com-number-box>
</view>
<!-- <view v-if="dataContent.scaned" class="text_black">
{{dataContent.handledQty}}({{dataContent.uom}})
</view> -->
</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="70">来源库位</uni-th>
<uni-th width="120" align="center">
<view class="text_black">{{ dataContent.recommendFromLocationCode }}</view>
</uni-th>
<uni-th width="120" align="center">
<view class="">
<button v-if="dataContent.scaned" type="primary" size="mini"
style="margin-left: 30rpx;" @click="remove(dataContent,index)">移除</button>
</view>
</uni-th>
</uni-tr>
</uni-table>
</view>
</view>
</view>
{{dataContent.scaned}}
<view class="choose_marked" v-if="dataContent.scaned">
<image src="@/static/image_marked.svg"></image>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {}
},
props: {
dataContent: {
type: Object,
value: {}
}
},
watch:{
dataContent: {
handler(newName, oldName) {
this.dataContent=newName;
},
immediate: true,
deep: true
}
},
methods: {
remove() {
this.$emit("remove", dataContent)
}
}
}
</script>
<style>
</style>

2
fe/PDA/mycomponents/coms/task/comReceipt.vue

@ -12,7 +12,7 @@
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_avn.svg"></image>
<text>{{receiptItem.arriveNoticeNumber}}</text>
<text>{{receiptItem.purchaseReceiptRequestNumber}}</text>
<!-- <text>到货单{{receiptItem.arriveNoticeNumber}}</text> -->
</view>
</view>

6
fe/PDA/mycomponents/coms/task/comScanPutaway.vue

@ -128,7 +128,7 @@
if (this.active == 0) //
{
this.scanLocation(result.data.code);
} else //
} else //ERP
{
this.scanItem(result.data.code);
}
@ -212,7 +212,7 @@
},
async getItemInfo(itemCode) {
//
//ERP
let that = this;
let itemInfo = await getItemAsync(itemCode);
if (itemInfo != null) {} else {
@ -253,7 +253,7 @@
};
r.qty.uom = r.basicUom,
r.toLocationCode = that.locationCode;
r.worker = localStorage.userName
r.worker = localStorage.userName_CN ==""?localStorage.userName:localStorage.userName_CN
})
this.$emit('confirm', this.itemList, this.locationCode)
}

102
fe/PDA/mycomponents/coms/task/comThird.vue

@ -0,0 +1,102 @@
<!--发料任务卡片-->
<template>
<view class="device-detail">
<view class="card_task nopad">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
</view>
<view class="margin_xs_bottom">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image>
<text>{{dataContent.requestNumber}}</text>
<!-- <text>申请单{{dataContent.deliverRequestNumber}}</text> -->
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_customer.svg"></image>
<text>{{dataContent.worker}}</text>
<!-- <text>客户{{dataContent.customerCode}}</text> -->
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
</view>
<view class="" style="display: flex; justify-content: space-between; margin-bottom: 15rpx;">
<view class="">
</view>
<view class="" style="float: right;" v-if="dataContent.jobStatus==1||dataContent.jobStatus==2||dataContent.jobStatus==4">
<view class="uni-flex uni-row">
<button type="primary" style="width: 140rpx; font-size: 32rpx; margin-right: 20rpx;"
@click.stop="finish()">完成</button>
</view>
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
dateFormat,
showConfirmMsg
} from '@/common/basic.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comDeliver",
components: {
comJobTopInfo
},
data() {
return {};
},
//
props: {
dataContent: {
type: Object,
value: null
}
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);
},
statusColor: function(val) {
return getJobStatuDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
methods: {
finish() {
showConfirmMsg("是否确认完成?", callback => {
if (callback) {
this.$emit("finish", this.dataContent)
}
})
},
getScanCount(data){
var count = 0;
this.dataContent.details.forEach(res => {
count = count + res.handledQty
})
if (count == 0) {
return false
}
return true;
}
}
}
</script>
<style scoped lang="scss">
</style>

121
fe/PDA/mycomponents/coms/task/comUnProduce.vue

@ -0,0 +1,121 @@
<!--非生产领料任务卡片-->
<template>
<view class="device-detail issuelist">
<!-- <view class="card_task issuecard nopad uni-flex space-between"> -->
<view class="card_task nopad space-between">
<com-job-top-info :jobContent="dataContent"></com-job-top-info>
<image v-if="dataContent.useOnTheWayLocation" class="tag_icon" src="@/static/icons_ui/icon_kw_use.svg">
</image>
</view>
<view class="margin_xs_bottom" style="clear: both;">
<view class="label_order">
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image> -->
<text>OA单号</text>
<text style="font-weight: bold; color:black" >{{dataContent.oaNumber}}</text>
</view>
<view class="label_order">
<!-- <image class="icon_normal" src="@/static/icons_ui/icon_apply_num.svg"></image> -->
<text>单号</text>
<text style="font-weight: bold; color:black" v-if="fromType=='pick'">{{dataContent.unplannedIssueRequestNumber}}</text>
<!-- <text>申请单{{dataContent.materialRequestNumber}}</text> -->
<text style="font-weight: bold; color:black" v-else>{{dataContent.unplannedReceiptRequestNumber}}</text>
</view>
<view class="" >
<view class="label_order">
<text >ERP储位</text>
<text style="font-weight: bold; color:black" >{{dataContent.fromErpLocationCode}}</text>
</view>
<view class="label_order">
<text >ERP料号</text>
<text style="font-weight: bold; color:black" >{{dataContent.itemCode}}</text>
</view>
<view class="label_order">
<text >料号名称</text>
<text style="font-weight: bold; color:black" >{{dataContent.itemName}}</text>
</view>
<view class="label_order">
<text >料号描述</text>
<text style="font-weight: bold; color:black" >{{dataContent.itemDesc1}}</text>
</view>
<view class="label_order">
<text >正厂编码</text>
<text style="font-weight: bold; color:black" >{{dataContent.itemDesc2}}</text>
</view>
</view>
</view>
<view class="uni-flex uni-row receipt_bot">
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_date.svg">
</image>
<text
class="text_darkblue">{{dataContent.creationTime===null?'无':dataContent.creationTime| formatDate}}</text>
</view>
<view class="">
{{dataContent.worker}}
</view>
</view>
</view>
</template>
<script>
import {
getJobStatuStyle,
getJobStatuDesc,
getInventoryTypeStyle,
getInventoryStatusDesc,
dateFormat
} from '@/common/basic.js';
import comItemTop from '@/mycomponents/comItem/comItemTop.vue'
import comItemBottom from '@/mycomponents/comItem/comItemBottom.vue'
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
export default {
name: "comissue",
components: {
comItemTop,
comItemBottom,
comJobTopInfo
},
data() {
return {};
},
computed: {},
//
props: {
dataContent: {
type: Object,
value: null
},
fromType:{
type: String,
value: "pick"
}
},
filters: {
jobStatusStyle: function(val) {
return getJobStatuStyle(val);
},
jobStatusColor: function(val) {
return getJobStatuDesc(val);
},
statusStyle: function(val) {
return getInventoryTypeStyle(val);
},
statusColor: function(val) {
return getInventoryStatusDesc(val);
},
formatDate: function(val) {
return dateFormat(val)
}
},
}
</script>
<style scoped lang="scss">
</style>

2
fe/PDA/mycomponents/dycom/dyItemInfo.vue

@ -4,7 +4,7 @@
<view class="choose_main">
<view class="ljh_box">
<view class="uni-flex uni-row space-between">
<view class="text-itemcode">零件:{{ dataContent.itemCode }}</view>
<view class="text-itemcode">ERP料:{{ dataContent.itemCode }}</view>
</view>
<view class="uni-flex space-between">
<view class="ljh_left desc_ljh">

128
fe/PDA/mycomponents/popup/balanceList.vue

@ -0,0 +1,128 @@
<template>
<view class="container">
<u-popup ref="popup" v-model="showPopup" border-radius="15" style="width: 100%;" mode="center">
<view class="" style="align-items: center;background-color: #fff; border-radius: 15rpx; margin: 20rpx;">
<view class="uni-center popup-content"
style="font-weight: bold; font-size: 40rpx;padding-top: 20rpx; padding-bottom: 20rpx;">
{{title}}
</view>
<view class="" style="background-color: black; height: 1rpx; ">
</view>
<scroll-view scroll-y
style="background-color: #fff; align-items: center; border-radius: 10rpx; height: 600rpx; width: 100%">
<view class="uni-flex " style="flex-direction: column; " v-for="(item,index) in dataList" :key="index">
<view class="uni-flex " style="font-size: 38rpx; padding: 25rpx; flex-direction: row;" >
<view class="" style="font-size: 32rpx; font-weight: bold;">
({{index+1}}).
</view>
<view class="" style="font-size: 32rpx;">
<view class="" >
<text >ERP料号 :</text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemCode}}</text>
</view>
<view class="">
<text >物料名称 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemName}}</text>
</view>
<view class="">
<text >料号描述 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemDesc1}}</text>
</view>
<view class="" >
<text >箱码 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.packingCode}}</text>
</view>
<view class="" >
<text >批次 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.lot}}</text>
</view>
<view class="" >
<text >ERP储位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.locationErpCode}}</text>
</view>
<view class="" >
<text >库位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.locationCode}}</text>
</view>
<view class="">
<text >数量 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.qty}}</text>
</view>
<view class="">
<text >单位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.uom}}</text>
</view>
</view>
</view>
<u-line></u-line>
</view>
</scroll-view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ""
},
},
data() {
return {
dataList: [],
showPopup:false
}
},
methods: {
openScanPopup(list) {
this.dataList = list;
this.showPopup=true
},
closeScanPopup() {
this.showPopup=false
},
select(item) {
this.closeScanPopup();
this.$emit("select", item)
}
}
}
</script>
<style>
.popup_box {
justify-content: center;
width: 100%;
margin-right: 50rpx;
padding-right: 50rpx;
height: 500rpx;
margin: 0 auto;
}
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100%; /* 需要确保父容器有足够的高度 */
}
.popup-content {
display: flex;
justify-content: center;
align-items: center;
/* 其他样式 */
}
</style>

128
fe/PDA/mycomponents/popup/recommendList.vue

@ -0,0 +1,128 @@
<template>
<view class="container">
<u-popup ref="popup" v-model="showPopup" border-radius="15" style="width: 100%;" mode="center">
<view class="" style="align-items: center;background-color: #fff; border-radius: 15rpx; margin: 20rpx;">
<view class="uni-center popup-content"
style="font-weight: bold; font-size: 40rpx;padding-top: 20rpx; padding-bottom: 20rpx;">
{{title}}
</view>
<view class="" style="background-color: black; height: 1rpx; ">
</view>
<scroll-view scroll-y=""
style="background-color: #fff; align-items: center; border-radius: 10rpx; height: 600rpx; width: 100%">
<view class="uni-flex " style="flex-direction: column; " v-for="(item,index) in dataList" :key="index">
<view class="uni-flex " style="font-size: 38rpx; padding: 25rpx; flex-direction: row;" >
<view class="" style="font-size: 32rpx; font-weight: bold;">
({{index+1}}).
</view>
<view class="" style="font-size: 32rpx;">
<view class="" >
<text >ERP料号 :</text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemCode}}</text>
</view>
<view class="">
<text >物料名称 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemName}}</text>
</view>
<view class="">
<text >料号描述 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.itemDesc1}}</text>
</view>
<view class="" v-if="item.recommendPackingCode">
<text >箱码 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.recommendPackingCode}}</text>
</view>
<view class="" v-if="item.recommendLot">
<text >批次 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.recommendLot}}</text>
</view>
<view class="" >
<text >ERP储位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.recommendFromLocationErpCode}}</text>
</view>
<view class="" >
<text >库位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.recommendFromLocationCode}}</text>
</view>
<view class="">
<text >数量 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.recommendQty}}</text>
</view>
<view class="">
<text >单位 : </text>
<text style="font-size: 32rpx; font-weight: bold;">{{item.uom}}</text>
</view>
</view>
</view>
<u-line></u-line>
</view>
</scroll-view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ""
},
},
data() {
return {
dataList: [],
showPopup:false
}
},
methods: {
openScanPopup(list) {
this.dataList = list;
this.showPopup=true
},
closeScanPopup() {
this.showPopup=false
},
select(item) {
this.closeScanPopup();
this.$emit("select", item)
}
}
}
</script>
<style>
.popup_box {
justify-content: center;
width: 100%;
margin-right: 50rpx;
padding-right: 50rpx;
height: 500rpx;
margin: 0 auto;
}
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100%; /* 需要确保父容器有足够的高度 */
}
.popup-content {
display: flex;
justify-content: center;
align-items: center;
/* 其他样式 */
}
</style>

123
fe/PDA/mycomponents/popup/selectClickList.vue

@ -0,0 +1,123 @@
<template>
<view class="container">
<u-popup ref="popup" v-model="showPopup" border-radius="15" style="width: 100%;" mode="center">
<view class="" style="align-items: center;background-color: #fff; border-radius: 15rpx; margin: 20rpx;">
<view class="uni-center popup-content"
style="font-weight: bold; font-size: 40rpx;padding-top: 20rpx; padding-bottom: 20rpx;">
{{title}}
</view>
<view class="" style="background-color: black; height: 1rpx; ">
</view>
<scroll-view scroll-y=""
style="background-color: #fff; align-items: center; border-radius: 10rpx; height: 600rpx; width: 100%">
<view class="uni-flex " style="flex-direction: column; " v-for="(item,index) in dataList" :key="index">
<view class="uni-flex " style="font-size: 38rpx; padding: 25rpx; flex-direction: row;" >
<view class="" style="font-size: 32rpx; font-weight: bold;">
({{index+1}}).
</view>
<view class="" style="font-size: 32rpx;">
<view class="" >
<text style="font-size: 32rpx; font-weight: bold;">ERP料号 :</text>
{{item.itemCode}}
</view>
<view class="">
<text style="font-size: 32rpx; font-weight: bold;">物料名称 : </text>
{{item.itemName}}
</view>
<view class="">
<text style="font-size: 32rpx; font-weight: bold;">料号描述 : </text>
{{item.itemDesc1}}
</view>
<view class="" v-if="item.packingCode">
<text style="font-size: 32rpx; font-weight: bold;"> 箱码 : </text>
{{item.packingCode}}
</view>
<view class="" v-if="item.lot">
<text style="font-size: 32rpx; font-weight: bold;">批次 : </text>
{{item.lot}}
</view>
<view class="" >
<text style="font-size: 32rpx; font-weight: bold;">库位 : </text>
{{item.locationCode}}
</view>
<view class="">
<text style="font-size: 32rpx; font-weight: bold;">数量 : </text>
{{item.qty}}
</view>
<view class="">
<text style="font-size: 32rpx; font-weight: bold;">单位 : </text>
{{item.uom}}
</view>
</view>
</view>
<u-line></u-line>
</view>
</scroll-view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ""
},
},
data() {
return {
dataList: [],
showPopup:false
}
},
methods: {
openScanPopup(list) {
this.dataList = list;
this.showPopup=true
},
closeScanPopup() {
this.showPopup=false
},
select(item) {
this.closeScanPopup();
this.$emit("select", item)
}
}
}
</script>
<style>
.popup_box {
justify-content: center;
width: 100%;
margin-right: 50rpx;
padding-right: 50rpx;
height: 500rpx;
margin: 0 auto;
}
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100%; /* 需要确保父容器有足够的高度 */
}
.popup-content {
display: flex;
justify-content: center;
align-items: center;
/* 其他样式 */
}
</style>

24
fe/PDA/mycomponents/return/comReturn.vue

@ -1,7 +1,10 @@
<!--收货任务卡片-->
<template>
<view class="device-detail">
<view class="card_task nopad">
<view v-if="isRequest" class="card_task nopad">
<comRequestTopInfo :requestContent="returnItem"></comRequestTopInfo>
</view>
<view v-else class="card_task nopad">
<com-job-top-info :jobContent="returnItem"></com-job-top-info>
</view>
@ -24,6 +27,9 @@
<text
class="text_darkblue">{{returnItem.creationTime===null?'无':returnItem.creationTime| formatDate}}</text>
</view>
<view class="">
{{returnItem.worker}}
</view>
</view>
</view>
@ -36,17 +42,29 @@
dateFormat
} from '@/common/basic.js';
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
import comRequestTopInfo from '@/mycomponents/comRequest/comRequestTopInfo.vue'
export default {
name: "comReturn",
components: {
comJobTopInfo
comJobTopInfo,
comRequestTopInfo
},
data() {
return {
};
},
props: ['returnItem'],
props: {
returnItem: {
type: Object,
value: null
},
isRequest:{
type:Boolean,
value:false
}
},
filters: {
statusStyle: function(val) {
return getJobStatuStyle(val);

2
fe/PDA/mycomponents/return/comReturnDetail.vue

@ -4,7 +4,7 @@
<view class="choose_main">
<view class="ljh_box">
<view class="uni-flex uni-row space-between">
<view class="text-itemcode">零件:{{ returnDetail.itemCode }}</view>
<view class="text-itemcode">ERP料:{{ returnDetail.itemCode }}</view>
</view>
<view class="label_order">
<image class="icon_normal" src="@/static/icons_ui/icon_asn.svg"></image>

2
fe/PDA/mycomponents/scan/comScanCreateTp.vue

@ -139,7 +139,7 @@
if (this.active == 0) //
{
this.scanContainer(result);
} else //
} else //ERP
{
this.scanPack(result);
}

2
fe/PDA/mycomponents/scan/comScanDeliverFg.vue

@ -157,7 +157,7 @@
let that = this;
if (result.data != null) {
that.scanData = result.data;
//++
//ERP++
let datas = that.itemList.filter(function(r) {
if (r.itemCode === result.data.itemCode &&
r.lot === result.data.lot &&

2
fe/PDA/mycomponents/scan/comScanDeliverTf.vue

@ -146,7 +146,7 @@
let that = this;
if (result.data != null) {
that.scanData = result.data;
//++
//ERP++
let datas = that.itemList.filter(r => {
return r.itemCode === result.data.itemCode &&
r.lot === result.data.lot &&

2
fe/PDA/mycomponents/scan/comScanHold.vue

@ -143,7 +143,7 @@
};
if (result.data.itemCode == null || result.data.itemCode == undefined) {
this.showMessage('未解析到零件号信息');
this.showMessage('未解析到ERP料号信息');
return;
}
that.scanResult = result;

2
fe/PDA/mycomponents/scan/comScanPutaway.vue

@ -133,7 +133,7 @@
if (this.active == 0) //
{
this.scanLocation(result.data.code);
} else //
} else //ERP
{
this.scanItem(result);
}

10
fe/PDA/mycomponents/scan/comScanReplen.vue

@ -119,7 +119,7 @@
if (this.active == 0) //
{
this.scanProdLine(result);
} else //
} else //ERP
{
this.scanItem(result);
}
@ -159,7 +159,7 @@
this.scanPlaceholder = '扫描零件';
},
//
//ERP
scanItem(result) {
let itemCode = '';
if (result.data.scanType === 'qrcode') {
@ -169,7 +169,7 @@
}
if (itemCode === null || itemCode === '') {
this.showMessage('未解析到零件号');
this.showMessage('未解析到ERP料号');
return;
} else {
let that = this;
@ -190,7 +190,7 @@
},
async getItemInfo(itemCode) {
//
//ERP
let that = this;
uni.showLoading({
title: '加载中',
@ -264,7 +264,7 @@
};
r.qty.uom = r.basicUom,
r.toLocationCode = that.locationCode;
r.worker = localStorage.userName
r.worker = localStorage.userName_CN ==""?localStorage.userName:localStorage.userName_CN
})
this.closeScanPopup();
this.$emit('confirm', this.prodLine, this.itemList)

2
fe/PDA/mycomponents/scan/comScanSemiPutaway.vue

@ -300,7 +300,7 @@
let balanceRes = await getBalancesByLocationAndItemAsync(params);
if (balanceRes.length == 0) {
that.showMessage('按库位和零件号[' + that.fromLocation.code + ',' + label.itemCode + ']未查找到库存信息');
that.showMessage('按库位和ERP料号[' + that.fromLocation.code + ',' + label.itemCode + ']未查找到库存信息');
} else {
let balanceItem = balanceRes[0];
let item = {

2
fe/PDA/mycomponents/scan/comScanUnpick.vue

@ -109,7 +109,7 @@
if (this.active == 0) //
{
this.scanContainer(result);
} else //
} else //ERP
{
this.scanPack(result);
}

2
fe/PDA/mycomponents/wincom/winCollapseLocation.vue

@ -1,7 +1,7 @@
<template>
<uni-collapse>
<!-- :open="true" -->
<uni-collapse-item :show-animation="true" :title="scanTitle" :open="true">
<uni-collapse-item :show-animation="true" :title="scanTitle" :open="false">
<view class="content">
<!-- <view class="tit_bot_box">扫描目标库位</view> -->
<uni-easyinput ref='scanInput' v-model="locationCode" :focus="inputFocus" @confirm="getLocation"

4
fe/PDA/mycomponents/wincom/winComScan.vue

@ -2,8 +2,8 @@
<template>
<page-meta root-font-size="18px"></page-meta>
<view>
<view class="conbox">
<textarea v-model="scanMsg" trim="all" maxlength="1000" style="margin-left: 5px;" :focus="boxfocus"
<view class="conbox" >
<textarea v-model="scanMsg" trim="all" maxlength="1000" style="margin-left: 5px;width: 100%;" :focus="boxfocus"
:placeholder="placeholderValue" :auto-focus='true' @keydown.enter="handelScanMsg" @focus="getfocus"
@blur="losefocus"></textarea>
<!-- <input v-model="scanMsg" type="search" @keydown.enter="doSearch" style="{height:100px}"/> -->

11
fe/PDA/mycomponents/wincom/winScanButton.vue

@ -1,12 +1,18 @@
<template>
<view class="scan_float" @click="goScan('bottom')">
<image src="@/static/icons_ui/icon_scan_white.svg"></image>
<view>扫描</view>
<view>{{title}}</view>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
default: "扫描"
}
},
data() {
return {
}
@ -23,4 +29,7 @@
</script>
<style>
.scan_float{
opacity: 0.4;
}
</style>

58
fe/PDA/mycomponents/wincom/winScanButtonLeft.vue

@ -0,0 +1,58 @@
<template>
<view class="scan_float_top" @click="goScan('bottom')">
<image src="@/static/icons_ui/icon_scan_white.svg"></image>
<view >{{title}}</view>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
value: "扫描"
}
},
data() {
return {
}
},
created() {
},
methods: {
goScan(content) {
this.$emit("goScan", '');
}
}
}
</script>
<style>
.scan_float_top{
opacity: 0.4;
position: fixed;
z-index: 11;
left: 20rpx;
bottom: 25%;
width: 110rpx;
height: 110rpx;
color: #000;
background-color: #5A7CF3;
border-radius: 50%;
text-align: center;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
}
.scan_float_top image {
width: 40rpx;
height: 40rpx;
margin-top: 10rpx;
}
.scan_float_top view {
color: #fff;
font-size: .725rem;
margin-top: -8rpx;
}
</style>

58
fe/PDA/mycomponents/wincom/winScanButtonTop.vue

@ -0,0 +1,58 @@
<template>
<view class="scan_float_top" @click="goScan('bottom')">
<image src="@/static/icons_ui/icon_scan_white.svg"></image>
<view >{{title}}</view>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
value: "扫描"
}
},
data() {
return {
}
},
created() {
},
methods: {
goScan(content) {
this.$emit("goScan", '');
}
}
}
</script>
<style>
.scan_float_top{
opacity: 0.4;
position: fixed;
z-index: 11;
right: 20rpx;
bottom: 35%;
width: 110rpx;
height: 110rpx;
color: #000;
background-color: #5A7CF3;
border-radius: 50%;
text-align: center;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
}
.scan_float_top image {
width: 40rpx;
height: 40rpx;
margin-top: 10rpx;
}
.scan_float_top view {
color: #fff;
font-size: .725rem;
margin-top: -8rpx;
}
</style>

58
fe/PDA/mycomponents/wincom/winScanButtonbottom.vue

@ -0,0 +1,58 @@
<template>
<view class="scan_float_top" @click="goScan('bottom')">
<image src="@/static/icons_ui/icon_scan_white.svg"></image>
<view >{{title}}</view>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
value: "扫描"
}
},
data() {
return {
}
},
created() {
},
methods: {
goScan(content) {
this.$emit("goScan", '');
}
}
}
</script>
<style>
.scan_float_top{
opacity: 0.4;
position: fixed;
z-index: 11;
right: 20rpx;
bottom: 15%;
width: 110rpx;
height: 110rpx;
color: #000;
background-color: #5A7CF3;
border-radius: 50%;
text-align: center;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
}
.scan_float_top image {
width: 40rpx;
height: 40rpx;
margin-top: 10rpx;
}
.scan_float_top view {
color: #fff;
font-size: .725rem;
margin-top: -8rpx;
}
</style>

22
fe/PDA/mycomponents/wincom/winScanByCode.vue

@ -2,13 +2,13 @@
<uni-popup ref="popup" @change="change">
<view class="popup_box">
<view class="pop_title">
扫描信息
扫描{{title}}
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="uni-flex uni-row">
<view class="tab_tit tab_tit_active">{{title}}</view>
</view>
<!-- <view class="uni-flex uni-row">
<view class="tab_tit tab_tit_active">扫描{{title}}</view>
</view> -->
<view class="tab_info">
<win-com-scan ref="scan" @getScanResult="getScanResult" :placeholder='title' :clearResult="false">
</win-com-scan>
@ -55,9 +55,19 @@
},
getfocus() {
if (this.isShow) {
this.$refs.scan.getfocus()
if(this.$refs.scan){
this.$refs.scan.getfocus()
}
}
},
losefocus() {
if(this.$refs.scan){
this.$refs.scan.losefocus()
}
},
scanClick() {
this.$refs.scan.handelScanMsg();
},
@ -84,4 +94,4 @@
</script>
<style>
</style>
</style>

170
fe/PDA/mycomponents/wincom/winScanByContainer.vue

@ -0,0 +1,170 @@
<template>
<view>
<uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()">
<view class="popup_box">
<view class="pop_title">
扫描器具码
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="tab_info">
<win-com-scan ref="comscan" @getScanResult="getScanResult" placeholder="器具码"
:clearResult="true"></win-com-scan>
<view class="uni-flex">
<button class="clean_scan_btn" @click="cancelClick()">清空</button>
<button class="scan_btn" @click="scanClick()">扫描</button>
</view>
</view>
</view>
</view>
</uni-popup>
<com-message ref="comMessage" @afterClose="getfocus"></com-message>
</view>
</template>
<script>
import winComScan from '@/mycomponents/wincom/winComScan.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import {
getContainerCodeInfo
} from '@/api/index.js';
export default {
name: 'winScanByPack',
components: {
winComScan,
comMessage
},
props: {
title: {
type: String,
default: ''
},
},
data() {
return {
scanResult: {},
show: false,
}
},
created() {
},
methods: {
openScanPopup(content) {
this.$refs.popup.open('bottom');
},
closeScanPopup(content) {
this.$refs.popup.close();
this.$emit("close", '');
},
scanClick() {
this.$refs.comscan.handelScanMsg();
},
cancelClick() {
this.$refs.comscan.clearScanValue();
},
getScanResult(result) {
console.log("扫描",result.data.code)
if (result != null) {
if(result.data.code[0].toUpperCase()!="Q"){
this.showMessage("标签格式不正确 : "+result.data.code)
return;
}
// uni.showLoading({
// title: '...',
// mask: true
// })
// getContainerCodeInfo(code).then(res=>{
// uni.hideLoading();
//this.scanResult=res.data
// }).catch(error=>{
// uni.hideLoading();
// this.showMessage(error.message)
// })
var data =
{
containerCode: "C19",
partCode: "TMDLYA0AFM6A",
partName: "P000000000000015",
partDesc: "MY前保总成件售后件(冲孔)",
basicUom: "PC",
locationCode: "W",
locationName: "原物料库位",
stdPackQty: 100,
remark: null,
tenantId: null,
concurrencyStamp: "b3f2cf7ba3e14166bb97dac768d91741",
lastModificationTime: null,
lastModifierId: null,
creationTime: "2024-02-28T14:47:08.6878607",
creatorId: null,
qty:0,
id: "4c40f72b-a86d-54be-aed2-3a1100a46436"
}
this.scanResult = data;
this.callBack()
// this.closeScanPopup()
}
},
getLabelResult(label) {
let labelResult = {
sucess: true,
message: "",
data: label,
// data: {
// isPack: true,
// // scanType: null,
// itemCode: label.itemCode,
// itemName: label.itemName,
// itemDesc1: label.itemDesc1,
// itemDesc2: label.itemDesc2,
// lot: label.lot,
// qty: label.qty,
// uom: label.uom,
// poNumber: label.poNumber,
// // asn: null,
// packingCode: label.code,
// supplierBatch: label.supplierBatch,
// // order: null,
// // poLine: null,
// code: label.code,
// }
};
labelResult.data.isPack = true;
labelResult.data.packingCode = label.code;
return labelResult;
},
callBack() {
this.$refs.comscan.clear();
this.$emit("getScanResult", this.scanResult);
},
getfocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.getfocus();
}
},
losefocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.losefocus();
}
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
change(e) {
this.show = e.show
}
}
}
</script>
<style>
</style>

17
fe/PDA/mycomponents/wincom/winScanByPack.vue

@ -3,15 +3,15 @@
<uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()">
<view class="popup_box">
<view class="pop_title">
扫描信息
扫描{{title}}
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="uni-flex uni-row">
<!-- <view class="uni-flex uni-row">
<view class="tab_tit tab_tit_active">箱标签</view>
</view>
</view> -->
<view class="tab_info">
<win-com-scan ref="comscan" @getScanResult="getScanResult" placeholder="箱标签"
<win-com-scan ref="comscan" @getScanResult="getScanResult" :placeholder="title"
:clearResult="true"></win-com-scan>
<view class="uni-flex">
<button class="clean_scan_btn" @click="cancelClick()">清空</button>
@ -31,6 +31,10 @@
import {
getInventoryLabel
} from '@/api/index.js';
import {
scanFailedAudio
} from '@/common/basic.js';
export default {
name: 'winScanByPack',
@ -41,7 +45,7 @@
props: {
title: {
type: String,
default: ''
default: '箱标签'
},
},
data() {
@ -85,10 +89,13 @@
uni.hideLoading();
this.callBack();
} else {
scanFailedAudio()
this.showMessage('标签【' + result.data.code + '】,在标签表中不存在')
uni.hideLoading();
}
}).catch(err => {
scanFailedAudio()
uni.hideLoading();
this.showMessage(err.message)
});

192
fe/PDA/mycomponents/wincom/winScanByPosition.vue

@ -0,0 +1,192 @@
<template>
<view>
<uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()">
<view class="popup_box">
<view class="pop_title">
扫描位置码
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="tab_info">
<win-com-scan ref="comscan" @getScanResult="getScanResult" placeholder="位置码"
:clearResult="true"></win-com-scan>
<view class="uni-flex">
<button class="clean_scan_btn" @click="cancelClick()">清空</button>
<button class="scan_btn" @click="scanClick()">扫描</button>
</view>
</view>
</view>
</view>
</uni-popup>
<com-message ref="comMessage" @afterClose="getfocus"></com-message>
</view>
</template>
<script>
import winComScan from '@/mycomponents/wincom/winComScan.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import {
getPositionCodeInfo
} from '@/api/index.js';
import {
getPositionCodeName
} from '@/common/basic.js';
export default {
name: 'winScanByPack',
components: {
winComScan,
comMessage
},
props: {
title: {
type: String,
default: ''
},
codeType: {
type: String,
default: ""
}
},
data() {
return {
scanResult: {},
show: false,
}
},
created() {
},
methods: {
openScanPopup(content) {
this.$refs.popup.open('bottom');
},
closeScanPopup(content) {
this.$refs.popup.close();
this.$emit("close", '');
},
scanClick() {
this.$refs.comscan.handelScanMsg();
},
cancelClick() {
this.$refs.comscan.clearScanValue();
},
getScanResult(result) {
console.log("扫描",result.data.code)
if (result != null) {
// if(result.data.code[0].toUpperCase()!="W"){
// this.showMessage("")
// return;
// }
uni.showLoading({
title: '扫描中...',
mask: true
})
// var data =
// {
// code: "W19",
// partCode: "TMDLYA0AFM6A",
// partName: "P000000000000015",
// partDesc: "MY",
// basicUom: "PC",
// locationCode: "W",
// locationName: "",
// stdPackQty: 100,
// remark: null,
// tenantId: null,
// extraProperties: {},
// concurrencyStamp: "b3f2cf7ba3e14166bb97dac768d91741",
// lastModificationTime: null,
// lastModifierId: null,
// creationTime: "2024-02-28T14:47:08.6878607",
// creatorId: null,
// qty:0,
// id: "4c40f72b-a86d-54be-aed2-3a1100a46436"
// }
getPositionCodeInfo(result.data.code).then(res=>{
uni.hideLoading()
if(res){
console.log("类型"+this.codeType)
if(res.type==this.codeType){
this.scanResult = res;
this.scanResult.qty =1;
this.callBack()
this.closeScanPopup()
}else {
var type =
this.showMessage("位置码【"+res.code+"】的类型是["+getPositionCodeName(res.type) + "不是["+getPositionCodeName(this.codeType)+"]类型")
}
}else {
this.showMessage("未查找到位置码【"+result.data.code+"】")
}
}).catch(error=>{
uni.hideLoading()
this.showMessage(error.message)
})
}
},
getLabelResult(label) {
let labelResult = {
sucess: true,
message: "",
data: label,
// data: {
// isPack: true,
// // scanType: null,
// itemCode: label.itemCode,
// itemName: label.itemName,
// itemDesc1: label.itemDesc1,
// itemDesc2: label.itemDesc2,
// lot: label.lot,
// qty: label.qty,
// uom: label.uom,
// poNumber: label.poNumber,
// // asn: null,
// packingCode: label.code,
// supplierBatch: label.supplierBatch,
// // order: null,
// // poLine: null,
// code: label.code,
// }
};
labelResult.data.isPack = true;
labelResult.data.packingCode = label.code;
return labelResult;
},
callBack() {
this.$refs.comscan.clear();
this.$emit("getScanResult", this.scanResult);
},
getfocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.getfocus();
}
},
losefocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.losefocus();
}
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
change(e) {
this.show = e.show
}
}
}
</script>
<style>
</style>

162
fe/PDA/mycomponents/wincom/winScanByProductCode.vue

@ -0,0 +1,162 @@
<template>
<view>
<uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()">
<view class="popup_box">
<view class="pop_title">
扫描{{title}}
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<!-- <view class="uni-flex uni-row">
<view class="tab_tit tab_tit_active">箱标签</view>
</view> -->
<view class="tab_info">
<win-com-scan ref="comscan" @getScanResult="getScanResult" placeholder="箱标签"
:clearResult="true" :placeholder="title"></win-com-scan>
<view class="uni-flex">
<button class="clean_scan_btn" @click="cancelClick()">清空</button>
<button class="scan_btn" @click="scanClick()">扫描</button>
</view>
</view>
</view>
</view>
</uni-popup>
<com-message ref="comMessage" @afterClose="getfocus"></com-message>
</view>
</template>
<script>
import winComScan from '@/mycomponents/wincom/winComScan.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import {
getitems,
getMesBarCode
} from '@/api/index.js';
import {
scanSuccessAudio,
scanFailedAudio
} from '@/common/basic.js';
export default {
name: 'winScanByPack',
components: {
winComScan,
comMessage
},
props: {
title: {
type: String,
default: ''
},
},
data() {
return {
scanResult: {},
show: false,
}
},
created() {
},
methods: {
openScanPopup(content) {
this.$refs.popup.open('bottom');
},
closeScanPopup() {
this.$refs.popup.close();
this.$emit("close", '');
},
scanClick() {
this.$refs.comscan.handelScanMsg();
},
cancelClick() {
this.$refs.comscan.clearScanValue();
},
getScanResult(result) {
if (result != null) {
uni.showLoading({
title: '扫描中...',
mask: true
})
getMesBarCode(result.data.code).then(item=>{
uni.hideLoading();
if (item) {
//,getfocus()
this.scanResult = {
scanCode:result.data.code,
itemCode:item.itemCode,
itemName:item.itemName,
itemDesc1:item.itemDesc1,
stdPackQty: item.stdPackQty,
uom: item.uom,
qty:item.qty,
locationCode:item.locationCode
};
this.callBack();
} else {
scanFailedAudio()
this.losefocus();
this.showMessage('单件码【' + result.data.code + '】,不存在')
}
}).catch(err => {
scanFailedAudio()
uni.hideLoading();
this.showMessage(err.message)
});
// getitems(result.data.code).then(item => {
// if (item) {
// this.losefocus(); //,getfocus()
// this.scanResult = {
// itemCode:item.code,
// itemName:item.name,
// itemDesc1:item.desc1,
// stdPackQty: item.stdPackQty,
// uom: item.basicUom
// };
// uni.hideLoading();
// this.callBack();
// } else {
// this.showMessage('' + result.data.code + ',')
// uni.hideLoading();
// }
// }).catch(err => {
// uni.hideLoading();
// this.showMessage(err.message)
// });
}
},
callBack() {
this.$refs.comscan.clear();
this.$emit("getScanResult", this.scanResult);
},
getfocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.getfocus();
}
},
losefocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.losefocus();
}
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
change(e) {
this.show = e.show
}
}
}
</script>
<style>
</style>

111
fe/PDA/mycomponents/wincom/winScanContent.vue

@ -0,0 +1,111 @@
<template>
<view>
<uni-popup ref="popup" @change="change" @maskClick="closeScanPopup()">
<view class="popup_box">
<view class="pop_title">
扫描工位码
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="tab_info">
<win-com-scan ref="comscan" @getScanResult="getScanResult" placeholder="工位码"
:clearResult="true"></win-com-scan>
<view class="uni-flex">
<button class="clean_scan_btn" @click="cancelClick()">清空</button>
<button class="scan_btn" @click="scanClick()">扫描</button>
</view>
</view>
</view>
</view>
</uni-popup>
<com-message ref="comMessage" @afterClose="getfocus"></com-message>
</view>
</template>
<script>
import winComScan from '@/mycomponents/wincom/winComScan.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import {
getPositionCodeInfo
} from '@/api/index.js';
import {
getPositionCodeName
} from '@/common/basic.js';
export default {
name: 'winScanByPack',
components: {
winComScan,
comMessage
},
props: {
title: {
type: String,
default: ''
},
codeType: {
type: String,
default: ""
}
},
data() {
return {
scanResult: {},
show: false,
}
},
created() {
},
methods: {
openScanPopup(content) {
this.$refs.popup.open('bottom');
},
closeScanPopup(content) {
this.$refs.popup.close();
this.$emit("close", '');
},
scanClick() {
this.$refs.comscan.handelScanMsg();
},
cancelClick() {
this.$refs.comscan.clearScanValue();
},
getScanResult(result) {
console.log("扫描",result.data.code)
this.scanResult =result.data.code
this.callBack()
this.closeScanPopup()
},
callBack() {
this.$refs.comscan.clear();
this.$emit("getScanResult", this.scanResult);
},
getfocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.getfocus();
}
},
losefocus() {
if (this.$refs.comscan != undefined) {
this.$refs.comscan.losefocus();
}
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
change(e) {
this.show = e.show
}
}
}
</script>
<style>
</style>

72
fe/PDA/mycomponents/wincom/winScanLocationCode.vue

@ -1,28 +1,38 @@
<template>
<uni-popup ref="popup">
<view class="popup_box">
<view class="pop_title">
扫描信息
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="pop_tab">
<view class="uni-flex uni-row">
<view class="tab_tit tab_tit_active">{{title}}</view>
<view class="">
<uni-popup ref="popup">
<view class="popup_box">
<view class="pop_title">
扫描{{title}}
<text class="fr" @click="closeScanPopup()">关闭</text>
</view>
<view class="tab_info">
<win-com-scan @getScanResult="getScanResult" :placeholder='title'></win-com-scan>
<view class="pop_tab">
<view class="tab_info">
<win-com-scan @getScanResult="getScanResult" :placeholder='title'></win-com-scan>
</view>
</view>
</view>
</view>
</uni-popup>
</uni-popup>
<com-message ref="comMessage" ></com-message>
</view>
</template>
<script>
import {
locations
} from '@/api/index.js';
import {
scanSuccessAudio,
scanFailedAudio
} from '@/common/basic.js';
import winComScan from '@/mycomponents/wincom/winComScan.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
export default {
name: 'winScanByCode',
components: {
winComScan
winComScan,
comMessage
},
props: {
title: {
@ -32,7 +42,8 @@
},
data() {
return {
code: ''
code: '',
locationInfo:null
}
},
@ -52,12 +63,37 @@
} else if (result.data.scanType === 'barcode') {
this.code = result.data.code;
}
this.callBack();
this.getLocationInfo(this.code)
},
callBack() {
this.closeScanPopup();
this.$emit("getLocationCode", this.code);
}
this.$emit("getLocation", this.locationInfo);
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
getLocationInfo(code) {
uni.showLoading({
title: "正在查询库位信息...",
mask: true
});
locations(code).then((res) => {
uni.hideLoading();
if (res) {
this.locationInfo=res
this.callBack()
} else {
scanFailedAudio()
this.showMessage('未查找到库位【' + code + '】');
this.locationInfo=null
}
}).catch((err) => {
this.locationInfo=null
this.showMessage(err.message);
uni.hideLoading();
})
},
}
}
</script>

58
fe/PDA/package.json

@ -1,29 +1,31 @@
{
"name": "uniproject",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"serve": "npm run dev",
"build": "npm run build",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"sass": "^1.55.0",
"sass-loader": "^12.6.0"
},
"dependencies": {
"axios": "^0.24.0",
"base-64": "^1.0.0",
"jwt-decode": "^3.1.2",
"moment": "^2.29.4",
"uni-read-pages": "^1.0.5",
"uni-simple-router": "^1.5.5",
"vue-axios": "^3.5.1",
"vue-barcode": "^1.3.0",
"vue-qrcode-reader": "^3.1.0"
}
}
"name": "uView",
"version": "1.8.6",
"description": "uView UI,是uni-app生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水",
"main": "index.js",
"keywords": [
"uview",
"ui",
"uni-app"
],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": ""
},
"devDependencies": {
"node-sass": "^4.14.0",
"sass-loader": "^8.0.2"
},
"author": "uView",
"license": "MIT",
"id": "uview-v1",
"dcloudext": {
"category": [
"前端组件",
"通用组件"
]
}
}

574
fe/PDA/pages.js

@ -38,7 +38,7 @@ module.exports = () => ({
"path": "pages/message/index",
"style": {
"navigationBarTitleText": "消息",
"enablePullDownRefresh": true
"enablePullDownRefresh": false
}
},
@ -127,6 +127,7 @@ module.exports = () => ({
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturn_detail",
"style": {
@ -134,6 +135,30 @@ module.exports = () => ({
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequest",
"style": {
"navigationBarTitleText": "上架后退货申请",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequestApprove",
"style": {
"navigationBarTitleText": "上架后退货申请审批",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequestApprove_detail",
"style": {
"navigationBarTitleText": "上架后退货申请审批详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/inventory/scrap",
"style": {
@ -141,6 +166,20 @@ module.exports = () => ({
"enablePullDownRefresh": false
}
},
{
"path": "pages/return/productionReturnRaw",
"style": {
"navigationBarTitleText": "原料退库",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/productionReturnFg",
"style": {
"navigationBarTitleText": "半成品退库",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/productionReturn",
"style": {
@ -246,6 +285,13 @@ module.exports = () => ({
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/issueRequest",
"style": {
"navigationBarTitleText": "人工叫料申请",
"enablePullDownRefresh": true
}
},
// {
// "path": "pages/instruments/index",
// "style": {
@ -353,6 +399,35 @@ module.exports = () => ({
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countRaw",
"style": {
"navigationBarTitleText": "原料盘点",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countRawDetail",
"style": {
"navigationBarTitleText": "原料盘点详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countFg",
"style": {
"navigationBarTitleText": "成品盘点",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countFgDetail",
"style": {
"navigationBarTitleText": "成品盘点详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/count",
"style": {
@ -378,7 +453,7 @@ module.exports = () => ({
"path": "pages/task/count_detail",
"style": {
"navigationBarTitleText": "盘点任务详情",
"enablePullDownRefresh": true
"enablePullDownRefresh": false
}
},
{
@ -484,10 +559,497 @@ module.exports = () => ({
{
"path": "pages/store/issueDirect",
"style": {
"navigationBarTitleText": "直接发料",
"navigationBarTitleText": "非生产调拨",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/unProducePick",
"style": {
"navigationBarTitleText": "非生产领料",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProducePickDetail",
"style": {
"navigationBarTitleText": "非生产领料详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProducePickWip",
"style": {
"navigationBarTitleText": "非生产领料(无箱码)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProducePickWipDetail",
"style": {
"navigationBarTitleText": "非生产领料(无箱码)详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturn",
"style": {
"navigationBarTitleText": "非生产退料",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturnDetail",
"style": {
"navigationBarTitleText": "非生产退料详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturnWip",
"style": {
"navigationBarTitleText": "非生产退料(无箱码)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturnWipDetail",
"style": {
"navigationBarTitleText": "非生产退料(无箱码)详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverBoard",
"style": {
"navigationBarTitleText": "看板件发运",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverBoard_detail",
"style": {
"navigationBarTitleText": "看板件发运详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverJis",
"style": {
"navigationBarTitleText": "Jis发运",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverJis_detail",
"style": {
"navigationBarTitleText": "Jis发运详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionInventoryMove",
"style": {
"navigationBarTitleText": "高往低库存转移(注塑)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionInventoryMoveDetail",
"style": {
"navigationBarTitleText": "高往低库存转移详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionTransfer",
"style": {
"navigationBarTitleText": "完工转储(注塑)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerCall",
"style": {
"navigationBarTitleText": "空器具呼叫",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerMove",
"style": {
"navigationBarTitleText": "空器具库移",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerMoveDetail",
"style": {
"navigationBarTitleText": "空器具库移详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/record/productionReturn",
"style": {
"navigationBarTitleText": "客户退货单件码",
"enablePullDownRefresh": true
}
},
{
"path": "pages/record/productionReturnPack",
"style": {
"navigationBarTitleText": "客户退货箱码",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequest",
"style": {
"navigationBarTitleText": "三方库发货",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequestList",
"style": {
"navigationBarTitleText": "三方库发货申请",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequestListDetail",
"style": {
"navigationBarTitleText": "三方库发货申请详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/thirdLocationJob",
"style": {
"navigationBarTitleText": "三方库收货",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/thirdLocationJobDetail",
"style": {
"navigationBarTitleText": "三方库收货详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/cotaing/coatingTransfer",
"style": {
"navigationBarTitleText": "完工转储(喷涂)",
"enablePullDownRefresh": false
}
},
{
"path": "pages/assemble/assembleTransfer",
"style": {
"navigationBarTitleText": "完工转储(装配)",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/inventoryMoveJob",
"style": {
"navigationBarTitleText": "库移任务",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/inventoryMoveJobDetail",
"style": {
"navigationBarTitleText": "库移任务详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/record/completeInventoryTransfer",
"style": {
"navigationBarTitleText": "完工库移",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionPlanRequest",
"style": {
"navigationBarTitleText": "涂装上线计划申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionPlanJob",
"style": {
"navigationBarTitleText": "涂装上线计划任务",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionPlanJobDetail",
"style": {
"navigationBarTitleText": "涂装上线计划任务详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJob",
"style": {
"navigationBarTitleText": "注塑发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJobDetail",
"style": {
"navigationBarTitleText": "注塑发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "注塑发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequest",
"style": {
"navigationBarTitleText": "注塑叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequestList",
"style": {
"navigationBarTitleText": "注塑叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequestListDetail",
"style": {
"navigationBarTitleText": "注塑叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJob",
"style": {
"navigationBarTitleText": "喷涂发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJobDetailByQty",
"style": {
"navigationBarTitleText": "喷涂发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJobDetail",
"style": {
"navigationBarTitleText": "喷涂发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequest",
"style": {
"navigationBarTitleText": "喷涂叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequestList",
"style": {
"navigationBarTitleText": "喷涂叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequestListDetail",
"style": {
"navigationBarTitleText": "喷涂叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJob",
"style": {
"navigationBarTitleText": "装配发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "装配发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJobDetail",
"style": {
"navigationBarTitleText": "装配发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequest",
"style": {
"navigationBarTitleText": "装配叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequestList",
"style": {
"navigationBarTitleText": "装配叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequestListDetail",
"style": {
"navigationBarTitleText": "装配叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJob",
"style": {
"navigationBarTitleText": "kitting发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJobDetail",
"style": {
"navigationBarTitleText": "kitting发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "kitting发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequest",
"style": {
"navigationBarTitleText": "kitting叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequestList",
"style": {
"navigationBarTitleText": "kitting叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequestListDetail",
"style": {
"navigationBarTitleText": "kitting叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJob",
"style": {
"navigationBarTitleText": "备件发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJobDetail",
"style": {
"navigationBarTitleText": "备件发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "备件发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequest",
"style": {
"navigationBarTitleText": "备件叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequestList",
"style": {
"navigationBarTitleText": "备件叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequestListDetail",
"style": {
"navigationBarTitleText": "备件叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/returnWareHouse",
"style": {
"navigationBarTitleText": "回库",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/splitPacking",
"style": {
"navigationBarTitleText": "拆箱",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/splitPackingResult",
"style": {
"navigationBarTitleText": "拆箱结果",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/mergePacking",
"style": {
"navigationBarTitleText": "合箱",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/mergePackingResult",
"style": {
"navigationBarTitleText": "合箱结果",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
@ -507,6 +1069,12 @@ module.exports = () => ({
"text": "\ue7c6",
"fontSrc": "/static/icon/iconfont.ttf",
"fontSize": "22px"
},
{
"float": "right",
"text": "刷新",
// "fontSrc": "/static/icon/iconfont.ttf",
"fontSize": "16px"
}]
},
"softinputMode": "adjustPan" //adjustResize

599
fe/PDA/pages.json

@ -1,4 +1,7 @@
{
"easycom": {
"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
},
"pages": [{
"path": "pages/index/index",
"style": {
@ -143,6 +146,28 @@
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequest",
"style": {
"navigationBarTitleText": "上架后退货申请",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequestApprove",
"style": {
"navigationBarTitleText": "上架后退货申请审批",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/purchaseReturnRequestApprove_detail",
"style": {
"navigationBarTitleText": "上架后退货申请审批详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/inventory/scrap",
"style": {
@ -150,6 +175,20 @@
"enablePullDownRefresh": false
}
},
{
"path": "pages/return/productionReturnRaw",
"style": {
"navigationBarTitleText": "生产退库(原料)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/productionReturnFg",
"style": {
"navigationBarTitleText": "生产退库(半成品)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/return/productionReturn",
"style": {
@ -262,6 +301,14 @@
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/issueRequest",
"style": {
"navigationBarTitleText": "人工叫料申请",
"enablePullDownRefresh": true
}
},
// {
// "path": "pages/instruments/index",
// "style": {
@ -313,6 +360,7 @@
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/issueByFIFO",
"style": {
@ -334,6 +382,36 @@
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countRaw",
"style": {
"navigationBarTitleText": "原料盘点",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countRawDetail",
"style": {
"navigationBarTitleText": "原料盘点详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countFg",
"style": {
"navigationBarTitleText": "成品盘点",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/countFgDetail",
"style": {
"navigationBarTitleText": "成品盘点详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/count",
"style": {
@ -359,7 +437,7 @@
"path": "pages/task/count_detail",
"style": {
"navigationBarTitleText": "盘点任务详情",
"enablePullDownRefresh": true
"enablePullDownRefresh": false
}
},
{
@ -463,10 +541,511 @@
{
"path": "pages/store/issueDirect",
"style": {
"navigationBarTitleText": "直接发料",
"navigationBarTitleText": "非生产调拨", //
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/unProducePick",
"style": {
"navigationBarTitleText": "非生产领料",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProducePickDetail",
"style": {
"navigationBarTitleText": "非生产领料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/unProducePickWip",
"style": {
"navigationBarTitleText": "非生产领料(无箱码)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProducePickWipDetail",
"style": {
"navigationBarTitleText": "非生产领料(无箱码)详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/unProduceReturn",
"style": {
"navigationBarTitleText": "非生产退料",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturnDetail",
"style": {
"navigationBarTitleText": "非生产退料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/unProduceReturnWip",
"style": {
"navigationBarTitleText": "非生产退料(无箱码)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/unProduceReturnWipDetail",
"style": {
"navigationBarTitleText": "非生产退料(无箱码)详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverBoard",
"style": {
"navigationBarTitleText": "看板件发运",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverBoard_detail",
"style": {
"navigationBarTitleText": "看板件发运详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverJis",
"style": {
"navigationBarTitleText": "Jis发运",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/deliverJis_detail",
"style": {
"navigationBarTitleText": "Jis发运详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionInventoryMove",
"style": {
"navigationBarTitleText": "高往低库存转移(注塑)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionInventoryMoveDetail",
"style": {
"navigationBarTitleText": "高往低库存转移详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/injection/injectionTransfer",
"style": {
"navigationBarTitleText": "完工转储(注塑)",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerCall",
"style": {
"navigationBarTitleText": "空器具呼叫",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerMove",
"style": {
"navigationBarTitleText": "接收空器具",
"enablePullDownRefresh": true
}
},
{
"path": "pages/container/containerMoveDetail",
"style": {
"navigationBarTitleText": "接收空器具详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/record/productionReturn",
"style": {
"navigationBarTitleText": "客户退货单件码",
"enablePullDownRefresh": true
}
},
{
"path": "pages/record/productionReturnPack",
"style": {
"navigationBarTitleText": "客户退货箱码",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequest",
"style": {
"navigationBarTitleText": "三方库发货",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequestList",
"style": {
"navigationBarTitleText": "三方库发货申请",
"enablePullDownRefresh": true
}
},
{
"path": "pages/request/thirdLocationRequestListDetail",
"style": {
"navigationBarTitleText": "三方库发货申请详情",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/thirdLocationJob",
"style": {
"navigationBarTitleText": "三方库收货",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/thirdLocationJobDetail",
"style": {
"navigationBarTitleText": "三方库收货详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/cotaing/coatingTransfer",
"style": {
"navigationBarTitleText": "完工转储(喷涂)",
"enablePullDownRefresh": false
}
},
{
"path": "pages/assemble/assembleTransfer",
"style": {
"navigationBarTitleText": "完工转储(装配)",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/inventoryMoveJob",
"style": {
"navigationBarTitleText": "库移任务",
"enablePullDownRefresh": true
}
},
{
"path": "pages/task/inventoryMoveJobDetail",
"style": {
"navigationBarTitleText": "库移任务详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/record/completeInventoryTransfer",
"style": {
"navigationBarTitleText": "完工库移",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionPlanRequest",
"style": {
"navigationBarTitleText": "涂装上线计划申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionPlanJob",
"style": {
"navigationBarTitleText": "涂装上线计划任务",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionPlanJobDetail",
"style": {
"navigationBarTitleText": "涂装上线计划任务详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJob",
"style": {
"navigationBarTitleText": "注塑发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJobDetail",
"style": {
"navigationBarTitleText": "注塑发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/injectionIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "注塑发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequest",
"style": {
"navigationBarTitleText": "注塑叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequestList",
"style": {
"navigationBarTitleText": "注塑叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/injectionIssueRequestListDetail",
"style": {
"navigationBarTitleText": "注塑叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJob",
"style": {
"navigationBarTitleText": "喷涂发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJobDetailByQty",
"style": {
"navigationBarTitleText": "喷涂发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/coatingIssuleJobDetail",
"style": {
"navigationBarTitleText": "喷涂发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequest",
"style": {
"navigationBarTitleText": "喷涂叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequestList",
"style": {
"navigationBarTitleText": "喷涂叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/coatingIssueRequestListDetail",
"style": {
"navigationBarTitleText": "喷涂叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJob",
"style": {
"navigationBarTitleText": "装配发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJobDetail",
"style": {
"navigationBarTitleText": "装配发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/assembleIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "装配发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequest",
"style": {
"navigationBarTitleText": "装配叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequestList",
"style": {
"navigationBarTitleText": "装配叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/assembleIssueRequestListDetail",
"style": {
"navigationBarTitleText": "装配叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJob",
"style": {
"navigationBarTitleText": "kitting发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJobDetail",
"style": {
"navigationBarTitleText": "kitting发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/kittingIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "kitting发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequest",
"style": {
"navigationBarTitleText": "kitting叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequestList",
"style": {
"navigationBarTitleText": "kitting叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/kittingIssueRequestListDetail",
"style": {
"navigationBarTitleText": "kitting叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJob",
"style": {
"navigationBarTitleText": "备件发料",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJobDetail",
"style": {
"navigationBarTitleText": "备件发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/task/sparePartIssueJobDetailByQty",
"style": {
"navigationBarTitleText": "备件发料详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequest",
"style": {
"navigationBarTitleText": "备件叫料申请",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequestList",
"style": {
"navigationBarTitleText": "备件叫料申请列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/request/sparePartIssueRequestListDetail",
"style": {
"navigationBarTitleText": "备件叫料申请详情",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/returnWareHouse",
"style": {
"navigationBarTitleText": "回库",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/splitPacking",
"style": {
"navigationBarTitleText": "拆箱",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/splitPackingResult",
"style": {
"navigationBarTitleText": "拆箱结果",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/mergePacking",
"style": {
"navigationBarTitleText": "合箱",
"enablePullDownRefresh": false
}
},
{
"path": "pages/inventory/mergePackingResult",
"style": {
"navigationBarTitleText": "合箱结果",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
@ -478,6 +1057,22 @@
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#F1F1F1"
},
//
"titleNView": {
"autoBackButton": "true",
"buttons": [{
"float": "right",
"text": "\ue7c6",
"fontSrc": "/static/icon/iconfont.ttf",
"fontSize": "22px"
},
{
"float": "right",
"text": "刷新",
// "fontSrc": "/static/icon/iconfont.ttf",
"fontSize": "16px"
}]
},
"softinputMode": "adjustPan" //adjustResize
},

433
fe/PDA/pages/assemble/assembleTransfer.vue

@ -0,0 +1,433 @@
<template>
<page-meta root-font-size="18px"></page-meta>
<view class="">
<win-blank-view @goScan='openScanPopup' v-if="itemList.length==0"></win-blank-view>
<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scrolltoupper="upper"
@scrolltolower="lower" @scroll="scroll" style="padding-bottom:150px">
<view class="detail-list " v-for="(item, index) in itemList" :key="index">
<view class="detail-content">
<view class="" style="">
<view class="uni-flex uni-row u-col-center">
<view class="" style="margin-top: 20rpx; margin-left: 10rpx; font-weight: bold;">
({{index+1}}).
</view>
<comItemCode :itemData="item"></comItemCode>
</view>
<uni-table border stripe style="">
<!-- <uni-tr>
<uni-td align="center">物品代码</uni-td>
<uni-td>{{item.itemCode}}</uni-td>
</uni-tr> -->
<uni-tr>
<uni-td align="center">单位</uni-td>
<uni-td>{{item.uom}}</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">标包数</uni-td>
<uni-td>{{item.stdPackQty}}</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">来源库位</uni-td>
<uni-td>{{item.fromLocationCode}}</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center">数量</uni-td>
<uni-td>
<view class="uni-flex uni-row">
<view class="uni-flex uni-row space-between" style="width: 100%;">
<view class="">
<com-number-box :ref="'comNumberBox_'+index" v-model="item.qty"
:max="99999" :min="0" @change="qtyChanged($event,item,index)">
</com-number-box>
</view>
<view class="">
<button type="primary" size="mini" style="margin-left: 30rpx;"
@click="remove(item,index)">移除</button>
</view>
</view>
</view>
</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
</view>
</scroll-view>
<div class="new_bot_box" v-show="itemList.length>0">
<win-collapse-location ref="location" @getLocationCode='getToLocation' @clear='clear'>
</win-collapse-location>
<view class="new_btn_bot bot_pos uni-flex">
<button class="new_clear_btn btn_double" @click="cancel()">清空</button>
<button class="new_save_btn btn_double" @click="submit()">提交</button>
</view>
</div>
<win-scan-button @goScan='openScanPopup' v-if="itemList.length>0"></win-scan-button>
<winScanByProductCode ref="scanPackPopup" title="单件码" @getScanResult='getScanResult'></winScanByProductCode>
<com-balance ref="balanceItems" @selectedItem='selectedBalanceItem'></com-balance>
<com-message ref="comMessage" @afterClose='afterCloseMessagg'></com-message>
</view>
</view>
</template>
<script>
import {
locations,
getBalancesByFilter,
completeTransfer
} from '@/api/index.js';
import {
showConfirmMsg,
goHome,
getRemoveOption,
scanSuccessAudio,
scanFailedAudio
} from '@/common/basic.js';
import winBlankView from '@/mycomponents/wincom/winBlankView.vue'
import comBalanceItem from '@/mycomponents/comItem/comBalanceItem.vue'
import winScanButton from '@/mycomponents/wincom/winScanButton.vue'
import winScanByPack from '@/mycomponents/wincom/winScanByPack.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import comBalance from '@/mycomponents/common/comBalance.vue'
import winCollapseLocation from '@/mycomponents/wincom/winCollapseLocation.vue'
import winScanByProductCode from '@/mycomponents/wincom/winScanByProductCode.vue'
import comItemCode from '@/mycomponents/comItem/comItemCode.vue'
import comNumberBox from '@/mycomponents/common/comNumberBox.vue';
export default {
name: 'comtransfer',
components: {
winBlankView,
comBalanceItem,
comMessage,
winScanButton,
comBalance,
winCollapseLocation,
winScanByProductCode,
comItemCode,
comNumberBox
},
data() {
return {
options: [],
itemList: [],
fromLocationCode: '',
fromLocationInfo: {},
toLocationCode: '',
scrollTop: 0,
old: {
scrollTop: 0
},
inventoryStatus: -1,
inventoryStatusArray: [],
isClearPackCode: false, //
isClearContainerCode: false, //
isClearLot: false, //,
locationErpCode: '',
toLocationErpCode: '',
locationGotFocus: false,
transferType:"Transfer_Assemble"
};
},
props: {
// locationTypes: {
// type: [Array, String, Number],
// value: ''
// },
byLocation: {
type: Boolean,
value: false
},
},
watch: {},
mounted: function() {
this.openScanPopup();
this.options = getRemoveOption();
},
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome();
} else if (e.index === 1) {
window.location.reload();
}
},
methods: {
openScanPopup() {
this.$refs.scanPackPopup.openScanPopup()
},
//?
swipeClick(e, index) {
let {
content
} = e;
if (content.text === '移除') {
uni.showModal({
title: '提示',
content: '是否移除选择的行?',
success: res => {
if (res.confirm) {
this.itemList.splice(index, 1);
}
}
});
}
},
remove(index) {
showConfirmMsg("确定移除?", res => {
if (res) {
this.itemList.splice(index, 1);
}
})
},
getScanResult(result) {
let that = this;
let code = result.itemCode;
let datas = that.itemList.filter(r => {
return r.itemCode == code
})
if (datas.length > 0) {
scanFailedAudio()
showConfirmMsg('物料【' + code + '】已经存在,是否要重新扫描?', confirm => {
if (confirm) {
that.itemList.forEach((r, i) => {
if (r.packingCode == code) {
that.itemList.splice(i, 1);
return;
}
});
// that.getBalance(code);
}
});
} else {
var item = {
itemCode: result.itemCode,
itemName: result.itemName,
itemDesc1: result.itemDesc1,
stdPackQty: result.stdPackQty,
uom: result.uom,
qty: result.stdPackQty,
fromLocationCode: result.locationCode,
fromStatus: 2,
toStatus:2
}
this.itemList.unshift(item);
this.$refs.scanPackPopup.closeScanPopup()
scanSuccessAudio()
}
},
qtyChanged(value, item, index) {
if (value <= 0) {
this.showMessage('退货数量必须大于0')
item.handledQty = item.qty
this.$refs['comNumberBox_' + index][0].setValue(item.handledQty);
}
},
getFromLocation(code, callBack) {
locations(code).then(res => {
if (res) {
this.fromLocationInfo = res;
callBack(true)
}
}).catch(err => {
callBack(false)
})
},
getToLocation(code) {
if (code == '') {
this.showMessage('目标库位不能为空');
return;
}
uni.showLoading({
title: "扫描中",
mask: true
});
let that = this;
locations(code).then(res => {
uni.hideLoading();
if (res) {
//
if (res.type == 1 || res.type == 6 || res.type == 13) {
scanFailedAudio()
that.showMessage("目标库位不可以是待检、隔离、在途库位类型");
} else {
scanSuccessAudio()
that.toLocationCode = code;
that.toLocationErpCode = res.erpLocationCode;
}
} else {
scanFailedAudio()
that.toLocationCode = ''
that.showMessage('目标库位【' + code + '】不存在');
this.$refs.location.clearLocation()
this.locationGotFocus = true;
}
}).catch(err => {
scanFailedAudio()
that.toLocationCode = ''
this.locationGotFocus = true;
that.showMessage(err.message);
uni.hideLoading();
})
},
clear() {
this.location = null;
this.toLocationCode = "";
},
submit() {
let that = this;
if (that.itemList.length === 0) {
this.showMessage('请选择要提交的零件');
return;
}
if (that.toLocationCode === '') {
this.showMessage('请扫描目标库位');
return;
}
this.getFromLocation(this.itemList[0].fromLocationCode, res => {
if (res) {
uni.showLoading({
title: "提交中....",
mask: true
});
let item = {
worker: localStorage.userName_CN == "" ? localStorage.userName : localStorage
.userName_CN,
warehouseCode: localStorage.warehouseCode,
jobNumber: "",
supplierCode: "",
company: localStorage.company,
number: "",
type: this.transferType,
details: []
}
this.itemList.forEach(r => {
r.toLocationCode = that.toLocationCode;
r.toLocationErpCode = this.toLocationErpCode
r.fromLot ="";
r.fromLocationArea = this.fromLocationInfo.areaCode;
r.fromLocationGroup = this.fromLocationInfo.locationGroupCode;
r.fromLocationErpCode = this.fromLocationInfo.erpLocationCode;
r.fromWarehouseCode = localStorage.warehouseCode;
r.toLot ="";
r.fromPackingCode="";
r.toPackingCode = "";
r.toWarehouseCode =localStorage.warehouseCode;
r.worker = localStorage.userName_CN == "" ? localStorage.userName :
localStorage.userName_CN
item.details.push(r);
})
let params = JSON.stringify(item);
console.log('params', params);
completeTransfer(params)
.then(res => {
that.showCommitSuccess();
that.clearInfo();
uni.hideLoading();
})
.catch(err => {
that.showMessage(err.message);
uni.hideLoading();
});
}else {
that.showMessage("库位[" + this.itemList[0].fromLocationCode + "]不存在");
}
})
},
cancel() {
let that = this;
showConfirmMsg('是否要清空已扫描的零件和目标库位信息?', confirm => {
if (confirm) {
that.clearInfo();
}
})
},
clearInfo() {
let that = this;
that.itemList = [];
that.toLocationCode = '';
that.inventoryStatus = -1;
that.$refs.location.clearLocation()
},
afterCloseMessagg() {
if (this.locationGotFocus) {
this.$refs.location.gotFocus();
}
},
clearPackCode() {
this.isClearPackCode = !this.isClearPackCode;
},
clearContainerCode() {
this.isClearContainerCode = !this.isClearContainerCode;
},
clearLot() {
this.isClearLot = !this.isClearLot;
},
upper: function(e) {
// console.log(e)
},
lower: function(e) {
// console.log(e)
},
scroll: function(e) {
// console.log(e)
this.old.scrollTop = e.detail.scrollTop;
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
showCommitSuccess() {
this.$refs.comMessage.showCommitSuccess();
},
}
};
</script>
<style scoped lang="scss">
/deep/ .input-value {
font-size: 16px;
}
/deep/ .uni-collapse-item__title-text {
font-size: 16px;
}
/deep/ .uni-collapse-item--border {
border-bottom-width: 0px;
border-bottom-color: #ebeef5;
}
/deep/ .uni-collapse-item--border {
border-bottom-width: 1px;
border-bottom-color: #ebeef5;
}
</style>

262
fe/PDA/pages/container/containerCall.vue

@ -0,0 +1,262 @@
<template>
<view class="">
<!-- <view class="" style="width: 100%; background-color: #fff;">
<uni-section title="1.物流类型" subTitle="内物流" subTitleFontSize="32rpx" titleFontSize="40rpx"
type="line" padding>
</uni-section>
</view>
<view class="" style="width: 100%; background-color: #fff;">
<uni-section title="2.器具规格" subTitleFontSize="32rpx" titleFontSize="40rpx"
type="line" padding>
</uni-section>
</view>
-->
<view class="uni-list">
<view class="uni-list-cell"
style="padding-left: 15rpx; padding-top: 20rpx;padding-bottom:20rpx; padding-right: 15rpx; ; align-items: center; display: flex;">
<view class="" style="color: red; font-size: 40rpx; ">
*
</view>
<view class="uni-list-cell-left"
style="font-size:35rpx; align-items: center;display: flex; text-align: center;font-weight: bold;">
目标库位 :
</view>
<view class="uni-list-cell-db" style="font-size:35rpx" @click="openScanLocation">
<text>{{locationCode}}</text>
<text v-if="locationName!=''">({{locationName}})</text>
</view>
</view>
</view>
<view class="uni-list">
<view class="uni-list-cell " style="padding:10rpx; ">
<view class="" style="color: red; font-size: 40rpx; ">
*
</view>
<view class="uni-list-cell-left" style="font-size:35rpx;font-weight: bold;">
器具类型 :
</view>
<view class="uni-list-cell-db" style="font-size: 35rpx;">
内物流
</view>
</view>
</view>
<view class="uni-list">
<view class="uni-flex uni-row" style="padding:10rpx">
<view class="" style="color: red; font-size: 40rpx; ">
*
</view>
<view class="uni-list-cell-left" style="font-size:35rpx;font-weight: bold;">
器具规格 :
</view>
</view>
<view class="uni-list-cell-db" style="margin-bottom: 20rpx;">
<!-- <picker @change="containerModelChange" :value="modelIndex" :range="containerModelList"
range-key="name">
<view class="uni-input" style="font-size:35rpx">{{containerModel}}</view>
</picker> -->
<view class="uni-flex uni-row" style="flex-wrap: wrap;">
<view class="uni-flex" style=" width: 33.3%; justify-content: center; margin-top: 20rpx; "
v-for="(item, index) in containerModelList" :key="index">
<uni-tag :inverted="!item.checked" :circle="true" :text="item.name" type="primary"
@click="setContainerModel(item)" />
<!-- <u-radio size="45" labelSize="35" iconSize="40" :name="radio.name" @change="radioChangeType3(item,radio)">
{{radio.name}}
</u-radio> -->
</view>
</view>
</view>
</view>
<view class="new_btn_bot">
<button class="new_save_btn" @click="submit()">提交</button>
</view>
<win-scan-by-code ref="scanLocation" title="库位" @getScanCode='getLocation'></win-scan-by-code>
<com-message ref="comMessage" @afterCloseScanMessage='closeScanMessage' @afterClose='afterClose'
@afterCloseCommitMessage='closeCommitMessage'>
</com-message>
</view>
</template>
<script>
import {
locations,
getDictByCode,
containerRequest
} from '@/api/index.js';
import {
goHome,
getContainerTypeArray,
getISODateTime,
navigateBack
} from '@/common/basic.js';
import comMessage from '@/mycomponents/common/comMessage.vue'
import winScanByCode from '@/mycomponents/wincom/winScanByCode.vue'
export default {
components: {
comMessage,
winScanByCode
},
data() {
return {
containerModelList: [],
typeIndex: 0,
modelIndex: 0,
location: "",
locationCode: "请扫描库位",
locationName: "",
containerType: "内物流",
containerTypeCode: "InLogistics",
containerModel: "请选择器具规格",
containerModelCode: ""
}
},
onShow() {
this.getContainerModelList();
},
//
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome();
} else if (e.index === 1) {
window.location.reload();
}
},
methods: {
setContainerModel(item) {
this.containerModelList.forEach(res => {
res.checked = false
})
item.checked = true;
this.containerModelCode = item.code;
},
getContainerModelList() {
uni.showLoading({
title: '加载中...',
mask: true
});
getDictByCode("ContainerSpecificationsType").then(res => {
uni.hideLoading();
if (res && res.items.length > 0) {
res.items.forEach(item => {
item.value = item.code;
item.checked = false
})
this.containerModelList = res.items;
} else {
this.showMessage('获取器具规格失败,请在字典中维护器具规格');
}
}).catch(error => {
uni.hideLoading();
this.showMessage('获取器具规格失败【' + error + '】');
})
},
openScanLocation() {
this.$refs.scanLocation.openScanPopup()
},
closeScanLocation() {
this.$refs.scanLocation.closeScanPopup();
},
//
getLocation(code) {
let that = this;
if (code == '') return;
uni.showLoading({
title: '扫描中...',
mask: true
});
locations(code).then(res => {
uni.hideLoading();
if (res) {
that.locationCode = res.code;
that.locationName = res.name
that.closeScanLocation();
} else {
that.scanPopupLoseFocus();
that.showMessage('未查询到库位【' + code + '】');
}
}).catch(err => {
uni.hideLoading();
that.showMessage(err.message);
});
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
afterClose() {
this.scanPopupGetFocus();
},
scanPopupGetFocus() {
this.$refs.scanLocation.getfocus();
},
scanPopupLoseFocus() {
this.$refs.scanLocation.losefocus();
},
clearData() {
this.containerModelCode = ""
this.containerModelList.forEach(res => {
res.checked = false
});
},
setParams() {
var data = {
worker: localStorage.userName_CN == "" ? localStorage.userName : localStorage.userName_CN,
activeDate: getISODateTime(),
containerType: this.containerTypeCode,
specificationsType: this.containerModelCode,
requestLocationCode: this.locationCode,
}
return data;
},
showCommitSuccess(message) {
this.$refs.comMessage.showCommitSuccess(message);
},
closeCommitMessage() {
navigateBack(1)
},
submit() {
if (this.containerModelCode == "") {
this.showMessage("请选择器具规格")
return;
}
if (this.locationCode == "请扫描库位") {
this.showMessage("请扫描库位")
return;
}
uni.showLoading({
title: '提交中...',
mask: true
});
var params = this.setParams();
console.log(JSON.stringify(params))
containerRequest(params).then(res => {
uni.hideLoading();
this.showCommitSuccess("提交成功");
this.clearData();
}).catch(err => {
uni.hideLoading();
this.showMessage(err.message);
})
}
}
}
</script>
<style>
</style>

209
fe/PDA/pages/container/containerMove.vue

@ -0,0 +1,209 @@
<template>
<view style="padding: 15rpx;">
<uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" styleType="button"
activeColor="#007AFF"></uni-segmented-control>
<view class="content">
<view v-show="current === 0">
<win-empty-view v-if="dataList.length==0"></win-empty-view>
<view v-if="dataList.length>0" v-for="(item, index) in dataList" :key="index">
<view class="device-detail" style="font-size: 32rpx;">
<com-job-top-info :jobContent="item"></com-job-top-info>
<view>器具类型 : {{item.containerType|getContainerTypeName}} </view>
<view>器具规格 : {{item.specificationsTypeName}}</view>
<view>目标库位 : {{item.requestLocationCode}} </view>
<view>操作人 : {{item.worker}} </view>
<view>创建时间 : {{item.creationTime| formatDate}} </view>
<button type="primary" style="width: 140rpx; font-size: 32rpx; float: right;"
@click="complete(item)">完成</button>
</view>
</view>
</view>
<view v-show="current === 1">
<win-empty-view v-if="dataList.length==0"></win-empty-view>
<view v-if="dataList.length>0" v-for="(item, index) in dataList" :key="index">
<view class="device-detail" style="font-size: 32rpx;">
<com-job-top-info :jobContent="item"></com-job-top-info>
<view>器具类型 : {{item.containerType|getContainerTypeName}} </view>
<view>器具规格 : {{item.specificationsTypeName}}</view>
<view>目标库位 : {{item.requestLocationCode}} </view>
<view>操作人 : {{item.worker}} </view>
<view>创建时间 : {{item.creationTime| formatDate}} </view>
</view>
</view>
</view>
</view>
<uni-load-more :status="loadingType" v-if="dataList.length>0" />
<com-message ref="comMessage"></com-message>
</view>
</template>
<script>
import {
getContainerList,
getDictByCode,
finshContainerJob
} from '@/api/index.js';
import {
goHome,
dateFormat,
getContainerTypeName,
showConfirmMsg
} from '@/common/basic.js';
import winEmptyView from '@/mycomponents/wincom/winEmptyView.vue'
import comJobTopInfo from '@/mycomponents/comjob/comJobTopInfo.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
export default {
components: {
winEmptyView,
comJobTopInfo,
comMessage
},
data() {
return {
items: ['未完成', '已完成'],
current: 0,
pageSize: this.modelConfig,
pageIndex: 1,
loadingType: "nomore",
dataList: [],
containerModelList: [],
isFinished:false
};
},
filters: {
formatDate: function(val) {
return dateFormat(val)
},
getContainerTypeName: function(val) {
return getContainerTypeName(val)
},
},
onShow() {
this.getList('refresh');
},
onReachBottom() {
//
if (this.loadingType == 'loading' || this.loadingType == 'nomore') {
return;
}
this.getList("more");
},
onPullDownRefresh() {
this.getList('refresh');
},
//退
onBackPress(options) {
if (options.from === 'navigateBack') {
return false;
}
goHome();
return true;
},
//
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome();
} else if (e.index === 1) {
window.location.reload();
}
},
methods: {
complete(item) {
showConfirmMsg("是否确认完成?", callback => {
if (callback) {
this.submit(item)
} else {
console.log('cancel')
}
})
},
onClickItem(item) {
this.current = item.currentIndex;
console.log("点击", this.current)
if(this.current==0){
this.isFinished =false;
}else {
this.isFinished =true;
}
this.getList("refresh");
},
openScanPopup() {
this.$refs.scanPopup.openScanPopup();
},
//
getList(type) {
let that = this;
uni.showLoading({
title: "加载中....",
mask: true
});
this.loadingType = "loading";
if (type === "refresh") {
this.pageIndex = 1;
this.dataList = [];
}
let params = {
pageSize: that.pageSize,
pageIndex: that.pageIndex,
isFinished:that.isFinished
// isCreationTimeSorting: that.isTimeWindowSorting,
// isToday: that.isToday
};
getContainerList(params)
.then(res => {
uni.hideLoading();
if (type === "refresh") {
uni.stopPullDownRefresh();
}
var list = res.items;
this.loadingType = "loadmore";
if (list == null || list.length == 0) {
//
this.loadingType = "nomore";
return;
}
// that.dataList = [...that.dataList, ...list];
that.dataList = type === "refresh" ? list : this.dataList.concat(list);
that.pageIndex++;
})
.catch(err => {
this.loadingType = "";
this.showMessage(err.message);
uni.hideLoading();
if (type === "refresh") {
uni.stopPullDownRefresh();
}
});
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
showCommitSuccessMessage() {
this.$refs.comMessage.showCommitSuccess();
},
submit(item) {
uni.showLoading({
title: "提交中...",
mask:true
});
let params = this.dataList.find(r => r.id == item.id);
console.log("测试",JSON.stringify(params));
finshContainerJob(item.id, params)
.then(res => {
uni.hideLoading();
if (res != null) {
this.showCommitSuccessMessage();
this.getList("refresh")
}
})
.catch(err => {
this.showMessage(err.message);
uni.hideLoading();
});
},
}
};
</script>

413
fe/PDA/pages/container/containerMoveDetail.vue

@ -0,0 +1,413 @@
<template>
<page-meta root-font-size="18px"></page-meta>
<view class="">
<view class="top_card">
<com-job-scan-detail :jobContent="datacontent" :allCount="allCount" :scanCount="scanCount">
</com-job-scan-detail>
</view>
<scroll-view scroll-y="true" @scrolltoupper="upper" @scrolltolower="lower" @scroll="scroll"
class="scroll-detail">
<view class="detail-list margin_top" v-for="(item, index) in details" :key="item.id">
<!-- 单选卡片 -->
<view class="detail-content">
<view class="choose_main">
<view class="ljh_box">
<view class="tit_ljh">{{ item.itemCode }}</view>
<view class="ljh_left">
<view class="font_xs text_lightblue">{{ item.itemName }}</view>
<view class="font_xs text_lightblue">{{ item.itemDesc1 }}</view>
</view>
</view>
<view class="list_form hold_form">
<view class="uni-container">
<uni-table style="overflow-x: hidden;">
<uni-tr>
<!-- <uni-th width="90"></uni-th>
<uni-th width="100" align="center">推荐</uni-th>
<uni-th width="100" align="center">实际</uni-th> -->
<uni-th width="50"></uni-th>
<uni-th width="120" align="center">推荐</uni-th>
<uni-th width="120" align="center">实际</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">数量</uni-th>
<uni-th width="120" align="center">
<view class="text_black">{{item.recommendQty}}({{item.uom}})</text>
</view>
</uni-th>
<!-- -->
<uni-th width="120" align="center">
<view v-if="item.scaned" class="text_black">
{{item.handledQty}}({{item.uom}})
</view>
</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">箱码</uni-th>
<uni-th width="120" align="center">
<view class="text_packingCode">{{ item.recommendPackingCode }}</view>
</uni-th>
<uni-th width="120" align="center">
<view v-if="item.scaned" class="text_packingCode">
{{ item.handledPackingCode }}
</view>
</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">批次</uni-th>
<uni-th width="120" align="center">
<view><text class="text_black">{{item.recommendLot }}</text>
</view>
</uni-th>
<uni-th width="120" align="center">
<view v-if="item.scaned">
<text class="text_black">{{item.handledLot }}</text>
</view>
</uni-th>
</uni-tr>
<uni-tr>
<uni-th width="50">库位</uni-th>
<uni-th width="120" align="center">
<view class="text_black">{{ item.recommendLocationCode }}</view>
</uni-th>
<uni-th width="120" align="center">
<view v-if="item.scaned" class="text_black">
{{ item.handledFromLocationCode }}
</view>
</uni-th>
</uni-tr>
</uni-table>
</view>
</view>
</view>
<view class="choose_marked" v-if="item.scaned">
<image src="@/static/image_marked.svg"></image>
</view>
</view>
</view>
</scroll-view>
<view class="new_btn_bot count_shadow">
<button type="primary" class="new_save_btn" @click="submit()">提交</button>
</view>
<win-scan-button @goScan='openScanPopup'></win-scan-button>
<win-scan-by-pack ref="scanPopup" @getScanResult='getScanResult'></win-scan-by-pack>
<com-balance ref="balanceItems" @selectedItem='selectedBalanceItem'></com-balance>
<comMessage ref="comMessage" @afterCloseCommitMessage='closeCommitMessage()'></comMessage>
</view>
</template>
<script>
import {
getDeliverDetail,
takeDeliverJob,
cancelTakeDeliverJob,
finshDeliverJob,
balances
} from '@/api/index.js';
import {
showConfirmMsg,
goHome,
navigateBack
} from '@/common/basic.js';
import winScanButton from '@/mycomponents/wincom/winScanButton.vue'
import winMulitScan from '@/mycomponents/wincom/winMulitScan.vue'
import winScanByPack from '@/mycomponents/wincom/winScanByPack.vue'
import comMessage from '@/mycomponents/common/comMessage.vue'
import comJobScanDetail from '@/mycomponents/comjob/comJobScanDetail.vue'
import comBalance from '@/mycomponents/common/comBalance.vue'
export default {
components: {
winScanButton,
winMulitScan,
winScanByPack,
comMessage,
comJobScanDetail,
comBalance
},
data() {
return {
type: '',
id: "",
datacontent: {},
details: {},
toLocation: '',
scrollTop: 0,
old: {
scrollTop: 0
},
ispending: false,
balancesItem: {},
titleArray: ['箱标签', '目标库位'],
allCount: 0,
scanCount: 0,
jobStatus:""
}
},
props: {
itemCode: "",
},
onLoad(param) {
this.id = param.id;
if (param.jobStatus == 1) {
this.receive((callback => {
this.getDetail();
}));
} else {
this.getDetail();
}
},
//
onNavigationBarButtonTap(e) {
if (e.index === 0) {
goHome();
}else if(e.index === 1){
window.location.reload();
}
},
//
onBackPress(e) {
//
if (e.from == 'backbutton') {
if (this.jobStatus == 2) {
//
cancelTakeDeliverJob(this.id).then(res => {
uni.navigateBack();
}).catch(error => {
uni.navigateBack();
})
} else {
uni.navigateBack();
}
return true;
}
},
mounted() {
uni.setNavigationBarColor({
frontColor: '#ffffff',
backgroundColor: "#5A7CF3 !important"
})
},
methods: {
openScanPopup() {
this.$refs.scanPopup.openScanPopup();
},
//
getDetail() {
let that = this;
let params = {
id: that.id,
};
getDeliverDetail(params)
.then(item => {
console.log('item', item);
that.datacontent = item;
that.jobStatus = item.jobStatus
that.details = item.details;
that.details.forEach(r => r.scaned = false);
that.ispending = item.jobStatus === 2;
that.allCount = item.details.length;
// that.toLocation = item.details[0].recommendLocationCode;
})
.catch(err => {
this.showMessage('未查找到详细信息')
});
},
//
getScanResult(result) {
let that = this;
let code = result.data.code;
let item = this.details.find(r => {
return r.recommendPackingCode === code
});
if (item === undefined) {
this.showMessage('在发货任务详情中,未找到箱码【' + code + '】');
return;
} else {
if (item.scaned) {
this.showMessage('箱码【' + code + '】已经扫描,请扫描下一箱零件');
return;
}
}
//ERP
let params = {
pageSize: 1000,
pageIndex: 1,
packingCode: code,
locationTypes: [4], //
inventoryStatuses: [2], //
};
balances(params)
.then(res => {
try {
if (res.totalCount == 0) {
this.showMessage('箱码【' + code + '】在【成品库】未查询到库存信息');
} else if (res.totalCount == 1) {
that.balancesItem = res.items[0];
this.createItem(item);
} else {
this.$refs.balanceItems.openPopup(res.items);
}
uni.hideLoading();
} catch (e) {
this.showMessage(e.message)
}
})
.catch(err => {
this.showMessage(err.message)
});
},
createItem(item) {
let that = this;
if (that.balancesItem != null || that.balancesItem != undefined) {
// if (that.balancesItem.qty != item.recommendQty) {
// this.showMessage('' + that.balancesItem.qty + '' + item.recommendQty + ',')
// } else {
item.scaned = true;
item.handledContainerCode = that.balancesItem.containerCode;
item.handledPackingCode = that.balancesItem.packingCode;
item.handledBatch = that.balancesItem.batch;
item.handledLot = that.balancesItem.lot;
item.handledFromLocationArea = that.balancesItem.locationCode;
item.handledQty = that.balancesItem.qty;
// ==================================
// item.recommendFromLocationCode = string;
// item.recommendFromLocationArea = string;
// item.recommendFromLocationGroup = string;
// item.recommendFromLocationErpCode = string;
// item.recommendFromWarehouseCode = string;
// item.uom = string;
// item.recommendQty = 0;
// item.handledFromLocationCode = string;
// item.handledFromLocationArea = string;
// item.handledFromLocationGroup = string;
// item.handledFromLocationErpCode = string;
// item.handledFromWarehouseCode = string;
// item.handledQty = that.balancesItem.qty;
// item.toLocationCode = string;
// item.toLocationArea = string;
// item.toLocationGroup = string;
// item.toLocationErpCode = string;
// item.toWarehouseCode = string;
// item.onTheWayLocationCode = string;
this.getScanCount();
this.closeScanPopup();
that.$forceUpdate();
// }
}
},
getScanCount() {
this.scanCount = this.datacontent.details.filter(r => r.scaned).length;
},
closeScanPopup() {
if (this.allCount == this.scanCount) {
this.$refs.scanPopup.closeScanPopup();
}
},
selectedBalanceItem(balanceItem) {
that.balancesItem = balanceItem;
this.createItem(item);
},
//
receive(callback) {
let params = {
id: this.id
};
takeDeliverJob(params)
.then(res => {
callback(true);
})
.catch(err => {
this.showMessage(err.message);
callback(false);
});
},
submit() {
let that = this;
if (that.datacontent.details.length === 0) {
this.showMessage('该任务没有要发货的零件');
return;
}
let items = that.datacontent.details.filter(r => r.scaned);
if (items.length === 0) {
this.showMessage('请扫描要发货的零件');
return;
} else if (items.length < that.datacontent.details.length) {
this.showMessage('还有未扫描的零件,不可以发货');
return;
} else {
that.finsh();
}
},
finsh() {
let that = this;
uni.showLoading({
title: "提交中..."
});
let params = JSON.stringify(that.datacontent);
console.log(params);
// finshDeliverJob(that.id, params)
// .then(res => {
// uni.hideLoading();
// if (res != null) {
// that.showCommitSuccessMessage();
// navigateBack(1)
// }
// })
// .catch(err => {
// this.showMessage(err.message);
// uni.hideLoading();
// });
},
showCommitSuccessMessage() {
this.$refs.comMessage.showCommitSuccess();
},
closeCommitMessage() {
navigateBack(1)//
uni.hideLoading();
},
closeScanPopup() {
if (this.allCount == this.scanCount) {
this.$refs.scanPopup.closeScanPopup();
}
},
clearScanLocation() {
// this.$refs.scanLocation.getfocus();
// this.$refs.scanLocation.clear();
},
showMessage(message) {
this.$refs.comMessage.showMessage(message);
},
scroll: function(e) {
// console.log(e)
this.old.scrollTop = e.detail.scrollTop;
},
}
}
</script>
<style scoped lang="scss">
</style>

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

Loading…
Cancel
Save