zs
2025-05-14 3ec65a96dd073e598e58c12fb0b5af31e38bc20e
Merge branch 'master' of http://222.71.245.114:9086/r/HIA24016N_PipeLineDemo
已添加630个文件
已修改6个文件
75902 ■■■■■ 文件已修改
PipeLineLems.PDA/.gitignore 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/App.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/README.md 519 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/README_multiple_api.md 480 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/__json_server_mock__/db.json 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/PointHandling.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/api - 测试.js 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/api - 生产.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/api.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/bind.js 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/callEmptyContainer.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/common.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/containerHandle.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/emptyIn.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/exception.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/loadingDelivery.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/receiptExecution.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/replenishMent.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/slicingOff.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/slicingOn.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/api/sorting.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/.hbuilderx/launch.json 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/ActionUserRow.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/AutoCompleteScanInputFormItem.vue 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/DefaultHeaderPageLayout.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/EasyPicker.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/EasyPickerWithSearch.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/EasySelectFormItem.vue 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/FullPageLayout.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/HeaderPageLayout.vue 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/PageHeader.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/RadioFormItem.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/ReadRfid.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/ScanEasyItem.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/ScanInputFormItem.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/ScanInputFormItemWc2.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/UViewFormSelectPicker.vue 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/selectItem.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/components/selectItemWithSearchWc2.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/config/index.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/config/modules/ajax -测试.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/config/modules/ajax -生产.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/config/modules/ajax.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/config/modules/pagination.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/index.html 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/main.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/manifest.json 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/mdImgs/1664329468868.jpg 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/mdImgs/1664329790970.jpg 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/mdImgs/1664330296712.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/mdImgs/1665970038354.jpg 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/package.json 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/PointHandling/index.vue 421 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/PointHandling/modules/containerInfo.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/PointHandling/modules/placeInfo.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/PointHandling/modules/selectItem.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bind/index.vue 535 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bind/modules/materialList.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindContaniner/index.vue 411 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindContaniner/modules/materialList.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindInForLocation/index.vue 629 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindInForLocation/modules/materialList.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindWXJ/index.vue 475 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/bindWXJ/modules/materialList.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/changeStore/index.vue 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/checkStock/index.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/checkStock/modules/CheckAction.vue 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/checkStock/modules/DetailList.vue 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/checkStock/modules/MainList.vue 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/checkStock/modules/MainSearch.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/components/LongWidthHeightFormItem.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/components/StationSelectFormItem.vue 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerHandle/index.vue 436 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerHandle/modules/containerInfo.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerHandle/modules/placeInfo.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerHandle/modules/selectItem.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerUnBind/index.vue 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerUnBind/modules/containerInfo.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerUnBind/modules/placeInfo.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/containerUnBind/modules/selectItem.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/demo/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyContainerReturn/index.vue 348 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyIn/index.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyIn/modules/barContent.vue 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyIn/modules/materialInfo.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyInCopy/index.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyInCopy/modules/barContent.vue 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyInCopy/modules/materialInfo.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyOut/index.vue 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/emptyOut/modules/selectItemWithSearch.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/endProductInstore/index.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/endProductInstore/modules/edit.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/endProductInstore/modules/main.vue 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/exceptionHandle/index.vue 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/exceptionHandle/modules/exceptionPlace.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/exceptionHandle/modules/materialInfo.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/fapaoInStore/index.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/fapiaoOutStore/index.vue 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/home/index.vue 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/inAndOutBound/index.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/innerTailBack/index.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/innerTailBack/modules/Step1.vue 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/innerTailBack/modules/Step2.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/loadingDelivery/index.vue 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/loadingDelivery/modules/materialList.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/login/index.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/manual/out.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/materialStorage/index.vue 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/materialStorage/modules/addMaterial.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/materialStorage/modules/materialList.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/notices/index.vue 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/oneTouchUnBind/index.vue 612 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/oneTouchUnBind/modules/containerInfo.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/oneTouchUnBind/modules/materialList.vue 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/oneTouchUnBind/modules/placeInfo.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/online/index.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/pick/index.vue 414 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/pick/modules/materialList.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/plywoodBind/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/plywoodInstore/index.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/plywoodInstore/modules/edit.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/plywoodInstore/modules/main.vue 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/plywoodOut/index.vue 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/print/bluePrint.js 358 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/print/bluetoothConnection.vue 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/receiptExecution/index.vue 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/receiptExecution/modules/barContent.vue 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/receiveIn/index.vue 567 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/replenishMent/index.vue 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/sandingInstore/index.vue 417 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/setting/host.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOff/index.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOff/modules/detail.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOff/modules/main.vue 470 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOff/modules/step2.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOn/index.vue 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/slicingOn/modules/barContent.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/sortingSearch/index.vue 386 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/sortingSearch/modules/contentCard.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/sortingSearch/modules/sortingInfo.vue 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/start/index.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/takeInStore/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/tasks/index.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/tasks/module/Detail.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/tasks/module/List.vue 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/tasks/module/Search.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/temporaryInstore/index.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/temporaryInstore/modules/Step1.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/temporaryInstore/modules/Step2.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/transport/index.vue 411 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/unbind/index.vue 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/unstackingInstore/index.vue 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/unstackingInstore/modules/edit.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/unstackingInstore/modules/main.vue 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/unstackingInstore/modules/step2.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/writeRfid/index.vue 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/pages/writeRfid/modules/materialList.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/mixins/mixins.js 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/request/index.js 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/request/modules/beforeSend.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/store/index.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/store/modules/print.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/store/modules/system.js 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/store/modules/user.js 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/service/util/RfidMethod.js 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/fonts/iconfont.css 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/fonts/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/fonts/iconfont.woff 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/fonts/iconfont.woff2 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/img/logo - 副本.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/img/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/js/print/gbk.js 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/js/print/printerjobs.js 587 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/js/utils/index.js 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/js/utils/modules/color.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/static/js/utils/modules/regexValidate.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni.scss 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-badge/changelog.md 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-badge/components/uni-badge/uni-badge.vue 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-badge/package.json 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-badge/readme.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/changelog.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/icons.js 1169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uni-icons.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uniicons.css 663 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uniicons.ttf 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-icons/readme.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/changelog.md 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/index.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/package.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/readme.md 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_border.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_color.scss 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_radius.scss 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_space.scss 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_styles.scss 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_text.scss 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_variables.scss 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/styles/tools/functions.scss 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/theme.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-scss/variables.scss 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/changelog.md 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js 302 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uni-swipe-action/readme.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/LICENSE 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/README.md 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/changelog.md 357 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u--form/u--form.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u--image/u--image.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u--input/u--input.vue 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u--text/u--text.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u--textarea/u--textarea.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-action-sheet/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-album/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-album/u-album.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-alert/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-alert/u-alert.vue 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar-group/props.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar/props.js 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar/u-avatar.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-back-top/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-back-top/u-back-top.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-badge/props.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-badge/u-badge.vue 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/nvue.scss 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/props.js 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/u-button.vue 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/vue.scss 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/header.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/month.vue 579 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/props.js 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/u-calendar.vue 384 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/util.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-car-keyboard/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell-group/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell/props.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell/u-cell.vue 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox-group/props.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox/props.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue 344 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-circle-progress/props.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-code-input/props.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-code-input/u-code-input.vue 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-code/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-code/u-code.vue 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-col/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-col/u-col.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse-item/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse/u-collapse.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-column-notice/props.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/u-count-down.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/utils.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-to/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-to/u-count-to.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-datetime-picker/props.js 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-divider/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-divider/u-divider.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown-item/props.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown/props.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-empty/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-empty/u-empty.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-form-item/props.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-form-item/u-form-item.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-form/props.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-form/u-form.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-gap/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-gap/u-gap.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid-item/props.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid/u-grid.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/icons.js 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/props.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/u-icon.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-image/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-image/u-image.vue 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-anchor/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-item/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-item/u-index-item.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-list/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-list/u-index-list.vue 440 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-input/props.js 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-input/u-input.vue 352 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-keyboard/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-line-progress/props.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-line/props.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-line/u-line.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-link/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-link/u-link.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-list-item/props.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-list-item/u-list-item.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-list/props.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-list/u-list.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-icon/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-page/props.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loadmore/props.js 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-modal/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-modal/u-modal.vue 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-navbar/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-navbar/u-navbar.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-no-network/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-no-network/u-no-network.vue 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-notice-bar/props.js 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-notify/props.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-notify/u-notify.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-box/props.js 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-box/u-number-box.vue 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-keyboard/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-overlay/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-overlay/u-overlay.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/node/node.vue 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/parser.js 1075 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/props.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/u-parse.vue 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker-column/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker/props.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker/u-picker.vue 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-popup/props.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-popup/u-popup.vue 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio-group/props.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio/props.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio/u-radio.vue 339 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-rate/props.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-rate/u-rate.vue 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-read-more/props.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-read-more/u-read-more.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-row-notice/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-row/props.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-row/u-row.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-safe-bottom/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/nvue.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/other.js 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-search/props.js 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-search/u-search.vue 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-skeleton/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpother.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpwxs.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpwxs.wxs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/nvue - 副本.js 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/nvue.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/u-slider.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-status-bar/props.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps-item/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps/props.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps/u-steps.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-sticky/props.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-sticky/u-sticky.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-subsection/props.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-subsection/u-subsection.vue 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/index.wxs 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/nvue.js 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/props.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/wxs.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action/props.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper-indicator/props.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper/props.js 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper/u-swiper.vue 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-switch/props.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-switch/u-switch.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar-item/props.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar/props.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-table/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-table/u-table.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs-item/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs/props.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs/u-tabs.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tag/props.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tag/u-tag.vue 358 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-td/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-td/u-td.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/props.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/u-text.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/value.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-textarea/props.js 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-textarea/u-textarea.vue 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-toast/u-toast.vue 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-toolbar/props.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/clipboard.min.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/props.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tr/props.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-tr/u-tr.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/nvue.ani-map.js 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/props.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/transition.js 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/u-transition.vue 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/vue.ani-style.scss 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/mixin.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/props.js 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/u-upload.vue 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/utils.js 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/components/uview-ui/uview-ui.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/index.js 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/index.scss 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/color.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/config.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props.js 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/actionSheet.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/album.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/alert.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/avatar.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/avatarGroup.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/backtop.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/badge.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/button.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/calendar.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/carKeyboard.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/cell.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/cellGroup.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/checkbox.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/checkboxGroup.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/circleProgress.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/code.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/codeInput.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/col.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/collapse.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/collapseItem.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/columnNotice.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/countDown.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/countTo.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/datetimePicker.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/divider.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/empty.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/form.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/formItem.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/gap.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/grid.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/gridItem.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/icon.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/image.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/indexAnchor.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/indexList.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/input.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/keyboard.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/line.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/lineProgress.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/link.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/list.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/listItem.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadingIcon.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadingPage.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadmore.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/modal.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/navbar.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/noNetwork.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/noticeBar.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/notify.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/numberBox.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/numberKeyboard.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/overlay.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/parse.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/picker.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/popup.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/radio.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/radioGroup.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/rate.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/readMore.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/row.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/rowNotice.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/scrollList.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/search.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/section.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/skeleton.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/slider.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/statusBar.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/steps.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/stepsItem.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/sticky.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/subsection.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipeAction.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipeActionItem.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swiper.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipterIndicator.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/switch.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabbar.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabbarItem.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabs.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tag.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/text.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/textarea.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/toast.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/toolbar.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tooltip.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/transition.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/upload.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/config/zIndex.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/color.scss 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/common.scss 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/components.scss 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/flex.scss 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/h5.scss 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/mixin.scss 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/mp.scss 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/nvue.scss 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/css/vue.scss 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/colorGradient.js 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/debounce.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/digit.js 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/index.js 705 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/platform.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/test.js 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/function/throttle.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/adapters/index.js 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/Request.js 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/defaults.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/settle.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/index.d.ts 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/index.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/utils.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/utils/clone.js 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/button.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mixin.js 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mpMixin.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mpShare.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/openType.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/style.js 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/touch.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/util/async-validator.js 1343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/util/calendar.js 546 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/util/dayjs.js 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/util/emitter.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/libs/util/route.js 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/package.json 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/uni_modules/uview-ui/theme.scss 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/1024x1024.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/120x120.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/144x144.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/152x152.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/167x167.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/180x180.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/192x192.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/20x20.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/29x29.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/40x40.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/58x58.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/60x60.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/72x72.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/76x76.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/80x80.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/87x87.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/res/icons/96x96.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappchooselocation.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniapperror.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappes6.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappopenlocation.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniapppicker.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappquill.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappquillimageresize.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappscan.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappsuccess.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappview.html 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-config-service.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-config.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-service.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-view.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/manifest.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.css 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.woff 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.woff2 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/img/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/print/gbk.js 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/print/printerjobs.js 587 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/index.js 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/modules/color.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/modules/regexValidate.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/uni_modules/uview-ui/components/u-icon/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/view.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/view.umd.min.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PipeLineLems.PDA/.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
node_modules/
unpackage/release/apk/
unpackage/dist/dev/
unpackage/cache/
unpackage/dist/build/
package-lock.json
PipeLineLems.PDA/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
<script>
export default {
    onLaunch: function() {
        uni.getSystemInfo({
            success:(res=>{
                if (!res.safeAreaInsets) res.safeAreaInsets = {}
                if (!res.safeAreaInsets) res.safeArea = {}
                let safetySize = {
                    top:(res.safeAreaInsets.top || 0),
                    bottom:(res.safeAreaInsets.bottom || 0),
                    left:(res.safeAreaInsets.left || 0),
                    right:(res.safeAreaInsets.right || 0)
                }
                safetySize.height = res.safeArea.height || 0
                this.$store.commit('system/setSafety',safetySize)
            })
        })
        /* èŽ·å–å¹¶è®°å½•ç‰ˆæœ¬å· */
        try{
            plus.runtime.getProperty(plus.runtime.appid, (res)=>{
                this.$store.commit('system/setVersion',res.version)
            });
        }catch(e){
            //TODO handle the exception
        }
    },
    onShow: function() {
        console.log('App Show')
    },
    onHide: function() {
        console.log('App Hide')
    }
}
</script>
<style lang="scss">
@import "@/static/fonts/iconfont.css";
@import "@/uni_modules/uview-ui/index.scss";
.app-page {
    font-size: 28rpx;
    color: $uni-text-color;
    background-color: $uni-bg-color;
    box-sizing: border-box;
    overflow: hidden;
}
.auto-wrap{
    word-break:break-all;
    word-wrap:break-word;
}
.no-wrap,.ellipsis{
    white-space:nowrap;
}
.ellipsis{
    overflow:hidden;
    text-overflow:ellipsis;
}
.ml{
    margin-left: 12rpx;
}
.mr{
    margin-right: 12rpx;
}
.no-more-text-row{
    text-align: center;
    color: $uni-text-color-grey;
    padding: 4rpx 0;
}
.page-frame{
    position: relative;
    box-sizing: border-box;
    &.with-action-user-row{
            padding-top: 54rpx;;
    }
    .with-action-user-row-page-content{
        height: 100%;
        position: relative;
        box-sizing: border-box;
        overflow: auto;
    }
}
.link-text,.enable-input{
    color: $u-primary;
    text-decoration: underline;
}
</style>
PipeLineLems.PDA/README.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,519 @@
> ***<span style="color:#00008B;">如果有新增修改的通用内容,请在本文件上更新使用方法,并注明更新人、更新时间</span>***
> ***<span style="color:#00008B;">创建人:数瀛 é«˜çº§å‰ç«¯ éƒæ¬¢æ¬¢ï¼Œåˆ›å»ºæ—¶é—´ï¼š2022å¹´11月11日</span>***
> ***<span style="color:#00008B;">更新1:</span>***
> ***<span style="color:#00008B;">更新人:数瀛 é«˜çº§å‰ç«¯ éƒæ¬¢æ¬¢</span>***
> ***<span style="color:#00008B;">更新时间:2022å¹´11月25日</span>***
> ***<span style="color:#00008B;">更新内容:ajax调用,第三参数增加fullRes设置</span>***
> ***<span style="color:#00008B;">更新2:</span>***
> ***<span style="color:#00008B;">更新人:数瀛 é«˜çº§å‰ç«¯ éƒæ¬¢æ¬¢</span>***
> ***<span style="color:#00008B;">更新时间:2022å¹´11月30日</span>***
> ***<span style="color:#00008B;">更新内容:</span>***
>> ***<span style="color:#00008B;">config配置增加downUrl</span>***
>> ***<span style="color:#00008B;">utils增加parseDic方法、downloadApk方法</span>***
>> ***<span style="color:#00008B;">增加 ActionUserRow ç»„ä»¶</span>***
>> ***<span style="color:#00008B;">增加 ScanInputFormItem ç»„ä»¶</span>***
>> ***<span style="color:#00008B;">增加 EasySelectFormItem ç»„ä»¶</span>***
----
## ä½¿ç”¨ç«ç‹æµè§ˆå™¨FireFox阅读本文件
> ç«ç‹æµè§ˆå™¨å®‰è£…Markdown Viewer扩展组件,安装之后在浏览器的地址栏输入本文件的地址(可以是本地的文件地址,如D:\README.md),回车确认即可。
----
## ä½¿ç”¨æŠ€æœ¯æ¢³ç†
### ä¸€ã€uni-app,资料网站:<a href="https://uniapp.dcloud.net.cn/" target="_blank">https://uniapp.dcloud.net.cn/</a>
### äºŒã€VUE2,资料网站:<a href="https://v2.cn.vuejs.org/" target="_blank">https://v2.cn.vuejs.org/</a>
### ä¸‰ã€vuex,store全局数据,资料网站:<a href="https://v3.vuex.vuejs.org/zh/" target="_blank">https://v3.vuex.vuejs.org/zh/</a>
### å››ã€uview,ui库,资料网站:<a href="https://www.uviewui.com/components/intro.html" target="_blank">https://www.uviewui.com/components/intro.html</a>
### äº”、DCloud<a href="https://ext.dcloud.net.cn/" target="_blank">插件市场</a>,其中的绝大多数插件可以使用HbuilderX直接导入到项目中
> HbuilderX会将插件导入到项目的uni_modules文件夹下
> HbuilderX插件导入依赖uniModules核心插件,请先安装;若导入失败,很有可能是uniModules的版本问题,请卸载后再次安装后再导入。
> ä½¿ç”¨HbuilderX导入插件,请注意插件的平台支持以及vue语言版本
----
## å¼€å‘以及编译的工具和环境
### ä¸€ã€å¼€å‘工具HbuilderX,官网:<a href="https://www.dcloud.io/hbuilderx.html" target="_blank">https://www.dcloud.io/hbuilderx.html</a>,安装之后注意把一些常用插件也安装了。如何安装插件,官网有介绍。
### äºŒã€nodejs
#### 1、下载地址:<a href="https://nodejs.org/zh-cn/" target="_blank">https://nodejs.org/zh-cn/</a>
#### 2、安装之后的配置
> åœ¨nodejs的安装根目录下新建2个文件夹node_global和node_cache,然后以管理员身份打开命令行窗口(cmd)输入如下代码:
~~~
npm config set prefix "node_global文件夹地址"
npm config set cache "node_cache文件夹地址"
~~~
> çŽ¯å¢ƒå˜é‡è®¾ç½®ï¼ˆå¦‚ä½•æ‰“å¼€è®¡ç®—æœºçš„çŽ¯å¢ƒå˜é‡çª—å£ï¼Œè¿™é‡Œä¸ä½œé˜è¿°ï¼Œä¸çŸ¥é“çš„åŽ»é—®åº¦å¨˜ï¼‰ï¼š
>> NODE_PATH ç”¨æˆ·å˜é‡ï¼Œå€¼ä¸ºï¼šnodejs根目录\node_modules
>> Path ç³»ç»Ÿå˜é‡ï¼Œæ–°å¢ž2个属性:
>>> nodejs根目录\
>>> nodejs根目录\node_global
> cnpm镜像配置,输入如下命令:
~~~
npm install -g cnpm --registry=https://registry.npm.taobao.org
~~~
----
## é¡¹ç›®è¿è¡ŒåŠæ‰“包
### é¦–次安装
> åœ¨é¡¹ç›®çš„æ ¹ç›®å½•,输入命令
~~~
npm install æˆ–者 cnpm install
~~~
### æµè§ˆå™¨è¿è¡Œ
> HbuilderX打开项目,菜单栏 è¿è¡Œ > è¿è¡Œåˆ°æµè§ˆå™¨ > é€‰æ‹©æµè§ˆå™¨
> æµè§ˆå™¨æ‰“å¼€ å¼€å‘者工具 ï¼Œå°†æ˜¾ç¤ºæ¨¡å¼æ”¹ä¸º ç§»åŠ¨è®¾å¤‡ æ¨¡å¼
### çœŸæœºï¼ˆæ‰‹æœºæˆ–者pda)调式
> 1、使用数据线连接 å¼€å‘电脑 å’Œ çœŸæœº
> 2、真机的usb调试权限设置打开
> 3、确保 å¼€å‘电脑 å’Œ çœŸæœº å¤„于同一网络
> 4、HbuilderX打开项目,菜单栏 è¿è¡Œ > è¿è¡Œåˆ°æ‰‹æœºæˆ–模拟器 > é€‰æ‹©è°ƒè¯•真机
>> æ³¨æ„ï¼Œé¦–次运行的时候,HbuilderX会给真机安装调试app,需要在安装完成后再次运行
### äº‘打包
> 1、HbuilderX创建账号并登录
> 2、如果你的HbuilderX是首次对项目进行打包,需要获取下AppId,在manifest.json的基础设置中
<img src="./mdImgs/1664329468868.jpg" style="width:100%" />
> 3、应用图标:准备一张图片,最好是1024*1024像素的,在manifest.json的App图标设置中进行配置。
<img src="./mdImgs/1664329790970.jpg" style="width:100%" />
> 4、自动生成安装apk:菜单栏->发行->原生App云打包。云打包需要等待一段时间。
<img src="./mdImgs/1664330296712.png" style="width:100%" />
> 5、打包完成,apk在 unpackage\release\apk è·¯å¾„下自动生成
-----
## é¡¹ç›®ç›®å½•结构
> components è‡ªå¼€å‘的通用组件
> config é¡¹ç›®å‚数配置
> node_modules å®‰è£…的第三方代码或组件
> pages å¼€å‘页面的代码
> service å°è£…的服务代码
>> request æŽ¥å£è°ƒç”¨å°è£…
>> store vuex全局数据封装
> static é™æ€èµ„源
>> fonts å­—体样式库
>> img  æœ¬åœ°å›¾ç‰‡èµ„源
>> js  js资源
>>> print  è“ç‰™æ‰“印
>>> utils  å…¬ç”¨js代码
> uni_modules HbuilderX导入的第三方代码或组件
> unpackage HbuilderX打包自动生成的文件夹。HbuilderX自动生成的应用图片也是被保存在这里的。
----
## æŽ¥å£è°ƒç”¨
### 1、代码封装在 \service\request
### 2、使用
> å·²ç»åœ¨main.js中全局引入
~~~
this.$api
~~~
### 3、可以调用的方法
#### get、deletet、post、put,返回一个Promise,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,后端的方法名,必传
> ç¬¬äºŒä¸ªå‚数,json object,接口传参,没有后续参数的时候,可不传
> ç¬¬ä¸‰ä¸ªå‚数,string æˆ–者 json object,接口调用配置设置,没有后续参数的时候,可不传
>> string时,即json object结构的block值
>> json object时的结构
>>> warn: boolean,出错时是否提示错误信息,可不设置,默认true
>>> host:string,接口地址的域名名称,对应config配置中ajax的host,可不设置,默认default
>>> block:string,接口地址的模块名称,对应config配置中ajax的block,可不设置,默认default
>>> needToken: boolean,headers是否传入token,可不设置,默认true
>>> loading: boolean,接口调用过程中是否开启全屏loading,可不设置,默认true
>>> fullRes: boolean,接口返回是否将后端的整个结构体返回,可不设置,默认false(只返回结构体的data)(更新1)
#### post、put,参数:
> ç¬¬å››ä¸ªå‚数,json object,post和put以get传参方式传递的参数,可不传
#### base,返回一个Promise,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,get、deletet、post、put中的一个,必传
> åŽç»­å‚数,沿用 get、deletet、post、put å„自的方法
#### getHeaders,获取项目中的headers配置,参数
> ç¬¬ä¸€ä¸ªå‚数,json object,可不传,结构如下
>> needToken: boolean,headers是否传入token,可不设置,默认true
> ç¬¬äºŒä¸ªå‚数,json object,原有的headers,可不传
> è¿”回一个json object,结构如下
>> flag: boolean,设置headers是否通过
>> headers: json object,项目配置后的headers
#### getUrl,返回string,一个完整的url,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,后端的方法名,必传
> ç¬¬äºŒä¸ªå‚数,string æˆ–者 json object,接口调用配置设置,没有后续参数的时候,可不传
>> string时,即json object结构的block值
>> json object时的结构
>>> host:string,接口地址的域名名称,对应config配置中ajax的host,可不设置,默认default
>>> block:string,接口地址的模块名称,对应config配置中ajax的block,可不设置,默认default
----
## config相关
### é…ç½®è¯´æ˜Ž
> ajax,接口调用相关配置
>> errMsg,string,接口调用出错后的默认提示信息
>> host,json object,接口调用域名配置
>>> default,string,默认域名
>> block,json object,接口调用模块配置
>>> default,string,默认模块
> pagination,json object,分页相关
> path,json object,页面路径,关联pages.json,页面跳转的时候使用此处的配置,便于维护
> downUrl,string,版本更新下载地址配置(更新2)
### å¼€å‘使用
> å·²ç»åœ¨main.js中全局引入
~~~
this.$config
~~~
-----
## utils相关
### ä½¿ç”¨èŒƒä¾‹
~~~
import { $alert } from '@/static/js/utils'
~~~
### utils说明
> $successInfo,Function类型,成功信息提示,参数:
>> ç¬¬ä¸€ä¸ªå‚数, string, æˆåŠŸæç¤ºä¿¡æ¯ï¼Œ å¿…传,文字尽量精简,因为只支持单行显示
> $alert,Function类型,弹出一个信息提示窗口,参数:
>> ç¬¬ä¸€ä¸ªå‚数, string, æç¤ºä¿¡æ¯ï¼Œ å¿…ä¼ 
>> ç¬¬äºŒä¸ªå‚数, string, å¼¹çª—标题,可不传,默认“系统提示”
>> ç¬¬ä¸‰ä¸ªå‚数, Function, ç‚¹å‡»ç¡®è®¤çš„回调方法, å¯ä¸ä¼ 
> color,json对象类型,颜色处理相关
>> getRandomHexColor,Function类型,返回一个16进制的颜色值
> regexValidate,json对象类型,正则校验
> uuid,Function类型,创建一个随机码,参数:
>> ç¬¬ä¸€ä¸ªå‚数, number, éšæœºç é•¿åº¦ï¼Œ é»˜è®¤6
>> ç¬¬äºŒä¸ªå‚数, number, éšæœºç ç»„合方式,默认0:
>>> 0:大小写字母+数字
>>> 1:小写字母+数字
>>> 2:纯数字
>>> 3:大小写字母
>>> 4:小写字母
> parseDic,Function类型,解析数据字典(更新2):
>> ç¬¬ä¸€ä¸ªå‚数, Object, vuex的store对象, åœ¨vue文件中为this.$store
>> ç¬¬äºŒä¸ªå‚数, string, å­—典集合码
>> ç¬¬ä¸‰ä¸ªå‚数, string/number, å­—典值
>> è¿”回, string, å­—典值对应名称
> downloadApk,Function类型,新版本下载的方法(更新2):
>> ç¬¬ä¸€ä¸ªå‚数, Object, config对象, åœ¨vue文件中为this.$config
-----
## æˆ‘们自己开发的组件说明
###  ä¸€ã€PageHeader组件,这个是HeaderPageLayout组件的内置组件,不做详细说明
###  äºŒã€FullPageLayout组件,页面外层组件,通常使用在页面的最外层
#### ç»„件属性:
> gradient,boolean,底色渐变,即是否设置css的background-image属性,默认false
> gradient-value,string,底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> background-color,string,底色,在gradient为false的时候才生效,默认不设置,即透明
> safety,boolean,安全区,页面内容显示的时候,是否将安全区排除,默认true,即排除安全区
> full,boolean,是否整屏,默认true,如果组件不是用在页面的最外层,应该设置为false,这时候组件的宽高为父容器的100%
> base-background-color,string,基础底色,页面底色外层的颜色,当有安全区的时候,安全区的颜色为此颜色。默认不设置,即透明,这时候显示的颜色会是uni-app中设置的颜色
#### ç»„件插槽:
> default,默认插槽,页面body内容
### ä¸‰ã€HeaderPageLayout组件,带有头部布局的页面外层组件,通常使用在页面的最外层
#### ç»„件属性:
> gradient,boolean,页面body部分底色渐变,即是否设置css的background-image属性,默认false
> gradient-value,string,页面body部分底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> background-color,string,页面body部分底色,在gradient为false的时候才生效,默认不设置,即透明
> base-background-color,string,基础底色,页面底色外层的颜色,当有安全区的时候,安全区的颜色为此颜色。当不设置头部底色的时候,头部的底色也为此颜色。默认不设置,即透明,这时候显示的颜色会是uni-app中设置的颜色
> safety,boolean,安全区,页面内容显示的时候,是否将安全区排除,默认true,即排除安全区
> full,boolean,是否整屏,默认true,如果组件不是用在页面的最外层,应该设置为false,这时候组件的宽高为父容器的100%
> title,string,头部标题,默认“Title”
> header-color,string,头部文字颜色,默认“#212121”
> header-gradient,boolean,头部底色渐变,即是否设置css的background-image属性,默认false
> header-gradient-value,string,头部底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> header-background-color,string,底色,在header-gradient为false的时候才生效,默认不设置,即透明
#### ç»„件插槽:
> default,默认插槽,页面body内容
> footer,页脚插槽,页面底部内容
> headerleft,页面标题栏左侧内容
> headerright,页面标题栏右侧内容
### ç»„件事件:
> headerclick,标题栏左右两侧的点击事件
>> ç¬¬ä¸€ä¸ªå‚数,值为“left”,表示左侧的点击,值为“right”,表示右侧的点击
### ç»„件方法:
> getBodyHeight,返回组件body的高度,number类型,单位px。
>> æä¾›æ­¤æ–¹æ³•的原因在于uni-app使用flex布局的时候,app应用在flex标签容器内部flex-grow(flex)的自适应标签中的标签,无法通过%设置高度。
>> è€Œæœ¬ç»„件使用了flex布局,组件的body部分使用的就是flex-grow自适应
### å››ã€DefaultHeaderPageLayout组件,默认的带有标题栏的页面外层组件,通常使用在登录之后页面的最外层
#### ç»„件属性:
> title,string,头部标题,默认“Title”
> back-custom,boolean,是否开启返回事件自定义,默认false不开启
#### ç»„件事件:
> back,自定义返回事件
#### ç»„件插槽:
> default,默认插槽,页面body内容
> footer,页脚插槽,页面底部内容
### ç»„件方法:
> getBodyHeight,同HeaderPageLayout组件
### äº”、EasyPicker,简易的单选选择器
#### ç»„件属性:
> visible,boolean,是否显示,默认false   å¯ç”¨è¯­æ³•ç³–.sync
> list,Array,选择项数据
> value-field,string,选项value字段,默认“value”
> label-field,string,选项显示label字段,默认“label”
#### ç»„件事件:
> select,选择事件,返回:
>> ç¬¬ä¸€ä¸ªå‚数:选中项的value值
>> ç¬¬äºŒä¸ªå‚数,整个选中项
>> ç¬¬ä¸‰ä¸ªå‚数,选中项在选项中的位置
### å…­ã€ActionUserRow组件,显示操作员(更新2)
### ä¸ƒã€ScanInputFormItem组件,扫码输入表单(更新2)
#### ç»„件属性:
> type,string,输入框type,可选值:number、idcard、digit、password、text,默认“text”
> placeholder,string,空置占位文字,默认“请输入...”
> label,string,标签名称,默认空字符串
> msg,string,提示信息,默认空字符串
> msg-type,string,提示信息类型,可选值:error(错误信息,红色)、info(常规信息,蓝色),默认“error”
> value/v-model,string/number/null
> has-search,boolean,是否显示搜索按钮,默认false不显示
> disabled,boolean,是否禁用,默认false不禁用
#### ç»„件事件:
> search,搜索按钮点击事件
> clear,清除icon点击事件
### å…«ã€EasySelectFormItem组件,单选下拉表单(更新2)
#### ç»„件属性:
> placeholder,string,空置占位文字,默认“请输入...”
> label,string,标签名称,默认空字符串
> msg,string,提示信息,默认空字符串
> msg-type,string,提示信息类型,可选值:error(错误信息,红色)、info(常规信息,蓝色),默认“error”
> value/v-model,string/number/boolean/null
> list,Array,选择项数据
> value-field,string,选项value字段,默认“value”
> label-field,string,选项显示label字段,默认“label”
> disabled,boolean,是否禁用,默认false不禁用
#### ç»„件事件:
> select,选项点击事件
> clear,清除icon点击事件
-----
## è“ç‰™æ‰“印使用
### èŒƒä¾‹
~~~
import BluePrint from '@/pages/print/bluePrint.js'
const onPrint = function(){
    let ptintContext = [
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
        {type:'text',x:230,y:10,text:'PART:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:10,text:'HFAHFOAJFOAJFO',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:230,y:95,text:'NAME:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:95,text:'SAHFAKHFKAHFKANFK',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:230,y:180,text:'LOTS:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:180,text:'LOTSLOTSLOTSLOTSLOTS',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:13,y:250,text:'SIZE:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:83,y:250,text:'SIZESIZESIZESIZESIZESIZESIZESIZE',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:105,y:315,text:'MAKINO J(CHINA) CO.LTD',size:3,rotate:0,bold:0,underline:false,reverse:false},
        {type:'qr',x:10,y:10,text:'asndkajdkjalda-barcode',width:8,level:1}
    ]
    BluePrint.print(this.$store,ptintContext).then(()=>{
        console.log('print成功调用')
    }).catch(()=>{
        console.log('print调用出错')
    })
}
~~~
### æ‰“印数据字段说明
> type,string,可选值:(line)直线、(text)文字、(qr)二维码、(bar)条形码
> x,number,打印文字、二维码、条形码时候,起始点横坐标
> y,number,打印文字、二维码、条形码时候,起始点纵坐标
> x1,number,打印直线时候,起始点横坐标
> y1,number,打印直线时候,起始点纵坐标
> x2,number,打印直线时候,结束点横坐标
> y2,number,打印直线时候,结束点纵坐标
> text,string,打印文字、二维码、条形码时候,打印内容
> size,number,打印文字时的字体大小,可选值 20/1/2/3/4/5/6/7 ï¼Œå…¶ä»–的时候默认为2
> width,number
>> æ‰“印直线,表示线宽
>> æ‰“印二维码,表示二维码刻度值,不是生成的二维码的宽度,取值(2到15)
>> æ‰“印条形码,表示条形码刻度值,不是生成的条形码的宽度,取值(2到6)
> level,number,打印二维码时候,纠错等级,取值(0到20)
> height,number,打印条形码时候,高度,取值(1到255)
> barType,number,打印条形码时候,条形码类型,可选值:
>> 0:CODE39;
>> 1:CODE128;
>> 2:CODE93;
>> 3:CODEBAR;
>> 4:EAN8;
>> 5:EAN13;
>> 6:UPCA;
>> 7:UPC-E;
>> 8:ITF
> rotate,number,打印文字时候,选择角度
> bold,number,打印文字时候,是否加粗(0否1是)
> underline,boolean,打印文字时候,下划线设置
> reverse,boolean,打印文字时候,反转设置
-------
## é¡µé¢è¯´æ˜Ž
### /pages/start/index
> å¯åŠ¨é¡µï¼Œæ ¹æ®é¡¹ç›®éœ€æ±‚è°ƒæ•´
### /pages/login/index
> ç™»å½•页,一般不会大改动了,根据项目需求做微调
### /pages/home/index
> ç™»å½•后的首页,根据项目需求,很可能做局部调整
### /pages/baseTask/out
> å…¥åº“页面,根据项目需求调整
### /pages/baseTask/out
> å‡ºåº“页面,根据项目需求调整
### /pages/print/bluetoothConnection
> ç‰©èš‚蚁蓝牙打印机,蓝牙连接页面,几乎无需改动
### /pages/setting/host
> åŽç«¯æŽ¥å£è°ƒç”¨åŸŸåè®¾ç½®é¡µé¢ï¼Œå‡ ä¹Žæ— éœ€æ”¹åЍ
-----
## json-server  å‰ç«¯æ•°æ®moke
### å¯åŠ¨é…ç½®ï¼Œå¦‚å›¾åœ¨package.json中,然后命令行运行
~~~
npm run api
~~~
> --port 3012  ç«¯å£å·è®¾ç½®ä¸º3012
> --host 0.0.0.0  å¼€å¯ip地址访问
<img src="./mdImgs/1665970038354.jpg" style="width:100%" />
###  RESET Api
> GET /demo  èŽ·å–å…¨éƒ¨åˆ—è¡¨
> GET /demo/数据id   èŽ·å–è¯¦æƒ…
> POST  /demo   å¢žåŠ 
> PUT  /demo/数据id  æ•´æ¡æ•°æ®æ›¿æ¢
> PATCH  /demo/数据id   ä¿®æ”¹æŸä¸ªå­—段
> DELETE /demo/数据id  åˆ é™¤
###  æ¡ä»¶æŸ¥è¯¢å’Œåˆ†é¡µæŸ¥è¯¢
#### æ¡ä»¶æŸ¥è¯¢ï¼Œå­—段名称后增加
> _gte å¤§äºŽç­‰äºŽ
> _lte å°äºŽç­‰äºŽ
> _ne  ä¸ç­‰äºŽ
> _like  åŒ…含
#### åˆ†é¡µæŸ¥è¯¢
> _page  é¡µç ï¼Œä»Ž1开始
> _limit æ¯é¡µå¤šå°‘条数据
> _start æ•°æ®ç´¢å¼•开始,从0开始
> _end æ•°æ®ç´¢å¼•结束,不包含end索引
案例:GET模糊查找字段name
~~~
/demo?name_like=value
~~~
-------
## æ–°å»ºé¡µé¢æ­¥éª¤
#### 1、配置pages.json
#### 2、配置config/index.js中的path
#### 3、首页配置页面入口(根据需要)
## å¼¹æ¡†ä¸­å¸¦æ¨¡ç³ŠæŸ¥è¯¢
<selectItem
    :selectData="placeList"
    :value.sync="form.placeNo"
    label="库位编号"
    labelField="placeNo"
    valueField="placeNo"
    @getCurrentData="getCurrentData"
    :isShowSearch="true"
/>
import selectItem from "@/components/selectItemWithSearch.vue";
import { palceList } from "@/service/mixins/mixins.js";
mixins: [palceList],
    //库位模糊查询
async getCurrentData(PlaceNo) {
    await this.getPalceList({
    areaCode: this.form.areaNo,
    PlaceNo: PlaceNo,
    });
},
## å¼¹æ¡†ä¸­å¸¦æ¨¡ç³ŠæŸ¥è¯¢
PipeLineLems.PDA/README_multiple_api.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,480 @@
> ***<span style="color:#00008B;">如果有新增修改的通用内容,请在本文件上更新使用方法,并注明更新人、更新时间</span>***
> ***<span style="color:#00008B;">创建人:数瀛 é«˜çº§å‰ç«¯ éƒæ¬¢æ¬¢ï¼Œåˆ›å»ºæ—¶é—´ï¼š2022å¹´3月16日</span>***
----
## ä½¿ç”¨ç«ç‹æµè§ˆå™¨FireFox阅读本文件
> ç«ç‹æµè§ˆå™¨å®‰è£…Markdown Viewer扩展组件,安装之后在浏览器的地址栏输入本文件的地址(可以是本地的文件地址,如D:\README.md),回车确认即可。
----
## ä½¿ç”¨æŠ€æœ¯æ¢³ç†
### ä¸€ã€uni-app,资料网站:<a href="https://uniapp.dcloud.net.cn/" target="_blank">https://uniapp.dcloud.net.cn/</a>
### äºŒã€VUE2,资料网站:<a href="https://v2.cn.vuejs.org/" target="_blank">https://v2.cn.vuejs.org/</a>
### ä¸‰ã€vuex,store全局数据,资料网站:<a href="https://v3.vuex.vuejs.org/zh/" target="_blank">https://v3.vuex.vuejs.org/zh/</a>
### å››ã€uview,ui库,资料网站:<a href="https://www.uviewui.com/components/intro.html" target="_blank">https://www.uviewui.com/components/intro.html</a>
### äº”、DCloud<a href="https://ext.dcloud.net.cn/" target="_blank">插件市场</a>,其中的绝大多数插件可以使用HbuilderX直接导入到项目中
> HbuilderX会将插件导入到项目的uni_modules文件夹下
> HbuilderX插件导入依赖uniModules核心插件,请先安装;若导入失败,很有可能是uniModules的版本问题,请卸载后再次安装后再导入。
> ä½¿ç”¨HbuilderX导入插件,请注意插件的平台支持以及vue语言版本
----
## å¼€å‘以及编译的工具和环境
### ä¸€ã€å¼€å‘工具HbuilderX,官网:<a href="https://www.dcloud.io/hbuilderx.html" target="_blank">https://www.dcloud.io/hbuilderx.html</a>,安装之后注意把一些常用插件也安装了。如何安装插件,官网有介绍。
### äºŒã€nodejs
#### 1、下载地址:<a href="https://nodejs.org/zh-cn/" target="_blank">https://nodejs.org/zh-cn/</a>
#### 2、安装之后的配置
> åœ¨nodejs的安装根目录下新建2个文件夹node_global和node_cache,然后以管理员身份打开命令行窗口(cmd)输入如下代码:
~~~
npm config set prefix "node_global文件夹地址"
npm config set cache "node_cache文件夹地址"
~~~
> çŽ¯å¢ƒå˜é‡è®¾ç½®ï¼ˆå¦‚ä½•æ‰“å¼€è®¡ç®—æœºçš„çŽ¯å¢ƒå˜é‡çª—å£ï¼Œè¿™é‡Œä¸ä½œé˜è¿°ï¼Œä¸çŸ¥é“çš„åŽ»é—®åº¦å¨˜ï¼‰ï¼š
>> NODE_PATH ç”¨æˆ·å˜é‡ï¼Œå€¼ä¸ºï¼šnodejs根目录\node_modules
>> Path ç³»ç»Ÿå˜é‡ï¼Œæ–°å¢ž2个属性:
>>> nodejs根目录\
>>> nodejs根目录\node_global
> cnpm镜像配置,输入如下命令:
~~~
npm install -g cnpm --registry=https://registry.npm.taobao.org
~~~
----
## é¡¹ç›®è¿è¡ŒåŠæ‰“包
### é¦–次安装
> åœ¨é¡¹ç›®çš„æ ¹ç›®å½•,输入命令
~~~
npm install æˆ–者 cnpm install
~~~
### æµè§ˆå™¨è¿è¡Œ
> HbuilderX打开项目,菜单栏 è¿è¡Œ > è¿è¡Œåˆ°æµè§ˆå™¨ > é€‰æ‹©æµè§ˆå™¨
> æµè§ˆå™¨æ‰“å¼€ å¼€å‘者工具 ï¼Œå°†æ˜¾ç¤ºæ¨¡å¼æ”¹ä¸º ç§»åŠ¨è®¾å¤‡ æ¨¡å¼
### çœŸæœºï¼ˆæ‰‹æœºæˆ–者pda)调式
> 1、使用数据线连接 å¼€å‘电脑 å’Œ çœŸæœº
> 2、真机的usb调试权限设置打开
> 3、确保 å¼€å‘电脑 å’Œ çœŸæœº å¤„于同一网络
> 4、HbuilderX打开项目,菜单栏 è¿è¡Œ > è¿è¡Œåˆ°æ‰‹æœºæˆ–模拟器 > é€‰æ‹©è°ƒè¯•真机
>> æ³¨æ„ï¼Œé¦–次运行的时候,HbuilderX会给真机安装调试app,需要在安装完成后再次运行
### äº‘打包
> 1、HbuilderX创建账号并登录
> 2、如果你的HbuilderX是首次对项目进行打包,需要获取下AppId,在manifest.json的基础设置中
<img src="./mdImgs/1664329468868.jpg" style="width:100%" />
> 3、应用图标:准备一张图片,最好是1024*1024像素的,在manifest.json的App图标设置中进行配置。
<img src="./mdImgs/1664329790970.jpg" style="width:100%" />
> 4、自动生成安装apk:菜单栏->发行->原生App云打包。云打包需要等待一段时间。
<img src="./mdImgs/1664330296712.png" style="width:100%" />
> 5、打包完成,apk在 unpackage\release\apk è·¯å¾„下自动生成
-----
## é¡¹ç›®ç›®å½•结构
> components è‡ªå¼€å‘的通用组件
> config é¡¹ç›®å‚数配置
> node_modules å®‰è£…的第三方代码或组件
> pages å¼€å‘页面的代码
> service å°è£…的服务代码
>> request æŽ¥å£è°ƒç”¨å°è£…
>> store vuex全局数据封装
> static é™æ€èµ„源
>> fonts å­—体样式库
>> img  æœ¬åœ°å›¾ç‰‡èµ„源
>> js  js资源
>>> print  è“ç‰™æ‰“印
>>> utils  å…¬ç”¨js代码
> uni_modules HbuilderX导入的第三方代码或组件
> unpackage HbuilderX打包自动生成的文件夹。HbuilderX自动生成的应用图片也是被保存在这里的。
----
## æŽ¥å£è°ƒç”¨
### 1、代码封装在 \service\request
### 2、使用
> å·²ç»åœ¨main.js中全局引入
~~~
this.$api
~~~
### 3、可以调用的方法
#### get、deletet、post、put,返回一个Promise,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,后端的方法名,必传
> ç¬¬äºŒä¸ªå‚数,json object,接口传参,没有后续参数的时候,可不传
> ç¬¬ä¸‰ä¸ªå‚数,string æˆ–者 json object,接口调用配置设置,没有后续参数的时候,可不传
>> string时,即json object结构的block值
>> json object时的结构
>>> warn: boolean,出错时是否提示错误信息,可不设置,默认true
>>> host:string,接口地址的域名名称,对应config配置中ajax的host,可不设置,默认default
>>> block:string,接口地址的模块名称,对应config配置中ajax的block,可不设置,默认default
>>> needToken: boolean,headers是否传入token,可不设置,默认true
>>> loading: boolean,接口调用过程中是否开启全屏loading,可不设置,默认true
>>> fullRes: boolean,接口返回是否将后端的整个结构体返回,可不设置,默认false(只返回结构体的data)(更新1)
#### post、put,参数:
> ç¬¬å››ä¸ªå‚数,json object,post和put以get传参方式传递的参数,可不传
#### base,返回一个Promise,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,get、deletet、post、put中的一个,必传
> åŽç»­å‚数,沿用 get、deletet、post、put å„自的方法
#### getHeaders,获取项目中的headers配置,参数
> ç¬¬ä¸€ä¸ªå‚数,json object,可不传,结构如下
>> needToken: boolean,headers是否传入token,可不设置,默认true
> ç¬¬äºŒä¸ªå‚数,json object,原有的headers,可不传
> è¿”回一个json object,结构如下
>> flag: boolean,设置headers是否通过
>> headers: json object,项目配置后的headers
#### getUrl,返回string,一个完整的url,参数:
> ç¬¬ä¸€ä¸ªå‚数,string,后端的方法名,必传
> ç¬¬äºŒä¸ªå‚数,string æˆ–者 json object,接口调用配置设置,没有后续参数的时候,可不传
>> string时,即json object结构的block值
>> json object时的结构
>>> host:string,接口地址的域名名称,对应config配置中ajax的host,可不设置,默认default
>>> block:string,接口地址的模块名称,对应config配置中ajax的block,可不设置,默认default
----
## config相关
### é…ç½®è¯´æ˜Ž
> ajax,接口调用相关配置
>> errMsg,string,接口调用出错后的默认提示信息
>> host,json object,接口调用域名配置
>>> default,string,默认域名
>> block,json object,接口调用模块配置
>>> default,string,默认模块
> pagination,json object,分页相关
> path,json object,页面路径,关联pages.json,页面跳转的时候使用此处的配置,便于维护
> downUrl,string,版本更新下载地址配置(更新2)
### å¼€å‘使用
> å·²ç»åœ¨main.js中全局引入
~~~
this.$config
~~~
-----
## utils相关
### ä½¿ç”¨èŒƒä¾‹
~~~
import { $alert } from '@/static/js/utils'
~~~
### utils说明
> $successInfo,Function类型,成功信息提示,参数:
>> ç¬¬ä¸€ä¸ªå‚数, string, æˆåŠŸæç¤ºä¿¡æ¯ï¼Œ å¿…传,文字尽量精简,因为只支持单行显示
> $alert,Function类型,弹出一个信息提示窗口,参数:
>> ç¬¬ä¸€ä¸ªå‚数, string, æç¤ºä¿¡æ¯ï¼Œ å¿…ä¼ 
>> ç¬¬äºŒä¸ªå‚数, string, å¼¹çª—标题,可不传,默认“系统提示”
>> ç¬¬ä¸‰ä¸ªå‚数, Function, ç‚¹å‡»ç¡®è®¤çš„回调方法, å¯ä¸ä¼ 
> color,json对象类型,颜色处理相关
>> getRandomHexColor,Function类型,返回一个16进制的颜色值
> regexValidate,json对象类型,正则校验
> uuid,Function类型,创建一个随机码,参数:
>> ç¬¬ä¸€ä¸ªå‚数, number, éšæœºç é•¿åº¦ï¼Œ é»˜è®¤6
>> ç¬¬äºŒä¸ªå‚数, number, éšæœºç ç»„合方式,默认0:
>>> 0:大小写字母+数字
>>> 1:小写字母+数字
>>> 2:纯数字
>>> 3:大小写字母
>>> 4:小写字母
> parseDic,Function类型,解析数据字典(更新2):
>> ç¬¬ä¸€ä¸ªå‚数, Object, vuex的store对象, åœ¨vue文件中为this.$store
>> ç¬¬äºŒä¸ªå‚数, string, å­—典集合码
>> ç¬¬ä¸‰ä¸ªå‚数, string/number, å­—典值
>> è¿”回, string, å­—典值对应名称
> downloadApk,Function类型,新版本下载的方法(更新2):
>> ç¬¬ä¸€ä¸ªå‚数, Object, config对象, åœ¨vue文件中为this.$config
-----
## æˆ‘们自己开发的组件说明
###  ä¸€ã€PageHeader组件,这个是HeaderPageLayout组件的内置组件,不做详细说明
###  äºŒã€FullPageLayout组件,页面外层组件,通常使用在页面的最外层
#### ç»„件属性:
> gradient,boolean,底色渐变,即是否设置css的background-image属性,默认false
> gradient-value,string,底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> background-color,string,底色,在gradient为false的时候才生效,默认不设置,即透明
> safety,boolean,安全区,页面内容显示的时候,是否将安全区排除,默认true,即排除安全区
> full,boolean,是否整屏,默认true,如果组件不是用在页面的最外层,应该设置为false,这时候组件的宽高为父容器的100%
> base-background-color,string,基础底色,页面底色外层的颜色,当有安全区的时候,安全区的颜色为此颜色。默认不设置,即透明,这时候显示的颜色会是uni-app中设置的颜色
#### ç»„件插槽:
> default,默认插槽,页面body内容
### ä¸‰ã€HeaderPageLayout组件,带有头部布局的页面外层组件,通常使用在页面的最外层
#### ç»„件属性:
> gradient,boolean,页面body部分底色渐变,即是否设置css的background-image属性,默认false
> gradient-value,string,页面body部分底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> background-color,string,页面body部分底色,在gradient为false的时候才生效,默认不设置,即透明
> base-background-color,string,基础底色,页面底色外层的颜色,当有安全区的时候,安全区的颜色为此颜色。当不设置头部底色的时候,头部的底色也为此颜色。默认不设置,即透明,这时候显示的颜色会是uni-app中设置的颜色
> safety,boolean,安全区,页面内容显示的时候,是否将安全区排除,默认true,即排除安全区
> full,boolean,是否整屏,默认true,如果组件不是用在页面的最外层,应该设置为false,这时候组件的宽高为父容器的100%
> title,string,头部标题,默认“Title”
> header-color,string,头部文字颜色,默认“#212121”
> header-gradient,boolean,头部底色渐变,即是否设置css的background-image属性,默认false
> header-gradient-value,string,头部底色渐变值,即css的background-image属性的值,默认不设置,采用默认渐变色
> header-background-color,string,底色,在header-gradient为false的时候才生效,默认不设置,即透明
#### ç»„件插槽:
> default,默认插槽,页面body内容
> footer,页脚插槽,页面底部内容
> headerleft,页面标题栏左侧内容
> headerright,页面标题栏右侧内容
### ç»„件事件:
> headerclick,标题栏左右两侧的点击事件
>> ç¬¬ä¸€ä¸ªå‚数,值为“left”,表示左侧的点击,值为“right”,表示右侧的点击
### ç»„件方法:
> getBodyHeight,返回组件body的高度,number类型,单位px。
>> æä¾›æ­¤æ–¹æ³•的原因在于uni-app使用flex布局的时候,app应用在flex标签容器内部flex-grow(flex)的自适应标签中的标签,无法通过%设置高度。
>> è€Œæœ¬ç»„件使用了flex布局,组件的body部分使用的就是flex-grow自适应
### å››ã€DefaultHeaderPageLayout组件,默认的带有标题栏的页面外层组件,通常使用在登录之后页面的最外层
#### ç»„件属性:
> title,string,头部标题,默认“Title”
> back-custom,boolean,是否开启返回事件自定义,默认false不开启
#### ç»„件事件:
> back,自定义返回事件
#### ç»„件插槽:
> default,默认插槽,页面body内容
> footer,页脚插槽,页面底部内容
### ç»„件方法:
> getBodyHeight,同HeaderPageLayout组件
### äº”、EasyPicker,简易的单选选择器
#### ç»„件属性:
> visible,boolean,是否显示,默认false   å¯ç”¨è¯­æ³•ç³–.sync
> list,Array,选择项数据
> value-field,string,选项value字段,默认“value”
> label-field,string,选项显示label字段,默认“label”
#### ç»„件事件:
> select,选择事件,返回:
>> ç¬¬ä¸€ä¸ªå‚数:选中项的value值
>> ç¬¬äºŒä¸ªå‚数,整个选中项
>> ç¬¬ä¸‰ä¸ªå‚数,选中项在选项中的位置
### å…­ã€ActionUserRow组件,显示操作员(更新2)
### ä¸ƒã€ScanInputFormItem组件,扫码输入表单(更新2)
#### ç»„件属性:
> type,string,输入框type,可选值:number、idcard、digit、password、text,默认“text”
> placeholder,string,空置占位文字,默认“请输入...”
> label,string,标签名称,默认空字符串
> msg,string,提示信息,默认空字符串
> msg-type,string,提示信息类型,可选值:error(错误信息,红色)、info(常规信息,蓝色),默认“error”
> value/v-model,string/number/null
> has-search,boolean,是否显示搜索按钮,默认false不显示
> disabled,boolean,是否禁用,默认false不禁用
#### ç»„件事件:
> search,搜索按钮点击事件
> clear,清除icon点击事件
### å…«ã€EasySelectFormItem组件,单选下拉表单(更新2)
#### ç»„件属性:
> placeholder,string,空置占位文字,默认“请输入...”
> label,string,标签名称,默认空字符串
> msg,string,提示信息,默认空字符串
> msg-type,string,提示信息类型,可选值:error(错误信息,红色)、info(常规信息,蓝色),默认“error”
> value/v-model,string/number/boolean/null
> list,Array,选择项数据
> value-field,string,选项value字段,默认“value”
> label-field,string,选项显示label字段,默认“label”
> disabled,boolean,是否禁用,默认false不禁用
#### ç»„件事件:
> select,选项点击事件
> clear,清除icon点击事件
-----
## è“ç‰™æ‰“印使用
### èŒƒä¾‹
~~~
import BluePrint from '@/pages/print/bluePrint.js'
const onPrint = function(){
    let ptintContext = [
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
        /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
        {type:'text',x:230,y:10,text:'PART:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:10,text:'HFAHFOAJFOAJFO',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:230,y:95,text:'NAME:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:95,text:'SAHFAKHFKAHFKANFK',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:230,y:180,text:'LOTS:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:300,y:180,text:'LOTSLOTSLOTSLOTSLOTS',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:13,y:250,text:'SIZE:',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:83,y:250,text:'SIZESIZESIZESIZESIZESIZESIZESIZE',size:2,rotate:0,bold:0,underline:false,reverse:false},
        {type:'text',x:105,y:315,text:'MAKINO J(CHINA) CO.LTD',size:3,rotate:0,bold:0,underline:false,reverse:false},
        {type:'qr',x:10,y:10,text:'asndkajdkjalda-barcode',width:8,level:1}
    ]
    BluePrint.print(this.$store,ptintContext).then(()=>{
        console.log('print成功调用')
    }).catch(()=>{
        console.log('print调用出错')
    })
}
~~~
### æ‰“印数据字段说明
> type,string,可选值:(line)直线、(text)文字、(qr)二维码、(bar)条形码
> x,number,打印文字、二维码、条形码时候,起始点横坐标
> y,number,打印文字、二维码、条形码时候,起始点纵坐标
> x1,number,打印直线时候,起始点横坐标
> y1,number,打印直线时候,起始点纵坐标
> x2,number,打印直线时候,结束点横坐标
> y2,number,打印直线时候,结束点纵坐标
> text,string,打印文字、二维码、条形码时候,打印内容
> size,number,打印文字时的字体大小,可选值 20/1/2/3/4/5/6/7 ï¼Œå…¶ä»–的时候默认为2
> width,number
>> æ‰“印直线,表示线宽
>> æ‰“印二维码,表示二维码刻度值,不是生成的二维码的宽度,取值(2到15)
>> æ‰“印条形码,表示条形码刻度值,不是生成的条形码的宽度,取值(2到6)
> level,number,打印二维码时候,纠错等级,取值(0到20)
> height,number,打印条形码时候,高度,取值(1到255)
> barType,number,打印条形码时候,条形码类型,可选值:
>> 0:CODE39;
>> 1:CODE128;
>> 2:CODE93;
>> 3:CODEBAR;
>> 4:EAN8;
>> 5:EAN13;
>> 6:UPCA;
>> 7:UPC-E;
>> 8:ITF
> rotate,number,打印文字时候,选择角度
> bold,number,打印文字时候,是否加粗(0否1是)
> underline,boolean,打印文字时候,下划线设置
> reverse,boolean,打印文字时候,反转设置
-------
## é¡µé¢è¯´æ˜Ž
### /pages/start/index
> å¯åŠ¨é¡µï¼Œæ ¹æ®é¡¹ç›®éœ€æ±‚è°ƒæ•´
### /pages/login/index
> ç™»å½•页,一般不会大改动了,根据项目需求做微调
### /pages/home/index
> ç™»å½•后的首页,根据项目需求,很可能做局部调整
### /pages/baseTask/out
> å…¥åº“页面,根据项目需求调整
### /pages/baseTask/out
> å‡ºåº“页面,根据项目需求调整
### /pages/print/bluetoothConnection
> ç‰©èš‚蚁蓝牙打印机,蓝牙连接页面,几乎无需改动
### /pages/setting/host
> åŽç«¯æŽ¥å£è°ƒç”¨åŸŸåè®¾ç½®é¡µé¢ï¼Œå‡ ä¹Žæ— éœ€æ”¹åЍ
-----
## json-server  å‰ç«¯æ•°æ®moke
### å¯åŠ¨é…ç½®ï¼Œå¦‚å›¾åœ¨package.json中,然后命令行运行
~~~
npm run api
~~~
> --port 3012  ç«¯å£å·è®¾ç½®ä¸º3012
> --host 0.0.0.0  å¼€å¯ip地址访问
<img src="./mdImgs/1665970038354.jpg" style="width:100%" />
###  RESET Api
> GET /demo  èŽ·å–å…¨éƒ¨åˆ—è¡¨
> GET /demo/数据id   èŽ·å–è¯¦æƒ…
> POST  /demo   å¢žåŠ 
> PUT  /demo/数据id  æ•´æ¡æ•°æ®æ›¿æ¢
> PATCH  /demo/数据id   ä¿®æ”¹æŸä¸ªå­—段
> DELETE /demo/数据id  åˆ é™¤
###  æ¡ä»¶æŸ¥è¯¢å’Œåˆ†é¡µæŸ¥è¯¢
#### æ¡ä»¶æŸ¥è¯¢ï¼Œå­—段名称后增加
> _gte å¤§äºŽç­‰äºŽ
> _lte å°äºŽç­‰äºŽ
> _ne  ä¸ç­‰äºŽ
> _like  åŒ…含
#### åˆ†é¡µæŸ¥è¯¢
> _page  é¡µç ï¼Œä»Ž1开始
> _limit æ¯é¡µå¤šå°‘条数据
> _start æ•°æ®ç´¢å¼•开始,从0开始
> _end æ•°æ®ç´¢å¼•结束,不包含end索引
案例:GET模糊查找字段name
~~~
/demo?name_like=value
~~~
-------
## æ–°å»ºé¡µé¢æ­¥éª¤
#### 1、配置pages.json
#### 2、配置config/index.js中的path
#### 3、首页配置页面入口(根据需要)
PipeLineLems.PDA/__json_server_mock__/db.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
{
  "users": [
    {
      "id": 1,
      "name": "小红"
    }
  ],
  "demo": [
    {
      "text1": "文字1",
      "number": "58",
      "id": 1
    },
    {
      "id": 2,
      "text1": "文字21",
      "text2": "文字22",
      "text3": "文字23",
      "number": "52"
    },
    {
      "id": 3,
      "text1": "文字31",
      "text2": "文字32",
      "text3": "文字33",
      "number": "1043"
    },
    {
      "id": 4,
      "text1": "文字41",
      "text2": "文字42",
      "text3": "文字43",
      "number": 1004
    },
    {
      "id": 5,
      "text1": "文字51",
      "text2": "文字52",
      "text3": "文字53",
      "number": 1005
    },
    {
      "id": 6,
      "text1": "文字61",
      "text2": "文字62",
      "text3": "文字63",
      "number": 1006
    },
    {
      "id": 7,
      "text1": "文字71",
      "text2": "文字72",
      "text3": "文字73",
      "number": 1007
    },
    {
      "id": 8,
      "text1": "文字81",
      "text2": "文字82",
      "text3": "文字83",
      "number": 1008
    },
    {
      "id": 91,
      "text1": "文字91",
      "text2": "文字92",
      "text3": "文字93",
      "number": 1009
    },
    {
      "id": 10,
      "text1": "文字101",
      "text2": "文字102",
      "text3": "文字103",
      "number": 1010
    },
    {
      "id": 11,
      "text1": "文字111",
      "text2": "文字112",
      "text3": "文字113",
      "number": 1011
    },
    {
      "id": 12,
      "text1": "文字121",
      "text2": "文字122",
      "text3": "文字123",
      "number": 1012
    },
    {
      "id": 13,
      "text1": "文字131",
      "text2": "文字132",
      "text3": "文字133",
      "number": 1013
    },
    {
      "id": 14,
      "text1": "文字141",
      "text2": "文字142",
      "text3": "文字143",
      "number": 1014
    },
    {
      "id": 15,
      "text1": "文字151",
      "text2": "文字152",
      "text3": "文字153",
      "number": 1015
    },
    {
      "id": 16,
      "text1": "文字161",
      "text2": "文字162",
      "text3": "文字163",
      "number": 1016
    },
    {
      "id": 17,
      "text1": "文字171",
      "text2": "文字172",
      "text3": "文字173",
      "number": 1017
    },
    {
      "id": 18,
      "text1": "文字181",
      "text2": "文字182",
      "text3": "文字183",
      "number": 1018
    },
    {
      "id": 19,
      "text1": "文字191",
      "text2": "文字192",
      "text3": "文字193",
      "number": 1019
    },
    {
      "id": 20,
      "text1": "文字201",
      "text2": "文字202",
      "text3": "文字203",
      "number": 1020
    },
    {
      "id": 21,
      "text1": "文字211",
      "text2": "文字212",
      "text3": "文字213",
      "number": 1021
    }
  ]
}
PipeLineLems.PDA/api/PointHandling.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
import request from '@/api/api.js'
import qs from 'qs'
// ç‚¹åˆ°ç‚¹æ¬è¿ /api/wcsToWms/pointHandlingTask
export function pointHandlingTask (data) {
  return request({
    url: `/api/wcsToWms/pointHandlingTask`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/api - ²âÊÔ.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
// åŒæ—¶å‘送异步请求的次数,防止一次点击有多次请求
let ajaxTime = 0;
// export const baseUrl = 'http://10.10.40.166:2066' // http://localhost:5005
export const baseUrl = 'http://192.168.1.100:2001'
// export const baseUrl = 'http://192.168.1.100:2001'
// å…¬å…±çš„request方法
function request(option) {
    //请求头.
    const header = {};
    // è¿”回方式
    header['Content-Type'] = option.contentType || 'application/json';
    // åˆ¤æ–­æ˜¯å¦æ˜¯ç™»å½•请求,不是在header中加上token
    if (option.url != '/login') {
        header['Authorization'] = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : '';
        header['x-Authorization'] = uni.getStorageSync('refresh_token') ? 'Bearer ' + uni.getStorageSync('refresh_token') : '';
        header.Authorization = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : ''
    }
    ajaxTime++;
    // æ˜¾ç¤ºåŠ è½½ä¸­æ•ˆæžœ
    uni.showLoading({
        title: '加载中...',
        mask: true
    });
    return new Promise((resolve, reject) => {
        uni.request({
            url: baseUrl + option.url,
            method: option.method || 'POST',
            data: option.data || {},
            header,
            timeout: 10000,
            success: (res) => {
                if(res.statusCode == 200) {
                    console.log(res,'res');
                    const result = res.data;
                    if (result.code === 200||!Boolean(result.code)) {
                        // è¯·æ±‚状态正常,返回数据
                        resolve(result)
                    } else if (result.code === 401) {
                        //token失效,清除token关闭当前页面,跳转到登录
                        uni.showModal({
                            title: '提示',
                            content: 'token失效,请重新登陆',
                            showCancel: false,
                            success:()=>{
                                // æ¸…楚token
                                uni.removeStorageSync('token')
                                // è·³è½¬åˆ°ç™»å½•
                                uni.redirectTo({
                                    url: '/pages/login/index'
                                })
                            }
                        })
                    } else {
                        uni.showModal({
                            title: '提示',
                            content: `${result.code}:${JSON.stringify(result.message)}`,
                            showCancel: false
                        })
                        // å¼‚常,返回异常code和message
                        reject(result)
                    }
                }else {
                    uni.showModal({
                        title: '提示',
                        content: `${res.statusCode}:${JSON.stringify(res.errMsg)}`,
                        showCancel: false
                    })
                    const {statusCode,errMsg} = res;
                    reject({statusCode,errMsg})
                }
            },
            fail: (err) => {
                // è¯·æ±‚失败
                reject(err);
            },
            complete: () => {
                // è¯·æ±‚完成后判断状态
                ajaxTime--;
                // åªæœ‰å€¼ç­‰äºŽ0,才清除转圈效果
                if (ajaxTime == 0) {
                    uni.hideLoading()
                }
            }
        })
    })
}
export default request
PipeLineLems.PDA/api/api - Éú²ú.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
// åŒæ—¶å‘送异步请求的次数,防止一次点击有多次请求
let ajaxTime = 0;
export const baseUrl = 'http://127.0.0.1:18000'
// å…¬å…±çš„request方法
function request(option) {
    //请求头.
    const header = {};
    // è¿”回方式
    header['Content-Type'] = option.contentType || 'application/json';
    // åˆ¤æ–­æ˜¯å¦æ˜¯ç™»å½•请求,不是在header中加上token
    if (option.url != '/login') {
        header['Authorization'] = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : '';
        header['x-Authorization'] = uni.getStorageSync('refresh_token') ? 'Bearer ' + uni.getStorageSync('refresh_token') : '';
        header.Authorization = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : ''
    }
    ajaxTime++;
    // æ˜¾ç¤ºåŠ è½½ä¸­æ•ˆæžœ
    uni.showLoading({
        title: '加载中...',
        mask: true
    });
    return new Promise((resolve, reject) => {
        uni.request({
            url: baseUrl + option.url,
            method: option.method || 'POST',
            data: option.data || {},
            header,
            timeout: 10000,
            success: (res) => {
                if(res.statusCode == 200) {
                    console.log(res,'res');
                    const result = res.data;
                    if (result.code === 200||!Boolean(result.code)) {
                        // è¯·æ±‚状态正常,返回数据
                        resolve(result)
                    } else if (result.code === 401) {
                        //token失效,清除token关闭当前页面,跳转到登录
                        uni.showModal({
                            title: '提示',
                            content: 'token失效,请重新登陆',
                            showCancel: false,
                            success:()=>{
                                // æ¸…楚token
                                uni.removeStorageSync('token')
                                // è·³è½¬åˆ°ç™»å½•
                                uni.redirectTo({
                                    url: '/pages/login/index'
                                })
                            }
                        })
                    } else {
                        uni.showModal({
                            title: '提示',
                            content: `${result.code}:${JSON.stringify(result.message)}`,
                            showCancel: false
                        })
                        // å¼‚常,返回异常code和message
                        reject(result)
                    }
                }else {
                    uni.showModal({
                        title: '提示',
                        content: `${res.statusCode}:${JSON.stringify(res.errMsg)}`,
                        showCancel: false
                    })
                    const {statusCode,errMsg} = res;
                    reject({statusCode,errMsg})
                }
            },
            fail: (err) => {
                // è¯·æ±‚失败
                reject(err);
            },
            complete: () => {
                // è¯·æ±‚完成后判断状态
                ajaxTime--;
                // åªæœ‰å€¼ç­‰äºŽ0,才清除转圈效果
                if (ajaxTime == 0) {
                    uni.hideLoading()
                }
            }
        })
    })
}
export default request
PipeLineLems.PDA/api/api.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
// åŒæ—¶å‘送异步请求的次数,防止一次点击有多次请求
let ajaxTime = 0;
export const baseUrl = 'http://127.0.0.1:18000'
// å…¬å…±çš„request方法
function request(option) {
    //请求头.
    const header = {};
    // è¿”回方式
    header['Content-Type'] = option.contentType || 'application/json';
    // åˆ¤æ–­æ˜¯å¦æ˜¯ç™»å½•请求,不是在header中加上token
    if (option.url != '/login') {
        header['Authorization'] = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : '';
        header['x-Authorization'] = uni.getStorageSync('refresh_token') ? 'Bearer ' + uni.getStorageSync('refresh_token') : '';
        header.Authorization = uni.getStorageSync('user_token') ? 'Bearer ' + uni.getStorageSync('user_token') : ''
    }
    ajaxTime++;
    // æ˜¾ç¤ºåŠ è½½ä¸­æ•ˆæžœ
    uni.showLoading({
        title: '加载中...',
        mask: true
    });
    return new Promise((resolve, reject) => {
        uni.request({
            url: baseUrl + option.url,
            method: option.method || 'POST',
            data: option.data || {},
            header,
            timeout: 10000,
            success: (res) => {
                if(res.statusCode == 200) {
                    console.log(res,'res');
                    const result = res.data;
                    if (result.code === 200||!Boolean(result.code)) {
                        // è¯·æ±‚状态正常,返回数据
                        resolve(result)
                    } else if (result.code === 401) {
                        //token失效,清除token关闭当前页面,跳转到登录
                        uni.showModal({
                            title: '提示',
                            content: 'token失效,请重新登陆',
                            showCancel: false,
                            success:()=>{
                                // æ¸…楚token
                                uni.removeStorageSync('token')
                                // è·³è½¬åˆ°ç™»å½•
                                uni.redirectTo({
                                    url: '/pages/login/index'
                                })
                            }
                        })
                    } else {
                        uni.showModal({
                            title: '提示',
                            content: `${result.code}:${JSON.stringify(result.message)}`,
                            showCancel: false
                        })
                        // å¼‚常,返回异常code和message
                        reject(result)
                    }
                }else {
                    uni.showModal({
                        title: '提示',
                        content: `${res.statusCode}:${JSON.stringify(res.errMsg)}`,
                        showCancel: false
                    })
                    const {statusCode,errMsg} = res;
                    reject({statusCode,errMsg})
                }
            },
            fail: (err) => {
                // è¯·æ±‚失败
                reject(err);
            },
            complete: () => {
                // è¯·æ±‚完成后判断状态
                ajaxTime--;
                // åªæœ‰å€¼ç­‰äºŽ0,才清除转圈效果
                if (ajaxTime == 0) {
                    uni.hideLoading()
                }
            }
        })
    })
}
export default request
PipeLineLems.PDA/api/bind.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
import request from '@/api/api.js'
import qs from 'qs'
// æ ¹æ®æ‰˜ç›˜ç¼–号获取物料托盘绑定信息
export function getForContainerCode (data) {
  return request({
    url: `/api/materialContainer/getForContainerNo?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æ ¹æ®æ‰˜ç›˜ç¼–号获取托盘托盘绑定信息
export function getForEmptyContainerNo (data) {
  return request({
    url: `/api/materialContainer/getForEmptyContainerNo?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æ ¹æ®ç‰©æ–™ç èŽ·å–ç‰©æ–™ä¿¡æ¯
export function getForMaterialNo (data) {
  return request({
    url: `/api/material/getForMaterialNo?${qs.stringify(data)}`,
    method: 'get'
  })
}
// ç»„盘
export function bindMaterialContainer(data) {
  return request({
    url: `/api/materialContainer/add`,
    method: 'post',
    data
  })
}
// åˆ†æ‹£
export function pickPipeSpecCode(data) {
  return request({
    url: `/api/v1/pipelinelems/workplanpublic/pick`,
    method: 'post',
    data
  })
}
// å…¥åº“ 1是自制件组盘入库; 4是外协件组盘入库;
export function addInBound(data) {
  return request({
    url: `/api/inAndOutOrder/addInBound`,
    method: 'post',
    data
  })
}
//自制件入库
export function addInVirtualPlace(data) {
  return request({
    url: `/api/inAndOutOrder/addInVirtualPlace`,
    method: 'post',
    data
  })
}
//外协件入库
export function addInVirtualWxjPlace(data) {
  return request({
    url: `/api/inAndOutOrder/addInBound`,
    method: 'post',
    data
  })
}
// æµ‹è¯•PLC触发生成入库任务 /api/wcsToWms/addAGVTask
export function addAGVTask(data) {
  return request({
    url: `/api/wcsToWms/addAGVTask`,
    method: 'post',
    data
  })
}
// ç©ºæ‰˜å…¥åº“
export function addEmptyContainerReturn(data) {
  return request({
    url: `/api/inAndOutOrder/emptyContainerReturn`,
    method: 'post',
    data
  })
}
// å¹³åº“入库
export function AddInBoundForFlat(data) {
  return request({
    url: `/api/inAndOutOrder/AddInBoundForFlat`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/callEmptyContainer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
import request from '@/api/api.js'
import qs from 'qs'
// èŽ·å–æžšä¸¾ä¿¡æ¯ /api/wcsToWms/callEmptyContainer
export function callEmptyContainer (data) {
  return request({
    url: `/api/wcsToWms/callEmptyContainer`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/common.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
import request from '@/api/api.js'
import qs from 'qs'
// èŽ·å–æžšä¸¾ä¿¡æ¯ /api/sysEnumData/list
export function getSysEnumData (data) {
  return request({
    url: `/api/sysDictType/dataList?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æ ¹æ®æ‰˜ç›˜ç¼–号获取托盘信息
export function getContainerInfo (data) {
  return request({
    url: `/api/container/detail?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æ ¹æ®åº“区号获取库位列表 /api/place/getPlaceListByArea
export function getPalceList (data) {
  return request({
    url: `/api/place/getPlaceListByArea?${qs.stringify(data)}`,
    method: 'get',
  })
}
// æ ¹æ®åº“区号获取库区信息 /api/area/list
export function getAreaInfo(data) {
  return request({
    url: `/api/area/list?${qs.stringify(data)}`,
    method: 'get',
  })
}
// åœ°æ ‡ç»‘定库区信息 /api/area/list
export function getAreaListContaninerBind(data) {
  return request({
    url: `/api/area/getAreaList?${qs.stringify(data)}`,
    method: 'get',
  })
}
// æ ¹æ®åº“位id获取物料信息 /api/place/getMaterialDetail
export function getMaterialDetail(data) {
  return request({
    url: `/api/place/getMaterialDetail?${qs.stringify(data)}`,
    method: 'get',
  })
}
PipeLineLems.PDA/api/containerHandle.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
import request from '@/api/api.js'
import qs from 'qs'
// æ ¹æ®æ‰˜ç›˜ç¼–号获取托盘库位绑定信息 api/container/getContainerPlaceInfo
export function getContainerPlaceInfo (data) {
  return request({
    url: `/api/container/getContainerPlaceInfo?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æ‰˜ç›˜æ“ä½œ
export function containerHandle (data) {
  return request({
    url: `/api/container/containerHandle`,
    method: 'post',
    data
  })
}
// æ ¹æ®åº“位号获取托盘库位信息
export function getContainerPlaceByPlace (data) {
  return request({
    url: `/api/container/getContainerPlaceByPlace?${qs.stringify(data)}`,
    method: 'get',
  })
}
//一键解绑
export function oneTouchUnBindHandle (data) {
  return request({
    url: `/api/container/oneTouchUnBindHandle`,
    method: 'post',
    data
  })
}
//查库存物料
export function StockPageHandle(data) {
  return request({
    url: `/api/materialStock/StockPage`,
    method: 'post',
      data
  })
}
//查库存物料+库位信息
export function StockPageForPdaCwgl(data) {
  return request({
    url: `/api/materialStock/StockPageForPdaCwgl`,
    method: 'post',
      data
  })
}
//查库存物料
export function placebatchUpdate (data) {
  return request({
    url: `/api/place/batchUpdate`,
    method: 'post',
      data
  })
}
PipeLineLems.PDA/api/emptyIn.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
import request from '@/api/api.js'
import qs from 'qs'
// èŽ·å–æ‰˜ç›˜ä¿¡æ¯ /api/wmsinwarehouse/GetContainer
export function GetContainer (data) {
  return request({
    url: `/api/wmsinwarehouse/GetContainer?${qs.stringify(data)}`,
    method: 'get'
  })
}
// èŽ·å–å•æ®ä¿¡æ¯ /api/wmsinwarehouse/PadGetMaterial
export function GetMaterialPad (data) {
  return request({
    url: `/api/wmsinwarehouse/PadGetMaterial?${qs.stringify(data)}`,
    method: 'get'
  })
}
// ç»„盘 /api/wmsinwarehouse/GroupDisk
export function GroupDisk (data) {
  return request({
    url: `/api/wmsinwarehouse/GroupDisk`,
    method: 'post',
    data
  })
}
// å…¥åº“ /api/wmsinwarehouse/PdaInWarehouse
export function PdaInWarehouse (data) {
  return request({
    url: `/api/wmsinwarehouse/PdaInWarehouse`,
    method: 'post',
    data
  })
}
// ç©ºæ‰˜ç»‘定
export function emptyContainerBindKTHCPlace (data) {
  return request({
    url: `/api/container/emptyContainerBindKTHCPlace`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/exception.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
import request from '@/api/api.js'
import qs from 'qs'
// æŸ¥è¯¢å¼‚常工位库位
export function lisNoPage (data) {
  return request({
    url: `/api/place/listNoPage`,
    method: 'post',
    data
  })
}
// èŽ·å–å¼‚å¸¸ä»¶ä¿¡æ¯
export function exceptionInfo (data) {
  return request({
    url: `/api/wmsSortOrder/exceptionInfo?${qs.stringify(data)}`,
    method: 'get',
  })
}
// pda人工出库/自动出库
export function outBound (data) {
  return request({
    url: `/api/wmsSortOrder/exceptionHandle`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/loadingDelivery.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
import request from '@/api/api.js'
import qs from 'qs'
// è¿”回目标工位
export function getLoadingDeliveryEnd (data) {
  return request({
    url: `/api/loadingDelivery/LoadingDeliveryEnd?${qs.stringify(data)}`,
    method: 'get'
  })
}
// åˆ›å»ºagv任务
export function loadingDeliveryCreate (data) {
  return request({
    url: `/api/loadingDelivery/LoadingDeliveryCreate`,
    method: 'post',
    data
  })
}
// è£…料完成
export function loadingDeliveryContinueOne (data) {
  return request({
    url: `/api/loadingDelivery/LoadingDeliveryContinueOne`,
    method: 'post',
    data
  })
}
// å–料完成
export function loadingDeliveryContinueTwo (data) {
  return request({
    url: `/api/loadingDelivery/LoadingDeliveryContinueTwo`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/receiptExecution.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
import request from '@/api/api.js'
import qs from 'qs'
// æ ¹æ®å•据号获取明细 /api/pdareceiptorder/GetOrderDetail
export function GetOrderDetail (data) {
  return request({
    url: `/api/pdareceiptorder/GetOrderDetail?${qs.stringify(data)}`,
    method: 'get'
  })
}
// å…¥åº“ /api/pdareceiptorder/ConfirmReceipt
export function confirmReceipt (data) {
  return request({
    url: `/api/pdareceiptorder/ConfirmReceipt`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/replenishMent.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
import request from '@/api/api.js'
import qs from 'qs'
// èŽ·å–æžšä¸¾ä¿¡æ¯ /api/sysEnumData/list
export function materialStockListNoPage (data) {
  return request({
    url: `/api/inAndOutOrder/getMaterialListNoPage?${qs.stringify(data)}`,
    method: 'get'
  })
}
// å¢žåŠ å‡ºåº“å•æ® /api/inAndOutOrder/addRange
export function addRange (data) {
  return request({
    url: `/api/inAndOutOrder/addRange`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/slicingOff.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
import request from '@/api/api.js'
import qs from 'qs'
// ç©ºæ‰˜å‡ºåº“ /api/callempty/PdaContainerOut
export function PdaContainerOut (data) {
  return request({
    url: `/api/callempty/PdaContainerOut`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/api/slicingOn.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
import request from '@/api/api.js'
import qs from 'qs'
// èŽ·å–æ‰˜ç›˜ä¿¡æ¯ /api/materialsorting/GetSortInfo
export function GetSortInfo (data) {
  return request({
    url: `/api/materialsorting/GetSortInfo?${qs.stringify(data)}`,
    method: 'get'
  })
}
// åˆ†æ‹£ç¡®è®¤ /api/materialsorting/SortSure
export function SortSure (data) {
  return request({
    url: `/api/materialsorting/SortSure`,
    method: 'post',
    data
  })
}
// å‡ºåº“单查询 /api/materialsorting/SortPdaPage
export function SortPdaPage (data) {
  return request({
    url: `/api/materialsorting/SortPdaPage?${qs.stringify(data)}`,
    method: 'get'
  })
}
// æŸ¥è¯¢å‡ºåº“单获得分拣单明细 /api/materialsorting/SortPdaDetailPage
export function SortPdaDetailPage(data) {
  return request({
    url: `/api/materialsorting/SortPdaDetailPage?${qs.stringify(data)}`,
    method: 'get'
  })
}
PipeLineLems.PDA/api/sorting.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
import request from '@/api/api.js'
import qs from 'qs'
// æŸ¥è¯¢åˆ†æ‹£ä¿¡æ¯
export function SortInfo (data) {
  return request({
    url: `/api/wmsSortOrder/sortInfo`,
    method: 'post',
    data
  })
}
// æŸ¥è¯¢å•据详情信息
export function noPage (data) {
  return request({
    url: `/api/InAndOutOrder/NoPage`,
    method: 'post',
    data
  })
}
// æ·»åŠ åˆ†æ‹£è¯¦æƒ…
export function addSortDetail (data) {
  return request({
    url: `/api/wmsSortOrder/AddSortDetail`,
    method: 'post',
    data
  })
}
PipeLineLems.PDA/components/.hbuilderx/launch.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
{ // launch.json é…ç½®äº†å¯åŠ¨è°ƒè¯•æ—¶ç›¸å…³è®¾ç½®ï¼Œconfigurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
    "version": "0.0",
    "configurations": [{
         "app-plus" :
         {
             "launchtype" : "local"
         },
         "default" :
         {
             "launchtype" : "local"
         },
         "type" : "uniCloud"
     }
    ]
}
PipeLineLems.PDA/components/ActionUserRow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
<template>
    <view class="action-user-row-compontent">操作人:{{userName}}</view>
</template>
<script>
export default {
    name:'actionUserRowCompontent',
    data(){
        return {
            userName:''
        }
    },
    created() {
        let _user = this.$store.getters['user/getUserInfo'];
        this.userName = _user.name || _user.nickName;
    }
}
</script>
<style scoped lang="scss">
.action-user-row-compontent{
    text-align: right;
    padding:8rpx 20rpx;
    position: absolute;
    box-sizing: border-box;
    width: 100%;
    top: 0;
    left: 0;
    z-index: 1;
}
</style>
PipeLineLems.PDA/components/AutoCompleteScanInputFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,367 @@
<template>
    <view class="auto-complete-scan-input-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row" @tap.stop="onOpenPicker">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <text v-if="!innerValue" class="placeholder">{{placeholder}}</text>
                <text v-else>{{innerValue}}</text>
            </view>
            <view class="close-view" @tap.stop="onClear" v-if="innerValue && clearable">
                <view class="close-circle">
                    <u-icon
                        name="close"
                        size="11"
                        color="#ffffff"
                        customStyle="line-height: 12px"
                    ></u-icon>
                </view>
            </view>
        </view>
        <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
        <u-popup mode="center" :show="pickerVisible" :closeOnClickOverlay="false" :safeAreaInsetTop="false" :safeAreaInsetBottom="false">
            <view class="auto-complete-picker-page" :style="{
                paddingTop:safetySize.top+'px',
                paddingBottom:safetySize.bottom+'px',
                paddingLeft:safetySize.left+'px',
                paddingRight:safetySize.right+'px'
            }">
                <view class="picker-input-box">
                    <view class="input-row">
                        <view class="input-view">
                            <u--input
                                :clearable="true"
                                border="none"
                                :type="type"
                                :placeholder="placeholder"
                                :focus="pickerFocus"
                                v-model.trim="pickerValue"
                                @clear="onPickerClear"
                                @confirm="onPickerInputConfirm"
                            />
                        </view>
                        <view class="scan-view" v-if="hasScan">
                            <view @tap.stop="onPickerScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
                        </view>
                    </view>
                </view>
                <view class="picker-err-box" v-if="pickerErrMsg">{{pickerErrMsg}}</view>
                <view class="picker-list-view">
                    <view class="picker-list-group">
                        <view class="picker-item auto-wrap" v-for="(item,index) in list" :key="'picker-item-'+index" @tap.stop="onItemClick(item)">{{item}}</view>
                    </view>
                </view>
                <view class="picker-bottom-btns">
                    <view class="btn-frame"><u-button text="取 æ¶ˆ" @click="onCancelPicker"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" text="ç¡® è®¤" @click="onPickerConfirm"></u-button></view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
import { getObjectType } from '@/static/js/utils/index.js'
export default {
    name:'autoCompleteScanInputFormItemCompontent',
    emits:['input','changeOptions','clear','confirm','change'],
    props:{
        type:{
            type:String,
            default:'text'
        },
        label:{
            type:String,
            default:''
        },
        placeholder:{
            type:String,
            default:'请输入...'
        },
        msg:{
            type:String,
            default:''
        },
        pickerErrMsg:{
            type:String,
            default:''
        },
        msgType:{
            type:String,
            default:'error'
        },
        value:{
            type:[String,Number,null],
            default:null
        },
        hasScan:{
            type:Boolean,
            default:true
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        required:{
            type:Boolean,
            default:false
        },
        initPickerList:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {
            innerValue:'',
            pickerValue:'',
            pickerVisible:false,
            pickerFocus:false,
            list:[],
            safetySize:{
                top:0,
                bottom:0,
                left:0,
                right:0
            }
        }
    },
    watch:{
        value(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerValue = newVal;
            }
        },
        innerValue(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('input',newVal)
                this.$emit('change',newVal)
            }
        }
    },
    methods:{
        onOpenPicker(){
            this.pickerValue = this.innerValue
            this.pickerVisible = true
            this.$nextTick(()=>{
                this.pickerFocus = true
            })
            if (this.initPickerList) {
                this.getPickerList()
            }
        },
        onClear(){
            this.innerValue = null;
            this.$emit('clear')
        },
        onPickerClear(){
            this.pickerValue = null
        },
        onPickerInputConfirm(){
            this.getPickerList()
        },
        getPickerList(){
            this.$emit('changeOptions',this.pickerValue,(d)=>{
                if (getObjectType(d)==='array') {
                    this.list = [...d]
                }
            })
        },
        onItemClick(val){
            this.pickerValue = val;
            this.list = []
        },
        onPickerScan(){
            uni.scanCode({
                success:(res)=>{
                    this.pickerValue = res.result;
                    this.getPickerList()
                },
                fail:function(){
                    console.log('scanCode fail')
                }
            })
        },
        closePicker(){
            this.pickerVisible = false
            this.pickerFocus = false
        },
        onCancelPicker(){
            this.closePicker()
        },
        onPickerConfirm(){
            this.innerValue = this.pickerValue
            this.$emit('confirm',this.innerValue)
            this.closePicker()
        }
    },
    created() {
        this.innerValue = this.value
    },
    beforeMount(){
        let safety = this.$store.getters['system/getSafety'];
        if (safety) {
            this.safetySize.top = safety.top
            this.safetySize.bottom = safety.bottom
            this.safetySize.left = safety.left
            this.safetySize.right = safety.right
        } else {
            uni.getSystemInfo({
                success:(res=>{
                    if (!res.safeAreaInsets) res.safeAreaInsets = {}
                    this.safetySize.top = res.safeAreaInsets.top || 0;
                    this.safetySize.bottom = res.safeAreaInsets.bottom || 0;
                    this.safetySize.left = res.safeAreaInsets.left || 0;
                    this.safetySize.right = res.safeAreaInsets.right || 0;
                })
            })
        }
    }
}
</script>
<style scoped lang="scss">
.auto-complete-scan-input-form-item-compontent{
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:$u-error;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
        word-break:break-all;
        word-wrap:break-word;
        &.info-type{
            color:$color-blue;
        }
    }
}
.input-row{
    width: 100%;
    height: 90rpx;
    overflow: hidden;
    background-color: $uni-bg-color;
    display: flex;
    align-items: center;
    position: relative;
    .close-view{
        .close-circle{
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: #c6c7cb;
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;
            transform: scale(0.82);
            margin-left: 4px;
        }
    }
    .scan-view,.close-view{
        flex-shrink: 0;
    }
    .scan-view,.close-view{
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .scan-view{
        padding-right: 10rpx;
    }
    .input-view{
        flex-grow: 1;
        padding-left: 20rpx;
        font-size: 30rpx;
        white-space:nowrap;
        overflow:hidden;
        text-overflow:ellipsis;
        color: rgb(48, 49, 51);
        .placeholder{
            color: rgb(192, 196, 204);
        }
    }
    &>.mask{
        background-color: #000;
        opacity: 0.25;
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        z-index: 100;
    }
}
.auto-complete-picker-page{
    width: 100vw;
    height: 100vh;
    box-sizing: border-box;
    background-color: #f2f2f2;
    display: flex;
    flex-direction: column;
    .picker-input-box,.picker-bottom-btns,.picker-err-box{
        flex-shrink: 0;
    }
    .picker-input-box{
        padding: 16rpx;
        .input-row{
            border-radius: 6rpx;
        }
    }
    .picker-err-box{
        color: $u-error;
        padding: 0 16rpx 16rpx 16rpx;
        line-height: 1.3;
        font-size: 24rpx;
        word-break:break-all;
        word-wrap:break-word;
    }
    .picker-bottom-btns{
        display: flex;
        padding: 10rpx 20rpx;
        .btn-frame{
            width: 1%;
            box-sizing: border-box;
            flex-grow: 1;
        }
        .divider{
            width: 20rpx;
            flex-shrink: 0;
        }
    }
    .picker-list-view{
        flex-grow: 1;
        height: 1px;
        background-color: $uni-bg-color;
        overflow: auto;
        .picker-list-group{
            padding: 12rpx 16rpx;
            .picker-item{
                text-align: center;
                background-image: linear-gradient(to right, $color-paimary-darken, $color-paimary-lighten);
                border: 1px solid #e4e4e4;
                border-radius: 10rpx;
                padding: 20rpx;
                margin-bottom: 16rpx;
                &:last-child{
                    margin-bottom: 0;
                }
            }
        }
    }
}
</style>
PipeLineLems.PDA/components/DefaultHeaderPageLayout.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
<template>
    <header-page-layout ref="page" :title="title" base-background-color="#f8f8ff" background-color="#f2f2f2" @headerclick="onHeaderClick">
        <template v-slot:headerleft><u-icon name="arrow-left"></u-icon></template>
        <template v-slot:headerright><u-icon name="list"></u-icon></template>
        <slot></slot>
        <template v-slot:footer v-if="$scopedSlots.footer"><slot name="footer"></slot></template>
        <easy-picker :visible.sync="actionVisible" :list="actionList" @select="onActionClick"></easy-picker>
    </header-page-layout>
</template>
<script>
import HeaderPageLayout from './HeaderPageLayout.vue'
import EasyPicker from './EasyPicker.vue'
import { downloadApk } from '@/static/js/utils/index.js'
export default {
    name:'defaultHeaderPageCompontent',
    emits:['back'],
    components:{HeaderPageLayout,EasyPicker},
    props:{
        title:{
            type:String,
            default:'Title'
        },
        backCustom:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {
            actionVisible:false,
            actionList:['刷新','首页','退出']
        }
    },
    methods:{
        onHeaderClick(type){
            if (type==='left'){
                if (this.backCustom===true) {
                    this.$emit('back')
                } else {
                    uni.navigateBack({
                      delta: 1
                    });
                }
            } else {
                this.actionVisible = true
            }
        },
        onActionClick(val){
            if (val==='刷新'){
                uni.navigateBack({
                  delta: 0
                });
            } else if (val==='首页') {
                uni.redirectTo({url:this.$config.path.home})
            } else if (val==='退出') {
                uni.redirectTo({url:this.$config.path.login})
            } else if (val==='新版下载') {
                downloadApk(this.$config)
            }
        },
        getBodyHeight(){
            let res = null;
            if (this.$refs.page) {
                res = this.$refs.page.getBodyHeight()
            }
            return res;
        }
    },
    created() {
        if (process.env.NODE_ENV!=='development') {
            this.actionList.push('新版下载')
        }
    }
}
</script>
<style scoped lang="scss">
</style>
PipeLineLems.PDA/components/EasyPicker.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
<template>
    <u-popup mode="center" :show="visible" @close="close" :round="10" :safeAreaInsetTop="true" :safeAreaInsetBottom="true">
        <view class="picker-box" :style="{maxHeight:maxHeight+'px'}">
            <view class="picker-item-group">
                <view class="picker-item auto-wrap" v-for="(item,index) in list" :key="'picker-item-'+index" @tap.stop="onItemClick(index,item)">
                    {{(typeof(item)==='string'||typeof(item)==='number'||typeof(item)==='boolean'||item===null)?item:item[labelField]}}
                </view>
            </view>
        </view>
    </u-popup>
</template>
<script>
const MAX_HEIGHT = 500
export default {
    name:'easyPickerCompontent',
    emits:['update:visible','select'],
    props:{
        visible:{
            type:Boolean,
            default:false
        },
        list:{
            type:Array,
            default:function(){
                return []
            }
        },
        valueField:{
            type:String,
            default:'value'
        },
        labelField:{
            type:String,
            default:'label'
        }
    },
    data(){
        return {
            maxHeight:MAX_HEIGHT
        }
    },
    methods:{
        close(){
            this.$emit('update:visible',false)
        },
        onItemClick(index,selection){
            let valObj = selection;
            let val;
            if (typeof selection === 'string' || typeof selection === 'number'||typeof(selection)==='boolean'||selection===null) {
                val = selection;
            } else {
                try{
                    val = selection[this.valueField];
                }catch(e){
                    val = selection;
                }
            }
            this.close()
            this.$emit('select',val,valObj,index)
        },
        setMaxHeight(calHeight) {
            const spaceHeight = 10
            if (calHeight>spaceHeight) {
                calHeight = calHeight - spaceHeight
                this.maxHeight = calHeight
            }
        }
    },
    beforeMount(){
        let safety = this.$store.getters['system/getSafety'];
        if (safety) {
            this.setMaxHeight(safety.height)
        } else {
            uni.getSystemInfo({
                success:(res=>{
                    if (!res.safeAreaInsets) res.safeArea = {}
                    this.setMaxHeight(res.safeArea.height || 0)
                })
            })
        }
    }
}
</script>
<style scoped lang="scss">
.picker-box{
    width: 80vw;
    background-color:#f0f8ff;
    border-radius: 20rpx;
    padding-top: 30rpx;
    overflow: auto;
    display: flex;
    justify-content: center;
    box-sizing: border-box;
    .picker-item-group{
        width: 80%;
    }
    .picker-item{
        margin: 0 20rpx 30rpx 20rpx;
        text-align: center;
        background-image: linear-gradient(to right, $color-paimary-darken, $color-paimary-lighten);
        border: 1px solid #e4e4e4;
        border-radius: 10rpx;
        font-size: 1.2rem;
        padding: 20rpx;
    }
}
</style>
PipeLineLems.PDA/components/EasyPickerWithSearch.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
<template>
    <u-popup mode="center" :show="visible" @close="close" :round="10" :safeAreaInsetTop="true" :safeAreaInsetBottom="true">
        <view class="picker-boxWrap" :style="{maxHeight:maxHeight+'px'}">
            <!-- æ·»åŠ è¾“å…¥æ¡†ï¼šæ¨¡ç³ŠæŸ¥è¯¢ è°ƒç”¨æŽ¥å£ -->
            <view class="picker-input" v-if="isShowSearch">
                <u-input v-model="searchValue" type="text"  placeholder="请输入..." clearable></u-input>
                <u-button type="primary" @click="onSearch" :disabled="!searchValue">搜索</u-button>
            </view>
            <view class="picker-box">
                <view class="picker-item-group">
                            <view class="picker-item auto-wrap" v-for="(item,index) in list" :key="'picker-item-'+index" @tap.stop="onItemClick(index,item)">
                                {{(typeof(item)==='string'||typeof(item)==='number'||typeof(item)==='boolean'||item===null)?item:item[labelField]}}
                            </view>
                            <view v-if="list.length===0" class="text-tip">
                            æš‚无数据
                        </view>
                        </view>
            </view>
        </view>
    </u-popup>
</template>
<script>
const MAX_HEIGHT = 500
export default {
    name:'easyPickerCompontent',
    emits:['update:visible','select','getCurrentData'],
    props:{
        visible:{
            type:Boolean,
            default:false
        },
        list:{
            type:Array,
            default:function(){
                return []
            }
        },
        valueField:{
            type:String,
            default:'value'
        },
        labelField:{
            type:String,
            default:'label'
        },
        isShowSearch:{
            type:Boolean,
            default:false
        },
    },
    data(){
        return {
            maxHeight:MAX_HEIGHT,
            searchValue:''
        }
    },
    methods:{
        close(){
            this.$emit('update:visible',false)
        },
        onItemClick(index,selection){
            let valObj = selection;
            let val;
            if (typeof selection === 'string' || typeof selection === 'number'||typeof(selection)==='boolean'||selection===null) {
                val = selection;
            } else {
                try{
                    val = selection[this.valueField];
                }catch(e){
                    val = selection;
                }
            }
            this.close()
            this.$emit('select',val,valObj,index)
        },
        setMaxHeight(calHeight) {
            const spaceHeight = 10
            if (calHeight>spaceHeight) {
                calHeight = calHeight - spaceHeight
                this.maxHeight = calHeight
            }
        },
        // æ¨¡ç³ŠæŸ¥è¯¢
        onSearch(){
            let searchValue = this.searchValue.trim()
            if (searchValue) {
                this.$emit('getCurrentData',searchValue)
            }
        }
    },
    beforeMount(){
        let safety = this.$store.getters['system/getSafety'];
        if (safety) {
            this.setMaxHeight(safety.height)
        } else {
            uni.getSystemInfo({
                success:(res=>{
                    if (!res.safeAreaInsets) res.safeArea = {}
                    this.setMaxHeight(res.safeArea.height || 0)
                })
            })
        }
    }
}
</script>
<style scoped lang="scss">
.picker-boxWrap{
    width: 80vw;
    background-color:#f0f8ff;
    overflow: auto;
    box-sizing: border-box;
}
.picker-box{
    width: 80vw;
    background-color:#f0f8ff;
    border-radius: 20rpx;
    padding-top: 30rpx;
    overflow: auto;
    display: flex;
    justify-content: center;
    box-sizing: border-box;
    .picker-item-group{
        width: 80%;
    }
    .picker-item{
        margin: 0 20rpx 30rpx 20rpx;
        text-align: center;
        background-image: linear-gradient(to right, $color-paimary-darken, $color-paimary-lighten);
        border: 1px solid #e4e4e4;
        border-radius: 10rpx;
        font-size: 1.2rem;
        padding: 20rpx;
    }
}
.picker-input{
    display: flex;
    align-items: center;
    margin: 20rpx;
    .u-input{
        flex: 1;
    }
    .u-button{
        margin-left: 10rpx;
        width: 150rpx;
    }
}
.text-tip{
    text-align: center;
    font-size: 1.2rem;
    color: #999;
    padding: 20rpx 0;
}
</style>
PipeLineLems.PDA/components/EasySelectFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,254 @@
<template>
    <view class="easy-select-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row" @tap.stop="onOpenPicker">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <text v-if="!innerLabel" class="placeholder">{{placeholder}}</text>
                <text v-else>{{innerLabel}}</text>
            </view>
            <view class="close-view" @tap.stop="onClear" v-if="innerLabel && clearable">
                <view class="close-circle">
                    <u-icon
                        name="close"
                        size="11"
                        color="#ffffff"
                        customStyle="line-height: 12px"
                    ></u-icon>
                </view>
            </view>
            <view class="right-icon-view"><u-icon name="arrow-right" color="#909193" :size="24"></u-icon></view>
        </view>
        <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
        <easy-picker :visible.sync="pickerVisible" :list="list" :value-field="valueField" :label-field="labelField" @select="onPickerSelect" />
    </view>
</template>
<script>
import EasyPicker from './EasyPicker.vue'
export default {
    name:'EasySelectFormItemCompontent',
    components:{EasyPicker},
    emits:['input','select','clear'],
    props:{
        label:{
            type:String,
            default:''
        },
        placeholder:{
            type:String,
            default:'请选择...'
        },
        msg:{
            type:String,
            default:''
        },
        msgType:{
            type:String,
            default:'error'
        },
        value:{
            type:[String,Boolean,Number,null],
            default:null
        },
        list:{
            type:Array,
            default:function(){
                return []
            }
        },
        valueField:{
            type:String,
            default:'value'
        },
        labelField:{
            type:String,
            default:'label'
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        required:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {
            innerValue:'',
            innerLabel:'',
            pickerVisible:false,
            initFlag:false
        }
    },
    watch:{
        value(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerValue = newVal;
            }
        },
        innerValue(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('input',newVal)
            }
            if (newVal!==oldVal) {
                this.setLabelValue()
            }
        },
        list(){
            this.setInitData()
        }
    },
    methods:{
        onOpenPicker(){
            if (this.list.length<=0) return false
            this.pickerVisible = true
        },
        onPickerSelect(value,selection,index){
            if (value===this.innerValue) return false;
            this.innerValue = value;
            this.$emit('select',value,selection,index)
        },
        setLabelValue(){
            let noMatch = true;
            for (let i=0;i<this.list.length;i++) {
                if (this.isBaseItem(this.list[i])) {
                    if (this.list[i]===this.innerValue) {
                        this.innerLabel = this.list[i];
                        noMatch = false;
                        break;
                    }
                } else {
                    if (this.list[i][this.valueField]===this.innerValue) {
                        this.innerLabel = this.list[i][this.labelField];
                        noMatch = false;
                        break;
                    }
                }
            }
            if (noMatch) {
                this.innerLabel = this.innerValue
            }
        },
        isBaseItem(item){
            if (typeof(item)==='string'||typeof(item)==='number'||typeof(item)==='boolean'||item===undefined||item===null){
                return true
            } else {
                return false
            }
        },
        setInitData(){
            this.innerValue = this.value;
            if (this.list.length===1) {
                if (!this.initFlag) {
                    this.initFlag = true
                    let _tempVal = null;
                    if (!this.isBaseItem(this.list[0])) {
                        _tempVal = this.list[0][this.valueField];
                    } else {
                        _tempVal = this.list[0];
                    }
                    if (!this.innerValue) {
                        this.innerValue = _tempVal;
                    }
                }
            } else {
                this.setLabelValue()
            }
        },
        onClear(){
            this.innerValue = null;
            this.$emit('clear')
        }
    },
    created() {
        this.setInitData()
    }
}
</script>
<style scoped lang="scss">
.easy-select-form-item-compontent{
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:$u-error;
        }
    }
    .input-row{
        width: 100%;
        height: 90rpx;
        overflow: hidden;
        background-color: $uni-bg-color;
        display: flex;
        align-items: center;
        position: relative;
        .close-view,.right-icon-view{
            flex-shrink: 0;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .right-icon-view{
            padding-right: 10rpx;
        }
        .close-view{
            .close-circle{
                width: 20px;
                height: 20px;
                border-radius: 50%;
                background-color: #c6c7cb;
                display: flex;
                flex-direction: row;
                align-items: center;
                justify-content: center;
                transform: scale(0.82);
                margin-left: 4px;
            }
        }
        .input-view{
            flex-grow: 1;
            padding-left: 20rpx;
            font-size: 30rpx;
            white-space:nowrap;
            overflow:hidden;
            text-overflow:ellipsis;
            color: rgb(48, 49, 51);
            .placeholder{
                color: rgb(192, 196, 204);
            }
        }
        &>.mask{
            background-color: #000;
            opacity: 0.25;
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            z-index: 100;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
        word-break:break-all;
        word-wrap:break-word;
        &.info-type{
            color:$color-blue;
        }
    }
}
</style>
PipeLineLems.PDA/components/FullPageLayout.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
<template>
    <view class="full-page-layout app-page" :style="{
        paddingTop:safetySize.top+'px',
        paddingBottom:safetySize.bottom+'px',
        paddingLeft:safetySize.left+'px',
        paddingRight:safetySize.right+'px',
        height:full?'100vh':'100%',
        width:full?'100vw':'100%',
        backgroundColor:baseBackgroundColor?baseBackgroundColor:'transparent'
    }">
        <view class="full-page-layout-containter" :class="[(gradient&&gradientValue==='default')?'gradient-default':'']" :style="{
            backgroundColor:gradient?'transparent':(backgroundColor?backgroundColor:'transparent'),
            backgroundImage:gradient?(gradientValue!=='default'?gradientValue:'none'):'none'
        }">
            <slot></slot>
        </view>
    </view>
</template>
<script>
export default {
    name:'fullPageCompontent',
    props:{
        /* æ˜¯å¦å¯ç”¨åº•色渐变(backgroundImage) */
        gradient:{
            type:Boolean,
            default:false
        },
        /* åº•色渐变(backgroundImage)值,css语法,default时使用默认渐变色 */
        gradientValue:{
            type:String,
            default:'default'
        },
        backgroundColor:{
            type:String,
            default:''
        },
        safety:{
            type:Boolean,
            default:true
        },
        full:{
            type:Boolean,
            default:true
        },
        baseBackgroundColor:{
            type:String,
            default:''
        }
    },
    data(){
        return {
            safetySize:{
                top:0,
                bottom:0,
                left:0,
                right:0
            }
        }
    },
    beforeMount(){
        if (this.safety) {
            let safety = this.$store.getters['system/getSafety'];
            if (safety) {
                this.safetySize.top = safety.top
                this.safetySize.bottom = safety.bottom
                this.safetySize.left = safety.left
                this.safetySize.right = safety.right
            } else {
                uni.getSystemInfo({
                    success:(res=>{
                        if (!res.safeAreaInsets) res.safeAreaInsets = {}
                        this.safetySize.top = res.safeAreaInsets.top || 0;
                        this.safetySize.bottom = res.safeAreaInsets.bottom || 0;
                        this.safetySize.left = res.safeAreaInsets.left || 0;
                        this.safetySize.right = res.safeAreaInsets.right || 0;
                    })
                })
            }
        }
    }
}
</script>
<style scoped lang="scss">
.full-page-layout{
    .full-page-layout-containter{
        height: 100%;
        overflow: auto;
        position: relative;
        &.gradient-default{
            background-image: linear-gradient(to right, $color-paimary-darken, $color-paimary-middle) !important;
        }
    }
}
</style>
PipeLineLems.PDA/components/HeaderPageLayout.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
<template>
    <full-page-layout :gradient="gradient" :base-background-color="baseBackgroundColor" :gradient-value="gradientValue" :safety="safety" :full="full">
        <view class="header-page-containter">
            <view class="header-page-containter-header">
                <page-header :color="headerColor" :gradient="headerGradient" :gradient-value="headerGradientValue" :background-color="headerBackgroundColor" @click="onHeaderAsideClick">
                    <template v-slot:left v-if="$scopedSlots.headerleft"><slot name="headerleft"></slot></template>
                    {{title}}
                    <template v-slot:right v-if="$scopedSlots.headerright"><slot name="headerright"></slot></template>
                </page-header>
            </view>
            <view class="header-page-containter-body" :style="{backgroundColor:backgroundColor}">
                <slot></slot>
            </view>
            <view class="header-page-footer" :style="{backgroundColor:backgroundColor}">
                <slot name="footer"></slot>
            </view>
        </view>
    </full-page-layout>
</template>
<script>
import FullPageLayout from './FullPageLayout.vue'
import PageHeader from './PageHeader.vue'
export default {
    name:'headerPageCompontent',
    emits:['headerclick'],
    components:{FullPageLayout,PageHeader},
    props:{
        /* æ˜¯å¦å¯ç”¨åº•色渐变(backgroundImage) */
        gradient:{
            type:Boolean,
            default:false
        },
        /* åº•色渐变(backgroundImage)值,css语法,default时使用默认渐变色 */
        gradientValue:{
            type:String,
            default:'default'
        },
        backgroundColor:{
            type:String,
            default:''
        },
        baseBackgroundColor:{
            type:String,
            default:''
        },
        safety:{
            type:Boolean,
            default:true
        },
        title:{
            type:String,
            default:'Title'
        },
        headerColor:{
            type:String,
            default:'#212121'
        },
        /* å¤´éƒ¨æ˜¯å¦å¯ç”¨åº•色渐变(backgroundImage) */
        headerGradient:{
            type:Boolean,
            default:false
        },
        /* å¤´éƒ¨åº•色渐变(backgroundImage)值,css语法,default时使用默认渐变色 */
        headerGradientValue:{
            type:String,
            default:'default'
        },
        headerBackgroundColor:{
            type:String,
            default:''
        },
        full:{
            type:Boolean,
            default:true
        }
    },
    data(){
        return {
            bodyHeight:0
        }
    },
    methods:{
        onHeaderAsideClick(type){
            this.$emit('headerclick',type)
        },
        getBodyHeight(){
            return this.bodyHeight
        }
    },
    mounted() {
        const query = uni.createSelectorQuery().in(this);
        query.select('.header-page-containter-body').boundingClientRect(data => {
            this.bodyHeight = data.height
        }).exec();
    }
}
</script>
<style scoped lang="scss">
.header-page-containter{
    height: 100%;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    .header-page-containter-header,.header-page-footer{
        flex-shrink: 0;
    }
    .header-page-containter-body{
        flex-grow: 1;
        overflow: auto;
    }
}
</style>
PipeLineLems.PDA/components/PageHeader.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
<template>
    <view class="page-header-compontent" :class="[(gradient&&gradientValue==='default')?'gradient-default':'']"  :style="{
        color:color,
        backgroundColor:gradient?'transparent':(backgroundColor?backgroundColor:'transparent'),
        backgroundImage:gradient?(gradientValue!=='default'?gradientValue:'none'):'none'
    }">
        <view class="left-action" v-if="$scopedSlots.left" @tap.stop="onAsideClick('left')"><slot name="left"></slot></view>
        <view class="title"><slot></slot></view>
        <view class="right-action" v-if="$scopedSlots.right" @tap.stop="onAsideClick('right')"><slot name="right"></slot></view>
    </view>
</template>
<script>
export default {
    name:'pageheaderCompontent',
    emits:['click'],
    props:{
        color:{
            type:String,
            default:'#212121'
        },
        /* æ˜¯å¦å¯ç”¨åº•色渐变(backgroundImage) */
        gradient:{
            type:Boolean,
            default:false
        },
        /* åº•色渐变(backgroundImage)值,css语法,default时使用默认渐变色 */
        gradientValue:{
            type:String,
            default:'default'
        },
        backgroundColor:{
            type:String,
            default:''
        }
    },
    methods:{
        onAsideClick(type){
            this.$emit('click',type)
        }
    }
}
</script>
<style scoped lang="scss">
.page-header-compontent{
    width: 100%;
    height: 90rpx;
    position: relative;
    font-size: 32rpx;
    &.gradient-default{
        background-image: linear-gradient(to right, $color-paimary-darken, $color-paimary-middle) !important;
    }
    .title{
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 1.2em;
    }
    >.left-action,>.right-action{
        position: absolute;
        top:0;
        height: 100%;
        z-index: 5;
        display: flex;
        align-items: center;
    }
    >.left-action{
        left: 0rpx;
        padding-left: 8px;
    }
    >.right-action{
        right: 0rpx;
        padding-right: 8px;
    }
}
</style>
PipeLineLems.PDA/components/RadioFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
<template>
    <view class="radio-input-form-item-component">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <radio-group @change="change" v-model="innerValue" style="{display: flex;justify-content: space-evenly;}">
                    <radio :value="option.value" :shape="shape" :key="option.value" v-for="option in options"
                        >{{ option.label }}</radio>
                </radio-group>
            </view>
            <!-- <view class="scan-view" v-if="hasScan">
                <view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
            </view>
            <view class="btn-view" v-if="hasSearch">
                <view class="search-btn" @tap.stop="onSearch">搜</view>
            </view> -->
        </view>
        <!-- <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view> -->
    </view>
</template>
<script>
    export default {
        name: 'RadioInputFormItemComponent',
        emits: ['input', 'search', 'clear', 'blur', 'confirm', 'change'],
        props: {
            label: {
                type: String,
                default: ''
            },
            msg: {
                type: String,
                default: ''
            },
            msgType: {
                type: String,
                default: 'error'
            },
            shape: {
                type: String,
                denfault: 'square'
            },
            options: {
                type: Array,
                default: () => []
            },
            value: {
                type: [String, Number, null],
                default: ''
            },
            hasScan: {
                type: Boolean,
                default: true
            },
            hasSearch: {
                type: Boolean,
                default: true
            },
            disabled: {
                type: Boolean,
                default: false
            },
            required: {
                type: Boolean,
                default: false
            }
        },
        data() {
            return {
                innerValue: ''
            }
        },
        watch: {
            value(newVal, oldVal) {
                if (newVal != this.innerValue) {
                    this.innerValue = newVal
                    console.log(this.innerValue);
                }
            },
            innerValue(newVal, oldVal) {
                if (newVal !== this.value) {
                    this.$emit('input', newVal)
                    this.$emit('change', newVal)
                }
            }
        },
        methods: {
            change(object){
                var {detail}=object
                this.$emit('change', detail?.value)
            },
            onScan() {
                uni.scanCode({
                    success: (res) => {
                        this.innerValue = res.result;
                    },
                    fail: function() {
                        console.log('scanCode fail')
                    }
                })
            },
            onSearch() {
                this.$emit('search', this.innerValue)
            },
            onClear() {
                this.innerValue = null;
                this.$emit('clear')
            },
            onBlur() {
                this.$emit('blur', this.innerValue)
            },
            onConfirm() {
                this.$emit('search', this.innerValue)
            }
        },
        created() {
            this.innerValue = this.value
        }
    }
</script>
<style scoped lang="scss">
    .radio-input-form-item-component {
        width: 100%;
        .p-form-label {
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag {
                color: $u-error;
            }
        }
        .input-row {
            width: 100%;
            height: 90rpx;
            overflow: hidden;
            background-color: $uni-bg-color;
            display: flex;
            align-items: center;
            position: relative;
            .scan-view,
            .btn-view {
                flex-shrink: 0;
            }
            .scan-view {
                display: flex;
                align-items: center;
                justify-content: center;
                padding-right: 10rpx;
            }
            .input-view {
                flex-grow: 1;
                padding-left: 20rpx;
                .custom-radio-group {
                    /* é‡å†™ uni-radio-group çš„æ ·å¼ */
                    display: flex;
                    /* å…¶ä»–样式 */
                }
                .custom-radio-group .uni-radio {
                    /* é‡å†™ uni-radio çš„æ ·å¼ */
                    display: flex;
                    /* å…¶ä»–样式 */
                }
            }
            &>.mask {
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                z-index: 100;
                background-color: #fff;
                opacity: 0.25;
            }
        }
        .msg-row {
            padding: 6rpx 20rpx 0 20rpx;
            line-height: 1.3;
            font-size: 24rpx;
            color: $u-error;
            word-break: break-all;
            word-wrap: break-word;
            &.info-type {
                color: $color-blue;
            }
        }
    }
    ::v-deep radio {
        margin-right:20rpx
    }
</style>
PipeLineLems.PDA/components/ReadRfid.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
<template>
  <view>
    <view class="uni-padding-wrap">
      NFC
      <view class="uni-common-mt" style="background: #fff; padding: 20upx">
        <text>UID: {{ UID }}</text>
        <text>状态:{{ tip }}</text>
        <text>消息:{{ msg }}</text>
      </view>
    </view>
    <button @click="writeData">writeData</button>
  </view>
</template>
<script>
var NfcAdapter;
export default {
  props: {
    // å®šä¹‰ä¸€ä¸ª UID å±žæ€§ï¼Œå¯ä»¥ç”¨æ¥æŽ¥æ”¶çˆ¶ç»„件传递的数据
    uid: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      title: 'redNFC',
      UID: '',
      msg: '',
      tip: '',
      readyWriteData: false
    };
  },
  watch: {
    uid(newVal) {
      // å½“父组件更新 UID æ—¶ï¼ŒåŒæ­¥åˆ°æœ¬åœ°æ•°æ®
      this.UID = newVal;
    }
  },
  onLoad() {
    console.log('onLoad');
  },
  onShow() {
    console.log('onShow');
    this.NFCInit();
  },
  onHide() {
    console.log('onHide');
    this.NFCReadUID();
  },
  methods: {
    clearInfo() {
      this.UID = '';
      this.tip = '';
      this.msg = '';
    },
    writeData() {
      // Your existing writeData logic
    },
    NFCReadUID2() {
      // Your existing NFCReadUID2 logic
    },
    hexStringToBytes(str) {
      var bytes = [];
      for (var i = 0; i < str.length; i += 2) {
        bytes.push(parseInt(str.substring(i, i + 2), 16));
      }
      return bytes;
    },
    NFCInit() {
      try {
        var main = plus.android.runtimeMainActivity();
        var Intent = plus.android.importClass('android.content.Intent');
        var Activity = plus.android.importClass('android.app.Activity');
        var PendingIntent = plus.android.importClass('android.app.PendingIntent');
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');
        NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
        var _nfcAdapter = NfcAdapter.getDefaultAdapter(main);
        var ndef = new IntentFilter('android.nfc.action.NDEF_DISCOVERED'); //NfcAdapter.ACTION_NDEF_DISCOVERED
        var tag = new IntentFilter('android.nfc.action.TAG_DISCOVERED'); //NfcAdapter.ACTION_TECH_DISCOVERED
        var tech = new IntentFilter('android.nfc.action.TECH_DISCOVERED');
        var intentFiltersArray = [ndef, tag, tech];
        var techListsArray = [
          ['android.nfc.tech.Ndef'],
          ['android.nfc.tech.IsoDep'],
          ['android.nfc.tech.NfcA'],
          ['android.nfc.tech.NfcB'],
          ['android.nfc.tech.NfcF'],
          ['android.nfc.tech.Nfcf'],
          ['android.nfc.tech.NfcV'],
          ['android.nfc.tech.NdefFormatable'],
          ['android.nfc.tech.MifareClassi'],
          ['android.nfc.tech.MifareUltralight']
        ];
        var _intent = new Intent(main, main.getClass());
        _intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        var pendingIntent = PendingIntent.getActivity(main, 0, _intent, 0);
        if (_nfcAdapter == null) {
          this.tip = '本设备不支持NFC!';
        } else if (_nfcAdapter.isEnabled() == false) {
          this.tip = 'NFC功能未打开!';
        } else {
          this.tip = 'NFC正常';
          _nfcAdapter.enableForegroundDispatch(main, pendingIntent, IntentFilter, techListsArray);
        }
      } catch (e) {
        console.log(e);
      }
    },
    NFCReadUID() {
        console.log(1234567890)
      var main = plus.android.runtimeMainActivity();
      var _intent = main.getIntent();
      var _action = _intent.getAction();
      console.log('NFCReadUID action:', _action);
      if (NfcAdapter.ACTION_NDEF_DISCOVERED == _action || NfcAdapter.ACTION_TAG_DISCOVERED == _action || NfcAdapter.ACTION_TECH_DISCOVERED == _action) {
        var Tag = plus.android.importClass('android.nfc.Tag');
        var tagFromIntent = _intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        var uid = _intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        var text = _intent.getByteArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        var rawMsgs = _intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        this.UID = this.Bytes2HexString(uid);
        this.msg = text;
        // è§¦å‘自定义事件,将 UID ä¼ é€’给父组件
        this.$emit('update:uid', this.UID);
        uni.showToast({
          title: text + "~~" + this.UID,
          icon: 'none'
        });
      }
    },
    Bytes2HexString(arrBytes) {
      var str = '';
      for (var i = 0; i < arrBytes.length; i++) {
        var tmp;
        var num = arrBytes[i];
        if (num < 0) {
          tmp = (255 + num + 1).toString(16);
        } else {
          tmp = num.toString(16);
        }
        if (tmp.length == 1) {
          tmp = '0' + tmp;
        }
        str += tmp;
      }
      return str;
    },
    toast(content) {
      uni.showToast({
        title: content,
        icon: 'none'
      });
    }
  }
};
</script>
<style></style>
PipeLineLems.PDA/components/ScanEasyItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<template>
</template>
<script>
</script>
<style>
</style>
PipeLineLems.PDA/components/ScanInputFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row" v-if="content">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <u--input
                    :clearable="clearable"
                    border="none"
                    :type="type"
                    :placeholder="placeholder"
                    v-model.trim="innerValue"
                    @clear="onClear"
                    @blur="onBlur"
                    @confirm="onConfirm"
                />
            </view>
            <view class="scan-view" v-if="hasScan">
                <view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
            </view>
            <view class="btn-view" v-if="hasSearch">
                <view class="search-btn" @tap.stop="onSearch">搜</view>
            </view>
        </view>
        <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
    </view>
</template>
<script>
export default {
    name:'ScanInputFormItemCompontent',
    emits:['input','search','clear','blur','confirm','change'],
    props:{
        type:{
            type:String,
            default:'text'
        },
        label:{
            type:String,
            default:''
        },
        placeholder:{
            type:String,
            default:'请输入...'
        },
        msg:{
            type:String,
            default:''
        },
        msgType:{
            type:String,
            default:'error'
        },
        value:{
            type:[String,Number,null],
            default:''
        },
        hasScan:{
            type:Boolean,
            default:true
        },
        hasSearch:{
            type:Boolean,
            default:true
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        required:{
            type:Boolean,
            default:false
        },
        content:{
            type:Boolean,
            default:true
        }
    },
    data(){
        return {
            innerValue:this.value||''
        }
    },
    watch:{
        value(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerValue = newVal
            }
        },
        innerValue(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('input',newVal)
                this.$emit('change',newVal)
            }
        }
    },
    methods:{
        onScan(){
            uni.scanCode({
                success:(res)=>{
                    this.innerValue = res.result;
                },
                fail:function(){
                    console.log('scanCode fail')
                }
            })
        },
        onSearch(){
            this.$emit('search',this.innerValue)
        },
        onClear(){
            this.innerValue = null;
            this.$emit('clear')
        },
        onBlur(){
            this.$emit('blur',this.innerValue)
        },
        onConfirm(){
            this.$emit('search',this.innerValue)
        }
    },
    created() {
        this.innerValue = this.value
    }
}
</script>
<style scoped lang="scss">
.scan-input-form-item-compontent{
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:$u-error;
        }
    }
    .input-row{
        width: 100%;
        height: 75rpx;
        overflow: hidden;
        background-color: $uni-bg-color;
        display: flex;
        align-items: center;
        position: relative;
        .scan-view,.btn-view{
            flex-shrink: 0;
        }
        .scan-view{
            display: flex;
            align-items: center;
            justify-content: center;
            padding-right: 10rpx;
        }
        .input-view{
            flex-grow: 1;
            padding-left: 20rpx;
        }
        .btn-view{
            width:70rpx;
            height: 100%;
            padding: 20rpx;
            padding-left: 0rpx;
            box-sizing: border-box;
            .search-btn{
                height: 100%;
                width: 100%;
                border-radius: 8rpx;
                background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
                display: flex;
                align-items: center;
                justify-content: center;
                color: $uni-bg-color;
                font-size: 26rpx;
            }
        }
        &>.mask{
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            z-index: 100;
            background-color: #fff;
            opacity: 0.25;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
        word-break:break-all;
        word-wrap:break-word;
        &.info-type{
            color:$color-blue;
        }
    }
}
</style>
PipeLineLems.PDA/components/ScanInputFormItemWc2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row" v-if="content">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <u--input
                    :clearable="clearable"
                    border="none"
                    :type="type"
                    :placeholder="placeholder"
                    v-model.trim="innerValue"
                    @clear="onClear"
                    @blur="onBlur"
                    @focus="innerValue=''"
                    @confirm="onConfirm"
                />
            </view>
            <view class="scan-view" v-if="hasScan">
                <view @tap.stop="onScan"><u-icon name="scan" color="#F18201" :size="32"></u-icon></view>
            </view>
            <view class="btn-view" v-if="hasSearch">
                <view class="search-btn" @tap.stop="searchShowBox">搜</view>
            </view>
        </view>
        <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
    </view>
</template>
<script>
export default {
    name:'ScanInputFormItemCompontent',
    emits:['input','search','clear','blur','confirm','change','searchShowBox'],
    props:{
        type:{
            type:String,
            default:'text'
        },
        label:{
            type:String,
            default:''
        },
        placeholder:{
            type:String,
            default:'请输入...'
        },
        msg:{
            type:String,
            default:''
        },
        msgType:{
            type:String,
            default:'error'
        },
        value:{
            type:[String,Number,null],
            default:''
        },
        hasScan:{
            type:Boolean,
            default:true
        },
        hasSearch:{
            type:Boolean,
            default:true
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        required:{
            type:Boolean,
            default:false
        },
        content:{
            type:Boolean,
            default:true
        }
    },
    data(){
        return {
            innerValue:this.value||''
        }
    },
    watch:{
        value(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerValue = newVal
            }
        },
        innerValue(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('input',newVal)
                this.$emit('change',newVal)
            }
        }
    },
    methods:{
        onScan(){
            uni.scanCode({
                success:(res)=>{
                    this.innerValue = res.result;
                },
                fail:function(){
                    console.log('scanCode fail')
                }
            })
        },
        onSearch(){
            this.$emit('search',this.innerValue)
        },
        searchShowBox(){
            this.$emit('searchShowBox',this.innerValue)
        },
        onClear(){
            this.innerValue = null;
            this.$emit('clear')
        },
        onBlur(){
            this.$emit('blur',this.innerValue)
        },
        onConfirm(){
            this.$emit('search',this.innerValue)
        }
    },
    created() {
        this.innerValue = this.value
    }
}
</script>
<style scoped lang="scss">
.scan-input-form-item-compontent{
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:$u-error;
        }
    }
    .input-row{
        width: 100%;
        height: 75rpx;
        overflow: hidden;
        background-color: $uni-bg-color;
        display: flex;
        align-items: center;
        position: relative;
        .scan-view,.btn-view{
            flex-shrink: 0;
        }
        .scan-view{
            display: flex;
            align-items: center;
            justify-content: center;
            padding-right: 10rpx;
        }
        .input-view{
            flex-grow: 1;
            padding-left: 20rpx;
        }
        .btn-view{
            width:70rpx;
            height: 100%;
            padding: 20rpx;
            padding-left: 0rpx;
            box-sizing: border-box;
            .search-btn{
                height: 100%;
                width: 100%;
                border-radius: 8rpx;
                background: linear-gradient(157.342820970935deg, rgba(194, 128, 255, 1) -20%, rgba(194, 128, 255, 1) -19%, rgba(132, 0, 255, 1) 119%);
                display: flex;
                align-items: center;
                justify-content: center;
                color: $uni-bg-color;
                font-size: 26rpx;
            }
        }
        &>.mask{
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            z-index: 100;
            background-color: #fff;
            opacity: 0.25;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
        word-break:break-all;
        word-wrap:break-word;
        &.info-type{
            color:$color-blue;
        }
    }
}
</style>
PipeLineLems.PDA/components/UViewFormSelectPicker.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,213 @@
<template>
    <view class="u-view-form-select-picker-component">
        <view class="input-row" @tap.stop="onOpenPicker" :style="{backgroundColor:disabled?disabledColor:''}">
            <view class="mask" @tap.stop="" v-if="disabled"></view>
            <view class="input-view">
                <text v-if="!innerLabel" class="placeholder">{{placeholder}}</text>
                <text v-else>{{innerLabel}}</text>
            </view>
            <view class="close-view" @tap.stop="onClear" v-if="innerLabel && clearable">
                <view class="close-circle">
                    <u-icon
                        name="close"
                        size="11"
                        color="#ffffff"
                        customStyle="line-height: 12px"
                    ></u-icon>
                </view>
            </view>
            <view class="right-icon-view"><u-icon name="arrow-right"></u-icon></view>
        </view>
        <easy-picker :visible.sync="pickerVisible" :list="list" :value-field="valueField" :label-field="labelField" @select="onPickerSelect" />
    </view>
</template>
<script>
import EasyPicker from './EasyPicker.vue'
export default {
    name:'uViewFormSelectPickerComponent',
    components:{EasyPicker},
    emits:['input','select','clear'],
    props:{
        placeholder:{
            type:String,
            default:'请选择...'
        },
        value:{
            type:[String,Boolean,Number,null],
            default:null
        },
        list:{
            type:Array,
            default:function(){
                return []
            }
        },
        valueField:{
            type:String,
            default:'value'
        },
        labelField:{
            type:String,
            default:'label'
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        disabledColor:{
            type:String,
            default:'#f5f7fa'
        }
    },
    data(){
        return {
            innerValue:'',
            innerLabel:'',
            pickerVisible:false,
            initFlag:false
        }
    },
    watch:{
        value(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerValue = newVal;
            }
        },
        innerValue(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('input',newVal)
            }
            if (newVal!==oldVal) {
                this.setLabelValue()
            }
        },
        list(){
            this.setInitData()
        }
    },
    methods:{
        onOpenPicker(){
            if (this.list.length<=0) return false
            uni.hideKeyboard()
            this.pickerVisible = true
        },
        onPickerSelect(value,selection,index){
            this.innerValue = value;
            this.$emit('select',value,selection,index)
        },
        setLabelValue(){
            let noMatch = true;
            for (let i=0;i<this.list.length;i++) {
                if (this.isBaseItem(this.list[i])) {
                    if (this.list[i]===this.innerValue) {
                        this.innerLabel = this.list[i];
                        noMatch = false;
                        break;
                    }
                } else {
                    if (this.list[i][this.valueField]===this.innerValue) {
                        this.innerLabel = this.list[i][this.labelField];
                        noMatch = false;
                        break;
                    }
                }
            }
            if (noMatch) {
                this.innerLabel = this.innerValue
            }
        },
        isBaseItem(item){
            if (typeof(item)==='string'||typeof(item)==='number'||typeof(item)==='boolean'||item===undefined||item===null){
                return true
            } else {
                return false
            }
        },
        setInitData(){
            this.innerValue = this.value;
            if (this.list.length===1) {
                if (!this.initFlag) {
                    this.initFlag = true
                    let _tempVal = null;
                    if (!this.isBaseItem(this.list[0])) {
                        _tempVal = this.list[0][this.valueField];
                    } else {
                        _tempVal = this.list[0];
                    }
                    if (!this.innerValue) {
                        this.innerValue = _tempVal;
                    }
                }
            }
        },
        onClear(){
            this.innerValue = null;
            this.$emit('clear')
        }
    },
    created() {
        this.setInitData()
    }
}
</script>
<style scoped lang="scss">
.u-view-form-select-picker-component{
    width: 100%;
    .input-row{
        width: 100%;
        min-height: 48rpx;
        border-radius: 8rpx;
        overflow: hidden;
        background-color: $uni-bg-color;
        display: flex;
        align-items: center;
        position: relative;
        .close-view,.right-icon-view{
            flex-shrink: 0;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .close-view{
            .close-circle{
                width: 20px;
                height: 20px;
                border-radius: 50%;
                background-color: #c6c7cb;
                display: flex;
                flex-direction: row;
                align-items: center;
                justify-content: center;
                transform: scale(0.82);
                margin-left: 4px;
            }
        }
        .input-view{
            flex-grow: 1;
            font-size: 30rpx;
            white-space:nowrap;
            overflow:hidden;
            text-overflow:ellipsis;
            color: rgb(48, 49, 51);
            .placeholder{
                color: rgb(192, 196, 204);
            }
        }
        &>.mask{
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            z-index: 100;
        }
    }
}
</style>
PipeLineLems.PDA/components/selectItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" :label="label" v-model="value" :disabled="disabled"/>
        <EasyPicker :visible.sync="visible" :list="selectData" :labelField="labelField" :valueField="valueField"
            @select="getSelectData" />
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPicker.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        props: {
            selectData: {
                type: Array,
                default: () => []
            },
            value:{
                type: String,
                default: ''
            },
            label:{
                type:String,
                default:''
            },
            labelField:{
                type:String,
                default:''
            },
            valueField:{
                type:String,
                default:''
            },
            disabled:{
                type:Boolean,
                default:false
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
            }
        },
        methods: {
            getSelectData(val,obj){
                this.$emit('update:value',val,obj)
            },
            parseDic
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/components/selectItemWithSearchWc2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
<template>
    <!-- ç‚¹å‡»è¾“入框 å¯è¾“入;也可点击搜索按钮 å¼¹å‡ºé€‰æ‹©æ¡† -->
  <view class="forma-item">
    <view class="scan-input-form-item-compontent">
      <view class="p-form-label" v-if="label">
        <text v-if="required" class="required-tag">*</text>{{ label }}:
      </view>
      <view class="input-row" v-if="content">
        <view class="mask" @tap.stop="" v-if="disabled"></view>
        <view class="input-view">
          <input
            :clearable="clearable"
            border="none"
            :type="type"
            :placeholder="placeholder"
            v-model.trim="innerValue"
            @clear="onClear"
            @blur="onBlur"
            @focus="innerValue = ''"
            @confirm="onConfirm(innerValue)"
          />
        </view>
        <view class="scan-view" v-if="hasScan">
          <view @tap.stop="onScan">
            <u-icon name="scan" color="#F18201" :size="32"></u-icon>
          </view>
        </view>
        <view class="btn-view" v-if="hasSearch">
          <view class="search-btn" @tap.stop="searchShowBox">搜</view>
        </view>
      </view>
      <!-- :class="msgType === 'info' ? 'info-type' : ''" -->
      <view class="msg-row info-type" v-if="innerValue">
        {{ msg }}
      </view>
    </view>
    <EasyPicker
      :visible.sync="visible"
      :list="selectData"
      :labelField="labelField"
      :valueField="valueField"
      @select="getSelectData"
      :isShowSearch="true"
      @getCurrentData="getCurrentData"
    />
  </view>
</template>
<script>
import { parseDic } from "@/static/js/utils/index.js";
import EasyPicker from "@/components/EasyPickerWithSearch.vue";
export default {
  emits: ["getPropData", "confirmHc"],
  props: {
    type: { type: String, default: "text" },
    label: { type: String, default: "" },
    placeholder: { type: String, default: "请输入..." },
    msg: { type: String, default: "" },
    msgType: { type: String, default: "error" },
    hasScan: { type: Boolean, default: true },
    hasSearch: { type: Boolean, default: true },
    disabled: { type: Boolean, default: false },
    clearable: { type: Boolean, default: true },
    required: { type: Boolean, default: false },
    content: { type: Boolean, default: true },
    selectData: { type: Array, default: () => [] },
    labelField: { type: String, default: "" },
    valueField: { type: String, default: "" },
    value: {
      type: String,
      default: "",
    },
  },
  components: {
    EasyPicker,
  },
  watch: {
    value(newVal) {
      this.innerValue = newVal; // é¿å…çˆ¶ç»„件更新后 localValue ä¸åŒæ­¥
    }
  },
  data() {
    return {
      visible: false,
      innerValue: this.value,
    };
  },
  methods: {
    // å¼¹æ¡†æ•°æ® ç‚¹å‡»æŸä¸€é¡¹ç¡®è®¤
    getSelectData(val) {
      this.$emit("update:value", val);
      this.$emit("confirmHc",val); // æœç´¢åŽè°ƒç”¨çš„æŽ¥å£
    },
    //弹框中的数据
    getCurrentData(val) {
      this.$emit("getPropData", val);
    },
    onScan() {
      uni.scanCode({
        success: (res) => {
          this.innerValue = res.result;
        },
        fail: () => {
          console.log("scanCode fail");
        },
      });
    },
    searchShowBox() {
      this.visible = true; // æ˜¾ç¤ºå¼¹æ¡†
      this.$emit("searchShowBox", this.innerValue);
    },
    onClear() {
      this.innerValue = null;
      this.$emit("clear");
    },
    onBlur() {
      this.$emit("blur", this.innerValue);
    },
    onConfirm(val) {
      if (this.innerValue) {
        this.$emit("update:value", val);
        this.$emit("confirmHc",val);
      }
    },
  },
};
</script>
<style scoped lang="scss">
.scan-input-form-item-compontent {
  width: 100%;
  .p-form-label {
    font-size: 32rpx;
    color: $u-tips-color;
        padding-bottom: 12rpx;
    padding-left: 20rpx;
    .required-tag {
      color: $u-error;
    }
  }
  .input-row {
    width: 100%;
    height: 75rpx;
    overflow: hidden;
    background-color: $uni-bg-color;
    display: flex;
    align-items: center;
    position: relative;
    .scan-view,
    .btn-view {
      flex-shrink: 0;
    }
    .scan-view {
      display: flex;
      align-items: center;
      justify-content: center;
      padding-right: 10rpx;
    }
    .input-view {
      flex-grow: 1;
      padding-left: 20rpx;
    }
    .btn-view {
      width: 70rpx;
      height: 100%;
      padding: 20rpx;
      padding-left: 0rpx;
      box-sizing: border-box;
      .search-btn {
        height: 100%;
        width: 100%;
        border-radius: 8rpx;
        background: linear-gradient(
          157.342820970935deg,
          rgba(194, 128, 255, 1) -20%,
          rgba(194, 128, 255, 1) -19%,
          rgba(132, 0, 255, 1) 119%
        );
        display: flex;
        align-items: center;
        justify-content: center;
        color: $uni-bg-color;
        font-size: 26rpx;
      }
    }
    & > .mask {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      z-index: 100;
      background-color: #fff;
      opacity: 0.25;
    }
  }
  .msg-row {
    padding: 6rpx 20rpx 0 20rpx;
    line-height: 1.3;
    font-size: 24rpx;
    color: $u-error;
    word-break: break-all;
    word-wrap: break-word;
    &.info-type {
      color: $color-blue;
    }
  }
}
</style>
PipeLineLems.PDA/config/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import ajax from './modules/ajax.js'
import pagination from './modules/pagination.js'
export default {
    ajax,
    pagination,
    downUrl:'http://127.0.0.1:18000/wc2.apk',
    path: {
        home:'/pages/home/index',
        login:'/pages/login/index',
        bluetooth:'/pages/print/bluetoothConnection',
        host:'/pages/setting/host',
        online:'/pages/online/index',
        bind:'/pages/bind/index',
        bindInForLocation:'/pages/bindInForLocation/index',
        bindContaniner:'/pages/bindContaniner/index',
        pick:'/pages/pick/index',
        receive:'/pages/receiveIn/index',
        temporaryIn:'/pages/temporaryInstore/index',
        manualOut:'/pages/manual/out',
        unbind:'/pages/unbind/index',
        tasks:'/pages/tasks/index',
        notices:'/pages/notices/index',
        fapaoIn:'/pages/fapaoInStore/index',
        fapaoOut:'/pages/fapiaoOutStore/index',
        slicingOn:'/pages/slicingOn/index',
        slicingOff:'/pages/slicingOff/index',
        plywoodBind:'/pages/plywoodBind/index',
        plywoodInstore:'/pages/plywoodInstore/index',
        plywoodOut:'/pages/plywoodOut/index',
        emptyOut:'/pages/emptyOut/index',
        rsbIn:'/pages/rsbIn/index',
        emptyIn:'/pages/emptyIn/index',
        rsbOut:'/pages/rsbOut/index',
        sandingIn:'/pages/sandingInstore/index',
        endProductIn:'/pages/endProductInstore/index',
        innerTailBack:'/pages/innerTailBack/index',
        unstackingIn:'/pages/unstackingInstore/index',
        transport:'/pages/transport/index',
        changeStore:'/pages/changeStore/index',
        takeInStore:'/pages/takeInStore/index',
        checkStock:'/pages/checkStock/index',
        receiptExecution:'/pages/receiptExecution/index',
        sortingSearch:'/pages/sortingSearch/index',
        Outbound:'/pages/inAndOutBound/index',
        replenishMent:'/pages/replenishMent/index',
        sorting:'/pages/sortingSearch/index',
        exception:'/pages/exceptionHandle/index',
        containerHandle:'/pages/containerHandle/index',
        bindWXJ:'/pages/bindWXJ/index',
        containerUnBind:'/pages/containerUnBind/index',
        oneTouchUnBind:'/pages/oneTouchUnBind/index',
        PointHandling:'/pages/PointHandling/index',
        emptyInCopy:'/pages/emptyInCopy/index',
        emptyContainerReturn:'/pages/emptyContainerReturn/index',
        writeRfid:'/pages/writeRfid/index',
        loadingDelivery:'/pages/loadingDelivery/index',
        materialStorage:'/pages/materialStorage/index'
    }
}
PipeLineLems.PDA/config/modules/ajax -²âÊÔ.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
export default {
    errMsg:'网络错误!',
    host:{  //接口调用的域名设置
        //'default':'http://10.15.250.185:2001'
        'default':'http://localhost:5006',
        // 'default':'http://192.168.1.10:2001',
        'auth':'http://10.10.40.166:183',
        'mock':'http://localhost:3012'
    },
    block:{
        default:'/api/',
        sysDic:'/api/sysDictType/',
        online:'/api/FoamBoard/',
        offline:'/api/Receipt/',
        quickIn:'/api/QuickWoreHouse/',
        exware:'/api/ExWarePDA/',
        task:'/api/pdatask/',
        fapaoIn:'/api/automaticwarehouse/',
        fapaoOut:'/api/groupdiskoutwarehouse/',
        wentrance:'/api/warewarehouseentrance/',
        generic:'/api/BeCurrent/',
        plywood:'/api/PlywoodGroupDisk/',
        emptyOut:'/api/CallEmpty/',
        emptyIn:'/api/InEmpty/',
        rsbIn:'/api/RSBGroupDisk/',
        sandingIn:'/api/SandingWarehouse/',
        endProduct:'/api/FinishProductInWare/',
        innerTail:'/api/TailStockReturn/',
        unstacking:'/api/UnstackingRuKu/',
        transport:'/api/Transport/',
        changeStore:'/api/Relocation/',
        checkStock:'/api/inventoryplanexce/'
    }
}
PipeLineLems.PDA/config/modules/ajax -Éú²ú.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
export default {
    errMsg:'网络错误!',
    host:{  //接口调用的域名设置
        'default':'http://127.0.0.1:18000',
        'auth':'http://10.10.40.166:183',
        'mock':'http://localhost:3012'
    },
    block:{
        default:'/api/',
        sysDic:'/api/sysDictType/',
        online:'/api/FoamBoard/',
        offline:'/api/Receipt/',
        quickIn:'/api/QuickWoreHouse/',
        exware:'/api/ExWarePDA/',
        task:'/api/pdatask/',
        fapaoIn:'/api/automaticwarehouse/',
        fapaoOut:'/api/groupdiskoutwarehouse/',
        wentrance:'/api/warewarehouseentrance/',
        generic:'/api/BeCurrent/',
        plywood:'/api/PlywoodGroupDisk/',
        emptyOut:'/api/CallEmpty/',
        emptyIn:'/api/InEmpty/',
        rsbIn:'/api/RSBGroupDisk/',
        sandingIn:'/api/SandingWarehouse/',
        endProduct:'/api/FinishProductInWare/',
        innerTail:'/api/TailStockReturn/',
        unstacking:'/api/UnstackingRuKu/',
        transport:'/api/Transport/',
        changeStore:'/api/Relocation/',
        checkStock:'/api/inventoryplanexce/'
    }
}
PipeLineLems.PDA/config/modules/ajax.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
export default {
    errMsg:'网络错误!',
    host:{  //接口调用的域名设置
        'default':'http:///localhost:8080',
        'auth':'http://10.10.40.166:183',
        'mock':'http://localhost:3012'
    },
    block:{
        default:'/api/',
        sysDic:'/api/sysDictType/',
        online:'/api/FoamBoard/',
        offline:'/api/Receipt/',
        quickIn:'/api/QuickWoreHouse/',
        exware:'/api/ExWarePDA/',
        task:'/api/pdatask/',
        fapaoIn:'/api/automaticwarehouse/',
        fapaoOut:'/api/groupdiskoutwarehouse/',
        wentrance:'/api/warewarehouseentrance/',
        generic:'/api/BeCurrent/',
        plywood:'/api/PlywoodGroupDisk/',
        emptyOut:'/api/CallEmpty/',
        emptyIn:'/api/InEmpty/',
        rsbIn:'/api/RSBGroupDisk/',
        sandingIn:'/api/SandingWarehouse/',
        endProduct:'/api/FinishProductInWare/',
        innerTail:'/api/TailStockReturn/',
        unstacking:'/api/UnstackingRuKu/',
        transport:'/api/Transport/',
        changeStore:'/api/Relocation/',
        checkStock:'/api/inventoryplanexce/'
    }
}
PipeLineLems.PDA/config/modules/pagination.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
export default {
    pageNo:1,
    pageSize:10
}
PipeLineLems.PDA/index.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <script>
      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
        CSS.supports('top: constant(a)'))
      document.write(
        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
    </script>
    <title></title>
    <!--preload-links-->
    <!--app-context-->
  </head>
  <body>
    <div id="app"><!--app-html--></div>
    <script type="module" src="/main.js"></script>
  </body>
</html>
PipeLineLems.PDA/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
import App from './App'
import Vue from 'vue'
import uView from '@/uni_modules/uview-ui'
import createStore from './service/store'
import config from './config/index.js'
import defineApi from './service/request'
const store = createStore(Vue);
const $api = new defineApi(store,config)
Vue.config.productionTip = false
App.mpType = 'app'
Vue.use(uView)
Vue.prototype.$modal = function(content,callback=()=>{},type = 0,title="提示") {
    uni.showModal({
        title,
        content,
        icon: type = 0 ? 'success' : 'error',
        showCancel:false,
        success:callback
    })
}
Vue.prototype.$config = config;
Vue.prototype.$api = $api;
const app = new Vue({
    ...App,
    store: store
})
app.$mount()
PipeLineLems.PDA/manifest.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
{
    "name" : "wc2Pad",
    "appid" : "__UNI__1A52976",
    "description" : "",
    "versionName" : "2025-03-01",
    "versionCode" : 100,
    "transformPx" : false,
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* æ¨¡å—配置 */
        "modules" : {},
        /* åº”用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios" : {
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {
                "ad" : {}
            },
            "icons" : {
                "android" : {
                    "hdpi" : "unpackage/res/icons/72x72.png",
                    "xhdpi" : "unpackage/res/icons/96x96.png",
                    "xxhdpi" : "unpackage/res/icons/144x144.png",
                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                },
                "ios" : {
                    "appstore" : "unpackage/res/icons/1024x1024.png",
                    "ipad" : {
                        "app" : "unpackage/res/icons/76x76.png",
                        "app@2x" : "unpackage/res/icons/152x152.png",
                        "notification" : "unpackage/res/icons/20x20.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "proapp@2x" : "unpackage/res/icons/167x167.png",
                        "settings" : "unpackage/res/icons/29x29.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "spotlight" : "unpackage/res/icons/40x40.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
                    },
                    "iphone" : {
                        "app@2x" : "unpackage/res/icons/120x120.png",
                        "app@3x" : "unpackage/res/icons/180x180.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "notification@3x" : "unpackage/res/icons/60x60.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "settings@3x" : "unpackage/res/icons/87x87.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                    }
                }
            }
        }
    },
    /* å¿«åº”用特有相关 */
    "quickapp" : {},
    /* å°ç¨‹åºç‰¹æœ‰ç›¸å…³ */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "2",
    "fallbackLocale" : "en",
    "locale" : "en",
    "h5" : {
        "router" : {
            "mode" : "hash",
            "base" : "./"
        },
        "title" : "wc3_pda",
        "devServer" : {
            "port" : 2066
        }
    }
}
PipeLineLems.PDA/mdImgs/1664329468868.jpg
PipeLineLems.PDA/mdImgs/1664329790970.jpg
PipeLineLems.PDA/mdImgs/1664330296712.png
PipeLineLems.PDA/mdImgs/1665970038354.jpg
PipeLineLems.PDA/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
{
  "name": "pda_vue2_demo",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "api": "json-server __json_server_mock__/db.json --watch --port 3012 --host 0.0.0.0"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dayjs": "^1.11.10",
    "vuex": "^3.6.2"
  },
  "devDependencies": {
    "json-server": "^0.17.1"
  }
}
PipeLineLems.PDA/pages.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/start/index"
        },
        {
            "path": "pages/login/index"
        },
        {
            "path": "pages/home/index"
        },
        {
            "path": "pages/setting/host"
        },
        {
            "path": "pages/print/bluetoothConnection"
        },
        {
            "path": "pages/online/index"
        },
        {
            "path": "pages/bind/index"
        },
        {
            "path": "pages/bindInForLocation/index" // å…¥åº“ é€‰æ‹©åº“位
        },
        {
            "path": "pages/emptyContainerReturn/index"
        },
        {
            "path": "pages/bindContaniner/index"
        },
        {
            "path": "pages/pick/index"
        },
        {
            "path":"pages/sortingSearch/index"
        }
        ,{
            "path" : "pages/replenishMent/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/inAndOutBound/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/exceptionHandle/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/exceptionHandle/modules/exceptionPlace",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/exceptionHandle/modules/materialInfo",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/emptyOut/index"
        },
        {
            "path": "pages/emptyIn/index"
        },
        {
            "path": "pages/containerHandle/index"
        },
        {
            "path": "pages/bindWXJ/index"
        },
        {
            "path": "pages/containerUnBind/index"
        },
        {
            "path": "pages/oneTouchUnBind/index"
        },
        {
            "path": "pages/PointHandling/index"
        },
        {
            "path": "pages/emptyInCopy/index"
        },
        {
            "path" : "pages/writeRfid/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/loadingDelivery/index"
        },
        {
            "path": "pages/materialStorage/index"
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "管子线LMESDemo",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8",
        "navigationStyle": "custom"
    },
    "uniIdRouter": {}
}
PipeLineLems.PDA/pages/PointHandling/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,421 @@
<template>
  <default-header-page-layout ref="page" title="点到点搬运">
    <view
      class="page-frame with-action-user-row"
      :style="{ height: pageBodyHeight + 'px' }"
      v-if="pageBodyHeight"
    >
      <action-user-row />
      <view class="with-action-user-row-page-content">
        <!-- åº“区 -->
        <selectItem
          :selectData="areaData"
          :value.sync="form.areaNo"
          label="起始库区"
          labelField="areaName"
          valueField="areaNo"
        />
        <!-- åº“位 -->
        <selectItemWc2
          :selectData="placeList"
          :value.sync="form.placeNo"
          label="库位编码"
          labelField="placeNo"
          valueField="placeNo"
          @getPropData="getPropData"
          @confirmHc="getStockPageHandle"
        />
        <!-- æ‰˜ç›˜ç¼–码 -->
        <scan-input-form-item
          v-show="Boolean(form.containerNo)"
          disabled
          :clearable="false"
          placeholder=""
          :hasScan="false"
          :hasSearch="false"
          @click.native="ctVisible = true"
          class="forma-item"
          label="托盘编码"
          v-model="form.containerNo"
        />
        <!-- ç›®æ ‡åº“区 -->
        <selectItem
          :selectData="areaData"
          :value.sync="form.targetAreaNo"
          label="目标库区"
          labelField="areaName"
          valueField="areaNo"
        />
        <div v-if="false">
          <scan-input-form-item
            class="forma-item"
            label="库位已有托盘信息"
            :content="false"
          />
          <containerInfo :containerInfo="containerPlaceInfo" />
        </div>
        <!-- <placeInfo v-show="selectDisabled" :placeInfo="containerInfo.placeInfo" /> -->
      </view>
    </view>
    <template v-slot:footer>
      <view class="bottom-btns-row">
        <template>
          <div class="btn-frame">
            <u-button
              type="primary"
              :disabled="!abled"
              text="提交"
              @click="onSubmit"
            ></u-button>
          </div>
        </template>
      </view>
    </template>
  </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from "@/components/DefaultHeaderPageLayout.vue";
import ActionUserRow from "@/components/ActionUserRow.vue";
import ScanInputFormItem from "@/components/ScanInputFormItem.vue";
import selectItem from "@/components/selectItem.vue";
import selectItemWc2 from "@/components/selectItemWithSearchWc2.vue";
import placeInfo from "./modules/placeInfo.vue";
import containerInfo from "./modules/containerInfo.vue";
import {
  parseDic,
  $alert,
  $successInfo,
  getDicList,
} from "@/static/js/utils/index.js";
import { palceList } from "@/service/mixins/mixins.js";
import {
  getContainerPlaceInfo,
  containerHandle,
  getContainerPlaceByPlace,
} from "@/api/containerHandle.js";
import { getAreaInfo, getAreaListContaninerBind } from "@/api/common.js";
import { pointHandlingTask } from "@/api/PointHandling.js";
let initInterVal = null;
export default {
  name: "containerHandle",
  components: {
    DefaultHeaderPageLayout,
    ActionUserRow,
    ScanInputFormItem,
    placeInfo,
    selectItem,
    containerInfo,
    selectItemWc2
  },
  data() {
    return {
      pageBodyHeight: 0,
      containter: null,
      form: {
        containerNo: "",
        areaNo: "",
        placeNo: "",
        targetPlaceNo: "",
      },
      msg: {
        containter: "",
      },
      msgType: {
        containter: "info",
      },
      containerInfo: {},
      areaData: [],
      targetPlaceList: [],
      containerPlaceInfo: {},
    };
  },
  computed: {
    selectDisabled() {
      return Boolean(this.containerInfo?.placeInfo?.placeNo);
    },
    abled() {
      //return Boolean(this.form.containerNo)
      return true;
      // return Boolean(this.form.containerNo) && Boolean(this.form.targetPlaceNo)
    },
    placeInfoShow() {
      return (
        Boolean(this.containerInfo.containerNo) &&
        Boolean(this.form.placeNo) &&
        Boolean(this.containerPlaceInfo.containerNo) &&
        !Boolean(this.containerInfo?.placeInfo?.placeNo)
      );
    },
  },
  watch: {
    "form.areaNo": {
      handler(val, oldVal) {
        if (val != "") {
          this.form.placeNo = "";
          this.form.containerNo = "";
          this.placeList = [];
          this.getPalceList({
            areaCode: val,
          });
          // if (Boolean(this.containerInfo?.placeInfo?.placeNo)) {
          //     this.$set(this.form, 'placeNo', this.containerInfo.placeInfo.placeNo)
          // }
        }
      },
    },
    "form.targetAreaNo": {
      async handler(val, oldVal) {
        if (val != "") {
          this.form.targetPlaceNo = "";
          this.targetPlaceList = [];
          this.targetPlaceList = await this.getTargetPlaceList({
            areaCode: val,
          });
          // if (Boolean(this.containerInfo?.placeInfo?.placeNo)) {
          //     this.$set(this.form, 'placeNo', this.containerInfo.placeInfo.placeNo)
          // }
        }
      },
    },
    "form.placeNo": {
      async handler(val, oldVal) {
        if (val != "" && val!=oldVal) {
          this.containerPlaceInfo = {};
          try {
            let { result } = await getContainerPlaceByPlace({
              placeNo: this.form.placeNo,
            });
            this.containerPlaceInfo = result == null ? {} : result;
            this.$set(this.form, "containerNo", result?.containerNo);
          } catch (e) {
            //TODO handle the exception
            console.log(e);
          }
        }
      },
    },
  },
  methods: {
    //库位模糊查询
    async getPropData(PlaceNo) {
      await this.getPalceList({
        areaCode: this.form.areaNo,
        PlaceNo: PlaceNo,
      });
    },
    /* æ‰˜ç›˜ç¼–码搜索 */
    async onSearchContainter() {
      const { containerNo } = this.form;
      if (!Boolean(containerNo)) {
        this.msgType.containter = "error";
        this.msg.containter = "请输入托盘编号!";
        return false;
      }
      // èŽ·å–ä»£ç 
      try {
        let { result } = await getContainerPlaceInfo({
          containerNo,
        });
        this.containerInfo = result;
        if (Boolean(this.containerInfo?.placeInfo?.placeNo)) {
          this.getAreaList();
          this.$nextTick(() => {
            this.$set(
              this.form,
              "areaNo",
              this.containerInfo?.placeInfo?.areaCode
            );
          });
        }
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    /* æ¸…除编码 */
    onClear() {
      this.form = {
        containterNo: "",
        areaNo: "",
        placeNo: "",
        targetAreaNo: "",
        targetPlaceNo: "",
      };
    },
    // èŽ·å–åº“åŒºæ•°æ®
    async getAreaList() {
      try {
        let { result } = await getAreaInfo();
        this.areaData = result;
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    // æ‰˜ç›˜å¤„理
    async onSubmit() {
      try {
        await pointHandlingTask(this.form);
        this.$modal("点到点搬运任务生成成功");
        this.onClear();
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
    startInitInterval(callback) {
      initInterVal = setInterval(() => {
        if (this.pageBodyHeight) {
          this.clearInitInterval();
          callback && callback();
        } else {
          this.pageBodyHeight = this.$refs.page.getBodyHeight();
        }
      }, 200);
    },
    /* æ¸…除定时器 */
    clearInitInterval() {
      try {
        clearInterval(initInterVal);
        initInterVal = null;
      } catch (e) {
        //TODO handle the exception
      }
    },
    //1获取库存
    async getStockPageHandle(val) {
     console.log(val);
    },
  },
  mixins: [palceList],
  onReady() {
    this.startInitInterval(async () => {
      /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
      this.getAreaList();
      this.ContainerType = getDicList(
        this.$store,
        "container_type"
      ).sysDictDatas;
    });
  },
  onUnload() {
    this.clearInitInterval();
  },
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
  display: flex;
  justify-content: center;
  padding: 10rpx 10rpx;
  background-color: #fff;
  .btn-frame {
    flex: 1;
    box-sizing: border-box;
  }
  .btn-frame:nth-child(1) {
    margin-right: 10rpx;
  }
  .left-btn-frame {
    padding-left: 20rpx;
    padding-right: 8rpx;
  }
  .right-btn-frame {
    padding-right: 20rpx;
    padding-left: 8rpx;
  }
}
.forma-item {
  margin-bottom: 24rpx;
}
.material-item-group {
  background-color: $uni-bg-color;
  padding-top: 10rpx;
  .material-list-item {
    border-bottom: 2rpx solid $uni-border-color;
    padding-bottom: 10rpx;
    padding-left: 60rpx;
    margin-bottom: 10rpx;
    position: relative;
    &:last-child {
      border-bottom: 0;
    }
    .item-row {
      display: flex;
      & > .label {
        flex-shrink: 0;
        color: $u-tips-color;
        width: 144rpx;
      }
      & > .content {
        flex-grow: 1;
        color: $u-content-color;
        uni-input {
          font: inherit;
          color: $u-primary;
          text-decoration: underline;
        }
      }
    }
    .badge-box {
      position: absolute;
      top: 8rpx;
      left: 8rpx;
      z-index: 1;
    }
    .close-btn {
      $closeBtnSize: 70rpx;
      width: $closeBtnSize;
      height: $closeBtnSize;
      z-index: 1;
      position: absolute;
      top: 0rpx;
      right: 8rpx;
      background-color: $u-error;
      opacity: 0.6;
      border-radius: 25rpx;
      .icon-layer {
        position: absolute;
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 2;
      }
    }
  }
}
.label {
  margin-left: 25rpx;
  font-size: 30rpx;
}
</style>
PipeLineLems.PDA/pages/PointHandling/modules/containerInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">托盘编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.containerNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">库位编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">托盘库位状态:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?(parseDic($store,'common_status',containerInfo.containerPlaceStatus)):''}}</view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            containerInfo: {
                type: Object,
                default: () => {}
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped lang="scss">
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/PointHandling/modules/placeInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label">库位详情:</view>
        <view class="material-item-group" v-if="Boolean(placeInfo)">
            <view class="material-list-item">
                <view class="item-row">
                    <view class="label">库位编号:</view>
                    <view class="content auto-wrap">{{placeInfo.placeNo}}</view>
                </view>
                <view class="item-row">
                    <view class="label">所属库区:</view>
                    <view class="content auto-wrap">{{placeInfo.areaCode}}</view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            placeInfo: {
                type: Object,
                default: () => {placeNo:''}
            }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
        }
    }
</script>
<style scoped lang="scss">
    .scan-input-form-item-compontent{
        width: 100%;
        .p-form-label{
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag{
                color:$u-error;
            }
        }}
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        background-color: #fff;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/PointHandling/modules/selectItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" :label="label" v-model="value" :disabled="disabled"/>
        <EasyPicker :visible.sync="visible" :list="selectData" :labelField="labelField" :valueField="valueField"
            @select="getSelectData" :isShowSearch="isShowSearch" @getCurrentData="getCurrentData"/>
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPickerWithSearch.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        emits:['getCurrentData'],
        props: {
            selectData: {
                type: Array,
                default: () => []
            },
            value:{
                type: String,
                default: ''
            },
            label:{
                type:String,
                default:''
            },
            labelField:{
                type:String,
                default:''
            },
            valueField:{
                type:String,
                default:''
            },
            disabled:{
                type:Boolean,
                default:false
            },
            isShowSearch:{
                type:Boolean,
                default:false
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
            }
        },
        methods: {
            getSelectData(val){
                this.$emit('update:value',val)
            },
            getCurrentData(val){
                //调用库位接口,获取库位列表
                this.$emit('getCurrentData',val)
            },
            parseDic
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/pages/bind/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,535 @@
<template>
    <default-header-page-layout ref="page" title="自制件组盘入库">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <scan-input-form-item class="forma-item" label="托盘编码" v-model="form.containterCode"
                    :msg="msg.containter" :msg-type="msgType.containter" @search="onSearchContainter"
                    @clear="onClearContainter" />
                <scan-input-form-item  placeholder="请选择"
                    :disabled = "disabledContainerType"
                    :clearable="false"
                    :hasScan="false" :hasSearch="false" @click.native="ctVisible=true" class="forma-item" label="托盘类型"
                    v-model="form.containerType" />
                <EasyPicker :visible.sync="ctVisible" :list="ContainerType" labelField="value" valueField="code"
                    @select="getTypeVal" />
                <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" class="forma-item" label="物料二维码" v-model="form.materialNo" :msg="msg.material"
                    :msg-type="msgType.material" @search="onSearchMaterial" @clear="onClearMaterial" />
            <!--     <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
                    @click.native="visible=true" class="forma-item" label="选择入库口" v-model="form.site" />
                <EasyPicker :visible.sync="visible" :list="placeList.filter(item=>item.columnNo!=3&&item.columnNo!=4)"
                    labelField="placeNo" valueField="placeNo" @select="getSiteVal" /> -->
                <!-- è‡ªåˆ¶ä»¶å…¥åº“测试 -->
                <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" class="forma-item" label="库位号" v-model="form.placeNo" :hasScan="false"
                    :hasSearch="false" />
                <materialList :materialData="materialData" @delMaterialData="delMaterialData" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="abled&&materialData.length>0">
                <!--     <div class="btn-frame"><u-button type="primary" text="组 ç›˜" @click="onSubmit(1)"
                            :disabled="!abled"></u-button></div> -->
                    <div class="btn-frame"><u-button type="primary" text="组盘在库" @click="onSubmit(2)"
                                    :disabled="!abled"></u-button></div>
                    <!-- <div class="btn-frame"><u-button type="primary" text="组盘入库" @click="addInBound(1)"
                            :disabled="!abled"></u-button></div> -->
                <!--     <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="自制件入库"
                            @click="addVirtual(1)" :disabled="!abled"></u-button></div> -->
                    <!-- <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="生成任务"
                            @click="addVirtualTask" :disabled="!abled"></u-button></div> -->
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import materialList from './modules/materialList.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getForContainerCode,
        getForMaterialNo,
        bindMaterialContainer,
        addInBound,
        addInVirtualPlace,
        addAGVTask
    } from '@/api/bind.js'
    let initInterVal = null;
    export default {
        name: 'receiveInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            materialList,
            EasyPicker
        },
        data() {
            return {
                pageBodyHeight: 0,
                containter: null,
                form: {
                    containterCode: '',
                    materialNo: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                },
                msg: {
                    containter: '',
                    material: '',
                    site: '',
                },
                msgType: {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                },
                containerInfo: {},
                materialData: [],
                ContainerType: [],
                visible: false,
                ctVisible: false,
                disabledContainerType:false
            }
        },
        computed: {
            abled() {
                let {
                    containerStatus
                } = this.containerInfo
                return containerStatus != 0 && containerStatus != 3 && this.materialData.length > 0
            }
        },
        watch: {
            'form.containterCode': {
                handler(val, oldVal) {
                    this.resetContainerNo()
                }
            }
        },
        methods: {
            // æµ‹è¯•PLC触发生成入库任务
            async addVirtualTask() {
                try {
                    await addAGVTask({
                        containerNo: this.form.containterCode
                    })
                    $alert("生成任务成功");
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // é€‰æ‹©ç«™ç‚¹è¿”回值
            getSiteVal(val, valObj, index) {
                this.form.site = val
            },
            // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
            getTypeVal(val, valObj, index) {
                this.form.containerTypeCode = valObj.code
                this.form.containerType = valObj.value
            },
            /* æ‰˜ç›˜ç¼–码搜索 */
            async onSearchContainter() {
                if (!this.form.containterCode) {
                    this.msgType.containter = 'error'
                    this.msg.containter = '请输入托盘编号!';
                    return false;
                }
                // èŽ·å–ä»£ç 
                try {
                    let {
                        result
                    } = await getForContainerCode({
                        code: this.form.containterCode
                    })
                    this.containerInfo = result
                    // æ‰˜ç›˜è¯¦æƒ…
                    let containerStatusName = parseDic(this.$store, 'container_status', result?.containerStatus);
                    containerStatusName = containerStatusName == '无此字典' ? '' : containerStatusName;
                    this.msg.containter = `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`;
                    if(result.containerType){ //如果托盘存在 èµ‹å€¼æ‰˜ç›˜ç±»åž‹
                        var arr = this.ContainerType.filter(v=>v.code == result.containerType);
                        this.form.containerType = arr[0]?.value || "";
                        this.form.containerTypeCode = arr[0]?.code || "";
                        this.disabledContainerType = true;
                    }else{
                        this.disabledContainerType = false;
                        this.form.containerType ="";
                        this.form.containerTypeCode = "";
                    }
                    result?.materialContainers.forEach(item => {
                        let isExist = this.materialData.some(item1 => item1.materialId == item.materialId)
                        if (!isExist) {
                            this.materialData.push(item)
                        }
                    })
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* æ¸…除托盘编码 */
            onClearContainter() {
                this.form = {
                    containterCode: '',
                    materialNo: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                }
                this.disabledContainerType = false;
                this.$set(this.form, 'site', '')
                this.resetContainerNo()
            },
            resetContainerNo() {
                this.msg = {
                    containter: '',
                    material: '',
                    site: '',
                }
                this.msgType = {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                }
                this.containerStatus = null
                this.materialData = []
                this.form.materialNo = ''
                this.form.site = ''
                this.form.containerTypeCode = 0
                this.form.containerType = ''
                this.containerInfo = {}
            },
            /* ç‰©æ–™ç¼–码搜索 */
            async onSearchMaterial() {
                if (!this.form.materialNo) {
                    this.msg.material = '请输入物料编号!';
                    return false;
                }
                this.msg.material = ''
                try {
                    let {
                        result
                    } = await getForMaterialNo({
                        code: this.form.materialNo
                    })
                    const isExist = this.materialData.some(item => item.materialId == result.materialId)
                    if (!isExist) {
                        this.materialData.push(result)
                    }else{
                        $alert(`物料唯一码已存在,请删除后再输入!`);
                    }
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* ç‰©æ–™ç¼–码清除 */
            onClearMaterial() {
                this.form.materialNo = ''
            },
            //删除物料
            delMaterialData(materialId) {
                this.materialData = this.materialData.filter(item => item.materialId != materialId)
            },
            // ç»„盘
            async onSubmit(param) {
                if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
                    return $alert("请选择托盘类型!")
                }
                if(param){
                    this.valateType("组盘");
                    return
                }
                let _isNeedAddContinerPlace=false;
                if (param==2 && !this.form.placeNo) {
                    return $alert("请输入库位号!");
                }
                if (this.form.placeNo) {
                    _isNeedAddContinerPlace=true;
                }
                const data = {
                    containerNo: this.form.containterCode,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData,
                    stationNo:this.form.placeNo,
                    isNeedAddContinerPlace:_isNeedAddContinerPlace
                }
                try {
                    await bindMaterialContainer(data)
                    this.$modal('组盘成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            //方法 æç¤º æ‰˜ç›˜ç±»åž‹ å’Œ ç‰©æ–™ç±»åž‹ ä¸ä¸€è‡´ æ˜¯å¦ç¡®è®¤ç»„盘
             valateType(name){
                if(this.materialData.length<=0){
                    return $alert("请扫物料!")
                }
                var flag = false;
                //物料类型:机体3 ç¼¸ç›–1;  å®¹å™¨ï¼šè‡ªåˆ¶ä»¶æœºä½“托盘4  è‡ªåˆ¶ä»¶ç¼¸ç›–托盘5
                if(this.materialData[0].materialType == 3 && this.form.containerTypeCode!=4){ //机体3
                    flag = true;
                }
                if(this.materialData[0].materialType == 1 && this.form.containerTypeCode!=5){ //缸盖1
                    flag = true;
                }
                if(flag){
                    uni.showModal({
                        title: '确认' + name,
                        content: '托盘类型和物料类型不一致,是否确认继续?',
                        showCancel: true,
                        confirmText: '确认',
                        cancelText: '取消',
                        success: async ({ confirm }) => {
                            if (confirm) {
                                if(name=="组盘"){
                                    this.onSubmit()
                                }
                                if(name=="入库"){
                                    this.addInBound()
                                }
                                if(name=="自制件入库"){
                                    this.addVirtual()
                                }
                            }
                        }
                    });
                }else{
                    if(name=="组盘"){
                                    this.onSubmit()
                                }
                                if(name=="入库"){
                                    this.addInBound()
                                }
                                if(name=="自制件入库"){
                                    this.addVirtual()
                                }
                }
            },
            // å…¥åº“
            async addInBound(param) {
                if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
                    return $alert("请选择托盘类型!")
                }
                // if (!this.form.site) {
                //     return $alert("请选择入库口!");
                // }
                if (!this.form.placeNo) {
                    return $alert("请输入库位号!");
                }
                if(param){
                    this.valateType("入库");
                    return
                }
                const data = {
                    type: 1,
                    //stationNo: this.form.site,
                    stationNo: this.form.placeNo,
                    containerNo: this.form.containterCode,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData
                }
                try {
                    await addInBound(data)
                    this.$modal('入库任务生成成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // è‡ªåˆ¶ä»¶å…¥åº“
            async addVirtual(param) {
                if(param){
                    this.valateType("自制件入库");
                    return
                }
                const data = {
                    containerNo: this.form.containterCode,
                    placeNo: this.form.placeNo,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData
                }
                try {
                    await addInVirtualPlace(data)
                    this.$modal('自制件入库成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.getPalceList({
                    areaCode: 'LTK-SDCR'
                })
                this.ContainerType = getDicList(this.$store, 'container_type').sysDictDatas
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/bind/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
    <u-swipe-action v-if="materialData.length>0">
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">供应商:</view>
                        <view class="content auto-wrap">{{item.supplierCode}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料类型:</view>
<!-- æžšä¸¾ -->
                        <view class="content auto-wrap">{{parseDic($store,'material_type',item.materialType)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">规格:</view>
                        <view class="content auto-wrap">{{item.materialSpec}}</view>
                    </view> -->
                    <view class="item-row">
                        <view class="label">机型:</view>
                        <view class="content auto-wrap">{{parseDic($store,'material_modal',item.materialModel)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/bindContaniner/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,411 @@
<template>
    <default-header-page-layout ref="page" title="外协件组托">
        <view class="page-frame with-action-user-row" :style="{ height: pageBodyHeight + 'px' }" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <scan-input-form-item
                    class="forma-item"
                    label="托盘编码"
                    v-model="form.containterCode"
                    :msg="msg.containter"
                    :msg-type="msgType.containter"
                    @search="onSearchContainter"
                    @clear="onClearContainter"
                />
                <scan-input-form-item
                    class="forma-item"
                    label="空托编码"
                    v-model="form.materialNo"
                    :msg="msg.material"
                    :msg-type="msgType.material"
                    @search="onSearchMaterial"
                    @clear="onClearMaterial"
                />
                <scan-input-form-item
                    placeholder="请选择"
                    :clearable="false"
                    :hasScan="false"
                    :hasSearch="false"
                    @click.native="visible = true"
                    class="forma-item"
                    label="选择库口"
                    v-model="form.site"
                />
                <EasyPicker :visible.sync="visible" :list="placeList.filter(item=>item.placeNo!='ZDCR')" labelField="placeNo" valueField="placeNo" @select="getSiteVal"/>
                <!-- <EasyPicker :visible.sync="visible" :list="placeList" labelField="placeNo" valueField="placeNo" @select="getSiteVal" /> -->
                <materialList :contaninerData="contaninerData" @delContainer="delContainer" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button  type="primary" text="组 æ‰˜" @click="onSubmit"></u-button></div>
                    <div class="btn-frame"><u-button type="primary" text="组托入库" @click="addInBound"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue';
import ActionUserRow from '@/components/ActionUserRow.vue';
import ScanInputFormItem from '@/components/ScanInputFormItem.vue';
import EasySelectFormItem from '@/components/EasySelectFormItem.vue';
import EasyPicker from '@/components/EasyPicker.vue';
import materialList from './modules/materialList.vue';
import { parseDic, $alert, $successInfo } from '@/static/js/utils/index.js';
import { palceList } from '@/service/mixins/mixins.js';
import { getContainerInfo } from '@/api/common.js';
import { getForEmptyContainerNo, getForMaterialNo, bindMaterialContainer, addInBound } from '@/api/bind.js';
    import {NFCInit,NFCReadUID } from '@/service/util/RfidMethod.js'
let initInterVal = null;
export default {
    name: 'receiveInPage',
    components: {
        DefaultHeaderPageLayout,
        ActionUserRow,
        ScanInputFormItem,
        EasySelectFormItem,
        materialList,
        EasyPicker
    },
    data() {
        return {
            pageBodyHeight: 0,
            form: {
                containterCode: '',
                materialNo: '',
                site: ''
            },
            msg: {
                containter: '',
                material: '',
                site: ''
            },
            msgType: {
                containter: 'info',
                material: 'error',
                site: 'error'
            },
            containerStatus: null,
            contaninerData: [],
            visible: false
        };
    },
    computed: {
        // disabledBind() {
        //     return !Boolean(this.containerStatus) || this.contaninerData.length < 1;
        // },
        // disabledBound() {
        //     return !Boolean(this.containerStatus);
        // }
    },
    watch: {
        'form.containterCode': {
            handler(val, oldVal) {
                this.resetContainerNo();
            }
        }
    },
        onShow() {
          console.log('onShow');
          var nfc = NFCInit();
          console.log(nfc);
        },
        onHide() {
          console.log('onHide');
          var rfid = NFCReadUID();
          if(rfid!=null){
              if(this.form.containterCode ==''){
                  this.form.containterCode = rfid.UID
              } else{
                  this.form.materialNo = rfid.UID
              }
          }
          console.log(rfid);
        },
    methods: {
        // é€‰æ‹©ç«™ç‚¹è¿”回值
        getSiteVal(val, valObj, index) {
            this.form.site = val;
        },
        /* æ‰˜ç›˜ç¼–码搜索 */
        async onSearchContainter() {
            if (!this.form.containterCode) {
                this.msgType.containter = 'error';
                this.msg.containter = '请输入托盘号!';
                return false;
            }
            // èŽ·å–ä»£ç 
            try {
                let { result } = await getForEmptyContainerNo({ code: this.form.containterCode });
                this.containerStatus = result?.containerStatus;
                // var notKT=result?.materialContainers.some(item=>item.materialNo!='KONGTUO')
                // if(notKT) {
                //     this.$modal('当前托盘存在非空托物料')
                //     this.onClearContainter()
                // }
                // æ‰˜ç›˜è¯¦æƒ…
                let containerStatusName = parseDic(this.$store, 'container_status', result?.containerStatus);
                containerStatusName = containerStatusName == '无此字典' ? '' : containerStatusName;
                this.msg.containter = `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`;
                result?.containerList.forEach((item) => {
                    let isExist = this.contaninerData.some((item1) => item1.containerNo == item.containerNo);
                    if (!isExist) {
                        this.contaninerData.push(item);
                    }
                });
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* æ¸…除托盘编码 */
        onClearContainter() {
            this.form = {
                containterCode: '',
                materialNo: '',
                site: ''
            };
            this.resetContainerNo();
        },
        // é‡å†™æ‰˜ç›˜ç¼–码
        resetContainerNo() {
            this.msg = {
                containter: '',
                material: '',
                site: ''
            };
            this.msgType = {
                containter: 'info',
                material: 'error',
                site: 'error'
            };
            this.containerStatus = null;
            this.contaninerData = [];
            this.form.materialNo = '';
            this.form.site = '';
        },
        /* ç©ºæ‰˜ç¼–码搜索 */
        async onSearchMaterial() {
            if (!this.form.materialNo) {
                this.msg.material = '请输入空托编号!';
                return false;
            }
            this.msg.material = '';
            try {
                let { result } = await getContainerInfo({ ContainerNo: this.form.materialNo });
                if (result.containerNo == this.form.containterCode) {
                    return this.$modal('当前空托与托盘重复');
                }
                var isExit = this.contaninerData.some((item) => item.containerNo == result.containerNo);
                isExit ? '' : this.contaninerData.push(result);
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* ç‰©æ–™ç¼–码清除 */
        onClearMaterial() {
            this.form.materialNo = '';
        },
        //删除空托
        delContainer(containerNo) {
            this.contaninerData = this.contaninerData.filter((item) => item.containerNo != containerNo);
        },
        // ç»„托
        async onSubmit() {
            let { contaninerData, form } = this;
            // if(contaninerData.length>3) {
            //     return $alert("组托数量不能超过4个!")
            // }
            const data = {
                type: 2,
                containerNo: form.containterCode,
                materialContainerList: []
            };
            data.materialContainerList = contaninerData.map((item) => {
                return {
                    materialNo: 'KONGTUO',
                    materialName: '空托',
                    materialId: item.containerNo
                };
            });
            try {
                await bindMaterialContainer(data);
                this.$modal('组托成功');
                this.onClearContainter();
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        // å…¥åº“
        async addInBound() {
            // if(this.contaninerData.length>3) {
            //     return $alert("组托数量不能超过4个!")
            // }
            const data = {
                stationNo: this.form.site,
                type: 2,
                containerNo: this.form.containterCode,
                materialContainerList: this.contaninerData.map((item) => {
                    return {
                        materialId: item.containerNo,
                        materialNo: 'KONGTUO',
                        materialName: '空托',
                        materialType: 4
                    };
                })
            };
            try {
                await addInBound(data);
                this.$modal('入库成功');
                this.onClearContainter();
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback) {
            initInterVal = setInterval(() => {
                if (this.pageBodyHeight) {
                    this.clearInitInterval();
                    callback && callback();
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight();
                }
            }, 200);
        },
        /* æ¸…除定时器 */
        clearInitInterval() {
            try {
                clearInterval(initInterVal);
                initInterVal = null;
            } catch (e) {
                //TODO handle the exception
            }
        }
    },
    mixins: [palceList],
    onReady() {
        this.startInitInterval(async () => {
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
            this.getPalceList({
                 areaCode: 'WXJSXL'
            });
        });
    },
    onUnload() {
        this.clearInitInterval();
    }
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
    display: flex;
    justify-content: center;
    padding: 10rpx 10rpx;
    background-color: #fff;
    .btn-frame {
        flex: 1;
        box-sizing: border-box;
    }
    .btn-frame:nth-child(1) {
        margin-right: 10rpx;
    }
    .left-btn-frame {
        padding-left: 20rpx;
        padding-right: 8rpx;
    }
    .right-btn-frame {
        padding-right: 20rpx;
        padding-left: 8rpx;
    }
}
.forma-item {
    margin-bottom: 24rpx;
}
.material-item-group {
    background-color: $uni-bg-color;
    padding-top: 10rpx;
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding-bottom: 10rpx;
        padding-left: 60rpx;
        margin-bottom: 10rpx;
        position: relative;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            & > .label {
                flex-shrink: 0;
                color: $u-tips-color;
                width: 144rpx;
            }
            & > .content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
        .badge-box {
            position: absolute;
            top: 8rpx;
            left: 8rpx;
            z-index: 1;
        }
        .close-btn {
            $closeBtnSize: 70rpx;
            width: $closeBtnSize;
            height: $closeBtnSize;
            z-index: 1;
            position: absolute;
            top: 0rpx;
            right: 8rpx;
            background-color: $u-error;
            opacity: 0.6;
            border-radius: 25rpx;
            .icon-layer {
                position: absolute;
                width: 100%;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: 2;
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/bindContaniner/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
<template>
    <u-swipe-action v-if="contaninerData.length>0" >
        <u-swipe-action-item :options="options" v-for="(item,index) in contaninerData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.containerNo">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">托盘编号:</view>
                        <view class="content auto-wrap">{{item.containerNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">托盘状态:</view>
                        <view class="content auto-wrap">{{parseDic($store,'container_status',item.containerStatus)}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">托盘规格:</view>
                        <view class="content auto-wrap">{{item.specLength}}*{{item.specWidth}}*{{item.specHeight}}</view>
                    </view>
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            contaninerData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delContainer',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/bindInForLocation/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,629 @@
<template>
  <default-header-page-layout ref="page" title="平库组盘入库">
    <view
      class="page-frame with-action-user-row"
      :style="{ height: pageBodyHeight + 'px' }"
      v-if="pageBodyHeight"
    >
      <action-user-row />
      <view class="with-action-user-row-page-content">
        <!-- step 1 start -->
        <scan-input-form-item
          class="forma-item"
          label="托盘编码"
          v-model="form.containterCode"
          :msg="msg.containter"
          :msg-type="msgType.containter"
          @search="onSearchContainter"
          @clear="onClearContainter"
        />
        <scan-input-form-item
          placeholder="请选择"
          :disabled="disabledContainerType"
          :clearable="false"
          :hasScan="false"
          :hasSearch="false"
          @click.native="ctVisible = true"
          class="forma-item"
          label="托盘类型"
          v-model="form.containerType"
        />
        <EasyPicker
          :visible.sync="ctVisible"
          :list="ContainerType"
          labelField="value"
          valueField="code"
          @select="getTypeVal"
        />
        <selectItem
          v-show="Boolean(containerInfo.containerNo)"
          :selectData="areaData"
          :value.sync="form.areaNo"
          label="库区编码"
          labelField="areaName"
          valueField="areaNo"
        />
        <!-- <selectItem
          :selectData="placeList"
          :value.sync="form.placeNo"
          label="库位编码"
          labelField="placeNo"
          valueField="placeNo"
          @getCurrentData="getCurrentData"
          :isShowSearch="true"
        /> -->
<!--  @confirmHc="getStockPageHandle" -->
        <selectItemWc2
          v-show="Boolean(containerInfo.containerNo)"
          :selectData="placeList"
          :value.sync="form.placeNo"
          label="库位编码"
          labelField="placeNo"
          valueField="placeNo"
          @getPropData="getCurrentData"
        />
        <scan-input-form-item
          v-show="Boolean(containerInfo.containerNo)"
          class="forma-item"
          label="物料二维码"
          v-model="form.materialNo"
          :msg="msg.material"
          :msg-type="msgType.material"
          @search="onSearchMaterial"
          @clear="onClearMaterial"
        />
        <materialList
          :materialData="materialData"
          @delMaterialData="delMaterialData"
        />
      </view>
    </view>
    <template v-slot:footer>
      <view class="bottom-btns-row">
        <template v-if="abled && materialData.length > 0">
          <div class="btn-frame">
            <u-button
              type="primary"
              text="组 ç›˜"
              @click="onSubmit(1)"
              :disabled="!abled"
            ></u-button>
          </div>
          <div class="btn-frame">
            <u-button
              type="primary"
              text="组盘入库"
              @click="AddInBoundForFlat(1)"
              :disabled="!abled"
            ></u-button>
          </div>
          <!-- <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="自制件入库"
                            @click="addVirtual(1)" :disabled="!abled"></u-button></div> -->
        </template>
      </view>
    </template>
  </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from "@/components/DefaultHeaderPageLayout.vue";
import ActionUserRow from "@/components/ActionUserRow.vue";
import ScanInputFormItem from "@/components/ScanInputFormItem.vue";
import EasySelectFormItem from "@/components/EasySelectFormItem.vue";
import EasyPicker from "@/components/EasyPicker.vue";
import materialList from "./modules/materialList.vue";
import selectItem from "@/components/selectItem.vue";
import { getAreaInfo } from "@/api/common.js";
import selectItemWc2 from "@/components/selectItemWithSearchWc2.vue";
import {
  parseDic,
  $alert,
  $successInfo,
  getDicList,
} from "@/static/js/utils/index.js";
import { palceList } from "@/service/mixins/mixins.js";
import {
  getForContainerCode,
  getForMaterialNo,
  bindMaterialContainer,
  AddInBoundForFlat,
  addInVirtualPlace,
  addAGVTask,
} from "@/api/bind.js";
let initInterVal = null;
export default {
  name: "receiveInPage",
  components: {
    DefaultHeaderPageLayout,
    ActionUserRow,
    ScanInputFormItem,
    EasySelectFormItem,
    materialList,
    EasyPicker,
    selectItem,
    selectItemWc2
  },
  data() {
    return {
      pageBodyHeight: 0,
      containter: null,
      form: {
        containterCode: "",
        materialNo: "",
        site: "",
        containerTypeCode: 0,
        containerType: "",
        placeNo: "",
      },
      msg: {
        containter: "",
        material: "",
        site: "",
      },
      msgType: {
        containter: "info",
        material: "error",
        site: "error",
      },
      containerInfo: {},
      materialData: [],
      ContainerType: [],
      visible: false,
      ctVisible: false,
      disabledContainerType: false,
      areaData: [],
      placeList: [],
    };
  },
  computed: {
    abled() {
      let { containerStatus } = this.containerInfo;
      return (
        containerStatus != 0 &&
        containerStatus != 3 &&
        this.materialData.length > 0
      );
    },
  },
  watch: {
    //选择区 é‡æ–°èŽ·å–åº“ä½
    "form.areaNo": {
      handler(val, oldVal) {
        if (val != "") {
          this.form.placeNo = "";
          this.placeList = [];
          // èŽ·å–åº“å­˜
          this.getPalceList({
            areaCode: val,
          });
        }
      },
    },
  },
  methods: {
    // é€‰æ‹©ç«™ç‚¹è¿”回值
    getSiteVal(val, valObj, index) {
      this.form.site = val;
    },
    // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
    getTypeVal(val, valObj, index) {
      this.form.containerTypeCode = valObj.code;
      this.form.containerType = valObj.value;
    },
    /* æ‰˜ç›˜ç¼–码搜索 */
    async onSearchContainter() {
      if (!this.form.containterCode) {
        this.msgType.containter = "error";
        this.msg.containter = "请输入托盘编号!";
        return false;
      }
      // èŽ·å–ä»£ç 
      try {
        this.materialData =[];
        let { result } = await getForContainerCode({
          code: this.form.containterCode,
        });
        this.containerInfo = result;
        // æ‰˜ç›˜è¯¦æƒ…
        let containerStatusName = parseDic(
          this.$store,
          "container_status",
          result?.containerStatus
        );
        containerStatusName =
          containerStatusName == "无此字典" ? "" : containerStatusName;
        this.msg.containter = `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`;
        if (result.containerType) {
          //如果托盘存在 èµ‹å€¼æ‰˜ç›˜ç±»åž‹
          var arr = this.ContainerType.filter(
            (v) => v.code == result.containerType
          );
          this.form.containerType = arr[0]?.value || "";
          this.form.containerTypeCode = arr[0]?.code || "";
          this.disabledContainerType = true;
        } else {
          this.disabledContainerType = false;
          this.form.containerType = "";
          this.form.containerTypeCode = "";
        }
        result?.materialContainers.forEach((item) => {
          let isExist = this.materialData.some(
            (item1) => item1.materialId == item.materialId
          );
          if (!isExist) {
            this.materialData.push(item);
          }
        });
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    /* æ¸…除托盘编码 */
    onClearContainter() {
      this.form = {
        containterCode: "",
        containerType: "",
        areaNo: "",
        materialNo: "",
        site: "",
        containerTypeCode: 0,
        placeNo: "",
      };
      this.disabledContainerType = false;
      this.$set(this.form, "site", "");
      this.resetContainerNo();
    },
    resetContainerNo() {
      this.msg = {
        containter: "",
        material: "",
        site: "",
      };
      this.msgType = {
        containter: "info",
        material: "error",
        site: "error",
      };
      this.containerStatus = null;
      this.materialData = [];
      this.form.materialNo = "";
      this.form.site = "";
      this.form.containerTypeCode = 0;
      this.form.areaNo = "";
      this.form.placeNo = "";
      this.form.containerType = "";
      this.containerInfo = {};
    },
    /* ç‰©æ–™ç¼–码搜索 */
    async onSearchMaterial() {
      if (!this.form.materialNo) {
        this.msg.material = "请输入物料编号!";
        return false;
      }
      this.msg.material = "";
      try {
        let { result } = await getForMaterialNo({
          code: this.form.materialNo,
        });
        const isExist = this.materialData.some(
          (item) => item.materialId == result.materialId
        );
        if (!isExist) {
          this.materialData.push(result);
        } else {
          $alert(`物料唯一码已存在,请删除后再输入!`);
        }
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    /* ç‰©æ–™ç¼–码清除 */
    onClearMaterial() {
      this.form.materialNo = "";
    },
    //删除物料
    delMaterialData(materialId) {
      this.materialData = this.materialData.filter(
        (item) => item.materialId != materialId
      );
    },
    // ç»„盘
    async onSubmit(param) {
      if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
        return $alert("请选择托盘类型!");
      }
      if (param) {
        this.valateType("组盘");
        return;
      }
      const data = {
        containerNo: this.form.containterCode,
        containerType: this.form.containerTypeCode,
        materialContainerList: this.materialData,
      };
      try {
        await bindMaterialContainer(data);
        this.$modal("组盘成功");
        this.onClearContainter();
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    //方法 æç¤º æ‰˜ç›˜ç±»åž‹ å’Œ ç‰©æ–™ç±»åž‹ ä¸ä¸€è‡´ æ˜¯å¦ç¡®è®¤ç»„盘
    valateType(name) {
      if (this.materialData.length <= 0) {
        return $alert("请扫物料!");
      }
      var flag = false;
      //物料类型:机体3 ç¼¸ç›–1;  å®¹å™¨ï¼šè‡ªåˆ¶ä»¶æœºä½“托盘4  è‡ªåˆ¶ä»¶ç¼¸ç›–托盘5
      if (
        this.materialData[0].materialType == 3 &&
        this.form.containerTypeCode != 4
      ) {
        //机体3
        flag = true;
      }
      if (
        this.materialData[0].materialType == 1 &&
        this.form.containerTypeCode != 5
      ) {
        //缸盖1
        flag = true;
      }
      if (flag) {
        uni.showModal({
          title: "确认" + name,
          content: "托盘类型和物料类型不一致,是否确认继续?",
          showCancel: true,
          confirmText: "确认",
          cancelText: "取消",
          success: async ({ confirm }) => {
            if (confirm) {
              if (name == "组盘") {
                this.onSubmit();
              }
              if (name == "入库") {
                this.AddInBoundForFlat();
              }
              if (name == "自制件入库") {
                this.addVirtual();
              }
            }
          },
        });
      } else {
        if (name == "组盘") {
          this.onSubmit();
        }
        if (name == "入库") {
          this.AddInBoundForFlat();
        }
        if (name == "自制件入库") {
          this.addVirtual();
        }
      }
    },
    // å…¥åº“
    async AddInBoundForFlat(param) {
      if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
        return $alert("请选择托盘类型!");
      }
      if (!this.form.placeNo) {
        return $alert("请选择库位!");
      }
      if (param) {
        this.valateType("入库");
        return;
      }
      const data = {
        type: 1,
        stationNo: this.form.site,
        placeNo: this.form.placeNo,
        containerNo: this.form.containterCode,
        containerType: this.form.containerTypeCode,
        materialContainerList: this.materialData,
      };
      try {
        await AddInBoundForFlat(data);
        this.$modal("入库成功");
        this.onClearContainter();
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    // è‡ªåˆ¶ä»¶å…¥åº“
    async addVirtual(param) {
      if (param) {
        this.valateType("自制件入库");
        return;
      }
      const data = {
        containerNo: this.form.containterCode,
        placeNo: this.form.placeNo,
        containerType: this.form.containerTypeCode,
        materialContainerList: this.materialData,
      };
      try {
        await addInVirtualPlace(data);
        this.$modal("自制件入库成功");
        this.onClearContainter();
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
    startInitInterval(callback) {
      initInterVal = setInterval(() => {
        if (this.pageBodyHeight) {
          this.clearInitInterval();
          callback && callback();
        } else {
          this.pageBodyHeight = this.$refs.page.getBodyHeight();
        }
      }, 200);
    },
    /* æ¸…除定时器 */
    clearInitInterval() {
      try {
        clearInterval(initInterVal);
        initInterVal = null;
      } catch (e) {
        //TODO handle the exception
      }
    },
    // èŽ·å–åº“åŒºæ•°æ®
    async getAreaList() {
      try {
        let { result } = await getAreaInfo();
        this.areaData = result.filter((item) => item.areaType == 3);
      } catch (e) {
        console.log(e);
      }
    },
    //库位模糊查询
    async getCurrentData(PlaceNo) {
      await this.getPalceList({
        areaCode: this.form.areaNo,
        PlaceNo: PlaceNo,
      });
    },
  },
  mixins: [palceList],
  onReady() {
    this.startInitInterval(async () => {
      /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
      // this.getPalceList({
      //     areaCode: 'LTK-SDCR'
      // })
      this.getAreaList();
      this.ContainerType = getDicList(
        this.$store,
        "container_type"
      ).sysDictDatas;
    });
  },
  onUnload() {
    this.clearInitInterval();
  },
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
  display: flex;
  justify-content: center;
  padding: 10rpx 10rpx;
  background-color: #fff;
  .btn-frame {
    flex: 1;
    box-sizing: border-box;
  }
  .btn-frame:nth-child(1) {
    margin-right: 10rpx;
  }
  .left-btn-frame {
    padding-left: 20rpx;
    padding-right: 8rpx;
  }
  .right-btn-frame {
    padding-right: 20rpx;
    padding-left: 8rpx;
  }
}
.forma-item {
  margin-bottom: 24rpx;
}
.material-item-group {
  background-color: $uni-bg-color;
  padding-top: 10rpx;
  .material-list-item {
    border-bottom: 2rpx solid $uni-border-color;
    padding-bottom: 10rpx;
    padding-left: 60rpx;
    margin-bottom: 10rpx;
    position: relative;
    &:last-child {
      border-bottom: 0;
    }
    .item-row {
      display: flex;
      & > .label {
        flex-shrink: 0;
        color: $u-tips-color;
        width: 144rpx;
      }
      & > .content {
        flex-grow: 1;
        color: $u-content-color;
        uni-input {
          font: inherit;
          color: $u-primary;
          text-decoration: underline;
        }
      }
    }
    .badge-box {
      position: absolute;
      top: 8rpx;
      left: 8rpx;
      z-index: 1;
    }
    .close-btn {
      $closeBtnSize: 70rpx;
      width: $closeBtnSize;
      height: $closeBtnSize;
      z-index: 1;
      position: absolute;
      top: 0rpx;
      right: 8rpx;
      background-color: $u-error;
      opacity: 0.6;
      border-radius: 25rpx;
      .icon-layer {
        position: absolute;
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 2;
      }
    }
  }
}
</style>
PipeLineLems.PDA/pages/bindInForLocation/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
    <u-swipe-action v-if="materialData.length>0" >
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">供应商:</view>
                        <view class="content auto-wrap">{{item.supplierCode}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料类型:</view>
<!-- æžšä¸¾ -->
                        <view class="content auto-wrap">{{parseDic($store,'material_type',item.materialType)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">规格:</view>
                        <view class="content auto-wrap">{{item.materialSpec}}</view>
                    </view> -->
                    <view class="item-row">
                        <view class="label">机型:</view>
                        <view class="content auto-wrap">{{parseDic($store,'material_modal',item.materialModel)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/bindWXJ/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,475 @@
<template>
    <default-header-page-layout ref="page" title="外协件组盘入库">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <scan-input-form-item class="forma-item" label="托盘编码" v-model="form.containterCode"
                    :msg="msg.containter" :msg-type="msgType.containter" @search="onSearchContainter"
                    @clear="onClearContainter" />
                    <!-- v-if="containerInfo.isExist==2" -->
                <scan-input-form-item placeholder="请选择" :clearable="false"
                    :hasScan="false" :hasSearch="false" @click.native="ctVisible=true" class="forma-item" label="托盘类型"
                    v-model="form.containerType" />
                <EasyPicker :visible.sync="ctVisible" :list="ContainerType" labelField="value" valueField="code"
                    @select="getTypeVal" />
                <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
                    @click.native="visibleSort1=true" class="forma-item" label="是否空托盘" v-model="form.sorting" />
                <EasyPicker :visible.sync="visibleSort1" :list="isSorting" labelField="label" valueField="value"
                    @select="radioChange1" />
                <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" class="forma-item" label="物料二维码" v-model="form.materialNo" :msg="msg.material"
                    :msg-type="msgType.material" @search="onSearchMaterial" @clear="onClearMaterial" />
                <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
                    @click.native="visible=true" class="forma-item" label="选择库位" v-model="form.site" />
                <EasyPicker :visible.sync="visible" :list="placeList"
                    labelField="placeNo" valueField="placeNo" @select="getSiteVal" />
                    <!-- .filter(item=>item.placeNo!='storageTypeNo') -->
                <!-- è‡ªåˆ¶ä»¶å…¥åº“测试 -->
                <!-- <scan-input-form-item v-show="Boolean(containerInfo.containerNo)" class="forma-item" label="外协件下料点(测试)" v-model="form.placeNo" :hasScan="false"
                    :hasSearch="false" /> -->
                <materialList :materialData="materialData" @delMaterialData="delMaterialData" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="abled">
                    <div class="btn-frame"><u-button type="primary" text="组 ç›˜" @click="onSubmit"
                            :disabled="!abled"></u-button></div>
                    <div class="btn-frame"><u-button type="primary" text="组盘入库" @click="addInBound"
                            :disabled="!abled"></u-button></div>
                    <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="外协件入库"
                            @click="addInVirtualWxjPlace" :disabled="!abled"></u-button></div>
                    <!-- <div class="btn-frame" style="margin-left:10rpx"><u-button type="primary" text="生成任务"
                            @click="addVirtualTask" :disabled="!abled"></u-button></div> -->
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import materialList from './modules/materialList.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getForContainerCode,
        getForMaterialNo,
        bindMaterialContainer,
        addInBound,
        addInVirtualWxjPlace,
        addAGVTask
    } from '@/api/bind.js'
    let initInterVal = null;
    export default {
        name: 'receiveInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            materialList,
            EasyPicker
        },
        data() {
            return {
                isSorting: [{
                        label: '是',
                        value: '1'
                    },
                    {
                        label: '否',
                        value: '0'
                    }
                ],
                pageBodyHeight: 0,
                containter: null,
                form: {
                    containterCode: '',
                    materialNo: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                },
                msg: {
                    containter: '',
                    material: '',
                    site: '',
                },
                msgType: {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                },
                containerInfo: {},
                materialData: [],
                ContainerType: [],
                visible: false,
                ctVisible: false,
                visibleSort1:false,
            }
        },
        computed: {
        /* && this.materialData.length > 0 */
            abled() {
                let {
                    containerStatus
                } = this.containerInfo
                return containerStatus != 0 && containerStatus != 3
            }
        },
        watch: {
            'form.containterCode': {
                handler(val, oldVal) {
                    this.resetContainerNo()
                }
            }
        },
        methods: {
            // æµ‹è¯•PLC触发生成入库任务
            async addVirtualTask() {
                try {
                    await addAGVTask({
                        containerNo: this.form.containterCode
                    })
                    $alert("生成任务成功");
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // é€‰æ‹©ç«™ç‚¹è¿”回值
            getSiteVal(val, valObj, index) {
                this.form.site = val
            },
            // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
            getTypeVal(val, valObj, index) {
                this.form.containerTypeCode = valObj.code
                this.form.containerType = valObj.value
            },
            /* æ‰˜ç›˜ç¼–码搜索 */
            async onSearchContainter() {
                if (!this.form.containterCode) {
                    this.msgType.containter = 'error'
                    this.msg.containter = '请输入托盘编号!';
                    return false;
                }
                // èŽ·å–ä»£ç 
                try {
                    let {
                        result
                    } = await getForContainerCode({
                        code: this.form.containterCode
                    })
                    this.containerInfo = result
                    // æ‰˜ç›˜è¯¦æƒ…
                    let containerStatusName = parseDic(this.$store, 'container_status', result?.containerStatus)
                    containerStatusName = containerStatusName == '无此字典' ? '' : containerStatusName
                    this.msg.containter =
                        `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`
                    result?.materialContainers.forEach(item => {
                        let isExist = this.materialData.some(item1 => item1.materialId == item.materialId)
                        if (!isExist) {
                            this.materialData.push(item)
                        }
                    })
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* æ¸…除托盘编码 */
            onClearContainter() {
                this.form = {
                    containterCode: '',
                    materialNo: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                }
                this.$set(this.form, 'site', '')
                this.resetContainerNo()
            },
            resetContainerNo() {
                this.msg = {
                    containter: '',
                    material: '',
                    site: '',
                }
                this.msgType = {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                }
                this.containerStatus = null
                this.materialData = []
                this.form.materialNo = ''
                this.form.site = ''
                this.form.containerTypeCode = 0
                this.form.containerType = ''
                this.containerInfo = {}
            },
            /* ç‰©æ–™ç¼–码搜索 */
            async onSearchMaterial() {
                if (!this.form.materialNo) {
                    this.msg.material = '请输入物料编号!';
                    return false;
                }
                this.msg.material = ''
                try {
                    let {
                        result
                    } = await getForMaterialNo({
                        code: this.form.materialNo
                    })
                    const isExist = this.materialData.some(item => item.materialId == result.materialId)
                    if (!isExist) {
                        this.materialData.push(result)
                    }else{
                        $alert(`物料唯一码已存在,请删除后再输入!`);
                    }
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* ç‰©æ–™ç¼–码清除 */
            onClearMaterial() {
                this.form.materialNo = ''
            },
            //删除物料
            delMaterialData(materialId) {
                this.materialData = this.materialData.filter(item => item.materialId != materialId)
            },
            // ç»„盘
            async onSubmit() {
                if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
                    return $alert("请选择托盘类型!")
                }
                const data = {
                    containerNo: this.form.containterCode,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData
                }
                try {
                    await bindMaterialContainer(data)
                    this.$modal('组盘成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // å…¥åº“
            async addInBound() {
                if (this.containerInfo.isExist == 2 && this.form.containerTypeCode == 0) {
                    return $alert("请选择托盘类型!")
                }
                if (this.form.orderType != "1" && this.form.orderType != "0")
                {
                    return $alert("选择则是否空托盘!")
                }
                if(this.form.orderType == "1" && this.materialData.length > 0)
                {
                    return $alert("当前选择的是空托盘,请删除物料信息!");
                }
                const data = {
                    type: 4,
                    stationNo: this.form.site,
                    containerNo: this.form.containterCode,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData,
                    isEmptyContainer: this.form.orderType == "1" ? 1 : 0
                }
                try {
                    await addInBound(data)
                    this.$modal('入库任务生成成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // å¤–协件入库
            async addInVirtualWxjPlace() {
                const data = {
                    containerNo: this.form.containterCode,
                    placeNo: this.form.placeNo,
                    containerType: this.form.containerTypeCode,
                    materialContainerList: this.materialData,
                    isEmptyContainer: this.form.orderType
                }
                try {
                    await addInVirtualWxjPlace(data)
                    this.$modal('外协件入库成功')
                    this.onClearContainter()
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            },
            radioChange1(val, b) {
                    this.form.orderType = val
                    this.form.sorting=b.label
            },
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.getPalceList({
                    areaCode: 'LTK-SDCR'
                })
                this.ContainerType = getDicList(this.$store, 'container_type').sysDictDatas
            })
        },
        onUnload() {
            this.clearInitInterval()
        },
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/bindWXJ/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
<template>
    <u-swipe-action v-if="materialData.length>0" >
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">供应商:</view>
                        <view class="content auto-wrap">{{item.supplierCode}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">规格:</view>
                        <view class="content auto-wrap">{{item.materialSpec}}</view>
                    </view> -->
                    <view class="item-row">
                        <view class="label">机型:</view>
                        <view class="content auto-wrap">{{parseDic($store,'material_modal',item.materialModel)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/changeStore/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,325 @@
<template>
    <default-header-page-layout ref="page" title="移库作业" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <scan-input-form-item
                    class="forma-item"
                    label="托盘码"
                    v-model="form.container"
                    :msg="msg.container"
                    @search="onSearchContainer"
                    @clear="onClearContainer"
                />
                <easy-select-form-item
                    class="forma-item"
                    label="目标库区"
                    v-model="form.id"
                    :msg="msg.id"
                    :list="selectOptions.areas"
                    value-field="id"
                    label-field="areaName"
                    :clearable="false"
                />
                <easy-select-form-item
                    v-if="form.id"
                    class="forma-item"
                    label="目标排"
                    v-model="form.rowno"
                    :msg="msg.rowno"
                    :list="selectOptions.rows"
                />
                <easy-select-form-item
                    v-if="form.rowno"
                    label="目标列"
                    v-model="form.column"
                    :msg="msg.column"
                    :list="selectOptions.columns"
                />
            </view>
            <easy-picker :visible.sync="modelVisible" :list="selectOptions.models" value-field="code" label-field="name" @select="onChangeModel"></easy-picker>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <view class="btn-frame"><u-button text="重 ç½®" @click="onReset"></u-button></view>
                <view class="divider"></view>
                <view class="btn-frame"><u-button type="primary" text="提 äº¤" @click="onConfirm"></u-button></view>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import EasyPicker from '@/components/EasyPicker.vue'
import { $successInfo, getDicList } from '@/static/js/utils/index.js'
let initInterVal = null;
const defaultForm = {
    id:null,
    container:'',
    rowno:null,
    column:null
}
export default {
    name:'changeStorePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,ScanInputFormItem,EasySelectFormItem,EasyPicker},
    data(){
        return {
            pageBodyHeight:0,
            form:{...defaultForm},
            msg:{
                id:'',
                container:'',
                rowno:'',
                column:''
            },
            checkContainer:'',
            placeCode:'',
            selectOptions:{
                areas:[],
                rows:[],
                columns:[],
                models:[]
            },
            modelVisible:false
        }
    },
    watch:{
        'form.id'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchArea()
            }
        },
        'form.rowno'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchRow()
            }
        },
        'form.column'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchColumn()
            }
        }
    },
    methods:{
        onSearchContainer(){
            if (!this.form.container) {
              this.msg.container = '请输入托盘码!';
              return false;
            }
            this.msg.container = '';
            this.getContainerInfo()
        },
        onClearContainer(){
            this.clearFullContainer()
        },
        clearFullContainer(){
            this.clearContainer()
            this.clearBackContainer()
        },
        clearContainer(){
            this.form.container = ''
            this.msg.container = ''
        },
        clearBackContainer(){
            this.checkContainer = ''
            this.placeCode = ''
        },
        clearFullRow(){
            this.selectOptions.rows = []
            this.clearRow()
        },
        clearRow(){
            this.form.rowno = ''
            this.msg.rowno = ''
        },
        clearFullCol(){
            this.selectOptions.columns = []
            this.clearCol()
        },
        clearCol(){
            this.form.column = ''
            this.msg.column = ''
        },
        getContainerInfo(){
            let params = {ContainerCode :this.form.container}
            this.$api.get('ContainerInformation',params,{block:'changeStore',warn:false}).then((d)=>{
                this.checkContainer = d.containerCode
                this.placeCode = d.placeCode
            }).catch(_errmsg=>{
                this.clearBackContainer()
                this.msg.container = _errmsg;
            })
        },
        getAreaSelectOptions(){
            this.$api.get('GetArea',{},{block:'changeStore'}).then((d)=>{
                this.selectOptions.areas = d || []
            }).catch(_errmsg=>{
                console.log(_errmsg)
            })
        },
        getRowsByArea(){
            let params = {Areaid:this.form.id}
            this.$api.get('GetPalceRowno',params,{block:'changeStore'}).then((d)=>{
                this.selectOptions.rows = d || []
                this.form.rowno = ''
            }).catch(_errmsg=>{
                this.clearFullRow()
                console.log(_errmsg)
            })
        },
        getColumnsByAreaAndRow(){
            let params = {Areaid:this.form.id,Rowno:this.form.rowno}
            this.$api.get('GetPalceColumn',params,{block:'changeStore'}).then((d)=>{
                this.selectOptions.columns = d || []
                this.form.column = ''
            }).catch(_errmsg=>{
                this.clearFullCol()
                console.log(_errmsg)
            })
        },
        watchArea(){
            this.msg.id = ''
            this.getRowsByArea()
        },
        watchRow(){
            this.msg.rowno = ''
            if (this.form.rowno) {
                this.getColumnsByAreaAndRow()
            } else {
                this.clearFullCol()
            }
        },
        watchColumn(){
            this.msg.column = ''
        },
        getSubmitParams(){
            return {
                containerCode:this.checkContainer,
                placeCode:this.placeCode,
                id:this.form.id,
                rowno:this.form.rowno,
                column:this.form.column
            }
        },
        checkBeforeSubmit(){
            let res = {flag:true,data:{}}
            res.data = this.getSubmitParams()
            if (!res.data.containerCode) {
                this.msg.container = '请先录入托盘信息!'
                res.flag = false
            } else {
                if (res.data.containerCode.toUpperCase()!==this.form.container.toUpperCase()) {
                    this.msg.container = '录入托盘码与验证托盘码不匹配!'
                    res.flag = false
                } else {
                    this.msg.container = ''
                }
            }
            if (res.flag && !res.data.id) {
                this.msg.id = '请选择目标库区!'
                res.flag = false
            }
            if (res.flag && !res.data.rowno) {
                this.msg.rowno = '请选择目标排!'
                res.flag = false
            }
            if (res.flag && !res.data.column) {
                this.msg.column = '请选择目标列!'
                res.flag = false
            }
            return res;
        },
        onChangeModel(val){
            this.dealSubmit(val)
        },
        onReset(){
            this.reset()
        },
        onConfirm(){
            this.modelVisible = true
        },
        reset(){
            this.clearFullContainer()
            this.msg.id = ''
            this.clearFullRow()
        },
        dealSubmit(val){
            let check = this.checkBeforeSubmit()
            if (!check.flag) return false;
            let params = check.data
            params.assembleTask = val
            this.confirmAjax(params,(f)=>{
                if (f) {
                    $successInfo('提交成功')
                    this.reset()
                }
            })
        },
        confirmAjax(params,callback){
            this.$api.post('SubmitRelocationPda',params,{block:'changeStore'}).then(()=>{
                callback && callback(true)
            }).catch(()=>{
                callback && callback(false)
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
            this.getAreaSelectOptions()
            this.selectOptions.models = getDicList(this.$store,'assemble_taskmodel')
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.forma-item{
    margin-bottom: 24rpx;
}
.bottom-btns-row{
    display: flex;
    padding: 10rpx 20rpx;
    background-color: #fff;
    .btn-frame{
        width: 1%;
        box-sizing: border-box;
        flex-grow: 1;
    }
    .divider{
        width: 20rpx;
        flex-shrink: 0;
    }
}
</style>
PipeLineLems.PDA/pages/checkStock/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
<template>
    <default-header-page-layout ref="page" title="盘点作业" :back-custom="true" @back="onPageBack">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <page-main-list v-show="pageType==='mainlist'" :resetflag.sync="resetflag" ref="mainlist" @query="onListQuery" @action="onListAction" />
                <page-main-search v-show="pageType==='mainsearch'" :resetflag="resetflag" @callback="onSearchCallBack"  />
                <page-detail-list v-show="pageType==='detaillist'" ref="detaillist" :main-obj="mainActionRow" @action="onDeatilAction" />
                <page-check-action v-show="pageType==='checkaction'" ref="checkaction" :main-obj="mainActionRow" />
            </view>
        </view>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import PageMainList from './modules/MainList.vue'
import PageMainSearch from './modules/MainSearch.vue'
import PageDetailList from './modules/DetailList.vue'
import PageCheckAction from './modules/CheckAction.vue'
let initInterVal = null;
export default {
    name:'demoPage',
    components:{DefaultHeaderPageLayout,ActionUserRow,PageMainList,PageMainSearch,PageDetailList,PageCheckAction},
    data(){
        return {
            pageBodyHeight:0,
            pageType:'mainlist',
            resetflag:0,
            query:null,
            mainActionRow:{}
        }
    },
    watch:{
        pageType(newVal, oldVal){
            if (newVal !== oldVal) {
              if (newVal) {
                this.switchPage();
              }
            }
        },
        resetflag(newVal, oldVal){
            if (newVal !== oldVal) {
              this.query = null
                this.$refs.list.newList(this.query)
            }
        }
    },
    methods:{
        onPageBack(){
            if (this.pageType==='mainlist') {
                uni.redirectTo({url:this.$config.path.home});
            } else {
                if (this.pageType === 'mainsearch' || this.pageType === 'detaillist') {
                    this.pageType = 'mainlist'
                } else {
                    this.pageType = 'detaillist'
                }
            }
        },
        onListQuery(){
            this.pageType = 'mainsearch'
        },
        onListAction(obj){
            this.mainActionRow = obj
            this.pageType = 'detaillist'
        },
        onDeatilAction(){
            this.pageType = 'checkaction'
        },
        onSearchCallBack(params){
            this.query = params;
            this.pageType = 'mainlist'
        },
        switchPage(){
            this.$nextTick(()=>{
                switch (this.pageType){
                    case 'mainlist':
                        this.$refs.mainlist.newList(this.query)
                        break;
                    case 'detaillist':
                        this.$refs.detaillist.init()
                        this.$refs.checkaction.clear()
                        break;
                    default:
                        break;
                }
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
            this.switchPage()
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
</style>
PipeLineLems.PDA/pages/checkStock/modules/CheckAction.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,192 @@
<template>
    <view class="check-stock-check-action-component">
        <view class="form-view">
            <scan-input-form-item
                label="库位码/托盘码"
                v-model="scanCode"
                @search="onSearchScanInput"
            />
        </view>
        <scroll-view class="list-scroll-view" :scroll-y="true">
            <view class="list-items-around">
                <!-- ################# -->
                <view class="list-item" v-for="(item,index) in list" :key="'check-item-material-'+index">
                    <view class="list-item-show">
                        <view class="item-left">
                            <uni-badge :text="index+1" type="primary" size="normal" />
                        </view>
                        <view class="item-main">
                            <view class="item-row">
                                <view class="label">物料</view>
                                <view class="content auto-wrap">{{item.inventoryMateriaUnique}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">库存</view>
                                <view class="content">{{item.stockNumber}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">实盘</view>
                                <view class="content">
                                    <input class="easy-input" v-model="item.inventoryNumber" />
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
                <!-- ################# -->
            </view>
        </scroll-view>
        <view class="bottom-btns-row">
            <view class="btn-frame"><u-button type="primary" text="提 äº¤" @click="onSubmit"></u-button></view>
        </view>
    </view>
</template>
<script>
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import { $successInfo } from '@/static/js/utils/index.js'
export default {
    name:'checkStockCheckActionComponent',
    components:{ScanInputFormItem},
    props:{
        mainObj: {
          type: Object,
          default: function(){
                return {}
            }
        }
    },
    data(){
        return {
            scanCode:'',
            list:[]
        }
    },
    methods:{
        clear(){
            this.list = []
            this.scanCode = ''
        },
        onSearchScanInput(){
            this.getContainerInfo()
        },
        getContainerInfo(callback){
            let params = {
                InventoryPlanId:this.mainObj.id,
                ContainerVsLocation:this.scanCode
            }
            this.$api.get('ByContainerCodeGetInfo',params,{block:'checkStock'}).then(d=>{
                this.list = d || []
                callback && callback(true)
            }).catch(()=>{
                this.list = []
                callback && callback(false)
            })
        },
        onSubmit(){
            this.dealConfirm((f)=>{
                if (f) {
                    $successInfo('操作成功')
                    this.clear()
                }
            })
        },
        dealConfirm(callback ){
            let params = {inventoryPlanDetails:this.list}
            this.$api.post('InventorySure',params,{block:'checkStock'}).then(d=>{
                callback && callback(true)
            }).catch(()=>{
                callback && callback(false)
            })
        }
    }
}
</script>
<style scoped lang="scss">
.check-stock-check-action-component{
    height: 100%;
    display: flex;
    flex-direction: column;
    .easy-input{
        font-size: inherit;
        color: $uni-color-primary;
        text-decoration: underline;
    }
    .form-view,.bottom-btns-row{
        flex-shrink: 0;
    }
    .list-scroll-view{
        flex-grow: 1;
        height: 1px;
        .list-items-around{
            padding-top:12rpx;
            .list-item {
                margin-bottom: 12rpx;
                border-width: 2rpx 0;
                border-style: solid;
                border-color: $uni-border-color;
                &:last-child{
                    margin-bottom: 0;
                }
            }
        }
        .list-item-show{
            background-color: $uni-bg-color;
            font-size: 1.1em;
            display: flex;
            &>.item-left{
                flex-shrink: 0;
                padding-left: 16rpx;
                padding-top: 12rpx;
                padding-right: 12rpx;
            }
            &>.item-main{
                flex-grow: 1;
                width: 1px;
                padding-right: 16rpx;
            }
            .item-row{
                border-bottom: 2rpx dashed $uni-text-color-grey;
                display: flex;
                &>.label{
                    opacity: .7;
                    flex-shrink: 0;
                    width: 80rpx;
                    padding-top: 11rpx;
                    .first-label-inner{
                        display: flex;
                        align-items: center;
                        .batch-no{
                            margin-left: 8rpx;
                        }
                    }
                }
                &>.content{
                    width: 1px;
                    flex-grow: 1;
                    line-height: 1.5em;
                    padding: 8rpx 0;
                }
                &:last-child{
                    border-bottom: 0;
                }
            }
        }
    }
}
.bottom-btns-row{
    display: flex;
    padding: 10rpx 20rpx;
    background-color: #fff;
    .btn-frame{
        width: 1%;
        box-sizing: border-box;
        flex-grow: 1;
    }
    .divider{
        width: 20rpx;
        flex-shrink: 0;
    }
}
</style>
PipeLineLems.PDA/pages/checkStock/modules/DetailList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,345 @@
<template>
    <view class="check-stock-detail-list-component">
        <view class="detail-top-view">
            <view class="top-container block-item">
                <view class="top-container-title block-item-title auto-wrap">{{mainObj.planNo}}</view>
                <view class="block-item-container">
                    <view class="item-desc">
                        <view class="label">时间</view>
                        <view class="content auto-wrap">{{mainObj.startPlanTimeFormat}}~{{mainObj.endPlanTimeFormat}}</view>
                    </view>
                    <view class="item-desc">
                        <view class="label">仓库</view>
                        <view class="content auto-wrap">{{mainObj.areaName}}</view>
                    </view>
                </view>
            </view>
        </view>
        <scroll-view class="list-scroll-view" :scroll-y="true">
            <view class="list-items-around">
                <view class="detail-item block-item" v-for="(item,index) in list" :key="'check-item-'+index" @tap.stop="onActiveItem(item,index)">
                    <view class="active-view" v-if="item.actived"></view>
                    <view :class="['block-item-title',(!item.expanded?'not-expanded':'')]">
                        <view class="title-content">
                            <view class="item-desc no-border">
                                <view class="label">库位</view>
                                <view class="content auto-wrap">{{item.placeCode}}</view>
                            </view>
                            <view class="item-desc no-border">
                                <view class="label">托盘</view>
                                <view class="content auto-wrap">{{item.containerCode}}</view>
                            </view>
                        </view>
                        <view class="tag-view">
                            <u-tag v-if="item.statusDetailEnum===1" :text="item.statusDetailEnumName" size="mini" bg-color="#808080" color="#ffffff" border-color="#808080" />
                            <u-tag v-else-if="item.statusDetailEnum===2" :text="item.statusDetailEnumName" size="mini" bg-color="#FEF3E6" color="#F18201" border-color="#F18201" />
                            <u-tag v-else-if="item.statusDetailEnum===3" :text="item.statusDetailEnumName" size="mini" bg-color="#EFFCF2" color="#5CDF7D" border-color="#5CDF7D" />
                            <u-tag v-else :text="item.statusDetailEnumName" size="mini" bg-color="#ffc0cb" color="#ff0000" border-color="#ff0000" />
                        </view>
                        <view class="arrow-view" @tap.stop="onChangeItemExpanded(item,index)">
                            <u-icon v-if="!item.expanded" name="arrow-down" color="#909193" :size="24" />
                            <u-icon v-else name="arrow-up" color="#909193" :size="24" />
                        </view>
                    </view>
                    <view class="block-item-container" v-if="item.expanded">
                        <view class="check-table-header table-row">
                            <view class="cell1">序号</view>
                            <view class="cell2">物料</view>
                            <view class="cell3">库存</view>
                            <view class="cell4">实盘</view>
                        </view>
                        <view class="check-table-body">
                            <view class="table-row" v-for="(itemx,indexx) in item.materials" :key="'check-item-material-'+indexx">
                                <view class="cell1">{{indexx+1}}</view>
                                <view class="cell2 auto-wrap">{{itemx.inventoryMateriaUnique}}</view>
                                <view class="cell3">{{itemx.stockNumber}}</view>
                                <view class="cell4 large">{{itemx.inventoryNumber}}</view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <view class="no-more-text-row">没有更多了</view>
        </scroll-view>
        <view class="bottom-btns-row">
            <template v-if="checkType===1">
                <view class="btn-frame"><u-button type="primary" text="出 åº“" @click="onOutAction"></u-button></view>
                <view class="divider"></view>
            </template>
            <view class="btn-frame"><u-button type="primary" text="盘 ç‚¹" @click="onGoCheck"></u-button></view>
        </view>
    </view>
</template>
<script>
import { parseDic, $alert, $successInfo } from '@/static/js/utils/index.js'
export default {
    name:'checkStockDetailListComponent',
    emits:['action'],
    props:{
        mainObj: {
          type: Object,
          default: function(){
                return {}
            }
        }
    },
    data(){
        return {
            list:[]
        }
    },
    computed:{
        checkType(){
            let res = 2
            if (this.mainObj.inventoryRuled && this.mainObj.inventoryRuled.ruleType===1) {
                res = 1
            }
            return res
        },
    },
    methods:{
        init(){
            this.getList()
        },
        getList(){
            this.$api.get('PageDetail',{id:this.mainObj.id},{block:'checkStock'}).then(d=>{
                this.list = (d || []).map((obj)=>{
                    obj.statusDetailEnumName = parseDic(this.$store,'task_status',obj.statusDetailEnum)
                    return obj
                });
            }).catch(err=>{
                console.log(err)
            })
        },
        onActiveItem(obj,index) {
            if (this.checkType!==1) return false
            obj.actived = !obj.actived
            this.$set(this.list,index,obj)
        },
        onChangeItemExpanded(obj,index){
            if (obj.expanded) {
                obj.expanded = false
                this.$set(this.list,index,obj)
            } else {
                if (!obj.materials) {
                    this.getContainerInfo(obj,index,(f,_arr)=>{
                        if (f) {
                            obj.expanded = true
                            obj.materials = _arr
                            this.$set(this.list,index,obj)
                        }
                    })
                } else {
                    obj.expanded = true
                    this.$set(this.list,index,obj)
                }
            }
        },
        getContainerInfo(obj,index,callback){
            let params = {
                InventoryPlanId:this.mainObj.id,
                ContainerVsLocation:obj.containerCode
            }
            this.$api.get('ByContainerCodeGetInfo',params,{block:'checkStock'}).then(d=>{
                let _arr = d || []
                callback && callback(true,_arr)
            }).catch(()=>{
                callback && callback(false)
            })
        },
        onGoCheck(){
            this.$emit('action')
        },
        onOutAction(){
            let params = {containerCodes:[]}
            this.list.forEach((eachObj)=>{
                if (eachObj.actived) {
                    params.containerCodes.push(eachObj.containerCode)
                }
            })
            if (params.containerCodes.length===0) {
                $alert('请选择出库托盘')
                return false
            }
            this.outAjax(params,(f)=>{
                if (f) {
                    $successInfo('出库提交成功')
                    this.getList()
                }
            })
        },
        outAjax(params,callback){
            this.$api.post('ByContainerCodeOut',params,{block:'checkStock'}).then(d=>{
                callback && callback(true)
            }).catch(()=>{
                callback && callback(false)
            })
        }
    }
}
</script>
<style scoped lang="scss">
.check-stock-detail-list-component{
    height: 100%;
    display: flex;
    flex-direction: column;
    .detail-top-view,.bottom-btns-row{
        flex-shrink: 0;
    }
    .detail-top-view{
        .top-container{
            .top-container-title{
                display: flex;
                align-items: center;
            }
        }
    }
    .block-item {
        background-color: $uni-bg-color;
        font-size: 38rpx;
        border-width: 2rpx 0;
        border-style: solid;
        border-color: $uni-border-color;
        .block-item-title{
            border-bottom:2rpx solid $uni-border-color;
            font-size: 1.1em;
            padding: 12rpx 16rpx;
        }
        .block-item-container{
            padding: 0 16rpx;
            display: flex;
            flex-wrap: wrap;
        }
    }
    .item-desc{
        flex-shrink: 0;
        width: 100%;
        font-size: .9em;
        display: flex;
        align-items: flex-start;
        padding: 10rpx 0;
        border-bottom: 2rpx dashed $uni-border-color;
        &.no-border{
            border-bottom: 0;
        }
        &>.label {
            font-size: .9em;
            flex-shrink: 0;
            color:#989898;
            width: 80rpx;
        }
        &>.content{
            width: 1px;
            flex-grow: 1;
            line-height: 1.2em;
            padding: 0 4rpx;
        }
        &:last-child {
            border-bottom:0;
        }
    }
    .bottom-btns-row{
        display: flex;
        padding: 10rpx 20rpx;
        background-color: #fff;
        .btn-frame{
            width: 1%;
            box-sizing: border-box;
            flex-grow: 1;
        }
        .divider{
            width: 20rpx;
            flex-shrink: 0;
        }
    }
    .list-scroll-view{
        flex-grow: 1;
        height: 1px;
        .list-items-around{
            padding-top: 12rpx;
        }
        .detail-item {
            position: relative;
            margin-bottom: 12rpx;
            &:last-child{
                margin-bottom: 0;
            }
            .active-view{
                position: absolute;
                top:0;
                left:0;
                width: 100%;
                height: 100%;
                box-sizing: border-box;
                border:6rpx solid $u-primary;
            }
            .block-item-title{
                font-size: 1em;
                display: flex;
                &.not-expanded{
                    border-bottom: 0;
                }
                .tag-view,.arrow-view{
                    flex-shrink: 0;
                }
                .title-content{
                    width: 1px;
                    flex-grow: 1;
                }
                .tag-view,.arrow-view{
                    display: flex;
                    align-items: center;
                }
                .arrow-view{
                    padding-left: 16rpx;
                }
            }
            .block-item-container{
                .check-table-header{
                    opacity: .8;
                    font-size: .9em;
                }
                .check-table-body{
                    width: 100%;
                    .table-row:last-child{
                        border-bottom: 0;
                    }
                }
                .table-row {
                    display: flex;
                    width: 100%;
                    border-bottom: 2rpx dashed $uni-border-color;
                    .cell1,.cell2,.cell3,.cell4{
                        text-align: center;
                        padding: 16rpx 0;
                    }
                    .cell1,.cell3,.cell4{
                        flex-shrink: 0;
                    }
                    .cell1{
                        width: 80rpx;
                    }
                    .cell3{
                        width: 90rpx;
                    }
                    .cell4{
                        width: 90rpx;
                        &.large {
                            color: #0366AA;
                        }
                        &.small {
                            color: #ff0000;
                        }
                    }
                    .cell2{
                        width: 1px;
                        flex-grow: 1;
                    }
                }
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/checkStock/modules/MainList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,239 @@
<template>
    <view class="check-stock-main-list-component">
        <view class="top-row">
            <view class="top-btns">
                <view class="search-btn" @tap.stop="onQuery"><u-icon name="search" size="30" /></view>
                <view class="reset-btn" @tap.stop="onReset">重 ç½®</view>
            </view>
        </view>
        <scroll-view class="list-scroll-view" :scroll-y="true" @scrolltolower="onMoreList">
            <view class="list-items-around">
                <!-- ########### -->
                <view class="list-item" v-for="(item,index) in list" :key="'list-item-'+index">
                    <view class="list-item-show" @tap.stop="onWatchDetail(item)">
                        <view class="item-header">
                            <view class="item-index">
                                <uni-badge :text="index+1" type="primary" size="normal" />
                            </view>
                            <view class="item-title-box">
                                <text>{{item.planNo}}</text>
                            </view>
                            <view class="item-tag">
                                <u-tag v-if="item.statusEnum===1" :text="item.statusEnumName" size="mini" bg-color="#808080" color="#ffffff" border-color="#808080" />
                                <u-tag v-else-if="item.statusEnum===2" :text="item.statusEnumName" size="mini" bg-color="#FEF3E6" color="#F18201" border-color="#F18201" />
                                <u-tag v-else-if="item.statusEnum===3" :text="item.statusEnumName" size="mini" bg-color="#EFFCF2" color="#5CDF7D" border-color="#5CDF7D" />
                                <u-tag v-else :text="item.statusEnumName" size="mini" bg-color="#ffc0cb" color="#ff0000" border-color="#ff0000" />
                            </view>
                        </view>
                        <view class="item-container">
                            <view class="item-desc">
                                <view class="label">时间</view>
                                <view class="content auto-wrap">{{item.startPlanTimeFormat}}~{{item.endPlanTimeFormat}}</view>
                            </view>
                            <view class="item-desc">
                                <view class="label">仓库</view>
                                <view class="content auto-wrap">{{item.areaName}}</view>
                            </view>
                        </view>
                    </view>
                </view>
                <!-- ########### -->
            </view>
            <view class="no-more-text-row" v-if="!hasMore">没有更多了</view>
        </scroll-view>
    </view>
</template>
<script>
import { parseDic } from '@/static/js/utils/index.js'
// import dayjs from 'dayjs'
const pagination = {
    PageNo:1,
    PageSize:10
}
export default {
    name:'checkStockMainListComponent',
    emits:['query','update:resetflag','action'],
    data(){
        return {
            hasMore:true,
            queried:{},
            list:[]
        }
    },
    methods:{
        onQuery(){
            this.$emit('query')
        },
        onReset(){
            this.resetQuery()
        },
        resetQuery(){
            this.$emit('update:resetflag',new Date().getTime())
        },
        newList(params=null,callback){
            this.queried = {...pagination}
            if (params) {
                this.queried = {...this.queried,...params}
            }
            this.getList(callback)
        },
        onMoreList(){
            if (this.hasMore) {
                this.queried.PageNo++;
                this.getList();
            }
        },
        getList(callback){
            this.$api.get('page',this.queried,{block:'checkStock'}).then((res)=>{
                let arr = (res.rows || []).map((obj)=>{
                    obj.statusEnumName = parseDic(this.$store,'task_status',obj.statusEnum)
                    obj.startPlanTimeFormat = obj.startPlanTime?dayjs(obj.startPlanTime).format('YYYY.MM.DD'):''
                    obj.endPlanTimeFormat = obj.endPlanTime?dayjs(obj.endPlanTime).format('YYYY.MM.DD'):''
                    return obj
                });
                let len = arr.length;
                if (this.queried.PageNo>=res.totalPage) {
                    this.hasMore = false
                } else {
                    this.hasMore = true
                }
                if (this.queried.PageNo===1) {
                    this.list = arr;
                } else {
                    this.list = [...this.list,...arr];
                }
                callback && callback(true)
            }).catch(err=>{
                console.log(err)
                callback && callback(false)
            })
        },
        onWatchDetail(obj) {
            this.$emit('action',obj)
        }
    }
}
</script>
<style scoped lang="scss">
.check-stock-main-list-component{
    $topSize:90rpx;
    height: 100%;
    position: relative;
    box-sizing: border-box;
    padding-top: $topSize;
    .top-row{
        position: absolute;
        z-index: 5;
        top: 0;
        left: 0;
        height: $topSize;
        width: 100%;
        padding: 10rpx 12rpx;
        box-sizing: border-box;
        border-bottom:1px solid #F0F8FF;
        background-color: $uni-bg-color;
    }
    .top-btns{
        width: 100%;
        height: 100%;
        box-sizing: border-box;
        border: 1px solid $uni-border-color;
        border-radius: 32rpx / 50%;
        display: flex;
        overflow: hidden;
        color: $uni-text-color-grey;
    }
    .search-btn,.reset-btn{
        display: flex;
        align-items: center;
        justify-content: center;
        height: 100%;
    }
    .reset-btn{
        flex-shrink: 0;
        width: 160rpx;
        border-left: 1px solid $uni-border-color;
    }
    .search-btn{
        flex-grow: 1;
        background-color: #DCDCDC;
    }
    .list-scroll-view{
        height: 100%;
    }
    .list-items-around{
        padding-top:12rpx;
        .list-item {
            margin-bottom: 12rpx;
            border-width: 2rpx 0;
            border-style: solid;
            border-color: $uni-border-color;
            &:last-child{
                margin-bottom: 0;
            }
        }
    }
    .list-item-show {
        background-color: $uni-bg-color;
        font-size: 40rpx;
        .item-header{
            display: flex;
            border-bottom:2rpx solid $uni-border-color;
            padding: 6rpx 0;
            .item-index,.item-tag{
                flex-shrink: 0;
            }
            .item-index{
                width: 68rpx;
                padding-left: 10rpx;
                padding-top:11rpx;
                box-sizing: border-box;
                display: flex;
                align-items: flex-start;
            }
            .item-tag{
                display: flex;
                padding:6rpx 16rpx;
            }
            .item-title-box{
                flex-grow: 1;
                width: 1px;
                padding-left: 4rpx;
                display: flex;
                align-items: center;
            }
        }
        .item-container{
            padding: 0 16rpx;
            display: flex;
            flex-wrap: wrap;
            .item-desc{
                flex-shrink: 0;
                width: 100%;
                font-size: .9em;
                display: flex;
                align-items: flex-start;
                padding: 10rpx 0;
                border-bottom: 2rpx dashed $uni-border-color;
                &>.label {
                    font-size: .9em;
                    flex-shrink: 0;
                    color:#989898;
                    width: 100rpx;
                }
                &>.content{
                    width: 1px;
                    flex-grow: 1;
                    line-height: 1.2em;
                    padding: 0 4rpx;
                }
                &:last-child {
                    border-bottom:0;
                }
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/checkStock/modules/MainSearch.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
<template>
    <view class="check-stock-main-search-component">
        <view class="search-form-box">
            <u-form labelPosition="left" :labelWidth="84" :model="form" ref="form" :labelStyle="{color:'#787878'}">
                <u-form-item label="计划单号:" borderBottom>
                    <u-input v-model="form.PlanNo" placeholder="请输入..." border="none" clearable />
                </u-form-item>
                <u-form-item label="计划状态:" borderBottom>
                    <u-view-form-select-picker v-model="form.InspectionStatus" :list="selectList.checkPlan" value-field="code" label-field="name" />
                </u-form-item>
            </u-form>
        </view>
        <view class="search-bottom">
            <u-button type="primary" text="查 è¯¢" @click="onSearch" />
        </view>
    </view>
</template>
<script>
import UViewFormSelectPicker from '@/components/UViewFormSelectPicker.vue'
import { getDicList, $alert } from '@/static/js/utils/index.js'
const defaultQueryForm = {
    PlanNo:'',
    InspectionStatus:''
}
export default {
    name:'checkStockMainSearchComponent',
    components:{UViewFormSelectPicker},
    emits:['callback'],
    props:{
        resetflag: {
          type: Number,
          default: 0
        }
    },
    data(){
        return {
            form:{...defaultQueryForm},
            selectList:{
                checkPlan:[]
            }
        }
    },
    watch:{
        resetflag(newVal, oldVal){
            if (newVal !== oldVal) {
              this.form = {...defaultQueryForm}
            }
        }
    },
    methods:{
        onSearch(){
            this.$emit('callback',this.form)
        }
    },
    mounted() {
        this.selectList.checkPlan = getDicList(this.$store,'task_status')
    }
}
</script>
<style lang="scss" scoped>
.check-stock-main-search-component{
    height: 100%;
    display: flex;
    flex-direction: column;
    .search-form-box{
        flex-grow: 1;
        background-color: $uni-bg-color;
        overflow: auto;
        padding: 10rpx 20rpx;
    }
    .search-bottom{
        flex-shrink: 0;
        padding: 10rpx 0;
        padding: 20rpx;
    }
}
</style>
PipeLineLems.PDA/pages/components/LongWidthHeightFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
<template>
    <view class="long-width-height-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="input-row">
            <view class="input-view">
                <input v-model="innerLong" class="my-input" type="digit" :placeholder="longPlaceholder" />
            </view>
            <view class="divider-text">*</view>
            <view class="input-view">
                <input v-model="innerWidth" class="my-input" type="digit" :placeholder="widthPlaceholder" />
            </view>
            <view class="divider-text">*</view>
            <view class="input-view">
                <input v-model="innerHeight" class="my-input" type="digit" :placeholder="heightPlaceholder" />
            </view>
        </view>
        <view class="msg-row" v-if="msg">{{msg}}</view>
    </view>
</template>
<script>
export default {
    name:'LongWidthHeightFormItemComponent',
    emits:['update:long','update:width','update:height'],
    props:{
        long:{
            type:[Number,String],
            default:0
        },
        width:{
            type:[Number,String],
            default:0
        },
        height:{
            type:[Number,String],
            default:0
        },
        label:{
            type:String,
            default:'长宽高'
        },
        longPlaceholder:{
            type:String,
            default:'长'
        },
        widthPlaceholder:{
            type:String,
            default:'宽'
        },
        heightPlaceholder:{
            type:String,
            default:'高'
        },
        msg:{
            type:String,
            default:''
        },
        required:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {
            innerLong:0,
            innerWidth:0,
            innerHeight:0
        }
    },
    watch:{
        long(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerLong = newVal
            }
        },
        innerLong(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('update:long',newVal)
            }
        },
        width(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerWidth = newVal
            }
        },
        innerWidth(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('update:width',newVal)
            }
        },
        height(newVal,oldVal){
            if (newVal!==this.innerValue) {
                this.innerHeight = newVal
            }
        },
        innerHeight(newVal,oldVal){
            if (newVal!==this.value) {
                this.$emit('update:height',newVal)
            }
        }
    },
    created() {
        this.innerLong = this.long
        this.innerWidth = this.width
        this.innerHeight = this.height
    }
}
</script>
<style scoped lang="scss">
.long-width-height-form-item-compontent{
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:#ff0000;
        }
    }
    .input-row{
        width: 100%;
        height: 90rpx;
        overflow: hidden;
        background-color: $uni-bg-color;
        display: flex;
        align-items: center;
        .input-view{
            flex-grow: 1;
            width: 1px;
        }
        .divider-text{
            flex-shrink: 0;
            font-size: 1.5em;
            height: 100%;
            background-color: transparent;
            display: flex;
            align-items: center;
            padding: 0 10rpx;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
    }
    .my-input{
        text-align: center;
    }
}
</style>
PipeLineLems.PDA/pages/components/StationSelectFormItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,377 @@
<template>
    <view class="station-select-form-item-compontent">
        <view class="p-form-label" v-if="label"><text v-if="required" class="required-tag">*</text>{{label}}:</view>
        <view class="form-row">
            <view class="mask" @tap.stop="" v-if="disabled || loading">
                <template v-if="loading">
                    <u-loading-icon color="#f0f8ff" />
                    <text style="margin-left:20rpx;color:#f0f8ff;">Loading...</text>
                </template>
            </view>
            <view class="form-items-view">
                <view class="select-block" @tap.stop="onOpenPicker1">
                    <view class="input-view">
                        <text v-if="!value1" class="placeholder">{{placeholder1}}</text>
                        <text v-else>{{valueLabel1}}</text>
                    </view>
                    <view class="close-view" @tap.stop="onClear1" v-if="value1 && clearable">
                        <view class="close-circle">
                            <u-icon
                                name="close"
                                size="11"
                                color="#ffffff"
                                customStyle="line-height: 12px"
                            ></u-icon>
                        </view>
                    </view>
                    <view class="right-icon-view"><u-icon name="arrow-down" color="#909193" :size="24"></u-icon></view>
                </view>
                <view class="divider"></view>
                <view class="select-block" @tap.stop="onOpenPicker2">
                    <view class="input-view">
                        <text v-if="!value2" class="placeholder">{{placeholder2}}</text>
                        <text v-else>{{valueLabel2}}</text>
                    </view>
                    <view class="close-view" @tap.stop="onClear2" v-if="value2 && clearable">
                        <view class="close-circle">
                            <u-icon
                                name="close"
                                size="11"
                                color="#ffffff"
                                customStyle="line-height: 12px"
                            ></u-icon>
                        </view>
                    </view>
                    <view class="right-icon-view"><u-icon name="arrow-down" color="#909193" :size="24"></u-icon></view>
                </view>
            </view>
        </view>
        <view class="msg-row" v-if="msg" :class="[msgType==='info'?'info-type':'']">{{msg}}</view>
        <easy-picker :visible.sync="pickerVisible1" :list="list1" :value-field="valueField1" :label-field="labelField1" @select="onPickerSelect1" />
        <easy-picker :visible.sync="pickerVisible2" :list="list2" :value-field="valueField2" :label-field="labelField2" @select="onPickerSelect2" />
    </view>
</template>
<script>
import EasyPicker from '@/components/EasyPicker.vue'
const LINE_VALUE_FIELD = 'productionlineId'
const LINE_LABEL_FIELD = 'productionlineName'
const STATION_VALUE_FIELD = 'takeMaterialsSiteId'
const STATION_LABEL_FIELD = 'takeMaterialsSite'
export default {
    name:'stationSelectFormItemComponent',
    components:{EasyPicker},
    emits:['input','select'],
    props:{
        value:{
            type:Array,
            default:function(){
                return []
            }
        },
        label:{
            type:String,
            default:''
        },
        placeholder1:{
            type:String,
            default:'产线'
        },
        placeholder2:{
            type:String,
            default:'工位'
        },
        msg:{
            type:String,
            default:''
        },
        msgType:{
            type:String,
            default:'error'
        },
        disabled:{
            type:Boolean,
            default:false
        },
        clearable:{
            type:Boolean,
            default:true
        },
        required:{
            type:Boolean,
            default:false
        }
    },
    data(){
        return {
            list1:[],
            list2:[],
            value1:undefined,
            value2:undefined,
            valueLabel1:undefined,
            valueLabel2:undefined,
            valueObj1:null,
            valueObj2:null,
            pickerVisible1:false,
            valueField1:LINE_VALUE_FIELD,
            labelField1:LINE_LABEL_FIELD,
            pickerVisible2:false,
            valueField2:STATION_VALUE_FIELD,
            labelField2:STATION_LABEL_FIELD,
            loading:false
        }
    },
    mounted(){
      this.init()
    },
    methods:{
        init(){
            this.loading = true
            this.getLines((f)=>{
                if (f) {
                    this.setChangeValues(()=>{
                        this.loading = false
                    })
                } else {
                    this.loading = false
                }
            })
        },
        setChangeValues(callback){
            if (this.value) {
                if (this.value[0]) {
                    this.value1 = this.value[0]
                    this.valueLabel1 = this.getLineLabelByValue(this.value1)
                    this.getStations((f)=>{
                        if (f) {
                            if (this.value[1]) {
                                this.value2 = this.value[1]
                                this.valueLabel2 = this.getStationLabelByValue(this.value2)
                                this.backValue()
                            }
                            callback && callback(true)
                        } else {
                            callback && callback(false)
                        }
                    })
                } else {
                    callback && callback(true)
                }
            } else {
                callback && callback(true)
            }
        },
        getLineLabelByValue(val) {
            let res = val;
            for (let i=0;i<this.list1.length;i++) {
                if (this.list1[i][LINE_VALUE_FIELD]===val) {
                    this.valueObj1 = this.list1[i]
                    res = this.list1[i][LINE_LABEL_FIELD]
                    break
                }
            }
            return res
        },
        getStationLabelByValue(val) {
            let res = val;
            for (let i=0;i<this.list2.length;i++) {
                if (this.list2[i][STATION_VALUE_FIELD]===val) {
                    this.valueObj2 = this.list2[i]
                    res = this.list2[i][STATION_LABEL_FIELD]
                    break
                }
            }
            return res
        },
        getLines(callback){
            this.$api.get('GetProductionlineList',{},{block:'station',loading:false}).then((d)=>{
                this.list1 = d || []
                if (this.list1.length===1) {
                    this.valueObj1 = this.list1[0]
                    this.value1 = this.list1[0][LINE_VALUE_FIELD]
                    this.valueLabel1 = this.list1[0][LINE_LABEL_FIELD]
                    this.backValue()
                }
                callback && callback(true)
            }).catch((_errmsg)=>{
                this.clearAllValue()
                this.backValue()
                callback && callback(false)
            })
        },
        getStations(callback,isInit=false){
            this.$api.get('GetStationList',{id:this.value1},{block:'station',loading:false}).then((d)=>{
                this.list2 = d || []
                if (this.list2.length===1) {
                    this.valueObj2 = this.list2[0]
                    this.value2 = this.list2[0][STATION_VALUE_FIELD]
                    this.valueLabel2 = this.list2[0][STATION_LABEL_FIELD]
                } else {
                    this.clearValue2()
                }
                this.backValue()
                callback && callback(true)
            }).catch((_errmsg)=>{
                this.list2 = []
                this.clearValue2()
                this.backValue()
                callback && callback(false)
            })
        },
        onOpenPicker1(){
            if (this.list1.length<=0) return false
            this.pickerVisible1 = true
        },
        onOpenPicker2(){
            if (this.list2.length<=0) return false
            this.pickerVisible2 = true
        },
        onPickerSelect1(value,selection){
            if (value===this.value1) return false
            this.value1 = value
            this.valueObj1 = selection
            this.valueLabel1 = selection[LINE_LABEL_FIELD]
            this.loading = true
            this.getStations(()=>{
                this.backSelect()
                this.loading = false
            })
        },
        onPickerSelect2(value,selection){
            if (value===this.value2) return false
            this.value2 = value
            this.valueObj2 = selection
            this.valueLabel2 = selection[STATION_LABEL_FIELD]
            this.backValue()
            this.backSelect()
        },
        onClear1(){
            this.clearAllValue()
            this.list2 = []
            this.backValue()
        },
        onClear2(){
            this.clearValue2()
            this.backValue()
        },
        clearAllValue(){
            this.clearValue1()
            this.clearValue2()
        },
        clearValue1(){
            this.value1 = undefined
            this.valueObj1 = null
            this.valueLabel1 = undefined
        },
        clearValue2(){
            this.value2 = undefined
            this.valueObj2 = null
            this.valueLabel2 = undefined
        },
        backValue(){
          this.$emit('input',[this.value1,this.value2])
        },
        backSelect(){
          this.$emit('select',[this.value1,this.value2],[{...this.valueObj1},{...this.valueObj2}])
        }
    }
}
</script>
<style scoped lang="scss">
.station-select-form-item-compontent {
    width: 100%;
    .p-form-label{
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag{
            color:#ff0000;
        }
    }
    .form-row{
        width: 100%;
        height: 90rpx;
        overflow: hidden;
        position: relative;
        .form-items-view {
            height: 100%;
            width: 100%;
            display: flex;
            .divider{
                width: 20rpx;
                flex-shrink: 0;
            }
            .select-block{
                width: 1%;
                flex-grow: 1;
                background-color: $uni-bg-color;
                display: flex;
                align-items: center;
                .close-view,.right-icon-view{
                    flex-shrink: 0;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                }
                .right-icon-view{
                    padding-right: 10rpx;
                }
                .close-view{
                    .close-circle{
                        width: 20px;
                        height: 20px;
                        border-radius: 50%;
                        background-color: #c6c7cb;
                        display: flex;
                        flex-direction: row;
                        align-items: center;
                        justify-content: center;
                        transform: scale(0.82);
                        margin-left: 4px;
                    }
                }
                .input-view{
                    flex-grow: 1;
                    padding-left: 20rpx;
                    font-size: 30rpx;
                    white-space:nowrap;
                    overflow:hidden;
                    text-overflow:ellipsis;
                    color: rgb(48, 49, 51);
                    .placeholder{
                        color: rgb(192, 196, 204);
                    }
                }
            }
        }
        &>.mask{
            background-color: #000;
            opacity: 0.25;
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            z-index: 100;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #f2f2f2;
        }
    }
    .msg-row{
        padding: 6rpx 20rpx 0 20rpx;
        line-height: 1.3;
        font-size: 24rpx;
        color: $u-error;
        word-break:break-all;
        word-wrap:break-word;
        &.info-type{
            color:$color-blue;
        }
    }
}
</style>
PipeLineLems.PDA/pages/containerHandle/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,436 @@
<template>
    <default-header-page-layout ref="page" title="地标绑定">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <scan-input-form-item class="forma-item" label="托盘编码" v-model="form.containerNo" :msg="msg.containter"
                    :msg-type="msgType.containter" @search="onSearchContainter" @clear="onClearContainter" />
                <!-- åº“区 -->
                <!-- v-show="Boolean(containerInfo.containerNo)" -->
                <selectItem :disabled="selectDisabled"
                    :selectData="areaData" :value.sync="form.areaNo" label="库区编号" labelField="areaName"
                    valueField="areaNo" />
                <!-- åº“位 -->
                <!-- v-show="Boolean(containerInfo.containerNo)&&Boolean(form.areaNo)" -->
                <selectItem :disabled="selectDisabled"
                    :selectData="placeList" :value.sync="form.placeNo" label="库位编号" labelField="placeNo"
                    valueField="placeNo" />
                <div v-if="false">
                    <scan-input-form-item class="forma-item" label="库位已有托盘信息" :content="false" />
                    <containerInfo  :containerInfo="containerPlaceInfo"/>
                </div>
                <!-- <placeInfo v-show="selectDisabled" :placeInfo="containerInfo.placeInfo" /> -->
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button type="primary" text="绑定" @click="onSubmit"
                            :disabled="!abled"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import selectItem from './modules/selectItem.vue'
    import placeInfo from './modules/placeInfo.vue'
    import containerInfo from './modules/containerInfo.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getContainerPlaceInfo,
        containerHandle,
        getContainerPlaceByPlace
    } from '@/api/containerHandle.js'
    import {
        getAreaInfo,
        getAreaListContaninerBind
    } from '@/api/common.js'
    let initInterVal = null;
    export default {
        name: 'containerHandle',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            placeInfo,
            selectItem,
            containerInfo
        },
        data() {
            return {
                pageBodyHeight: 0,
                containter: null,
                form: {
                    containerNo: '',
                    areaNo: '',
                    placeNo: ''
                },
                msg: {
                    containter: ''
                },
                msgType: {
                    containter: 'info'
                },
                containerInfo: {},
                areaData: [],
                containerPlaceInfo:{}
            }
        },
        computed: {
            selectDisabled() {
                return Boolean(this.containerInfo?.placeInfo?.placeNo)
            },
            abled() {
                return Boolean(this.containerInfo.containerNo) && !Boolean(this.containerInfo?.placeInfo?.placeNo)
            },
            placeInfoShow(){
                return Boolean(this.containerInfo.containerNo) && Boolean(this.form.placeNo)&&Boolean(this.containerPlaceInfo.containerNo)&&!Boolean(this.containerInfo?.placeInfo?.placeNo);
            }
        },
        watch: {
            'form.containerNo': {
                handler(val, oldVal) {
                    this.containerInfo = {}
                    this.form.areaNo=''
                    this.form.placeNo=''
                }
            },
            'form.areaNo': {
                handler(val, oldVal) {
                    if(val!='') {
                        this.form.placeNo = ''
                        this.placeList = []
                        this.getPalceList({
                            areaCode: val
                        })
                        if (Boolean(this.containerInfo?.placeInfo?.placeNo)) {
                            this.$set(this.form, 'placeNo', this.containerInfo.placeInfo.placeNo)
                        }
                    }
                }
            },
            'form.placeNo':{
                async handler(val, oldVal) {
                    if(val!='') {
                        this.containerPlaceInfo={}
                        try{
                            let {
                                result
                            } = await getContainerPlaceByPlace({
                                placeNo: this.form.placeNo
                            })
                            this.containerPlaceInfo=result==null?{}:result;
                        }catch(e){
                            //TODO handle the exception
                            console.log(e);
                        }
                    }
                }
            }
        },
        methods: {
            /* æ‰˜ç›˜ç¼–码搜索 */
            async onSearchContainter() {
                const {
                    containerNo
                } = this.form
                if (!Boolean(containerNo)) {
                    this.msgType.containter = 'error'
                    this.msg.containter = '请输入托盘编号!';
                    return false;
                }
                // èŽ·å–ä»£ç 
                try {
                    let {
                        result
                    } = await getContainerPlaceInfo({
                        containerNo
                    })
                    this.containerInfo = result
                    if (Boolean(this.containerInfo?.placeInfo?.placeNo)) {
                        this.getAreaList()
                        this.$nextTick(() => {
                            this.$set(this.form, 'areaNo', this.containerInfo?.placeInfo?.areaCode)
                        })
                    }
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* æ¸…除托盘编码 */
            onClearContainter() {
                this.form = {
                    containterNo: '',
                    areaNo: '',
                    placeNo: ''
                }
            },
            // èŽ·å–åº“åŒºæ•°æ®
            async getAreaList() {
                try {
                    // let {
                    //     result
                    // } = await getAreaListContaninerBind()
                    let {
                        result
                    } = await getAreaInfo()
                    console.log(result,222)
                    this.areaData = result
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // æ‰˜ç›˜å¤„理
            async onSubmit() {
                    this.form.type = 1
                    uni.showModal({
                        title: '绑定',
                        content : '是否确认绑定?',
                        showCancel: true,
                        confirmText: '确定',
                        cancelText: '取消',
                        success: async ({
                            confirm,
                            cancel
                        }) => {
                            if (confirm) {
                                try {
                                    await containerHandle(this.form)
                                    $alert("托盘绑定成功!");
                                    this.onClearContainter()
                                } catch (e) {
                                    //TODO handle the exception
                                    console.log(e);
                                }
                            }
                        }
                    })
                            return
                    try {
                        let {
                            result
                        } = await getContainerPlaceByPlace({
                            placeNo: this.form.placeNo
                        })
                        if (result!=null||Boolean(this.containerInfo?.placeInfos?.placeNo)) {
                            var content=''
                            if(result!=null&&Boolean(this.containerInfo?.placeInfos?.placeNo))
                            {
                                content=`托盘当前绑定库位${this.containerInfo?.placeInfos?.placeNo},选定库位已绑定托盘${this.containerPlaceInfo?.containerNo},确认覆盖此关系进行绑定吗?`
                            }else if(result!=null&&!Boolean(this.containerInfo?.placeInfos?.placeNo))
                            {
                                content=`当前托盘未绑定库位,但选定库位已绑定托盘${this.containerPlaceInfo?.containerNo},确认覆盖此关系进行绑定吗?`
                            }
                            else if(result==null&&Boolean(this.containerInfo?.placeInfos?.placeNo))
                            {
                                content=`托盘当前绑定库位${this.containerInfo?.placeInfos?.placeNo},,但选定库位未绑定托盘,确认覆盖此关系进行绑定吗?`
                            }
                            uni.showModal({
                                title: '绑定确认',
                                content ,
                                showCancel: true,
                                confirmText: '确定',
                                cancelText: '取消',
                                success: async ({
                                    confirm,
                                    cancel
                                }) => {
                                    if (confirm) {
                                        try {
                                            await containerHandle(this.form)
                                            $alert("托盘绑定成功!");
                                            this.onClearContainter()
                                        } catch (e) {
                                            //TODO handle the exception
                                            console.log(e);
                                        }
                                    }
                                }
                            })
                        }else {
                            try {
                                await containerHandle(this.form)
                                $alert("托盘绑定成功!");
                                this.onClearContainter()
                            } catch (e) {
                                //TODO handle the exception
                                console.log(e);
                            }
                        }
                    } catch (e) {
                        //TODO handle the exception
                        console.log(e);
                    }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.getAreaList()
                this.ContainerType = getDicList(this.$store, 'container_type').sysDictDatas
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
    .label {
        margin-left: 25rpx;
        font-size: 30rpx;
    }
</style>
PipeLineLems.PDA/pages/containerHandle/modules/containerInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">托盘编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.containerNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">库位编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">托盘库位状态:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?(parseDic($store,'common_status',containerInfo.containerPlaceStatus)):''}}</view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            containerInfo: {
                type: Object,
                default: () => {}
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped lang="scss">
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/containerHandle/modules/placeInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label">库位详情:</view>
        <view class="material-item-group" v-if="Boolean(placeInfo)">
            <view class="material-list-item">
                <view class="item-row">
                    <view class="label">库位编号:</view>
                    <view class="content auto-wrap">{{placeInfo.placeNo}}</view>
                </view>
                <view class="item-row">
                    <view class="label">所属库区:</view>
                    <view class="content auto-wrap">{{placeInfo.areaCode}}</view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            placeInfo: {
                type: Object,
                default: () => {placeNo:''}
            }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
        }
    }
</script>
<style scoped lang="scss">
    .scan-input-form-item-compontent{
        width: 100%;
        .p-form-label{
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag{
                color:$u-error;
            }
        }}
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        background-color: #fff;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/containerHandle/modules/selectItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" :label="label" v-model="value" :disabled="disabled"/>
        <EasyPicker :visible.sync="visible" :list="selectData" :labelField="labelField" :valueField="valueField"
            @select="getSelectData" />
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPicker.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        props: {
            selectData: {
                type: Array,
                default: () => []
            },
            value:{
                type: String,
                default: ''
            },
            label:{
                type:String,
                default:''
            },
            labelField:{
                type:String,
                default:''
            },
            valueField:{
                type:String,
                default:''
            },
            disabled:{
                type:Boolean,
                default:false
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
            }
        },
        methods: {
            getSelectData(val){
                this.$emit('update:value',val)
            },
            parseDic
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/pages/containerUnBind/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,316 @@
<template>
    <default-header-page-layout ref="page" title="地标解绑">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <scan-input-form-item class="forma-item" label="托盘编码" v-model="form.containerNo" :msg="msg.containter"
                    :msg-type="msgType.containter" @search="onSearchContainter" @clear="onClearContainter" />
                <!-- åº“区 -->
                <!-- <selectItem :disabled="selectDisabled" v-show="Boolean(containerInfo.containerNo)"
                    :selectData="areaData" :value.sync="form.areaNo" label="库区编号" labelField="areaName"
                    valueField="areaNo" /> -->
                <!-- åº“位 -->
                <!-- <selectItem :disabled="selectDisabled" v-show="Boolean(containerInfo.containerNo)&&Boolean(form.areaNo)"
                    :selectData="placeList" :value.sync="form.placeNo" label="库位编号" labelField="placeNo"
                    valueField="placeNo" /> -->
                <div v-if="placeInfoShow">
                    <scan-input-form-item class="forma-item" label="库位已有托盘信息" :content="false" />
                    <containerInfo :containerInfo="containerInfo" />
                </div>
                <!-- <placeInfo v-show="selectDisabled" :placeInfo="containerInfo.placeInfo" /> -->
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button type="primary" text="解绑" @click="onSubmit"
                            :disabled="!abled"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import selectItem from './modules/selectItem.vue'
    import placeInfo from './modules/placeInfo.vue'
    import containerInfo from './modules/containerInfo.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getContainerPlaceInfo,
        containerHandle,
        getContainerPlaceByPlace
    } from '@/api/containerHandle.js'
    import {
        getAreaInfo
    } from '@/api/common.js'
    let initInterVal = null;
    export default {
        name: 'containerUnBind',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            placeInfo,
            selectItem,
            containerInfo
        },
        data() {
            return {
                pageBodyHeight: 0,
                containter: null,
                form: {
                    containerNo: '',
                    areaNo: '',
                    placeNo: ''
                },
                msg: {
                    containter: ''
                },
                msgType: {
                    containter: 'info'
                },
                containerInfo: {},
                areaData: [],
                containerPlaceInfo: {}
            }
        },
        computed: {
            selectDisabled() {
                return Boolean(this.containerInfo?.placeInfos?.placeNo)
            },
            abled() {
                return Boolean(this.containerInfo.containerNo) && Boolean(this.containerInfo?.placeInfos?.placeNo);
            },
            placeInfoShow() {
                return Boolean(this.containerInfo.containerNo)  && Boolean(this.containerInfo?.placeInfos?.placeNo);
            }
        },
        watch: {
            'form.containerNo': {
                handler(val, oldVal) {
                    this.containerInfo = {}
                }
            }
        },
        methods: {
            /* æ‰˜ç›˜ç¼–码搜索 */
            async onSearchContainter() {
                const {
                    containerNo
                } = this.form
                if (!Boolean(containerNo)) {
                    this.msgType.containter = 'error'
                    this.msg.containter = '请输入托盘编号!';
                    return false;
                }
                // èŽ·å–ä»£ç 
                try {
                    let {
                        result
                    } = await getContainerPlaceInfo({
                        containerNo
                    })
                    this.containerInfo = result
                    if (Boolean(this.containerInfo?.placeInfos?.placeNo)) {
                        this.$nextTick(() => {
                            this.$set(this.form, 'areaNo', this.containerInfo?.placeInfos?.areaCode)
                            this.$set(this.form, 'placeNo', this.containerInfo?.placeInfos?.placeNo)
                        })
                    }
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* æ¸…除托盘编码 */
            onClearContainter() {
                this.form = {
                    containterNo: ''
                }
            },
            // æ‰˜ç›˜å¤„理
            async onSubmit() {
                this.form.type = 2
                uni.showModal({
                    title: '解绑',
                    content : '是否确认解绑?',
                    showCancel: true,
                    confirmText: '确定',
                    cancelText: '取消',
                    success: async ({
                        confirm,
                        cancel
                    }) => {
                        if (confirm) {
                            try {
                                await containerHandle(this.form)
                                $alert("库位解绑成功!");
                                this.onClearContainter()
                            } catch (e) {
                                //TODO handle the exception
                                console.log(e);
                            }
                        }
                    }
                })
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.ContainerType = getDicList(this.$store, 'container_type').sysDictDatas
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
    .label {
        margin-left: 25rpx;
        font-size: 30rpx;
    }
</style>
PipeLineLems.PDA/pages/containerUnBind/modules/containerInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">托盘编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.containerNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">所属库区:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeInfos.areaName:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">库位编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeInfos.placeNo:''}}</view>
        </view>
        <!-- <view class="item-row">
            <view class="label">托盘库位状态:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?(parseDic($store,'common_status',containerInfo.placeInfo.containerPlaceStatus)):''}}</view>
        </view> -->
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            containerInfo: {
                type: Object,
                default: () => {}
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped lang="scss">
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/containerUnBind/modules/placeInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label">库位详情:</view>
        <view class="material-item-group" v-if="Boolean(placeInfo)">
            <view class="material-list-item">
                <view class="item-row">
                    <view class="label">库位编号:</view>
                    <view class="content auto-wrap">{{placeInfo.placeNo}}</view>
                </view>
                <view class="item-row">
                    <view class="label">所属库区:</view>
                    <view class="content auto-wrap">{{placeInfo.areaCode}}</view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            placeInfo: {
                type: Object,
                default: () => {placeNo:''}
            }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
        }
    }
</script>
<style scoped lang="scss">
    .scan-input-form-item-compontent{
        width: 100%;
        .p-form-label{
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag{
                color:$u-error;
            }
        }}
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        background-color: #fff;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/containerUnBind/modules/selectItem.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" :label="label" v-model="value" :disabled="disabled"/>
        <EasyPicker :visible.sync="visible" :list="selectData" :labelField="labelField" :valueField="valueField"
            @select="getSelectData" />
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPicker.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        props: {
            selectData: {
                type: Array,
                default: () => []
            },
            value:{
                type: String,
                default: ''
            },
            label:{
                type:String,
                default:''
            },
            labelField:{
                type:String,
                default:''
            },
            valueField:{
                type:String,
                default:''
            },
            disabled:{
                type:Boolean,
                default:false
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
            }
        },
        methods: {
            getSelectData(val){
                this.$emit('update:value',val)
            },
            parseDic
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/pages/demo/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<template>
    <default-header-page-layout ref="page" title="范例页面" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
            </view>
        </view>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
let initInterVal = null;
export default {
    name:'demoPage',
    components:{DefaultHeaderPageLayout,ActionUserRow},
    data(){
        return {
            pageBodyHeight:0
        }
    },
    methods:{
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
</style>
PipeLineLems.PDA/pages/emptyContainerReturn/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,348 @@
<template>
    <default-header-page-layout ref="page" title="空托入库">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <scan-input-form-item class="forma-item" label="托盘编码" v-model="form.containterCode"
                    :msg="msg.containter" :msg-type="msgType.containter" @search="onSearchContainter"
                    @clear="onClearContainter" />
                <scan-input-form-item  placeholder="请选择" :clearable="false"
                    :hasScan="false" :hasSearch="false" @click.native="ctVisible=true" class="forma-item" label="托盘类型"
                    v-model="form.containerType" />
                <EasyPicker :visible.sync="ctVisible" :list="ContainerType" labelField="value" valueField="code"
                    @select="getTypeVal" />
                <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"    @click.native="visible=true" class="forma-item" label="选择入库口" v-model="form.site" />
                <EasyPicker :visible.sync="visible" :list="placeList"
                    labelField="placeName" valueField="placeName" @select="getSiteVal" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button type="primary" text="确认" @click="addInBound" :disabled="abled"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getForContainerCode,
        addEmptyContainerReturn,
    } from '@/api/bind.js'
    let initInterVal = null;
    export default {
        name: 'receiveInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            EasyPicker
        },
        data() {
            return {
                pageBodyHeight: 0,
                containter: null,
                form: {
                    containterCode: '',
                    materialNo: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                },
                msg: {
                    containter: '',
                    material: '',
                    site: '',
                },
                msgType: {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                },
                containerInfo: {},
                materialData: [],
                ContainerType: [],
                visible: false,
                ctVisible: false,
                placeList: [
                    {
                        placeNo: '1-2-1-1',
                        placeName: '入库口1'
                    },
                    {
                        placeNo: '2-1-1-1',
                        placeName: '入库口2'
                    },
                ],
                abled: false,
            }
        },
        watch: {
            'form.containterCode': {
                handler(val, oldVal) {
                    this.resetContainerNo()
                }
            }
        },
        methods: {
            // é€‰æ‹©ç«™ç‚¹è¿”回值
            getSiteVal(val, valObj, index) {
                this.form.site = val
            },
            // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
            getTypeVal(val, valObj, index) {
                this.form.containerTypeCode = valObj.code
                this.form.containerType = valObj.value
            },
            /* æ‰˜ç›˜ç¼–码搜索 */
            async onSearchContainter() {
                if (!this.form.containterCode) {
                    this.msgType.containter = 'error'
                    this.msg.containter = '请输入托盘编号!';
                    return false;
                }
                // èŽ·å–ä»£ç 
                try {
                    let {
                        result
                    } = await getForContainerCode({
                        code: this.form.containterCode
                    })
                    this.containerInfo = result
                    // æ‰˜ç›˜è¯¦æƒ…
                    let containerStatusName = parseDic(this.$store, 'container_status', result?.containerStatus)
                    containerStatusName = containerStatusName == '无此字典' ? '' : containerStatusName
                    this.msg.containter =
                        `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`
                    result?.materialContainers.forEach(item => {
                        let isExist = this.materialData.some(item1 => item1.materialId == item.materialId)
                        if (!isExist) {
                            this.materialData.push(item)
                        }
                    })
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* æ¸…除托盘编码 */
            onClearContainter() {
                this.form = {
                    containterCode: '',
                    site: '',
                    containerTypeCode: 0,
                    containerType: ''
                }
                this.$set(this.form, 'site', '')
                this.resetContainerNo()
            },
            resetContainerNo() {
                this.msg = {
                    containter: '',
                    material: '',
                    site: '',
                }
                this.msgType = {
                    containter: 'info',
                    material: 'error',
                    site: 'error'
                }
                this.containerStatus = null
                this.materialData = []
                this.form.materialNo = ''
                this.form.site = ''
                this.form.containerTypeCode = 0
                this.form.containerType = ''
                this.containerInfo = {}
            },
            // å…¥åº“
            async addInBound() {
                if (!this.form.containterCode) {
                    return $alert("请扫托盘编码!")
                }
                if (!this.form.containerType) {
                    return $alert("请选择托盘类型!")
                }
                if (!this.form.site) {
                    return $alert("请选择入库口!");
                }
                //过滤placeList æ ¹æ®form.site èŽ·å–value
                const placeValue = this.placeList.find(item => item.placeName == this.form.site).placeNo;
                const data = {
                    sourePlace: placeValue, //入库口
                    containerNo: this.form.containterCode,
                    containerType: this.form.containerTypeCode
                }
                try {
                    this.abled = true //防止按钮多次点击
                    await addEmptyContainerReturn(data)
                    this.$modal('空托入库成功')
                    this.onClearContainter()
                    this.abled = false //防止按钮多次点击
                } catch (e) {
                    console.log(e);
                    this.abled = false    //防止按钮多次点击
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                // this.getPalceList({
                //     areaCode: 'LTK-SDCR'
                // })
                this.ContainerType = getDicList(this.$store, 'container_type').sysDictDatas
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/emptyIn/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,237 @@
<template>
    <default-header-page-layout ref="page" title="空托绑定">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- æ‰˜ç›˜ -->
                <scan-input-form-item :clearable="true" :hasScan="false" :hasSearch="false" class="forma-item" label="托盘编号" v-model="form.containerNo"/>
                <!-- åº“位 -->
                <selectItem
                    :selectData="placeList" :value.sync="form.placeNo" label="库位编号" labelField="placeNo"
                    valueField="placeNo" @update:value="getPlaceNo"/>
<div v-if="materialInfoShow">
                    <scan-input-form-item class="forma-item" label="库存信息" :content="false" />
                    <materialInfo :materialData="materialData" />
                </div>
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <view class="btn-frame">
                    <u-button v-if="btnAbled" type="primary" text="绑 å®š" @click="onConfirm">
                    </u-button>
                </view>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import selectItem from '@/components/selectItem.vue'
    import materialInfo from './modules/materialInfo.vue'
    import {emptyContainerBindKTHCPlace} from '@/api/emptyIn.js'
    import {
        getMaterialDetail
    } from '@/api/common.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
let initInterVal=null;
    export default {
        name: 'emptyInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            EasyPicker,
            selectItem,
            materialInfo
        },
        data() {
            return {
                pageBodyHeight: 0,
                form: {
                    containerNo: '',
                    placeNo: ''
                },
                materialData: []
            }
        },
        computed: {
            btnAbled() {
                return Boolean(this.form.placeNo)&&Boolean(this.form.containerNo);
            },
            materialInfoShow(){
                return Boolean(this.form.placeNo) ;
            }
        },
        mixins: [palceList],
        methods: {
            getPlaceNo(val,obj){
                console.log(val,obj,'111');
                this.getMaterialDetail(obj.id);
            },
            //获取物料信息
            async getMaterialDetail(id){
                try{
                    let {result}=await getMaterialDetail({id})
                    this.materialData=result.wmsMaterialStocks;
                    console.log(result,'data');
                }catch(e){
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // æ¸…除托盘信息
            onClearContainter() {
                this.form.containerCode = ''
            },
            // æ¸…除单据号
            onClearNO() {
            },
            // å…¥åº“
            async onConfirm() {
                uni.showModal({
                    title: '入库确认',
                    content: '确定执行入库操作吗?',
                    showCancel: true,
                    cancelText: '取消',
                    confirmText: '确定',
                    success: async (type) => {
                        let {
                            confirm,
                            cancel
                        } = type
                        if (confirm) {
                            console.log(this.form);
                            try{
                                await emptyContainerBindKTHCPlace(this.form)
                                $alert("空托绑定成功");
                                this.form={}
                                this.materialData=[]
                            }catch(e){
                                //TODO handle the exception
                                console.log(e);
                            }
                        }
                    }
                })
                // this.onClearContainter()
                // this.onClearNO()
            },
            // èŽ·å–æžšä¸¾ä¿¡æ¯
            async getSysEnumData() {
                try {
                    let {
                        data
                    } = await getSysEnumData({
                        enumName: 'ContainerStatus'
                    })
                    this.ContainerStatus = data
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            checkChange(item) {
                item.checked = !item.checked
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        onReady() {
            this.startInitInterval(() => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                // this.getLinesOptions()
                // this.selectOptions.models = getDicList(this.$store,'assemble_taskmodel')
                this.getPalceList({
                    areaCode: 'KTHC',
                    aisle:3
                })
                console.log(this.placeList);
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .forma-item {
        margin-bottom: 24rpx;
    }
    .only-watch-container {
        background-color: #D0DDD8;
        min-height: 90rpx;
        display: flex;
        &>.label {
            color: $u-tips-color;
            font-size: 32rpx;
            flex-shrink: 0;
            padding-left: 20rpx;
            padding-top: 22rpx;
        }
        &>.content {
            width: 1px;
            flex-grow: 1;
            display: flex;
            align-items: center;
            font-size: 30rpx;
            padding: 8rpx 0;
        }
    }
    .bottom-btns-row {
        display: flex;
        padding: 10rpx 20rpx;
        background-color: #fff;
        .btn-frame {
            width: 1%;
            box-sizing: border-box;
            flex-grow: 1;
        }
    }
</style>
PipeLineLems.PDA/pages/emptyIn/modules/barContent.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,152 @@
<template>
    <!--  -->
    <view class="content" >
        <view class="detail">
            <view class="row1">
                <view style="display: flex;align-items: center">
                    <text class="index">{{index+1}}</text>
                    <!-- materialcode -->
                    <text class="id-name">{{content.materialcode}}({{content.materialname}})</text>
                </view>
                <!-- <view class="tag">
                    <u-tag plain size="mini" text="免检" type="success"></u-tag>
                </view> -->
            </view>
            <view class="row2">
                <u-row>
                    <u-col span="3">单根长度:</u-col>
                    <u-col span="9">{{content.singleLength}}</u-col>
                </u-row>
            </view>
            <view class="row3">
                <view class="row-content">
                    <view class="col-content">
                        <view>
                            <view>单位</view>
                            <view>{{content.unit}}</view>
                        </view>
                    </view>
                    <view class="col-content">
                        <view>
                            <view>剩余数量</view>
                            <view style="text-align: center;color:#F18202">{{content.qtyCount}}</view>
                        </view>
                    </view>
                    <view class="col-content" style="align-items: center;">
                        <view>
                            <view style="text-align: center;">组盘数量</view>
                            <view :style="{ width: inputWid(content.qty) ,textAlign:'center',margin:'0 auto'}">
                                <input :maxlength="10" @click.native.stop="stop" type="number" v-model="content.qty"
                                    @blur="inputBlur" style="color:#F18202;border-bottom: 1rpx solid #F18202;" />
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <!-- <view v-for="item in propArr" :key="item.code" class="item">
                <view class="item_title">{{item.title}}</view>
                <view v-if="item.code=='qty'" class="item_content">
                    <view style="width:100rpx">
                        <input @click.native.stop="stop" type="number" v-model="content[item.code]" @blur="inputBlur" style="border-bottom: 1rpx solid #ccc;"/>
                    </view>
                </view>
                <view  v-else class="item_content">{{content[item.code]}}</view>
            </view> -->
        </view>
        <!-- <easy-picker :visible.sync="workingProcedureVisible" :list="workingProcedureList" value-field="value" label-field="label" @select="onChangeInputUser"></easy-picker> -->
    </view>
</template>
<script>
    // import EasyPicker from '@/components/EasyPicker.vue'
    export default {
        // components:{EasyPicker},
        props: {
            content: {
                type: Array,
                default:()=>[]
            }
        },
        data() {
            return {
            }
        },
        created() {
        },
        methods: {
        }
    }
</script>
<style scoped lang="scss">
    .content {
        background-color: #fff;
        width: 96%;
        margin: 18rpx auto;
        border: 1rpx solid #fff;
        display: flex;
        align-items: center;
        padding: 5rpx 5rpx 8rpx;
        font-size: 30ont30ize-common;
        .detail {
            box-sizing: border-box;
            flex: 1;
            .row1 {
                display: flex;
                justify-content: space-between;
                margin: 5rpx 0;
                .index {
                    display: inline-block;
                    width: 40rpx;
                    height: 40rpx;
                    border-radius: 20rpx;
                    background-color: $color-common;
                    text-align: center;
                    color: #fff;
                    margin-right: 10rpx;
                    line-height: 40rpx;
                }
                .id-name {
                    font-weight: 700;
                    font-size: 30rpx;
                }
            }
            .row2,
            .row3 {
                color: #bbb;
                font-size: 30rpx;
                .row-content {
                    display: flex;
                    align-items: flex-start;
                    .col-content {
                        width: 25%;
                        display: flex;
                        flex-direction: column;
                        justify-content: center;
                        align-items: flex-start;
                    }
                }
            }
            .row2{
                margin:8rpx 0;
            }
        }
    }
    .content_active {
        border: 1rpx solid #F18202 !important;
    }
    ::v-deep uni-input {
        font-size: $fontsize-common;
    }
</style>
PipeLineLems.PDA/pages/emptyIn/modules/materialInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
<
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">物料件号:</view>
            <view class="content auto-wrap">KONGTUO</view>
        </view>
        <view class="item-row">
            <view class="label">物料类型:</view>
            <view class="content auto-wrap">{{parseDic($store,'material_type',2)}}</view>
        </view>
        <view class="item-row">
            <view class="label">物料数量:</view>
            <view class="content auto-wrap">{{materialData.length}}</view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped >
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/emptyInCopy/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,237 @@
<template>
    <default-header-page-layout ref="page" title="空托绑定">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- æ‰˜ç›˜ -->
                <scan-input-form-item :clearable="true" :hasScan="false" :hasSearch="false" class="forma-item" label="托盘编号" v-model="form.containerNo"/>
                <!-- åº“位 -->
                <selectItem
                    :selectData="placeList" :value.sync="form.placeNo" label="库位编号" labelField="placeNo"
                    valueField="placeNo" @update:value="getPlaceNo"/>
<div v-if="materialInfoShow">
                    <scan-input-form-item class="forma-item" label="库存信息" :content="false" />
                    <materialInfo :materialData="materialData" />
                </div>
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <view class="btn-frame">
                    <u-button v-if="btnAbled" type="primary" text="绑 å®š" @click="onConfirm">
                    </u-button>
                </view>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import selectItem from '@/components/selectItem.vue'
    import materialInfo from './modules/materialInfo.vue'
    import {emptyContainerBindKTHCPlace} from '@/api/emptyIn.js'
    import {
        getMaterialDetail
    } from '@/api/common.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
let initInterVal=null;
    export default {
        name: 'emptyInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            EasyPicker,
            selectItem,
            materialInfo
        },
        data() {
            return {
                pageBodyHeight: 0,
                form: {
                    containerNo: '',
                    placeNo: ''
                },
                materialData: []
            }
        },
        computed: {
            btnAbled() {
                return Boolean(this.form.placeNo)&&Boolean(this.form.containerNo);
            },
            materialInfoShow(){
                return Boolean(this.form.placeNo) ;
            }
        },
        mixins: [palceList],
        methods: {
            getPlaceNo(val,obj){
                console.log(val,obj,'111');
                this.getMaterialDetail(obj.id);
            },
            //获取物料信息
            async getMaterialDetail(id){
                try{
                    let {result}=await getMaterialDetail({id})
                    this.materialData=result.wmsMaterialStocks;
                    console.log(result,'data');
                }catch(e){
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // æ¸…除托盘信息
            onClearContainter() {
                this.form.containerCode = ''
            },
            // æ¸…除单据号
            onClearNO() {
            },
            // å…¥åº“
            async onConfirm() {
                uni.showModal({
                    title: '入库确认',
                    content: '确定执行入库操作吗?',
                    showCancel: true,
                    cancelText: '取消',
                    confirmText: '确定',
                    success: async (type) => {
                        let {
                            confirm,
                            cancel
                        } = type
                        if (confirm) {
                            console.log(this.form);
                            try{
                                await emptyContainerBindKTHCPlace(this.form)
                                $alert("空托绑定成功");
                                this.form={}
                                this.materialData=[]
                            }catch(e){
                                //TODO handle the exception
                                console.log(e);
                            }
                        }
                    }
                })
                // this.onClearContainter()
                // this.onClearNO()
            },
            // èŽ·å–æžšä¸¾ä¿¡æ¯
            async getSysEnumData() {
                try {
                    let {
                        data
                    } = await getSysEnumData({
                        enumName: 'ContainerStatus'
                    })
                    this.ContainerStatus = data
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            checkChange(item) {
                item.checked = !item.checked
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        onReady() {
            this.startInitInterval(() => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                // this.getLinesOptions()
                // this.selectOptions.models = getDicList(this.$store,'assemble_taskmodel')
                this.getPalceList({
                    areaCode: 'KTHC',
                    aisle:3
                })
                console.log(this.placeList);
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .forma-item {
        margin-bottom: 24rpx;
    }
    .only-watch-container {
        background-color: #D0DDD8;
        min-height: 90rpx;
        display: flex;
        &>.label {
            color: $u-tips-color;
            font-size: 32rpx;
            flex-shrink: 0;
            padding-left: 20rpx;
            padding-top: 22rpx;
        }
        &>.content {
            width: 1px;
            flex-grow: 1;
            display: flex;
            align-items: center;
            font-size: 30rpx;
            padding: 8rpx 0;
        }
    }
    .bottom-btns-row {
        display: flex;
        padding: 10rpx 20rpx;
        background-color: #fff;
        .btn-frame {
            width: 1%;
            box-sizing: border-box;
            flex-grow: 1;
        }
    }
</style>
PipeLineLems.PDA/pages/emptyInCopy/modules/barContent.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,152 @@
<template>
    <!--  -->
    <view class="content" >
        <view class="detail">
            <view class="row1">
                <view style="display: flex;align-items: center">
                    <text class="index">{{index+1}}</text>
                    <!-- materialcode -->
                    <text class="id-name">{{content.materialcode}}({{content.materialname}})</text>
                </view>
                <!-- <view class="tag">
                    <u-tag plain size="mini" text="免检" type="success"></u-tag>
                </view> -->
            </view>
            <view class="row2">
                <u-row>
                    <u-col span="3">单根长度:</u-col>
                    <u-col span="9">{{content.singleLength}}</u-col>
                </u-row>
            </view>
            <view class="row3">
                <view class="row-content">
                    <view class="col-content">
                        <view>
                            <view>单位</view>
                            <view>{{content.unit}}</view>
                        </view>
                    </view>
                    <view class="col-content">
                        <view>
                            <view>剩余数量</view>
                            <view style="text-align: center;color:#F18202">{{content.qtyCount}}</view>
                        </view>
                    </view>
                    <view class="col-content" style="align-items: center;">
                        <view>
                            <view style="text-align: center;">组盘数量</view>
                            <view :style="{ width: inputWid(content.qty) ,textAlign:'center',margin:'0 auto'}">
                                <input :maxlength="10" @click.native.stop="stop" type="number" v-model="content.qty"
                                    @blur="inputBlur" style="color:#F18202;border-bottom: 1rpx solid #F18202;" />
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <!-- <view v-for="item in propArr" :key="item.code" class="item">
                <view class="item_title">{{item.title}}</view>
                <view v-if="item.code=='qty'" class="item_content">
                    <view style="width:100rpx">
                        <input @click.native.stop="stop" type="number" v-model="content[item.code]" @blur="inputBlur" style="border-bottom: 1rpx solid #ccc;"/>
                    </view>
                </view>
                <view  v-else class="item_content">{{content[item.code]}}</view>
            </view> -->
        </view>
        <!-- <easy-picker :visible.sync="workingProcedureVisible" :list="workingProcedureList" value-field="value" label-field="label" @select="onChangeInputUser"></easy-picker> -->
    </view>
</template>
<script>
    // import EasyPicker from '@/components/EasyPicker.vue'
    export default {
        // components:{EasyPicker},
        props: {
            content: {
                type: Array,
                default:()=>[]
            }
        },
        data() {
            return {
            }
        },
        created() {
        },
        methods: {
        }
    }
</script>
<style scoped lang="scss">
    .content {
        background-color: #fff;
        width: 96%;
        margin: 18rpx auto;
        border: 1rpx solid #fff;
        display: flex;
        align-items: center;
        padding: 5rpx 5rpx 8rpx;
        font-size: 30ont30ize-common;
        .detail {
            box-sizing: border-box;
            flex: 1;
            .row1 {
                display: flex;
                justify-content: space-between;
                margin: 5rpx 0;
                .index {
                    display: inline-block;
                    width: 40rpx;
                    height: 40rpx;
                    border-radius: 20rpx;
                    background-color: $color-common;
                    text-align: center;
                    color: #fff;
                    margin-right: 10rpx;
                    line-height: 40rpx;
                }
                .id-name {
                    font-weight: 700;
                    font-size: 30rpx;
                }
            }
            .row2,
            .row3 {
                color: #bbb;
                font-size: 30rpx;
                .row-content {
                    display: flex;
                    align-items: flex-start;
                    .col-content {
                        width: 25%;
                        display: flex;
                        flex-direction: column;
                        justify-content: center;
                        align-items: flex-start;
                    }
                }
            }
            .row2{
                margin:8rpx 0;
            }
        }
    }
    .content_active {
        border: 1rpx solid #F18202 !important;
    }
    ::v-deep uni-input {
        font-size: $fontsize-common;
    }
</style>
PipeLineLems.PDA/pages/emptyInCopy/modules/materialInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
<
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">物料件号:</view>
            <view class="content auto-wrap">KONGTUO</view>
        </view>
        <view class="item-row">
            <view class="label">物料类型:</view>
            <view class="content auto-wrap">{{parseDic($store,'material_type',2)}}</view>
        </view>
        <view class="item-row">
            <view class="label">物料数量:</view>
            <view class="content auto-wrap">{{materialData.length}}</view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped >
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/emptyOut/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,267 @@
<template>
  <default-header-page-layout ref="page" title="自制件空托呼叫">
    <view
      class="page-frame with-action-user-row"
      :style="{ height: pageBodyHeight + 'px' }"
      v-if="pageBodyHeight"
    >
      <action-user-row />
      <view class="with-action-user-row-page-content">
        <!-- åº“区 -->
        <selectItem
          :selectData="areaData"
          :value.sync="form.areaNo"
          label="库区编码"
          labelField="areaName"
          valueField="areaNo"
        />
        <selectItemWc2
          :selectData="placeList"
          :value.sync="form.placeNo"
          label="库位编码"
          labelField="placeNo"
          valueField="placeNo"
          @getPropData="getCurrentData"
        />
        <scan-input-form-item
          placeholder="请选择"
          :clearable="false"
          :hasScan="false"
          :hasSearch="false"
          @click.native="ctVisible = true"
          class="forma-item"
          label="托盘类型"
          v-model="form.containerTypeCode"
        />
        <EasyPicker
          :visible.sync="ctVisible"
          :list="ContainerType"
          labelField="value"
          valueField="code"
          @select="getTypeVal"
        />
      </view>
    </view>
    <template v-slot:footer>
      <view class="bottom-btns-row">
        <view class="btn-frame"
          ><u-button
            :disabled="!Boolean(form.placeNo)"
            type="primary"
            text="呼叫托盘"
            @click="onConfirm"
          ></u-button
        ></view>
      </view>
    </template>
  </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from "@/components/DefaultHeaderPageLayout.vue";
import ActionUserRow from "@/components/ActionUserRow.vue";
import ScanInputFormItem from "@/components/ScanInputFormItem.vue";
import EasySelectFormItem from "@/components/EasySelectFormItem.vue";
import EasyPicker from "@/components/EasyPicker.vue";
import selectItem from "@/components/selectItem.vue";
import selectItemWc2 from "@/components/selectItemWithSearchWc2.vue";
import {
  $alert,
  getDicList,
} from "@/static/js/utils/index.js";
import { palceList } from "@/service/mixins/mixins.js";
import { getAreaInfo } from "@/api/common.js";
import { callEmptyContainer } from "@/api/callEmptyContainer.js";
let initInterVal = null;
export default {
  name: "emptyOutPage",
  components: {
    DefaultHeaderPageLayout,
    ActionUserRow,
    EasySelectFormItem,
    ScanInputFormItem,
    selectItem,
    EasyPicker,
    selectItemWc2
  },
  data() {
    return {
      pageBodyHeight: 0,
      form: {
        placeNo: "",
        areaNo: "",
        areaName: "",
        containerTypeCode:"",
        containerType: ""
      },
      areaData: [],
      ctVisible: false,
      ContainerType: [],
    };
  },
  watch: {
    "form.areaNo": {
      handler(val, oldVal) {
        if (val != "") {
          this.form.placeNo = "";
          this.form.containerNo = "";
          this.placeList = [];
          this.getPalceList({
            areaCode: val,
          });
        }
      },
    },
  },
  methods: {
    //库位模糊查询
    async getCurrentData(PlaceNo) {
      await this.getPalceList({
        areaCode: this.form.areaNo,
        PlaceNo: PlaceNo
      });
    },
    // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
    getTypeVal(val, valObj, index) {
      this.form.containerTypeCode = valObj.value;
      this.form.containerType = valObj.code;
    },
    // é€‰æ‹©åº“位返回值
    async selectPlace(val, item) {
      this.form.areaNo = item.areaCode;
      this.form.placeNo = val;
      let res = this.areaList.filter((obj) => obj.areaNo == item.areaCode);
      this.form.areaName = res.length > 0 ? res[0].areaName : "";
    },
    // èŽ·å–åº“åŒºæ•°æ®
    async getAreaList() {
      try {
        let { result } = await getAreaInfo();
        this.areaData = result;
      } catch (e) {
        //TODO handle the exception
        console.log(e);
      }
    },
    async onConfirm() {
        //判断库区是否为空
        if(!this.form.areaNo){
            $alert("请选择库区");
            return;
        }
        //判断库位是否为空
        if(!this.form.placeNo){
            $alert("请选择库位");
            return;
        }
        //判断托盘类型是否为空
        if(!this.form.containerType){
            $alert("请选择托盘类型");
            return;
        }
      try {
        await callEmptyContainer(this.form);
        this.$modal('呼叫空托成功')
        this.form = {
            placeNo: "",
            areaNo: "",
            areaName: "",
            containerTypeCode:"",
            containerType: ""
        };
      } catch (e) {
        console.log(e);
      }
    },
    /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
    startInitInterval(callback) {
      initInterVal = setInterval(() => {
        if (this.pageBodyHeight) {
          this.clearInitInterval();
          callback && callback();
        } else {
          this.pageBodyHeight = this.$refs.page.getBodyHeight();
        }
      }, 200);
    },
    /* æ¸…除定时器 */
    clearInitInterval() {
      try {
        clearInterval(initInterVal);
        initInterVal = null;
      } catch (e) {
        //TODO handle the exception
      }
    },
  },
  mixins: [palceList],
  onReady() {
    this.startInitInterval(async () => {
      /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
      // this.getPalceList({
      //     areaCode: 'GGXX'
      // })
      this.ContainerType = getDicList(
        this.$store,
        "container_type"
      ).sysDictDatas;
      this.getAreaList();
    });
  },
  onUnload() {
    this.clearInitInterval();
  },
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
  display: flex;
  padding: 10rpx 20rpx;
  background-color: #fff;
  .btn-frame {
    width: 1%;
    box-sizing: border-box;
    flex-grow: 1;
  }
  .divider {
    width: 20rpx;
    flex-shrink: 0;
  }
}
.forma-item {
  margin-bottom: 24rpx;
}
.only-watch-container {
  background-color: #d0ddd8;
  min-height: 90rpx;
  display: flex;
  & > .label {
    color: $u-tips-color;
    font-size: 32rpx;
    flex-shrink: 0;
    padding-left: 20rpx;
    padding-top: 22rpx;
  }
  & > .content {
    width: 1px;
    flex-grow: 1;
    display: flex;
    align-items: center;
    font-size: 30rpx;
    padding: 8rpx 0;
  }
}
</style>
PipeLineLems.PDA/pages/emptyOut/modules/selectItemWithSearch.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" :label="label" v-model="value" :disabled="disabled"/>
        <EasyPicker :visible.sync="visible" :list="selectData" :labelField="labelField" :valueField="valueField"
            @select="getSelectData" :isShowSearch="isShowSearch" @getCurrentData="getCurrentData"/>
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPickerWithSearch.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        emits:['getCurrentData'],
        props: {
            selectData: {
                type: Array,
                default: () => []
            },
            value:{
                type: String,
                default: ''
            },
            label:{
                type:String,
                default:''
            },
            labelField:{
                type:String,
                default:''
            },
            valueField:{
                type:String,
                default:''
            },
            disabled:{
                type:Boolean,
                default:false
            },
            isShowSearch:{
                type:Boolean,
                default:false
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
            }
        },
        methods: {
            getSelectData(val){
                this.$emit('update:value',val)
            },
            getCurrentData(val){
                //调用库位接口,获取库位列表
                this.$emit('getCurrentData',val)
            },
            parseDic
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/pages/endProductInstore/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
<template>
    <default-header-page-layout ref="page" title="成品入库" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <page-main v-show="pageStyle==='main'" ref="main" @pageChange="onMainPageChange" />
                <page-edit v-show="pageStyle==='edit'" ref="edit" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="pageStyle==='main'">
                    <view class="btn-frame"><u-button text="组 ç›˜" @click="onBind"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" text="入 åº“" @click="onSubmitConfirm"></u-button></view>
                </template>
                <template v-if="pageStyle==='edit'">
                    <view class="btn-frame"><u-button text="返 å›ž" @click="onEditBack"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" :text="editIndex===-1?'æ·» åŠ ':'ä¿® æ”¹'" @click="onEditConfirm"></u-button></view>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import PageMain from './modules/main.vue'
import PageEdit from './modules/edit.vue'
import { $successInfo } from '@/static/js/utils/index.js'
let initInterVal = null;
export default {
    name:'endProductInstorePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,PageMain,PageEdit},
    data(){
        return {
            pageBodyHeight:0,
            pageStyle:'main',
            editIndex:-1
        }
    },
    methods:{
        onEditBack(){
            this.pageStyle = 'main'
        },
        onEditConfirm(){
            let check = this.$refs.edit.checkConfirm()
            if (check.flag) {
                if (this.editIndex===-1) {
                    this.$refs.main.add(check.data)
                } else {
                    this.$refs.main.modify(check.data,this.editIndex)
                }
            }
            this.pageStyle = 'main'
        },
        onMainPageChange(obj,index){
            if (obj) {
                this.editIndex = index
            } else {
                this.editIndex = -1
            }
            this.$refs.edit.init(obj)
            this.pageStyle = 'edit'
        },
        onMainReset(){
            this.$refs.main.clearMain()
        },
        onBind(){
            let check = this.$refs.main.checkConfirm()
            if (check.flag) {
                this.dealBind(check.data,(f)=>{
                    if (f) {
                        $successInfo('组盘成功')
                    }
                })
            }
        },
        onSubmitConfirm(){
            let check = this.$refs.main.checkConfirm()
            if (check.flag) {
                this.dealSubmitConfirm(check.data,(f)=>{
                    if (f) {
                        $successInfo('提交成功')
                        this.$refs.main.clearMain()
                    }
                })
            }
        },
        /* ç»„盘接口调用 */
        dealBind(obj,callback){
            let params = this.dealSubmitParams(obj,'bind')
            this.$api.post('FinishProductBindEntrance',params,{block:'endProduct'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        /*入库接口调用 */
        dealSubmitConfirm(obj,callback){
            let params = this.dealSubmitParams(obj)
            this.$api.post('FinishProductManualWare',params,{block:'endProduct'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        dealSubmitParams(obj,type='confirm'){
            let res = {
                containercode:obj.containter.containerCode,
                wmsMaterials:obj.list
            }
            if (type==='confirm') {
                res.areaid = obj.areaid
            }
            return res
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    display: flex;
    padding: 10rpx 20rpx;
    background-color: #fff;
    .btn-frame{
        width: 1%;
        box-sizing: border-box;
        flex-grow: 1;
    }
    .divider{
        width: 20rpx;
        flex-shrink: 0;
    }
}
</style>
PipeLineLems.PDA/pages/endProductInstore/modules/edit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
<template>
    <view class="plywood-instore-edit-page-content">
        <view class="form-view">
            <!-- ******************** -->
            <long-width-height-form-item
                class="forma-item"
                label="尺寸"
                :long.sync="form.materiallength"
                :width.sync="form.materialwidth"
                :height.sync="form.materialhigh"
                :msg="msg.materialspec"
                :required="true"
            />
            <scan-input-form-item
                type="digit"
                label="数量"
                v-model="form.bindquantity"
                :msg="msg.bindquantity"
                :has-scan="false"
                :has-search="false"
                :required="true"
            />
            <!-- ******************** -->
        </view>
    </view>
</template>
<script>
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import LongWidthHeightFormItem from '@/pages/components/LongWidthHeightFormItem.vue'
const defaultForm = {
    bindquantity:null,
    materiallength:null,
    materialwidth:null,
    materialhigh:null
}
export default {
    name:'plywoodInstoreEditPageContent',
    components:{ScanInputFormItem,LongWidthHeightFormItem},
    data(){
        return {
            form:{...defaultForm},
            msg:{
                materialspec:'',
                bindquantity:''
            }
        }
    },
    watch:{
        'form.materiallength'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchSpec()
            }
        },
        'form.materialwidth'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchSpec()
            }
        },
        'form.materialhigh'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchSpec()
            }
        },
        'form.bindquantity'(newVal,oldVal) {
            if (newVal!==oldVal) {
                this.watchBindquantity()
            }
        }
    },
    methods:{
        init(obj){
            if (obj) {
                this.form = {...obj}
            } else {
                this.form = {...defaultForm}
            }
        },
        getFormValues(){
            return {...this.form}
        },
        checkConfirm(){
            let res = {flag:true,data:{}}
            res.data = this.getFormValues()
            if (res.flag && (!res.data.materiallength || !res.data.materialwidth || !res.data.materialhigh)) {
                this.msg.materialspec = '请先录入尺寸!'
                res.flag = false
            } else {
                this.msg.materialspec = ''
            }
            if (res.flag && !res.data.bindquantity) {
                this.msg.bindquantity = '请先录入数量!'
                res.flag = false
            } else {
                this.msg.bindquantity = ''
            }
            return res;
        },
        watchSpec(){
            if (this.form.materiallength && this.form.materialwidth && this.form.materialhigh) {
                this.msg.materialspec = ''
            }
        },
        watchBindquantity(){
            if(this.form.bindquantity) {
                this.msg.bindquantity = ''
            } else {
                this.msg.bindquantity = '请先录入数量!'
            }
        }
    }
}
</script>
<style scoped lang="scss">
.plywood-instore-edit-page-content{
    height: 100%;
    box-sizing: border-box;
    padding-bottom: 12rpx;
    .form-view{
        height: 100%;
        overflow: auto;
    }
    .forma-item{
        margin-bottom: 24rpx;
    }
}
</style>
PipeLineLems.PDA/pages/endProductInstore/modules/main.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,342 @@
<template>
    <view class="end-product-instore-main-page-content">
        <view class="top-view">
            <scan-input-form-item
                class="forma-item"
                label="托盘码"
                v-model="form.container"
                :msg="msg.container"
                :msg-type="msgType.container"
                @search="onSearchContainer"
                @clear="onClearContainer"
            />
            <view class="btns-row">
                <view class="btn primary-btn" @tap.stop="onAdd">添加物料</view>
                <!-- <view class="divider"></view>
                <view class="btn default-btn">查看记录</view> -->
            </view>
        </view>
        <view class="list-view">
            <!-- ########### -->
            <view class="list-items-group">
                <view class="list-item" v-for="(item,index) in list" :key="'list-item-'+index">
                    <uni-swipe-action-item :auto-close="false">
                        <view class="list-item-show">
                            <view class="item-left">
                                <uni-badge :text="list.length-index" type="primary" size="normal" />
                            </view>
                            <view class="item-main">
                                <view class="item-row">
                                    <view class="label">尺寸</view>
                                    <view class="content">{{item.materiallength}}*{{item.materialwidth}}*{{item.materialhigh}}</view>
                                </view>
                                <view class="item-row">
                                    <view class="label">数量</view>
                                    <view class="content">{{item.bindquantity}}</view>
                                </view>
                            </view>
                        </view>
                        <template v-slot:right>
                            <view class="swipe-action-btns">
                                <view class="swipe-action-btn" @tap.stop="onEdit(item,index)"><text>编辑</text></view>
                                <view class="swipe-action-btn danger" @tap.stop="onDel(index)"><text>删除</text></view>
                            </view>
                        </template>
                    </uni-swipe-action-item>
                </view>
            </view>
            <!-- ########### -->
        </view>
        <view class="end-view">
            <easy-select-form-item
                label="入库库区"
                v-model="form.areaid"
                :list="selectOptions.areas"
                value-field="areaId"
                label-field="areaName"
                :clearable="false"
            />
        </view>
    </view>
</template>
<script>
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import { $alert, parseDic } from '@/static/js/utils/index.js'
const defaultForm = {
    container:'',
    areaid:''
}
export default {
    name:'endProductInstoreMainPageContent',
    emits:['pageChange'],
    components:{ScanInputFormItem, EasySelectFormItem},
    data() {
        return {
            form: {...defaultForm},
            msg:{
                container:''
            },
            msgType:{
                container:'error'
            },
            list:[],
            containter:null,
            selectOptions:{
                areas:[]
            }
        }
    },
    methods:{
        onSearchContainer(){
            if (!this.form.container) {
                this.msgType.container = 'error'
              this.msg.container = '请输入托盘码!';
              return false;
            }
            this.msg.container = '';
            this.getContainterInfo()
        },
        onClearContainer(){
            this.clearFullContainer()
        },
        clearMain(){
            this.clearFullContainer()
            this.clearArea()
        },
        clearFullContainer(){
            this.clearContainter()
            this.clearBackContainer()
        },
        clearContainter(){
            this.form.container = ''
            this.msg.container = ''
        },
        clearBackContainer(){
            this.containter = null
            this.list = []
        },
        clearArea(){
            if (this.selectOptions.areas.length!==1) {
                this.form.areaid = ''
            }
        },
        getContainterInfo(callback){
            const __setErrMessage = function(__msg) {
                if (!__msg) {
                    __msg = '网络错误,请稍后再尝试!'
                }
                this.msgType.container = 'error'
                this.msg.container = __msg;
            }.bind(this)
            let params = {ContainerCode:this.form.container}
            this.$api.get('FinishProductGetContainer',params,{block:'endProduct',warn:false,fullRes:true}).then((d)=>{
                if (d.data) {
                    if (d.data.wmsContainer) {
                        this.containter = d.data.wmsContainer
                        this.list = d.data.wmsMaterials || []
                        let _temp1 = parseDic(this.$store,'container_status',this.containter.containerStatus)
                        this.msgType.container = 'info'
                        this.msg.container = `尺寸:${this.containter.specLength}*${this.containter.specWidth},状态:${_temp1}`
                        callback && callback(true)
                    } else {
                        this.clearBackContainer()
                        __setErrMessage(d.message)
                        callback && callback(false)
                    }
                } else {
                    this.clearBackContainer()
                    __setErrMessage(d.message)
                    callback && callback(false)
                }
            }).catch((_errmsg)=>{
                this.clearBackContainer()
                __setErrMessage()
                callback && callback(false)
            })
        },
        onDel(index){
            this.list.splice(index,1)
        },
        onAdd(){
            if (!this.form.container) {
                $alert('请先录入托盘信息!')
              return false;
            }
            this.$emit('pageChange',null)
        },
        onEdit(obj,index){
            this.$emit('pageChange',obj,index)
        },
        add(obj){
            this.list.unshift(obj)
        },
        modify(obj,index) {
            this.$set(this.list,index,obj)
        },
        getSubmitParams(){
            return {
                list:this.list,
                containter:this.containter,
                areaid:this.form.areaid
            }
        },
        checkConfirm(){
            let res = {flag:true,data:{}}
            res.data = this.getSubmitParams()
            if (!res.data.containter) {
                this.msg.container = '请先录入托盘信息!'
                this.msgType.container = 'error'
                res.flag = false
            } else {
                this.msg.container = ''
            }
            if (res.flag && res.data.list.length<=0) {
                $alert('请录入成品数据!')
                res.flag = false
            }
            return res;
        },
        getAreaOptions(){
            this.$api.get('FinishProductGetAreaList',{},{block:'endProduct'}).then(d=>{
                this.selectOptions.areas = d || []
                if (this.selectOptions.areas.length===1) {
                    this.form.areaid = this.selectOptions.areas[0].areaId
                }
            }).catch(ex=>{
                console.log(ex)
            })
        }
    },
    mounted() {
        this.getAreaOptions()
    }
}
</script>
<style scoped lang="scss">
.end-product-instore-main-page-content{
    height: 100%;
    display: flex;
    flex-direction: column;
    &>.top-view,&>.end-view{
        flex-shrink: 0;
    }
    &>.end-view{
        padding: 8rpx 0 16rpx 0;
    }
    &>.list-view{
        height: 1px;
        overflow: auto;
        flex-grow: 1;
        .list-items-group{
            padding-top:12rpx;
            .list-item {
                margin-bottom: 12rpx;
                border-width: 2rpx 0;
                border-style: solid;
                border-color: $uni-border-color;
                &:last-child{
                    margin-bottom: 0;
                }
            }
        }
        .list-item-show{
            background-color: $uni-bg-color;
            //padding: 0 16rpx;
            font-size: 1.1em;
            display: flex;
            &>.item-left{
                flex-shrink: 0;
                padding-left: 16rpx;
                padding-top: 12rpx;
                padding-right: 12rpx;
            }
            &>.item-main{
                flex-grow: 1;
                width: 1px;
                padding-right: 16rpx;
            }
            .item-row{
                border-bottom: 2rpx dashed $uni-text-color-grey;
                display: flex;
                &>.label{
                    opacity: .7;
                    flex-shrink: 0;
                    width: 130rpx;
                    padding-top: 11rpx;
                    .first-label-inner{
                        display: flex;
                        align-items: center;
                        .batch-no{
                            margin-left: 8rpx;
                        }
                    }
                }
                &>.content{
                    width: 1px;
                    flex-grow: 1;
                    line-height: 1.5em;
                    padding: 8rpx 0;
                }
                &:last-child{
                    border-bottom: 0;
                }
            }
        }
    }
    .forma-item{
        margin-bottom: 24rpx;
    }
    .btns-row{
        display: flex;
        height: 90rpx;
        box-sizing: border-box;
        border-style: solid;
        border-color: $uni-border-1;
        border-width: 2rpx 0 2rpx 0;
        .divider {
            width: 2rpx;
            height: 100%;
            background-color: $uni-border-1;
        }
        .btn{
            flex-grow: 1;
            width: 1px;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            &.primary-btn{
                background-color: $uni-color-primary;
                color: $uni-bg-color;
            }
            &.default-btn{
                background-color: $uni-bg-color;
                color: $uni-color-primary;
            }
        }
    }
}
.swipe-action-btns{
    width: 100rpx;
    display: flex;
    flex-direction: column;
}
.swipe-action-btn{
    display: flex;
    color: $uni-bg-color;
    background-color: $u-primary;
    justify-content: center;
    align-items: center;
    height: 50%;
    width: 100rpx;
    box-sizing: border-box;
    &.danger{
        background-color: $u-error;
    }
}
</style>
PipeLineLems.PDA/pages/exceptionHandle/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,308 @@
<template>
    <default-header-page-layout ref="page" title="异常物料处理">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <scan-input-form-item class="forma-item" label="物料二维码" v-model="form.materialId"
                                :msg="msg.materialId" :msg-type="msgType.materialId" @search="onSearchMaterial(form.materialId)"
                                 @clear="onClearContainter"/>
                <!-- <view class="p-form-label"><text class="required-tag"></text>选择异常工位位置</view> -->
                <exceptionPlace v-show="Boolean(materialData.materialType)" :station.sync="form.station" :exceptePlace="exceptePlace"/>
                <materialInfo :materialData="this.materialData" />
                </view>
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button :disabled="disabled" type="primary" text="自动出库" @click="submint(1)"
                            ></u-button></div>
                    <div class="btn-frame"><u-button :disabled="disabled" type="primary" text="人工出库" @click="submint(2)"
                            ></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import exceptionPlace from './modules/exceptionPlace.vue'
    import materialInfo from './modules/materialInfo.vue'
    import {
        lisNoPage,exceptionInfo,outBound
    } from '@/api/exception.js'
    import { $alert, $successInfo, regexValidate } from '@/static/js/utils/index.js'
    let initInterVal = null;
    export default {
        name: 'emptyInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            EasyPicker,
            exceptionPlace,
            materialInfo
        },
        data() {
            return {
                pageBodyHeight: 0,
                form: {
                    no: '',
                    station:''
                },
                exceptePlace: [],
                materialData: {},
                msg: {
                    materialId:''
                },
                msgType: {
                    materialId:'info'
                },
            }
        },
        computed: {
            disabled() {
                return !Boolean(this.materialData.materialId)
            }
        },
        methods: {
            onClearContainter(){
                this.form.station=''
                this.materialData={}
            },
            // onReady() {
            //         this.startInitInterval(() => {
            //         })
            //     },
            // èŽ·å–å¼‚å¸¸å·¥ä½ç‚¹
             getExceptionPlace(materialType){
                var areaCode=materialType==1?'GGYC':'JTYC'
                try{
                    lisNoPage({areaCode}).then(res=>{
                        if(res.code == 200){
                            this.exceptePlace=res?.result
                            console.log(this.exceptePlace,'11');
                        }
                    })
                }catch(e){
                    //TODO handle the exception
                    $alert(e);
                    return;
                }
            },
            // èŽ·å–å¼‚å¸¸ä»¶ä¿¡æ¯ä¿¡æ¯
            async onSearchMaterial() {
                if (!this.form.materialId) {
                    this.msgType.materialId = 'error'
                    this.msg.materialId = '请输入扫码!';
                    return false;
                }
                const data = {
                    code: this.form.materialId
                }
                // èŽ·å–ä»£ç 
                try{
                    let {result}=await exceptionInfo(data)
                    this.materialData = result
                    this.getExceptionPlace(this.materialData.materialType);
                }catch(e){
                    //TODO handle the exception
                    $alert(e)
                    return;
                }
            },
            // æ¸…除数据
            setData(){
                console.log('clear');
                this.form={
                    no: '',
                    station:''
                }
                this.msg={
                    materialId:''
                },
                this.msgType={
                    materialId:'info'
                }
                this.exceptePlace= []
                this.materialData= {}
            },
            // å‡ºåº“
            async submint(type) {
                const data={
                    type,
                    materialId:this.materialData.materialId,
                    stationNo:this.form.station
                }
                console.log(data);
                try{
                    await outBound(data)
                    this.setData()
                    $successInfo("出库成功!")
                }catch(e){
                    //TODO handle the exception
                    console.log(e);
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        onReady() {
            this.startInitInterval(() => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                // this.getData()
                // this.getLinesOptions()
                // this.selectOptions.models = getDicList(this.$store,'assemble_taskmodel')
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .p-form-label{
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag{
                color:$u-error;
            }
        }
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex:1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1){
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/exceptionHandle/modules/exceptionPlace.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
<template>
    <view class="forma-item">
        <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
            @click.native="visible=true" class="forma-item" label="选择点位" v-model="station" />
        <EasyPicker :visible.sync="visible" :list="exceptePlace" labelField="placeNo" valueField="placeNo"
            @select="getSiteVal" />
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    import EasyPicker from '@/components/EasyPicker.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    export default {
        props: {
            exceptePlace: {
                type: Array,
                default: () => []
            },
            station:{
                type: String,
                default: ''
            }
        },
        components: {
            EasyPicker,
            ScanInputFormItem
        },
        data() {
            return {
                radiolist1: [],
                radiovalue1: '',
                visible:false,
                options: [{
                    text: '删除',
                    style: {
                        backgroundColor: '#F18202'
                    }
                }]
            }
        },
        methods: {
            getSiteVal(val){
                this.$emit('update:station',val)
            },
            parseDic,
            deleteItem() {
                this.$emit('sortInfo', this.sortInfo.materialNo)
            }
        }
    }
</script>
<!-- <style scoped>
    .custom-radio {
        font-size: 16px;
        line-height: 24px;
    }
    .material-item-group {
        padding-top: 10rpx;
        display: flex;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            position: relative;
            flex: 1;
            &:last-child {
                border-bottom: 0;
            }
        }
    }
    .radio-row {
        background-color: rgb(255, 255, 255);
        margin-bottom: 10px;
        padding-top: 15px;
        padding-bottom: 15px;
    }
    .p-form-label {
        font-size: 32rpx;
        color: $u-tips-color;
        padding-bottom: 12rpx;
        padding-left: 20rpx;
        .required-tag {
            color: $u-error;
        }
    }
    .radio-group u-radio {
        width: 50%;
    }
</style> -->
PipeLineLems.PDA/pages/exceptionHandle/modules/materialInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
<template>
    <view class="material-item-group" v-show="Boolean(materialData.materialNo)">
        <view class="material-list-item">
            <!-- <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view> -->
            <view class="item-row">
                <view class="label">信息提示</view>:
                <view class="content auto-wrap">{{materialData.alertInfomation}}</view>
            </view>
            <view class="item-row">
                <view class="label">物料唯一码</view>:
                <view class="content auto-wrap">{{materialData.materialId}}</view>
            </view>
            <view class="item-row">
                <view class="label">物料件号</view>:
                <view class="content auto-wrap">{{materialData.materialNo}}</view>
            </view>
            <view class="item-row">
                <view class="label">物料名称</view>:
                <view class="content auto-wrap">{{materialData.materialName}}</view>
            </view>
            <view class="item-row">
                <view class="label">供应商</view>:
                <view class="content auto-wrap">{{materialData.supplier}}</view>
            </view>
            <view class="item-row">
                <view class="label">件号</view>:
                <view class="content auto-wrap">{{materialData.materialNo}}</view>
            </view>
            <view class="item-row">
                <view class="label">规格</view>:
                <view class="content auto-wrap">{{materialData.materialSpec}}</view>
            </view>
            <view class="item-row">
                <view class="label">机型</view>:
                <view class="content auto-wrap">{{parseDic($store,'material_modal',materialData.materialModel)}}</view>
            </view>
            <view class="item-row">
                <view class="label">批次</view>:
                <view class="content auto-wrap">{{materialData.materialBatch}}</view>
            </view>
        </view>
    </view>
</template>
<script>
    import {
        parseDic
    } from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Object,
                default: () => ({})
            }
        },
        data() {
            return {
            }
        },
        methods: {
            parseDic
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 50rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                padding: 10px 0;
                border-bottom: 1px solid #ccc;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    width: 150rpx;
                    text-align-last: justify;
                    text-align: justify;
                }
                .content {
                    flex-grow: 1;
                    color: $u-content-color;
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            // .close-btn {
            //     $closeBtnSize: 70rpx;
            //     width: $closeBtnSize;
            //     height: $closeBtnSize;
            //     z-index: 1;
            //     position: absolute;
            //     top: 0rpx;
            //     right: 8rpx;
            //     background-color: $u-error;
            //     opacity: 0.6;
            //     border-radius: 25rpx;
            //     .icon-layer {
            //         position: absolute;
            //         width: 100%;
            //         height: 100%;
            //         display: flex;
            //         align-items: center;
            //         justify-content: center;
            //         z-index: 2;
            //     }
            // }
        }
    }
</style>
PipeLineLems.PDA/pages/fapaoInStore/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,310 @@
<template>
    <default-header-page-layout ref="page" title="入库作业" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <scan-input-form-item
                    class="forma-item"
                    label="批次号"
                    v-model="form.orderNo"
                    :msg="msg.orderNo"
                    :msg-type="msgType.orderNo"
                    @search="onSearchOrderNo"
                    @clear="onClearOrderNo"
                />
                <template v-if="materialObj.id">
                    <view class="material-block">
                        <view class="material-block-item">
                            <view class="label">批次号:</view>
                            <view class="content auto-wrap">{{materialObj.batch}}</view>
                        </view>
                        <view class="material-block-item">
                            <view class="label auto-wrap">流水号:</view>
                            <view class="content">
                                <input class="easy-input" v-model="materialObj.serialNo" />
                            </view>
                        </view>
                        <view class="material-block-item">
                            <view class="label">长:</view>
                            <view class="content auto-wrap">{{materialObj.long}}</view>
                        </view>
                        <view class="material-block-item">
                            <view class="label">宽:</view>
                            <view class="content auto-wrap">{{materialObj.wide}}</view>
                        </view>
                        <view class="material-block-item">
                            <view class="label">高:</view>
                            <view class="content auto-wrap">{{materialObj.high}}</view>
                        </view>
                    </view>
                    <easy-select-form-item
                        label="入库口"
                        v-model="form.entranceId"
                        :msg="msg.entranceId"
                        :msg-type="msgType.entranceId"
                        :list="selectList.entrances"
                        value-field="code"
                        label-field="name"
                        :clearable="false"
                    />
                </template>
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <u-button type="primary" text="提交入库" :disabled="confirmBtnDisabled" @click="onSubmit"></u-button>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import { $alert, $successInfo, regexValidate } from '@/static/js/utils/index.js'
let initInterVal = null;
const defaultForm = {
    orderNo:'',
    entranceId:''
}
export default {
    name:'fapaoInStorePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,ScanInputFormItem,EasySelectFormItem},
    data(){
        return {
            pageBodyHeight:0,
            step:1,
            form:{...defaultForm},
            msg:{
                orderNo:'',
                entranceId:''
            },
            msgType:{
                orderNo:'error',
                entranceId:'error'
            },
            materialObj:{},
            selectList:{
                entrances:[]
            }
        }
    },
    computed:{
        confirmBtnDisabled(){
            let res = true;
            if (this.materialObj.id && this.form.entranceId) {
                res = false
            }
            return res;
        }
    },
    methods:{
        /* å•据编号搜索 */
        onSearchOrderNo(){
            if (!this.form.orderNo) {
              this.msg.orderNo = '请输入批次号!';
              return false;
            }
            this.msg.orderNo = '';
            this.getSearchInfo()
        },
        /* æ¸…除单据编号 */
        onClearOrderNo(){
            this.resetOrderNo()
        },
        /* æ¸…除单据编号信息 */
        resetOrderNo(){
          this.msg.orderNo = '';
          this.form.orderNo = ''
          this.materialObj = {};
          this.form.entranceId = null
        },
        getSelectOptions(callback){
            this.$api.get('PdaGetWarehouseEntrance',{Id:this.materialObj.id},{block:'fapaoIn',loading:false}).then(d=>{
                this.selectList.entrances = d.outEntranceListOutputList || []
                this.form.entranceId = d.defaultCode
                callback && callback(true)
            }).catch((errmsg)=>{
                callback && callback(false,errmsg)
            })
        },
        getSearchInfo(callback,needloding=true){
            if (needloding) {
                uni.showLoading({
                    title: '加载中...',
                    mask:true
                });
            }
            this.getInMaterilaInfo((f,msg1)=>{
                if (f){
                    this.getSelectOptions((fx,msg2)=>{
                        if (needloding) {
                            uni.hideLoading();
                            if (!fx) {
                                $alert(msg2)
                            }
                        }
                        callback && callback(fx,msg2)
                    })
                } else {
                    if (needloding) {
                        uni.hideLoading();
                        $alert(msg1)
                    }
                    callback && callback(false,msg1)
                }
            })
        },
        /* èŽ·å–å…¥åº“ç‰©æ–™ä¿¡æ¯ */
        getInMaterilaInfo(callback){
            let params = {Batch:this.form.orderNo}
            this.$api.get('GetDetail',params,{block:'fapaoIn',loading:false,warn:false}).then((d)=>{
                this.materialObj = d
                callback && callback(true)
            }).catch((_errmsg)=>{
                this.resetOrderNo()
                callback && callback(false,_errmsg)
            })
        },
        inputCheck(){
            let res = true, msg = '';
            if (!this.materialObj.serialNo) {
                msg = '请输入流水号';
                res = false
            }
            if (res && !regexValidate.positiveInteger(this.materialObj.serialNo)) {
                msg = '请输入只能是正整数';
                res = false
            }
            if (res && Number(this.materialObj.serialNo)<=0) {
                msg = '请输入只能是正整数';
                res = false
            }
            if (!res) {
                $alert(msg)
            }
            return res;
        },
        /* å“åº”提交按钮 */
        onSubmit(){
            if (!this.inputCheck()) return false;
            uni.showLoading({
                title: '加载中...',
                mask:true
            });
            this.dealConfirm((f,_errmsg1)=>{
                if (f) {
                    setTimeout(()=>{
                        this.getSearchInfo((fx,_errmsg2)=>{
                            uni.hideLoading();
                            if (fx) {
                                $successInfo('入库成功')
                            } else {
                                $alert(`入库成功,但:${_errmsg2}`)
                            }
                        },false)
                    },5000)
                } else {
                    uni.hideLoading();
                    $alert(_errmsg1)
                }
            })
        },
        /* æäº¤æŽ¥å£è°ƒç”¨ */
        dealConfirm(callback){
            let params = {
                batch:this.materialObj.batch,
              serialNo:this.materialObj.serialNo,
              entranceCode:this.form.entranceId
            }
            this.$api.post('FoamingPdaAutomaticWarehouse',params,{block:'fapaoIn',loading:false,warn:false}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    padding: 10rpx;
    background-color: $uni-bg-color;
}
.forma-item{
    margin-bottom: 24rpx;
}
.material-block{
    background-color: $uni-bg-color;
    padding: 8rpx 16rpx;
    font-size: 1.1em;
    margin-bottom: 24rpx;
    border-width: 2rpx 0;
    border-style: solid;
    border-color: $uni-border-color;
    .material-block-item{
        border-bottom: 2rpx dashed $uni-text-color-grey;
        display: flex;
        &>.label{
            opacity: .7;
            flex-shrink: 0;
            width: 130rpx;
            text-align: right;
            padding-top: 11rpx;
        }
        &>.content{
            width: 1px;
            flex-grow: 1;
            line-height: 1.5em;
            padding: 8rpx 0;
        }
        &:last-child{
            border-bottom: 0;
        }
    }
    .easy-input{
        font-size: inherit;
        color: $uni-color-primary;
        text-decoration: underline;
    }
}
</style>
PipeLineLems.PDA/pages/fapiaoOutStore/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,328 @@
<template>
    <default-header-page-layout ref="page" title="出库作业" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <view class="fapao-out-page-content">
                    <view class="entrance-row">
                        <easy-select-form-item
                            label="出库口"
                            v-model="form.OutputEntrance"
                            :msg="msg.OutputEntrance"
                            :msg-type="msgType.OutputEntrance"
                            :list="selectList.entrances"
                            value-field="code"
                            label-field="name"
                            :clearable="false"
                            @select="onEntranceSelect"
                        />
                    </view>
                    <view class="info-action-box">
                        <view v-if="hasInfo">
                            <view class="info-block info-block-style1">
                                <view class="style1-row">
                                    <view class="label">出库单类别:</view>
                                    <view class="content auto-wrap">{{orderObj.orderNo}}</view>
                                </view>
                                <view class="style1-row">
                                    <view class="label">出库单编号:</view>
                                    <view class="content auto-wrap">{{orderObj.orderSubclass}}</view>
                                </view>
                            </view>
                            <view class="info-block info-block-style2">
                                <view class="list-head">
                                    <view class="list-row">
                                        <view class="list-cell list-cell1">层</view>
                                        <view class="list-cell list-cell2">物料编号</view>
                                        <view class="list-cell list-cell3">尺寸</view>
                                    </view>
                                </view>
                                <view class="list-body">
                                    <view class="list-row" v-for="(item,index) in list" :key="index">
                                        <view class="list-cell list-cell1">{{list.length-index}}</view>
                                        <view class="list-cell list-cell2">{{item.materialNo}}</view>
                                        <view class="list-cell list-cell3">{{item.long}}*{{item.wide}}*{{item.high}}</view>
                                    </view>
                                </view>
                            </view>
                            <scan-input-form-item
                                label="标签扫描"
                                v-model="form.packCode"
                                :msg="msg.packCode"
                                :msg-type="msgType.packCode"
                                :has-search="false"
                                @clear="onClearPackCode"
                            />
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <view class="btn-frame left-btn-frame"><u-button text="刷 æ–°" :disabled="!form.OutputEntrance" @click="onResetPage"></u-button></view>
                <view class="btn-frame right-btn-frame"><u-button type="primary" :disabled="list.length<=0 || !form.packCode" text="提 äº¤" @click="onSubmit"></u-button></view>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import { $alert, $successInfo } from '@/static/js/utils/index.js'
let initInterVal = null;
const defaultForm = {
    packCode:'',
    OutputEntrance:''
}
export default {
    name:'fapaoOutStorePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,ScanInputFormItem,EasySelectFormItem},
    data(){
        return {
            pageBodyHeight:0,
            step:1,
            form:{...defaultForm},
            msg:{
                packCode:'',
                OutputEntrance:''
            },
            msgType:{
                packCode:'error',
                OutputEntrance:'error'
            },
            orderObj:{},
            list:[],
            hasInfo:false,
            selectList:{
                entrances:[]
            }
        }
    },
    computed:{
        confirmBtnDisabled(){
            let res = true;
            if (this.materialObj.id && this.form.entranceId) {
                res = false
            }
            return res;
        }
    },
    methods:{
        /* æ¸…除标签 */
        onClearPackCode(){
            this.resetPackCode()
        },
        resetPackCode(){
            this.form.packCode = ''
        },
        /* é‡ç½®å‡ºåº“数据 */
        resetOutInfo(){
            this.resetPackCode()
          this.orderObj = {};
          this.list = []
            this.hasInfo = false
        },
        onEntranceSelect(val){
            this.getOutInfo(val)
        },
        onResetPage(){
            this.getOutInfo(null)
        },
        getSelectOptions(){
            this.$api.get('listNonPage',{type:2},{block:'wentrance'}).then(d=>{
                this.selectList.entrances = d || []
            }).catch(()=>{})
        },
        /* èŽ·å–å‡ºåº“æ•°æ® */
        getOutInfo(code,callback,needloding=true){
            let params = {}
            if (code) {
                params.OutputEntrance = code
            } else {
                params.OutputEntrance = this.form.OutputEntrance
            }
            if (needloding) {
                uni.showLoading({
                    title: '加载中...',
                    mask:true
                });
            }
            this.$api.get('GetPackInfomation',params,{block:'fapaoOut',loading:false}).then((d)=>{
                this.orderObj = {
                    orderNo:d.orderNo,
                    orderSubclass:d.orderSubclass
                }
                this.list = d.groupDiskOutWarehouseList || []
                this.hasInfo = true
                if (needloding) {
                    uni.hideLoading();
                }
                callback && callback(true)
            }).catch((_errmsg)=>{
                this.resetOutInfo()
                if (needloding) {
                    uni.hideLoading();
                }
                callback && callback(false,_errmsg)
            })
        },
        /* å“åº”提交按钮 */
        onSubmit(){
            this.dealConfirm((f)=>{
                if (f) {
                    $successInfo('出库成功')
                    this.resetOutInfo()
                }
            })
        },
        /* æäº¤æŽ¥å£è°ƒç”¨ */
        dealConfirm(callback){
            let params = {
              materialNoList:this.list,
              packCode:this.form.packCode
            }
            this.$api.post('Pack',params,{block:'fapaoOut'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            this.getSelectOptions()
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    display: flex;
    padding: 10rpx 0;
    background-color: $uni-bg-color;
    .btn-frame{
        width: 50%;
        box-sizing: border-box;
    }
    .left-btn-frame{
        padding-left: 20rpx;
        padding-right: 8rpx;
    }
    .right-btn-frame{
        padding-right: 20rpx;
        padding-left: 8rpx;
    }
}
.fapao-out-page-content{
    display: flex;
    flex-direction: column;
    height: 100%;
    .entrance-row{
        flex-shrink: 0;
        padding-bottom: 24rpx;
    }
    .info-action-box{
        flex-grow: 1;
        height: 1px;
    }
}
.info-block{
    background-color: $uni-bg-color;
    box-shadow: 0px 2rpx 6rpx rgba(34, 25, 25, 0.2);
    font-size: 1.1em;
}
.info-block-style1{
    padding: 8rpx 16rpx;
    margin-bottom: 24rpx;
    .style1-row{
        border-bottom: 2rpx dashed $uni-text-color-grey;
        display: flex;
        &>.label{
            opacity: .7;
            flex-shrink: 0;
            width: 190rpx;
            text-align: right;
            padding-top: 11rpx;
        }
        &>.content{
            width: 1px;
            flex-grow: 1;
            line-height: 1.5em;
            padding: 8rpx 0;
        }
        &:last-child{
            border-bottom: 0;
        }
    }
}
.info-block-style2{
    $border-style:2rpx dashed $uni-border-color;
    margin-bottom: 24rpx;
    .list-head{
        border-bottom: $border-style;
        font-weight: bold;
    }
    .list-row{
        display: flex;
        border-bottom: $border-style;
        &:last-child{
            border-bottom: 0;
        }
        .list-cell{
            word-break:break-all;
            word-wrap:break-word;
            align-items: center;
            justify-content: center;
            display: flex;
            box-sizing: border-box;
            padding: 8rpx 6rpx;
        }
        .list-cell1{
            flex-shrink: 0;
            width: 70rpx;
        }
        .list-cell2,.list-cell3{
            width: 1px;
            border-left: $border-style;
        }
        .list-cell2{
            flex-grow: 2;
        }
        .list-cell3{
            flex-grow: 3;
        }
    }
}
</style>
PipeLineLems.PDA/pages/home/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,283 @@
<template>
    <full-page-layout :safety="false" background-color="#f0f8ff">
        <view class="home-bk-layer"></view>
        <view class="home-float-layer">
            <header-page-layout :full="false" ref="page" title="首页" headerColor="#fff" @headerclick="onHeaderClick">
                <template v-slot:headerright><text class="iconfont icon-out-right"></text></template>
                <view class="home-page-containter" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
                    <view class="user-view-box">
                        <view class="user-card home-card">
                            <view class="left-view">
                                <view class="user-circle"><text class="iconfont icon-worker"></text></view>
                            </view>
                            <view class="right-view">
                                <view class="text-row1 auto-wrap">{{userName}}</view>
                                <view class="text-row2 auto-wrap">{{userAcc}}</view>
                            </view>
                        </view>
                    </view>
                    <view class="blocks-view-box">
                        <view class="home-card pic-block" v-if="picList.length>0">
                            <u-swiper :list="picList" circular indicator indicatorMode="line" circular></u-swiper>
                        </view>
                        <view class="home-card item-block-card" v-for="(itema,indexa) in blocks"
                            :key="'item-block-card-'+indexa">
                            <view class="title" v-if="itema.workShopName">{{itema.workShopName}}</view>
                            <view class="items-view">
                                <view class="block-item" v-for="(itemb,indexb) in (itema.wmsPdaPowerOutput || [])"
                                    :key="'block-item-'+indexa+'-'+indexb" @tap="onClickBlockItem(itemb.code)">
                                    <view class="block-item-icon" :style="{color:itemb.color}">
                                        <text class="iconfont" :class="[itemb.icon]"></text>
                                        <view class="opacity-layer"></view>
                                    </view>
                                    <view class="block-item-text no-wrap">{{itemb.name}}</view>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </header-page-layout>
        </view>
    </full-page-layout>
</template>
<script>
    import FullPageLayout from '@/components/FullPageLayout.vue'
    import HeaderPageLayout from '@/components/HeaderPageLayout.vue'
    let initInterVal = null;
    export default {
        name: 'homePage',
        components: {
            FullPageLayout,
            HeaderPageLayout
        },
        data() {
            return {
                pageBodyHeight: 0,
                userName: '',
                userAcc: '',
                picList: [],
                blocks: []
            }
        },
        methods: {
            onHeaderClick(type) {
                if (type === 'right') {
                    uni.redirectTo({
                        url: this.$config.path.login
                    })
                }
            },
            onClickBlockItem(path) {
                if (path) {
                    console.log(path)
                    uni.navigateTo({
                        url: this.$config.path[path]
                    });
                } else {
                    uni.showToast({
                        title: '开发中...',
                        icon: 'none'
                    })
                }
            },
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                        callback && callback()
                    }
                }, 200)
            },
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        onLoad() {
            let _user = this.$store.getters['user/getUserInfo'];
            this.userName = _user.nickName;
            this.userAcc = _user.account;
            //暂时注释,不用菜单权限 ã€Editby shaocx,2025-05-14】
            //this.blocks = _user.wmsPdaPowerOutputs?[..._user.wmsPdaPowerOutputs]:[]
            this.blocks = [{
                workShopName: '分拣',
                wmsPdaPowerOutput:[
                        // {icon:'icon-worker',code:'bind',name:'组盘',color:'#1e90ff'},
                        {icon:'icon-worker',code:'pick',name:'分拣',color:'#1e90ff'},
                        // {icon:'icon-worker',code:'bindInForLocation',name:'分拣',color:'#1e90ff'},
                        // {icon:'icon-worker',code:'bindWXJ',name:'分拣',color:'#1e90ff'},
                        ]
            },
            {
                workShopName: '其他操作',
                wmsPdaPowerOutput:[{icon:'icon-worker',code:'PointHandling',name:'点到点',color:'#1e90ff'}]
            }
            ]
        },
        onReady() {
            this.startInitInterval()
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style lang="scss" scoped>
    .home-page {
        height: 100%;
        background-color: #f0f8ff;
        position: relative;
    }
    .home-bk-layer,
    .home-float-layer {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
    }
    .home-bk-layer {
        height: 240rpx;
        border-radius: 0 0 80rpx 80rpx;
        background-image: linear-gradient(to right, $color-paimary-middle, $color-paimary-darken);
        z-index: 1;
    }
    .home-float-layer {
        height: 100%;
        overflow: hidden;
        z-index: 2;
    }
    .home-page-containter {
        display: flex;
        flex-direction: column;
        overflow: hidden;
        .user-view-box {
            flex-shrink: 0;
            padding-bottom: 30rpx;
        }
        .blocks-view-box {
            flex-grow: 1;
            overflow: auto;
        }
    }
    .home-card {
        background-color: #fff;
        width: 95%;
        border-radius: 10rpx;
        margin: 0 auto;
        box-sizing: border-box;
    }
    .pic-block {
        margin-bottom: 30rpx;
    }
    .user-card {
        display: flex;
        padding: 30rpx 0;
        .left-view {
            width: 180rpx;
            flex-shrink: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            .user-circle {
                width: 120rpx;
                height: 120rpx;
                border-radius: 50%;
                background-image: linear-gradient(to right, $color-paimary-middle, $color-paimary-darken);
                display: flex;
                align-items: center;
                justify-content: center;
                font-size: 90rpx;
                color: #fff;
            }
        }
        .right-view {
            flex-grow: 1;
            padding-right: 10rpx;
            display: flex;
            justify-content: center;
            flex-direction: column;
            .text-row1 {
                font-size: 36rpx;
                font-weight: bold;
                line-height: 1.3;
            }
            .text-row2 {
                padding-top: 10rpx;
                font-size: 28rpx;
                line-height: 1.3;
            }
        }
    }
    .item-block-card {
        margin-bottom: 30rpx;
        &>.title {
            padding: 20rpx 20rpx 0 20rpx;
            font-weight: bold;
        }
        .items-view {
            display: flex;
            flex-wrap: wrap;
            padding-bottom: 12rpx;
        }
        .block-item {
            width: 25%;
            box-sizing: border-box;
            padding-top: 20rpx;
            padding-bottom: 10rpx;
            display: flex;
            flex-direction: column;
            align-items: center;
            .block-item-icon {
                display: flex;
                justify-content: center;
                align-items: center;
                font-size: 70rpx;
                position: relative;
                .opacity-layer {
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    background-image: linear-gradient(120deg, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.1));
                }
            }
            .block-item-text {
                padding-top: 4rpx;
                font-size: 30rpx;
                text-align: center;
            }
        }
    }
</style>
PipeLineLems.PDA/pages/inAndOutBound/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<template>
        <default-header-page-layout ref="page" title="出库">
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button type="primary" text="ç¡® å®š" @click="onSubmit"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    export default {
        components: {
            DefaultHeaderPageLayout
        },
        data() {
            return {
            }
        },
        methods: {
        }
    }
</script>
<style>
</style>
PipeLineLems.PDA/pages/innerTailBack/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
    <default-header-page-layout ref="page" title="车间尾料退库" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <step1 v-show="step===1" ref="step1" />
                <step2 v-show="step===2" ref="step2" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="step===1">
                    <view class="btn-frame"><u-button text="重 ç½®" @click="onReset"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" text="下一步" @click="onGoNext"></u-button></view>
                </template>
                <template v-if="step===2">
                    <view class="btn-frame"><u-button text="上一步" @click="onGoPrev"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" text="提 äº¤" @click="onSubmit"></u-button></view>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import Step1 from './modules/Step1.vue'
import Step2 from './modules/Step2.vue'
let initInterVal = null;
export default {
    name:'innerTailBackPage',
    components:{DefaultHeaderPageLayout,ActionUserRow,Step1,Step2},
    data(){
        return {
            pageBodyHeight:0,
            step:1
        }
    },
    watch:{
        step(newVal, oldVal){
            if (newVal !== oldVal) {
              if (newVal) {
                this.switchPage();
              }
            }
        }
    },
    methods:{
        onGoNext(){
            this.step++
        },
        onGoPrev(){
            this.step--
        },
        reset(){
            this.$refs.step1.clearFullContainer()
            this.step = 1
        },
        onReset(){
            this.reset()
        },
        onSubmit(){
            this.dealConfirm((f)=>{
                if (f) {
                    $successInfo('提交成功')
                    this.reset()
                }
            })
        },
        /* æäº¤æŽ¥å£è°ƒç”¨ */
        dealConfirm(callback){
            let params = this.getSubmitParams()
            this.$api.post('TailAutoWare',params,{block:'innerTail'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        getSubmitParams(type='confirm'){
            let res = this.$refs.step1.get()
            if (type==='confirm') {
                res = {...res,...this.$refs.step2.get()}
            }
            return res
        },
        switchPage(){
            this.$nextTick(()=>{
                switch (this.step){
                    case 2:
                        this.$refs.step2.show()
                        break;
                    default:
                        break;
                }
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
            this.switchPage()
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    display: flex;
    padding: 10rpx 20rpx;
    background-color: #fff;
    .btn-frame{
        width: 1%;
        box-sizing: border-box;
        flex-grow: 1;
    }
    .divider{
        width: 20rpx;
        flex-shrink: 0;
    }
}
</style>
PipeLineLems.PDA/pages/innerTailBack/modules/Step1.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,204 @@
<template>
    <view class="inner-tail-back-step1-page-content">
        <view class="top-view">
            <scan-input-form-item
                label="托盘码"
                v-model="form.container"
                :msg="msg.container"
                :msg-type="msgType.container"
                @search="onSearchContainer"
                @clear="onClearContainer"
            />
        </view>
        <view class="list-view">
            <!-- ########### -->
            <view class="list-items-group">
                <view class="list-item" v-for="(item,index) in list" :key="'list-item-'+index">
                    <view class="list-item-show">
                        <view class="item-left">
                            <uni-badge :text="list.length-index" type="primary" size="normal" />
                        </view>
                        <view class="item-main">
                            <view class="item-row">
                                <view class="label">物料编号</view>
                                <view class="content">{{item.materialno}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">物料名称</view>
                                <view class="content">{{item.materialname}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">数量</text></view>
                                <view class="content"><input class="enable-input" v-model.number="item.bindquantity" type="number"/></view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
            <!-- ########### -->
        </view>
    </view>
</template>
<script>
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import { parseDic } from '@/static/js/utils/index.js'
const defaultForm = {
    container:''
}
export default {
    name:'innerTailBackStep1PageContent',
    components:{ScanInputFormItem},
    data() {
        return {
            form: {...defaultForm},
            msg:{
                container:''
            },
            msgType:{
                container:'error'
            },
            list:[],
            container:null
        }
    },
    methods:{
        onSearchContainer(){
            if (!this.form.container) {
                this.msgType.container = 'error'
              this.msg.container = '请输入托盘码!';
              return false;
            }
            this.msg.container = '';
            this.getContainerInfo()
        },
        onClearContainer(){
            this.clearFullContainer()
        },
        clearFullContainer(){
            this.clearContainer()
            this.clearBackContainer()
        },
        clearContainer(){
            this.form.container = ''
            this.msg.container = ''
        },
        clearBackContainer(){
            this.container = null
            this.list = []
        },
        getContainerInfo(callback){
            const __setErrMessage = function(__msg) {
                if (!__msg) {
                    __msg = '网络错误,请稍后再尝试!'
                }
                this.msgType.container = 'error'
                this.msg.container = __msg;
            }.bind(this)
            let params = {ContainerCode:this.form.container}
            this.$api.get('TailGetContainer',params,{block:'innerTail',warn:false,fullRes:true}).then((d)=>{
                if (d.data) {
                    if (d.data.wmsContainer) {
                        this.container = d.data.wmsContainer
                        this.list = d.data.wmsMaterials || []
                        let _temp1 = parseDic(this.$store,'container_status',this.container.containerStatus)
                        this.msgType.container = 'info'
                        this.msg.container = `尺寸:${this.container.specLength}*${this.container.specWidth},状态:${_temp1}`
                        callback && callback(true)
                    } else {
                        this.clearBackContainer()
                        __setErrMessage(d.message)
                        callback && callback(false)
                    }
                } else {
                    this.clearBackContainer()
                    __setErrMessage(d.message)
                    callback && callback(false)
                }
            }).catch((_errmsg)=>{
                this.clearBackContainer()
                __setErrMessage(_errmsg)
                callback && callback(false)
            })
        },
        get(){
            return {
                containerCode:this.container?this.container.containerCode:null,
                wmsMaterials:this.list
            }
        }
    }
}
</script>
<style scoped lang="scss">
.inner-tail-back-step1-page-content {
    height: 100%;
    display: flex;
    flex-direction: column;
    &>.top-view{
        flex-shrink: 0;
    }
    &>.list-view{
        height: 1px;
        overflow: auto;
        flex-grow: 1;
        .list-items-group{
            padding-top:12rpx;
            .list-item {
                margin-bottom: 12rpx;
                border-width: 2rpx 0;
                border-style: solid;
                border-color: $uni-border-color;
                &:last-child{
                    margin-bottom: 0;
                }
            }
        }
        .list-item-show{
            background-color: $uni-bg-color;
            font-size: 1.1em;
            display: flex;
            &>.item-left{
                flex-shrink: 0;
                padding-left: 16rpx;
                padding-top: 12rpx;
                padding-right: 12rpx;
            }
            &>.item-main{
                flex-grow: 1;
                width: 1px;
                padding-right: 16rpx;
            }
            .item-row{
                border-bottom: 2rpx dashed $uni-text-color-grey;
                display: flex;
                &>.label{
                    opacity: .7;
                    flex-shrink: 0;
                    width: 130rpx;
                    padding-top: 11rpx;
                    .first-label-inner{
                        display: flex;
                        align-items: center;
                        .batch-no{
                            margin-left: 8rpx;
                        }
                    }
                }
                &>.content{
                    width: 1px;
                    flex-grow: 1;
                    line-height: 1.5em;
                    padding: 8rpx 0;
                }
                &:last-child{
                    border-bottom: 0;
                }
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/innerTailBack/modules/Step2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
<template>
    <view class="inner-tail-back-step2-page-content">
        <easy-select-form-item
            class="forma-item"
            label="起始位置"
            v-model="form.stationCode"
            :list="selectOptions.startPlaces"
            value-field="stationCode"
            label-field="stationName"
        />
        <easy-select-form-item
            class="forma-item"
            label="目标库"
            v-model="form.areaId"
            :list="selectOptions.endAreas"
            value-field="areaId"
            label-field="areaName"
        />
    </view>
</template>
<script>
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import { $alert } from '@/static/js/utils/index.js'
const defaultForm = {
    stationCode:'',
    areaId:''
}
export default {
    name:'innerTailBackStep2PageContent',
    components:{EasySelectFormItem},
    data(){
        return {
            form: {...defaultForm},
            selectOptions:{
                endAreas:[],
                startPlaces:[]
            },
            loaded:false
        }
    },
    methods:{
        show(){
            this.getSelectsOptions((f)=>{
                if (f) {
                    this.resetForm()
                }
            })
        },
        resetForm(){
            if (this.selectOptions.startPlaces.length===1) {
                this.form.stationCode = this.selectOptions.startPlaces[0].stationCode
            } else {
                this.form.stationCode = ''
            }
            if (this.selectOptions.endAreas.length===1) {
                this.form.areaId = this.selectOptions.endAreas[0].areaId
            } else {
                this.form.areaId = ''
            }
        },
        getSelectsOptions(callback){
            if (this.loaded) {
                callback && callback(true)
            } else {
                uni.showLoading({
                    title: '加载中...',
                    mask:true
                });
                Promise.all([
                    this.$api.get('TailGetStarPlaceList',{},{block:'innerTail',warn:false,loading:false}),
                    this.$api.get('TailGetAreaList',{},{block:'innerTail',warn:false,loading:false})
                ]).then(res=>{
                    this.selectOptions.startPlaces = res[0] || []
                    this.selectOptions.endAreas = res[1] || []
                    this.loaded = true
                    uni.hideLoading();
                    callback && callback(true)
                }).catch(ex=>{
                    uni.hideLoading();
                    $alert(ex)
                    callback && callback(false)
                })
            }
        },
        get(){
            return this.form
        }
    }
}
</script>
<style scoped lang="scss">
.inner-tail-back-step2-page-content{
    height: 100%;
    overflow: auto;
    .forma-item{
        margin-bottom: 24rpx;
    }
}
</style>
PipeLineLems.PDA/pages/loadingDelivery/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,320 @@
<template>
    <default-header-page-layout ref="page" title="上料配送">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start @search="onSearchContainter"-->
                <scan-input-form-item class="forma-item" label="备料工位" v-model="form.startPlace"  :hasSearch="false" />
                <scan-input-form-item placeholder="请选择"  :clearable="false"
                    :hasScan="false" :hasSearch="false" @click.native="visible=true" class="forma-item" label="上料机工位"
                    v-model="form.endPlace" />
                <EasyPicker :visible.sync="visible" :list="endPlaceList" labelField="label" valueField="code"
                    @select="getEndPlaceVal" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button  text="重置" @click="reset" ></u-button></div>
                    <div class="btn-frame"><u-button type="primary" :text="actionText" @click="actionHandle"
                            :disabled="abled"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import UViewFormSelectPicker from '@/components/UViewFormSelectPicker.vue'
    import materialList from './modules/materialList.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        palceList
    } from '@/service/mixins/mixins.js'
    import {
        getForContainerCode,
        getForMaterialNo,
        bindMaterialContainer,
        addInBound,
        addInVirtualPlace,
        addAGVTask
    } from '@/api/bind.js'
    import {
        getLoadingDeliveryEnd,
        loadingDeliveryCreate,
        loadingDeliveryContinueOne,
        loadingDeliveryContinueTWo
    } from '@/api/loadingDelivery.js'
    let initInterVal = null;
    export default {
        name: 'receiveInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            materialList,
            EasyPicker
        },
        data() {
            return {
                pageBodyHeight: 0,
                form: {
                    startPlace: '',
                    endPlace: ''
                },
                paramsOne:{},
                paramsTwo:{},
                endPlaceList: [],
                visible: false,
                actionType: 1, // 1:呼叫AGV 2:装料完成 3:取料完成
            }
        },
        computed: {
            actionText() {
                switch (this.actionType) {
                    case 1:
                        return '呼叫AGV'
                    case 2:
                        return '装料完成'
                    case 3:
                        return '取料完成'
                }
            },
            abled() {
                let {
                    startPlace,
                    endPlace
                } = this.form
                let {
                    taskNo
                } =this.paramsOne
                if(this.actionType==1){
                    return !Boolean(endPlace)||!Boolean(startPlace);
                }else{
                    return !Boolean(taskNo);
                }
            }
        },
        methods: {
            // èŽ·å–ä¸Šæ–™æœºå·¥ä½åˆ—è¡¨
            async gerEndPlaceList() {
                try {
                    let {
                        result
                    } = await getLoadingDeliveryEnd();
                    let endPlaceList = []
                    result.forEach(item => {
                        endPlaceList.push({
                            code: item,
                            label: item
                        })
                    })
                    this.endPlaceList = endPlaceList;
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // ä¸Šæ–™æœºå·¥ä½é€‰æ‹©å™¨è¿”回值
            getEndPlaceVal(val, valObj, index) {
                this.form.endPlace = valObj.code
            },
            // é‡ç½®
            reset(){
                this.form={
                    startPlace: '',
                    endPlace: ''
                }
                this.actionType=1
            },
            // æ“ä½œæŒ‰é’®
            async actionHandle(){
                if(this.actionType==1)
                {
                    // åˆ›å»ºAGV任务
                    try{
                        let {result}=await loadingDeliveryCreate(this.form)
                        this.paramsOne=result
                        this.$modal('呼叫AGV成功')
                        this.actionType=2
                    }catch(e){
                        //TODO handle the exception
                        console.log(e);
                    }
                }else if(this.actionType==2){
                    if(!this.paramsOne.taskNo) this.$modal('任务号不能为空!')
                    try{
                        await loadingDeliveryContinueOne(this.paramsOne)
                        this.$modal('装料完成')
                        this.actionType=3
                    }catch(e){
                        //TODO handle the exception
                        console.log(e);
                    }
                }else if(this.actionType==3){
                    if(!this.paramsOne.taskNo) this.$modal('任务号不能为空!')
                    try{
                        await loadingDeliveryContinueTwo(this.paramsOne)
                        this.$modal('取料完成')
                        this.reset()
                    }catch(e){
                        //TODO handle the exception
                        console.log(e);
                    }
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        mixins: [palceList],
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.gerEndPlaceList()
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/loadingDelivery/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
    <u-swipe-action v-if="materialData.length>0">
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">供应商:</view>
                        <view class="content auto-wrap">{{item.supplierCode}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料类型:</view>
<!-- æžšä¸¾ -->
                        <view class="content auto-wrap">{{parseDic($store,'material_type',item.materialType)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">规格:</view>
                        <view class="content auto-wrap">{{item.materialSpec}}</view>
                    </view> -->
                    <view class="item-row">
                        <view class="label">机型:</view>
                        <view class="content auto-wrap">{{parseDic($store,'material_modal',item.materialModel)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/login/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,263 @@
<template>
    <full-page-layout :safety="false">
        <view class="login-page">
            <view class="login-content">
                <view class="content-row1">
                    <image class="logo-img" mode="aspectFit" src="/static/img/logo.png"></image>
                </view>
                <view class="content-row2">管子线</view>
                <view class="content-row3">-LMESDemo-</view>
                <view class="form-view">
                    <u-form ref="form" :model="form" :rules="rules" :labelWidth="0">
                        <u-form-item prop="account">
                            <u-input v-model.trim="form.account" prefix-icon="account" clearable>
                                <template v-slot:suffix v-if="userVisited.length>1">
                                    <view @tap.stop="onOpenUserPicker">
                                        <u-icon name="arrow-down"></u-icon>
                                    </view>
                                </template>
                            </u-input>
                        </u-form-item>
                        <u-form-item prop="password">
                            <input type="password" style="display:none;" />
                            <u-input v-model.trim="form.password" :password="pwdVisible?false:true" prefix-icon="lock" clearable @confirm="onLogin" :key="pwdKey">
                                <template v-slot:suffix>
                                    <view @tap.stop="onChangePwdVisible">
                                        <u-icon :name="pwdVisible?'eye-fill':'eye-off'"></u-icon>
                                    </view>
                                </template>
                            </u-input>
                        </u-form-item>
                    </u-form>
                    <view class="login-btn-view">
                        <u-button type="primary" text="登 å½•" @click="onLogin"></u-button>
                    </view>
                    <!-- form-view end  -->
                </view>
            </view>
            <view class="login-footer" v-if="version">应用版本号 {{version}}</view>
        </view>
        <view class="setting-target" :style="{top:safetyTop+'px'}" @tap.stop="onOpenSettingPicker">
            <u-icon name="setting-fill"></u-icon>
        </view>
        <easy-picker :visible.sync="userPickerVisible" :list="userVisited" value-field="account" label-field="account" @select="onChangeInputUser"></easy-picker>
        <easy-picker :visible.sync="settingPickerVisible" :list="settingList" @select="onGoSettingPage"></easy-picker>
    </full-page-layout>
</template>
<script>
import FullPageLayout from '@/components/FullPageLayout.vue'
import EasyPicker from '@/components/EasyPicker.vue'
import { downloadApk } from '@/static/js/utils/index.js'
export default {
    name:'loginPage',
    components:{FullPageLayout,EasyPicker},
    data(){
        return {
            form:{
                account:'',
                password:''
            },
            rules:{
                account:{
                    trigger:['change'],
                    required: true,
                    message:'请输入账号!'
                },
                password:{
                    trigger:['change'],
                    required: true,
                    message:"请输入密码!"
                }
            },
            version:'',
            userVisited:[],
            userPickerVisible:false,
            settingList:['蓝牙连接','接口域名'],
            settingPickerVisible:false,
            pwdVisible:false,
            safetyTop:0,
            pwdKey:0
        }
    },
    methods:{
        onChangePwdVisible(){
            this.pwdVisible = !this.pwdVisible
            this.pwdKey = new Date().getTime()
        },
        onLogin(){
            //暂时跳过验证 ã€Editby shaocx,2025-05-14】
            uni.navigateTo({url:this.$config.path.home});
            /*
            this.$refs.form.validate().then(res => {
                uni.showLoading({ title: 'Loading...', mask:true });
                let account = this.$store.getters['user/getAccount'];
                if (account && account===this.form.account){
                    this.getLoginInfo(f=>{
                        if (f) {
                            uni.navigateTo({url:this.$config.path.home})
                        }
                    })
                } else {
                    this.doLogin((f1)=>{
                        if (f1) {
                            this.getLoginInfo(f2=>{
                                if (f2) {
                                    uni.navigateTo({url:this.$config.path.home})
                                }
                            })
                        }
                    })
                }
            }).catch(errors => {
            })
            //*/
        },
        doLogin(callback){
            let _params = {...this.form}
            this.$api.post('sysAuth/login',_params,{needToken:false,loading:false}).then((d)=>{
                this.$store.commit('user/setAccount',this.form.account)
                //console.log('login sercer token',d)
                this.$store.commit('user/setToken',d)
                this.$store.commit('user/addVisited',{...this.form})
                callback && callback(true)
            }).catch(()=>{
                uni.hideLoading()
                callback && callback(false)
            })
        },
        getLoginInfo(callback){
            Promise.all([
                this.$api.get('sysMenu/getPdaLoginUser',{},{loading:false}),
                this.$api.get('sysDictType/allList',{},{loading:false}),
                // this.$api.get('tree',{},{block:'sysDic',loading:false})
            ]).then((response)=>{
                let _user = {...response[0]}
                //console.log('_user',_user)
                delete _user.loginEmpInfo;
                delete _user.apps;
                delete _user.menus;
                this.$store.commit('user/setUserInfo',_user)
                this.$store.commit('system/setEnum',response[1])
                // this.$store.commit('system/setEnum',response[1])
                //console.log(response[1])
                uni.hideLoading()
                callback && callback(true)
            }).catch(()=>{
                uni.hideLoading()
                callback && callback(false)
            })
        },
        onOpenUserPicker(){
            this.userPickerVisible = true
        },
        onChangeInputUser(val,obj){
            this.form.account = obj.account
            this.form.password = obj.password
        },
        onOpenSettingPicker(){
            this.settingPickerVisible = true
        },
        onGoSettingPage(val){
            if (val==='蓝牙连接') {
                uni.navigateTo({url:this.$config.path.bluetooth})
            } else if (val==='接口域名') {
                uni.navigateTo({url:this.$config.path.host})
            } else if (val==='新版下载') {
                downloadApk(this.$config)
            }
        },
        getVersion(){
            this.version = this.$store.getters['system/getVersion']
        }
    },
    onLoad(){
        this.getVersion()
        this.safetyTop = this.$store.getters['system/getSafety'].top;
        if (process.env.NODE_ENV!=='development') {
            this.settingList.push('新版下载')
        }
    },
    onReady() {
        //进入登录页面就清楚登录信息
        this.$store.commit('user/clear')
        //获取之前的用户信息
        this.userVisited = this.$store.getters['user/getVisited'];
        if (this.userVisited.length===1) {
            this.form.account = this.userVisited[0].account
            this.form.password = this.userVisited[0].password
        }
    }
}
</script>
<style lang="scss" scoped>
.login-page{
    height: 100%;
    display: flex;
    flex-direction: column;
    .login-content{
        flex-grow: 1;
        overflow: auto;
        position: relative;
        .content-row1{
            height: 400rpx;
            display: flex;
            justify-content: center;
            align-items: flex-end;
            .logo-img{
                height: 70%;
                width: 50%;
            }
        }
        .content-row2,.content-row3{
            text-align: center;
        }
        .content-row2{
            font-size: 56rpx;
            font-weight: bold;
        }
        .content-row3{
            font-size: 40rpx;
            padding-top: 20rpx;
            color: $uni-text-color-grey;
        }
        .form-view{
            padding: 50rpx 40rpx 0 40rpx;
            .login-form-item{
                margin-bottom: 32rpx;
            }
            .login-btn-view{
                padding-top: 20rpx;
            }
        }
    }
    .login-footer{
        flex-shrink: 0;
        padding: 10rpx 10rpx 4rpx 10rpx;
        font-size: 24rpx;
        color: $uni-text-color-grey;
        text-align: right;
    }
    .more-user-icon-btn{
        padding: 0 10rpx;
        font-size: 1.2em;
    }
}
.setting-target{
    $targetSize:80rpx;
    position: absolute;
    top: 0;
    right: 0;
    width: $targetSize;
    height: $targetSize;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 5;
    font-size: 40rpx;
}
</style>
PipeLineLems.PDA/pages/manual/out.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
<template>
    <default-header-page-layout ref="page" title="人工出库" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content manual-out-page">
                <!-- page start -->
                <view class="top-search">
                    <scan-input-form-item
                        label="托盘编码"
                        v-model="form.containter"
                        :msg="msg.containter"
                        :msg-type="msgType.containter"
                        @search="onSearch"
                        @clear="onClearContainer"
                    />
                </view>
                <template v-if="list.length>0">
                    <view class="materials-header">
                        <view class="header-row">
                            <view class="line"></view>
                            <view class="title">
                                <text class="text">物料详情</text>
                            </view>
                        </view>
                    </view>
                    <view class="materials-block">
                        <view class="materials-block-padding">
                            <view class="materials-box">
                                <view class="material-item-group">
                                    <view class="material-list-item" v-for="(item,index) in list" :key="'material-list-item-'+index">
                                        <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                                        <view class="item-row">
                                            <view class="label">物料编号:</view>
                                            <view class="content auto-wrap">{{item.materialno}}</view>
                                        </view>
                                        <view class="item-row">
                                            <view class="label">物料名称:</view>
                                            <view class="content auto-wrap">{{item.materialname}}</view>
                                        </view>
                                        <view class="item-row">
                                            <view class="label">批次号:</view>
                                            <view class="content auto-wrap">{{item.materialbatch}}</view>
                                        </view>
                                        <view class="item-row">
                                            <view class="label">规格:</view>
                                            <view class="content auto-wrap">{{item.materialspec}}</view>
                                        </view>
                                        <view class="item-row">
                                            <view class="label">密度:</view>
                                            <view class="content auto-wrap">{{item.materialDensity}}</view>
                                        </view>
                                        <view class="item-row">
                                            <view class="label">数量:</view>
                                            <view class="content auto-wrap">{{item.bindquantity}}</view>
                                        </view>
                                    </view>
                                </view>
                            </view>
                        </view>
                    </view>
                </template>
                <!-- page end -->
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <div class="btn-frame left-btn-frame"><u-button text="重 ç½®" @click="onReset"></u-button></div>
                <div class="btn-frame right-btn-frame"><u-button type="primary" text="ç¡® å®š" :disabled="(!containter || containter.containerstatus!==3)" @click="onConfirm"></u-button></div>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import { parseDic, $successInfo } from '@/static/js/utils/index.js'
let initInterVal = null;
const defaultForm = {
    containter:''
}
export default {
    name:'manualOutPage',
    components:{DefaultHeaderPageLayout,ActionUserRow,ScanInputFormItem},
    data(){
        return {
            pageBodyHeight:0,
            form:{...defaultForm},
            msg:{
                containter:''
            },
            msgType:{
                containter:'error'
            },
            containter:null,
            list:[]
        }
    },
    methods:{
        /* æ‰˜ç›˜ç¼–码搜索 */
        onSearch(){
            if (!this.form.containter) {
              this.msgType.containter = 'error'
              this.msg.containter = '请输入托盘编号!';
              return false;
            }
            this.msg.containter = '';
            this.getData()
        },
        /* æ¸…除托盘编码 */
        onClearContainer(){
            this.resetContainer()
        },
        /* é‡ç½®æ‰˜ç›˜ç¼–码 */
        resetContainer(){
            this.form.containter = ''
            this.msg.containter = ''
            this.containter = null
            this.list = []
        },
        /* èŽ·å–æ‰˜ç›˜ä¿¡æ¯ */
        getData(){
            let params = {Containercode:this.form.containter}
            this.$api.get('PDAGetContainer',params,{block:'exware',fullRes:true}).then((d)=>{
                if (d.data) {
                    let _temp1 = parseDic(this.$store,'container_type',d.data.wmsContainer.containertype)
                    let _temp2 = parseDic(this.$store,'container_status',d.data.wmsContainer.containerstatus)
                  this.msgType.containter = 'info'
                  this.msg.containter = `材质:${_temp1},状态:${_temp2}`;
                  this.containter = d.data.wmsContainer
                  if (d.data.wmsMaterials) {
                    this.list = d.data.wmsMaterials
                  } else {
                        this.list = []
                    }
                } else {
                  this.msgType.containter = 'error'
                  this.msg.containter = d.message || '查无信息!';
                  this.containter = null;
                  this.list = []
                }
            }).catch(()=>{
                this.containter = null;
            })
        },
        /* å“åº”重置按钮 */
        onReset(){
            this.resetContainer()
        },
        /* å“åº”确认按钮 */
        onConfirm(){
            this.dealSubmit((f)=>{
              if (f) {
                    this.resetContainer()
                $successInfo('出库成功!');
              }
            })
        },
        /* å‡ºåº“接口调用 */
        dealSubmit(callback){
            let params = {
              containercode:this.containter.containercode
            }
            this.$api.post('PDAManualWare',params,{block:'exware'}).then(()=>{
                callback && callback(true)
            }).catch(()=>{
                callback && callback(false)
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.manual-out-page{
    display: flex;
    flex-direction: column;
    .materials-header,.top-search{
        flex-shrink: 0;
    }
    .materials-header{
        padding: 12rpx 16rpx 0 16rpx;
        .header-row{
            position: relative;
            top:0;
            left: 0;
            width: 100%;
            height: 50rpx;
            display: flex;
            align-items: center;
            background-color: $uni-bg-color;
            &>.line{
                width: 100%;
                height: 2rpx;
                background-color: $uni-border-color;
            }
            &>.title{
                position: absolute;
                top:0;
                left: 0;
                width: 100%;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: 1;
                &>.text{
                    font-size: 30rpx;
                    background-color: $uni-bg-color;
                    color: $uni-border-color;
                    padding: 4rpx 12rpx;
                }
            }
        }
    }
    .materials-block{
        flex-grow: 1;
        overflow: auto;
        .materials-block-padding{
            padding: 0 16rpx;
            .materials-box{
                background-color: $uni-bg-color;
                border-radius: 6rpx;
                box-sizing: border-box;
                position: relative;
            }
        }
    }
}
.bottom-btns-row{
    display: flex;
    padding: 10rpx 0;
    background-color: #fff;
    .btn-frame{
        width: 50%;
        box-sizing: border-box;
    }
    .left-btn-frame{
        padding-left: 20rpx;
        padding-right: 8rpx;
    }
    .right-btn-frame{
        padding-right: 20rpx;
        padding-left: 8rpx;
    }
}
.material-item-group{
    padding: 0 4rpx;
    .material-list-item{
        border-bottom: 2rpx solid $uni-border-color;
        padding-bottom: 10rpx;
        padding-left: 60rpx;
        margin-bottom: 10rpx;
        position: relative;
        &:last-child{
            border-bottom: 0;
        }
        .item-row{
            display: flex;
            &>.label{
                flex-shrink: 0;
                color: $u-tips-color;
                width: 144rpx;
            }
            &>.content{
                flex-grow: 1;
                color: $u-content-color;
            }
        }
        .badge-box{
            position: absolute;
            top:8rpx;
            left: 8rpx;
            z-index: 1;
        }
    }
}
</style>
PipeLineLems.PDA/pages/materialStorage/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,317 @@
<template>
    <default-header-page-layout ref="page" title="物料入库">
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start @search="onSearchContainter"-->
                <view v-if="!addMaterialVisible">
                    <scan-input-form-item class="forma-item" label="储位码" v-model="form.startPlace" :hasSearch="false" />
                    <scan-input-form-item placeholder="请选择" :clearable="false" :hasScan="false" :hasSearch="false"
                        @click.native="visible=true" class="forma-item" label="任务类型" v-model="form.endPlace" />
                    <EasyPicker :visible.sync="visible" :list="taskTypeList" labelField="label" valueField="code"
                        @select="getEndPlaceVal" />
                </view>
                <addMaterial v-if="addMaterialVisible" ref="addMaterial" :materialData="materialData"
                    @delMaterialData="delMaterialData" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame" v-if="!addMaterialVisible"><u-button text="添加物料"
                            @click="addMaterial"></u-button></div>
                    <div class="btn-frame" v-if="addMaterialVisible"><u-button text="返回" @click="back"></u-button></div>
                    <div class="btn-frame"><u-button :disabled="abled" type="primary" text="提交" @click="actionHandle"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
    import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
    import ActionUserRow from '@/components/ActionUserRow.vue'
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
    import EasyPicker from '@/components/EasyPicker.vue'
    import UViewFormSelectPicker from '@/components/UViewFormSelectPicker.vue'
    import addMaterial from './modules/addMaterial.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    import {
        getLoadingDeliveryEnd,
        loadingDeliveryCreate,
        loadingDeliveryContinueOne,
        loadingDeliveryContinueTWo
    } from '@/api/loadingDelivery.js'
    let initInterVal = null;
    export default {
        name: 'receiveInPage',
        components: {
            DefaultHeaderPageLayout,
            ActionUserRow,
            ScanInputFormItem,
            EasySelectFormItem,
            addMaterial,
            EasyPicker
        },
        data() {
            return {
                pageBodyHeight: 0,
                form: {
                    startPlace: '',
                    endPlace: ''
                },
                paramsOne: {},
                paramsTwo: {},
                taskTypeList: [{
                        code: 1,
                        label: '人工'
                    },
                    {
                        code: 2,
                        label: 'AGV'
                    },
                ],
                materialData: [{
                    materialId: 20241206,
                    materialName: '物料名称2',
                    materialNo: '002',
                }],
                visible: false,
                addMaterialVisible: false
            }
        },
        computed: {
            abled() {
                let {
                    startPlace,
                    endPlace
                } = this.form
                return !Boolean(endPlace) || !Boolean(startPlace)||this.materialData.length<=0;
            }
        },
        methods: {
            // èŽ·å–ä¸Šæ–™æœºå·¥ä½åˆ—è¡¨
            async gerEndPlaceList() {
                try {
                    let {
                        result
                    } = await getLoadingDeliveryEnd();
                    let endPlaceList = []
                    result.forEach(item => {
                        endPlaceList.push({
                            code: item,
                            label: item
                        })
                    })
                    // this.taskTypeList = endPlaceList;
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // ä¸Šæ–™æœºå·¥ä½é€‰æ‹©å™¨è¿”回值
            getEndPlaceVal(val, valObj, index) {
                this.form.endPlace = valObj.code
            },
            // æ·»åŠ ç‰©æ–™
            addMaterial() {
                this.addMaterialVisible = true
            },
            //删除物料
            delMaterialData(materialId) {
                this.materialData = this.materialData.filter(item => item.materialId != materialId)
            },
            // è¿”回按钮
            back() {
                this.addMaterialVisible = false
                this.materialData = this.$refs.addMaterial.get()
                console.log(this.materialData, 'this.materialData');
            },
            // æ“ä½œæŒ‰é’®
            async actionHandle() {
                if (this.actionType == 1) {
                    // åˆ›å»ºAGV任务
                    try {
                        let {
                            result
                        } = await loadingDeliveryCreate(this.form)
                        this.paramsOne = result
                        this.$modal('呼叫AGV成功')
                        this.actionType = 2
                    } catch (e) {
                        //TODO handle the exception
                        console.log(e);
                    }
                } else if (this.actionType == 2) {
                    if (!this.paramsOne.taskNo) this.$modal('任务号不能为空!')
                    try {
                        await loadingDeliveryContinueOne(this.paramsOne)
                        this.$modal('装料完成')
                        this.actionType = 3
                    } catch (e) {
                        //TODO handle the exception
                        console.log(e);
                    }
                } else if (this.actionType == 3) {
                    if (!this.paramsOne.taskNo) this.$modal('任务号不能为空!')
                    try {
                        await loadingDeliveryContinueTwo(this.paramsOne)
                        this.$modal('取料完成')
                        this.reset()
                    } catch (e) {
                        //TODO handle the exception
                        console.log(e);
                    }
                }
            },
            /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
            startInitInterval(callback) {
                initInterVal = setInterval(() => {
                    if (this.pageBodyHeight) {
                        this.clearInitInterval()
                        callback && callback()
                    } else {
                        this.pageBodyHeight = this.$refs.page.getBodyHeight()
                    }
                }, 200)
            },
            /* æ¸…除定时器 */
            clearInitInterval() {
                try {
                    clearInterval(initInterVal)
                    initInterVal = null
                } catch (e) {
                    //TODO handle the exception
                }
            }
        },
        onReady() {
            this.startInitInterval(async () => {
                /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
                this.gerEndPlaceList()
            })
        },
        onUnload() {
            this.clearInitInterval()
        }
    }
</script>
<style scoped lang="scss">
    .bottom-btns-row {
        display: flex;
        justify-content: center;
        padding: 10rpx 10rpx;
        background-color: #fff;
        .btn-frame {
            flex: 1;
            box-sizing: border-box;
        }
        .btn-frame:nth-child(1) {
            margin-right: 10rpx;
        }
        .left-btn-frame {
            padding-left: 20rpx;
            padding-right: 8rpx;
        }
        .right-btn-frame {
            padding-right: 20rpx;
            padding-left: 8rpx;
        }
    }
    .forma-item {
        margin-bottom: 24rpx;
    }
    .material-item-group {
        background-color: $uni-bg-color;
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            margin-bottom: 10rpx;
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                &>.label {
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/materialStorage/modules/addMaterial.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
<template>
    <view>
        <!--  @clear="onClearMaterial" -->
        <scan-input-form-item class="forma-item" label="物料二维码" v-model="materialNo" @search="onSearchMaterial" />
        <materialList v-on="$listeners" ref="materialList" :materialData="materialData"   />
    </view>
</template>
<script>
    import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
    import materialList from './materialList.vue'
    import {
        parseDic,
        $alert,
        $successInfo,
        getDicList
    } from '@/static/js/utils/index.js'
    export default {
        components: {
            ScanInputFormItem,
            materialList
        },
        props:{
            materialData:{
                type:Array,
                default:()=>[]
            }
        },
        data() {
            return {
                materialNo: ''
            }
        },
        methods: {
            /* ç‰©æ–™ç¼–码搜索 */
            async onSearchMaterial() {
                if (!this.materialNo) {
                    $alert('请输入物料编号!');
                    return false;
                }
                try {
                    // let {
                    //     result
                    // } = await getForMaterialNo({
                    //     code: this.materialNo
                    // })
                    let result={
                        materialId:20241205,
                        materialName:'物料名称1',
                        materialNo:'001',
                    }
                    const isExist = this.materialData.some(item => item.materialId == result.materialId)
                    if (!isExist) {
                        this.materialData.push(result)
                    } else {
                        $alert(`物料唯一码已存在,请删除后再输入!`);
                    }
                    this.materialNo=''
                } catch (e) {
                    //TODO handle the exception
                    console.log(e);
                }
            },
            // è¿”回数据
            get(){
                return this.materialData
            }
        }
    }
</script>
<style lang="scss" scoped>
    .forma-item {
        margin-bottom: 24rpx;
    }
</style>
PipeLineLems.PDA/pages/materialStorage/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
    <u-swipe-action  v-if="materialData.length>0">
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <!-- <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view> -->
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">供应商:</view>
                        <view class="content auto-wrap">{{item.supplierCode}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料类型:</view>
<!-- æžšä¸¾ -->
                        <view class="content auto-wrap">{{parseDic($store,'material_type',item.materialType)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">规格:</view>
                        <view class="content auto-wrap">{{item.materialSpec}}</view>
                    </view> -->
                    <view class="item-row">
                        <view class="label">机型:</view>
                        <view class="content auto-wrap">{{parseDic($store,'material_modal',item.materialModel)}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/notices/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,195 @@
<template>
    <default-header-page-layout ref="page" title="设备报警" >
        <view class="page-frame notices-page-container" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <view class="container-top-tabs">
                <view v-for="(item,index) in tabs" :key="'tab-item-'+index" class="tab-item" :class="[item.value===activeTab?'active':'']" @tap.stop="onChangeActiveTab(item.value)">{{item.label}}</view>
            </view>
            <scroll-view class="notices-list" :scroll-y="true">
                <view class="notice-list-item">
                    <view class="item-left">
                        <view class="circle-no">1</view>
                        <u-tag text="关闭" plain size="mini" type="info" />
                    </view>
                    <view class="item-context">
                        <view class="item-row">
                            <view class="label">报警设备:</view>
                            <view class="content auto-wrap">连杆衬套精整专机</view>
                        </view>
                        <view class="item-row">
                            <view class="label">报警时间:</view>
                            <view class="content auto-wrap">2022.3.5 12:00:52</view>
                        </view>
                        <view class="item-row">
                            <view class="label">错误代码:</view>
                            <view class="content auto-wrap">xxx001</view>
                        </view>
                        <view class="item-row">
                            <view class="label">错误信息:</view>
                            <view class="content auto-wrap">昂大哥大使馆的季后赛·哈哈沙嗲忽地啊皇帝和方法返回科技啊是覅uahfihfaiuh股股份规划</view>
                        </view>
                    </view>
                </view>
                <view class="notice-list-item">
                    <view class="item-left">
                        <view class="circle-no">99</view>
                        <u-tag text="挂起" plain size="mini" type="error" />
                    </view>
                    <view class="item-context">
                        <view class="item-row">
                            <view class="label">报警设备:</view>
                            <view class="content auto-wrap">连杆衬套精整专机</view>
                        </view>
                        <view class="item-row">
                            <view class="label">报警时间:</view>
                            <view class="content auto-wrap">2022.3.5 12:00:52</view>
                        </view>
                        <view class="item-row">
                            <view class="label">错误代码:</view>
                            <view class="content auto-wrap">xxx003</view>
                        </view>
                        <view class="item-row">
                            <view class="label">错误信息:</view>
                            <view class="content auto-wrap">昂大哥大使馆的季后赛·哈哈沙嗲忽地啊皇帝和方法返回科技啊是覅uahfihfaiuh股股份规划</view>
                        </view>
                    </view>
                </view>
                <view class="no-more-text-row">不能更多了</view>
            </scroll-view>
        </view>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
let initInterVal = null;
export default {
    name:'noticesPage',
    components:{DefaultHeaderPageLayout},
    data(){
        return {
            pageBodyHeight:0,
            tabs:[
                {value:0,label:'全部'},
                {value:1,label:'挂起'},
                {value:2,label:'关闭'}
            ],
            activeTab:0,
            maxListNumber:99
        }
    },
    methods:{
        onChangeActiveTab(val){
            this.activeTab = val
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.notices-page-container{
    $topSize:80rpx;
    box-sizing: border-box;
    padding-top: $topSize;
    .container-top-tabs{
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: $topSize;
        box-sizing: border-box;
        background-color: $uni-bg-color;
        border-bottom: 2rpx solid $uni-border-color;
        display: flex;
        .tab-item{
            width: 33.3333%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            font-size: 36rpx;
            &.active{
                color: $u-primary;
            }
        }
    }
    .notices-list{
        height: 100%;
        .notice-list-item{
            border-bottom: 2rpx solid $uni-border-color;
            margin-bottom: 10rpx;
            background-color: $uni-bg-color;
            box-shadow: 0px 2rpx 6rpx rgba(34, 25, 25, 0.2);
            display: flex;
            &:last-child{
                border-bottom: 0;
            }
        }
        .item-left{
            width: 100rpx;
            flex-shrink: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding-top: 10rpx;
            .circle-no{
                $circleNoSize:50rpx;
                min-width: $circleNoSize;
                height: $circleNoSize;
                background-color: $u-primary;
                color: $uni-bg-color;
                border-radius: 50%;
                display: flex;
                align-items: center;
                justify-content: center;
                margin-bottom: 10rpx;
            }
        }
        .item-context{
            flex-grow: 1;
            .item-row{
                display: flex;
                &>.label{
                    flex-shrink: 0;
                    color: $u-tips-color;
                    width: 144rpx;
                }
                &>.content{
                    flex-grow: 1;
                    color: $u-content-color;
                }
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/oneTouchUnBind/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,612 @@
<template>
  <default-header-page-layout ref="page" title="储位管理">
    <view
      class="page-frame with-action-user-row"
      :style="{ height: pageBodyHeight + 'px' }"
      v-if="pageBodyHeight"
    >
      <action-user-row />
      <view class="with-action-user-row-page-content">
        <selectItem
          :selectData="areaData"
          :value.sync="form.areaNo"
          label="库区编码"
          labelField="areaName"
          valueField="areaNo"
        />
        <selectItemWc2
          :selectData="placeList"
          :value.sync="form.placeNo"
          label="库位编码"
          labelField="placeNo"
          valueField="placeNo"
          @getPropData="getPropData"
          :msg="msg.placeNoInfo"
          @confirmHc="getStockPageHandle"
        />
        <!-- æ‰˜ç›˜ç¼–码 -->
        <scan-input-form-item
          class="forma-item"
          label="托盘编码"
          :disabled="true"
          v-model="form.containterCode"
          :msg="msg.containter"
          :msg-type="msgType.containter"
          @search="onSearchContainter"
          @clear="onClearContainter"
          :hasScan="false"
          :hasSearch="false"
        />
        <scan-input-form-item
          placeholder="请选择"
          :clearable="false"
          :hasScan="false"
          :hasSearch="false"
          @click.native="ctVisible = true"
          class="forma-item"
          label="托盘类型"
          v-model="form.containerType"
        />
        <EasyPicker
          :visible.sync="ctVisible"
          :list="ContainerType"
          labelField="value"
          valueField="code"
          @select="getTypeVal"
        />
        <view
          class="scan-input-form-item-compontent"
          style="background-color: white; display: flex"
        >
          <view class="p-form-label"> æ˜¯å¦é”å®šè§£é”ï¼š</view>
          <u-radio-group v-model="form.islock">
            <u-radio label="是" name="1"></u-radio> &nbsp;&nbsp;&nbsp;
            <u-radio style="margin-left: 10px" label="否" name="0"></u-radio>
          </u-radio-group>
        </view>
        <br />
        <!-- å†»ç»“原因 -->
        <scan-input-form-item
          v-if="form.islock"
          class="forma-item"
          label="锁机制原因"
          v-model="form.lockReason"
          :hasScan="false"
          :hasSearch="false"
          @clear="onClearContainter"
        />
        <view
          class="scan-input-form-item-compontent"
          style="background-color: white; display: flex"
        >
          <view class="p-form-label"> æ˜¯å¦ç©ºæ‰˜ï¼š{{ titleContainer }}</view>
        </view>
        <br />
        <materialList
          :materialData="materialData"
          @delMaterialData="delMaterialData"
        />
      </view>
    </view>
    <template v-slot:footer>
      <view class="bottom-btns-row">
        <template>
          <!-- <div class="btn-frame">
            <u-button text="重置" @click="onClearContainter"></u-button>
          </div> -->
          <div class="btn-frame">
            <u-button
              text="置为空托"
              @click="oneTouchUnBindHandle(1)"
            ></u-button>
          </div>
          <!-- åº“位解锁 -->
          <div class="btn-frame">
            <u-button text="锁定" @click="placebatchUpdate(1)"></u-button>
          </div>
          <div class="btn-frame" style="margin:0 5px;">
            <u-button text="解锁" @click="placebatchUpdate(2)"></u-button>
          </div>
          <div class="btn-frame">
            <u-button
              type="primary"
              text="清除库存"
              @click="oneTouchUnBindHandle(2)"
            ></u-button>
          </div>
        </template>
      </view>
    </template>
  </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from "@/components/DefaultHeaderPageLayout.vue";
import ActionUserRow from "@/components/ActionUserRow.vue";
import ScanInputFormItem from "@/components/ScanInputFormItem.vue";
import selectItem from "@/components/selectItem.vue";
import selectItemWc2 from "@/components/selectItemWithSearchWc2.vue";
import placeInfo from "./modules/placeInfo.vue";
import containerInfo from "./modules/containerInfo.vue";
import { $alert, getDicList } from "@/static/js/utils/index.js";
import { palceList } from "@/service/mixins/mixins.js";
import { getForContainerCode } from "@/api/bind.js";
import EasyPicker from "@/components/EasyPicker.vue";
import {
  oneTouchUnBindHandle,
  StockPageForPdaCwgl,
  placebatchUpdate,
} from "@/api/containerHandle.js";
import { getAreaInfo } from "@/api/common.js";
import materialList from "./modules/materialList.vue";
import { parseDic } from "@/static/js/utils/index.js";
let initInterVal = null;
export default {
  name: "containerHandle",
  components: {
    DefaultHeaderPageLayout,
    ActionUserRow,
    ScanInputFormItem,
    placeInfo,
    selectItem,
    containerInfo,
    materialList,
    EasyPicker,
    selectItemWc2,
  },
  data() {
    return {
      ContainerType: [],
      ctVisible: false,
      pageBodyHeight: 0,
      containter: null,
      form: {
        containterCode: "",
        areaNo: "",
        placeNo: "",
        sorting: "",
        containerTypeCode: 0,
        containerType: "",
      },
      msg: {
        containter: "",
        placeNoInfo: "",
      },
      msgType: {
        containter: "info",
      },
      containerInfo: {},
      areaData: [],
      containerPlaceInfo: {},
      materialData: [],
      visibleSort1: false,
      isSorting: [
        {
          label: "是",
          value: "1",
        },
        {
          label: "否",
          value: "0",
        },
      ],
      titleContainer: "",
    };
  },
  mixins: [palceList],
  watch: {
    "form.areaNo": {
      handler(val, oldVal) {
        if (val != "") {
          this.form.placeNo = "";
          this.placeList = [];
          // èŽ·å–åº“å­˜
          this.getPalceList({
            areaCode: val,
          });
        }
      },
    },
  },
  methods: {
    parseDic,
    // é€‰æ‹©æ‰˜ç›˜ç±»åž‹è¿”回值
    getTypeVal(val, valObj, index) {
      this.form.containerTypeCode = valObj.code;
      this.form.containerType = valObj.value;
    },
    radioChange1(val, b) {
      this.form.islock = b.label; // æ›´æ–°å†»ç»“状态
      this.visibleSort1 = false; // å…³é—­é€‰æ‹©å™¨
    },
    radioChange2(val, b) {
      this.form.emptyContainer = b.label;
      this.visibleSort1 = false; // å…³é—­é€‰æ‹©å™¨
    },
    /* 2托盘编码搜索库存 */
    async onSearchContainter() {
      if (!this.form.containterCode) {
        this.msgType.containter = "error";
        this.msg.containter = "请输入托盘编码!";
        return false;
      }
      try {
        let { result } = await getForContainerCode({
          code: this.form.containterCode,
        });
        this.materialData = [];
        this.containerInfo = result;
        if (result?.materialContainers.length == 0) {
          uni.showToast({
            title: "托盘上没有物料或者托盘不存在!",
            icon: "none",
          });
          return;
        }
        this.materialData = result?.materialContainers;
      } catch (e) {
        console.log(e);
      }
    },
    //1获取库存
    async getStockPageHandle(val) {
      this.form.containterCode = "";
      this.msg.placeNoInfo = "";
      this.materialData = [];
      var placeNo = this.form.placeNo || val;
      if (!placeNo) {
        uni.showToast({
          title: "请选择或扫描库位!",
          icon: "none",
        });
        return;
      }
      let { result } = await StockPageForPdaCwgl({
        placeNo: placeNo,
      });
      this.$nextTick(() => {
        var placeStatus2 =
          parseDic(
            this.$store,
            "place_status",
            result?.placeOutput.placeStatus
          ) || "";
        this.msg.placeNoInfo = `${
          result?.placeOutput.islock == 1 ? "锁定" : "未锁定"
        }, åº“位状态:${placeStatus2}`;
        this.materialData = result?.materialStockOutput || [];
        this.titleContainer = result?.placeOutput.emptyContainer==1?"是": "否";
      });
    },
    /* æ¸…除托盘编码 */
    onClearContainter() {
      this.form = {
        containterCode: "",
        areaNo: "",
        placeNo: "",
      };
      this.materialData = [];
      this.msg.placeNoInfo = "";
      this.form.placeNo = "";
      this.titleContainer = "";
    },
    // èŽ·å–åº“åŒºæ•°æ®
    async getAreaList() {
      try {
        let { result } = await getAreaInfo();
        this.areaData = result;
      } catch (e) {
        console.log(e);
      }
    },
    //库位模糊查询
    async getPropData(PlaceNo) {
      await this.getPalceList({
        areaCode: this.form.areaNo,
        PlaceNo: PlaceNo,
      });
    },
    // æ‰˜ç›˜å¤„理
    async oneTouchUnBindHandle(type) {
      var content = `库位编码:${this.form.placeNo},是否确认一键清除?`;
      // ç½®ä¸ºç©ºæ‰˜
      if (type == 1) {
        content = `库位编码:${this.form.placeNo},是否确认置为空托货位?`;
      }
      uni.showModal({
        title: "提示",
        content: content,
        showCancel: true,
        confirmText: "确定",
        cancelText: "取消",
        success: async ({ confirm, cancel }) => {
          if (confirm) {
            try {
              await oneTouchUnBindHandle({
                type: type,
                containerTypeCode: this.form.containerTypeCode,
                containerNo: this.form.containterCode,
                placeNo: this.form.placeNo,
              });
              $alert("操作成功!");
              this.onClearContainter();
            } catch (e) {
              console.log(e);
            }
          }
        },
      });
    },
    // é”å®šè§£é”
    async placebatchUpdate(islock) {
      if (!this.form.lockReason) {
        uni.showToast({
          title: "请输入原因!",
          icon: "none",
        });
        return;
      }
      var titleM = islock == 2 ? "解锁" : "锁定";
      uni.showModal({
        title: titleM,
        content: `库位编码:${this.form.placeNo},是否确认?`,
        showCancel: true,
        confirmText: "确定",
        cancelText: "取消",
        success: async ({ confirm, cancel }) => {
          if (confirm) {
            try {
              await placebatchUpdate({
                placeNo: this.form.placeNo,
                islock: islock,
                LockReason: this.form.lockReason,
              });
              $alert(`${titleM}成功!`);
              this.onClearContainter();
            } catch (e) {
              console.log(e);
            }
          }
        },
      });
    },
    /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
    startInitInterval(callback) {
      initInterVal = setInterval(() => {
        if (this.pageBodyHeight) {
          this.clearInitInterval();
          callback && callback();
        } else {
          this.pageBodyHeight = this.$refs.page.getBodyHeight();
        }
      }, 200);
    },
    /* æ¸…除定时器 */
    clearInitInterval() {
      try {
        clearInterval(initInterVal);
        initInterVal = null;
      } catch (e) {
        //TODO handle the exception
      }
    },
    //删除物料
    delMaterialData(materialId) {
      this.materialData = this.materialData.filter(
        (item) => item.materialId != materialId
      );
    },
  },
  onReady() {
    this.startInitInterval(async () => {
      /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
      this.getAreaList();
      this.ContainerType = getDicList(
        this.$store,
        "container_type"
      ).sysDictDatas;
    });
  },
  onUnload() {
    this.clearInitInterval();
  },
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
  display: flex;
  justify-content: center;
  padding: 10rpx 10rpx;
  background-color: #fff;
  .btn-frame {
    flex: 1;
    box-sizing: border-box;
  }
  .btn-frame:nth-child(1) {
    margin-right: 10rpx;
  }
  .left-btn-frame {
    padding-left: 20rpx;
    padding-right: 8rpx;
  }
  .right-btn-frame {
    padding-right: 20rpx;
    padding-left: 8rpx;
  }
}
.forma-item {
  margin-bottom: 24rpx;
}
.material-item-group {
  background-color: $uni-bg-color;
  padding-top: 10rpx;
  .material-list-item {
    border-bottom: 2rpx solid $uni-border-color;
    padding-bottom: 10rpx;
    padding-left: 60rpx;
    margin-bottom: 10rpx;
    position: relative;
    &:last-child {
      border-bottom: 0;
    }
    .item-row {
      display: flex;
      & > .label {
        flex-shrink: 0;
        color: $u-tips-color;
        width: 144rpx;
      }
      & > .content {
        flex-grow: 1;
        color: $u-content-color;
        uni-input {
          font: inherit;
          color: $u-primary;
          text-decoration: underline;
        }
      }
    }
    .badge-box {
      position: absolute;
      top: 8rpx;
      left: 8rpx;
      z-index: 1;
    }
    .close-btn {
      $closeBtnSize: 70rpx;
      width: $closeBtnSize;
      height: $closeBtnSize;
      z-index: 1;
      position: absolute;
      top: 0rpx;
      right: 8rpx;
      background-color: $u-error;
      opacity: 0.6;
      border-radius: 25rpx;
      .icon-layer {
        position: absolute;
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 2;
      }
    }
  }
}
.label {
  margin-left: 25rpx;
  font-size: 30rpx;
}
.scan-input-form-item-compontent {
  width: 100%;
  .p-form-label {
    font-size: 32rpx;
    color: $u-tips-color;
    padding-bottom: 12rpx;
    padding-left: 20rpx;
    .required-tag {
      color: $u-error;
    }
  }
  .input-row {
    width: 100%;
    height: 75rpx;
    overflow: hidden;
    background-color: $uni-bg-color;
    display: flex;
    align-items: center;
    position: relative;
    .scan-view,
    .btn-view {
      flex-shrink: 0;
    }
    .scan-view {
      display: flex;
      align-items: center;
      justify-content: center;
      padding-right: 10rpx;
    }
    .input-view {
      flex-grow: 1;
      padding-left: 20rpx;
    }
    .btn-view {
      width: 70rpx;
      height: 100%;
      padding: 20rpx;
      padding-left: 0rpx;
      box-sizing: border-box;
      .search-btn {
        height: 100%;
        width: 100%;
        border-radius: 8rpx;
        background: linear-gradient(
          157.342820970935deg,
          rgba(194, 128, 255, 1) -20%,
          rgba(194, 128, 255, 1) -19%,
          rgba(132, 0, 255, 1) 119%
        );
        display: flex;
        align-items: center;
        justify-content: center;
        color: $uni-bg-color;
        font-size: 26rpx;
      }
    }
    & > .mask {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      z-index: 100;
      background-color: #fff;
      opacity: 0.25;
    }
  }
  .msg-row {
    padding: 6rpx 20rpx 0 20rpx;
    line-height: 1.3;
    font-size: 24rpx;
    color: $u-error;
    word-break: break-all;
    word-wrap: break-word;
    &.info-type {
      color: $color-blue;
    }
  }
}
</style>
PipeLineLems.PDA/pages/oneTouchUnBind/modules/containerInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<template>
    <view class="material-list-item" >
        <!-- <view class="close-btn">
            <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
        </view> -->
        <!-- <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view> -->
        <view class="item-row">
            <view class="label">托盘编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.containerNo:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">所属库区:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeInfos.areaName:''}}</view>
        </view>
        <view class="item-row">
            <view class="label">库位编号:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?containerInfo.placeInfos.placeNo:''}}</view>
        </view>
        <!-- <view class="item-row">
            <view class="label">托盘库位状态:</view>
            <view class="content auto-wrap">{{Boolean(containerInfo)?(parseDic($store,'common_status',containerInfo.placeInfo.containerPlaceStatus)):''}}</view>
        </view> -->
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            containerInfo: {
                type: Object,
                default: () => {}
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic
        }
    }
</script>
<style scoped >
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding: 10rpx 20rpx;
        background-color: #fff;
        /* margin-bottom: 10rpx; */
        position: relative;
        margin:-20rpx auto;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            .label {
                flex-shrink: 0;
                color: #000;
                /* text-align: right; */
                /* font-weight:5; */
                width: 200rpx;
            }
            &>.content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/oneTouchUnBind/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
<template>
    <u-swipe-action v-if="materialData.length>0">
        <u-swipe-action-item :options="options" v-for="(item,index) in materialData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.materialId">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">托盘编号:</view>
                        <view class="content auto-wrap">{{item.containerNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">托盘类型:</view>
                        <view class="content auto-wrap">{{item.containerTypeDesc}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">库位编号:</view>
                        <view class="content auto-wrap">{{item.placeNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料唯一码:</view>
                        <view class="content auto-wrap">{{item.materialId}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料名称:</view>
                        <view class="content auto-wrap">{{item.materialName}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">物料件号:</view>
                        <view class="content auto-wrap">{{item.materialNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">是否锁定:</view>
                        <view class="content auto-wrap">{{item.materialIsLock==1? '是' : '否'}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">操作人:</view>
                        <view class="content auto-wrap">{{item.lockUser}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">锁机制原因:</view>
                        <view class="content auto-wrap">{{item.lockReason}}</view>
                    </view>
                    <!-- <view class="item-row">
                        <view class="label">数量:</view>
                        <view class="content auto-wrap">{{item.stockNumber}}</view>
                    </view> -->
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            materialData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delMaterialData',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* text-align: right; */
                    /* font-weight:5; */
                    width: 180rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/oneTouchUnBind/modules/placeInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<template>
    <view class="scan-input-form-item-compontent">
        <view class="p-form-label">库位详情:</view>
        <view class="material-item-group" v-if="Boolean(placeInfo)">
            <view class="material-list-item">
                <view class="item-row">
                    <view class="label">库位编号:</view>
                    <view class="content auto-wrap">{{placeInfo.placeNo}}</view>
                </view>
                <view class="item-row">
                    <view class="label">所属库区:</view>
                    <view class="content auto-wrap">{{placeInfo.areaCode}}</view>
                </view>
            </view>
        </view>
    </view>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            placeInfo: {
                type: Object,
                default: () => {placeNo:''}
            }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
        }
    }
</script>
<style scoped lang="scss">
    .scan-input-form-item-compontent{
        width: 100%;
        .p-form-label{
            font-size: 32rpx;
            color: $u-tips-color;
            padding-bottom: 12rpx;
            padding-left: 20rpx;
            .required-tag{
                color:$u-error;
            }
        }}
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        background-color: #fff;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/online/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,354 @@
<template>
    <default-header-page-layout ref="page" title="切割上线" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <!-- step 1 start -->
                <template v-if="step===1">
                    <scan-input-form-item
                        class="forma-item"
                        label="物料编码"
                        v-model="forma.material"
                        :msg="msg.material"
                        :msg-type="msgType.material"
                        @search="onSearchMaterial"
                        @clear="onClearMaterial"
                    />
                    <view class="material-item-group" v-if="list.length>0">
                        <view class="material-list-item" v-for="(item,index) in list" :key="'material-list-item-'+index">
                            <view class="close-btn" @tap.stop="onDelList(index)">
                                <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                            </view>
                            <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                            <view class="item-row">
                                <view class="label">密度:</view>
                                <view class="content auto-wrap">{{item.density}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">批次:</view>
                                <view class="content auto-wrap">{{item.batch}}</view>
                            </view>
                            <view class="item-row">
                                <view class="label">段数:</view>
                                <view class="content auto-wrap">{{item.quantity}}</view>
                            </view>
                        </view>
                    </view>
                </template>
                <!-- step 1 end -->
                <!-- step 2 start -->
                <template v-if="step===2">
                    <easy-select-form-item
                        v-if="stepTwoType==='select'"
                        class="forma-item"
                        label="产线/工位"
                        :list="selectList.stations"
                        v-model="formb.stationCode"
                        :msg="msg.stationCode"
                        :msg-type="msgType.stationCode"
                        value-field="stationCode"
                        label-field="stationName"
                        @clear="onClearStation"
                    />
                    <scan-input-form-item
                        v-else
                        class="forma-item"
                        label="产线/工位"
                        v-model="formb.stationCode"
                        :msg="msg.stationCode"
                        :msg-type="msgType.stationCode"
                        :has-search="false"
                        @clear="onClearStation"
                    />
                    <view style="padding:0 16rpx;">
                        <u-button type="primary" v-if="stepTwoType==='select'" text="扫码输入产线" @click="onChangeStepTwoType('input')"></u-button>
                        <u-button type="primary" v-else text="手动选择产线" @click="onChangeStepTwoType('select')"></u-button>
                    </view>
                </template>
                <!-- step 2 end -->
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="step===1">
                    <div class="btn-frame left-btn-frame"><u-button text="重 ç½®" @click="onReset"></u-button></div>
                    <div class="btn-frame right-btn-frame"><u-button type="primary" text="上 çº¿" :disabled="list.length<=0" @click="onNext"></u-button></div>
                </template>
                <template v-else>
                    <div class="btn-frame left-btn-frame"><u-button text="上一步" @click="onPrevStep"></u-button></div>
                    <div class="btn-frame right-btn-frame"><u-button type="primary" text="提 äº¤" @click="onSubmit"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import ScanInputFormItem from '@/components/ScanInputFormItem.vue'
import EasySelectFormItem from '@/components/EasySelectFormItem.vue'
import { parseDic, $alert, $successInfo } from '@/static/js/utils/index.js'
let initInterVal = null;
const defaultFormA = {
    material:''
}
const defaultFormB = {
    stationCode:''
}
export default {
    name:'toBeOnlinePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,ScanInputFormItem,EasySelectFormItem},
    data(){
        return {
            pageBodyHeight:0,
            step:1,
            containter:null,
            forma:{...defaultFormA},
            formb:{...defaultFormB},
            msg:{
                material:'',
                stationCode:''
            },
            msgType:{
                material:'error',
                stationCode:'error'
            },
            list:[],
            materialDisabled:false,
            stepTwoType:'',
            selectList:{
                stations:[]
            }
        }
    },
    watch:{
        stepTwoType(newVal,oldVal){
            this.triggerStepTwoType()
        }
    },
    methods:{
        /* ç‰©æ–™ç¼–码搜索 */
        onSearchMaterial(){
            if (!this.forma.material) {
              this.msg.material = '请输入物料编号!';
              return false;
            }
            this.msg.material = ''
            this.getMaterialInfo()
        },
        /* æ¸…除物料编码 */
        onClearMaterial(){
            this.resetMaterial()
        },
        /* æ¸…除产线/工位 */
        onClearStation(){
            this.resetStation()
        },
        /* åˆ é™¤ç‰©æ–™åˆ—表某条数据 */
        onDelList(index){
          this.list.splice(index,1)
        },
        /* é‡ç½®ç‰©æ–™ç¼–码 */
        resetMaterial(){
          this.msg.material = '';
          this.forma.material = ''
        },
        /* é‡ç½®äº§çº¿/工位 */
        resetStation(){
          this.msg.stationCode = '';
          this.formb.stationCode = ''
        },
        /* é¡µé¢é‡ç½® */
        reset(){
            this.resetMaterial()
            this.resetStation()
            this.list = []
            this.stepTwoType=''
            this.step = 1
        },
        /* èŽ·å–ç‰©æ–™ä¿¡æ¯ */
        getMaterialInfo(callback){
          let params = {Code:this.forma.material}
          this.$api.get('ParseCode',params,{block:'online',fullRes:true}).then((d)=>{
            if (d.data) {
              let obj = {...d.data}
                    obj.materialBatch = obj.batch
                    obj.materialCode = this.forma.material
              this.list.push(obj)
                    this.forma.material = ''
              callback && callback(true)
            } else {
              this.msg.material = d.message || '查无信息!';
              callback && callback(false)
            }
          }).catch((err)=>{
            callback && callback(false)
          })
        },
        /* å“åº”重置按钮 */
        onReset(){
            this.reset()
        },
        /* å“åº”第一步按钮 */
        onNext(){
            this.stepTwoType='select'
            this.step=2
        },
        /* å“åº”上一步按钮 */
        onPrevStep(){
            this.resetStation()
            this.step=1
        },
        /* ç›‘视第二步显示模式 */
        triggerStepTwoType(){
            if (this.stepTwoType==='select' && this.selectList.stations.length===0) {
                this.$api.get('GetFoamBoardStation',{},{block:'online'}).then((d)=>{
                  this.selectList.stations = d || []
                }).catch((err)=>{})
            }
        },
        onChangeStepTwoType(type){
            this.formb.stationCode=''
            this.stepTwoType=type
        },
        /* å“åº”提交按钮 */
        onSubmit(){
            if (!this.formb.stationCode) {
              this.msg.stationCode = '请确认产线!';
              return false;
            }
            this.msg.stationCode = ''
            this.dealConfirm((f)=>{
              if (f) {
                    this.reset()
                $successInfo('操作成功!');
              }
            })
        },
        /* æäº¤æŽ¥å£è°ƒç”¨ */
        dealConfirm(callback){
            let params = {
              stationCode:this.formb.stationCode,
              foamBoardInformationList:this.list
            }
            this.$api.post('FoamBoardRecord',params,{block:'online'}).then(()=>{
                callback && callback(true)
            }).catch(()=>{
                callback && callback(false)
            })
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    display: flex;
    padding: 10rpx 0;
    background-color: #fff;
    .btn-frame{
        width: 50%;
        box-sizing: border-box;
    }
    .left-btn-frame{
        padding-left: 20rpx;
        padding-right: 8rpx;
    }
    .right-btn-frame{
        padding-right: 20rpx;
        padding-left: 8rpx;
    }
}
.forma-item{
    margin-bottom: 24rpx;
}
.material-item-group{
    background-color: $uni-bg-color;
    padding-top: 10rpx;
    .material-list-item{
        border-bottom: 2rpx solid $uni-border-color;
        padding-bottom: 10rpx;
        padding-left: 60rpx;
        margin-bottom: 10rpx;
        position: relative;
        &:last-child{
            border-bottom: 0;
        }
        .item-row{
            display: flex;
            &>.label{
                flex-shrink: 0;
                color: $u-tips-color;
                width: 84rpx;
            }
            &>.content{
                flex-grow: 1;
                color: $u-content-color;
                uni-input{
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
        .badge-box{
            position: absolute;
            top:8rpx;
            left: 8rpx;
            z-index: 1;
        }
        .close-btn{
            $closeBtnSize:70rpx;
            width: $closeBtnSize;
            height: $closeBtnSize;
            z-index: 1;
            position: absolute;
            top:0rpx;
            right: 8rpx;
            background-color: $u-error;
            opacity: 0.6;
            border-radius: 25rpx;
            .icon-layer{
                position: absolute;
                width: 100%;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: 2;
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/pick/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,414 @@
<template>
    <default-header-page-layout ref="page" title="分拣">
        <view class="page-frame with-action-user-row" :style="{ height: pageBodyHeight + 'px' }" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <scan-input-form-item
                    class="forma-item"
                    label="托盘编码"
                    v-model="form.containterCode"
                    :msg="msg.containter"
                    :msg-type="msgType.containter"
                    @search="onSearchContainter"
                    @clear="onClearContainter"
                />
                <scan-input-form-item
                    class="forma-item"
                    label="管段编码"
                    v-model="form.pipeSpecCode"
                    :msg="msg.material"
                    :msg-type="msgType.material"
                    @search="onSearchMaterial"
                    @clear="onClearMaterial"
                />
                <scan-input-form-item
                    placeholder="请选择"
                    :clearable="false"
                    :hasScan="false"
                    :hasSearch="false"
                    @click.native="visible = true"
                    class="forma-item"
                    label="选择库口"
                    v-model="form.site"
                />
                <EasyPicker :visible.sync="visible" :list="placeList.filter(item=>item.placeNo!='ZDCR')" labelField="placeNo" valueField="placeNo" @select="getSiteVal"/>
                <!-- <EasyPicker :visible.sync="visible" :list="placeList" labelField="placeNo" valueField="placeNo" @select="getSiteVal" /> -->
                <materialList :contaninerData="contaninerData" @delContainer="delContainer" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template>
                    <div class="btn-frame"><u-button  type="primary" text="组 æ‰˜" @click="onSubmit"></u-button></div>
                    <div class="btn-frame"><u-button type="primary" text="分拣入库" @click="addInBound"></u-button></div>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue';
import ActionUserRow from '@/components/ActionUserRow.vue';
import ScanInputFormItem from '@/components/ScanInputFormItem.vue';
import EasySelectFormItem from '@/components/EasySelectFormItem.vue';
import EasyPicker from '@/components/EasyPicker.vue';
import materialList from './modules/materialList.vue';
import { parseDic, $alert, $successInfo } from '@/static/js/utils/index.js';
import { palceList } from '@/service/mixins/mixins.js';
import { getContainerInfo } from '@/api/common.js';
import { getForEmptyContainerNo, getForMaterialNo, bindMaterialContainer, addInBound,pickPipeSpecCode } from '@/api/bind.js';
    import {NFCInit,NFCReadUID } from '@/service/util/RfidMethod.js'
let initInterVal = null;
export default {
    name: 'receiveInPage',
    components: {
        DefaultHeaderPageLayout,
        ActionUserRow,
        ScanInputFormItem,
        EasySelectFormItem,
        materialList,
        EasyPicker
    },
    data() {
        return {
            pageBodyHeight: 0,
            form: {
                containterCode: '',
                pipeSpecCode: '',
                site: ''
            },
            msg: {
                containter: '',
                material: '',
                site: ''
            },
            msgType: {
                containter: 'info',
                material: 'error',
                site: 'error'
            },
            containerStatus: null,
            contaninerData: [],
            visible: false
        };
    },
    computed: {
        // disabledBind() {
        //     return !Boolean(this.containerStatus) || this.contaninerData.length < 1;
        // },
        // disabledBound() {
        //     return !Boolean(this.containerStatus);
        // }
    },
    watch: {
        'form.containterCode': {
            handler(val, oldVal) {
                this.resetContainerNo();
            }
        }
    },
        onShow() {
          console.log('onShow');
          var nfc = NFCInit();
          console.log(nfc);
        },
        onHide() {
          console.log('onHide');
          var rfid = NFCReadUID();
          if(rfid!=null){
              if(this.form.containterCode ==''){
                  this.form.containterCode = rfid.UID
              } else{
                  this.form.pipeSpecCode = rfid.UID
              }
          }
          console.log(rfid);
        },
    methods: {
        // é€‰æ‹©ç«™ç‚¹è¿”回值
        getSiteVal(val, valObj, index) {
            this.form.site = val;
        },
        /* æ‰˜ç›˜ç¼–码搜索 */
        async onSearchContainter() {
            if (!this.form.containterCode) {
                this.msgType.containter = 'error';
                this.msg.containter = '请输入托盘号!';
                return false;
            }
            return;//暂不搜索
            // èŽ·å–ä»£ç 
            try {
                let { result } = await getForEmptyContainerNo({ code: this.form.containterCode });
                this.containerStatus = result?.containerStatus;
                // var notKT=result?.materialContainers.some(item=>item.pipeSpecCode!='KONGTUO')
                // if(notKT) {
                //     this.$modal('当前托盘存在非空托物料')
                //     this.onClearContainter()
                // }
                // æ‰˜ç›˜è¯¦æƒ…
                let containerStatusName = parseDic(this.$store, 'container_status', result?.containerStatus);
                containerStatusName = containerStatusName == '无此字典' ? '' : containerStatusName;
                this.msg.containter = `状态:${containerStatusName}, å°ºå¯¸ï¼š${result?.specLength}*${result?.specWidth}*${result?.specHeight}`;
                result?.containerList.forEach((item) => {
                    let isExist = this.contaninerData.some((item1) => item1.containerNo == item.containerNo);
                    if (!isExist) {
                        this.contaninerData.push(item);
                    }
                });
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* æ¸…除托盘编码 */
        onClearContainter() {
            this.form = {
                containterCode: '',
                pipeSpecCode: '',
                site: ''
            };
            this.resetContainerNo();
        },
        // é‡å†™æ‰˜ç›˜ç¼–码
        resetContainerNo() {
            this.msg = {
                containter: '',
                material: '',
                site: ''
            };
            this.msgType = {
                containter: 'info',
                material: 'error',
                site: 'error'
            };
            this.containerStatus = null;
            this.contaninerData = [];
            this.form.pipeSpecCode = '';
            this.form.site = '';
        },
        /* ç©ºæ‰˜ç¼–码搜索 */
        async onSearchMaterial() {
            if (!this.form.pipeSpecCode) {
                this.msg.material = '请输入空托编号!';
                return false;
            }
            this.msg.material = '';
            try {
                let { result } = await getContainerInfo({ ContainerNo: this.form.pipeSpecCode });
                if (result.containerNo == this.form.containterCode) {
                    return this.$modal('当前空托与托盘重复');
                }
                var isExit = this.contaninerData.some((item) => item.containerNo == result.containerNo);
                isExit ? '' : this.contaninerData.push(result);
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* ç‰©æ–™ç¼–码清除 */
        onClearMaterial() {
            this.form.pipeSpecCode = '';
        },
        //删除空托
        delContainer(containerNo) {
            this.contaninerData = this.contaninerData.filter((item) => item.containerNo != containerNo);
        },
        // åˆ†æ‹£
        async onSubmit() {
            let { contaninerData, form } = this;
            // if(contaninerData.length>3) {
            //     return $alert("分拣数量不能超过4个!")
            // }
            const data = {
                type: 2,
                containerNo: form.containterCode,
                pipeSpecCode:form.pipeSpecCode,
                materialContainerList: []
            };
            data.materialContainerList = contaninerData.map((item) => {
                return {
                    materialNo: 'KONGTUO',
                    materialName: '空托',
                    materialId: item.containerNo
                };
            });
            try {
                await pickPipeSpecCode(data);
                this.$modal('分拣成功');
                this.onClearContainter();
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        // å…¥åº“
        async addInBound() {
            // if(this.contaninerData.length>3) {
            //     return $alert("分拣数量不能超过4个!")
            // }
            const data = {
                stationNo: this.form.site,
                type: 2,
                containerNo: this.form.containterCode,
                materialContainerList: this.contaninerData.map((item) => {
                    return {
                        materialId: item.containerNo,
                        materialNo: 'KONGTUO',
                        materialName: '空托',
                        materialType: 4
                    };
                })
            };
            try {
                await addInBound(data);
                this.$modal('入库成功');
                this.onClearContainter();
            } catch (e) {
                //TODO handle the exception
                console.log(e);
            }
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback) {
            initInterVal = setInterval(() => {
                if (this.pageBodyHeight) {
                    this.clearInitInterval();
                    callback && callback();
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight();
                }
            }, 200);
        },
        /* æ¸…除定时器 */
        clearInitInterval() {
            try {
                clearInterval(initInterVal);
                initInterVal = null;
            } catch (e) {
                //TODO handle the exception
            }
        }
    },
    mixins: [palceList],
    onReady() {
        this.startInitInterval(async () => {
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
            // æ³¨é‡Š
            // this.getPalceList({
            //      areaCode: 'WXJSXL'
            // });
        });
    },
    onUnload() {
        this.clearInitInterval();
    }
};
</script>
<style scoped lang="scss">
.bottom-btns-row {
    display: flex;
    justify-content: center;
    padding: 10rpx 10rpx;
    background-color: #fff;
    .btn-frame {
        flex: 1;
        box-sizing: border-box;
    }
    .btn-frame:nth-child(1) {
        margin-right: 10rpx;
    }
    .left-btn-frame {
        padding-left: 20rpx;
        padding-right: 8rpx;
    }
    .right-btn-frame {
        padding-right: 20rpx;
        padding-left: 8rpx;
    }
}
.forma-item {
    margin-bottom: 24rpx;
}
.material-item-group {
    background-color: $uni-bg-color;
    padding-top: 10rpx;
    .material-list-item {
        border-bottom: 2rpx solid $uni-border-color;
        padding-bottom: 10rpx;
        padding-left: 60rpx;
        margin-bottom: 10rpx;
        position: relative;
        &:last-child {
            border-bottom: 0;
        }
        .item-row {
            display: flex;
            & > .label {
                flex-shrink: 0;
                color: $u-tips-color;
                width: 144rpx;
            }
            & > .content {
                flex-grow: 1;
                color: $u-content-color;
                uni-input {
                    font: inherit;
                    color: $u-primary;
                    text-decoration: underline;
                }
            }
        }
        .badge-box {
            position: absolute;
            top: 8rpx;
            left: 8rpx;
            z-index: 1;
        }
        .close-btn {
            $closeBtnSize: 70rpx;
            width: $closeBtnSize;
            height: $closeBtnSize;
            z-index: 1;
            position: absolute;
            top: 0rpx;
            right: 8rpx;
            background-color: $u-error;
            opacity: 0.6;
            border-radius: 25rpx;
            .icon-layer {
                position: absolute;
                width: 100%;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: 2;
            }
        }
    }
}
</style>
PipeLineLems.PDA/pages/pick/modules/materialList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
<template>
    <u-swipe-action v-if="contaninerData.length>0" >
        <u-swipe-action-item :options="options" v-for="(item,index) in contaninerData"
                    :key="'material-list-item-'+index" style="margin-bottom: 20rpx;"
                    @click="deleteItem" :index="index" :name="item.containerNo">
            <view class="material-item-group">
                <view class="material-list-item" >
                    <view class="close-btn">
                        <view class="icon-layer"><u-icon name="close" color="#ffffff" size="24" /></view>
                    </view>
                    <view class="badge-box"><u-badge :value="index+1" bg-color="#F18201" /></view>
                    <view class="item-row">
                        <view class="label">托盘编号:</view>
                        <view class="content auto-wrap">{{item.containerNo}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">托盘状态:</view>
                        <view class="content auto-wrap">{{parseDic($store,'container_status',item.containerStatus)}}</view>
                    </view>
                    <view class="item-row">
                        <view class="label">托盘规格:</view>
                        <view class="content auto-wrap">{{item.specLength}}*{{item.specWidth}}*{{item.specHeight}}</view>
                    </view>
                </view>
            </view>
        </u-swipe-action-item>
    </u-swipe-action>
</template>
<script>
    import {parseDic} from '@/static/js/utils/index.js'
    export default {
        props: {
            contaninerData: {
                type: Array,
                default: () => []
            },
            // materialModalData:{
            //     type: Array,
            //     default: () => []
            // }
        },
        data() {
            return {
                options: [{
                    text: '删除',
                    style:{
                        backgroundColor: '#F18202'
                    }
                }],
                materialModalData:[]
            }
        },
        // created(){
        //     this.materialModalData=getDicList(this.$store,'material_modal')?.sysDictDatas
        //     console.log(this.materialModalData);
        // },
        methods:{
            parseDic,
            deleteItem({name}){
                this.$emit('delContainer',name)
            }
        }
    }
</script>
<style scoped lang="scss">
    .material-item-group {
        /* background-color: transparent!impor; */
        padding-top: 10rpx;
        .material-list-item {
            border-bottom: 2rpx solid $uni-border-color;
            padding-bottom: 10rpx;
            padding-left: 60rpx;
            /* margin-bottom: 10rpx; */
            position: relative;
            &:last-child {
                border-bottom: 0;
            }
            .item-row {
                display: flex;
                .label {
                    flex-shrink: 0;
                    color: #000;
                    /* font-weight:5; */
                    width: 144rpx;
                }
                &>.content {
                    flex-grow: 1;
                    color: $u-content-color;
                    uni-input {
                        font: inherit;
                        color: $u-primary;
                        text-decoration: underline;
                    }
                }
            }
            .badge-box {
                position: absolute;
                top: 8rpx;
                left: 8rpx;
                z-index: 1;
            }
            .close-btn {
                $closeBtnSize: 70rpx;
                width: $closeBtnSize;
                height: $closeBtnSize;
                z-index: 1;
                position: absolute;
                top: 0rpx;
                right: 8rpx;
                background-color: $u-error;
                opacity: 0.6;
                border-radius: 25rpx;
                .icon-layer {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    z-index: 2;
                }
            }
        }
    }
</style>
PipeLineLems.PDA/pages/plywoodBind/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
<template>
</template>
<script>
export default {
    onLoad(){
        uni.redirectTo({
            url: this.$config.path.plywoodInstore + '?pageType=bind'
        });
    }
}
</script>
<style>
</style>
PipeLineLems.PDA/pages/plywoodInstore/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
<template>
    <default-header-page-layout ref="page" :title="pageTitle" >
        <view class="page-frame with-action-user-row" :style="{height:pageBodyHeight+'px'}" v-if="pageBodyHeight">
            <action-user-row />
            <view class="with-action-user-row-page-content">
                <page-main v-show="pageStyle==='main'" ref="main" @pageChange="onMainPageChange" />
                <page-edit v-show="pageStyle==='edit'" ref="edit" />
            </view>
        </view>
        <template v-slot:footer>
            <view class="bottom-btns-row">
                <template v-if="pageStyle==='main'">
                    <template v-if="pageType==='bind'">
                        <view class="btn-frame"><u-button text="重 ç½®" @click="onMainReset"></u-button></view>
                        <view class="divider"></view>
                    </template>
                    <view class="btn-frame"><u-button :type="pageType==='instore'?'':'primary'" text="组 ç›˜" @click="onBind"></u-button></view>
                    <template v-if="pageType==='instore'">
                        <view class="divider"></view>
                        <view class="btn-frame"><u-button type="primary" text="入 åº“" @click="onManualInstore"></u-button></view>
                    </template>
                </template>
                <template v-if="pageStyle==='edit'">
                    <view class="btn-frame"><u-button text="返 å›ž" @click="onEditBack"></u-button></view>
                    <view class="divider"></view>
                    <view class="btn-frame"><u-button type="primary" :text="editIndex===-1?'æ·» åŠ ':'ä¿® æ”¹'" @click="onEditConfirm"></u-button></view>
                </template>
            </view>
        </template>
    </default-header-page-layout>
</template>
<script>
import DefaultHeaderPageLayout from '@/components/DefaultHeaderPageLayout.vue'
import ActionUserRow from '@/components/ActionUserRow.vue'
import PageMain from './modules/main.vue'
import PageEdit from './modules/edit.vue'
import { $successInfo } from '@/static/js/utils/index.js'
let initInterVal = null;
export default {
    name:'plywoodInstorePage',
    components:{DefaultHeaderPageLayout,ActionUserRow,PageMain,PageEdit},
    data(){
        return {
            pageBodyHeight:0,
            pageType:'instore',
            pageStyle:'main',
            pageTitle:'',
            editIndex:-1
        }
    },
    methods:{
        onEditBack(){
            this.pageStyle = 'main'
        },
        onEditConfirm(){
            let check = this.$refs.edit.checkConfirm()
            if (check.flag) {
                if (this.editIndex===-1) {
                    this.$refs.main.add(check.data)
                } else {
                    this.$refs.main.modify(check.data,this.editIndex)
                }
            }
            this.pageStyle = 'main'
        },
        onMainPageChange(obj,index){
            if (obj) {
                this.editIndex = index
            } else {
                this.editIndex = -1
            }
            this.$refs.edit.init(obj)
            this.pageStyle = 'edit'
        },
        onMainReset(){
            this.$refs.main.clearMain()
        },
        onBind(){
            let check = this.$refs.main.checkConfirm()
            if (check.flag) {
                this.dealBind(check.data,(f)=>{
                    if (f) {
                        $successInfo('组盘成功')
                        if (this.pageType==='bind'){
                            this.$refs.main.clearMain()
                        }
                    }
                })
            }
        },
        onManualInstore(){
            let check = this.$refs.main.checkConfirm()
            if (check.flag) {
                this.dealManualInstore(check.data,(f)=>{
                    if (f) {
                        $successInfo('提交成功')
                        this.$refs.main.clearMain()
                    }
                })
            }
        },
        /* ç»„盘接口调用 */
        dealBind(obj,callback){
            let params = this.dealSubmitParams(obj)
            this.$api.post('PlywoodBindEntrance',params,{block:'plywood'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        /* æ‰‹åŠ¨å…¥åº“æŽ¥å£è°ƒç”¨ */
        dealManualInstore(obj,callback){
            let params = this.dealSubmitParams(obj)
            this.$api.post('PlywoodManualWare',params,{block:'plywood'}).then(()=>{
                callback && callback(true)
            }).catch((e)=>{
                callback && callback(false,e)
            })
        },
        dealSubmitParams(obj){
            return {
                containercode:obj.containter.containerCode,
                wmsMaterials:obj.list
            }
        },
        /* é¡µé¢åˆå§‹åŒ–获取页面body高度的定时器 */
        startInitInterval(callback){
            initInterVal = setInterval(()=>{
                if (this.pageBodyHeight) {
                    this.clearInitInterval()
                    callback && callback()
                } else {
                    this.pageBodyHeight = this.$refs.page.getBodyHeight()
                }
            },200)
        },
        /* æ¸…除定时器 */
        clearInitInterval(){
            try{
                clearInterval(initInterVal)
                initInterVal = null
            }catch(e){
                //TODO handle the exception
            }
        }
    },
    onLoad(option){
        if (option.pageType) {
            this.pageType=option.pageType
            this.pageTitle='胶合板组盘'
        } else {
            this.pageType='instore'
            this.pageTitle='胶合板入库'
        }
    },
    onReady(){
        this.startInitInterval(()=>{
            /* é¡µé¢åˆå§‹åŒ–后需要执行的代码在这边调用 */
        })
    },
    onUnload(){
        this.clearInitInterval()
    }
}
</script>
<style scoped lang="scss">
.bottom-btns-row{
    display: flex;
    padding: 10rpx 20rpx;
    background-color: #fff;
    .btn-frame{
        width: 1%;
        box-sizing: border-box;
        flex-grow: 1;
    }
    .divider{
        width: 20rpx;
        flex-shrink: 0;
    }
}
</style>
在上述文件截断后对比
PipeLineLems.PDA/pages/plywoodInstore/modules/edit.vue PipeLineLems.PDA/pages/plywoodInstore/modules/main.vue PipeLineLems.PDA/pages/plywoodOut/index.vue PipeLineLems.PDA/pages/print/bluePrint.js PipeLineLems.PDA/pages/print/bluetoothConnection.vue PipeLineLems.PDA/pages/receiptExecution/index.vue PipeLineLems.PDA/pages/receiptExecution/modules/barContent.vue PipeLineLems.PDA/pages/receiveIn/index.vue PipeLineLems.PDA/pages/replenishMent/index.vue PipeLineLems.PDA/pages/sandingInstore/index.vue PipeLineLems.PDA/pages/setting/host.vue PipeLineLems.PDA/pages/slicingOff/index.vue PipeLineLems.PDA/pages/slicingOff/modules/detail.vue PipeLineLems.PDA/pages/slicingOff/modules/main.vue PipeLineLems.PDA/pages/slicingOff/modules/step2.vue PipeLineLems.PDA/pages/slicingOn/index.vue PipeLineLems.PDA/pages/slicingOn/modules/barContent.vue PipeLineLems.PDA/pages/sortingSearch/index.vue PipeLineLems.PDA/pages/sortingSearch/modules/contentCard.vue PipeLineLems.PDA/pages/sortingSearch/modules/sortingInfo.vue PipeLineLems.PDA/pages/start/index.vue PipeLineLems.PDA/pages/takeInStore/index.vue PipeLineLems.PDA/pages/tasks/index.vue PipeLineLems.PDA/pages/tasks/module/Detail.vue PipeLineLems.PDA/pages/tasks/module/List.vue PipeLineLems.PDA/pages/tasks/module/Search.vue PipeLineLems.PDA/pages/temporaryInstore/index.vue PipeLineLems.PDA/pages/temporaryInstore/modules/Step1.vue PipeLineLems.PDA/pages/temporaryInstore/modules/Step2.vue PipeLineLems.PDA/pages/transport/index.vue PipeLineLems.PDA/pages/unbind/index.vue PipeLineLems.PDA/pages/unstackingInstore/index.vue PipeLineLems.PDA/pages/unstackingInstore/modules/edit.vue PipeLineLems.PDA/pages/unstackingInstore/modules/main.vue PipeLineLems.PDA/pages/unstackingInstore/modules/step2.vue PipeLineLems.PDA/pages/writeRfid/index.vue PipeLineLems.PDA/pages/writeRfid/modules/materialList.vue PipeLineLems.PDA/service/mixins/mixins.js PipeLineLems.PDA/service/request/index.js PipeLineLems.PDA/service/request/modules/beforeSend.js PipeLineLems.PDA/service/store/index.js PipeLineLems.PDA/service/store/modules/print.js PipeLineLems.PDA/service/store/modules/system.js PipeLineLems.PDA/service/store/modules/user.js PipeLineLems.PDA/service/util/RfidMethod.js PipeLineLems.PDA/static/fonts/iconfont.css PipeLineLems.PDA/static/fonts/iconfont.ttf PipeLineLems.PDA/static/fonts/iconfont.woff PipeLineLems.PDA/static/fonts/iconfont.woff2 PipeLineLems.PDA/static/img/logo - 副本.png PipeLineLems.PDA/static/img/logo.png PipeLineLems.PDA/static/js/print/gbk.js PipeLineLems.PDA/static/js/print/printerjobs.js PipeLineLems.PDA/static/js/utils/index.js PipeLineLems.PDA/static/js/utils/modules/color.js PipeLineLems.PDA/static/js/utils/modules/regexValidate.js PipeLineLems.PDA/uni.scss PipeLineLems.PDA/uni_modules/uni-badge/changelog.md PipeLineLems.PDA/uni_modules/uni-badge/components/uni-badge/uni-badge.vue PipeLineLems.PDA/uni_modules/uni-badge/package.json PipeLineLems.PDA/uni_modules/uni-badge/readme.md PipeLineLems.PDA/uni_modules/uni-icons/changelog.md PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/icons.js PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uni-icons.vue PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uniicons.css PipeLineLems.PDA/uni_modules/uni-icons/components/uni-icons/uniicons.ttf PipeLineLems.PDA/uni_modules/uni-icons/package.json PipeLineLems.PDA/uni_modules/uni-icons/readme.md PipeLineLems.PDA/uni_modules/uni-scss/changelog.md PipeLineLems.PDA/uni_modules/uni-scss/index.scss PipeLineLems.PDA/uni_modules/uni-scss/package.json PipeLineLems.PDA/uni_modules/uni-scss/readme.md PipeLineLems.PDA/uni_modules/uni-scss/styles/index.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_border.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_color.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_radius.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_space.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_styles.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_text.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/setting/_variables.scss PipeLineLems.PDA/uni_modules/uni-scss/styles/tools/functions.scss PipeLineLems.PDA/uni_modules/uni-scss/theme.scss PipeLineLems.PDA/uni_modules/uni-scss/variables.scss PipeLineLems.PDA/uni_modules/uni-swipe-action/changelog.md PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs PipeLineLems.PDA/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue PipeLineLems.PDA/uni_modules/uni-swipe-action/package.json PipeLineLems.PDA/uni_modules/uni-swipe-action/readme.md PipeLineLems.PDA/uni_modules/uview-ui/LICENSE PipeLineLems.PDA/uni_modules/uview-ui/README.md PipeLineLems.PDA/uni_modules/uview-ui/changelog.md PipeLineLems.PDA/uni_modules/uview-ui/components/u--form/u--form.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u--image/u--image.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u--input/u--input.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u--text/u--text.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u--textarea/u--textarea.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-action-sheet/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-album/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-album/u-album.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-alert/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-alert/u-alert.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar-group/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-avatar/u-avatar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-back-top/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-back-top/u-back-top.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-badge/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-badge/u-badge.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/nvue.scss PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/u-button.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-button/vue.scss PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/header.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/month.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/u-calendar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-calendar/util.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-car-keyboard/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell-group/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-cell/u-cell.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox-group/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-circle-progress/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-code-input/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-code-input/u-code-input.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-code/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-code/u-code.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-col/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-col/u-col.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-collapse/u-collapse.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-column-notice/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/u-count-down.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-down/utils.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-to/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-count-to/u-count-to.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-datetime-picker/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-divider/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-divider/u-divider.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-empty/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-empty/u-empty.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-form-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-form-item/u-form-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-form/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-form/u-form.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-gap/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-gap/u-gap.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-grid/u-grid.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/iconfont.ttf PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/icons.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-icon/u-icon.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-image/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-image/u-image.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-anchor/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-item/u-index-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-list/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-index-list/u-index-list.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-input/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-input/u-input.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-keyboard/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-line-progress/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-line/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-line/u-line.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-link/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-link/u-link.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-list-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-list-item/u-list-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-list/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-list/u-list.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-icon/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-page/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-loadmore/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-modal/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-modal/u-modal.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-navbar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-navbar/u-navbar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-no-network/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-no-network/u-no-network.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-notice-bar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-notify/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-notify/u-notify.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-box/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-box/u-number-box.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-keyboard/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-overlay/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-overlay/u-overlay.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/node/node.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/parser.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-parse/u-parse.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker-column/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-picker/u-picker.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-popup/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-popup/u-popup.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio-group/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-radio/u-radio.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-rate/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-rate/u-rate.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-read-more/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-read-more/u-read-more.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-row-notice/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-row/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-row/u-row.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-safe-bottom/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/nvue.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/other.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs PipeLineLems.PDA/uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-search/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-search/u-search.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-skeleton/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpother.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpwxs.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/mpwxs.wxs PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/nvue - 副本.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/nvue.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-slider/u-slider.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-status-bar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-steps/u-steps.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-sticky/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-sticky/u-sticky.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-subsection/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-subsection/u-subsection.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/index.wxs PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/nvue.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action-item/wxs.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper-indicator/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-swiper/u-swiper.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-switch/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-switch/u-switch.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-table/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-table/u-table.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs-item/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tabs/u-tabs.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tag/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tag/u-tag.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-td/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-td/u-td.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/u-text.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-text/value.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-textarea/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-textarea/u-textarea.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-toast/u-toast.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-toolbar/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/clipboard.min.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-tr/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-tr/u-tr.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/nvue.ani-map.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/transition.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/u-transition.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-transition/vue.ani-style.scss PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/mixin.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/props.js PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/u-upload.vue PipeLineLems.PDA/uni_modules/uview-ui/components/u-upload/utils.js PipeLineLems.PDA/uni_modules/uview-ui/components/uview-ui/uview-ui.vue PipeLineLems.PDA/uni_modules/uview-ui/index.js PipeLineLems.PDA/uni_modules/uview-ui/index.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/config/color.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/config.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/actionSheet.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/album.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/alert.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/avatar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/avatarGroup.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/backtop.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/badge.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/button.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/calendar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/carKeyboard.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/cell.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/cellGroup.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/checkbox.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/checkboxGroup.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/circleProgress.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/code.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/codeInput.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/col.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/collapse.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/collapseItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/columnNotice.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/countDown.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/countTo.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/datetimePicker.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/divider.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/empty.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/form.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/formItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/gap.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/grid.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/gridItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/icon.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/image.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/indexAnchor.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/indexList.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/input.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/keyboard.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/line.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/lineProgress.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/link.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/list.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/listItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadingIcon.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadingPage.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/loadmore.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/modal.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/navbar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/noNetwork.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/noticeBar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/notify.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/numberBox.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/numberKeyboard.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/overlay.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/parse.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/picker.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/popup.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/radio.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/radioGroup.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/rate.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/readMore.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/row.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/rowNotice.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/scrollList.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/search.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/section.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/skeleton.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/slider.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/statusBar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/steps.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/stepsItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/sticky.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/subsection.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipeAction.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipeActionItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swiper.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/swipterIndicator.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/switch.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabbar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabbarItem.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tabs.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tag.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/text.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/textarea.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/toast.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/toolbar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/tooltip.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/transition.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/props/upload.js PipeLineLems.PDA/uni_modules/uview-ui/libs/config/zIndex.js PipeLineLems.PDA/uni_modules/uview-ui/libs/css/color.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/common.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/components.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/flex.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/h5.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/mixin.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/mp.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/nvue.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/css/vue.scss PipeLineLems.PDA/uni_modules/uview-ui/libs/function/colorGradient.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/debounce.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/digit.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/index.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/platform.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/test.js PipeLineLems.PDA/uni_modules/uview-ui/libs/function/throttle.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/adapters/index.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/Request.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/defaults.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/core/settle.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/index.d.ts PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/index.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/utils.js PipeLineLems.PDA/uni_modules/uview-ui/libs/luch-request/utils/clone.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/button.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mixin.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mpMixin.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/mpShare.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/openType.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/style.js PipeLineLems.PDA/uni_modules/uview-ui/libs/mixin/touch.js PipeLineLems.PDA/uni_modules/uview-ui/libs/util/async-validator.js PipeLineLems.PDA/uni_modules/uview-ui/libs/util/calendar.js PipeLineLems.PDA/uni_modules/uview-ui/libs/util/dayjs.js PipeLineLems.PDA/uni_modules/uview-ui/libs/util/emitter.js PipeLineLems.PDA/uni_modules/uview-ui/libs/util/route.js PipeLineLems.PDA/uni_modules/uview-ui/package.json PipeLineLems.PDA/uni_modules/uview-ui/theme.scss PipeLineLems.PDA/unpackage/res/icons/1024x1024.png PipeLineLems.PDA/unpackage/res/icons/120x120.png PipeLineLems.PDA/unpackage/res/icons/144x144.png PipeLineLems.PDA/unpackage/res/icons/152x152.png PipeLineLems.PDA/unpackage/res/icons/167x167.png PipeLineLems.PDA/unpackage/res/icons/180x180.png PipeLineLems.PDA/unpackage/res/icons/192x192.png PipeLineLems.PDA/unpackage/res/icons/20x20.png PipeLineLems.PDA/unpackage/res/icons/29x29.png PipeLineLems.PDA/unpackage/res/icons/40x40.png PipeLineLems.PDA/unpackage/res/icons/58x58.png PipeLineLems.PDA/unpackage/res/icons/60x60.png PipeLineLems.PDA/unpackage/res/icons/72x72.png PipeLineLems.PDA/unpackage/res/icons/76x76.png PipeLineLems.PDA/unpackage/res/icons/80x80.png PipeLineLems.PDA/unpackage/res/icons/87x87.png PipeLineLems.PDA/unpackage/res/icons/96x96.png PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappchooselocation.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniapperror.png PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappes6.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappopenlocation.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniapppicker.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappquill.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappquillimageresize.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappscan.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappsuccess.png PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/__uniappview.html PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-config-service.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-config.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-service.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/app-view.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/manifest.json PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.css PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.ttf PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.woff PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/fonts/iconfont.woff2 PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/img/logo.png PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/print/gbk.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/print/printerjobs.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/index.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/modules/color.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/static/js/utils/modules/regexValidate.js PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/uni_modules/uview-ui/components/u-icon/iconfont.ttf PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/view.css PipeLineLems.PDA/unpackage/resources/__UNI__417D0E6/www/view.umd.min.js PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Dtos/WorkPlan/MesOrderResponse.cs PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application.Contracts/Services/IWorkPlanAppService.cs PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/SharedService.cs PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Application/Implements/WorkPlanAppService.cs PipeLineLems/server/src/CMS.Plugin.PipeLineLems.Domain/WorkPlan/IWorkPlanRepository.cs PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreWorkPlanRepository.cs